Compare commits
1889 Commits
Author | SHA1 | Date |
---|---|---|
Travis Burtrum | 197352b669 | |
Daniel Gultsch | d8d1c1192f | |
Daniel Gultsch | 995d975127 | |
Daniel Gultsch | cce5a7b39f | |
Daniel Gultsch | 4a43df8c97 | |
Daniel Gultsch | ed4a190793 | |
Daniel Gultsch | 719102d02f | |
Daniel Gultsch | c3926a9ef8 | |
Daniel Gultsch | 1ab391931d | |
Daniel Gultsch | 490115d20e | |
Daniel Gultsch | 911e392006 | |
Daniel Gultsch | b925f436fd | |
Daniel Gultsch | 5cee46cda5 | |
Daniel Gultsch | 014643b9c4 | |
Daniel Gultsch | c3cbb21133 | |
Daniel Gultsch | 7bcf173866 | |
Daniel Gultsch | 225cca4566 | |
Daniel Gultsch | 4ff3c36ed9 | |
Daniel Gultsch | 768eadde36 | |
Daniel Gultsch | 82c5924434 | |
Daniel Gultsch | e11277c70f | |
Daniel Gultsch | 01b207d44d | |
Daniel Gultsch | d3194172c5 | |
Daniel Gultsch | f5da4791ad | |
Daniel Gultsch | 837c212931 | |
Daniel Gultsch | ad601e47c8 | |
Daniel Gultsch | ea6289c02e | |
Daniel Gultsch | d6e51288c3 | |
yushijinhun | 48147b7fd1 | |
Daniel Gultsch | 432598f896 | |
Daniel Gultsch | 7ac26952d7 | |
Daniel Gultsch | c8bd5bc1f5 | |
Daniel Gultsch | 2fc216bfc4 | |
Daniel Gultsch | 74cde1d60a | |
Daniel Gultsch | 85dc0c284d | |
Daniel Gultsch | 002dbf2e17 | |
Daniel Gultsch | da87eac48e | |
Daniel Gultsch | 9a57673130 | |
Daniel Gultsch | 8d6b2074cb | |
Daniel Gultsch | 7a2856ac86 | |
Daniel Gultsch | f7258d16e1 | |
Daniel Gultsch | 25e993693f | |
Daniel Gultsch | 6c95897f09 | |
Daniel Gultsch | 2a198793b1 | |
Daniel Gultsch | 58f3787795 | |
Daniel Gultsch | 8a729061d5 | |
Daniel Gultsch | 8285a4fe1c | |
Daniel Gultsch | 217335703c | |
Daniel Gultsch | 0a20b87ebe | |
Daniel Gultsch | febee9863f | |
Daniel Gultsch | 2dce71cd96 | |
Daniel Gultsch | 8afe7efc2c | |
Daniel Gultsch | dfa17d1339 | |
Daniel Gultsch | 91119ab691 | |
Daniel Gultsch | ea6b756c0f | |
Daniel Gultsch | 3d0b127a8f | |
Daniel Gultsch | 7623accfd5 | |
Daniel Gultsch | 35a4b848a5 | |
Daniel Gultsch | 45f92553c4 | |
Daniel Gultsch | ecc0ef45c5 | |
Daniel Gultsch | edb28ccb31 | |
Daniel Gultsch | 19c1484053 | |
Daniel Gultsch | 8de81e0bc8 | |
Daniel Gultsch | 4d1b6d4404 | |
Daniel Gultsch | c5824a3b2a | |
Daniel Gultsch | a1f9f5e774 | |
Daniel Gultsch | 8415f27cac | |
Daniel Gultsch | abf84e065d | |
Daniel Gultsch | da00a58902 | |
Daniel Gultsch | 7cbef529ae | |
Daniel Gultsch | c400f74918 | |
Daniel Gultsch | 67bc032ccc | |
Daniel Gultsch | ae0ba3bbc1 | |
Daniel Gultsch | 7df0f3fd28 | |
Daniel Gultsch | ef980ff5cf | |
Daniel Gultsch | 2ada4d5cfe | |
Daniel Gultsch | f2409ed95e | |
Daniel Gultsch | 5cac4397dd | |
Daniel Gultsch | 7cf360fabf | |
Daniel Gultsch | 2b9cdde558 | |
Daniel Gultsch | 7d4d5c437a | |
Daniel Gultsch | 311c99bb6d | |
Daniel Gultsch | 4a2e222b34 | |
Daniel Gultsch | 7c1e1132b0 | |
Daniel Gultsch | b2aae44645 | |
Daniel Gultsch | cbbf6f439b | |
Daniel Gultsch | 90afaab8ed | |
Daniel Gultsch | 59e39304dd | |
Daniel Gultsch | c85b3bbacc | |
Daniel Gultsch | 6dad1c0dde | |
Daniel Gultsch | 4faf0f2ec9 | |
Daniel Gultsch | 2c5250a82c | |
Daniel Gultsch | cbce73c301 | |
Daniel Gultsch | 24ab765e11 | |
Daniel Gultsch | 6ec8e57fbb | |
Daniel Gultsch | 14fd41cd7f | |
Daniel Gultsch | 19b4207c3a | |
Daniel Gultsch | d24022d755 | |
Ferdinand Pöll | f8e031ac86 | |
Daniel Gultsch | 5fd4169720 | |
Daniel Gultsch | 3c90dbe723 | |
Daniel Gultsch | 2ed71df01a | |
Daniel Gultsch | 2e380ed792 | |
Daniel Gultsch | 5d9d725446 | |
Daniel Gultsch | 95405fde5f | |
Daniel Gultsch | 24768d051d | |
Daniel Gultsch | f67baab983 | |
Daniel Gultsch | a1fe8f1c87 | |
Daniel Gultsch | 00bb527333 | |
Daniel Gultsch | 10025123e9 | |
Daniel Gultsch | f7f6e8dfd5 | |
Daniel Gultsch | 012f60be56 | |
Daniel Gultsch | 51badfa721 | |
Daniel Gultsch | e722ef6477 | |
Daniel Gultsch | 612e0afa63 | |
Daniel Gultsch | ed7882fe69 | |
Daniel Gultsch | 3889c0eb01 | |
Daniel Gultsch | 9dcd0bf16b | |
Daniel Gultsch | 2cf05528b4 | |
Daniel Gultsch | e48517b0c8 | |
Daniel Gultsch | 7b271bcf67 | |
Daniel Gultsch | 50f61a4d91 | |
Daniel Gultsch | 6ccdd1227e | |
Daniel Gultsch | e973117aed | |
Daniel Gultsch | 3ece613a5d | |
Daniel Gultsch | fe29b51290 | |
Daniel Gultsch | 51d1223198 | |
Daniel Gultsch | 5a5eb5bdd3 | |
Daniel Gultsch | 7cd4ed78b2 | |
Daniel Gultsch | 9fd6539534 | |
uchchishta | 7e5e32e9eb | |
Daniel Gultsch | 41b3df0d43 | |
Daniel Gultsch | 2f577097d1 | |
Daniel Gultsch | 5056a28553 | |
Daniel Gultsch | 91db2023d3 | |
Daniel Gultsch | 185dac6953 | |
Daniel Gultsch | a5d9932b08 | |
Daniel Gultsch | b0a8da35db | |
Daniel Gultsch | 0f2e60d576 | |
Daniel Gultsch | 9a7d925b97 | |
Daniel Gultsch | be371ac5df | |
Daniel Gultsch | 7b6d49f329 | |
Daniel Gultsch | 404cf808b0 | |
Daniel Gultsch | f98888d796 | |
Daniel Gultsch | 839178b269 | |
Daniel Gultsch | cc1402442a | |
Daniel Gultsch | f47cf7ae67 | |
Daniel Gultsch | ef78721f94 | |
Daniel Gultsch | 7c31a981bb | |
Daniel Gultsch | cec9b9b35a | |
Daniel Gultsch | 5cadc81de4 | |
Daniel Gultsch | 84baa3ae68 | |
Daniel Gultsch | 15e5ccd1f4 | |
Daniel Gultsch | 1a72683b52 | |
Daniel Gultsch | 7ba81177c6 | |
Johannes Morgenroth | adff2baa4a | |
Daniel Gultsch | b3d4d0608f | |
Daniel Gultsch | a5e15d5a10 | |
Daniel Gultsch | f6c1af2b06 | |
participante0 | 48e3726071 | |
Daniel Gultsch | a55d0a691c | |
Daniel Gultsch | 8e0fb6a23a | |
Daniel Gultsch | 4d1308e138 | |
Daniel Gultsch | e6eb58f2d7 | |
Daniel Gultsch | 2cfa3ce288 | |
Daniel Gultsch | 848c339c8d | |
Daniel Gultsch | c837e0616a | |
Daniel Gultsch | c93b1a86bb | |
Daniel Gultsch | 9f5a089d5c | |
Daniel Gultsch | c33f4b704c | |
Daniel Gultsch | 9cc37a7bdb | |
Daniel Gultsch | ae85a9e87b | |
Daniel Gultsch | 067daa81f4 | |
Daniel Gultsch | d86a4642e9 | |
Johannes Morgenroth | a4454bcff2 | |
Sam Whited | 4a915c60e9 | |
Daniel Gultsch | 6c34763d32 | |
Daniel Gultsch | 1ac0c2f453 | |
Daniel Gultsch | 483304c697 | |
Daniel Gultsch | c86134e523 | |
Daniel Gultsch | d220d9db05 | |
Johannes Morgenroth | 403eff3d19 | |
Daniel Gultsch | bf07196707 | |
Daniel Gultsch | 0904ba42f8 | |
Daniel Gultsch | 0229a1605e | |
Daniel Gultsch | 8742194f4b | |
Daniel Gultsch | 4fd11a4c2b | |
Daniel Gultsch | 4bbf2dab99 | |
Daniel Gultsch | d4c2b12f95 | |
cijo-saju | 3467a67e75 | |
Daniel Gultsch | 03fff3179e | |
cijo-saju | 5a27da848b | |
cijo-saju | 41112d29bd | |
cijo-saju | ed8336ee54 | |
cijo-saju | 11e26e71f6 | |
Daniel Gultsch | e98f7e57b0 | |
Daniel Gultsch | cc1aa9e431 | |
Daniel Gultsch | 56f202d4b8 | |
Daniel Gultsch | d91c314ac2 | |
Daniel Gultsch | 65b3655a8b | |
Daniel Gultsch | 06d1e1752c | |
Daniel Gultsch | 649d1243d5 | |
Daniel Gultsch | 99565a6876 | |
Daniel Gultsch | 26badb7f4c | |
Daniel Gultsch | 3b3121b9c5 | |
Daniel Gultsch | 401329caaa | |
Daniel Gultsch | f75eb6bc43 | |
Daniel Gultsch | 081c33b886 | |
Daniel Gultsch | b34a1f7f5e | |
Daniel Gultsch | 75749d7c7b | |
Daniel Gultsch | 9682f4d454 | |
Daniel Gultsch | 4bfc54e51d | |
Daniel Gultsch | cf96a5e840 | |
Jan Christian Grünhage | 92ac82f94d | |
cijo-saju | 3171dcac8d | |
cijo-saju | 4e898fa4f2 | |
Haresh Khanna | c7912ed7ef | |
cijo-saju | 37465db817 | |
cijo-saju | 024dbd1c32 | |
cijo-saju | cb96911da3 | |
cijo-saju | d8901441f6 | |
Daniel Gultsch | 892b1b02af | |
cijo-saju | b4318996ac | |
Daniel Gultsch | 3af30d7563 | |
Daniel Gultsch | 2302122d8e | |
Daniel Gultsch | 00e8ba00c4 | |
Daniel Gultsch | 010b341251 | |
Daniel Gultsch | c97c5def2c | |
Daniel Gultsch | 76b9010c39 | |
Daniel Gultsch | 644a3a729d | |
Daniel Gultsch | e58f72c20f | |
Daniel Gultsch | c2c6904eda | |
Daniel Gultsch | 4171e2b90e | |
Daniel Gultsch | 0db5928031 | |
Daniel Gultsch | e5f08a5eae | |
Daniel Gultsch | 4d2a1afaf9 | |
Daniel Gultsch | 6167ddb4a8 | |
Daniel Gultsch | 30ed6b3cec | |
Daniel Gultsch | ce336690e2 | |
Daniel Gultsch | 91a69d7d85 | |
Daniel Gultsch | 935ac25cbd | |
Daniel Gultsch | ba32217152 | |
Daniel Gultsch | 95e33b5a97 | |
Daniel Gultsch | 09d68ae603 | |
Daniel Gultsch | 0b11d0f7f2 | |
Daniel Gultsch | 9c588ae9eb | |
Daniel Gultsch | 0ee13bbecb | |
Daniel Gultsch | 1fd3bbfe25 | |
Daniel Gultsch | 5ea4322d3f | |
Daniel Gultsch | 8a3c996164 | |
Daniel Gultsch | cdf2bd07df | |
Daniel Gultsch | c3b2f33956 | |
Daniel Gultsch | d56fb3cec2 | |
Daniel Gultsch | 19b7179bcd | |
Daniel Gultsch | 7747fc0ea1 | |
Daniel Gultsch | 6b72e18982 | |
Daniel Gultsch | 1f3be1597c | |
Daniel Gultsch | 9d043076e8 | |
Daniel Gultsch | 8ca16a6f63 | |
Daniel Gultsch | 064926a18b | |
Daniel Gultsch | a3b51f7654 | |
Daniel Gultsch | 233ee8a51c | |
Daniel Gultsch | 721250c7d9 | |
Daniel Gultsch | 8502d519c1 | |
Daniel Gultsch | 5b17734287 | |
Daniel Gultsch | 254edc48f5 | |
Daniel Gultsch | 3c951ce2cd | |
B Adarsh | 87f0c4a646 | |
Daniel Gultsch | 5fae9465d1 | |
Daniel Gultsch | 7306e0286f | |
Daniel Gultsch | 857c761c68 | |
Daniel Gultsch | 79b2f34685 | |
Daniel Gultsch | 9f3543a650 | |
Daniel Gultsch | 9ba5335ae7 | |
Haresh Khanna | 633aad3193 | |
Daniel Gultsch | 1c56b74e41 | |
Daniel Gultsch | 5a00b11594 | |
Daniel Gultsch | 4a7dbaab1e | |
Daniel Gultsch | 6088913fb6 | |
Daniel Gultsch | aa24a057fc | |
Daniel Gultsch | cae993a95f | |
Daniel Gultsch | bb7780eae6 | |
Daniel Gultsch | b0ada55b28 | |
Daniel Gultsch | f414998307 | |
vikiCoder | 72537b76c5 | |
Daniel Gultsch | b86dd584dc | |
Daniel Gultsch | cb203f5fd3 | |
Daniel Gultsch | d166309393 | |
Haresh Khanna | f2d2966b31 | |
Daniel Gultsch | 5c789b75cc | |
Daniel Gultsch | 58595fccfe | |
Daniel Gultsch | 768d79c621 | |
Daniel Gultsch | afa34ce15a | |
Daniel Gultsch | 469cf72e56 | |
vikiCoder | 51ef096e01 | |
Daniel Gultsch | 8cce653a1f | |
Daniel Gultsch | c740386297 | |
Daniel Gultsch | ea1e28267b | |
Daniel Gultsch | ecd53580c0 | |
Daniel Gultsch | 23a91e5019 | |
Daniel Gultsch | 4cddf31ad2 | |
Daniel Gultsch | 1f4c5ff97c | |
Daniel Gultsch | c7ec82679f | |
Daniel Gultsch | 8e0e81a603 | |
Daniel Gultsch | 0c0ff882a9 | |
Daniel Gultsch | a28116753a | |
licaon-kter | d3dd80eec9 | |
Daniel Gultsch | 0d00ff0c15 | |
Daniel Gultsch | abaabae853 | |
Daniel Gultsch | 79858278e0 | |
Daniel Gultsch | c69ad8f52c | |
Daniel Gultsch | cf9ab4d302 | |
Daniel Gultsch | 4f0e1b71c0 | |
Daniel Gultsch | caa16a8517 | |
Daniel Gultsch | 6e62b62b80 | |
Daniel Gultsch | c7e95d105c | |
Daniel Gultsch | bb249e0881 | |
Daniel Gultsch | b90a1fe1db | |
Daniel Gultsch | 2665c3a1e0 | |
Daniel Gultsch | 9116782cdc | |
Daniel Gultsch | c8f97be68e | |
Daniel Gultsch | 6b81ff70e5 | |
Daniel Gultsch | 5e367cb115 | |
Daniel Gultsch | edb3f57242 | |
Daniel Gultsch | 54ae8abcb7 | |
Daniel Gultsch | 82385e38f6 | |
Daniel Gultsch | 55e9067b27 | |
Daniel Gultsch | c76b073b8e | |
Daniel Gultsch | f60dd98d3c | |
Daniel Gultsch | 7317f5015a | |
Daniel Gultsch | 6569f20737 | |
Daniel Gultsch | d9e2ab62b2 | |
Daniel Gultsch | 24fab162e2 | |
Daniel Gultsch | 71ad18beb9 | |
Daniel Gultsch | c37117b940 | |
Daniel Gultsch | 6be3ae8ef0 | |
Daniel Gultsch | e35ada4997 | |
Daniel Gultsch | 6313c3c92e | |
Daniel Gultsch | 853862ec9c | |
Daniel Gultsch | e459616123 | |
Daniel Gultsch | 8ab166e817 | |
Daniel Gultsch | d7198bd68c | |
Daniel Gultsch | 6fc67d9a60 | |
Daniel Gultsch | 5fd91fcd8e | |
Michel Le Bihan | cd3ce76115 | |
Travis Burtrum | 2a34ece571 | |
Daniel Gultsch | 8a1ebf2bbe | |
Daniel Gultsch | 0d199c8ceb | |
Daniel Gultsch | 7651700c2a | |
Daniel Gultsch | eea1bc8090 | |
Daniel Gultsch | 53241f2ef1 | |
alexara | e4524e2c7b | |
Daniel Gultsch | c9e6d05fa0 | |
Masoud Abkenar | be84443921 | |
Daniel Gultsch | bbceee7f61 | |
Daniel Gultsch | 40ee1a0bfc | |
Daniel Gultsch | a86b2fefd9 | |
Daniel Gultsch | f2d9539d90 | |
Daniel Gultsch | 66457c9f2e | |
Daniel Gultsch | 9b6ae6d75f | |
Daniel Gultsch | 4c6ef3b24e | |
Daniel Gultsch | b48bf39e08 | |
Daniel Gultsch | 7035f38e0b | |
Daniel Gultsch | d53c813408 | |
Daniel Gultsch | b72d7ec8d0 | |
Daniel Gultsch | 5dde977233 | |
Daniel Gultsch | 2f4eee1fa7 | |
Daniel Gultsch | 96a6460744 | |
Daniel Gultsch | 780d1daf7e | |
Daniel Gultsch | 0f870223c4 | |
Daniel Gultsch | 5faa05ca19 | |
Daniel Gultsch | 97ba0a0d49 | |
Daniel Gultsch | cb9c4d4327 | |
Daniel Gultsch | c324f0c8df | |
Daniel Gultsch | 59f82cbd34 | |
Daniel Gultsch | 143ad48be1 | |
Daniel Gultsch | 1dcf804618 | |
Daniel Gultsch | ac2eee8e81 | |
Daniel Gultsch | 764026b87e | |
Daniel Gultsch | 7219e077f4 | |
Sam Whited | bfc2cffc2f | |
Daniel Gultsch | f7c5a5c42e | |
Daniel Gultsch | 9bdd2bf1ae | |
Daniel Gultsch | d028f4b398 | |
Daniel Gultsch | b085426d22 | |
Daniel Gultsch | a71e3d0653 | |
Daniel Gultsch | 8f39a594ff | |
Daniel Gultsch | ebf8ae231a | |
Daniel Gultsch | aa7bfe9fe7 | |
Daniel Gultsch | b2e9b4aeb1 | |
Daniel Gultsch | 8e025cbb9e | |
Daniel Gultsch | 1876b444fa | |
Daniel Gultsch | c03e3b5965 | |
Daniel Gultsch | fd7216b6a0 | |
Daniel Gultsch | 585a538340 | |
Daniel Gultsch | b050ff2576 | |
Daniel Gultsch | bfacc180c5 | |
Daniel Gultsch | 2c1d3ef968 | |
AnBuKu | 313baca84e | |
Daniel Gultsch | f0c3b31a42 | |
Daniel Gultsch | a1cb855739 | |
Daniel Gultsch | ef4ed90811 | |
Daniel Gultsch | 39bb8ad05f | |
Daniel Gultsch | b09b8136d2 | |
Daniel Gultsch | a994d8f847 | |
Daniel Gultsch | b19572ba8c | |
Daniel Gultsch | d192c529e0 | |
Daniel Gultsch | b116926bb1 | |
Daniel Gultsch | 39c8867ed7 | |
Daniel Gultsch | 1269123816 | |
Michael Eden | cd772360db | |
Daniel Gultsch | 4a299920dc | |
Daniel Gultsch | e6ba8484fa | |
Daniel Gultsch | 470d244414 | |
Daniel Gultsch | 2bb7bc1455 | |
Michael Eden | 5a670c88b0 | |
Daniel Gultsch | fa70bd7536 | |
Daniel Gultsch | b8b2051f4c | |
Daniel Gultsch | 8c34bb3c6f | |
Daniel Gultsch | 40a9f70478 | |
Daniel Gultsch | fcd9ab17fe | |
Daniel Gultsch | b8f67bfaa3 | |
Daniel Gultsch | 82c2e89d21 | |
Daniel Gultsch | 593dd259a9 | |
Daniel Gultsch | c43f224e8b | |
Daniel Gultsch | 9972f5eabc | |
Daniel Gultsch | 28c64c2bd1 | |
Daniel Gultsch | d03c431137 | |
Daniel Gultsch | 6c10f8a232 | |
Daniel Gultsch | f77afd9596 | |
Daniel Gultsch | b011d46ff2 | |
Daniel Gultsch | e5fff42b10 | |
Daniel Gultsch | fbbf1a37b4 | |
Daniel Gultsch | dbda2afd6d | |
Daniel Gultsch | 87746ca2ba | |
Daniel Gultsch | da914ba09c | |
Daniel Gultsch | 75ee14cfdf | |
Daniel Gultsch | 55b60f6b0f | |
Daniel Gultsch | 88321c1e8c | |
Daniel Gultsch | 8abfbf82fa | |
Daniel Gultsch | 8d127f70d0 | |
Daniel Gultsch | 8eb292d16a | |
Daniel Gultsch | 1739af2a41 | |
Daniel Gultsch | b879fb3753 | |
Daniel Gultsch | cbc9c1fb20 | |
Daniel Gultsch | 1e7b4030bb | |
Daniel Gultsch | 1a89915b31 | |
Daniel Gultsch | a5b3c579c4 | |
Daniel Gultsch | 56991bbaeb | |
Daniel Gultsch | 6e289b8738 | |
Daniel Gultsch | 599f7dad2c | |
Daniel Gultsch | d4b1119240 | |
Daniel Gultsch | 6b0242523b | |
Daniel Gultsch | 5d4aa04e5d | |
Daniel Gultsch | 58de10bcab | |
Daniel Gultsch | e127ba9361 | |
Daniel Gultsch | 6e95ad4bdf | |
Daniel Gultsch | 168ad50ddd | |
Daniel Gultsch | f0f2aab92d | |
Daniel Gultsch | 96a992353b | |
Daniel Gultsch | c62f3f99be | |
Daniel Gultsch | a7ec23ef30 | |
Daniel Gultsch | 1b9a91eb2f | |
Daniel Gultsch | 9d744add38 | |
Daniel Gultsch | 9e7a54849d | |
Daniel Gultsch | 33e6d8a1ce | |
Daniel Gultsch | e5d7357e6e | |
Daniel Gultsch | 84a2fa0041 | |
Daniel Gultsch | bbe01c9a6a | |
Daniel Gultsch | fb6f0649c3 | |
Daniel Gultsch | fdf19ae287 | |
Daniel Gultsch | d983f0bc71 | |
Daniel Gultsch | 22ca8200fa | |
Daniel Gultsch | 988cce6320 | |
Mishiranu | f4a769080b | |
Daniel Gultsch | f36dff485e | |
licaon-kter | 6320a3ca7c | |
Daniel Gultsch | 43fd5e5fe6 | |
licaon-kter | 84a4f4d66d | |
Daniel Gultsch | a87f7903c6 | |
Daniel Gultsch | 1e59a9517a | |
Daniel Gultsch | 6a5d2e35b5 | |
Daniel Gultsch | cbd45d3ee5 | |
Daniel Gultsch | 2ec7165381 | |
Daniel Gultsch | 20d3a41b52 | |
Daniel Gultsch | 839ef8e14b | |
Daniel Gultsch | 4720ac94d3 | |
Daniel Gultsch | 07fe434cc7 | |
Daniel Gultsch | d2268c6a6f | |
Daniel Gultsch | d76b0a3104 | |
Daniel Gultsch | 1a7e0fd153 | |
Daniel Gultsch | 6631705aea | |
Daniel Gultsch | 7b99346a4b | |
Daniel Gultsch | 1c31b96920 | |
Daniel Gultsch | 568d6c8392 | |
Daniel Gultsch | 64e8035f6d | |
Daniel Gultsch | b71aa6d3a4 | |
Daniel Gultsch | 2614706d39 | |
Daniel Gultsch | cb639f3fdd | |
Daniel Gultsch | 6362799d56 | |
Daniel Gultsch | 40c747660d | |
Daniel Gultsch | 8132480b82 | |
Daniel Gultsch | 3bf2876e09 | |
Daniel Gultsch | 1820b163a1 | |
Daniel Aleksandersen | 965f73f95a | |
Daniel Gultsch | 2b9b3be3f1 | |
Daniel Gultsch | a86a36f570 | |
Daniel Gultsch | 01f92ef4ee | |
Daniel Gultsch | d68b7cfcfc | |
Daniel Gultsch | fef601b4ae | |
Daniel Gultsch | 0303c28ad9 | |
Daniel Gultsch | 1ed2445c1d | |
Daniel Gultsch | a7ee8f8a74 | |
Daniel Gultsch | 9d9a9e63ad | |
Daniel Gultsch | 99a41265b8 | |
Daniel Gultsch | 7ec38bd202 | |
Daniel Gultsch | 211354ee26 | |
Daniel Gultsch | 7e2e42cb11 | |
Daniel Gultsch | 3f3b360eee | |
Daniel Gultsch | ad9a8c2281 | |
Daniel Gultsch | 4d965e96ed | |
Daniel Gultsch | 5007aa1b07 | |
Daniel Gultsch | d8bff08f1f | |
Daniel Gultsch | ec63900ef3 | |
Daniel Gultsch | 48afeb571b | |
Daniel Gultsch | e84af51272 | |
Daniel Gultsch | d61b00604d | |
Daniel Gultsch | 05fc15be3d | |
Daniel Gultsch | 6da8b50d95 | |
Daniel Gultsch | a753e28ad2 | |
Daniel Gultsch | 1d3167b520 | |
Daniel Gultsch | 035d0c7957 | |
Daniel Gultsch | bec048407a | |
Daniel Gultsch | fe62ef32ae | |
Daniel Gultsch | f7c2cd4807 | |
Daniel Gultsch | e8cc959a7f | |
Daniel Gultsch | bd578c59bf | |
Daniel Gultsch | bb4952c89e | |
Daniel Gultsch | 698ddadbee | |
Daniel Gultsch | 1ef8d0a746 | |
Daniel Gultsch | bca8f11c9c | |
Ignacio Quezada | 297c0a792f | |
Daniel Gultsch | 1a57599da2 | |
Daniel Gultsch | 00b3d5ee35 | |
Daniel Gultsch | b3c19f039c | |
licaon-kter | d341904c4d | |
Daniel Gultsch | 7978fd768e | |
Daniel Gultsch | b390908610 | |
ReadmeCritic | 64ad93dad6 | |
Daniel Gultsch | 9edbddd7e1 | |
Daniel Gultsch | d369ec767f | |
Daniel Gultsch | 2c004857f6 | |
Daniel Gultsch | 544c5b4a21 | |
Daniel Gultsch | e582b9fc10 | |
Daniel Gultsch | e538272417 | |
Daniel Gultsch | 20ddba2aa9 | |
Daniel Gultsch | 07a71d312a | |
Daniel Gultsch | a5181b22e0 | |
Daniel Gultsch | ffebb4677a | |
Daniel Gultsch | a44f35ed69 | |
Daniel Gultsch | 1e4b1a3346 | |
Daniel Gultsch | 8557120ef8 | |
Daniel Gultsch | a4020e85f6 | |
Daniel Gultsch | 8c1bb058da | |
Daniel Gultsch | 10398cab51 | |
Daniel Gultsch | f2696b66ba | |
Daniel Gultsch | 52d4be4249 | |
Daniel Gultsch | 0f62ff6736 | |
Daniel Gultsch | 44ce5df359 | |
Mishiranu | fd4e15ba97 | |
Mishiranu | 8835f08cf7 | |
Daniel Gultsch | c3423d6ffe | |
Daniel Gultsch | dce8149aae | |
Daniel Gultsch | 7226fc0010 | |
Daniel Gultsch | 50780debf7 | |
Daniel Gultsch | f8c21caec9 | |
Daniel Gultsch | 22d13a3dcd | |
Daniel Gultsch | dc02e2b498 | |
Daniel Gultsch | 6371d2b7a9 | |
Daniel Gultsch | 2a73b8d76e | |
Daniel Gultsch | f6cfa27741 | |
Daniel Gultsch | 501152bcfd | |
Daniel Gultsch | 9e54fd5c92 | |
Daniel Gultsch | cd1c05a7c3 | |
Daniel Gultsch | f7d51b8890 | |
Daniel Gultsch | c5bdb04490 | |
Daniel Gultsch | 74087b873f | |
Constantin Soffner | ad8b9eb054 | |
Daniel Gultsch | f3ef8d4978 | |
Daniel Gultsch | 9efef24a04 | |
Daniel Gultsch | 5a73a6b139 | |
Daniel Gultsch | 1f7f82da7b | |
Daniel Gultsch | 26e33de79a | |
Daniel Gultsch | 187825d6c6 | |
Daniel Gultsch | 6d5f23213b | |
Daniel Gultsch | 0af13fc746 | |
Daniel Gultsch | 5530b0b0e2 | |
Daniel Gultsch | 40e5090bdd | |
Daniel Gultsch | 9f060f477f | |
Daniel Gultsch | 8d8cb92e43 | |
Daniel Gultsch | 27af6a4b1e | |
Daniel Gultsch | 082c06a486 | |
Daniel Gultsch | 5ac0e9267d | |
Daniel Gultsch | cea52b0722 | |
Daniel Gultsch | f4a883848c | |
Daniel Gultsch | b6e7def9db | |
Daniel Gultsch | 7c6d1d19d5 | |
Daniel Gultsch | dcd6ef8f84 | |
Daniel Gultsch | d6c2ff9782 | |
Daniel Gultsch | b0fb9fd9ee | |
Daniel Gultsch | e275fd8143 | |
Daniel Gultsch | 43f5dfe174 | |
Daniel Gultsch | f0dbcce58f | |
Daniele Gobbetti | 41db773b08 | |
Daniel Gultsch | 5cd8917122 | |
Daniel Gultsch | bb48f67a30 | |
Daniel Gultsch | 1339b9c464 | |
Daniel Gultsch | cee3c98a23 | |
Daniel Gultsch | 343d895a26 | |
Daniel Gultsch | 13ed27f91e | |
Daniel Gultsch | 401759cdc7 | |
Daniel Gultsch | 61f58b3dbd | |
Daniel Gultsch | de7c0c5121 | |
Mishiranu | 9aaa5b78f4 | |
Mishiranu | 18ab826413 | |
Daniel Gultsch | 5790d4c4ab | |
Daniel Gultsch | 98ab9beec7 | |
Daniel Gultsch | 7bda624723 | |
Daniel Gultsch | 7eac903277 | |
Daniel Gultsch | badc97e280 | |
Daniel Gultsch | 7c608c8862 | |
Daniel Gultsch | 6b904d4de1 | |
Mishiranu | 858a327299 | |
Daniel Gultsch | 7bdd4166c0 | |
Daniel Gultsch | 00c04cd413 | |
Mishiranu | 3e6747c880 | |
Daniel Gultsch | 9d0a333372 | |
Daniel Gultsch | af55aeca58 | |
Daniel Gultsch | 521469a57d | |
Daniel Gultsch | 569b7bf6d0 | |
Daniel Gultsch | 3cdf5f9afc | |
Daniel Gultsch | 15c807730e | |
Daniel Gultsch | 7b445bc4c7 | |
Mishiranu | 8ca5eb4429 | |
Daniel Gultsch | ab63dba8aa | |
Daniel Gultsch | 4359afacb4 | |
Daniel Gultsch | 7b52e6984c | |
Daniel Gultsch | 869ee3d438 | |
Daniel Gultsch | d3dfecae8a | |
Daniel Gultsch | 6cb2b0b5d1 | |
Sam Whited | 1a0b538166 | |
Sam Whited | 805717673c | |
Daniele Gobbetti | e6e46651c9 | |
Daniel Gultsch | 75fcab3170 | |
licaon-kter | 59b2e281a3 | |
Daniel Gultsch | 6fd9888b3b | |
Daniel Gultsch | c3b11e515e | |
Daniel Gultsch | edf0ae9aa6 | |
Daniel Gultsch | 00cbf8458a | |
Daniel Gultsch | ac9f13a9f2 | |
Daniel Gultsch | a54a7dca30 | |
Daniel Gultsch | 416481bb65 | |
Daniel Gultsch | ba6b4763d2 | |
Daniel Gultsch | e1d2c32e63 | |
Daniel Gultsch | 257d1e42d8 | |
Daniel Gultsch | 7e81149869 | |
Daniel Gultsch | 1dc55f72e3 | |
Daniel Gultsch | d2c475d501 | |
Daniel Gultsch | ad09d7dc49 | |
Daniel Gultsch | aca7054174 | |
Daniel Gultsch | f7d8580969 | |
Daniel Gultsch | f14ab4c391 | |
Daniel Gultsch | 7917c19d18 | |
Daniel Gultsch | 3685c8cd2a | |
Daniel Gultsch | d32cbcc70d | |
Daniel Gultsch | af329eff46 | |
Daniel Gultsch | b747afb44c | |
Daniel Gultsch | 2c187d0e7c | |
Daniel Gultsch | caafd03130 | |
Daniel Gultsch | 3d5940cb76 | |
Daniel Gultsch | 78e962ce67 | |
Daniel Gultsch | ea0e6d0619 | |
Daniel Gultsch | ad994a2f4c | |
Daniel Gultsch | fd54dc5aff | |
Daniel Gultsch | 76cbb4f727 | |
Daniel Gultsch | e33d8451a8 | |
Daniel Gultsch | f931c08da7 | |
Daniel Gultsch | b52f079292 | |
Daniel Gultsch | 9e0145a8f6 | |
Daniel Gultsch | e98ab37c9d | |
Daniel Gultsch | cbda5a5016 | |
Daniel Gultsch | 910b38ec13 | |
Daniel Gultsch | b0cdc2745c | |
Daniel Gultsch | 2e4713897d | |
Daniel Gultsch | 542626758d | |
Daniel Gultsch | a4d342683e | |
Daniel Gultsch | 0b9d38cf32 | |
Daniel Gultsch | f1ecbf2ff8 | |
Daniel Gultsch | 6f72128c45 | |
Daniel Gultsch | 8927ba8065 | |
Daniel Gultsch | a0038565c5 | |
Daniel Gultsch | 285d86b375 | |
Daniel Gultsch | cf909afc60 | |
Daniel Gultsch | 2a139a4b47 | |
Daniel Gultsch | 0528a47b8a | |
Daniel Gultsch | b5d3859b22 | |
Daniel Gultsch | 343bb7ff28 | |
Daniel Gultsch | 94aee445e7 | |
Daniel Gultsch | 4736d12e99 | |
Daniel Gultsch | eb8b6165d7 | |
licaon-kter | 81b0f60860 | |
Daniel Gultsch | 8b6f06f0f9 | |
Daniel Gultsch | 08725ba2bb | |
Daniel Gultsch | 9bfdbc708e | |
Daniel Gultsch | 856029a611 | |
Daniel Gultsch | a51de9fcd9 | |
Daniel Gultsch | 121312d103 | |
Daniel Gultsch | d02e24248f | |
Daniel Gultsch | 8b331895d1 | |
Daniel Gultsch | ed2fa20414 | |
Daniel Gultsch | 9dc8e3db9d | |
Daniel Gultsch | 1b114beb0b | |
Daniel Gultsch | 3c48b14448 | |
Daniel Gultsch | 0e96e0a796 | |
Daniel Gultsch | c06aceaae9 | |
Daniel Gultsch | 04976fe333 | |
Daniel Gultsch | 178229ac60 | |
Daniel Gultsch | dbab43e423 | |
Daniel Gultsch | cf7df84cab | |
Daniel Gultsch | 701140fe92 | |
Daniel Gultsch | 58a3ef46ce | |
Daniel Gultsch | 82908fb54b | |
Daniel Gultsch | 3409399ef1 | |
Daniel Gultsch | 198a9f2226 | |
Daniel Gultsch | 89a05265ea | |
Daniel Gultsch | 3d372cb339 | |
Daniel Gultsch | 6dcce76568 | |
Daniel Gultsch | 3a5735e717 | |
Daniel Gultsch | e9c00c0427 | |
Daniel Gultsch | c8188ee52c | |
Daniel Gultsch | 2843a0af26 | |
Daniel Gultsch | e90e333f29 | |
Daniel Gultsch | eb3ac1c326 | |
Daniel Gultsch | 3e50d4831f | |
Daniel Gultsch | 0bc5dbdf94 | |
Daniel Gultsch | baa149924a | |
Daniel Gultsch | 1db85e582e | |
Daniel Gultsch | 2803d342e1 | |
Daniel Gultsch | 223d50c1a0 | |
Daniel Gultsch | 27690865a6 | |
Daniel Gultsch | 58d5d2a1be | |
Daniel Gultsch | ff1b23b4d9 | |
Daniel Gultsch | be4aa2afc9 | |
Daniel Gultsch | 01a4d2ea25 | |
Daniel Gultsch | f9aca85edf | |
Daniel Gultsch | 57e51bc735 | |
Daniel Gultsch | cdee91363c | |
Daniel Gultsch | ac8aa63916 | |
Daniel Gultsch | 369e7172d6 | |
Daniel Gultsch | 09aba0a062 | |
Daniel Gultsch | 9efa242d96 | |
Daniel Gultsch | 30110431ba | |
Daniel Gultsch | 91c3732c63 | |
Daniel Gultsch | f7933c26d7 | |
Daniel Gultsch | 1d79a677c8 | |
Daniel Gultsch | b5caa8fa35 | |
Daniel Gultsch | 8882c6b6fd | |
Daniel Gultsch | e63d6b4bf2 | |
Daniel Gultsch | 9a7f51520e | |
Daniel Gultsch | 4e6d16c49b | |
Daniel Gultsch | e52f662569 | |
Daniel Gultsch | 72a2622c84 | |
Daniel Gultsch | 97fe14c4be | |
Daniel Gultsch | 78e3afc1af | |
Daniel Gultsch | d2ca0c7fe8 | |
Daniel Gultsch | 4d5e0c291e | |
Daniel Gultsch | 982a20fef5 | |
Daniel Gultsch | 4ba5472d0c | |
Daniel Gultsch | d28d968985 | |
Daniel Gultsch | 34454ef2ec | |
Daniel Gultsch | 4d1640d6ff | |
alexxthehood | e88f01923f | |
Daniel Gultsch | 1166619539 | |
Daniel Gultsch | 28dc888159 | |
Daniel Gultsch | ea1e4c773d | |
Daniel Gultsch | 37e7175a86 | |
Daniel Gultsch | 85c82d9b3b | |
Daniel Gultsch | 829720409d | |
Daniel Gultsch | f91d16cbe7 | |
Daniel Gultsch | b92b3863b9 | |
Daniel Gultsch | fc3aefd56e | |
Daniel Gultsch | dcc13d7a3d | |
Daniel Gultsch | 48a7818e88 | |
Daniel Gultsch | 1eb776f39c | |
Daniel Gultsch | f8b1e8098c | |
Daniel Gultsch | 60588af825 | |
Daniel Gultsch | f99f21ab9b | |
Daniel Gultsch | 5f4471a45e | |
Daniel Gultsch | cb5393c32f | |
Daniel Gultsch | 5f40a7042d | |
Daniel Gultsch | e0575642b5 | |
Daniel Gultsch | 73679b97f1 | |
Daniel Gultsch | 49de43b364 | |
Daniel Gultsch | f9600b950f | |
Daniel Gultsch | 95a51ea2e0 | |
Daniel Gultsch | 39ad426ca9 | |
Daniel Gultsch | 40f81f19df | |
Daniel Gultsch | 587fb3cca3 | |
Daniel Gultsch | 490a1ca3cf | |
Daniel Gultsch | ea667a1a73 | |
Daniel Gultsch | f4e3cd5098 | |
Daniel Gultsch | c4680e3198 | |
Daniel Gultsch | 31dd7b5a21 | |
Daniel Gultsch | 74d376be68 | |
Daniel Gultsch | 5017e8564c | |
Daniel Gultsch | a70f57358e | |
Daniel Gultsch | 4bf9a1e809 | |
Daniel Gultsch | e2a803ee04 | |
Daniel Gultsch | 4b9b7257a9 | |
Daniel Gultsch | cb7c47bc62 | |
Daniel Gultsch | 33a02faad9 | |
Daniel Gultsch | a018935b23 | |
Daniel Gultsch | 112a4d389e | |
Steffen Keiper | 7932244c51 | |
Daniel Gultsch | b88128241e | |
Daniel Gultsch | 9f42ead747 | |
Yussuf Khalil | 92bad0fa1e | |
Daniel Gultsch | d089ceac13 | |
Daniel Gultsch | 8e6f054e52 | |
Daniel Gultsch | 36ae840d76 | |
Daniel Gultsch | 7a97da6d21 | |
Daniel Gultsch | 794353ad0c | |
Daniel Gultsch | 71e9117176 | |
Daniel Gultsch | 6639d0f23b | |
Daniel Gultsch | becc3eb867 | |
Daniel Gultsch | 7398424f3b | |
Daniel Gultsch | e26d842549 | |
Andreas Straub | 17c62b5991 | |
Daniel Gultsch | 161fdf7340 | |
Daniel Gultsch | e402348f9b | |
Daniel Gultsch | 583aba1b44 | |
Daniel Gultsch | 594aab56db | |
Daniel Gultsch | 25211f13b3 | |
Daniel Gultsch | e43a01159c | |
Daniel Gultsch | 45cc33ca36 | |
Daniel Gultsch | 20ba1add1e | |
Daniel Gultsch | 91732b89ea | |
Daniel Gultsch | add8e2cb74 | |
Daniel Gultsch | 15316e6a7f | |
Daniel Gultsch | 5c5d5cc4e3 | |
Daniel Gultsch | 24ea66c9fc | |
Daniel Gultsch | ffba53777c | |
Daniel Gultsch | ea6a008b39 | |
Daniel Gultsch | 1838023c88 | |
Daniel Gultsch | b3337c4ad7 | |
Daniel Gultsch | b7c8ce1511 | |
Daniel Gultsch | 6d0e5f4354 | |
Daniel Gultsch | 5b9ba79495 | |
Daniel Gultsch | 9321ccc775 | |
Daniel Gultsch | 8eb1640a26 | |
Daniel Gultsch | be0fc59314 | |
Daniel Gultsch | 272cffe797 | |
Daniel Gultsch | 762820072a | |
Daniel Gultsch | ea18ceae4a | |
Daniel Gultsch | 71787bd2e1 | |
Daniel Gultsch | 49cefd1c0c | |
Daniel Gultsch | 9afafe387a | |
Daniel Gultsch | 107ab85a22 | |
Daniel Gultsch | d89d7ade84 | |
Daniel Gultsch | c3ec3ea70a | |
Daniel Gultsch | 2c55954ddd | |
Daniel Gultsch | aaf5233efe | |
Daniel Gultsch | 422fd1847f | |
Daniel Gultsch | ce0888b077 | |
Daniel Gultsch | fde27f447f | |
Daniel Gultsch | b3f50d1ad0 | |
Daniel Gultsch | bc326efd2c | |
Daniel Gultsch | bc36f1950f | |
Daniel Gultsch | ae7543bbfc | |
Daniel Gultsch | 06bef5de8d | |
Daniel Gultsch | 25f6651848 | |
Daniel Gultsch | 29bd1103c0 | |
Daniel Gultsch | a241ab66de | |
Daniel Gultsch | f70fcc7bb8 | |
Daniel Gultsch | 44833c1499 | |
GDR! | 82c3cbaf2a | |
Daniel Gultsch | 21ebb35e44 | |
Daniel Gultsch | d9ff61ea2e | |
Daniel Gultsch | 841e718d6a | |
Daniel Gultsch | c4e82eb3f8 | |
Daniel Gultsch | c06e2787c7 | |
Daniel Gultsch | 83adbb6052 | |
Daniel Gultsch | 5137837f6d | |
Daniel Gultsch | c65c314801 | |
Daniel Gultsch | 79796b0079 | |
Daniel Gultsch | b69ab65b12 | |
Daniel Gultsch | abbdf232c6 | |
Daniel Gultsch | d84cf4e6d1 | |
Daniel Gultsch | e5b8302fd9 | |
Daniel Gultsch | 33218ec32a | |
Daniel Gultsch | a8420c9ad0 | |
Daniel Gultsch | 277e3d59c8 | |
Daniel Gultsch | e1cf7b8cb6 | |
Daniel Gultsch | 9ce2cfa3d2 | |
Daniel Gultsch | 8d595c1fc2 | |
Daniel Gultsch | ef27055434 | |
Daniel Gultsch | 3f65b0e985 | |
Daniel Gultsch | 70497318dd | |
Daniel Gultsch | 0eb8d4226e | |
Daniel Gultsch | 627bf18f8c | |
Daniel Gultsch | afa3883089 | |
Daniel Gultsch | b478eca315 | |
Daniel Gultsch | 61726f4994 | |
Daniel Gultsch | 14952ba5e5 | |
Daniel Gultsch | fc5304c6fe | |
Daniel Gultsch | 8d0693ed6a | |
Daniel Gultsch | d7c5264ad0 | |
Daniel Gultsch | 331cbf3696 | |
Daniel Gultsch | 6f1a4494eb | |
Daniel Gultsch | cf5ca27a06 | |
Daniel Gultsch | c9e9dc2ef2 | |
Daniel Gultsch | a25912c32c | |
Daniel Gultsch | 540f6f3d7a | |
Daniel Gultsch | 018f978a22 | |
Daniel Gultsch | 6a28b5a9fa | |
Daniel Gultsch | e41a9483bd | |
Daniel Gultsch | aced9d2697 | |
Daniel Gultsch | b756d61c45 | |
Daniel Gultsch | e6ff1539b4 | |
Daniel Gultsch | 72f541140f | |
Daniel Gultsch | acad161344 | |
Daniel Gultsch | b8c1bd2cba | |
Daniel Gultsch | 2014f388b1 | |
Daniel Gultsch | cbdb413613 | |
Daniel Gultsch | f4369b29ae | |
Daniel Gultsch | 7113e21a43 | |
Daniel Gultsch | 908aa19a36 | |
Daniel Gultsch | 09e20f6e01 | |
Daniel Gultsch | 1bc92482e9 | |
Daniel Gultsch | cc209afc51 | |
Daniel Gultsch | 8e3948e495 | |
Daniel Gultsch | c37b5af2ca | |
Daniel Gultsch | e542dd3923 | |
Daniel Gultsch | 549be9bb3d | |
Daniel Gultsch | 27b245ac35 | |
Daniel Gultsch | 488780d2ce | |
Daniel Gultsch | 6f3b8f64d1 | |
Daniel Gultsch | 784df0c218 | |
Daniel Gultsch | fb7525e0b9 | |
Daniel Gultsch | 76889b9c58 | |
Daniel Gultsch | e2d3bef739 | |
Daniel Gultsch | a7cd05bd4e | |
Daniel Gultsch | 0157039e87 | |
Sebastian | 544e1dee65 | |
Daniel Gultsch | 6e0ec9b924 | |
Daniel Gultsch | 12704fa640 | |
Daniel Gultsch | 8a81f85734 | |
Daniel Gultsch | c27663c456 | |
Daniel Gultsch | fb41a4ffaa | |
Daniel Gultsch | 16eb1bfbd0 | |
Daniel Gultsch | b334582eff | |
klemens | 7047d68165 | |
Daniel Gultsch | dee7fd3eab | |
Sebastian | cf374ec4ef | |
Daniel Gultsch | 59f02f7766 | |
Daniel Gultsch | cef2eb58a7 | |
Daniel Gultsch | fad8b702aa | |
Daniel Gultsch | cfa31beaf7 | |
Daniel Gultsch | f444390617 | |
Daniel Gultsch | 06a561743a | |
Daniel Gultsch | 7674e01585 | |
Daniel Gultsch | bf92ef6cd3 | |
Daniel Gultsch | d23178acb9 | |
Daniel Gultsch | 98ecac0ffa | |
Daniel Gultsch | 936006173c | |
Daniel Gultsch | d5608cb4f3 | |
Daniel Gultsch | c7882b7225 | |
Daniel Gultsch | 6d9ca25915 | |
Daniel Gultsch | 252d015b71 | |
Daniel Gultsch | 1d2e2f71c2 | |
Daniel Gultsch | 51753a1d39 | |
Daniel Gultsch | 5021b9a5dd | |
Daniel Gultsch | 29616d02a8 | |
Daniel Gultsch | ebcb13c8eb | |
Daniel Gultsch | e6b526230a | |
Daniel Gultsch | 9c3e910dc4 | |
Daniel Gultsch | 59652ecaf2 | |
Daniel Gultsch | 6a677a172b | |
Christian S | 94983ca3ed | |
Daniel Gultsch | a363e0a5d8 | |
Daniel Gultsch | cd1fbf60ec | |
Daniel Gultsch | a9c1768107 | |
Daniel Gultsch | 1901abd05f | |
Daniel Gultsch | 195b745efc | |
Daniel Gultsch | 1a073ca454 | |
Daniel Gultsch | bfe01c4322 | |
Daniel Gultsch | e9494af098 | |
Daniel Gultsch | eb63cdb9ad | |
Daniel Gultsch | 72aa10b536 | |
Daniel Gultsch | 39e717ed94 | |
Daniel Gultsch | c53c6cb6b6 | |
Daniel Gultsch | 594e65bb2b | |
Daniel Gultsch | 4332b0df44 | |
Daniel Gultsch | 3e654bea0e | |
Daniel Gultsch | 2a4db01709 | |
Daniel Gultsch | 7223b5b274 | |
Daniel Gultsch | 7ff890e513 | |
Daniel Gultsch | 23a0beab43 | |
Daniel Gultsch | 77f4513862 | |
Daniel Gultsch | 677269606c | |
Daniel Gultsch | 5786e75374 | |
Daniel Gultsch | 91b17c6925 | |
Daniel Gultsch | 607b7d1593 | |
Daniel Gultsch | 83fab06508 | |
Daniel Gultsch | 4652541b61 | |
Daniel Gultsch | 65548ddccb | |
Daniel Gultsch | b99d70bfe7 | |
Daniel Gultsch | 2713fd50c8 | |
Daniel Gultsch | 14b46c3ee7 | |
Daniel Gultsch | a8ebc5fafc | |
Daniel Gultsch | c22b384680 | |
Daniel Gultsch | db0301310b | |
Daniel Gultsch | 7a84cfdfa2 | |
Daniel Gultsch | c55f7645a4 | |
Daniel Gultsch | 0460702710 | |
Daniel Gultsch | 290f0a123e | |
Daniel Gultsch | 275d6a858c | |
Daniel Gultsch | b4ad2de2e5 | |
Daniel Gultsch | ecaf75e5ec | |
Daniel Gultsch | a968260b18 | |
Daniel Gultsch | 0385e3a8d6 | |
Daniel Gultsch | e94e06246b | |
Daniel Gultsch | 5787687997 | |
Daniel Gultsch | 61997912fd | |
Daniel Gultsch | 5eedce91f9 | |
Daniel Gultsch | 701742f550 | |
Daniel Gultsch | 2549ce89b0 | |
Daniel Gultsch | 74c496fe3e | |
Daniel Gultsch | e074104004 | |
Daniel Gultsch | 867d0ef191 | |
Daniel Gultsch | 8d98c52803 | |
Daniel Gultsch | 343a6b4e6b | |
Daniel Gultsch | d115f38361 | |
Christian S | 1d458e8ab3 | |
Daniel Gultsch | 46be514b4d | |
Daniel Gultsch | a9b66e3ea5 | |
Daniel Gultsch | 281cb65046 | |
Daniel Gultsch | 564113669e | |
Daniel Gultsch | 0baa2dd03e | |
licaon-kter | 6ba90ec43c | |
Daniel Gultsch | 135c8567a5 | |
Daniel Gultsch | ac09011690 | |
Daniel Gultsch | 7df24407dc | |
Daniel Gultsch | b51ce43d36 | |
Daniel Gultsch | c4b1f6171d | |
Daniel Gultsch | b17ca3543f | |
Daniel Gultsch | 48be5af55f | |
Daniel Gultsch | 323d31ba05 | |
fiaxh | eaddfa7fd1 | |
Daniel Gultsch | 678bc7b4d4 | |
Daniel Gultsch | 815c534da8 | |
Daniel Gultsch | 0af8ee341c | |
Daniel Gultsch | 1153e6120d | |
Daniel Gultsch | 290f53f4a6 | |
Daniel Gultsch | 817d344521 | |
Daniel Gultsch | 9548f43998 | |
Daniel Gultsch | 7eb736227e | |
Daniel Gultsch | 1e75283250 | |
Daniel Gultsch | 24aefa109c | |
Daniel Gultsch | e6a9829dd2 | |
Daniel Gultsch | 86fff5839a | |
Daniel Gultsch | 8339ebf3dc | |
Daniel Gultsch | d3542202b5 | |
Daniel Gultsch | e9b4a2a021 | |
Daniel Gultsch | 09d87965fb | |
Daniel Gultsch | aa24a0f779 | |
Daniel Gultsch | 89eea3636f | |
Daniel Gultsch | 07263370d9 | |
Daniel Gultsch | cc67bfd8db | |
Daniel Gultsch | bc5f64bffe | |
Daniel Gultsch | 4cb2d0ca93 | |
Daniel Gultsch | c9e4b332bf | |
Daniel Gultsch | aaf64732b0 | |
Daniel Gultsch | 15a1873d97 | |
Daniel Gultsch | fd246f7e5a | |
Daniel Gultsch | ab4d86dde7 | |
Daniel Gultsch | 198dc2c6b4 | |
Tarun | df7b399e04 | |
Daniel Gultsch | 134c75ae01 | |
Daniel Gultsch | 9e0466d1e6 | |
Daniel Gultsch | 199ae3a4d8 | |
Daniel Gultsch | 4ba41540fd | |
Daniel Gultsch | 5cdfd0ec50 | |
Daniel Gultsch | 24a9ac2908 | |
Daniel Gultsch | 2c224d0f18 | |
Daniel Gultsch | 3cf21e2d37 | |
Daniel Gultsch | 60ab03afb1 | |
Daniel Gultsch | c393e60891 | |
Daniel Gultsch | 7fd6a37e67 | |
Daniel Gultsch | dc00a92499 | |
Daniel Gultsch | 5d3ee60ca4 | |
Daniel Gultsch | bbede8bbeb | |
fiaxh | e1a2f248af | |
fiaxh | a88c2d48c0 | |
Daniel Gultsch | d1a456f3e3 | |
Daniel Gultsch | ddafa65849 | |
Daniel Gultsch | 17b1fcc3ea | |
Daniel Gultsch | 34f2a63190 | |
Daniel Gultsch | 0298f0181e | |
fiaxh | 894b5892a9 | |
Daniel Gultsch | 20eebe638b | |
Daniel Gultsch | ad063d00cc | |
Daniel Gultsch | beb216c300 | |
Daniel Gultsch | 7f45e210af | |
Daniel Gultsch | f1c947f0d6 | |
Daniel Gultsch | 9ae997cab8 | |
Daniel Gultsch | 4a9753bebc | |
Daniel Gultsch | 5eb2d9af83 | |
Daniel Gultsch | 689ded1607 | |
Daniel Gultsch | a0d0ed34ae | |
Daniel Gultsch | c20d8ac69e | |
Daniel Gultsch | d2cfac222e | |
Daniel Gultsch | b00c561f81 | |
Daniel Gultsch | ed740b4868 | |
Daniel Gultsch | 43b466704a | |
Daniel Gultsch | 3bde4dbedb | |
Daniel Gultsch | e6f8b7d9fa | |
Daniel Gultsch | a2cb009f4c | |
Daniel Gultsch | df992d2566 | |
Daniel Gultsch | ad60bc002c | |
Daniel Gultsch | 49a3f6f281 | |
Daniel Gultsch | ac687d6bbd | |
Daniel Gultsch | 59978e157c | |
Daniel Gultsch | 3626e4b3a0 | |
Daniel Gultsch | c2fbdbde83 | |
Daniel Gultsch | 86b1865eec | |
Daniel Gultsch | 726393f8da | |
Daniel Gultsch | 349dd8291d | |
Daniel Gultsch | c39008983e | |
petmue | a27cbfbf56 | |
Daniel Gultsch | 7d63b06d84 | |
Daniel Gultsch | d06013fbaf | |
Daniel Gultsch | a5e40672c1 | |
Daniel Gultsch | a9b957e8a2 | |
Daniel Gultsch | 0ca4a33bfb | |
Daniel Gultsch | c0b3a3ff0c | |
Daniel Gultsch | 335058b78b | |
Daniel Gultsch | c4b1df1bf3 | |
Daniel Gultsch | c3f0503a91 | |
Daniel Gultsch | 8ccb2005b3 | |
Daniel Gultsch | 356199978e | |
Daniel Gultsch | 92a6e956fd | |
Daniel Gultsch | 300326fba3 | |
Daniel Gultsch | 251f2479c2 | |
Daniel Gultsch | 6f9f871928 | |
Daniel Gultsch | c7a14092a8 | |
Daniel Gultsch | 6217e33a87 | |
Daniel Gultsch | c430848ade | |
Daniel Gultsch | bac249c8dd | |
Daniel Gultsch | 32da65f910 | |
Daniel Gultsch | 93dad9b737 | |
Daniel Gultsch | d58d822215 | |
Daniel Gultsch | f37098a54f | |
Daniel Gultsch | 1bb38e25f2 | |
Daniel Gultsch | f16690ae1f | |
Daniel Gultsch | 91ec4839ac | |
Daniel Gultsch | 28733e052f | |
Daniel Gultsch | 4fdb0d92fe | |
Daniel Gultsch | f88b8c703e | |
Daniel Gultsch | 17791a703e | |
Daniel Gultsch | 7dd9545ea3 | |
Daniel Gultsch | 1d572c61d0 | |
Daniel Gultsch | 0911669b07 | |
Daniel Gultsch | 1274b0ef39 | |
Daniel Gultsch | f0798216d5 | |
Daniel Gultsch | 4a1a59f0c8 | |
Daniel Gultsch | 01bad12708 | |
Daniel Gultsch | 58c6f9bfb2 | |
Daniel Gultsch | fab0a45955 | |
Daniel Gultsch | ba9ba8ffe2 | |
Daniel Gultsch | f30df7a535 | |
Daniel Gultsch | ae83efe4a6 | |
Daniel Gultsch | 3978c04782 | |
Daniel Gultsch | 1e7647e385 | |
Daniel Gultsch | d1fc90f981 | |
Daniel Gultsch | 336daea875 | |
Daniel Gultsch | a3e11415ec | |
Daniel Gultsch | 2eef37174e | |
Daniel Gultsch | 19c2ca520c | |
Daniel Gultsch | 82870b27ed | |
Daniel Gultsch | c416948f8b | |
Daniel Gultsch | 28ebf927fb | |
Daniel Gultsch | d2c5a939ed | |
Daniel Gultsch | edc6ce4ff2 | |
Daniel Gultsch | 7c0eae8059 | |
Stephen Paul Weber | ae84ff2f0c | |
Stephen Paul Weber | 000f59d614 | |
Stephen Paul Weber | bf5b2f73f5 | |
Daniel Gultsch | 31fd425c9a | |
Daniel Gultsch | 8850a1fbe3 | |
Stephen Paul Weber | ad36a4ba89 | |
Stephen Paul Weber | 56f8fff935 | |
Stephen Paul Weber | 1e335d527b | |
Stephen Paul Weber | fccce229c6 | |
Daniel Gultsch | 0569a1e769 | |
Daniel Gultsch | 39fdf4a333 | |
Daniel Gultsch | 6140861143 | |
Daniel Gultsch | 43521891f0 | |
Daniel Gultsch | ba98fe4f86 | |
Daniel Gultsch | a6c5430cdd | |
Daniel Gultsch | a47430c2f7 | |
Daniel Gultsch | 40005cec1b | |
Daniel Gultsch | 77c0fb0b2a | |
Daniel Gultsch | 3ff40a9733 | |
Daniel Gultsch | eacc7ed1e6 | |
Daniel Gultsch | 62a88a4db8 | |
Daniel Gultsch | 20f6a4704c | |
Daniel Gultsch | e71acdef29 | |
Daniel Gultsch | 0619685e55 | |
Daniel Gultsch | ba143a2730 | |
Daniel Gultsch | 0b239243d9 | |
Daniel Gultsch | 3acaec7bcd | |
Daniel Gultsch | a83365ee95 | |
Daniel Gultsch | 7b1efe15cd | |
Daniel Gultsch | 41ae4af1b8 | |
Daniel Gultsch | ad5bcb7d43 | |
Adithya Abraham Philip | a9a3ef0f67 | |
Adithya Abraham Philip | f64018d0a2 | |
Daniel Gultsch | ca7b397828 | |
Daniel Gultsch | 494a04ffb1 | |
Daniel Gultsch | d85854b686 | |
Daniel Gultsch | 943d0391d4 | |
Daniel Gultsch | c5743067ad | |
Daniel Gultsch | 635210d278 | |
Daniel Gultsch | 0dede0e1de | |
Daniel Gultsch | aa6955a0d6 | |
Daniel Gultsch | 12fd5c46ef | |
Daniel Gultsch | 3b3aa5b584 | |
Daniel Gultsch | 14428da108 | |
Daniel Gultsch | 571eb2f7f9 | |
Daniel Gultsch | 5f63c397fa | |
Dheeraj CVR | ffb49c7217 | |
Daniel Gultsch | 3e9fd0185a | |
Daniel Gultsch | da298cfe59 | |
Daniel Gultsch | 38c936b8ef | |
Sam Whited | a6b729df43 | |
Daniel Gultsch | d122d224bb | |
Daniel Gultsch | 64420f79e5 | |
Daniel Gultsch | 893751a1d2 | |
Daniel Gultsch | 5f1e30288a | |
Daniel Gultsch | 921d567dcb | |
Daniel Gultsch | da6076028f | |
Andreas Straub | 3bea5b25cd | |
Travis Burtrum | 217f6603c0 | |
Daniel Gultsch | 20ec9ff2c6 | |
Daniel Gultsch | a85bba0010 | |
Daniel Gultsch | 6af02b2cc5 | |
fiaxh | 000bec2c7b | |
Daniel Gultsch | 7f1de73784 | |
Daniel Gultsch | 07a5ccf4d7 | |
Daniel Gultsch | 4d38ba906f | |
Daniel Gultsch | 616241be11 | |
Daniel Gultsch | c296d6f446 | |
Andreas Straub | 41afd552e9 | |
Daniel Gultsch | 95db6db935 | |
Daniel Gultsch | 4ab8fe13de | |
Daniel Gultsch | 708d7c5b98 | |
Daniel Gultsch | 6acb80a83a | |
Daniel Gultsch | 9dce42ac7f | |
Daniel Gultsch | a3e136b550 | |
Daniel Gultsch | 0bb3ae37f0 | |
Daniel Gultsch | 5dd5685885 | |
Daniel Gultsch | c59eb75a59 | |
fiaxh | 62d0eebe5c | |
Daniel Gultsch | c3e2d2cfba | |
Daniel Gultsch | fb97f9d18f | |
Daniel Gultsch | abdb8bfb65 | |
Daniel Gultsch | 501034fe0e | |
Daniel Gultsch | fdb6b0e30d | |
Daniel Gultsch | f815a7cd26 | |
Daniel Gultsch | 95bf0630f0 | |
Daniel Gultsch | c116f735dc | |
Daniel Gultsch | a319446d41 | |
Daniel Gultsch | d875061407 | |
Daniel Gultsch | 73e2389eee | |
Andreas Straub | 58d213f291 | |
Daniel Gultsch | 42fb9539f8 | |
Daniel Gultsch | cfccf5e90d | |
Daniel Gultsch | 7bb67ee660 | |
Daniel Gultsch | 703d95fcf8 | |
Daniel Gultsch | c3bdec1ce9 | |
Daniel Gultsch | bcf99db3df | |
Daniel Gultsch | f49158a44b | |
Daniel Gultsch | be91c0741f | |
Daniel Gultsch | c40372fc0d | |
Daniel Gultsch | f46cbb38a9 | |
Daniel Gultsch | d0bad09f13 | |
Daniel Gultsch | 1867571368 | |
Daniel Gultsch | ae491764f2 | |
Daniel Gultsch | 534013fd0c | |
Daniel Gultsch | ade89beb96 | |
Daniel Gultsch | 15c8cb8ac6 | |
Daniel Gultsch | e8bf5cada4 | |
Daniel Gultsch | f05f97251c | |
Daniel Gultsch | 20b4e756fe | |
Daniel Gultsch | f510b2ba2d | |
Daniel Gultsch | 0f9058ffef | |
Daniel Gultsch | e10a0b0c4c | |
Daniel Gultsch | 43dd681239 | |
Daniel Gultsch | 85f36e9dbc | |
Daniel Gultsch | f6b22dad20 | |
Daniel Gultsch | 042939e44d | |
Daniel Gultsch | aa472a0098 | |
Daniel Gultsch | b0a314411f | |
Daniel Gultsch | 50817956c2 | |
Daniel Gultsch | 88523bbb50 | |
Daniel Gultsch | 5e4b55a0ff | |
Daniel Gultsch | 5e79e94e77 | |
Daniel Gultsch | a1ac4fd665 | |
Daniel Gultsch | b2c278c91b | |
Daniel Gultsch | 293e820a58 | |
Daniel Gultsch | 61b0681109 | |
Daniel Gultsch | 5ffb87059c | |
Daniel Gultsch | 4cae283cff | |
Daniel Gultsch | 15f220747f | |
Daniel Gultsch | 55c1129a65 | |
Daniel Gultsch | 2262921ff4 | |
Daniel Gultsch | ede92235d7 | |
Daniel Gultsch | 5bd70cfee8 | |
Daniel Gultsch | 5e151c7311 | |
Daniel Gultsch | 11e58607c9 | |
Daniel Gultsch | aea664a0ec | |
Daniel Gultsch | 1de74c2337 | |
Daniel Gultsch | b9fc7ebe24 | |
Daniel Gultsch | 312387d844 | |
Daniel Gultsch | ac06cb2e4f | |
Daniel Gultsch | 739648e909 | |
Daniel Gultsch | c3e8fb3446 | |
Daniel Gultsch | 739a2d609d | |
Daniel Gultsch | 164d341915 | |
Daniel Gultsch | 904edf5d59 | |
Daniel Gultsch | bd765c59ce | |
Daniel Gultsch | b7f326372d | |
Daniel Gultsch | 6358f641e7 | |
Daniel Gultsch | 72b781b845 | |
Daniel Gultsch | 41dcd8005b | |
Daniel Gultsch | cd9a29718b | |
Daniel Gultsch | 9d1e8a34b2 | |
Daniel Gultsch | 196c8e593f | |
Daniel Gultsch | 0664d6ac7b | |
Daniel Gultsch | 3e3cb047be | |
Daniel Gultsch | 242887447c | |
Daniel Gultsch | 6b592435cd | |
Daniel Gultsch | f1c0b7372f | |
fiaxh | e5f154316c | |
Daniel Gultsch | b60c902810 | |
Daniel Gultsch | 6f8f35031f | |
Daniel Gultsch | 3553b15c9f | |
Daniel Gultsch | aa21797f43 | |
Daniel Gultsch | 0eaf7669f7 | |
Sam Whited | a3eb540f05 | |
Daniel Gultsch | 025cbf7d44 | |
Daniel Gultsch | 02c6793ca9 | |
Philip Flohr | 0329c9c738 | |
Daniel Gultsch | 8455e5b5dd | |
Sam Whited | e1aeb376ac | |
Daniel Gultsch | dc8967d8fc | |
Daniel Gultsch | 65b5504e68 | |
Daniel Gultsch | 2cd43f7042 | |
Daniel Gultsch | d42c82abf2 | |
Daniel Gultsch | 2225b0b6d5 | |
Daniel Gultsch | b4a259837e | |
Daniel Gultsch | 8ffcc11f27 | |
Daniel Gultsch | ebccb67a72 | |
Daniel Gultsch | f0b1761ec3 | |
Daniel Gultsch | 06cadab7cc | |
Daniel Gultsch | aeba964a65 | |
Daniel Gultsch | 60211a315e | |
Daniel Gultsch | 23ef1c660a | |
Daniel Gultsch | fd6ed5b989 | |
Daniel Gultsch | 26ec6f7782 | |
Daniel Gultsch | 84120a341a | |
Daniel Gultsch | 210de7d781 | |
Daniel Gultsch | ecb4615f2a | |
Daniel Gultsch | a557d38e4d | |
Daniel Gultsch | 8228e82f51 | |
Daniel Gultsch | fbb7cb99f7 | |
Daniel Gultsch | 8a1c4fe69e | |
fiaxh | 2c1f7e115c | |
fiaxh | 724ca8c9a9 | |
fiaxh | c7a519498a | |
fiaxh | fac1d4e0bd | |
Andreas Straub | c6e54e7e5a | |
Daniel Gultsch | 8471fbd9b7 | |
Daniel Gultsch | fb9ba0a734 | |
Daniel Gultsch | baf76d883c | |
Daniel Gultsch | bca29cf7fd | |
Daniel Gultsch | b9de159e97 | |
Daniel Gultsch | 34bcc59f72 | |
Daniel Gultsch | 6a458b853c | |
Daniel Gultsch | 1ec3d86eb7 | |
Daniel Gultsch | 8553d5a563 | |
Daniel Gultsch | ef7857ac8d | |
Daniel Gultsch | c7ff196f58 | |
Daniel Gultsch | 7410e2023a | |
Daniel Gultsch | 1221cff561 | |
Daniel Gultsch | a7fd629c05 | |
fiaxh | 016a57f123 | |
fiaxh | 29a849cb92 | |
Daniel Gultsch | d65273ce39 | |
Sam Whited | e747ecef4d | |
Daniel Gultsch | ec473a4437 | |
saqura | 48f172fc9e | |
Daniel Gultsch | d4877177b7 | |
Daniel Gultsch | 56afdcc94a | |
saqura | 1f2b2c8834 | |
Daniel Gultsch | 1bd68a42b2 | |
Daniel Gultsch | 3c45f00443 | |
Daniel Gultsch | d56214f096 | |
Daniel Gultsch | f4a33a007c | |
Daniel Gultsch | 569b9f4e66 | |
Daniel Gultsch | 53125dbccc | |
Daniel Gultsch | 9b07059b6e | |
Daniel Gultsch | efab290c28 | |
Daniel Gultsch | adca670196 | |
Daniel Gultsch | 0bd4105b1d | |
Daniel Gultsch | be38b1e5f4 | |
Daniel Gultsch | e956c7b2a2 | |
Daniel Gultsch | 3c6c424d31 | |
Daniel Gultsch | 0f405c2e11 | |
Daniel Gultsch | e9e31b1c9b | |
Daniel Gultsch | a83aae341f | |
Daniel Gultsch | cfeb67d71d | |
Daniel Gultsch | fb7359e6a3 | |
Daniel Gultsch | c1716a35e3 | |
Daniel Gultsch | fc96dcaa4d | |
Daniel Gultsch | 5b271e1ed8 | |
Daniel Gultsch | e75c2cd731 | |
Daniel Gultsch | 1738673c53 | |
Daniel Gultsch | 4b93351f8f | |
Daniel Gultsch | 30dbf97a1c | |
Daniel Gultsch | 5f9476448f | |
Daniel Gultsch | 0587ba2ad2 | |
Daniel Gultsch | beca748634 | |
Daniel Gultsch | 76828950ee | |
Daniel Gultsch | 8b44400940 | |
Safwat Halaby | b5e7e528eb | |
Daniel Gultsch | f24649c819 | |
Daniel Gultsch | 212d1a8c91 | |
Daniel Gultsch | 933538a39d | |
Daniel Gultsch | b519411d34 | |
Daniel Gultsch | 7be331bbb2 | |
Daniel Gultsch | 09816b61df | |
Andreas Straub | fdd88aa530 | |
Andreas Straub | a7c7a42136 | |
Daniel Gultsch | da31582911 | |
Daniel Gultsch | 540f6510de | |
Daniel Gultsch | 9e1393bc1c | |
Armin Novak | 6a6cb43b17 | |
Daniel Gultsch | ca1fe61f09 | |
Safwat Halaby | 0407111416 | |
Andreas Straub | 2b1286585b | |
Safwat Halaby | 0cfc1a738e | |
Daniel Gultsch | 4d6e5a8b08 | |
Safwat Halaby | 08174e3b05 | |
Daniel Gultsch | b23cb5a9e4 | |
Daniel Gultsch | ef605e4cbd | |
Daniel Gultsch | e65068d226 | |
Daniel Gultsch | f81e44d339 | |
Daniel Gultsch | 52a5e72b02 | |
Daniel Gultsch | 043e19dd65 | |
Daniel Gultsch | 8f066d00e0 | |
saqura | fd61d67dab | |
saqura | 05d0c9f4fe | |
saqura | 403db3b080 | |
Daniel Gultsch | 32abc76689 | |
Daniel Gultsch | 1d2a24c9c0 | |
Daniel Gultsch | e6af502055 | |
Daniel Gultsch | 89edd83609 | |
Daniel Gultsch | 160dfa49a0 | |
Daniel Gultsch | 9bb8683048 | |
Daniel Gultsch | 4b62bd256d | |
Daniel Gultsch | 2b9b700c96 | |
Daniel Gultsch | 6a0b9971aa | |
Daniel Gultsch | f2ccf073bd | |
Daniel Gultsch | 9dcf074a79 | |
Daniel Gultsch | 648e29db2c | |
Daniel Gultsch | 64dbb069ab | |
Daniel Gultsch | 5fb77a9739 | |
Daniel Gultsch | 8881b71079 | |
Daniel Gultsch | f4d6b676e9 | |
Daniel Gultsch | bbbc30e823 | |
Daniel Gultsch | 5a5e0e7121 | |
Daniel Gultsch | 8d90b3fbf1 | |
Daniel Gultsch | 6f7fb7dec6 | |
fiaxh | a3a13dd9dc | |
fiaxh | 024e697cee | |
Daniel Gultsch | 9636627ef0 | |
Daniel Gultsch | a954e32b16 | |
Daniel Gultsch | 069ddddbc1 | |
Daniel Gultsch | efc8fc5353 | |
Daniel Gultsch | 7453f2ca9a | |
Michael | 8f69017d5a | |
Daniel Gultsch | b54b4ca78a | |
Daniel Gultsch | 506b83ddc6 | |
Daniel Gultsch | c173d78950 | |
Daniel Gultsch | 07c7f5bc08 | |
Daniel Gultsch | 7e712d9d4c | |
Daniel Gultsch | b1b13ba0e5 | |
Daniel Gultsch | 4a4ced1e69 | |
Daniel Gultsch | b9002d7fd5 | |
Daniel Gultsch | b5719fd747 | |
Daniel Gultsch | 183dad281c | |
Daniel Gultsch | 999d65c187 | |
Sergey Spivak | 7e06065df2 | |
Daniel Gultsch | 8d13a77bc6 | |
Daniel Gultsch | 96575d6290 | |
Daniel Gultsch | add4302385 | |
Daniel Gultsch | 4220fa948b | |
Daniel Gultsch | bd986834fc | |
Daniel Gultsch | 15d1623ec6 | |
Daniel Gultsch | 811e2eaeec | |
Daniel Gultsch | cf62fb5605 | |
Daniel Gultsch | 650abf1c52 | |
Daniel Gultsch | 6bb9983d58 | |
Daniel Gultsch | 6308dcfdd4 | |
Daniel Gultsch | 88cdd03f0f | |
Daniel Gultsch | bf64276fa7 | |
Daniel Gultsch | eff173ebc2 | |
Andreas Straub | a95c451f1e | |
Andreas Straub | 2bb033267b | |
Daniel Gultsch | 2c4a6b0912 | |
Andreas Straub | e2d506c96a | |
Daniel Gultsch | a32a577e36 | |
Daniel Gultsch | 7eb228d1a5 | |
Daniel Gultsch | 1848b46195 | |
Daniel Gultsch | 9baa87e5c9 | |
Daniel Gultsch | 204cee4a17 | |
Andreas Straub | b265341848 | |
Daniel Gultsch | fc594e249a | |
Daniel Gultsch | 91b0605bc2 | |
Daniel Gultsch | 74cf8320bc | |
Daniel Gultsch | aaf3ecaf41 | |
Daniel Gultsch | ca262d3523 | |
Daniel Gultsch | b0c19d6bac | |
Daniel Gultsch | 8f4b7686c9 | |
Daniel Gultsch | 3db7087658 | |
Daniel Gultsch | 9a56e1620b | |
Daniel Gultsch | bc9f6d91ac | |
Daniel Gultsch | 384c441990 | |
Daniel Gultsch | 5298f4e2aa | |
Daniel Gultsch | cb70df7a34 | |
Daniel Gultsch | eff9e417e0 | |
Daniel Gultsch | 593f5cdcbe | |
Daniel Gultsch | c5abddc584 | |
Andreas Straub | 1156ccbce2 | |
Daniel Gultsch | cd451856b2 | |
Andreas Straub | c4a548ada0 | |
Daniel Gultsch | f6b7a25e29 | |
Daniel Gultsch | ea2ce78d6e | |
Daniel Gultsch | 3e0636367a | |
Daniel Gultsch | 4424a818df | |
Andreas Straub | 0eeaccd974 | |
Daniel Gultsch | 05d3015421 | |
Andreas Straub | 25a9d59412 | |
Andreas Straub | eafcf38ec9 | |
Daniel Gultsch | 11b9fc3191 | |
Daniel Gultsch | 04e21660b6 | |
Michael | ae9de26f59 | |
Andreas Straub | b84fecf51a | |
Daniel Gultsch | 5eae1e52d2 | |
Michael | 61c0f8adb0 | |
Daniel Gultsch | 25c49d5e34 | |
Daniel Gultsch | 7617a19280 | |
Daniel Gultsch | 476db24c10 | |
Daniel Gultsch | dd20f41f1b | |
Michael | a898d9d5f7 | |
Daniel Gultsch | 919c3a47be | |
Michael | 3552b96c8a | |
Daniel Gultsch | 4f87413b16 | |
Daniel Gultsch | 120810b9ca | |
Daniel Gultsch | 3da90638c6 | |
Daniel Gultsch | f6374f466b | |
Daniel Gultsch | 98e7d9c74e | |
Daniel Gultsch | 730a5c644b | |
Daniel Gultsch | 865e08401b | |
Daniel Gultsch | fb0b4bb445 | |
Daniel Gultsch | d36ae091b6 | |
Daniel Gultsch | d0b8bd0f8a | |
Michael | 97c28b13a6 | |
Michael | 4cc48f01df | |
Michael | 5f0ed62833 | |
Daniel Gultsch | deb9c20e5e | |
Daniel Gultsch | 5a53ff80fb | |
Daniel Gultsch | c19adebaf0 | |
Daniel Gultsch | 91a3cee6d2 | |
Daniel Gultsch | 8043833156 | |
Daniel Gultsch | 412efe93c0 | |
Daniel Gultsch | b1f1a99190 | |
Daniel Gultsch | 7bd0f31244 | |
Daniel Gultsch | 0dfb9bd1a0 | |
Daniel Gultsch | 777dd4b51e | |
Daniel Gultsch | bbfd98b726 | |
Daniel Gultsch | d51c4b9655 | |
Daniel Gultsch | b0710cdf04 | |
Daniel Gultsch | bea7b2bcc1 | |
Daniel Gultsch | 560e63564d | |
Michael | 10a9bd3864 | |
Daniel Gultsch | 96c6c793b3 | |
Andreas Straub | e1dc7f990d | |
Michael | c0502c2165 | |
Daniel Gultsch | 3d6fb9b21d | |
Daniel Gultsch | 1688b65965 | |
Daniel Gultsch | 496f531e2e | |
Daniel Gultsch | 06fffc13cd | |
Daniel Gultsch | 7c822c9b75 | |
Daniel Gultsch | 9e26375d2f | |
Daniel Gultsch | c9b2638778 | |
Daniel Gultsch | 52f0622dd3 | |
Daniel Gultsch | dafcee6a5b | |
Daniel Gultsch | 6e1870b00a | |
Daniel Gultsch | 9ebd6d503c | |
Daniel Gultsch | 9edcca1045 | |
Daniel Gultsch | 569bc435d3 | |
Daniel Gultsch | 5b1dda9148 | |
Daniel Gultsch | d7b3060fc8 | |
Daniel Gultsch | 51a2645349 | |
Daniel Gultsch | c082066118 | |
Daniel Gultsch | e8e0eccd82 | |
Daniel Gultsch | 5501502e89 | |
Daniel Gultsch | 11fbc3d79e | |
Daniel Gultsch | ecac1e5943 | |
Andreas Straub | 6aec49f06d | |
Andreas Straub | 45d68c200e | |
Daniel Gultsch | 83e1e6468e | |
Daniel Gultsch | 1f34fb742c | |
Daniel Gultsch | 32826ec29d | |
Daniel Gultsch | 75bafd573e | |
hlad | 4539643f27 | |
Daniel Gultsch | 81b7e27a46 | |
Daniel Gultsch | dad90762b4 | |
Daniel Gultsch | 3677c6ec98 | |
Daniel Gultsch | c0dcf4a55a | |
Daniel Gultsch | fd81491b05 | |
Daniel Gultsch | d30515a85a | |
Daniel Gultsch | b5e90850d8 | |
Daniel Gultsch | d2ded8ad50 | |
fiaxh | e8bcd39166 | |
Daniel Gultsch | b7f00ddac3 | |
Daniel Gultsch | a6e00837af | |
Daniel Gultsch | 8b9b74ff7e | |
Daniel Gultsch | efdf3b6c1c | |
Daniel Gultsch | cac577fa4e | |
Andreas Straub | 7437d0fe0c | |
Daniel Gultsch | 53ce5d223e | |
Daniel Gultsch | 6694af8fca | |
Daniel Gultsch | 5c0853f302 | |
Andreas Straub | 34b22dea48 | |
Daniel Gultsch | a1c43d8fdf | |
Daniel Gultsch | e10e9942de | |
Daniel Gultsch | c617cf6ef8 | |
Daniel Gultsch | 9b91d0bf75 | |
Daniel Gultsch | edd2ead7b4 | |
Daniel Gultsch | 6c69e17eef | |
Daniel Gultsch | 3b440b5a9b | |
Daniel Gultsch | a6bbe4d4ce | |
Daniel Gultsch | 2bf30bb296 | |
Daniel Gultsch | 5529337da3 | |
Daniel Gultsch | f9dec7cf86 | |
Andreas Straub | 6cd9383e53 | |
Daniel Gultsch | 60cd307f73 | |
Andreas Straub | 6059b96456 | |
Andreas Straub | 909f761ca1 | |
Andreas Straub | 50b14434ee | |
Andreas Straub | 5c421da1e1 | |
Daniel Gultsch | 26ac7c9030 | |
Daniel Gultsch | 658919f239 | |
Daniel Gultsch | 5191e4ce95 | |
Andreas Straub | 74ab36fda2 | |
Daniel Gultsch | 1ed550b5c5 | |
Daniel Gultsch | 58d80f58be | |
Andreas Straub | b7c64cd19d | |
Andreas Straub | 2b3bb02261 | |
Andreas Straub | e07853ea62 | |
Andreas Straub | e6df4d81d2 | |
Andreas Straub | e10a6c5b87 | |
Andreas Straub | 77920c7aa6 | |
Andreas Straub | a3991d59c9 | |
Andreas Straub | efcefc2e63 | |
Daniel Gultsch | d9bdce0104 | |
Daniel Gultsch | 17bc4fb6cd | |
Daniel Gultsch | 8f14d2bfbd | |
Daniel Gultsch | 8924c448d1 | |
Daniel Gultsch | 6b8e1ecb95 | |
Daniel Gultsch | 36d31e7e24 | |
Daniel Gultsch | ff0c114cd6 | |
Daniel Gultsch | 9c94c9ad8f | |
Daniel Gultsch | e5fae429fa | |
Daniel Gultsch | c32162c280 | |
Daniel Gultsch | cd204d5931 | |
Daniel Gultsch | f7634a85be | |
Andreas Straub | db05d26433 | |
Daniel Gultsch | 9c1c86ed44 | |
Daniel Gultsch | 63206e6d4a | |
Daniel Gultsch | a1e63944a2 | |
Andreas Straub | c2813cea29 | |
Andreas Straub | 4c1c2892c7 | |
Daniel Gultsch | 456d4c8b23 | |
Daniel Gultsch | 4a051b65d1 | |
Daniel Gultsch | d38228f482 | |
Daniel Gultsch | f076b4b5c8 | |
Daniel Gultsch | f6281a182d | |
Daniel Gultsch | 0d679a7abb | |
Andreas Straub | 92b5081b5e | |
Andreas Straub | 3c5c0c7d3b | |
Daniel Gultsch | 1aeb5874b0 | |
Daniel Gultsch | 31cb742bbf | |
Daniel Gultsch | 40499be9b6 | |
Daniel Gultsch | 32f90613a3 | |
Daniel Gultsch | ffa588ba3e | |
Daniel Gultsch | af76ad0144 | |
Daniel Gultsch | 394486b300 | |
Daniel Gultsch | f1ee5cccf0 | |
Daniel Gultsch | 96f38324f8 | |
Daniel Gultsch | 5c2720efd0 | |
Daniel Gultsch | 37cbdb8b4e | |
Daniel Gultsch | 086653b649 | |
Daniel Gultsch | 87bc9d3a31 | |
Daniel Gultsch | a5027104fd | |
Daniel Gultsch | f74ee765a2 | |
Daniel Gultsch | 74e05023b4 | |
Andreas Straub | b7ff2c3461 | |
Andreas Straub | 639ebd644b | |
Andreas Straub | 122bc97ce2 | |
Andreas Straub | 971aa3a11e | |
Andreas Straub | d2845e9ac1 | |
Andreas Straub | 8be0e8a27d | |
Andreas Straub | 4ee3f330f5 | |
Andreas Straub | ab2d114bbc | |
Andreas Straub | 0ee64124fe | |
Daniel Gultsch | 5ab0d5d1c1 | |
Daniel Gultsch | e79f82ca72 | |
Daniel Gultsch | dcf9117451 | |
Raphael Pohl | e6cb12dfe4 | |
Daniel Gultsch | 504ef0b72e | |
Daniel Gultsch | 75a1cfe337 | |
Daniel Gultsch | 8559ca05ab | |
Andreas Straub | d0c99aaedc | |
Andreas Straub | aaa8fe8978 | |
Andreas Straub | 19a0ae42d6 | |
Andreas Straub | 012f036840 | |
Daniel Gultsch | 9c91b9036a | |
Andreas Straub | 576330f6a9 | |
Andreas Straub | e9d7d7e12a | |
Daniel Gultsch | 2d2da11bfa | |
Andreas Straub | dd964077b9 | |
Daniel Gultsch | 857161076e | |
Andreas Straub | 2240066bbe | |
Sam Whited | eea8c28612 | |
Andreas Straub | 480b1cde81 | |
Andreas Straub | 14010bf5a6 | |
Andreas Straub | ec0aff4ed7 | |
Andreas Straub | 6f67469bda | |
Andreas Straub | 9c4d55f82c | |
Andreas Straub | 2045a71262 | |
Andreas Straub | 43703870e8 | |
Andreas Straub | 4038af2f47 | |
Andreas Straub | e8ec2ee628 | |
Sam Whited | fca0c36757 | |
Sam Whited | 3ab59c93a6 | |
Andreas Straub | 6c38e53128 | |
Andreas Straub | 9e8d9a6401 | |
Andreas Straub | 3d33946088 | |
Andreas Straub | 35714d3d08 | |
Andreas Straub | 31d375c2c3 | |
Andreas Straub | 160e4017df | |
Andreas Straub | 461d0446f7 | |
Andreas Straub | 23a4e1e6fa | |
Andreas Straub | d173913eba | |
Andreas Straub | 7f918542c8 | |
Andreas Straub | 03614a0262 | |
Andreas Straub | 2628662a7f | |
Andreas Straub | f1d73b9d4e | |
Andreas Straub | 540faeb54b | |
Andreas Straub | bd29653a20 | |
Andreas Straub | 3458f5bb91 | |
Andreas Straub | 7049904c32 | |
Christian S | 37b214a8a8 | |
Andreas Straub | 968410ae33 | |
Andreas Straub | 7a962e5180 | |
Andreas Straub | 8fd46d40d6 | |
Andreas Straub | 491f623708 | |
Andreas Straub | 0cf64857cf | |
Andreas Straub | 6867b5c3ab | |
Andreas Straub | 25450bf6d3 | |
Andreas Straub | bf4185ac08 | |
Andreas Straub | 69600502d2 | |
Andreas Straub | ec6870307e | |
Andreas Straub | 18c1e15d00 | |
Andreas Straub | 9a0232f7e7 | |
Andreas Straub | 992cf5652e | |
Andreas Straub | 1b0596d574 | |
Andreas Straub | 3815d4efa3 | |
Andreas Straub | cb7980c65e | |
Andreas Straub | c1d23b2395 | |
Andreas Straub | 6492801b89 | |
Andreas Straub | 74026b742b | |
Andreas Straub | 9e07fc5651 | |
Andreas Straub | 299bbdf27f | |
Andreas Straub | 065519d3f3 | |
Andreas Straub | 77619b55e4 | |
Andreas Straub | f73aa1a200 | |
Andreas Straub | 077932eb55 | |
Andreas Straub | b8048a5538 | |
Daniel Gultsch | c4f3e5be3f | |
Daniel Gultsch | 9b70c7e68c | |
Daniel Gultsch | 5c017e5186 | |
Daniel Gultsch | 0166ced46c | |
Daniel Gultsch | f58b2afcaa | |
Daniel Gultsch | 731e1dcd43 | |
Daniel Gultsch | 451345f8ed | |
Daniel Gultsch | 15b880f3a1 | |
Daniel Gultsch | ce527c8b76 | |
Daniel Gultsch | aa1b9de20c | |
Daniel Gultsch | c3584a6db7 | |
Daniel Gultsch | 13cce172ab | |
Daniel Gultsch | 1f43115544 | |
Daniel Gultsch | 4f62793a67 | |
Daniel Gultsch | 425f0479a8 | |
Daniel Gultsch | 6a329c7465 | |
Daniel Gultsch | babbd389f6 | |
Daniel Gultsch | a31ab555b8 | |
Daniel Gultsch | 7bd66549d8 | |
Daniel Gultsch | b477b8f57b | |
Daniel Gultsch | 43fb216e72 | |
Christian S. | 73e703e5d4 | |
Daniel Gultsch | 3190f114e7 | |
Daniel Gultsch | 1a36d21023 | |
Christian S. | 612e8bd794 | |
David Manouchehri | 34aff6f8cf | |
Daniel Gultsch | 2fa9af735b | |
Daniel Gultsch | b525b42e59 | |
Daniel Gultsch | ffffca10f0 | |
Daniel Gultsch | 84bfe8c721 | |
Daniel Gultsch | 558d065d48 | |
Daniel Gultsch | 58bc4cba06 | |
Daniel Gultsch | 4274fe90ac | |
Daniel Gultsch | 5dd83a5fe6 | |
Daniel Gultsch | c4876fab1b | |
Daniel Gultsch | ee3d15765d | |
Daniel Gultsch | 81af16fb6c | |
Daniel Gultsch | b73901c3ae | |
Daniel Gultsch | fce613e4a6 | |
Daniel Gultsch | 78aff1329f | |
Daniel Gultsch | ce79f4bbe3 | |
Daniel Gultsch | 925801c14e | |
Daniel Gultsch | 0f5c87ca1f | |
Daniel Gultsch | b02ef0c62f | |
Daniel Gultsch | 492e387482 | |
Daniel Gultsch | 7eac30d1f4 | |
Daniel Gultsch | 26044ca229 | |
Daniel Gultsch | ef1429c9a6 | |
Daniel Gultsch | bef731a3c8 | |
Daniel Gultsch | f8f5bcb2ae | |
Daniel Gultsch | 148955a713 | |
Daniel Gultsch | a2bab9c564 | |
Daniel Gultsch | 097bdf1a3e | |
Daniel Gultsch | 96fe75fe9f | |
Daniel Gultsch | 2fbeb0bbb2 | |
Daniel Gultsch | d30fb6f0a1 | |
Daniel Gultsch | 1c86098f3b | |
Daniel Gultsch | c745fbb562 | |
Daniel Gultsch | e4d1bd415d | |
Daniel Gultsch | f5ba9d4223 | |
Daniel Gultsch | a2525346f4 | |
Daniel Gultsch | c20a088ea8 | |
Daniel Gultsch | ed88b634fc | |
Daniel Gultsch | c36238141d | |
Daniel Gultsch | 9190e03076 | |
Daniel Gultsch | aca9d8036c | |
Daniel Gultsch | 6af97c724c | |
Daniel Gultsch | d7de311379 | |
Daniel Gultsch | 5b42b392a1 | |
Daniel Gultsch | a2a1f1e084 | |
Daniel Gultsch | 0030bbf472 | |
Daniel Gultsch | fdd46f1c91 | |
Daniel Gultsch | 82714dedfe | |
Daniel Gultsch | 7e11570f2c | |
Daniel Gultsch | 9eb9a52205 |
|
@ -0,0 +1,11 @@
|
|||
### Reporting Bugs and getting help
|
||||
|
||||
The issue tracker on Github is for bug reports only. It is not a general support forum.
|
||||
|
||||
**A bug is everything you can reproduce. ie *if I do this that happens but something else should happen instead*.**
|
||||
|
||||
Please search the issue tracker (including closed issues). Your bug might be a server bug that has already been addressed.
|
||||
|
||||
Please fill in the template when creating new issues and provide information about your device and your server. The [adb logcat](https://wiki.cyanogenmod.org/w/Doc:_debugging_with_logcat) can be omitted if you can reproduce the bug under every condition. (ie *click button X and the application crashes*) But the adb logcat is required if the bug happens only under certain conditions or involves network problem (Server not found, messages not arriving)
|
||||
|
||||
**If you are seeking help or are unable to reproduce the exact problem please join our MUC at conversations@conference.siacs.eu**
|
|
@ -0,0 +1,30 @@
|
|||
#### General information
|
||||
|
||||
* **Version:** eg 1.12.2
|
||||
* **Device:** eg Google Nexus 5
|
||||
* **Android Version:** eg Android 6.0 Stock or Android 5.1 Cyanogenmod
|
||||
* **Server name:** eg conversations.im, jabber.at or self hosted
|
||||
* **Server software:** ejabberd 16.04 or prosody 0.10 (if known)
|
||||
* **Installed server modules:** eg Stream Managment, CSI, MAM
|
||||
* **Conversations source:** eg PlayStore, PlayStore Beta Channel, F-Droid, self build (latest HEAD)
|
||||
|
||||
|
||||
#### Steps to reproduce
|
||||
|
||||
1. …
|
||||
2. …
|
||||
|
||||
|
||||
#### Expected result
|
||||
|
||||
What is the expected output? What do you see instead?
|
||||
|
||||
|
||||
#### Debug output
|
||||
|
||||
Please post the output of adb logcat. The log should begin with the start of Conversations and include all the
|
||||
steps it takes to reproduce the problem.
|
||||
|
||||
````
|
||||
adb logcat -s conversations
|
||||
````
|
|
@ -2,9 +2,13 @@
|
|||
*.swp
|
||||
.settings
|
||||
|
||||
src/playstore/res/values/gcm.xml
|
||||
|
||||
# https://github.com/github/gitignore/blob/master/Gradle.gitignore
|
||||
.gradle/
|
||||
build/
|
||||
captures/
|
||||
gradle.properties
|
||||
# Ignore Gradle GUI config
|
||||
gradle-app.setting
|
||||
|
||||
|
|
14
.travis.yml
|
@ -1,10 +1,16 @@
|
|||
language: android
|
||||
jdk:
|
||||
- oraclejdk8
|
||||
android:
|
||||
components:
|
||||
- platform-tools
|
||||
- tools
|
||||
- build-tools-22.0.1
|
||||
- build-tools-21.1.2
|
||||
- build-tools-19.1.0
|
||||
- android-22
|
||||
- build-tools-26.0.1
|
||||
- android-25
|
||||
- extra-android-m2repository
|
||||
- extra-google-m2repository
|
||||
- extra-google-google_play_services
|
||||
licenses:
|
||||
- '.+'
|
||||
script:
|
||||
- ./gradlew assembleFreeRelease
|
||||
|
|
472
CHANGELOG.md
|
@ -1,13 +1,403 @@
|
|||
###Changelog
|
||||
# Changelog
|
||||
|
||||
####Version 1.4.0
|
||||
### Version 1.20.0
|
||||
* presence subscription no longer required for OMEMO on compatible servers
|
||||
* display emoji-only messages slightly larger
|
||||
|
||||
### Version 1.19.5
|
||||
* fixed connection loop on Android <4.4
|
||||
|
||||
### Version 1.19.4
|
||||
* work around for OpensFire’s self signed certs
|
||||
* use VPN’s DNS servers first
|
||||
|
||||
### Version 1.19.3
|
||||
* Do not create foreground service when all accounts are disabled
|
||||
* bug fixes
|
||||
|
||||
### Version 1.19.2
|
||||
* bug fixes
|
||||
|
||||
### Version 1.19.1
|
||||
* Made DNSSEC hostname validation opt-in
|
||||
|
||||
### Version 1.19.0
|
||||
* Added 'App Shortcuts' to quickly access frequent contacts
|
||||
* Use DNSSEC to verify hostname instead of domain in certificate
|
||||
* Setting to enable Heads-up notifications
|
||||
* Added date separators in message view
|
||||
|
||||
### Version 1.18.5
|
||||
* colorize send button only after history is caught up
|
||||
* improved MAM catchup strategy
|
||||
|
||||
### Version 1.18.4
|
||||
* fixed UI freezes during connection timeout
|
||||
* fixed notification sound playing twice
|
||||
* fixed conversations being marked as read
|
||||
* removed 'copy text' in favor of 'select text' and 'share with'
|
||||
|
||||
### Version 1.18.3
|
||||
* limited GPG encryption for MUC offline members
|
||||
|
||||
### Version 1.18.2
|
||||
* added support for Android Auto
|
||||
* fixed HTTP Download over Tor
|
||||
* work around for nimbuzz.com MUCs
|
||||
|
||||
### Version 1.18.1
|
||||
* bug fixes
|
||||
|
||||
### Version 1.18.0
|
||||
* Conversations <1.16.0 will be unable to receive OMEMO encrypted messages
|
||||
* OMEMO: put auth tag into key (verify auth tag as well)
|
||||
* offer to block entire domain in message from stranger snackbar
|
||||
* treat URL as file if URL is in oob or contains key
|
||||
|
||||
### Version 1.17.1
|
||||
* Switch Aztec to QR for faster scans
|
||||
* Fixed unread counter for image messages
|
||||
|
||||
### Version 1.17.0
|
||||
* Do not notify for messages from strangers by default
|
||||
* Blocking a JID closes the corresponding conversation
|
||||
* Show message sender in conversation overview
|
||||
* Show unread counter for every conversation
|
||||
* Send typing notifications in private, non-anonymous MUCs
|
||||
* Support for the latest MAM namespace
|
||||
* Icons for attach menu
|
||||
|
||||
### Version 1.16.2
|
||||
* change mam catchup strategie. support mam:1
|
||||
* bug fixes
|
||||
|
||||
|
||||
### Version 1.16.1
|
||||
* UI performance fixes
|
||||
* bug fixes
|
||||
|
||||
### Version 1.16.0
|
||||
* configurable client side message retention period
|
||||
* compress videos before sending them
|
||||
|
||||
### Version 1.15.5
|
||||
* show nick as bold text when mentioned in conference
|
||||
* bug fixes
|
||||
|
||||
### Version 1.15.4
|
||||
* bug fixes
|
||||
|
||||
### Version 1.15.3
|
||||
* show offline contacts in MUC as grayed-out
|
||||
* don't transcode gifs. add overlay indication to gifs
|
||||
* bug fixes
|
||||
|
||||
### Version 1.15.2
|
||||
* bug fixes
|
||||
|
||||
### Version 1.15.1
|
||||
* support for POSH (RFC7711)
|
||||
* support for quoting messages (via select text)
|
||||
* verified messages show shield icon. unverified messages show lock
|
||||
|
||||
### Version 1.15.0
|
||||
* New [Blind Trust Before Verification](https://gultsch.de/trust.html) mode
|
||||
* Easily share Barcode and XMPP uri from Account details
|
||||
* Automatically deactivate own devices after 7 day of inactivity
|
||||
* Improvements fo doze/push mode
|
||||
* bug fixes
|
||||
|
||||
### Version 1.14.9
|
||||
* warn in account details when data saver is enabled
|
||||
* automatically enable foreground service after detecting frequent restarts
|
||||
* bug fixes
|
||||
|
||||
### Version 1.14.8
|
||||
* bug fixes
|
||||
|
||||
### Version 1.14.7
|
||||
* error message accessible via context menu for failed messages
|
||||
* don't include pgp signature in anonymous mucs
|
||||
* bug fixes
|
||||
|
||||
### Version 1.14.6
|
||||
* make error notification dismissable
|
||||
* bug fixes
|
||||
|
||||
|
||||
### Version 1.14.5
|
||||
* expert setting to delete OMEMO identities
|
||||
* bug fixes
|
||||
|
||||
### Version 1.14.4
|
||||
* bug fixes
|
||||
|
||||
### Version 1.14.3
|
||||
* XEP-0377: Spam Reporting
|
||||
* fix rare start up crashes
|
||||
|
||||
### Version 1.14.2
|
||||
* support ANONYMOUS SASL
|
||||
* bug fixes
|
||||
|
||||
### Version 1.14.1
|
||||
* Press lock icon to see why OMEMO is deactivated
|
||||
* bug fixes
|
||||
|
||||
### Version 1.14.0
|
||||
* Improvments for N
|
||||
* Quick Reply to Notifications on N
|
||||
* Don't download avatars and files when data saver is on
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.9
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.8
|
||||
* show identities instead of resources in selection dialog
|
||||
* allow TLS direct connect when port is set to 5223
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.7
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.6
|
||||
* thumbnails for videos
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.5
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.4
|
||||
* support jingle ft:4
|
||||
* show contact as DND if one resource is
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.3
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.2
|
||||
* new PGP decryption logic
|
||||
* bug fixes
|
||||
|
||||
### Version 1.13.1
|
||||
* changed some colors in dark theme
|
||||
* fixed fall-back message for OMEMO
|
||||
|
||||
### Version 1.13.0
|
||||
* configurable dark theme
|
||||
* opt-in to share Last User Interaction
|
||||
|
||||
### Version 1.12.9
|
||||
* make grace period configurable
|
||||
|
||||
### Version 1.12.8
|
||||
* more bug fixes :-(
|
||||
|
||||
### Version 1.12.7
|
||||
* bug fixes
|
||||
|
||||
### Version 1.12.6
|
||||
* bug fixes
|
||||
|
||||
### Version 1.12.5
|
||||
* new create conference dialog
|
||||
* show first unread message on top
|
||||
* show geo uri as links
|
||||
* circumvent long message DOS
|
||||
|
||||
### Version 1.12.4
|
||||
* show offline members in conference (needs server support)
|
||||
* various bug fixes
|
||||
|
||||
### Version 1.12.3
|
||||
* make omemo default when all resources support it
|
||||
* show presence of other resources as template
|
||||
* start typing in StartConversationsActivity to search
|
||||
* various bug fixes and improvements
|
||||
|
||||
### Version 1.12.2
|
||||
* fixed pgp presence signing
|
||||
|
||||
### Version 1.12.1
|
||||
* small bug fixes
|
||||
|
||||
### Version 1.12.0
|
||||
* new welcome screen that makes it easier to register account
|
||||
* expert setting to modify presence
|
||||
|
||||
### Version 1.11.7
|
||||
* Share xmpp uri from conference details
|
||||
* add setting to allow quick sharing
|
||||
* various bug fixes
|
||||
|
||||
### Version 1.11.6
|
||||
* added preference to disable notification light
|
||||
* various bug fixes
|
||||
|
||||
### Version 1.11.5
|
||||
* check file ownership to not accidentally share private files
|
||||
|
||||
### Version 1.11.4
|
||||
* fixed a bug where contacts are shown as offline
|
||||
* improved broken PEP detection
|
||||
|
||||
### Version 1.11.3
|
||||
* check maximum file size when using HTTP Upload
|
||||
* properly calculate caps hash
|
||||
|
||||
### Version 1.11.2
|
||||
* only add image files to media scanner
|
||||
* allow to delete files
|
||||
* various bug fixes
|
||||
|
||||
### Version 1.11.1
|
||||
* fixed some bugs when sharing files with Conversations
|
||||
|
||||
### Version 1.11.0
|
||||
* OMEMO encrypted conferences
|
||||
|
||||
### Version 1.10.1
|
||||
* made message correction opt-in
|
||||
* various bug fixes
|
||||
|
||||
### Version 1.10.0
|
||||
* Support for XEP-0357: Push Notifications
|
||||
* Support for XEP-0308: Last Message Correction
|
||||
* introduced build flavors to make dependence on play-services optional
|
||||
|
||||
### Version 1.9.4
|
||||
* prevent cleared Conversations from reloading history with MAM
|
||||
* various MAM fixes
|
||||
|
||||
### Version 1.9.3
|
||||
* expert setting that enables host and port configuration
|
||||
* expert setting opt-out of bookmark autojoin handling
|
||||
* offer to rejoin a conference after server sent unavailable
|
||||
* internal rewrites
|
||||
|
||||
### Version 1.9.2
|
||||
* prevent startup crash on Sailfish OS
|
||||
* minor bug fixes
|
||||
|
||||
### Version 1.9.1
|
||||
* minor bug fixes incl. a workaround for nimbuzz.com
|
||||
|
||||
### Version 1.9.0
|
||||
* Per conference notification settings
|
||||
* Let user decide whether to compress pictures
|
||||
* Support for XEP-0368
|
||||
* Ask user to exclude Conversations from battery optimizations
|
||||
|
||||
### Version 1.8.4
|
||||
* prompt to trust own OMEMO devices
|
||||
* fixed rotation issues in avatar publication
|
||||
* invite non-contact JIDs to conferences
|
||||
|
||||
### Version 1.8.3
|
||||
* brought text selection back
|
||||
|
||||
### Version 1.8.2
|
||||
* fixed stuck at 'connecting...' bug
|
||||
* make message box behave correctly with multiple links
|
||||
|
||||
### Version 1.8.1
|
||||
* enabled direct share on Android 6.0
|
||||
* ask for permissions on Android 6.0
|
||||
* notify on MAM catchup messages
|
||||
* bug fixes
|
||||
|
||||
### Version 1.8.0
|
||||
* TOR/ORBOT support in advanced settings
|
||||
* show vcard avatars of participants in a conference
|
||||
|
||||
### Version 1.7.3
|
||||
* fixed PGP encrypted file transfer
|
||||
* fixed repeating messages in slack conferences
|
||||
|
||||
### Version 1.7.2
|
||||
* decode PGP messages in background
|
||||
|
||||
####Versrion 1.7.1
|
||||
* performance improvements when opening a conversation
|
||||
|
||||
### Version 1.7.0
|
||||
* CAPTCHA support
|
||||
* SASL EXTERNAL (client certifiates)
|
||||
* fetching MUC history via MAM
|
||||
* redownload deleted files from HTTP hosts
|
||||
* Expert setting to automatically set presence
|
||||
* bug fixes
|
||||
|
||||
### Version 1.6.11
|
||||
* tab completion for MUC nicks
|
||||
* history export
|
||||
* bug fixes
|
||||
|
||||
### Version 1.6.10
|
||||
* fixed facebook login
|
||||
* fixed bug with ejabberd mam
|
||||
* use official HTTP File Upload namespace
|
||||
|
||||
### Version 1.6.9
|
||||
* basic keyboard support
|
||||
|
||||
### Version 1.6.8
|
||||
* reworked 'enter is send' setting
|
||||
* reworked DNS server discovery on lolipop devices
|
||||
* various bug fixes
|
||||
|
||||
### Version 1.6.7
|
||||
* bug fixes
|
||||
|
||||
### Version 1.6.6
|
||||
* best 1.6 release yet
|
||||
|
||||
### Version 1.6.5
|
||||
* more OMEMO fixes
|
||||
|
||||
### Version 1.6.4
|
||||
* setting to enable white chat bubbles
|
||||
* limit OMEMO key publish attempts to work around broken PEP
|
||||
* various bug fixes
|
||||
|
||||
### Version 1.6.3
|
||||
* bug fixes
|
||||
|
||||
### Version 1.6.2
|
||||
* fixed issues with connection time out when server does not support ping
|
||||
|
||||
### Version 1.6.1
|
||||
* fixed crashes
|
||||
|
||||
### Version 1.6.0
|
||||
* new multi-end-to-multi-end encryption method
|
||||
* redesigned chat bubbles
|
||||
* show unexpected encryption changes as red chat bubbles
|
||||
* always notify in private/non-anonymous conferences
|
||||
|
||||
### Version 1.5.1
|
||||
* fixed rare crashes
|
||||
* improved otr support
|
||||
|
||||
### Version 1.5.0
|
||||
* upload files to HTTP host and share them in MUCs. requires new [HttpUploadComponent](https://github.com/siacs/HttpUploadComponent) on server side
|
||||
|
||||
### Version 1.4.5
|
||||
* fixes to message parser to not display some ejabberd muc status messages
|
||||
|
||||
### Version 1.4.4
|
||||
* added unread count badges on supported devices
|
||||
* rewrote message parser
|
||||
|
||||
### Version 1.4.0
|
||||
* send button turns into quick action button to offer faster access to take photo, send location or record audio
|
||||
* visually seperate merged messages
|
||||
* visually separate merged messages
|
||||
* faster reconnects of failed accounts after network switches
|
||||
* r/o vcard avatars for contacts
|
||||
* various bug fixes
|
||||
|
||||
####Version 1.3.0
|
||||
### Version 1.3.0
|
||||
* swipe conversations to end them
|
||||
* quickly enable / disable account via slider
|
||||
* share multiple images at once
|
||||
|
@ -15,32 +405,32 @@
|
|||
* mlink compatibility
|
||||
* bug fixes
|
||||
|
||||
####Version 1.2.0
|
||||
### Version 1.2.0
|
||||
* Send current location. (requires [plugin](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation))
|
||||
* Invite multiple contacts at once
|
||||
* performance improvements
|
||||
* bug fixes
|
||||
|
||||
####Version 1.1.0
|
||||
### Version 1.1.0
|
||||
* Typing notifications (must be turned on in settings)
|
||||
* Various UI performance improvements
|
||||
* bug fixes
|
||||
|
||||
####Version 1.0.4
|
||||
### Version 1.0.4
|
||||
* load avatars asynchronously on start up
|
||||
* support for XEP-0092: Software Version
|
||||
|
||||
####Version 1.0.3
|
||||
### Version 1.0.3
|
||||
* load messages asynchronously on start up
|
||||
* bug fixes
|
||||
|
||||
####Version 1.0.2
|
||||
### Version 1.0.2
|
||||
* skipped
|
||||
|
||||
####Version 1.0.1
|
||||
### Version 1.0.1
|
||||
* accept more ciphers
|
||||
|
||||
####Version 1.0
|
||||
### Version 1.0
|
||||
* MUC controls (Affiliaton changes)
|
||||
* Added download button to notification
|
||||
* Added check box to hide offline contacts
|
||||
|
@ -48,7 +438,7 @@
|
|||
* Improved security
|
||||
* bug fixes + code clean up
|
||||
|
||||
####Version 0.10
|
||||
### Version 0.10
|
||||
* Support for Message Archive Management
|
||||
* Dynamically load message history
|
||||
* Ability to block contacts
|
||||
|
@ -58,16 +448,16 @@
|
|||
* quiet hours
|
||||
* fixed connection issues on ipv6 servers
|
||||
|
||||
####Version 0.9.3
|
||||
### Version 0.9.3
|
||||
* bug fixes
|
||||
|
||||
####Version 0.9.2
|
||||
### Version 0.9.2
|
||||
* more bug fixes
|
||||
|
||||
####Version 0.9.1
|
||||
### Version 0.9.1
|
||||
* bug fixes including some that caused Conversations to crash on start
|
||||
|
||||
####Version 0.9
|
||||
### Version 0.9
|
||||
* arbitrary file transfer
|
||||
* more options to verify OTR (SMP, QR Codes, NFC)
|
||||
* ability to create instant conferences
|
||||
|
@ -76,44 +466,44 @@
|
|||
* added SCRAM-SHA1 login method
|
||||
* bug fixes
|
||||
|
||||
####Version 0.8.4
|
||||
### Version 0.8.4
|
||||
* bug fixes
|
||||
|
||||
####Version 0.8.3
|
||||
### Version 0.8.3
|
||||
* increased UI performance
|
||||
* fixed rotation bugs
|
||||
|
||||
####Version 0.8.2
|
||||
### Version 0.8.2
|
||||
* Share contacts via QR codes or NFC
|
||||
* Slightly improved UI
|
||||
* minor bug fixes
|
||||
|
||||
####Version 0.8.1
|
||||
### Version 0.8.1
|
||||
* minor bug fixes
|
||||
|
||||
####Version 0.8
|
||||
### Version 0.8
|
||||
* Download HTTP images
|
||||
* Show avatars in MUC tiles
|
||||
* Disabled SSLv3
|
||||
* Performance improvments
|
||||
* Performance improvements
|
||||
* bug fixes
|
||||
|
||||
####Version 0.7.3
|
||||
### Version 0.7.3
|
||||
* revised tablet ui
|
||||
* internal rewrites
|
||||
* bug fixes
|
||||
|
||||
####Version 0.7.2
|
||||
### Version 0.7.2
|
||||
* show full timestamp in messages
|
||||
* brought back option to use JID to identify conferences
|
||||
* optionally request delivery receipts (expert option)
|
||||
* more languages
|
||||
* bug fixes
|
||||
|
||||
####Version 0.7.1
|
||||
### Version 0.7.1
|
||||
* Optionally use send button as status indicator
|
||||
|
||||
####Version 0.7
|
||||
### Version 0.7
|
||||
* Ability to disable notifications for single conversations
|
||||
* Merge messages in chat bubbles
|
||||
* Fixes for OpenPGP and OTR (please republish your public key)
|
||||
|
@ -122,35 +512,35 @@
|
|||
* Configurable font size
|
||||
* Expert options for encryption
|
||||
|
||||
####Version 0.6
|
||||
### Version 0.6
|
||||
* Support for server side avatars
|
||||
* save images in gallery
|
||||
* show contact name and picture in non-anonymous conferences
|
||||
* reworked account creation
|
||||
* various bug fixes
|
||||
|
||||
####Version 0.5.2
|
||||
### Version 0.5.2
|
||||
* minor bug fixes
|
||||
|
||||
####Version 0.5.1
|
||||
### Version 0.5.1
|
||||
* couple of small bug fixes that have been missed in 0.5
|
||||
* complete translations for Swedish, Dutch, German, Spanish, French, Russian
|
||||
|
||||
####Version 0.5
|
||||
### Version 0.5
|
||||
* UI overhaul
|
||||
* MUC / Conference bookmarks
|
||||
* A lot of bug fixes
|
||||
|
||||
####Version 0.4
|
||||
### Version 0.4
|
||||
* OTR file encryption
|
||||
* keep OTR messages and files on device until both parties or online at the same time
|
||||
* XEP-0333. Mark wether the other party has read your messages
|
||||
* XEP-0333. Mark whether the other party has read your messages
|
||||
* Delayed messages are now tagged properly
|
||||
* Share images from the Gallery
|
||||
* Infinit history scrolling
|
||||
* Mark the last used presence in presence selection dialog
|
||||
|
||||
####Version 0.3
|
||||
### Version 0.3
|
||||
* Mostly bug fixes and internal rewrites
|
||||
* Touch contact picture in conference to highlight
|
||||
* Long press on received image to share
|
||||
|
@ -158,27 +548,27 @@
|
|||
* improved issues with occasional message lost
|
||||
* experimental conference encryption. (see FAQ)
|
||||
|
||||
####Version 0.2.3
|
||||
### Version 0.2.3
|
||||
* regression fix with receiving encrypted images
|
||||
|
||||
####Version 0.2.2
|
||||
### Version 0.2.2
|
||||
* Ability to take photos directly
|
||||
* Improved openPGP offline handling
|
||||
* Various bug fixes
|
||||
* Updated Translations
|
||||
|
||||
####Version 0.2.1
|
||||
### Version 0.2.1
|
||||
* Various bug fixes
|
||||
* Updated Translations
|
||||
|
||||
####Version 0.2
|
||||
### Version 0.2
|
||||
* Image file transfer
|
||||
* Better integration with OpenKeychain (PGP encryption)
|
||||
* Nicer conversation tiles for conferences
|
||||
* Ability to clear conversation history
|
||||
* A lot of bug fixes and code clean up
|
||||
|
||||
####Version 0.1.3
|
||||
### Version 0.1.3
|
||||
* Switched to minidns library to resolve SRV records
|
||||
* Faster DNS in some cases
|
||||
* Enabled stream compression
|
||||
|
@ -186,12 +576,12 @@
|
|||
* Various bug fixes involving message notifications
|
||||
* Added support for DIGEST-MD5 auth
|
||||
|
||||
####Version 0.1.2
|
||||
### Version 0.1.2
|
||||
* Various bug fixes relating to conferences
|
||||
* Further DNS lookup improvements
|
||||
|
||||
####Version 0.1.1
|
||||
### Version 0.1.1
|
||||
* Fixed the 'server not found' bug
|
||||
|
||||
####Version 0.1
|
||||
### Version 0.1
|
||||
* Initial release
|
||||
|
|
197
README.md
|
@ -1,8 +1,31 @@
|
|||
# Conversations
|
||||
<h1 align="center">Conversations</h1>
|
||||
|
||||
Conversations: the very last word in instant messaging
|
||||
<p align="center">Conversations: the very last word in instant messaging</p>
|
||||
|
||||
[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations) [![Amazon App Store](https://images-na.ssl-images-amazon.com/images/G/01/AmazonMobileApps/amazon-apps-store-us-black.png)](http://www.amazon.com/dp/B00WD35AAC/)
|
||||
<p align="center">
|
||||
<a href="https://conversations.im/j/conversations@conference.siacs.eu">
|
||||
<img src="https://camo.githubusercontent.com/a839cc0a3d4dac7ec82237381b165dd144365b6d/68747470733a2f2f74696e7975726c2e636f6d2f6a6f696e7468656d7563"
|
||||
alt="chat on our conference room">
|
||||
</a>
|
||||
<a href="https://travis-ci.org/siacs/Conversations">
|
||||
<img src="https://travis-ci.org/siacs/Conversations.svg?branch=development"
|
||||
alt="build status">
|
||||
</a>
|
||||
<a href="https://bountysource.com/teams/siacs">
|
||||
<img src="https://api.bountysource.com/badge/tracker?tracker_id=519483" alt="Bountysource">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer=utm_source%3Dgithub">
|
||||
<img src="https://conversations.im/images/en-play-badge.png"
|
||||
alt="Google Play">
|
||||
</a>
|
||||
<a href="http://www.amazon.com/dp/B00WD35AAC/">
|
||||
<img src="https://images-na.ssl-images-amazon.com/images/G/01/AmazonMobileApps/amazon-apps-store-us-black.png"
|
||||
alt="Amazon App Store">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
![screenshots](https://raw.githubusercontent.com/siacs/Conversations/master/screenshots.png)
|
||||
|
||||
|
@ -16,9 +39,9 @@ Conversations: the very last word in instant messaging
|
|||
|
||||
## Features
|
||||
|
||||
* End-to-end encryption with either [OTR](https://otr.cypherpunks.ca/) or [OpenPGP](http://www.openpgp.org/about_openpgp/)
|
||||
* End-to-end encryption with [OMEMO](http://conversations.im/omemo/), [OTR](https://otr.cypherpunks.ca/), or [OpenPGP](http://openpgp.org/about/)
|
||||
* Send and receive images as well as other kind of files
|
||||
* Share your location via an external [plug-in](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation)
|
||||
* Share your location via an external [plug-in](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation&referrer=utm_source%3Dgithub)
|
||||
* Indication when your contact has read your message
|
||||
* Intuitive UI that follows Android Design guidelines
|
||||
* Pictures / Avatars for your Contacts
|
||||
|
@ -39,23 +62,25 @@ support these extensions; therefore to get the most out of Conversations you
|
|||
should consider either switching to an XMPP server that does or — even better —
|
||||
run your own XMPP server for you and your friends. These XEP's are:
|
||||
|
||||
* XEP-0065: SOCKS5 Bytestreams (or mod_proxy65). Will be used to transfer
|
||||
* [XEP-0065: SOCKS5 Bytestreams](http://xmpp.org/extensions/xep-0065.html) (or mod_proxy65). Will be used to transfer
|
||||
files if both parties are behind a firewall (NAT).
|
||||
* XEP-0163: Personal Eventing Protocol for avatars
|
||||
* XEP-0198: Stream Management allows XMPP to survive small network outages and
|
||||
* [XEP-0163: Personal Eventing Protocol](http://xmpp.org/extensions/xep-0163.html) for avatars and OMEMO.
|
||||
* [XEP-0191: Blocking command](http://xmpp.org/extensions/xep-0191.html) lets you blacklist spammers or block contacts
|
||||
without removing them from your roster.
|
||||
* [XEP-0198: Stream Management](http://xmpp.org/extensions/xep-0198.html) allows XMPP to survive small network outages and
|
||||
changes of the underlying TCP connection.
|
||||
* XEP-0280: Message Carbons which automatically syncs the messages you send to
|
||||
* [XEP-0280: Message Carbons](http://xmpp.org/extensions/xep-0280.html) which automatically syncs the messages you send to
|
||||
your desktop client and thus allows you to switch seamlessly from your mobile
|
||||
client to your desktop client and back within one conversation.
|
||||
* XEP-0237: Roster Versioning mainly to save bandwidth on poor mobile connections
|
||||
* XEP-0313: Message Archive Management synchronize message history with the
|
||||
* [XEP-0237: Roster Versioning](http://xmpp.org/extensions/xep-0237.html) mainly to save bandwidth on poor mobile connections
|
||||
* [XEP-0313: Message Archive Management](http://xmpp.org/extensions/xep-0313.html) synchronize message history with the
|
||||
server. Catch up with messages that were sent while Conversations was
|
||||
offline.
|
||||
* XEP-0352: Client State Indication lets the server know whether or not
|
||||
* [XEP-0352: Client State Indication](http://xmpp.org/extensions/xep-0352.html) lets the server know whether or not
|
||||
Conversations is in the background. Allows the server to save bandwidth by
|
||||
withholding unimportant packages.
|
||||
* XEP-0191: Blocking command lets you blacklist spammers or block contacts
|
||||
without removing them from your roster.
|
||||
* [XEP-0363: HTTP File Upload](http://xmpp.org/extensions/xep-0363.html) allows you to share files in conferences
|
||||
and with offline contacts.
|
||||
|
||||
## Team
|
||||
|
||||
|
@ -78,6 +103,7 @@ run your own XMPP server for you and your friends. These XEP's are:
|
|||
#### Logo
|
||||
* [Ilia Rostovtsev](https://github.com/qooob) (Progress)
|
||||
* [Diego Turtulici](http://efesto.eigenlab.org/~diesys) (Original)
|
||||
* [fiaxh](https://github.com/fiaxh) (OMEMO)
|
||||
|
||||
#### Translations
|
||||
Translations are managed on [Transifex](https://www.transifex.com/projects/p/conversations/)
|
||||
|
@ -89,12 +115,12 @@ Translations are managed on [Transifex](https://www.transifex.com/projects/p/con
|
|||
#### How do I install Conversations?
|
||||
|
||||
Conversations is entirely open source and licensed under GPLv3. So if you are a
|
||||
software developer you can check out the sources from GitHub and use ant to
|
||||
software developer you can check out the sources from GitHub and use Gradle to
|
||||
build your apk file.
|
||||
|
||||
The more convenient way — which not only gives you automatic updates but also
|
||||
supports the further development of Conversations — is to buy the App in the
|
||||
Google [Play Store](https://play.google.com/store/apps/details?id=eu.siacs.conversations).
|
||||
Google [Play Store](https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer=utm_source%3Dgithub).
|
||||
|
||||
Buying the App from the Play Store will also give you access to our [beta test](#beta).
|
||||
|
||||
|
@ -115,20 +141,48 @@ My Bitcoin Address is: `1NxSU1YxYzJVDpX1rcESAA3NJki7kRgeeu`
|
|||
[![Flattr this!](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=inputmice&url=http%3A%2F%2Fconversations.siacs.eu&title=Conversations&tags=github&category=software)
|
||||
|
||||
#### How do I create an account?
|
||||
XMPP, like email, is a federated protocol, which means that there is not one company you can create an *official XMPP account* with. Instead there are hundreds, or even thousands, of providers out there. One of those providers is our very own [conversations.im](https://account.conversations.im). If you don’t like to use *conversations.im* use a web search engine of your choice to find another provider. Or maybe your university has one. Or you can run your own. Or ask a friend to run one. Once you've found one, you can use Conversations to create an account. Just select *register new account* on server within the create account dialog.
|
||||
|
||||
XMPP, like email, is a federated protocol which means that there is not one
|
||||
company you can create an 'official XMPP account' with. Instead there are
|
||||
hundreds, or even thousands, of provider out there. To find one use a web search
|
||||
engine of your choice. Or maybe your university has one. Or you can run your
|
||||
own. Or ask a friend to run one. Once you've found one, you can use
|
||||
Conversations to create an account. Just select 'register new account on server'
|
||||
within the create account dialog.
|
||||
##### Domain hosting
|
||||
Using your own domain not only gives you a more recognizable Jabber ID, it also gives you the flexibility to migrate your account between different XMPP providers. This is a good compromise between the responsibilities of having to operate your own server and the downsides of being dependent on a single provider.
|
||||
|
||||
Learn more about [conversations.im Jabber/XMPP domain hosting](https://account.conversations.im/domain/).
|
||||
|
||||
##### Running your own
|
||||
If you already have a server somewhere and are willing and able to put the necessary work in, one alternative-in the spirit of federation-is to run your own. We recommend either [Prosody](https://prosody.im/) or [ejabberd](https://www.ejabberd.im/). Both of which have their own strengths. Ejabberd is slightly more mature nowadays but Prosody is arguably easier to set up.
|
||||
|
||||
For Prosody you need a couple of so called [community modules](https://modules.prosody.im/) most of which are maintained by the same people that develop Prosody.
|
||||
|
||||
If you pick ejabberd make sure you use the latest version. Linux Distributions might bundle some very old versions of it.
|
||||
|
||||
#### Where can I set up a custom hostname / port
|
||||
Conversations will automatically look up the SRV records for your domain name
|
||||
which can point to any hostname port combination. If your server doesn’t provide
|
||||
those please contact your admin and have them read
|
||||
[this](http://prosody.im/doc/dns#srv_records)
|
||||
[this](http://prosody.im/doc/dns#srv_records). If your server operator is unwilling
|
||||
to fix this you can enable advanced server settings in the expert settings of
|
||||
Conversations.
|
||||
|
||||
#### I get 'Incompatible Server'
|
||||
|
||||
As regular user you should be picking a different server. The server you selected
|
||||
is probably insecure and/or very old.
|
||||
|
||||
If you are a server administrator you should make sure that your server provides
|
||||
STARTTLS. XMPP over TLS (on a different port) is not sufficient.
|
||||
|
||||
On rare occasions this error message might also be caused by a server not providing
|
||||
a login (SASL) mechanism that Conversations is able to handle. Conversations supports
|
||||
SCRAM-SHA1, PLAIN, EXTERNAL (client certs) and DIGEST-MD5.
|
||||
|
||||
#### How do XEP-0357: Push Notifications work?
|
||||
You need to be running the Play Store version of Conversations and your server needs to support push notifications.¹ Because *Google Cloud Notifications (GCM)* are tied with an API key to a specific app your server can not initiate the push message directly. Instead your server will send the push notification to the Conversations App server (operated by us) which then acts as a proxy and initiates the push message for you. The push message sent from our App server through GCM doesn’t contain any personal information. It is just an empty message which will wake up your device and tell Conversations to reconnect to your server. The information send from your server to our App server depends on the configuration of your server but can be limited to your account name. (In any case the Conversations App server won't redirect any information through GCM even if your server sends this information.)
|
||||
|
||||
In summary Google will never get hold of any personal information besides that *something* happened. (Which doesn’t even have to be a message but can be some automated event as well.) We - as the operator of the App server - will just get hold of your account name (without being able to tie this to your specific device).
|
||||
|
||||
If you don’t want this simply pick a server which does not offer Push Notifications or build Conversations yourself without support for push notifications. (This is available via a gradle build flavor.) Non-play store source of Conversations like the Amazon App store will also offer a version without push notifications. Conversations will just work as before and maintain its own TCP connection in the background.
|
||||
|
||||
¹ Your server only needs to support the server side of [XEP-0357: Push Notifications](http://xmpp.org/extensions/xep-0357.html). If you use the Play Store version you do **not** need to run your own app server. The server modules are called *mod_cloud_notify* on Prosody and *mod_push* on ejabberd.
|
||||
|
||||
#### Conversations doesn't work for me. Where can I get help?
|
||||
|
||||
|
@ -170,6 +224,12 @@ connection again. When the client fails to do so because the network
|
|||
connectivity is out for longer than that all messages sent to that client will
|
||||
be returned to the sender resulting in a delivery failed.
|
||||
|
||||
Instead of returning a message to the sender both ejabberd and prosody have the
|
||||
ability to store messages in offline storage when the disconnecting client is
|
||||
the only client. In prosody this is available via an extra module called
|
||||
```mod_smacks_offline```. In ejabberd this is available via some configuration
|
||||
settings.
|
||||
|
||||
Other less common reasons are that the message you sent didn't meet some
|
||||
criteria enforced by the server (too large, too many). Another reason could be
|
||||
that the recipient is offline and the server doesn't provide offline storage.
|
||||
|
@ -210,6 +270,11 @@ Making these status and priority optional isn't a solution either because
|
|||
Conversations is trying to get rid of old behaviours and set an example for
|
||||
other clients.
|
||||
|
||||
#### How do I backup / move Conversations to a new device?
|
||||
On the one hand Conversations supports Message Archive Management to keep a server side history of your messages so when migrating to a new device that device can display your entire history. However that does not work if you enable OMEMO due to its forward secrecy. (Read [The State of Mobile XMPP in 2016](https://gultsch.de/xmpp_2016.html) especially the section on encryption.)
|
||||
|
||||
If you migrate to a new device and would still like to keep your history please use a third party backup tool like [oandbackup](https://github.com/jensstein/oandbackup) or ```adb backup``` from your computer. It is important that your deactivate your account before backup and activate it only after a successful restore. Otherwise OMEMO might not work afterwards.
|
||||
|
||||
#### Conversations is missing a certain feature
|
||||
|
||||
I'm open for new feature suggestions. You can use the [issue tracker][issues] on
|
||||
|
@ -232,11 +297,11 @@ I am available for hire. Contact me via XMPP: `inputmice@siacs.eu`
|
|||
|
||||
### Security
|
||||
|
||||
#### Why are there two end-to-end encryption methods and which one should I choose?
|
||||
#### Why are there three end-to-end encryption methods and which one should I choose?
|
||||
|
||||
In most cases OTR should be the encryption method of choice. It works out of the
|
||||
box with most contacts as long as they are online. However PGP can, in some
|
||||
cases, (message carbons to multiple clients) be more flexible.
|
||||
* OTR is a legacy encryption method. It works out of the box with most contacts as long as they are online.
|
||||
* OMEMO works even when a contact is offline, and works with multiple devices. It also allows asynchronous file-transfer when the server has [HTTP File Upload](http://xmpp.org/extensions/xep-0363.html). However, OMEMO is not as widely supported as OTR and is currently implemented only by Conversations and Gajim. OMEMO should be preferred over OTR for contacts who use Conversations.
|
||||
* OpenPGP (XEP-0027) is a very old encryption method that has some advantages over OTR but should only be used by experts who know what they are doing.
|
||||
|
||||
#### How do I use OpenPGP
|
||||
|
||||
|
@ -252,17 +317,39 @@ decrypting and encrypting takes longer than OTR. It is however asynchronous and
|
|||
works well with message carbons.
|
||||
|
||||
To use OpenPGP you have to install the open source app
|
||||
[OpenKeychain](www.openkeychain.org) and then long press on the account in
|
||||
[OpenKeychain](http://www.openkeychain.org) and then long press on the account in
|
||||
manage accounts and choose renew PGP announcement from the contextual menu.
|
||||
|
||||
#### OMEMO is grayed out. What do I do?
|
||||
OMEMO has two requirements: Your server and the server of your contact need to support PEP. Both of you can verify that individually by opening your account details and selecting ```Server info``` from the menu. The appearing table should list PEP as available. The second requirement is mutual presence subscription. You can verify that by opening the contact details and see if both check boxes *Send presence updates* and *Receive presence updates* are checked.
|
||||
|
||||
#### How does the encryption for conferences work?
|
||||
|
||||
For conferences the only supported encryption method is OpenPGP (OTR does not
|
||||
work with multiple participants). Every participant has to announce their
|
||||
OpenPGP key (see answer above). If you would like to send encrypted messages to
|
||||
a conference you have to make sure that you have every participant's public key
|
||||
in your OpenKeychain. Right now there is no check in Conversations to ensure
|
||||
that. You have to take care of that yourself. Go to the conference details and
|
||||
For conferences only OMEMO and OpenPGP are supported as encryption method. (OTR
|
||||
does not work with multiple participants).
|
||||
|
||||
##### OMEMO
|
||||
|
||||
OMEMO encryption works only in private (members only) conferences that are non-anonymous.
|
||||
You need to have presence subscription with every member of the conference.
|
||||
You can verify that by going into the conference details, long press every member and start
|
||||
a conversation with them. (Or select 'contact details' if they are already in your contact
|
||||
list)
|
||||
|
||||
The owner of a conference can make a public conference private by going into the conference
|
||||
details and hit the settings button (the one with the gears) and select both *private* and
|
||||
*members only*.
|
||||
|
||||
If OMEMO is grayed out long pressing the lock icon will reveal some quick hints on why OMEMO
|
||||
is disabled.
|
||||
|
||||
##### OpenPGP
|
||||
|
||||
Every participant has to announce their OpenPGP key (see answer above).
|
||||
If you would like to send encrypted messages to a conference you have to make
|
||||
sure that you have every participant's public key in your OpenKeychain.
|
||||
Right now there is no check in Conversations to ensure that.
|
||||
You have to take care of that yourself. Go to the conference details and
|
||||
touch every key id (The hexadecimal number below a contact). This will send you
|
||||
to OpenKeychain which will assist you on adding the key. This works best in
|
||||
very small conferences with contacts you are already using OpenPGP with. This
|
||||
|
@ -270,6 +357,23 @@ feature is regarded experimental. Conversations is the only client that uses
|
|||
XEP-0027 with conferences. (The XEP neither specifically allows nor disallows
|
||||
this.)
|
||||
|
||||
#### Why is Conversations not end-to-end encrypted by default
|
||||
We briefly had OMEMO as the default E2EE but it turned out to be a usability nightmare and thus we reverted that. You can find more information in [the commit message](https://github.com/siacs/Conversations/commit/035d0c79572d5981c53d1bff7f30b484c6542f17) of that change.
|
||||
|
||||
Quick reminder that Conversations **always** uses TLS to connect to your server. It won‘t even connect to a server without TLS.
|
||||
|
||||
#### What is Blind Trust Before Verification / why are messages marked with a red lock?
|
||||
|
||||
Read more about the concept on https://gultsch.de/trust.html
|
||||
|
||||
### What clients do I use on other platforms
|
||||
There are XMPP Clients available for all major platforms.
|
||||
#### Windows / Linux
|
||||
For your desktop computer we recommend that you use [Gajim](https://gajim.org). You need to install the plugins `OMEMO`, `HTTP Upload` and `URL image preview` to get the best compatibility with Conversations. Plugins can be installed from within the app.
|
||||
#### iOS
|
||||
Unfortunately we don‘t have a recommendation for iPhones right now. There are two clients available [ChatSecure](https://chatsecure.org/) and [Monal](https://monal.im/). Both with their own pros and cons.
|
||||
|
||||
|
||||
### Development
|
||||
|
||||
<a name="beta"></a>
|
||||
|
@ -282,16 +386,18 @@ to sign up for the beta test.
|
|||
|
||||
#### How do I build Conversations
|
||||
|
||||
Make sure to have ANDROID_HOME point to your Android SDK
|
||||
Make sure to have ANDROID_HOME point to your Android SDK. Use the Android SDK Manager to install missing dependencies.
|
||||
|
||||
git clone https://github.com/siacs/Conversations.git
|
||||
cd Conversations
|
||||
./gradlew build
|
||||
./gradlew assembleFreeDebug
|
||||
|
||||
There are two build flavors available. *free* and *playstore*. Unless you know what you are doing you only need *free*.
|
||||
|
||||
|
||||
[![Build Status](https://travis-ci.org/siacs/Conversations.svg?branch=development)](https://travis-ci.org/siacs/Conversations)
|
||||
|
||||
### How do I update/add external libraries?
|
||||
#### How do I update/add external libraries?
|
||||
|
||||
If the library you want to update is in Maven Central or JCenter (or has its own
|
||||
Maven repo), add it or update its version in `build.gradle`. If the library is
|
||||
|
@ -314,16 +420,27 @@ To add a new dependency to the `libs/` directory (replacing "name", "branch" and
|
|||
|
||||
If something goes wrong Conversations usually exposes very little information in
|
||||
the UI (other than the fact that something didn't work). However with adb
|
||||
(android debug bridge) you squeeze some more information out of Conversations.
|
||||
(android debug bridge) you can squeeze some more information out of Conversations.
|
||||
These information are especially useful if you are experiencing trouble with
|
||||
your connection or with file transfer.
|
||||
|
||||
To use adb you have to connect your mobile phone to your computer with an USB cable
|
||||
and install `adb`. Most Linux systems have prebuilt packages for that tool. On
|
||||
Debian/Ubuntu for example it is called `android-tools-adb`.
|
||||
|
||||
Furthermore you might have to enable 'USB debugging' in the Developer options of your
|
||||
phone. After that you can just execute the following on your computer:
|
||||
|
||||
adb -d logcat -v time -s conversations
|
||||
|
||||
If need be there are also some Apps on the PlayStore that can be used to show the logcat
|
||||
directly on your rooted phone. (Search for logcat). However in regards to further processing
|
||||
(for example to create an issue here on Github) it is more convenient to just use your PC.
|
||||
|
||||
#### I found a bug
|
||||
|
||||
Please report it to our [issue tracker][issues]. If your app crashes please
|
||||
provide a stack trace. If you are experiencing misbehaviour please provide
|
||||
provide a stack trace. If you are experiencing misbehavior please provide
|
||||
detailed steps to reproduce. Always mention whether you are running the latest
|
||||
Play Store version or the current HEAD. If you are having problems connecting to
|
||||
your XMPP server your file transfer doesn’t work as expected please always
|
||||
|
|
|
@ -1,390 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="512"
|
||||
height="512"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="conversations_baloon.svg"
|
||||
inkscape:export-filename="/home/diesys/diesys/grafica/conversation/conversation_bubble.png"
|
||||
inkscape:export-xdpi="100"
|
||||
inkscape:export-ydpi="100">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3874">
|
||||
<stop
|
||||
style="stop-color:#00a000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3876" />
|
||||
<stop
|
||||
style="stop-color:#00a000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3878" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3913">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3915" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3917" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3818">
|
||||
<stop
|
||||
style="stop-color:#669900;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop3820" />
|
||||
<stop
|
||||
style="stop-color:#99cc00;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop3822" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3818"
|
||||
id="radialGradient3824"
|
||||
cx="212.07048"
|
||||
cy="1045.9178"
|
||||
fx="212.07048"
|
||||
fy="1045.9178"
|
||||
r="238.57143"
|
||||
gradientTransform="matrix(1.9491621,-0.90817722,0.65829208,1.4128498,-879.63121,-248.98648)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3913"
|
||||
id="radialGradient3919"
|
||||
cx="362.98563"
|
||||
cy="379.77524"
|
||||
fx="362.98563"
|
||||
fy="379.77524"
|
||||
r="139.95312"
|
||||
gradientTransform="matrix(1.3800477,1.0445431,-1.3325077,1.7605059,339.09383,-577.83938)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="-155.75885"
|
||||
x2="114.59022"
|
||||
y1="35.545681"
|
||||
x1="114.55434"
|
||||
id="linearGradient3794"
|
||||
xlink:href="#linearGradient3788"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient3788">
|
||||
<stop
|
||||
id="stop3790"
|
||||
offset="0"
|
||||
style="stop-color:#1eed00;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3792"
|
||||
offset="1"
|
||||
style="stop-color:#abff28;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3821">
|
||||
<stop
|
||||
style="stop-color:#ff283d;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3823" />
|
||||
<stop
|
||||
style="stop-color:#ff28ae;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3825" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4543">
|
||||
<stop
|
||||
style="stop-color:#2e45bf;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4545" />
|
||||
<stop
|
||||
style="stop-color:#28a7ff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop4547" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4098">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4100" />
|
||||
<stop
|
||||
style="stop-color:#e6e6e6;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4102" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4098"
|
||||
id="linearGradient3833"
|
||||
x1="273.81851"
|
||||
y1="764.74677"
|
||||
x2="304.14023"
|
||||
y2="936.47272"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4098"
|
||||
id="linearGradient3853"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="273.81851"
|
||||
y1="764.74677"
|
||||
x2="304.14023"
|
||||
y2="936.47272" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3818"
|
||||
id="radialGradient3863"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754"
|
||||
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,170.11831)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3818"
|
||||
id="radialGradient3866"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,170.11831)"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3913"
|
||||
id="radialGradient3873"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3800477,1.0445431,-1.3325077,1.7605059,339.09383,-577.83938)"
|
||||
cx="321.75275"
|
||||
cy="386.38751"
|
||||
fx="321.75275"
|
||||
fy="386.38751"
|
||||
r="139.95312" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3818"
|
||||
id="radialGradient3880"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,-370.24387)"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3913"
|
||||
id="radialGradient3883"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.4430075,-0.63865195,0.50745433,1.1475866,-594.40824,44.803037)"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter3895">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="2.0013623"
|
||||
id="feGaussianBlur3897" />
|
||||
</filter>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3874"
|
||||
id="radialGradient3881"
|
||||
cx="150.35715"
|
||||
cy="236.28571"
|
||||
fx="150.35715"
|
||||
fy="236.28571"
|
||||
r="26.887305"
|
||||
gradientTransform="matrix(1,0,0,0.98671703,0,3.1385771)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="385.13513"
|
||||
inkscape:cy="237.84331"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer4"
|
||||
showgrid="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1020"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:snap-to-guides="true"
|
||||
inkscape:snap-grids="false"
|
||||
inkscape:object-paths="true"
|
||||
inkscape:object-nodes="false"
|
||||
inkscape:snap-nodes="false">
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="0,534.28571"
|
||||
id="guide3004" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="394.28571,511.42857"
|
||||
id="guide3006" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="511.42857,320"
|
||||
id="guide3008" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="401.42857,0"
|
||||
id="guide3010" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="17.142857,258.57143"
|
||||
id="guide3012" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="327.14286,494.28571"
|
||||
id="guide3014" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="324.28571,17.142857"
|
||||
id="guide3016" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="494.28571,237.14286"
|
||||
id="guide3018" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="255.71429,302.85714"
|
||||
id="guide3022" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="660,-315"
|
||||
id="guide3904" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="554.28571,475.71429"
|
||||
id="guide3931" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="581.42857,244.28571"
|
||||
id="guide3933" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-540.36218)"
|
||||
style="display:inline">
|
||||
<path
|
||||
d="m 253.34375,605.78125 c -107.90463,0 -195.9375,85.86121 -195.9375,191.84375 0,105.98253 88.02779,191.90625 195.9375,191.90625 33.55862,0 59.4324,-6.89467 88.96875,-17.625 l 93.8125,37.81255 A 12.359798,12.359798 0 0 0 452.75,995.28125 L 427.34375,892.59375 C 443.67389,863.93074 449.25,831.2919 449.25,797.625 449.25,691.64506 361.24842,605.78125 253.34375,605.78125 z"
|
||||
id="path3885"
|
||||
style="opacity:0.6;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3895)"
|
||||
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
|
||||
inkscape:radius="12.358562"
|
||||
sodipodi:type="inkscape:offset"
|
||||
transform="matrix(1.1776575,0,0,1.1781783,-45.132882,-150.91395)" />
|
||||
<path
|
||||
sodipodi:type="inkscape:offset"
|
||||
inkscape:radius="12.358562"
|
||||
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
|
||||
style="fill:#00a000;fill-opacity:1;stroke:none"
|
||||
id="path3868"
|
||||
d="m 253.34375,605.78125 c -107.90463,0 -195.9375,85.86121 -195.9375,191.84375 0,105.98253 88.02779,191.90625 195.9375,191.90625 33.55862,0 59.4324,-6.89467 88.96875,-17.625 l 93.8125,37.81255 A 12.359798,12.359798 0 0 0 452.75,995.28125 L 427.34375,892.59375 C 443.67389,863.93074 449.25,831.2919 449.25,797.625 449.25,691.64506 361.24842,605.78125 253.34375,605.78125 z"
|
||||
transform="matrix(1.1776575,0,0,1.1781783,-45.132882,-155.6267)" />
|
||||
<path
|
||||
style="opacity:0.19211821;fill:url(#radialGradient3883);fill-opacity:1;stroke:none"
|
||||
d="m 442.08605,700.89397 c -129.66422,0 -234.75863,103.19621 -234.75863,230.48113 0,26.84957 4.6841,52.62718 13.28548,76.5811 10.65333,1.4828 21.54531,2.2461 32.60637,2.2461 39.52053,0 69.99101,-8.1231 104.7747,-20.7651 l 110.479,44.5494 a 14.555607,14.562048 0 0 0 19.57853,-17.0097 L 458.13167,895.99293 c 19.23127,-33.77016 25.79804,-72.22452 25.79804,-111.89014 0,-28.84573 -5.53074,-56.41202 -15.60395,-81.77294 -8.61503,-0.94041 -17.37147,-1.43588 -26.23971,-1.43588 z"
|
||||
id="path3878"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccsssscc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3845"
|
||||
d="M 478.64112,1025.218 447.36049,898.60749 c 19.89028,-31.99834 26.74288,-69.57172 26.74288,-109.76189 0,-116.81686 -96.79943,-211.48385 -216.18374,-211.48385 -119.38425,0 -216.183656,94.66699 -216.183656,211.48385 0,116.81685 96.799406,211.5536 216.183656,211.5536 39.63617,0 68.58847,-8.14219 105.19417,-21.76075 z"
|
||||
style="opacity:0;fill:none;stroke:#000000;stroke-width:23.55835724;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:94.23343197, 94.23343197;stroke-dashoffset:0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3855"
|
||||
d="m 253.18246,561.05889 c -5.38379,-0.002 -10.7413,0.0871 -12.77023,0.22089 -16.80965,1.10727 -29.68729,3.05317 -44.38296,6.77453 -5.64799,1.43026 -9.96811,2.69833 -15.19914,4.41816 -3.34052,1.09828 -8.41764,2.85364 -8.68521,3.01909 -0.082,0.0507 3.32705,9.32907 7.98597,21.79631 0.0466,0.12496 0.17057,0.13832 0.33123,0.0736 1.11322,-0.44815 6.45699,-2.29745 8.94283,-3.09273 21.39718,-6.84518 43.95735,-10.19531 66.31683,-9.86723 3.14874,0.0461 7.13319,0.15915 8.83245,0.25775 1.69921,0.0987 3.12161,0.15378 3.16493,0.11037 0.0685,-0.0684 1.53237,-23.21444 1.47209,-23.26905 -0.0122,-0.0117 -1.41064,-0.10943 -3.12817,-0.22089 -2.0869,-0.13546 -7.49683,-0.21852 -12.88062,-0.22088 z m 110.81021,28.16581 c -0.10125,0.10911 -11.15095,20.28455 -11.15095,20.36043 0,0.0184 0.50701,0.31641 1.14084,0.66267 8.38104,4.57856 17.56037,10.63803 25.90897,17.04889 3.23527,2.48434 6.34578,5.02146 9.23674,7.54561 4.2123,3.67784 8.41256,7.68117 12.42754,11.81905 6.38417,6.5796 12.29989,13.4994 17.05071,19.99177 0.65274,0.89212 0.79099,1.01157 1.03047,0.84681 1.13402,-0.7802 18.39736,-13.76959 18.40089,-13.84358 0.005,-0.1 -3.33561,-4.52525 -4.74744,-6.29593 -5.64395,-7.07831 -10.59769,-12.59166 -17.26005,-19.25582 -8.26499,-8.26722 -16.14264,-15.121 -25.02569,-21.71453 -2.5667,-1.90515 -5.21733,-3.78858 -7.9855,-5.6781 -6.60132,-4.50598 -18.71149,-11.82683 -19.02653,-11.48727 z m -274.762206,39.94759 -2.428914,2.57732 c -21.579098,22.69359 -38.068397,49.23025 -48.467963,78.05431 -0.50904,1.41091 -0.957247,2.67589 -0.993643,2.83498 -0.04781,0.20904 2.956962,1.31003 10.78292,3.93954 5.956638,2.00143 10.92488,3.63791 11.040538,3.64502 0.115645,0.007 0.916879,-1.94564 1.803285,-4.34458 9.098432,-24.62317 23.187184,-47.25662 41.659643,-66.93523 l 3.05453,-3.27681 -8.206806,-8.24726 z m 388.222146,115.167 -9.89972,1.91451 c -5.44839,1.06994 -10.56998,2.07187 -11.40857,2.20908 -1.04711,0.17137 -1.54564,0.35016 -1.54564,0.55228 0,0.16187 0.23325,1.63204 0.51522,3.2768 2.70275,15.76547 3.28356,34.63258 1.69287,55.26394 -0.7281,9.44363 -2.34823,21.04449 -3.90099,28.01857 -0.23345,1.0486 -0.37949,1.97667 -0.33118,2.02499 0.0483,0.0483 5.12585,1.1561 11.29809,2.46683 6.17232,1.31067 11.30751,2.37915 11.3718,2.39315 0.0641,0.014 0.45734,-1.73307 0.88322,-3.90272 3.35867,-17.11028 4.82653,-33.18977 4.85786,-53.27572 0.0219,-14.08945 -0.79161,-24.35571 -2.87056,-36.96537 z m -427.268845,64.06345 -0.772838,0.11039 c -0.421858,0.0612 -5.59823,0.67716 -11.482161,1.36226 -5.883927,0.68512 -10.759171,1.30169 -10.819725,1.36228 -0.141991,0.142 0.252313,2.91986 1.140854,8.32086 4.869392,29.59836 15.038358,56.25732 31.539139,82.61977 0.450701,0.72005 0.931445,1.27763 1.06725,1.25182 0.361709,-0.0685 19.423106,-12.2036 19.431349,-12.3709 0.0036,-0.0779 -0.796734,-1.40341 -1.766487,-2.94542 -4.266677,-6.78447 -9.935035,-17.45299 -13.064635,-24.5945 -7.52905,-17.18062 -12.488823,-34.71382 -15.051936,-53.27567 z M 462.40066,926.44149 c -0.46898,0.009 -22.08567,5.38002 -22.2283,5.52269 -0.098,0.0981 22.04129,90.06142 22.37549,91.01382 0.40286,1.1482 3.73284,10.5298 13.56323,8.9156 10.95786,-2.3434 9.8458,-14.6677 8.99628,-14.4751 -0.11284,0.025 -5.02627,-20.61508 -11.18774,-45.58033 -8.79763,-35.64656 -11.26829,-45.40142 -11.51896,-45.39668 z M 143.91794,953.1714 c -0.40943,0.0131 -1.21588,1.3276 -6.29312,9.64634 -3.31435,5.43031 -6.03549,9.92123 -6.03549,9.9777 0,0.13674 3.42858,2.19027 7.06593,4.27089 22.35182,12.78549 47.08561,21.82095 72.42596,26.43487 3.59043,0.654 5.67261,1.0064 11.04051,1.804 0.69401,0.1031 1.36954,0.2073 1.50889,0.2212 0.31484,0.031 0.24386,0.6279 1.87691,-11.45018 0.75094,-5.5542 1.40492,-10.43428 1.47207,-10.86126 0.11781,-0.74877 0.0863,-0.77677 -0.58887,-0.88362 -0.38487,-0.0607 -2.68651,-0.4127 -5.11543,-0.77322 -22.30454,-3.3101 -45.25895,-10.90321 -65.32317,-21.57538 -3.55401,-1.89038 -10.16752,-5.64292 -11.85018,-6.73769 -0.0531,-0.0345 -0.12551,-0.0755 -0.18401,-0.0737 z m 214.22322,9.09404 c -1.98095,0.13013 -4.60205,1.01767 -10.4517,3.12954 -11.29964,4.0795 -24.13159,8.26507 -29.91986,9.75681 -0.83741,0.21582 -1.5445,0.50692 -1.54566,0.62592 -0.002,0.21503 5.72469,22.22722 5.81468,22.34847 0.0552,0.075 6.34708,-1.70267 10.2677,-2.90858 5.09669,-1.5677 13.67295,-4.44246 19.79936,-6.62722 l 6.07232,-2.17225 22.30187,8.98356 c 18.14341,7.31671 22.30098,8.95081 22.41231,8.68881 0.9061,-2.1322 8.61707,-21.32757 8.57483,-21.35419 -0.38803,-0.24492 -49.13929,-19.77601 -49.90327,-19.99221 -1.25781,-0.35596 -2.23399,-0.55669 -3.42258,-0.47866 z"
|
||||
style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:5.88958931;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
sodipodi:nodetypes="ccssccssscccccccssssscccsssscccscsssccccccssssssssssccccscssccsscccsscsscsssssccsccsscsscsccscccccssc" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Dots">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047"
|
||||
sodipodi:cx="173.57143"
|
||||
sodipodi:cy="241.28571"
|
||||
sodipodi:rx="26.428572"
|
||||
sodipodi:ry="20"
|
||||
d="m 200,241.28571 a 26.428572,20 0 1 1 -52.85715,0 26.428572,20 0 1 1 52.85715,0 z"
|
||||
transform="matrix(0.94594594,0,0,1.25,-18.332045,-54.607132)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-1"
|
||||
sodipodi:cx="173.57143"
|
||||
sodipodi:cy="241.28571"
|
||||
sodipodi:rx="26.428572"
|
||||
sodipodi:ry="20"
|
||||
d="m 200,241.28571 a 26.428572,20 0 1 1 -52.85715,0 26.428572,20 0 1 1 52.85715,0 z"
|
||||
transform="matrix(0.94594594,0,0,1.25,91.38502,-54.607132)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-1-8"
|
||||
sodipodi:cx="173.57143"
|
||||
sodipodi:cy="241.28571"
|
||||
sodipodi:rx="26.428572"
|
||||
sodipodi:ry="20"
|
||||
d="m 200,241.28571 a 26.428572,20 0 1 1 -52.85715,0 26.428572,20 0 1 1 52.85715,0 z"
|
||||
transform="matrix(0.94594594,0,0,1.25,201.38502,-54.607132)" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 18 KiB |
|
@ -0,0 +1,168 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="26"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.92.1 r"
|
||||
sodipodi:docname="date_bubble_white.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
style="color-interpolation-filters:sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="9.745257"
|
||||
inkscape:cy="9.618802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1156"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="20"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#000000"
|
||||
guideopacity="0.49803922"
|
||||
fit-margin-top="-2"
|
||||
fit-margin-left="-2"
|
||||
fit-margin-right="-2"
|
||||
fit-margin-bottom="-2">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1"
|
||||
spacingy="1"
|
||||
originx="-9"
|
||||
originy="-1"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="11,26"
|
||||
id="guide3060"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="15,26"
|
||||
id="guide3062"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="26,21"
|
||||
id="guide3064"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="26,5"
|
||||
id="guide3066"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="17,0"
|
||||
id="guide3068"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="9,0"
|
||||
id="guide3070"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,18"
|
||||
id="guide3074"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,16"
|
||||
id="guide3076"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(-9,-1)">
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3805"
|
||||
d="m 8,8 c 2,2 4,6 4,10 L 16,8 Z"
|
||||
style="display:none;fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3811)" />
|
||||
<rect
|
||||
style="fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3811)"
|
||||
id="rect2987"
|
||||
width="20"
|
||||
height="20"
|
||||
x="12"
|
||||
y="4"
|
||||
ry="2" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
|
@ -0,0 +1,168 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="26"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.92.1 r"
|
||||
sodipodi:docname="date_bubble_white.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
style="color-interpolation-filters:sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="9.745257"
|
||||
inkscape:cy="9.618802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1156"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="20"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#000000"
|
||||
guideopacity="0.49803922"
|
||||
fit-margin-top="-2"
|
||||
fit-margin-left="-2"
|
||||
fit-margin-right="-2"
|
||||
fit-margin-bottom="-2">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1"
|
||||
spacingy="1"
|
||||
originx="-9"
|
||||
originy="-1"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="11,26"
|
||||
id="guide3060"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="15,26"
|
||||
id="guide3062"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="26,21"
|
||||
id="guide3064"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="26,5"
|
||||
id="guide3066"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="17,0"
|
||||
id="guide3068"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="9,0"
|
||||
id="guide3070"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,18"
|
||||
id="guide3074"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,16"
|
||||
id="guide3076"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(-9,-1)">
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3805"
|
||||
d="m 8,8 c 2,2 4,6 4,10 L 16,8 Z"
|
||||
style="display:none;fill:#fafafa;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3811)" />
|
||||
<rect
|
||||
style="fill:#fafafa;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3811)"
|
||||
id="rect2987"
|
||||
width="20"
|
||||
height="20"
|
||||
x="12"
|
||||
y="4"
|
||||
ry="2" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
|
@ -0,0 +1,427 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="57mm"
|
||||
height="57mm"
|
||||
viewBox="0 0 201.96849 201.96849"
|
||||
id="svg4211"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="conversations_baloon.svg">
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
showguides="false"
|
||||
inkscape:zoom="2.2196812"
|
||||
inkscape:cx="39.109276"
|
||||
inkscape:cy="132.27753"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="836"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer8" />
|
||||
<defs
|
||||
id="defs4213">
|
||||
<linearGradient
|
||||
osb:paint="solid"
|
||||
id="linearGradient5393">
|
||||
<stop
|
||||
id="stop5395"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<clipPath
|
||||
id="clipPath4831"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<circle
|
||||
style="display:inline;opacity:1;fill:#a00e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="circle4833"
|
||||
cx="883.16943"
|
||||
cy="677.19611"
|
||||
r="229.80969" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4859"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<circle
|
||||
style="display:inline;opacity:1;fill:#a00e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="circle4861"
|
||||
cx="883.16943"
|
||||
cy="677.19611"
|
||||
r="229.80969" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath5624"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g5626"
|
||||
transform="matrix(0.3835576,0,0,0.3835576,-250.60108,-156.11014)">
|
||||
<path
|
||||
sodipodi:nodetypes="ccsssc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5628"
|
||||
d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z"
|
||||
style="display:inline;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<circle
|
||||
transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)"
|
||||
clip-path="url(#clipPath4859)"
|
||||
r="229.80969"
|
||||
cy="677.19611"
|
||||
cx="883.16943"
|
||||
id="circle5630"
|
||||
style="display:inline;opacity:1;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath10653">
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g10655"
|
||||
transform="matrix(0.3835576,0,0,0.3835576,-250.60108,-156.11015)"
|
||||
inkscape:export-xdpi="100"
|
||||
inkscape:export-ydpi="100">
|
||||
<path
|
||||
sodipodi:nodetypes="ccsssc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path10657"
|
||||
d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z"
|
||||
style="display:inline;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<circle
|
||||
transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)"
|
||||
clip-path="url(#clipPath4859)"
|
||||
r="229.80969"
|
||||
cy="677.19611"
|
||||
cx="883.16943"
|
||||
id="circle10659"
|
||||
style="display:inline;opacity:1;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
</clipPath>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3913"
|
||||
id="radialGradient3883"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.68662089,-0.30388739,0.24146012,0.54605188,-300.74233,-264.46964)"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3913">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3915" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3917" />
|
||||
</linearGradient>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath5315">
|
||||
<g
|
||||
inkscape:export-ydpi="100"
|
||||
inkscape:export-xdpi="100"
|
||||
transform="matrix(0.3835576,0,0,0.3835576,-246.60108,-156.11013)"
|
||||
id="g5317"
|
||||
style="display:inline;fill:#00a000;fill-opacity:1">
|
||||
<path
|
||||
style="display:inline;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z"
|
||||
id="path5319"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccsssc" />
|
||||
<circle
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="circle5321"
|
||||
cx="883.16943"
|
||||
cy="677.19611"
|
||||
r="229.80969"
|
||||
clip-path="url(#clipPath4859)"
|
||||
transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)" />
|
||||
</g>
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath6882">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6884"
|
||||
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath6886">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6888"
|
||||
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath6890">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6892"
|
||||
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath6894">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6896"
|
||||
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath6898">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6900"
|
||||
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath6902">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6904"
|
||||
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath6906">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6908"
|
||||
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath6910">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6912"
|
||||
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter5640"
|
||||
x="-0.012227737"
|
||||
width="1.0244555"
|
||||
y="-0.011780591"
|
||||
height="1.0235612">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.9782166"
|
||||
id="feGaussianBlur5642" />
|
||||
</filter>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath5745">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5747"
|
||||
d="M 99.908581,-2.3831968e-4 A 95.889392,95.889392 0 0 0 4.0199102,95.888436 95.889392,95.889392 0 0 0 99.908581,191.77906 95.889392,95.889392 0 0 0 142.61366,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 L 183.8285,142.24002 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.79921,95.888466 95.889392,95.889392 0 0 0 99.908581,-2.0831968e-4 Z"
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<metadata
|
||||
id="metadata4216">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer9"
|
||||
inkscape:label="shaddow"
|
||||
transform="translate(-4,2.6816164)"
|
||||
style="display:inline">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6914"
|
||||
d="M 104.88867,0.06226191 A 95.889392,95.889392 0 0 0 8.9999996,95.950936 95.889392,95.889392 0 0 0 104.88867,191.84156 95.889392,95.889392 0 0 0 147.59375,181.76343 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 200.7793,95.950966 95.889392,95.889392 0 0 0 104.88867,0.06229191 Z"
|
||||
style="display:inline;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter5640)" />
|
||||
</g>
|
||||
<g
|
||||
style="display:inline"
|
||||
inkscape:label="bubble"
|
||||
id="layer4"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-4,2.6816348)">
|
||||
<path
|
||||
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="M 104.88867,-1.9377566 A 95.889392,95.889392 0 0 0 8.9999996,93.950918 95.889392,95.889392 0 0 0 104.88867,189.84154 95.889392,95.889392 0 0 0 147.59375,179.76341 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 L 188.80859,140.3025 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 200.7793,93.950948 95.889392,95.889392 0 0 0 104.88867,-1.9377266 Z"
|
||||
id="circle6661"
|
||||
inkscape:connector-curvature="0" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:125px;line-height:1000%;font-family:Sans;letter-spacing:-10.89000034px;word-spacing:5px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="85.862968"
|
||||
y="-55.271603"
|
||||
id="text6634"
|
||||
sodipodi:linespacing="1000%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan6636"
|
||||
x="85.862968"
|
||||
y="-55.271603" /></text>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer8"
|
||||
inkscape:label="dotted line"
|
||||
style="display:inline"
|
||||
transform="translate(-4,2.6816164)">
|
||||
<path
|
||||
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath6910)"
|
||||
d="m 145.16406,11.183594 -5.13232,9.649402 c -0.77924,1.465076 -0.65974,2.41396 0.66876,3.18097 9.66686,5.488467 18.12303,12.874168 24.86104,21.711122 1.05534,1.616079 2.08054,1.713076 3.67763,0.571565 L 178.04883,40 C 169.45271,27.990203 158.19857,18.128379 145.16406,11.183594 Z"
|
||||
id="path7364"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csccscc"
|
||||
transform="translate(4.9999996,-1.9374999)" />
|
||||
<path
|
||||
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath6906)"
|
||||
d="m 193.80469,75.615234 -9.62713,2.062751 c -2.66266,0.570512 -3.40763,1.172953 -2.90593,3.917433 0.85823,4.714633 1.30424,9.497137 1.33189,14.293254 -0.028,5.578758 -0.62194,11.137108 -1.77093,16.589918 -0.86591,3.23162 0.13682,3.77092 3.16149,4.58138 l 8.98639,2.30136 c 1.98177,-7.66828 3.00584,-15.55255 3.04883,-23.472658 -0.0187,-6.817681 -0.76446,-13.613926 -2.22461,-20.273438 z"
|
||||
id="path7366"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csccccccc"
|
||||
transform="translate(4.9999996,-1.9374999)" />
|
||||
<path
|
||||
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath6902)"
|
||||
d="m 14.264281,102.76512 -10.2076406,0.87943 c 1.2093798,14.83154 5.8540346,29.17808 13.5664056,41.90429 l 8.544301,-5.23239 c 2.394983,-1.46665 1.895406,-3.37834 0.986202,-5.04513 -5.118253,-9.40257 -8.359018,-19.71635 -9.536202,-30.36553 0,-2.09418 -1.881577,-2.26744 -3.353066,-2.14067 z"
|
||||
id="path7372"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sccsccs"
|
||||
transform="translate(4.9999996,-1.9374999)" />
|
||||
<path
|
||||
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath6898)"
|
||||
d="m 51.504371,166.60235 -5.82273,8.50898 c 12.710503,8.71282 27.333669,14.23394 42.630859,16.0957 l 1.220329,-9.90843 c 0.355066,-2.88295 -1.085712,-3.52946 -3.332252,-3.90256 -10.402329,-1.73697 -20.373956,-5.45322 -29.373754,-10.94516 -1.647505,-1.06744 -3.639993,-2.30718 -5.322452,0.15147 z"
|
||||
id="path7370"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sccsccs"
|
||||
transform="translate(4.9999996,-1.9374999)" />
|
||||
<path
|
||||
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath6894)"
|
||||
d="M 32.208984,27.683594 C 21.779177,38.079001 13.883707,50.736882 9.1347656,64.675781 L 19.33617,68.090365 c 1.658147,0.55501 2.832564,-0.120955 3.374272,-1.591979 3.777598,-10.021698 9.470788,-19.210103 16.759132,-27.052307 1.561136,-1.561136 1.567283,-2.960058 0.447507,-4.076606 z"
|
||||
id="path7374"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccsccsc"
|
||||
transform="translate(4.9999996,-1.9374999)" />
|
||||
<path
|
||||
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath6890)"
|
||||
d="M 99.888672,-0.25 C 87.701045,-0.2239408 75.630114,2.1252837 64.322266,6.671875 l 3.530435,8.74898 c 1.063314,2.635062 1.616754,3.526314 4.973913,2.352259 8.692057,-3.031338 17.839027,-4.588849 27.062058,-4.599286 5.555828,0 6.486278,0.350026 6.780788,-3.4460223 l 0.74851,-9.64772758 C 104.9135,-0.12857239 102.40179,-0.23868346 99.888672,-0.25 Z"
|
||||
id="path7376"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccsccscc"
|
||||
transform="translate(4.9999996,-1.9374999)" />
|
||||
<path
|
||||
style="display:inline;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath6886)"
|
||||
d="m 138.72416,168.48439 c -4.17634,2.25458 -8.55959,4.09055 -13.0504,5.63418 -1.00363,0.34498 -1.20742,1.18222 -0.8682,2.27372 l 3.44056,11.0706 c 4.92985,-1.53124 9.72799,-3.45808 14.34766,-5.76172 l 0.12695,0.0137 14.0293,5.44532 4.12174,-10.20577 c 0.7548,-1.86894 -0.0184,-2.7016 -1.59462,-3.31324 l -14.72114,-5.71251 c -1.86679,-0.7244 -3.68834,-0.60144 -5.83185,0.55572 z"
|
||||
id="path5005"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cssccccsssc"
|
||||
transform="translate(4.9999996,-1.9374999)" />
|
||||
<path
|
||||
style="display:inline;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath6882)"
|
||||
d="m 186.53125,152.80469 -10.6386,2.70888 c -0.78879,0.20085 -1.67397,1.02386 -1.35494,2.33801 l 9.75918,40.15428 c 8.56713,5.97538 15.30408,3.06731 11.01563,-9.47266 z"
|
||||
id="path5071"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cssccc"
|
||||
transform="translate(4.9999996,-1.9374999)" />
|
||||
</g>
|
||||
<g
|
||||
style="display:inline"
|
||||
inkscape:label="dots"
|
||||
id="layer2"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-4,2.6816348)">
|
||||
<g
|
||||
inkscape:export-ydpi="100"
|
||||
inkscape:export-xdpi="100"
|
||||
style="fill:#f5f5f5;fill-opacity:1"
|
||||
transform="matrix(0.3835576,0,0,0.3835576,-248.17635,-138.86977)"
|
||||
id="g5126">
|
||||
<circle
|
||||
r="27.299093"
|
||||
style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-4"
|
||||
cx="799.11273"
|
||||
cy="609.86285" />
|
||||
<circle
|
||||
r="27.299093"
|
||||
style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-1-2"
|
||||
cx="918.91962"
|
||||
cy="609.86285" />
|
||||
<circle
|
||||
r="27.299093"
|
||||
style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-1-8-6"
|
||||
cx="1039.0352"
|
||||
cy="609.86285" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="light"
|
||||
style="display:inline"
|
||||
transform="translate(-4,2.6816164)">
|
||||
<path
|
||||
style="display:inline;opacity:0.19211821;fill:url(#radialGradient3883);fill-opacity:1;stroke:none"
|
||||
d="m 192.44891,47.715674 c -61.69765,0 -111.704333,49.103472 -111.704333,109.668976 0,12.77573 2.228815,25.0414 6.321575,36.4393 5.069139,0.70557 10.251828,1.06876 15.514978,1.06876 18.80489,0 30.91434,7.28449 47.46533,1.26909 l 54.00234,6.06606 c 5.24363,2.11897 11.63381,1.37954 10.27166,-4.11162 l -14.23663,-57.56735 c 9.15073,-16.06873 12.27539,-34.36633 12.27539,-53.240271 0,-13.72556 -2.63167,-26.842322 -7.42478,-38.909717 -4.09925,-0.447474 -8.2658,-0.683228 -12.48553,-0.683228 z"
|
||||
id="path3878"
|
||||
inkscape:connector-curvature="0"
|
||||
clip-path="url(#clipPath5745)"
|
||||
transform="translate(4.9800894,-1.9374999)"
|
||||
sodipodi:nodetypes="sscsccccscs" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 25 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_notifications_none_white80.svg">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1543"
|
||||
inkscape:window-height="1093"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="12"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-2 1H8v-6c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6z"
|
||||
id="path4"
|
||||
style="fill:#ffffff;fill-opacity:1;opacity:0.8" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_notifications_off_white80.svg">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1244"
|
||||
inkscape:window-height="936"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="12"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z"
|
||||
id="path4"
|
||||
style="fill:#ffffff;fill-opacity:1;opacity:0.8" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_notifications_paused_white80.svg">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1375"
|
||||
inkscape:window-height="999"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="12"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.93 6 11v5l-2 2v1h16v-1l-2-2zm-3.5-6.2l-2.8 3.4h2.8V15h-5v-1.8l2.8-3.4H9.5V8h5v1.8z"
|
||||
id="path4"
|
||||
style="fill:#ffffff;fill-opacity:1;opacity:0.8" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg32"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_notifications_white80.svg">
|
||||
<metadata
|
||||
id="metadata40">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs38" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1471"
|
||||
inkscape:window-height="985"
|
||||
id="namedview36"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="12"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg32" />
|
||||
<path
|
||||
d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"
|
||||
id="path34"
|
||||
style="fill:#ffffff;fill-opacity:1;opacity:0.8" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_send_cancel_offline_white.svg">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1080"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="-36.305085"
|
||||
inkscape:cy="23.898305"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm10 27.17L31.17 34 24 26.83 16.83 34 14 31.17 21.17 24 14 16.83 16.83 14 24 21.17 31.17 14 34 16.83 26.83 24 34 31.17z"
|
||||
id="path4"
|
||||
style="fill:#ffffff;fill-opacity:0.627451" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_send_location_offline_white.svg">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="956"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="-36.305085"
|
||||
inkscape:cy="23.898305"
|
||||
inkscape:window-x="2880"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M24 4c-7.73 0-14 6.27-14 14 0 10.5 14 26 14 26s14-15.5 14-26c0-7.73-6.27-14-14-14zm0 19c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"
|
||||
id="path4"
|
||||
style="fill:#ffffff;fill-opacity:0.627451" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_send_photo_offline_white.svg">
|
||||
<metadata
|
||||
id="metadata12">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="956"
|
||||
inkscape:window-height="567"
|
||||
id="namedview8"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="10.5688"
|
||||
inkscape:cy="23.898305"
|
||||
inkscape:window-x="960"
|
||||
inkscape:window-y="609"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<circle
|
||||
cx="24"
|
||||
cy="24"
|
||||
r="6.4"
|
||||
id="circle4"
|
||||
style="fill:#ffffff;fill-opacity:0.627451" />
|
||||
<path
|
||||
d="M18 4l-3.66 4H8c-2.21 0-4 1.79-4 4v24c0 2.21 1.79 4 4 4h32c2.21 0 4-1.79 4-4V12c0-2.21-1.79-4-4-4h-6.34L30 4H18zm6 30c-5.52 0-10-4.48-10-10s4.48-10 10-10 10 4.48 10 10-4.48 10-10 10z"
|
||||
id="path6"
|
||||
style="fill:#ffffff;fill-opacity:0.627451" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1,55 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_send_picture_offline_white.svg">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1392"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="-21.864407"
|
||||
inkscape:cy="23.898305"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M42 38V10c0-2.21-1.79-4-4-4H10c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h28c2.21 0 4-1.79 4-4zM17 27l5 6.01L29 24l9 12H10l7-9z"
|
||||
id="path4"
|
||||
style="fill:#ffffff;fill-opacity:0.627451" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1,70 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg3621"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
width="96"
|
||||
height="96"
|
||||
sodipodi:docname="ic_send_text_offline_white.svg"
|
||||
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-xxhdpi/ic_action_send_now_online.png"
|
||||
inkscape:export-xdpi="154.28572"
|
||||
inkscape:export-ydpi="154.28572">
|
||||
<metadata
|
||||
id="metadata3627">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3625" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1344"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview3623"
|
||||
showgrid="true"
|
||||
showguides="true"
|
||||
inkscape:zoom="8"
|
||||
inkscape:cx="31.783303"
|
||||
inkscape:cy="56.698828"
|
||||
inkscape:window-x="2880"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg3621"
|
||||
inkscape:snap-others="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3631" />
|
||||
</sodipodi:namedview>
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:0.627451;stroke:none"
|
||||
d="M 3.887575,4.1549246 90.999747,47.676331 3.887575,91.286663 13.203552,52.344101 63.012683,47.720794 13.203552,43.008558 Z"
|
||||
id="path3633"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-mdpi/ic_action_send_now_dnd.png"
|
||||
inkscape:export-xdpi="51.42857"
|
||||
inkscape:export-ydpi="51.42857" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_send_voice_offline_white.svg">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1516"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="-36.711864"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-x="2880"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M24 30c3.31 0 5.98-2.69 5.98-6L30 12c0-3.32-2.68-6-6-6-3.31 0-6 2.68-6 6v12c0 3.31 2.69 6 6 6zm10.6-6c0 6-5.07 10.2-10.6 10.2-5.52 0-10.6-4.2-10.6-10.2H10c0 6.83 5.44 12.47 12 13.44V44h4v-6.56c6.56-.97 12-6.61 12-13.44h-3.4z"
|
||||
id="path4"
|
||||
style="fill:#ffffff;fill-opacity:0.627451" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ic_verified_fingerprint.svg">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1156"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="-3.3559322"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="20"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M24 2L6 10v12c0 11.11 7.67 21.47 18 24 10.33-2.53 18-12.89 18-24V10L24 2zm-4 32l-8-8 2.83-2.83L20 28.34l13.17-13.17L36 18 20 34z"
|
||||
id="path4"
|
||||
style="fill:#259b24;fill-opacity:0.87" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1 @@
|
|||
ic_launcher.svg
|
|
@ -0,0 +1,156 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="md_switch_thumb_disable_centered_square.svg"
|
||||
viewBox="0 0 120 120"
|
||||
height="120"
|
||||
width="120"
|
||||
inkscape:version="0.91 r13725"
|
||||
version="1.1"
|
||||
id="svg2">
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs6">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4222">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4224" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4226" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4179"
|
||||
osb:paint="gradient">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4181" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.25454545"
|
||||
offset="1"
|
||||
id="stop4183" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4222"
|
||||
id="linearGradient4228"
|
||||
x1="159.38722"
|
||||
y1="19.802504"
|
||||
x2="212.27522"
|
||||
y2="19.802504"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-260.32215,163.27594)" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4230"
|
||||
x="-0.012"
|
||||
width="1.024"
|
||||
y="-0.012"
|
||||
height="1.024">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.25916904"
|
||||
id="feGaussianBlur4232" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4371"
|
||||
x="-0.23999999"
|
||||
width="1.48"
|
||||
y="-0.23999999"
|
||||
height="1.48">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="5.2888"
|
||||
id="feGaussianBlur4373" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-x="1400"
|
||||
inkscape:cy="61.379767"
|
||||
inkscape:cx="10.572032"
|
||||
inkscape:zoom="3.8530612"
|
||||
showgrid="false"
|
||||
id="namedview4"
|
||||
inkscape:window-height="1024"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="PNG"
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true"
|
||||
transform="translate(0,-2.5)" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="SVG"
|
||||
style="display:inline"
|
||||
transform="translate(0,-2.5)">
|
||||
<g
|
||||
id="g6404">
|
||||
<circle
|
||||
style="opacity:1;fill:#000404;fill-opacity:0.45531915;stroke:none;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4371)"
|
||||
id="circle4234"
|
||||
cx="59.999996"
|
||||
cy="66.499878"
|
||||
r="26.444" />
|
||||
<g
|
||||
transform="translate(3.3103058e-6,0.33229253)"
|
||||
id="g4148">
|
||||
<circle
|
||||
style="opacity:1;fill:#bdbdbd;fill-opacity:1;stroke:#bdbdbd;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path4218"
|
||||
cx="59.999996"
|
||||
cy="62.167587"
|
||||
r="25.916904" />
|
||||
<circle
|
||||
r="25.916904"
|
||||
cy="183.07845"
|
||||
cx="-74.490921"
|
||||
id="circle4220"
|
||||
style="opacity:0.3;fill:none;fill-opacity:1;stroke:url(#linearGradient4228);stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4230)"
|
||||
transform="matrix(0,-1,1,0,-123.07845,-12.323334)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
|
@ -0,0 +1,153 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="md_switch_thumb_off_normal_centered.svg"
|
||||
viewBox="0 0 120 120"
|
||||
height="120"
|
||||
width="120"
|
||||
inkscape:version="0.91 r13725"
|
||||
version="1.1"
|
||||
id="svg2">
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs6">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4222">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4224" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4226" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4179"
|
||||
osb:paint="gradient">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4181" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.25454545"
|
||||
offset="1"
|
||||
id="stop4183" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4222"
|
||||
id="linearGradient4228"
|
||||
x1="159.38722"
|
||||
y1="19.802504"
|
||||
x2="212.27522"
|
||||
y2="19.802504"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-260.32215,163.27594)" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4230"
|
||||
x="-0.012"
|
||||
width="1.024"
|
||||
y="-0.012"
|
||||
height="1.024">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.25916904"
|
||||
id="feGaussianBlur4232" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4371"
|
||||
x="-0.23999999"
|
||||
width="1.48"
|
||||
y="-0.23999999"
|
||||
height="1.48">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="5.2888"
|
||||
id="feGaussianBlur4373" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-x="1400"
|
||||
inkscape:cy="61.379767"
|
||||
inkscape:cx="10.052965"
|
||||
inkscape:zoom="3.8530612"
|
||||
showgrid="false"
|
||||
id="namedview4"
|
||||
inkscape:window-height="1024"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="PNG"
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true"
|
||||
transform="translate(0,-2.5)" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="SVG"
|
||||
style="display:inline"
|
||||
transform="translate(0,-2.5)">
|
||||
<circle
|
||||
r="26.444"
|
||||
cy="66.5"
|
||||
cx="59.999996"
|
||||
id="circle4234"
|
||||
style="opacity:1;fill:#000404;fill-opacity:0.45531915;stroke:none;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4371)" />
|
||||
<g
|
||||
id="g6390"
|
||||
transform="translate(3.3103058e-6,-0.91758577)">
|
||||
<circle
|
||||
r="25.916904"
|
||||
cy="63.417587"
|
||||
cx="59.999996"
|
||||
id="path4218"
|
||||
style="opacity:1;fill:#fafafa;fill-opacity:1;stroke:#fafafa;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
transform="matrix(0,-1,1,0,-123.07845,-11.073334)"
|
||||
style="opacity:0.3;fill:none;fill-opacity:1;stroke:url(#linearGradient4228);stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4230)"
|
||||
id="circle4220"
|
||||
cx="-74.490921"
|
||||
cy="183.07845"
|
||||
r="25.916904" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
|
@ -0,0 +1,159 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="md_switch_thumb_off_pressed_centered.svg"
|
||||
viewBox="0 0 120 120"
|
||||
height="120"
|
||||
width="120"
|
||||
inkscape:version="0.91 r13725"
|
||||
version="1.1"
|
||||
id="svg2">
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs6">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4222">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4224" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4226" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4179"
|
||||
osb:paint="gradient">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4181" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.25454545"
|
||||
offset="1"
|
||||
id="stop4183" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4222"
|
||||
id="linearGradient4228"
|
||||
x1="159.38722"
|
||||
y1="19.802504"
|
||||
x2="212.27522"
|
||||
y2="19.802504"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-260.32215,163.27594)" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4230"
|
||||
x="-0.012"
|
||||
width="1.024"
|
||||
y="-0.012"
|
||||
height="1.024">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.25916904"
|
||||
id="feGaussianBlur4232" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4371"
|
||||
x="-0.23999999"
|
||||
width="1.48"
|
||||
y="-0.23999999"
|
||||
height="1.48">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="5.2888"
|
||||
id="feGaussianBlur4373" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-x="1400"
|
||||
inkscape:cy="61.379767"
|
||||
inkscape:cx="10.572032"
|
||||
inkscape:zoom="3.8530612"
|
||||
showgrid="false"
|
||||
id="namedview4"
|
||||
inkscape:window-height="1024"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="PNG"
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true"
|
||||
transform="translate(0,-2.5)" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="SVG"
|
||||
style="display:inline"
|
||||
transform="translate(0,-2.5)">
|
||||
<circle
|
||||
style="opacity:1;fill:#313131;fill-opacity:0.10196078;fill-rule:nonzero;stroke:none;stroke-width:1.00100005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.10196078"
|
||||
id="path4819"
|
||||
cx="60"
|
||||
cy="62.5"
|
||||
r="60" />
|
||||
<circle
|
||||
r="26.444"
|
||||
cy="66.5"
|
||||
cx="59.999996"
|
||||
id="circle4234"
|
||||
style="opacity:1;fill:#000404;fill-opacity:0.45531915;stroke:none;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4371)" />
|
||||
<g
|
||||
id="g6417"
|
||||
transform="translate(3.3103058e-6,-0.91758577)">
|
||||
<circle
|
||||
r="25.916904"
|
||||
cy="63.417587"
|
||||
cx="59.999996"
|
||||
id="path4218"
|
||||
style="opacity:1;fill:#fafafa;fill-opacity:1;stroke:#fafafa;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
transform="matrix(0,-1,1,0,-123.07845,-11.073334)"
|
||||
style="opacity:0.3;fill:none;fill-opacity:1;stroke:url(#linearGradient4228);stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4230)"
|
||||
id="circle4220"
|
||||
cx="-74.490921"
|
||||
cy="183.07845"
|
||||
r="25.916904" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.0 KiB |
|
@ -0,0 +1,146 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="md_switch_thumb_on_normal_centered_square.svg"
|
||||
viewBox="0 0 120 120"
|
||||
height="120"
|
||||
width="120"
|
||||
inkscape:version="0.91 r13725"
|
||||
version="1.1"
|
||||
id="svg2">
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs6">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4222">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4224" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4226" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4179"
|
||||
osb:paint="gradient">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4181" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.25454545"
|
||||
offset="1"
|
||||
id="stop4183" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4222"
|
||||
id="linearGradient4228"
|
||||
x1="159.38722"
|
||||
y1="19.802504"
|
||||
x2="212.27522"
|
||||
y2="19.802504"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-260.32215,163.27594)" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4230"
|
||||
x="-0.012"
|
||||
width="1.024"
|
||||
y="-0.012"
|
||||
height="1.024">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.25916904"
|
||||
id="feGaussianBlur4232" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4371"
|
||||
x="-0.23999999"
|
||||
width="1.48"
|
||||
y="-0.23999999"
|
||||
height="1.48">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="5.2888"
|
||||
id="feGaussianBlur4373" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-x="1400"
|
||||
inkscape:cy="61.379767"
|
||||
inkscape:cx="-14.397519"
|
||||
inkscape:zoom="3.8530612"
|
||||
showgrid="false"
|
||||
id="namedview4"
|
||||
inkscape:window-height="1024"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="SVG"
|
||||
style="display:inline"
|
||||
transform="translate(0,-2.5)">
|
||||
<circle
|
||||
r="26.444"
|
||||
cy="66.499878"
|
||||
cx="59.999996"
|
||||
id="circle4234"
|
||||
style="opacity:1;fill:#000404;fill-opacity:0.45531915;stroke:none;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4371)" />
|
||||
<g
|
||||
id="g6440"
|
||||
transform="translate(3.3103058e-6,0.33241423)">
|
||||
<circle
|
||||
r="25.916904"
|
||||
cy="62.167587"
|
||||
cx="59.999996"
|
||||
id="path4218"
|
||||
style="opacity:1;fill:#0091ea;fill-opacity:1;stroke:#0091ea;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
transform="matrix(0,-1,1,0,-123.07845,-12.323334)"
|
||||
style="opacity:0.3;fill:none;fill-opacity:1;stroke:url(#linearGradient4228);stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4230)"
|
||||
id="circle4220"
|
||||
cx="-74.490921"
|
||||
cy="183.07845"
|
||||
r="25.916904" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.5 KiB |
|
@ -0,0 +1,162 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="md_switch_thumb_on_pressed_centered_square.svg"
|
||||
viewBox="0 0 120 120"
|
||||
height="120"
|
||||
width="120"
|
||||
inkscape:version="0.91 r13725"
|
||||
version="1.1"
|
||||
id="svg2">
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs6">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4222">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4224" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4226" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4179"
|
||||
osb:paint="gradient">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4181" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.25454545"
|
||||
offset="1"
|
||||
id="stop4183" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4222"
|
||||
id="linearGradient4228"
|
||||
x1="159.38722"
|
||||
y1="19.802504"
|
||||
x2="212.27522"
|
||||
y2="19.802504"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-260.32215,163.27594)" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4230"
|
||||
x="-0.012"
|
||||
width="1.024"
|
||||
y="-0.012"
|
||||
height="1.024">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.25916904"
|
||||
id="feGaussianBlur4232" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4371"
|
||||
x="-0.23999999"
|
||||
width="1.48"
|
||||
y="-0.23999999"
|
||||
height="1.48">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="5.2888"
|
||||
id="feGaussianBlur4373" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-x="1400"
|
||||
inkscape:cy="61.379767"
|
||||
inkscape:cx="-46.31369"
|
||||
inkscape:zoom="3.8530612"
|
||||
showgrid="false"
|
||||
id="namedview4"
|
||||
inkscape:window-height="1024"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="PNG"
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true"
|
||||
transform="translate(0,-2.5)" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="SVG"
|
||||
style="display:inline"
|
||||
transform="translate(0,-2.5)">
|
||||
<circle
|
||||
style="opacity:1;fill:#0093e8;fill-opacity:0.10196078;fill-rule:nonzero;stroke:none;stroke-width:1.00100005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.10196078"
|
||||
id="path4819"
|
||||
cx="60"
|
||||
cy="62.5"
|
||||
r="60" />
|
||||
<g
|
||||
id="g4156">
|
||||
<circle
|
||||
style="opacity:1;fill:#000404;fill-opacity:0.45531915;stroke:none;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4371)"
|
||||
id="circle4234"
|
||||
cx="59.999996"
|
||||
cy="66.5"
|
||||
r="26.444" />
|
||||
<g
|
||||
transform="translate(3.3103058e-6,0.33241423)"
|
||||
id="g4149">
|
||||
<circle
|
||||
style="opacity:1;fill:#0091ea;fill-opacity:1;stroke:#0091ea;stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path4218"
|
||||
cx="59.999996"
|
||||
cy="62.167587"
|
||||
r="25.916904" />
|
||||
<circle
|
||||
r="25.916904"
|
||||
cy="183.07845"
|
||||
cx="-74.490921"
|
||||
id="circle4220"
|
||||
style="opacity:0.3;fill:none;fill-opacity:1;stroke:url(#linearGradient4228);stroke-width:1.05419147;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4230)"
|
||||
transform="matrix(0,-1,1,0,-123.07845,-12.323334)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.0 KiB |
|
@ -0,0 +1,165 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="36"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="message_bubble_received.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="25.745257"
|
||||
inkscape:cy="9.618802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:window-width="989"
|
||||
inkscape:window-height="755"
|
||||
inkscape:window-x="22"
|
||||
inkscape:window-y="16"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#000000"
|
||||
guideopacity="0.49803922">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1px"
|
||||
spacingy="1px"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="20,26"
|
||||
id="guide3060" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="24,26"
|
||||
id="guide3062" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,22"
|
||||
id="guide3064" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,6"
|
||||
id="guide3066" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="26,0"
|
||||
id="guide3068" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="18,0"
|
||||
id="guide3070" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,10"
|
||||
id="guide3074" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,8"
|
||||
id="guide3076" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(0,-2)">
|
||||
<g
|
||||
id="g3759"
|
||||
style="fill:#4b9b4a;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
|
||||
<path
|
||||
style="display:none"
|
||||
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
|
||||
id="path3805"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,2)"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2989"
|
||||
d="M 4,4 16,16 16,4 z"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<rect
|
||||
ry="2"
|
||||
y="4"
|
||||
x="12"
|
||||
height="20"
|
||||
width="20"
|
||||
id="rect2987" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,165 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="36"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="message_bubble_received.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="25.745257"
|
||||
inkscape:cy="9.618802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:window-width="989"
|
||||
inkscape:window-height="755"
|
||||
inkscape:window-x="22"
|
||||
inkscape:window-y="16"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#000000"
|
||||
guideopacity="0.49803922">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1px"
|
||||
spacingy="1px"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="20,26"
|
||||
id="guide3060" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="24,26"
|
||||
id="guide3062" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,22"
|
||||
id="guide3064" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,6"
|
||||
id="guide3066" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="26,0"
|
||||
id="guide3068" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="18,0"
|
||||
id="guide3070" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,10"
|
||||
id="guide3074" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,8"
|
||||
id="guide3076" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(0,-2)">
|
||||
<g
|
||||
id="g3759"
|
||||
style="fill:#326130;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
|
||||
<path
|
||||
style="display:none"
|
||||
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
|
||||
id="path3805"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,2)"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2989"
|
||||
d="M 4,4 16,16 16,4 z"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<rect
|
||||
ry="2"
|
||||
y="4"
|
||||
x="12"
|
||||
height="20"
|
||||
width="20"
|
||||
id="rect2987" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,167 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="36"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="message_bubble_received_grey.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="-9.879743"
|
||||
inkscape:cy="9.618802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer"
|
||||
showgrid="true"
|
||||
inkscape:window-width="2135"
|
||||
inkscape:window-height="911"
|
||||
inkscape:window-x="22"
|
||||
inkscape:window-y="16"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#000000"
|
||||
guideopacity="0.49803922">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1px"
|
||||
spacingy="1px"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="20,26"
|
||||
id="guide3060" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="24,26"
|
||||
id="guide3062" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,22"
|
||||
id="guide3064" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,6"
|
||||
id="guide3066" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="26,0"
|
||||
id="guide3068" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="18,0"
|
||||
id="guide3070" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,10"
|
||||
id="guide3074" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,8"
|
||||
id="guide3076" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(0,-2)">
|
||||
<g
|
||||
id="g3759"
|
||||
style="fill:#424242;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
|
||||
<path
|
||||
style="display:none;fill:#424242;fill-opacity:1"
|
||||
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
|
||||
id="path3805"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,2)"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2989"
|
||||
d="M 4,4 16,16 16,4 z"
|
||||
sodipodi:nodetypes="cccc"
|
||||
style="fill:#424242;fill-opacity:1" />
|
||||
<rect
|
||||
ry="2"
|
||||
y="4"
|
||||
x="12"
|
||||
height="20"
|
||||
width="20"
|
||||
id="rect2987"
|
||||
style="fill:#424242;fill-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
|
@ -0,0 +1,165 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="36"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="message_bubble_received.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="25.745257"
|
||||
inkscape:cy="9.618802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:window-width="989"
|
||||
inkscape:window-height="755"
|
||||
inkscape:window-x="22"
|
||||
inkscape:window-y="16"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#000000"
|
||||
guideopacity="0.49803922">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1px"
|
||||
spacingy="1px"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="20,26"
|
||||
id="guide3060" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="24,26"
|
||||
id="guide3062" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,22"
|
||||
id="guide3064" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,6"
|
||||
id="guide3066" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="26,0"
|
||||
id="guide3068" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="18,0"
|
||||
id="guide3070" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,10"
|
||||
id="guide3074" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,8"
|
||||
id="guide3076" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(0,-2)">
|
||||
<g
|
||||
id="g3759"
|
||||
style="fill:#c64545;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
|
||||
<path
|
||||
style="display:none"
|
||||
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
|
||||
id="path3805"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,2)"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2989"
|
||||
d="M 4,4 16,16 16,4 z"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<rect
|
||||
ry="2"
|
||||
y="4"
|
||||
x="12"
|
||||
height="20"
|
||||
width="20"
|
||||
id="rect2987" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,165 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="36"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="message_bubble_received.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="25.745257"
|
||||
inkscape:cy="9.618802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:window-width="989"
|
||||
inkscape:window-height="755"
|
||||
inkscape:window-x="22"
|
||||
inkscape:window-y="16"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#000000"
|
||||
guideopacity="0.49803922">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1px"
|
||||
spacingy="1px"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="20,26"
|
||||
id="guide3060" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="24,26"
|
||||
id="guide3062" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,22"
|
||||
id="guide3064" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,6"
|
||||
id="guide3066" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="26,0"
|
||||
id="guide3068" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="18,0"
|
||||
id="guide3070" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,10"
|
||||
id="guide3074" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,8"
|
||||
id="guide3076" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(0,-2)">
|
||||
<g
|
||||
id="g3759"
|
||||
style="fill:#fafafa;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
|
||||
<path
|
||||
style="display:none"
|
||||
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
|
||||
id="path3805"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,2)"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2989"
|
||||
d="M 4,4 16,16 16,4 z"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<rect
|
||||
ry="2"
|
||||
y="4"
|
||||
x="12"
|
||||
height="20"
|
||||
width="20"
|
||||
id="rect2987" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,165 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="36"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="message_bubble_sent.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="14.269338"
|
||||
inkscape:cy="16.118802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:window-width="989"
|
||||
inkscape:window-height="755"
|
||||
inkscape:window-x="434"
|
||||
inkscape:window-y="16"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#404040"
|
||||
guideopacity="0.49803922">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1px"
|
||||
spacingy="1px"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="12,26"
|
||||
id="guide3146" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="16,26"
|
||||
id="guide3148" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,22"
|
||||
id="guide3150" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,6"
|
||||
id="guide3152" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="18,0"
|
||||
id="guide3154" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="10,0"
|
||||
id="guide3160" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,20"
|
||||
id="guide3162" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,18"
|
||||
id="guide3164" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(0,-2)">
|
||||
<g
|
||||
id="g3759"
|
||||
style="fill:#fafafa;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
|
||||
<path
|
||||
style="display:none"
|
||||
d="M 28,18 C 26,16 24,12 24,8 l -4,10 z"
|
||||
id="path3809"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,2)"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2989"
|
||||
d="m 20,12 0,12 12,0 z"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<rect
|
||||
ry="2"
|
||||
y="4"
|
||||
x="4"
|
||||
height="20"
|
||||
width="20"
|
||||
id="rect2987" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,167 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="36"
|
||||
height="26"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="message_bubble_sent_grey.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
x="-0.25"
|
||||
y="-0.25"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter3811"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feFlood
|
||||
flood-opacity="0.25"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood3813" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite3815" />
|
||||
<feGaussianBlur
|
||||
stdDeviation="0.5"
|
||||
result="blur"
|
||||
id="feGaussianBlur3817" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset3819" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite3821" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="6.244862"
|
||||
inkscape:cy="16.118802"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1554"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="878"
|
||||
inkscape:window-y="369"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
guidecolor="#404040"
|
||||
guideopacity="0.49803922">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="4"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="1px"
|
||||
spacingy="1px"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
color="#0000ff"
|
||||
opacity="0.03137255" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="12,26"
|
||||
id="guide3146" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="16,26"
|
||||
id="guide3148" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,22"
|
||||
id="guide3150" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="36,6"
|
||||
id="guide3152" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="18,0"
|
||||
id="guide3154" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="10,0"
|
||||
id="guide3160" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,20"
|
||||
id="guide3162" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="0,18"
|
||||
id="guide3164" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer"
|
||||
transform="translate(0,-2)">
|
||||
<g
|
||||
id="g3759"
|
||||
style="fill:#424242;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
|
||||
<path
|
||||
style="display:none;fill:#424242;fill-opacity:1"
|
||||
d="M 28,18 C 26,16 24,12 24,8 l -4,10 z"
|
||||
id="path3809"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,2)"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2989"
|
||||
d="m 20,12 0,12 12,0 z"
|
||||
sodipodi:nodetypes="cccc"
|
||||
style="fill:#424242;fill-opacity:1" />
|
||||
<rect
|
||||
ry="2"
|
||||
y="4"
|
||||
x="4"
|
||||
height="20"
|
||||
width="20"
|
||||
id="rect2987"
|
||||
style="fill:#424242;fill-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
|
@ -0,0 +1,273 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg4196"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
width="2367.5596"
|
||||
height="1451.5084"
|
||||
viewBox="0 0 2367.5595 1451.5084"
|
||||
sodipodi:docname="omemo_logo.svg">
|
||||
<metadata
|
||||
id="metadata4202">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs4200">
|
||||
<linearGradient
|
||||
id="linearGradient4245"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4247" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="836"
|
||||
id="namedview4198"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.32"
|
||||
inkscape:cx="1158.7782"
|
||||
inkscape:cy="667.71025"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4196"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 1160.235,302.29735 271.9745,-131.35135 186.9826,134.44197 24.7249,151.44038 -86.5373,135.98729 z"
|
||||
id="path4267"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#f57c00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 598.8809,1125.9476 -43.05491,131.8557 -21.52745,94.8553 4.0364,47.0913 67.27328,6.7273 80.72795,-58.5277 43.72764,-78.7098 7.40006,-55.1641 -21.52745,-71.9824 z"
|
||||
id="path4259"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 709.52231,1171.4517 C 480.05218,1174.9052 321.72113,1008.3849 269.81593,895.97589 206.11648,758.02449 215.35674,596.92706 303.94612,450.17116 390.00741,320.24292 538.03872,188.34494 665.64434,170.1992 c 86.87989,-10.63238 215.40898,15.76659 250.11793,24.23821 35.046,8.55388 138.10213,41.16536 192.58973,67.91907 53.5186,26.27793 164.698,69.05834 309.1218,196.39025 100.3317,88.4579 183.2875,109.97875 279.7545,106.68109 52.9405,-1.80973 148.8273,-10.56706 171.5302,-24.72865 679.9746,-424.15329 639.4516,799.03733 13.1124,405.39142 -158.3183,-74.1014 -440.1478,10.5521 -637.0436,91.78671 -223.8429,92.3524 -350.01628,130.7858 -535.30499,133.5744 z"
|
||||
id="path4225"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ssccssssscss"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 2121.4484,451.36293 c -26.791,-0.0103 -69.7877,2.87028 -101.1871,10.73905 -68.1167,46.199 -138.5457,83.35128 -167.446,144.67176 -12.1866,25.8575 -15.1986,221.06115 -3.3883,250.53885 22.0574,55.0538 36.5353,68.5186 75.8437,113.5484 490.8133,255.43581 586.5854,-519.34849 196.1777,-519.49806 z"
|
||||
id="path4225-4"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093"
|
||||
sodipodi:nodetypes="scsscs" />
|
||||
<path
|
||||
style="fill:#f57c00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1879.4205,872.05219 c -30.0884,-43.2017 -23.0447,-213.01732 -11.2518,-239.49258 19.553,-43.89704 110.0168,-119.19707 177.1545,-153.50421 62.2867,-31.14337 245.3285,107.06591 242.3844,259.61033 -2.4489,126.88796 -74.9751,256.91706 -216.1596,260.51446 -95.0727,-15.7629 -143.2721,-56.9801 -192.1275,-127.128 z"
|
||||
id="path4313"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sscscs"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#f57c00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 712.41248,50.975873 130.5787,23.17966 80.35619,97.354527 11.5898,38.63275 -335.33229,-24.72496 56.4038,-112.807627 z"
|
||||
id="path4317"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1414.8968,95.744433 c -119.2326,0.1221 -252.577,46.677797 -357.9883,141.492197 59.2267,85.339 179.6057,681.13776 68.8789,839.94337 91.9688,196.1395 767.4955,273.501 557.166,-210.17391 -15.7049,-36.1151 -49.7142,-108.75426 -41.832,-193.48626 8.4493,-90.8299 56.4409,-192.1808 64.2324,-223.9238 57.3257,-233.5482 -98.225,-354.048497 -290.457,-353.851597 z m -37.9434,48.607397 c 179.9257,-1.202 313.9232,108.10167 295.8852,273.14927 -49.0308,223.244 -65.6093,352.99519 9.7574,506.70029 0.9067,322.06951 -372.1528,246.99471 -531.1856,150.28521 136.0694,-390.78747 -67.0566,-814.79857 -78.5644,-831.62107 107.9381,-67.831 213.0862,-97.9056 304.1074,-98.5137 z"
|
||||
id="path4227-8"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093"
|
||||
sodipodi:nodetypes="sccsssssccccs" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#f57c00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1371.9686,142.84932 c -91.0213,0.60808 -196.1693,30.68269 -304.1075,98.51367 11.5078,16.82249 214.6339,440.83547 78.5645,831.62311 159.0328,96.7094 532.0903,171.7842 531.1836,-150.28521 -75.3667,-153.7051 -47.9691,-295.82084 1.0617,-519.06483 19.5833,-183.59134 -126.7767,-261.98875 -306.7023,-260.78674 z m 42.0957,76.75039 c 158.8265,-0.80887 251.0755,161.9003 140.5517,325.36606 -113.709,-40.69316 -178.0341,-143.3305 -350.0787,-233.47358 73.9173,-58.593 149.3003,-91.58576 209.527,-91.89248 z"
|
||||
id="path4229-6"
|
||||
sodipodi:nodetypes="sccccssccs"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1354.944,727.52278 -6.0809,177.36791 128.2608,-32.6939 7.361,-132.81901 c 65.526,-55.1437 -11.1658,-135.6742 -75.9144,-147.0284 -93.1144,-16.3282 -143.1451,90.3398 -53.6265,135.1734 z"
|
||||
id="path4233"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccsc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 598.8809,1127.2931 c -14.1274,92.1644 -82.99521,244.9415 -51.12771,263.7113 36.46239,21.4761 172.66811,-90.819 192.40161,-197.7835 18.83652,133.4254 -129.0419,247.1826 -195.76526,219.9837 -38.73013,-15.7879 4.93336,-176.7045 54.49136,-285.9115 z"
|
||||
id="path4257"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cscsc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#f57c00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 713.64035,1156.0811 23.95231,78.8109 72.62957,139.0779 118.98884,69.5389 -1.5453,-78.0381 -40.9507,-101.9905 -65.67567,-100.4452 -27.04293,-32.4515 z"
|
||||
id="path4261"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 719.04894,1169.2163 c 9.27185,21.6343 50.66928,211.7208 189.30053,231.7965 30.3325,4.3925 -14.6805,-140.6232 -105.85379,-251.8855 102.24809,93.7488 161.32989,298.1418 122.07959,299.7901 C 810.58,1453.7045 732.44164,1267.601 719.04894,1169.2163 Z"
|
||||
id="path4255"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cscsc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#f57c00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 234.13659,657.90289 -48.22924,-33.49254 -68.9946,-29.47343 -68.324762,2.00956 -31.48299,135.97969 54.2579,195.59632 92.028162,42.154 87.08057,10.8767 79.91784,5.717 49.77454,-1.1406 z"
|
||||
id="path4265"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.81825721px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 362.2228,973.50299 c -87.01468,18.7244 -206.31388,2.7914 -260.29527,-66.2183 C 40.854878,829.20969 44.412488,641.34522 72.212698,611.40084 98.152348,583.46053 206.19233,642.42569 258.48372,672.39141 226.33414,633.9643 97.758248,551.92129 22.266478,615.19423 c -39.234376,32.88402 -22.2634293,269.25766 24.02476,303.47066 82.593032,61.047 269.567992,98.25131 315.931562,54.8381 z"
|
||||
id="path4263"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csscssc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#f57c00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 705.09299,169.2159 c -15.02488,0.0627 -29.55297,0.81546 -43.06769,2.46948 -127.0389,18.06512 -274.41191,149.37803 -360.09102,278.72918 -88.19593,146.10416 -97.39583,306.48603 -33.97922,443.82493 51.67469,111.90981 209.30324,277.68941 437.75427,274.25121 103.34093,-1.5552 188.21293,-14.2523 282.05624,-41.2806 l 53.34803,-135.65461 7.6922,-153.845 -32.3069,-87.691 -68.46233,-87.69283 -22.3067,-99.22916 30.769,-200.76658 -28.3598,-161.94745 c -6.6814,-1.88509 -12.5089,-3.44563 -17.1054,-4.56753 -29.15558,-7.11615 -124.80661,-26.93763 -205.94068,-26.60004 z"
|
||||
id="path4225-42-9"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 447.07437,279.1177 -67.22098,67.22099 -37.8601,46.3593 180.02862,4.63593 96.58187,45.58664 70.31161,81.90143 47.13196,130.5787 -4.63593,166.8935 -88.85533,154.531 -78.03816,55.63111 16.99841,16.2258 81.12878,2.318 72.62957,-32.4515 L 807.90426,918.10339 837.26515,722.62168 810.99488,518.64075 734.50204,415.87764 630.96627,335.52152 535.9297,298.43408 Z"
|
||||
id="path4247"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 704.34544,1170.0033 C 474.87531,1173.4568 316.54426,1006.9366 264.63906,894.52759 200.93961,756.57613 210.17987,595.47873 298.76925,448.72283 384.83054,318.7946 532.86185,186.89663 660.46747,168.75089 c 86.87989,-10.63238 215.40898,15.76659 250.1179,24.23821 35.046,8.55388 138.10213,41.16536 192.58973,67.91907 53.5186,26.27792 164.698,69.05836 309.1218,196.39026 100.3317,88.4579 183.2875,109.9787 279.7545,106.6811 52.9405,-1.8098 148.8273,-10.5671 171.5302,-24.7287 679.9746,-424.15326 639.4516,799.03727 13.1124,405.39146 -158.3183,-74.1014 -440.1478,10.5521 -637.0436,91.78671 -223.8429,92.3524 -350.0163,130.7857 -535.30496,133.5743 z"
|
||||
id="path4225-42"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ssccssssscss"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 600.77485,188.39742 c 45.59931,-168.111187 93.61702,-207.521997 165.6011,-175.903587 28.11465,12.34913 88.59168,36.45928 110.93127,66.5789 46.81515,63.119057 81.36115,162.974077 99.35615,284.156557 -8.7416,75.03201 -41.5452,164.02089 -27.3175,238.20842 17.5559,91.54126 116.68213,142.15421 125.66043,234.93028 9.4985,98.1511 -22.9467,217.44721 -86.32323,293.93611 36.78763,-80.4955 64.77883,-202.86651 55.72773,-281.91641 -15.7564,-137.61237 -102.80503,-141.89728 -115.82623,-244.76458 -9.3046,-73.506 20.1158,-155.47823 24.0394,-229.46683 3.7424,-70.5705 -32.2949,-195.09979 -74.30353,-233.83762 C 781.36459,50.911903 652.78479,43.071673 600.77485,188.39742 Z"
|
||||
id="path4405"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csscsscssssc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#f57c00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 978.84877,929.24739 143.14363,-41.5225 87.4159,-74.3036 5.4635,-186.85146 -73.2108,-30.5956 -65.562,22.9467 -77.58163,46.986 -87.416,87.416 z"
|
||||
id="path4289"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 913.12497,751.04553 c 45.1649,-86.3232 245.53153,-195.3877 312.51203,-177.0172 29.651,8.1322 84.3992,143.4773 -29.5028,270.98936 -50.127,56.1165 -219.63263,88.5086 -219.63263,88.5086 l 2.1854,-6.5562 c 0,0 154.41873,-31.7084 192.31513,-91.7868 38.4759,-60.9969 52.9259,-177.98746 0,-216.35436 -79.3518,-57.5234 -257.87713,132.2166 -257.87713,132.2166 z"
|
||||
id="path4287"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cssccssc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 330.40347,402.7425 c 114.35294,-10.55962 249.75787,-2.93669 319.87917,81.90143 79.96514,96.74795 96.08396,242.01494 62.58506,351.55806 -23.16188,75.7405 -98.38474,154.531 -163.80286,199.34501 60.19701,36.3696 76.03151,31.5859 158.39427,3.8632 C 761.64992,1021.17 829.49446,914.53909 837.26515,833.88399 848.77388,714.43039 855.97093,574.91586 790.90585,472.28145 719.85004,360.19719 579.71348,287.1018 454.02827,276.79974 l -13.13513,9.27185 c 166.63592,15.4531 280.2303,99.1189 342.28616,214.02545 65.19894,120.72647 36.96723,291.05045 30.9062,330.69635 -11.59484,75.8433 -39.28607,162.0595 -121.30683,197.02701 -32.03238,13.6562 -80.61368,27.043 -116.67091,8.4993 C 636.37485,988.41499 708.98856,931.86239 729.09345,855.51829 762.38235,729.11061 744.53737,534.45916 642.55609,446.01118 573.9429,386.50322 397.62445,372.60895 347.40188,381.10816 Z"
|
||||
id="path4245"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csscsssccssscsscc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path4249"
|
||||
sodipodi:type="arc"
|
||||
sodipodi:cx="592.71979"
|
||||
sodipodi:cy="560.36414"
|
||||
sodipodi:rx="41.337044"
|
||||
sodipodi:ry="48.677265"
|
||||
sodipodi:start="0"
|
||||
sodipodi:end="6.2714218"
|
||||
sodipodi:open="true"
|
||||
d="m 634.05683,560.36414 a 41.337044,48.677265 0 0 1 -41.21548,48.67705 41.337044,48.677265 0 0 1 -41.45789,-48.39075 41.337044,48.677265 0 0 1 40.97163,-48.96167 41.337044,48.677265 0 0 1 41.69888,48.10276"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 329.82495,822.87809 c 50.9573,98.8977 80.17049,31.9344 81.80769,19.0432 2.98204,-23.4803 -26.03926,-8.0283 -44.87764,-12.8177 -24.76611,-6.2965 -49.64587,-30.9043 -36.93005,-6.2255 z"
|
||||
id="path4253"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ssss"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 349.24366,1015.5476 c 24.85373,22.5357 29.23211,28.8458 48.29094,41.7233 13.9627,-4.7761 21.9738,-0.484 43.60813,-17.9975 -43.655,-2.9618 -58.6749,-15.7418 -91.89907,-23.7258 z"
|
||||
id="path4339"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1840.2193,917.45789 c -144.4722,-64.5024 -401.6544,9.1852 -581.3301,79.8965 C 1054.6229,1077.7432 939.48447,1111.1985 770.40085,1113.6259 560.99961,1116.632 416.51658,971.68219 369.15085,873.83489 311.02239,753.75418 319.45382,613.52678 400.29538,485.78208 478.83,372.68518 613.91429,257.87398 730.35984,242.07898 c 12.38775,-1.4461 25.70459,-2.1055 39.47656,-2.1601 74.36866,-0.2952 162.04327,17.0358 188.76757,23.2578 31.981,7.4458 126.02373,35.8332 175.74613,59.1211 48.8379,22.8738 150.2931,60.1123 282.0859,170.9492 91.5569,76.9988 167.2589,95.7317 255.2891,92.8613 48.3104,-1.5753 135.8099,-9.1984 156.5274,-21.5254 l 39.4824,-26.4785 c -22.7029,14.1616 -118.5888,22.9187 -171.5293,24.7285 -96.467,3.2976 -179.4222,-18.2237 -279.7539,-106.6816 -144.4238,-127.3319 -255.6045,-170.1108 -309.1231,-196.3887 -54.4876,-26.7537 -157.54383,-59.3661 -192.58983,-67.9199 -29.28571,-7.148 -125.36331,-27.0578 -206.8594,-26.7188 -15.09187,0.063 -29.68283,0.8192 -43.25782,2.4805 -127.60562,18.1458 -275.63793,150.0445 -361.69921,279.9727 -88.58938,146.7559 -97.82836,307.8532 -34.12891,445.80461 51.9052,112.40901 210.23495,278.92821 439.70508,275.47471 185.28865,-2.7886 311.46379,-41.2219 535.30669,-133.5743 196.8958,-81.23461 478.7247,-165.88851 637.043,-91.78711 z"
|
||||
id="path4225-42-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csssccsssssccsssssccssscc"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 707.63885,164.4148 c -15.0918,0.063 -29.6848,0.8211 -43.2597,2.4824 -127.6056,18.1458 -275.6361,150.0425 -361.6973,279.9707 -88.5894,146.7559 -97.8304,307.8533 -34.1309,445.80469 51.9052,112.40901 210.237,278.93011 439.7071,275.47661 185.2887,-2.7886 311.46185,-41.2218 535.30475,-133.5742 195.3026,-80.57741 474.1694,-164.51701 633.1757,-93.55281 -7.0564,-4.019 -14.1914,-8.2481 -21.4101,-12.7011 -151.9427,-69.8031 -422.4225,9.9405 -611.3887,86.46281 -214.8282,86.9953 -335.92133,123.1994 -513.74805,125.8262 -220.2288,3.2531 -372.1832,-153.60771 -421.9981,-259.49611 -61.1341,-129.94919 -52.2658,-281.70249 32.7559,-419.94529 82.5954,-122.3913 224.6641,-246.6373 347.1308,-263.7305 83.381,-10.0156 206.734,14.8519 240.04502,22.8321 33.6347,8.0576 132.54073,38.7767 184.83393,63.9785 51.3632,24.7535 158.0664,65.0525 296.6738,184.998 96.2911,83.3266 175.9061,103.5985 268.4883,100.4922 50.8085,-1.7048 142.8325,-9.9528 164.6211,-23.2929 0.3844,-0.2354 0.7646,-0.4611 1.1485,-0.6954 -38.3016,9.244 -106.3509,14.9537 -147.9278,16.375 -96.467,3.2976 -179.4222,-18.2237 -279.7539,-106.6816 C 1271.7855,328.1122 1160.6067,285.3314 1107.0881,259.0535 1052.6005,232.2998 949.54427,199.6894 914.49827,191.1355 885.21265,183.9876 789.13495,164.0757 707.63885,164.4148 Z"
|
||||
id="path4421"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-xdpi="15.191093"
|
||||
inkscape:export-ydpi="15.191093" />
|
||||
</svg>
|
After Width: | Height: | Size: 22 KiB |
|
@ -0,0 +1,68 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="play_gif.svg">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1200"
|
||||
id="namedview12"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="1.5762712"
|
||||
inkscape:cy="11.084746"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<defs
|
||||
id="defs4">
|
||||
<path
|
||||
id="a"
|
||||
d="M24 24H0V0h24v24z" />
|
||||
</defs>
|
||||
<clipPath
|
||||
id="b">
|
||||
<use
|
||||
xlink:href="#a"
|
||||
overflow="visible"
|
||||
id="use8" />
|
||||
</clipPath>
|
||||
<path
|
||||
d="M11.5 9H13v6h-1.5zM9 9H6c-.6 0-1 .5-1 1v4c0 .5.4 1 1 1h3c.6 0 1-.5 1-1v-2H8.5v1.5h-2v-3H10V10c0-.5-.4-1-1-1zm10 1.5V9h-4.5v6H16v-2h2v-1.5h-2v-1z"
|
||||
clip-path="url(#b)"
|
||||
id="path10"
|
||||
style="fill:#ffffff;fill-opacity:0.7019608" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,59 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="play_video.svg">
|
||||
<metadata
|
||||
id="metadata12">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1156"
|
||||
id="namedview8"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="0.91525424"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="20"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
d="M0 0h48v48H0z"
|
||||
fill="none"
|
||||
id="path4" />
|
||||
<path
|
||||
d="M20 33l12-9-12-9v18zm4-29C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm0 36c-8.82 0-16-7.18-16-16S15.18 8 24 8s16 7.18 16 16-7.18 16-16 16z"
|
||||
id="path6"
|
||||
style="fill:#ffffff;fill-opacity:0.7019608;opacity:1;stroke:none;stroke-opacity:0.38039216" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
156
art/render.rb
|
@ -1,46 +1,148 @@
|
|||
#!/bin/env ruby
|
||||
resolutions={
|
||||
'mdpi'=> 1,
|
||||
|
||||
require 'xml'
|
||||
|
||||
resolutions = {
|
||||
'mdpi' => 1,
|
||||
'hdpi' => 1.5,
|
||||
'xhdpi' => 2,
|
||||
'xxhdpi' => 3,
|
||||
'xxxhdpi' => 4,
|
||||
}
|
||||
|
||||
images = {
|
||||
'conversations_baloon.svg' => ['ic_launcher', 48],
|
||||
'ic_launcher.svg' => ['ic_launcher', 48],
|
||||
'main_logo.svg' => ['main_logo', 200],
|
||||
'play_video.svg' => ['play_video', 128],
|
||||
'play_gif.svg' => ['play_gif', 128],
|
||||
'conversations_mono.svg' => ['ic_notification', 24],
|
||||
'ic_received_indicator.svg' => ['ic_received_indicator', 12],
|
||||
'ic_send_text_offline.svg' => ['ic_send_text_offline', 36],
|
||||
'ic_send_text_offline_white.svg' => ['ic_send_text_offline_white', 36],
|
||||
'ic_send_text_online.svg' => ['ic_send_text_online', 36],
|
||||
'ic_send_text_away.svg' => ['ic_send_text_away', 36],
|
||||
'ic_send_text_dnd.svg' => ['ic_send_text_dnd', 36],
|
||||
'ic_send_photo_online.svg' => ['ic_send_photo_online', 36],
|
||||
'ic_send_photo_offline.svg' => ['ic_send_photo_offline', 36],
|
||||
'ic_send_photo_away.svg' => ['ic_send_photo_away', 36],
|
||||
'ic_send_photo_dnd.svg' => ['ic_send_photo_dnd', 36],
|
||||
'ic_send_photo_online.svg' => ['ic_send_photo_online', 36],
|
||||
'ic_send_photo_offline.svg' => ['ic_send_photo_offline', 36],
|
||||
'ic_send_photo_offline_white.svg' => ['ic_send_photo_offline_white', 36],
|
||||
'ic_send_photo_away.svg' => ['ic_send_photo_away', 36],
|
||||
'ic_send_photo_dnd.svg' => ['ic_send_photo_dnd', 36],
|
||||
'ic_send_location_online.svg' => ['ic_send_location_online', 36],
|
||||
'ic_send_location_offline.svg' => ['ic_send_location_offline', 36],
|
||||
'ic_send_location_away.svg' => ['ic_send_location_away', 36],
|
||||
'ic_send_location_dnd.svg' => ['ic_send_location_dnd', 36],
|
||||
'ic_send_location_offline.svg' => ['ic_send_location_offline', 36],
|
||||
'ic_send_location_offline_white.svg' => ['ic_send_location_offline_white', 36],
|
||||
'ic_send_location_away.svg' => ['ic_send_location_away', 36],
|
||||
'ic_send_location_dnd.svg' => ['ic_send_location_dnd', 36],
|
||||
'ic_send_voice_online.svg' => ['ic_send_voice_online', 36],
|
||||
'ic_send_voice_offline.svg' => ['ic_send_voice_offline', 36],
|
||||
'ic_send_voice_away.svg' => ['ic_send_voice_away', 36],
|
||||
'ic_send_voice_dnd.svg' => ['ic_send_voice_dnd', 36],
|
||||
'ic_send_voice_offline.svg' => ['ic_send_voice_offline', 36],
|
||||
'ic_send_voice_offline_white.svg' => ['ic_send_voice_offline_white', 36],
|
||||
'ic_send_voice_away.svg' => ['ic_send_voice_away', 36],
|
||||
'ic_send_voice_dnd.svg' => ['ic_send_voice_dnd', 36],
|
||||
'ic_send_cancel_online.svg' => ['ic_send_cancel_online', 36],
|
||||
'ic_send_cancel_offline.svg' => ['ic_send_cancel_offline', 36],
|
||||
'ic_send_cancel_away.svg' => ['ic_send_cancel_away', 36],
|
||||
'ic_send_cancel_dnd.svg' => ['ic_send_cancel_dnd', 36],
|
||||
'ic_send_picture_online.svg' => ['ic_send_picture_online', 36],
|
||||
'ic_send_picture_offline.svg' => ['ic_send_picture_offline', 36],
|
||||
'ic_send_picture_away.svg' => ['ic_send_picture_away', 36],
|
||||
'ic_send_picture_dnd.svg' => ['ic_send_picture_dnd', 36]
|
||||
'ic_send_cancel_offline.svg' => ['ic_send_cancel_offline', 36],
|
||||
'ic_send_cancel_offline_white.svg' => ['ic_send_cancel_offline_white', 36],
|
||||
'ic_send_cancel_away.svg' => ['ic_send_cancel_away', 36],
|
||||
'ic_send_cancel_dnd.svg' => ['ic_send_cancel_dnd', 36],
|
||||
'ic_send_picture_online.svg' => ['ic_send_picture_online', 36],
|
||||
'ic_send_picture_offline.svg' => ['ic_send_picture_offline', 36],
|
||||
'ic_send_picture_offline_white.svg' => ['ic_send_picture_offline_white', 36],
|
||||
'ic_send_picture_away.svg' => ['ic_send_picture_away', 36],
|
||||
'ic_send_picture_dnd.svg' => ['ic_send_picture_dnd', 36],
|
||||
'ic_notifications_none_white80.svg' => ['ic_notifications_none_white80', 24],
|
||||
'ic_notifications_off_white80.svg' => ['ic_notifications_off_white80', 24],
|
||||
'ic_notifications_paused_white80.svg' => ['ic_notifications_paused_white80', 24],
|
||||
'ic_notifications_white80.svg' => ['ic_notifications_white80', 24],
|
||||
'ic_verified_fingerprint.svg' => ['ic_verified_fingerprint', 36],
|
||||
'md_switch_thumb_disable.svg' => ['switch_thumb_disable', 48],
|
||||
'md_switch_thumb_off_normal.svg' => ['switch_thumb_off_normal', 48],
|
||||
'md_switch_thumb_off_pressed.svg' => ['switch_thumb_off_pressed', 48],
|
||||
'md_switch_thumb_on_normal.svg' => ['switch_thumb_on_normal', 48],
|
||||
'md_switch_thumb_on_pressed.svg' => ['switch_thumb_on_pressed', 48],
|
||||
'message_bubble_received.svg' => ['message_bubble_received.9', 0],
|
||||
'message_bubble_received_grey.svg' => ['message_bubble_received_grey.9', 0],
|
||||
'message_bubble_received_dark.svg' => ['message_bubble_received_dark.9', 0],
|
||||
'message_bubble_received_warning.svg' => ['message_bubble_received_warning.9', 0],
|
||||
'message_bubble_received_white.svg' => ['message_bubble_received_white.9', 0],
|
||||
'message_bubble_sent.svg' => ['message_bubble_sent.9', 0],
|
||||
'message_bubble_sent_grey.svg' => ['message_bubble_sent_grey.9', 0],
|
||||
'date_bubble_white.svg' => ['date_bubble_white.9', 0],
|
||||
'date_bubble_grey.svg' => ['date_bubble_grey.9', 0],
|
||||
}
|
||||
images.each do |source, result|
|
||||
resolutions.each do |name, factor|
|
||||
size = factor * result[1]
|
||||
path = "../src/main/res/drawable-#{name}/#{result[0]}.png"
|
||||
cmd = "inkscape -e #{path} -C -h #{size} -w #{size} #{source}"
|
||||
puts cmd
|
||||
system cmd
|
||||
|
||||
# Executable paths for Mac OSX
|
||||
# "/Applications/Inkscape.app/Contents/Resources/bin/inkscape"
|
||||
|
||||
inkscape = "inkscape"
|
||||
imagemagick = "convert"
|
||||
|
||||
def execute_cmd(cmd)
|
||||
puts cmd
|
||||
system cmd
|
||||
end
|
||||
|
||||
images.each do |source_filename, settings|
|
||||
svg_content = File.read(source_filename)
|
||||
|
||||
svg = XML::Document.string(svg_content)
|
||||
base_width = svg.root["width"].to_i
|
||||
base_height = svg.root["height"].to_i
|
||||
|
||||
guides = svg.find(".//sodipodi:guide")
|
||||
|
||||
resolutions.each do |resolution, factor|
|
||||
output_filename, base_size = settings
|
||||
|
||||
if base_size > 0
|
||||
width = factor * base_size
|
||||
height = factor * base_size
|
||||
else
|
||||
width = factor * base_width
|
||||
height = factor * base_height
|
||||
end
|
||||
|
||||
path = "../src/main/res/drawable-#{resolution}/#{output_filename}.png"
|
||||
execute_cmd "#{inkscape} -f #{source_filename} -z -C -w #{width} -h #{height} -e #{path}"
|
||||
|
||||
top = []
|
||||
right = []
|
||||
bottom = []
|
||||
left = []
|
||||
|
||||
guides.each do |guide|
|
||||
orientation = guide["orientation"]
|
||||
x, y = guide["position"].split(",")
|
||||
x, y = x.to_i, y.to_i
|
||||
|
||||
if orientation == "1,0" and y == base_height
|
||||
top.push(x * factor)
|
||||
end
|
||||
|
||||
if orientation == "0,1" and x == base_width
|
||||
right.push((base_height - y) * factor)
|
||||
end
|
||||
|
||||
if orientation == "1,0" and y == 0
|
||||
bottom.push(x * factor)
|
||||
end
|
||||
|
||||
if orientation == "0,1" and x == 0
|
||||
left.push((base_height - y) * factor)
|
||||
end
|
||||
end
|
||||
|
||||
next if top.length != 2
|
||||
next if right.length != 2
|
||||
next if bottom.length != 2
|
||||
next if left.length != 2
|
||||
|
||||
execute_cmd "#{imagemagick} -background none PNG32:#{path} -gravity center -extent #{width+2}x#{height+2} PNG32:#{path}"
|
||||
|
||||
draw_format = "-draw \"rectangle %d,%d %d,%d\""
|
||||
top_line = draw_format % [top.min + 1, 0, top.max, 0]
|
||||
right_line = draw_format % [width + 1, right.min + 1, width + 1, right.max]
|
||||
bottom_line = draw_format % [bottom.min + 1, height + 1, bottom.max, height + 1]
|
||||
left_line = draw_format % [0, left.min + 1, 0, left.max]
|
||||
draws = "#{top_line} #{right_line} #{bottom_line} #{left_line}"
|
||||
|
||||
execute_cmd "#{imagemagick} -background none PNG32:#{path} -fill black -stroke none #{draws} PNG32:#{path}"
|
||||
end
|
||||
end
|
||||
|
|
186
build.gradle
|
@ -1,112 +1,122 @@
|
|||
// Top-level build file where you can add configuration options common to all
|
||||
// sub-projects/modules.
|
||||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:1.2.3'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:2.3.0'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
configurations {
|
||||
playstoreCompile
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile project(':libs:openpgp-api-lib')
|
||||
compile project(':libs:MemorizingTrustManager')
|
||||
compile 'com.android.support:support-v13:21.0.3'
|
||||
compile 'org.bouncycastle:bcprov-jdk15on:1.51'
|
||||
compile 'org.jitsi:org.otr4j:0.22'
|
||||
compile 'org.gnu.inet:libidn:1.15'
|
||||
compile 'com.google.zxing:core:3.1.0'
|
||||
compile 'com.google.zxing:android-integration:3.1.0'
|
||||
compile 'de.measite.minidns:minidns:0.1.3'
|
||||
compile 'de.timroes.android:EnhancedListView:0.3.4'
|
||||
compile 'me.leolin:ShortcutBadger:1.1.1@aar'
|
||||
compile project(':libs:MemorizingTrustManager')
|
||||
playstoreCompile 'com.google.android.gms:play-services-gcm:11.0.4'
|
||||
compile 'org.sufficientlysecure:openpgp-api:10.0'
|
||||
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
|
||||
compile 'com.android.support:support-v13:25.3.1'
|
||||
compile 'com.android.support:appcompat-v7:25.3.1'
|
||||
compile 'org.bouncycastle:bcprov-jdk15on:1.52'
|
||||
compile 'org.bouncycastle:bcmail-jdk15on:1.52'
|
||||
compile 'org.jitsi:org.otr4j:0.22'
|
||||
compile 'org.gnu.inet:libidn:1.15'
|
||||
compile 'com.google.zxing:core:3.2.1'
|
||||
compile 'com.google.zxing:android-integration:3.2.1'
|
||||
compile 'de.measite.minidns:minidns-hla:0.2.2'
|
||||
compile 'de.timroes.android:EnhancedListView:0.3.4'
|
||||
compile 'me.leolin:ShortcutBadger:1.1.17@aar'
|
||||
compile 'com.kyleduo.switchbutton:library:1.2.8'
|
||||
compile 'org.whispersystems:signal-protocol-java:2.6.2'
|
||||
compile 'com.makeramen:roundedimageview:2.3.0'
|
||||
compile "com.wefika:flowlayout:0.4.1"
|
||||
compile 'net.ypresto.androidtranscoder:android-transcoder:0.2.0'
|
||||
compile ('com.vdurmont:emoji-java:3.3.0') {
|
||||
exclude group: 'org.json', module: 'json'
|
||||
}
|
||||
}
|
||||
|
||||
ext {
|
||||
travisBuild = System.getenv("TRAVIS") == "true"
|
||||
preDexEnabled = System.getProperty("pre-dex", "true")
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 22
|
||||
buildToolsVersion "22.0.1"
|
||||
compileSdkVersion 25
|
||||
buildToolsVersion "26.0.1"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 21
|
||||
versionCode 74
|
||||
versionName "1.4.6"
|
||||
}
|
||||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 25
|
||||
versionCode 229
|
||||
versionName "1.20.0-beta"
|
||||
archivesBaseName += "-$versionName"
|
||||
applicationId "eu.siacs.conversations"
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_7
|
||||
targetCompatibility JavaVersion.VERSION_1_7
|
||||
}
|
||||
dexOptions {
|
||||
// Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false.
|
||||
preDexLibraries = preDexEnabled && !travisBuild
|
||||
jumboMode true
|
||||
}
|
||||
|
||||
//
|
||||
// To sign release builds, create the file `gradle.properties` in
|
||||
// $HOME/.gradle or in your project directory with this content:
|
||||
//
|
||||
// mStoreFile=/path/to/key.store
|
||||
// mStorePassword=xxx
|
||||
// mKeyAlias=alias
|
||||
// mKeyPassword=xxx
|
||||
//
|
||||
if (project.hasProperty('mStoreFile') &&
|
||||
project.hasProperty('mStorePassword') &&
|
||||
project.hasProperty('mKeyAlias') &&
|
||||
project.hasProperty('mKeyPassword')) {
|
||||
signingConfigs {
|
||||
release {
|
||||
storeFile file(mStoreFile)
|
||||
storePassword mStorePassword
|
||||
keyAlias mKeyAlias
|
||||
keyPassword mKeyPassword
|
||||
}
|
||||
}
|
||||
buildTypes.release.signingConfig = signingConfigs.release
|
||||
} else {
|
||||
buildTypes.release.signingConfig = null
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_7
|
||||
targetCompatibility JavaVersion.VERSION_1_7
|
||||
}
|
||||
|
||||
applicationVariants.all { variant ->
|
||||
if (variant.name.equals('release')) {
|
||||
variant.outputs.each { output ->
|
||||
if (output.zipAlign != null) {
|
||||
output.zipAlign.outputFile = new File(output.outputFile.parent, rootProject.name + "-${variant.versionName}.apk")
|
||||
}
|
||||
output.packageApplication.outputFile = new File(output.outputFile.parent, output.packageApplication.outputFile.name
|
||||
.replace(".apk", "-${variant.versionName}.apk"))
|
||||
}
|
||||
}
|
||||
}
|
||||
productFlavors {
|
||||
playstore
|
||||
free
|
||||
}
|
||||
if (project.hasProperty('mStoreFile') &&
|
||||
project.hasProperty('mStorePassword') &&
|
||||
project.hasProperty('mKeyAlias') &&
|
||||
project.hasProperty('mKeyPassword')) {
|
||||
signingConfigs {
|
||||
release {
|
||||
storeFile file(mStoreFile)
|
||||
storePassword mStorePassword
|
||||
keyAlias mKeyAlias
|
||||
keyPassword mKeyPassword
|
||||
}
|
||||
}
|
||||
buildTypes.release.signingConfig = signingConfigs.release
|
||||
} else {
|
||||
buildTypes.release.signingConfig = null
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
disable 'ExtraTranslation', 'MissingTranslation', 'InvalidPackage', 'MissingQuantity'
|
||||
}
|
||||
lintOptions {
|
||||
disable 'ExtraTranslation', 'MissingTranslation', 'InvalidPackage', 'MissingQuantity', 'AppCompatResource'
|
||||
}
|
||||
|
||||
subprojects {
|
||||
subprojects {
|
||||
|
||||
afterEvaluate {
|
||||
if (getPlugins().hasPlugin('android') ||
|
||||
getPlugins().hasPlugin('android-library')) {
|
||||
afterEvaluate {
|
||||
if (getPlugins().hasPlugin('android') ||
|
||||
getPlugins().hasPlugin('android-library')) {
|
||||
|
||||
configure(android.lintOptions) {
|
||||
disable 'AndroidGradlePluginVersion', 'MissingTranslation'
|
||||
}
|
||||
}
|
||||
configure(android.lintOptions) {
|
||||
disable 'AndroidGradlePluginVersion', 'MissingTranslation'
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
packagingOptions {
|
||||
exclude 'META-INF/BCKEY.DSA'
|
||||
exclude 'META-INF/BCKEY.SF'
|
||||
}
|
||||
}
|
||||
|
|
12
docs/XEPs.md
|
@ -2,13 +2,17 @@
|
|||
* XEP-0030: Service Discovery
|
||||
* XEP-0045: Multi-User Chat
|
||||
* XEP-0048: Bookmarks
|
||||
* XEP-0084: User Avatar
|
||||
* XEP-0085: Chat State Notifications
|
||||
* XEP-0092: Software Version
|
||||
* XEP-0115: Entity Capabilities
|
||||
* XEP-0163: Personal Eventing Protocol (avatars and nicks)
|
||||
* XEP-0166: Jingle (only used for file transfer)
|
||||
* XEP-0172: User Nickname
|
||||
* XEP-0184: Message Delivery Receipts (reply only)
|
||||
* XEP-0191: Blocking command
|
||||
* XEP-0198: Stream Management
|
||||
* XEP-0199: XMPP Ping
|
||||
* XEP-0234: Jingle File Transfer
|
||||
* XEP-0237: Roster Versioning
|
||||
* XEP-0245: The /me Command
|
||||
|
@ -16,7 +20,13 @@
|
|||
* XEP-0260: Jingle SOCKS5 Bytestreams Transport Method
|
||||
* XEP-0261: Jingle In-Band Bytestreams Transport Method
|
||||
* XEP-0280: Message Carbons
|
||||
* XEP-0308: Last Message Correction
|
||||
* XEP-0313: Message Archive Management
|
||||
* XEP-0319: Last User Interaction in Presence
|
||||
* XEP-0333: Chat Markers
|
||||
* XEP-0352: Client State Indication
|
||||
* XEP-0191: Blocking command
|
||||
* XEP-0357: Push Notifications
|
||||
* XEP-0363: HTTP File Upload
|
||||
* XEP-0368: SRV records for XMPP over TLS
|
||||
* XEP-0377: Spam Reporting
|
||||
* XEP-0384: OMEMO Encryption
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
#Sat Nov 22 17:47:57 CET 2014
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
|
||||
|
|
|
@ -3,18 +3,18 @@ buildscript {
|
|||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:1.2.3'
|
||||
classpath 'com.android.tools.build:gradle:2.3.0'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'android-library'
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion "19.1"
|
||||
compileSdkVersion 25
|
||||
buildToolsVersion "26.0.1"
|
||||
defaultConfig {
|
||||
minSdkVersion 7
|
||||
targetSdkVersion 19
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 25
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
package de.duenndns.ssl;
|
||||
|
||||
import javax.net.ssl.HostnameVerifier;
|
||||
import javax.net.ssl.SSLSession;
|
||||
|
||||
public interface DomainHostnameVerifier extends HostnameVerifier {
|
||||
|
||||
boolean verify(String domain, String hostname, SSLSession sslSession);
|
||||
|
||||
}
|
|
@ -28,22 +28,36 @@ package de.duenndns.ssl;
|
|||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.Service;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Base64;
|
||||
import android.util.Log;
|
||||
import android.util.SparseArray;
|
||||
import android.os.Handler;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URL;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.cert.*;
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.MessageDigest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
@ -51,8 +65,10 @@ import java.util.Collection;
|
|||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.net.ssl.HostnameVerifier;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import javax.net.ssl.SSLSession;
|
||||
import javax.net.ssl.TrustManager;
|
||||
import javax.net.ssl.TrustManagerFactory;
|
||||
|
@ -68,7 +84,15 @@ import javax.net.ssl.X509TrustManager;
|
|||
* <b>WARNING:</b> This only works if a dedicated thread is used for
|
||||
* opening sockets!
|
||||
*/
|
||||
public class MemorizingTrustManager implements X509TrustManager {
|
||||
public class MemorizingTrustManager {
|
||||
|
||||
|
||||
private static final Pattern PATTERN_IPV4 = Pattern.compile("\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
|
||||
private static final Pattern PATTERN_IPV6_HEX4DECCOMPRESSED = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
|
||||
private static final Pattern PATTERN_IPV6_6HEX4DEC = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
|
||||
private static final Pattern PATTERN_IPV6_HEXCOMPRESSED = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z");
|
||||
private static final Pattern PATTERN_IPV6 = Pattern.compile("\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z");
|
||||
|
||||
final static String DECISION_INTENT = "de.duenndns.ssl.DECISION";
|
||||
final static String DECISION_INTENT_ID = DECISION_INTENT + ".decisionId";
|
||||
final static String DECISION_INTENT_CERT = DECISION_INTENT + ".cert";
|
||||
|
@ -94,6 +118,7 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
private KeyStore appKeyStore;
|
||||
private X509TrustManager defaultTrustManager;
|
||||
private X509TrustManager appTrustManager;
|
||||
private String poshCacheDir;
|
||||
|
||||
/** Creates an instance of the MemorizingTrustManager class that falls back to a custom TrustManager.
|
||||
*
|
||||
|
@ -149,28 +174,11 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
File dir = app.getDir(KEYSTORE_DIR, Context.MODE_PRIVATE);
|
||||
keyStoreFile = new File(dir + File.separator + KEYSTORE_FILE);
|
||||
|
||||
poshCacheDir = app.getFilesDir().getAbsolutePath()+"/posh_cache/";
|
||||
|
||||
appKeyStore = loadAppKeyStore();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a X509TrustManager list containing a new instance of
|
||||
* TrustManagerFactory.
|
||||
*
|
||||
* This function is meant for convenience only. You can use it
|
||||
* as follows to integrate TrustManagerFactory for HTTPS sockets:
|
||||
*
|
||||
* <pre>
|
||||
* SSLContext sc = SSLContext.getInstance("TLS");
|
||||
* sc.init(null, MemorizingTrustManager.getInstanceList(this),
|
||||
* new java.security.SecureRandom());
|
||||
* HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
|
||||
* </pre>
|
||||
* @param c Activity or Service to show the Dialog / Notification
|
||||
*/
|
||||
public static X509TrustManager[] getInstanceList(Context c) {
|
||||
return new X509TrustManager[] { new MemorizingTrustManager(c) };
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds an Activity to the MTM for displaying the query dialog.
|
||||
|
@ -284,18 +292,11 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
*
|
||||
* @throws IllegalArgumentException if the defaultVerifier parameter is null
|
||||
*/
|
||||
public HostnameVerifier wrapHostnameVerifier(final HostnameVerifier defaultVerifier) {
|
||||
public DomainHostnameVerifier wrapHostnameVerifier(final HostnameVerifier defaultVerifier, final boolean interactive) {
|
||||
if (defaultVerifier == null)
|
||||
throw new IllegalArgumentException("The default verifier may not be null");
|
||||
|
||||
return new MemorizingHostnameVerifier(defaultVerifier);
|
||||
}
|
||||
|
||||
public HostnameVerifier wrapHostnameVerifierNonInteractive(final HostnameVerifier defaultVerifier) {
|
||||
if (defaultVerifier == null)
|
||||
throw new IllegalArgumentException("The default verifier may not be null");
|
||||
|
||||
return new NonInteractiveMemorizingHostnameVerifier(defaultVerifier);
|
||||
return new MemorizingHostnameVerifier(defaultVerifier, interactive);
|
||||
}
|
||||
|
||||
X509TrustManager getTrustManager(KeyStore ks) {
|
||||
|
@ -389,7 +390,7 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
return false;
|
||||
}
|
||||
|
||||
public void checkCertTrusted(X509Certificate[] chain, String authType, boolean isServer, boolean interactive)
|
||||
public void checkCertTrusted(X509Certificate[] chain, String authType, String domain, boolean isServer, boolean interactive)
|
||||
throws CertificateException
|
||||
{
|
||||
LOGGER.log(Level.FINE, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")");
|
||||
|
@ -419,6 +420,15 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
else
|
||||
defaultTrustManager.checkClientTrusted(chain, authType);
|
||||
} catch (CertificateException e) {
|
||||
boolean trustSystemCAs = !PreferenceManager.getDefaultSharedPreferences(master).getBoolean("dont_trust_system_cas", false);
|
||||
if (domain != null && isServer && trustSystemCAs && !isIp(domain)) {
|
||||
String hash = getBase64Hash(chain[0],"SHA-256");
|
||||
List<String> fingerprints = getPoshFingerprints(domain);
|
||||
if (hash != null && fingerprints.contains(hash)) {
|
||||
Log.d("mtm","trusted cert fingerprint of "+domain+" via posh");
|
||||
return;
|
||||
}
|
||||
}
|
||||
e.printStackTrace();
|
||||
if (interactive) {
|
||||
interactCert(chain, authType, e);
|
||||
|
@ -429,20 +439,147 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
}
|
||||
}
|
||||
|
||||
public void checkClientTrusted(X509Certificate[] chain, String authType)
|
||||
throws CertificateException
|
||||
{
|
||||
checkCertTrusted(chain, authType, false,true);
|
||||
private List<String> getPoshFingerprints(String domain) {
|
||||
List<String> cached = getPoshFingerprintsFromCache(domain);
|
||||
if (cached == null) {
|
||||
return getPoshFingerprintsFromServer(domain);
|
||||
} else {
|
||||
return cached;
|
||||
}
|
||||
}
|
||||
|
||||
public void checkServerTrusted(X509Certificate[] chain, String authType)
|
||||
throws CertificateException
|
||||
{
|
||||
checkCertTrusted(chain, authType, true,true);
|
||||
private List<String> getPoshFingerprintsFromServer(String domain) {
|
||||
return getPoshFingerprintsFromServer(domain, "https://"+domain+"/.well-known/posh/xmpp-client.json",-1,true);
|
||||
}
|
||||
|
||||
public X509Certificate[] getAcceptedIssuers()
|
||||
{
|
||||
private List<String> getPoshFingerprintsFromServer(String domain, String url, int maxTtl, boolean followUrl) {
|
||||
Log.d("mtm","downloading json for "+domain+" from "+url);
|
||||
try {
|
||||
List<String> results = new ArrayList<>();
|
||||
HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
|
||||
connection.setConnectTimeout(5000);
|
||||
connection.setReadTimeout(5000);
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
String inputLine;
|
||||
StringBuilder builder = new StringBuilder();
|
||||
while ((inputLine = in.readLine()) != null) {
|
||||
builder.append(inputLine);
|
||||
}
|
||||
JSONObject jsonObject = new JSONObject(builder.toString());
|
||||
in.close();
|
||||
int expires = jsonObject.getInt("expires");
|
||||
if (expires <= 0) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
if (maxTtl >= 0) {
|
||||
expires = Math.min(maxTtl,expires);
|
||||
}
|
||||
String redirect;
|
||||
try {
|
||||
redirect = jsonObject.getString("url");
|
||||
} catch (JSONException e) {
|
||||
redirect = null;
|
||||
}
|
||||
if (followUrl && redirect != null && redirect.toLowerCase().startsWith("https")) {
|
||||
return getPoshFingerprintsFromServer(domain, redirect, expires, false);
|
||||
}
|
||||
JSONArray fingerprints = jsonObject.getJSONArray("fingerprints");
|
||||
for(int i = 0; i < fingerprints.length(); i++) {
|
||||
JSONObject fingerprint = fingerprints.getJSONObject(i);
|
||||
String sha256 = fingerprint.getString("sha-256");
|
||||
if (sha256 != null) {
|
||||
results.add(sha256);
|
||||
}
|
||||
}
|
||||
writeFingerprintsToCache(domain, results,1000L * expires+System.currentTimeMillis());
|
||||
return results;
|
||||
} catch (Exception e) {
|
||||
Log.d("mtm","error fetching posh "+e.getMessage());
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
private File getPoshCacheFile(String domain) {
|
||||
return new File(poshCacheDir+domain+".json");
|
||||
}
|
||||
|
||||
private void writeFingerprintsToCache(String domain, List<String> results, long expires) {
|
||||
File file = getPoshCacheFile(domain);
|
||||
file.getParentFile().mkdirs();
|
||||
try {
|
||||
file.createNewFile();
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
jsonObject.put("expires",expires);
|
||||
jsonObject.put("fingerprints",new JSONArray(results));
|
||||
FileOutputStream outputStream = new FileOutputStream(file);
|
||||
outputStream.write(jsonObject.toString().getBytes());
|
||||
outputStream.flush();
|
||||
outputStream.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private List<String> getPoshFingerprintsFromCache(String domain) {
|
||||
File file = getPoshCacheFile(domain);
|
||||
try {
|
||||
InputStream is = new FileInputStream(file);
|
||||
BufferedReader buf = new BufferedReader(new InputStreamReader(is));
|
||||
|
||||
String line = buf.readLine();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
while(line != null){
|
||||
sb.append(line).append("\n");
|
||||
line = buf.readLine();
|
||||
}
|
||||
JSONObject jsonObject = new JSONObject(sb.toString());
|
||||
is.close();
|
||||
long expires = jsonObject.getLong("expires");
|
||||
long expiresIn = expires - System.currentTimeMillis();
|
||||
if (expiresIn < 0) {
|
||||
file.delete();
|
||||
return null;
|
||||
} else {
|
||||
Log.d("mtm","posh fingerprints expire in "+(expiresIn/1000)+"s");
|
||||
}
|
||||
List<String> result = new ArrayList<>();
|
||||
JSONArray jsonArray = jsonObject.getJSONArray("fingerprints");
|
||||
for(int i = 0; i < jsonArray.length(); ++i) {
|
||||
result.add(jsonArray.getString(i));
|
||||
}
|
||||
return result;
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
} catch (JSONException e) {
|
||||
file.delete();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isIp(final String server) {
|
||||
return server != null && (
|
||||
PATTERN_IPV4.matcher(server).matches()
|
||||
|| PATTERN_IPV6.matcher(server).matches()
|
||||
|| PATTERN_IPV6_6HEX4DEC.matcher(server).matches()
|
||||
|| PATTERN_IPV6_HEX4DECCOMPRESSED.matcher(server).matches()
|
||||
|| PATTERN_IPV6_HEXCOMPRESSED.matcher(server).matches());
|
||||
}
|
||||
|
||||
private static String getBase64Hash(X509Certificate certificate, String digest) throws CertificateEncodingException {
|
||||
MessageDigest md;
|
||||
try {
|
||||
md = MessageDigest.getInstance(digest);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
return null;
|
||||
}
|
||||
md.update(certificate.getEncoded());
|
||||
return Base64.encodeToString(md.digest(),Base64.NO_WRAP);
|
||||
}
|
||||
|
||||
private X509Certificate[] getAcceptedIssuers() {
|
||||
LOGGER.log(Level.FINE, "getAcceptedIssuers()");
|
||||
return defaultTrustManager.getAcceptedIssuers();
|
||||
}
|
||||
|
@ -553,22 +690,6 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
certDetails(si, cert);
|
||||
return si.toString();
|
||||
}
|
||||
|
||||
// We can use Notification.Builder once MTM's minSDK is >= 11
|
||||
@SuppressWarnings("deprecation")
|
||||
void startActivityNotification(Intent intent, int decisionId, String certName) {
|
||||
Notification n = new Notification(android.R.drawable.ic_lock_lock,
|
||||
master.getString(R.string.mtm_notification),
|
||||
System.currentTimeMillis());
|
||||
PendingIntent call = PendingIntent.getActivity(master, 0, intent, 0);
|
||||
n.setLatestEventInfo(master.getApplicationContext(),
|
||||
master.getString(R.string.mtm_notification),
|
||||
certName, call);
|
||||
n.flags |= Notification.FLAG_AUTO_CANCEL;
|
||||
|
||||
notificationManager.notify(NOTIFICATION_ID + decisionId, n);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the top-most entry of the activity stack.
|
||||
*
|
||||
|
@ -598,7 +719,6 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
getUI().startActivity(ni);
|
||||
} catch (Exception e) {
|
||||
LOGGER.log(Level.FINE, "startActivity(MemorizingActivity)", e);
|
||||
startActivityNotification(ni, myId, message);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -654,31 +774,41 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
}
|
||||
}
|
||||
|
||||
class MemorizingHostnameVerifier implements HostnameVerifier {
|
||||
private HostnameVerifier defaultVerifier;
|
||||
class MemorizingHostnameVerifier implements DomainHostnameVerifier {
|
||||
private final HostnameVerifier defaultVerifier;
|
||||
private final boolean interactive;
|
||||
|
||||
public MemorizingHostnameVerifier(HostnameVerifier wrapped) {
|
||||
defaultVerifier = wrapped;
|
||||
public MemorizingHostnameVerifier(HostnameVerifier wrapped, boolean interactive) {
|
||||
this.defaultVerifier = wrapped;
|
||||
this.interactive = interactive;
|
||||
}
|
||||
|
||||
protected boolean verify(String hostname, SSLSession session, boolean interactive) {
|
||||
LOGGER.log(Level.FINE, "hostname verifier for " + hostname + ", trying default verifier first");
|
||||
@Override
|
||||
public boolean verify(String domain, String hostname, SSLSession session) {
|
||||
LOGGER.log(Level.FINE, "hostname verifier for " + domain + ", trying default verifier first");
|
||||
// if the default verifier accepts the hostname, we are done
|
||||
if (defaultVerifier.verify(hostname, session)) {
|
||||
LOGGER.log(Level.FINE, "default verifier accepted " + hostname);
|
||||
return true;
|
||||
if (defaultVerifier instanceof DomainHostnameVerifier) {
|
||||
if (((DomainHostnameVerifier) defaultVerifier).verify(domain,hostname, session)) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
if (defaultVerifier.verify(domain, session)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// otherwise, we check if the hostname is an alias for this cert in our keystore
|
||||
try {
|
||||
X509Certificate cert = (X509Certificate)session.getPeerCertificates()[0];
|
||||
//Log.d(TAG, "cert: " + cert);
|
||||
if (cert.equals(appKeyStore.getCertificate(hostname.toLowerCase(Locale.US)))) {
|
||||
LOGGER.log(Level.FINE, "certificate for " + hostname + " is in our keystore. accepting.");
|
||||
if (cert.equals(appKeyStore.getCertificate(domain.toLowerCase(Locale.US)))) {
|
||||
LOGGER.log(Level.FINE, "certificate for " + domain + " is in our keystore. accepting.");
|
||||
return true;
|
||||
} else {
|
||||
LOGGER.log(Level.FINE, "server " + hostname + " provided wrong certificate, asking user.");
|
||||
LOGGER.log(Level.FINE, "server " + domain + " provided wrong certificate, asking user.");
|
||||
if (interactive) {
|
||||
return interactHostname(cert, hostname);
|
||||
return interactHostname(cert, domain);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@ -688,42 +818,47 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean verify(String hostname, SSLSession session) {
|
||||
return verify(hostname, session, true);
|
||||
}
|
||||
}
|
||||
|
||||
class NonInteractiveMemorizingHostnameVerifier extends MemorizingHostnameVerifier {
|
||||
|
||||
public NonInteractiveMemorizingHostnameVerifier(HostnameVerifier wrapped) {
|
||||
super(wrapped);
|
||||
}
|
||||
@Override
|
||||
public boolean verify(String hostname, SSLSession session) {
|
||||
return verify(hostname, session, true);
|
||||
public boolean verify(String domain, SSLSession sslSession) {
|
||||
return verify(domain,null,sslSession);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public X509TrustManager getNonInteractive(String domain) {
|
||||
return new NonInteractiveMemorizingTrustManager(domain);
|
||||
}
|
||||
|
||||
public X509TrustManager getInteractive(String domain) {
|
||||
return new InteractiveMemorizingTrustManager(domain);
|
||||
}
|
||||
|
||||
public X509TrustManager getNonInteractive() {
|
||||
return new NonInteractiveMemorizingTrustManager();
|
||||
return new NonInteractiveMemorizingTrustManager(null);
|
||||
}
|
||||
|
||||
public X509TrustManager getInteractive() {
|
||||
return new InteractiveMemorizingTrustManager(null);
|
||||
}
|
||||
|
||||
private class NonInteractiveMemorizingTrustManager implements X509TrustManager {
|
||||
|
||||
private final String domain;
|
||||
|
||||
public NonInteractiveMemorizingTrustManager(String domain) {
|
||||
this.domain = domain;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] chain, String authType)
|
||||
throws CertificateException {
|
||||
MemorizingTrustManager.this.checkCertTrusted(chain, authType, false, false);
|
||||
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
|
||||
MemorizingTrustManager.this.checkCertTrusted(chain, authType, domain, false, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] chain, String authType)
|
||||
throws CertificateException {
|
||||
MemorizingTrustManager.this.checkCertTrusted(chain, authType, true, false);
|
||||
MemorizingTrustManager.this.checkCertTrusted(chain, authType, domain, true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -732,4 +867,28 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
private class InteractiveMemorizingTrustManager implements X509TrustManager {
|
||||
private final String domain;
|
||||
|
||||
public InteractiveMemorizingTrustManager(String domain) {
|
||||
this.domain = domain;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
|
||||
MemorizingTrustManager.this.checkCertTrusted(chain, authType, domain, false, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] chain, String authType)
|
||||
throws CertificateException {
|
||||
MemorizingTrustManager.this.checkCertTrusted(chain, authType, domain, true, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public X509Certificate[] getAcceptedIssuers() {
|
||||
return MemorizingTrustManager.this.getAcceptedIssuers();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
#Android specific
|
||||
bin
|
||||
gen
|
||||
obj
|
||||
lint.xml
|
||||
local.properties
|
||||
release.properties
|
||||
ant.properties
|
||||
*.class
|
||||
*.apk
|
||||
|
||||
#Gradle
|
||||
.gradle
|
||||
build
|
||||
gradle.properties
|
||||
|
||||
#Maven
|
||||
target
|
||||
pom.xml.*
|
||||
|
||||
#Eclipse
|
||||
.project
|
||||
.classpath
|
||||
.settings
|
||||
.metadata
|
||||
|
||||
#IntelliJ IDEA
|
||||
.idea
|
||||
*.iml
|
|
@ -1,8 +0,0 @@
|
|||
[main]
|
||||
host = https://www.transifex.com
|
||||
lang_map = af_ZA: af-rZA, am_ET: am-rET, ar_AE: ar-rAE, ar_BH: ar-rBH, ar_DZ: ar-rDZ, ar_EG: ar-rEG, ar_IQ: ar-rIQ, ar_JO: ar-rJO, ar_KW: ar-rKW, ar_LB: ar-rLB, ar_LY: ar-rLY, ar_MA: ar-rMA, ar_OM: ar-rOM, ar_QA: ar-rQA, ar_SA: ar-rSA, ar_SY: ar-rSY, ar_TN: ar-rTN, ar_YE: ar-rYE, arn_CL: arn-rCL, as_IN: as-rIN, az_AZ: az-rAZ, ba_RU: ba-rRU, be_BY: be-rBY, bg_BG: bg-rBG, bn_BD: bn-rBD, bn_IN: bn-rIN, bo_CN: bo-rCN, br_FR: br-rFR, bs_BA: bs-rBA, ca_ES: ca-rES, co_FR: co-rFR, cs_CZ: cs-rCZ, cy_GB: cy-rGB, da_DK: da-rDK, de_AT: de-rAT, de_CH: de-rCH, de_DE: de-rDE, de_LI: de-rLI, de_LU: de-rLU, dsb_DE: dsb-rDE, dv_MV: dv-rMV, el_GR: el-rGR, en_AU: en-rAU, en_BZ: en-rBZ, en_CA: en-rCA, en_GB: en-rGB, en_IE: en-rIE, en_IN: en-rIN, en_JM: en-rJM, en_MY: en-rMY, en_NZ: en-rNZ, en_PH: en-rPH, en_SG: en-rSG, en_TT: en-rTT, en_US: en-rUS, en_ZA: en-rZA, en_ZW: en-rZW, es_AR: es-rAR, es_BO: es-rBO, es_CL: es-rCL, es_CO: es-rCO, es_CR: es-rCR, es_DO: es-rDO, es_EC: es-rEC, es_ES: es-rES, es_GT: es-rGT, es_HN: es-rHN, es_MX: es-rMX, es_NI: es-rNI, es_PA: es-rPA, es_PE: es-rPE, es_PR: es-rPR, es_PY: es-rPY, es_SV: es-rSV, es_US: es-rUS, es_UY: es-rUY, es_VE: es-rVE, et_EE: et-rEE, eu_ES: eu-rES, fa_IR: fa-rIR, fi_FI: fi-rFI, fil_PH: fil-rPH, fo_FO: fo-rFO, fr_BE: fr-rBE, fr_CA: fr-rCA, fr_CH: fr-rCH, fr_FR: fr-rFR, fr_LU: fr-rLU, fr_MC: fr-rMC, fy_NL: fy-rNL, ga_IE: ga-rIE, gd_GB: gd-rGB, gl_ES: gl-rES, gsw_FR: gsw-rFR, gu_IN: gu-rIN, ha_NG: ha-rNG, hi_IN: hi-rIN, hr_BA: hr-rBA, hr_HR: hr-rHR, hsb_DE: hsb-rDE, hu_HU: hu-rHU, hy_AM: hy-rAM, id_ID: id-rID, ig_NG: ig-rNG, ii_CN: ii-rCN, is_IS: is-rIS, it_CH: it-rCH, it_IT: it-rIT, iu_CA: iu-rCA, ja_JP: ja-rJP, ka_GE: ka-rGE, kk_KZ: kk-rKZ, kl_GL: kl-rGL, km_KH: km-rKH, kn_IN: kn-rIN, ko_KR: ko-rKR, kok_IN: kok-rIN, ky_KG: ky-rKG, lb_LU: lb-rLU, lo_LA: lo-rLA, lt_LT: lt-rLT, lv_LV: lv-rLV, mi_NZ: mi-rNZ, mk_MK: mk-rMK, ml_IN: ml-rIN, mn_CN: mn-rCN, mn_MN: mn-rMN, moh_CA: moh-rCA, mr_IN: mr-rIN, ms_BN: ms-rBN, ms_MY: ms-rMY, mt_MT: mt-rMT, nb_NO: nb-rNO, ne_NP: ne-rNP, nl_BE: nl-rBE, nl_NL: nl-rNL, nn_NO: nn-rNO, nso_ZA: nso-rZA, oc_FR: oc-rFR, or_IN: or-rIN, pa_IN: pa-rIN, pl_PL: pl-rPL, prs_AF: prs-rAF, ps_AF: ps-rAF, pt_BR: pt-rBR, pt_PT: pt-rPT, qut_GT: qut-rGT, quz_BO: quz-rBO, quz_EC: quz-rEC, quz_PE: quz-rPE, rm_CH: rm-rCH, ro_RO: ro-rRO, ru_RU: ru-rRU, rw_RW: rw-rRW, sa_IN: sa-rIN, sah_RU: sah-rRU, se_FI: se-rFI, se_NO: se-rNO, se_SE: se-rSE, si_LK: si-rLK, sk_SK: sk-rSK, sl_SI: sl-rSI, sma_NO: sma-rNO, sma_SE: sma-rSE, smj_NO: smj-rNO, smj_SE: smj-rSE, smn_FI: smn-rFI, sms_FI: sms-rFI, sq_AL: sq-rAL, sr_BA: sr-rBA, sr_CS: sr-rCS, sr_ME: sr-rME, sr_RS: sr-rRS, sv_FI: sv-rFI, sv_SE: sv-rSE, sw_KE: sw-rKE, syr_SY: syr-rSY, ta_IN: ta-rIN, te_IN: te-rIN, tg_TJ: tg-rTJ, th_TH: th-rTH, tk_TM: tk-rTM, tn_ZA: tn-rZA, tr_TR: tr-rTR, tt_RU: tt-rRU, tzm_DZ: tzm-rDZ, ug_CN: ug-rCN, uk_UA: uk-rUA, ur_PK: ur-rPK, uz_UZ: uz-rUZ, vi_VN: vi-rVN, wo_SN: wo-rSN, xh_ZA: xh-rZA, yo_NG: yo-rNG, zh_CN: zh-rCN, zh_HK: zh-rHK, zh_MO: zh-rMO, zh_SG: zh-rSG, zh_TW: zh-rTW, zu_ZA: zu-rZA, no_NO: no-rNO, he_IL: iw-rIL, he: iw
|
||||
|
||||
[open-keychain.api-strings]
|
||||
file_filter = res/values-<lang>/strings.xml
|
||||
source_file = res/values/strings.xml
|
||||
source_lang = en
|
|
@ -1,13 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.openintents.openpgp"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="9"
|
||||
android:targetSdkVersion="19" />
|
||||
|
||||
<application/>
|
||||
|
||||
</manifest>
|
|
@ -1,202 +0,0 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
|
@ -1,21 +0,0 @@
|
|||
# OpenPGP API library
|
||||
|
||||
The OpenPGP API provides methods to execute OpenPGP operations, such as sign, encrypt, decrypt, verify, and more without user interaction from background threads. This is done by connecting your client application to a remote service provided by [OpenKeychain](http://www.openkeychain.org) or other OpenPGP providers.
|
||||
|
||||
For usage instructions, please consult our Wiki page about the [OpenPGP API](https://github.com/open-keychain/open-keychain/wiki/OpenPGP-API).
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
// please leave this here, so this library builds on its own
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:1.2.3'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'android-library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion '19.1'
|
||||
|
||||
// NOTE: We are using the old folder structure to also support Eclipse
|
||||
sourceSets {
|
||||
main {
|
||||
manifest.srcFile 'AndroidManifest.xml'
|
||||
java.srcDirs = ['src']
|
||||
resources.srcDirs = ['src']
|
||||
aidl.srcDirs = ['src']
|
||||
renderscript.srcDirs = ['src']
|
||||
res.srcDirs = ['res']
|
||||
assets.srcDirs = ['assets']
|
||||
}
|
||||
}
|
||||
|
||||
// Do not abort build if lint finds errors
|
||||
lintOptions {
|
||||
abortOnError false
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="keychain-api-library" default="help">
|
||||
|
||||
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||
It contains the path to the SDK. It should *NOT* be checked into
|
||||
Version Control Systems. -->
|
||||
<property file="local.properties" />
|
||||
|
||||
<!-- The ant.properties file can be created by you. It is only edited by the
|
||||
'android' tool to add properties to it.
|
||||
This is the place to change some Ant specific build properties.
|
||||
Here are some properties you may want to change/update:
|
||||
|
||||
source.dir
|
||||
The name of the source directory. Default is 'src'.
|
||||
out.dir
|
||||
The name of the output directory. Default is 'bin'.
|
||||
|
||||
For other overridable properties, look at the beginning of the rules
|
||||
files in the SDK, at tools/ant/build.xml
|
||||
|
||||
Properties related to the SDK location or the project target should
|
||||
be updated using the 'android' tool with the 'update' action.
|
||||
|
||||
This file is an integral part of the build system for your
|
||||
application and should be checked into Version Control Systems.
|
||||
|
||||
-->
|
||||
<property file="ant.properties" />
|
||||
|
||||
<!-- if sdk.dir was not set from one of the property file, then
|
||||
get it from the ANDROID_HOME env var.
|
||||
This must be done before we load project.properties since
|
||||
the proguard config can use sdk.dir -->
|
||||
<property environment="env" />
|
||||
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
|
||||
<isset property="env.ANDROID_HOME" />
|
||||
</condition>
|
||||
|
||||
<!-- The project.properties file is created and updated by the 'android'
|
||||
tool, as well as ADT.
|
||||
|
||||
This contains project specific properties such as project target, and library
|
||||
dependencies. Lower level build properties are stored in ant.properties
|
||||
(or in .classpath for Eclipse projects).
|
||||
|
||||
This file is an integral part of the build system for your
|
||||
application and should be checked into Version Control Systems. -->
|
||||
<loadproperties srcFile="project.properties" />
|
||||
|
||||
<!-- quick check on sdk.dir -->
|
||||
<fail
|
||||
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
|
||||
unless="sdk.dir"
|
||||
/>
|
||||
|
||||
<!--
|
||||
Import per project custom build rules if present at the root of the project.
|
||||
This is the place to put custom intermediary targets such as:
|
||||
-pre-build
|
||||
-pre-compile
|
||||
-post-compile (This is typically used for code obfuscation.
|
||||
Compiled code location: ${out.classes.absolute.dir}
|
||||
If this is not done in place, override ${out.dex.input.absolute.dir})
|
||||
-post-package
|
||||
-post-build
|
||||
-pre-clean
|
||||
-->
|
||||
<import file="custom_rules.xml" optional="true" />
|
||||
|
||||
<!-- Import the actual build file.
|
||||
|
||||
To customize existing targets, there are two options:
|
||||
- Customize only one target:
|
||||
- copy/paste the target into this file, *before* the
|
||||
<import> task.
|
||||
- customize it to your needs.
|
||||
- Customize the whole content of build.xml
|
||||
- copy/paste the content of the rules files (minus the top node)
|
||||
into this file, replacing the <import> task.
|
||||
- customize to your needs.
|
||||
|
||||
***********************
|
||||
****** IMPORTANT ******
|
||||
***********************
|
||||
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
|
||||
in order to avoid having your file be overridden by tools such as "android update project"
|
||||
-->
|
||||
<!-- version-tag: 1 -->
|
||||
<import file="${sdk.dir}/tools/ant/build.xml" />
|
||||
|
||||
</project>
|
|
@ -1,20 +0,0 @@
|
|||
# To enable ProGuard in your project, edit project.properties
|
||||
# to define the proguard.config property as described in that file.
|
||||
#
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the ProGuard
|
||||
# include property in project.properties.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
|
@ -1,15 +0,0 @@
|
|||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||
|
||||
# Project target.
|
||||
target=android-19
|
||||
android.library=true
|
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.3 KiB |
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">Žádný</string>
|
||||
<string name="openpgp_install_openkeychain_via">Instalovat OpenKeychain pomocí %s</string>
|
||||
</resources>
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">Keine Auswahl</string>
|
||||
<string name="openpgp_install_openkeychain_via">Installiere OpenKeychain mit %s</string>
|
||||
</resources>
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">Ninguno</string>
|
||||
<string name="openpgp_install_openkeychain_via">Instalar OpenKeychain mediante %s</string>
|
||||
</resources>
|
|
@ -1,2 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources/>
|
|
@ -1,2 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources/>
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">Aucun</string>
|
||||
<string name="openpgp_install_openkeychain_via">Installer OpenKeychain par %s</string>
|
||||
</resources>
|
|
@ -1,2 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources/>
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">Nessuno</string>
|
||||
<string name="openpgp_install_openkeychain_via">Installa OpenKeychain via %s</string>
|
||||
</resources>
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">無し</string>
|
||||
<string name="openpgp_install_openkeychain_via">%s 経由でOpenKeychainをインストール</string>
|
||||
</resources>
|
|
@ -1,2 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources/>
|
|
@ -1,2 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources/>
|
|
@ -1,2 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources/>
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">Нет</string>
|
||||
<string name="openpgp_install_openkeychain_via">Установить OpenKeychain через %s</string>
|
||||
</resources>
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">Brez</string>
|
||||
<string name="openpgp_install_openkeychain_via">Namesti OpenKeychain prek %s</string>
|
||||
</resources>
|
|
@ -1,2 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources/>
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="openpgp_list_preference_none">Жоден</string>
|
||||
<string name="openpgp_install_openkeychain_via">Встановити OpenKeychain через %s</string>
|
||||
</resources>
|
|
@ -1,2 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources/>
|
|
@ -1,7 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="openpgp_list_preference_none">None</string>
|
||||
<string name="openpgp_install_openkeychain_via">Install OpenKeychain via %s</string>
|
||||
|
||||
</resources>
|
|
@ -1,24 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp;
|
||||
|
||||
interface IOpenPgpService {
|
||||
|
||||
// see OpenPgpApi for documentation
|
||||
Intent execute(in Intent data, in ParcelFileDescriptor input, in ParcelFileDescriptor output);
|
||||
|
||||
}
|
|
@ -1,118 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
/**
|
||||
* Parcelable versioning has been copied from Dashclock Widget
|
||||
* https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java
|
||||
*/
|
||||
public class OpenPgpError implements Parcelable {
|
||||
/**
|
||||
* Since there might be a case where new versions of the client using the library getting
|
||||
* old versions of the protocol (and thus old versions of this class), we need a versioning
|
||||
* system for the parcels sent between the clients and the providers.
|
||||
*/
|
||||
public static final int PARCELABLE_VERSION = 1;
|
||||
|
||||
// possible values for errorId
|
||||
public static final int CLIENT_SIDE_ERROR = -1;
|
||||
public static final int GENERIC_ERROR = 0;
|
||||
public static final int INCOMPATIBLE_API_VERSIONS = 1;
|
||||
public static final int NO_OR_WRONG_PASSPHRASE = 2;
|
||||
public static final int NO_USER_IDS = 3;
|
||||
|
||||
int errorId;
|
||||
String message;
|
||||
|
||||
public OpenPgpError() {
|
||||
}
|
||||
|
||||
public OpenPgpError(int errorId, String message) {
|
||||
this.errorId = errorId;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public OpenPgpError(OpenPgpError b) {
|
||||
this.errorId = b.errorId;
|
||||
this.message = b.message;
|
||||
}
|
||||
|
||||
public int getErrorId() {
|
||||
return errorId;
|
||||
}
|
||||
|
||||
public void setErrorId(int errorId) {
|
||||
this.errorId = errorId;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
/**
|
||||
* NOTE: When adding fields in the process of updating this API, make sure to bump
|
||||
* {@link #PARCELABLE_VERSION}.
|
||||
*/
|
||||
dest.writeInt(PARCELABLE_VERSION);
|
||||
// Inject a placeholder that will store the parcel size from this point on
|
||||
// (not including the size itself).
|
||||
int sizePosition = dest.dataPosition();
|
||||
dest.writeInt(0);
|
||||
int startPosition = dest.dataPosition();
|
||||
// version 1
|
||||
dest.writeInt(errorId);
|
||||
dest.writeString(message);
|
||||
// Go back and write the size
|
||||
int parcelableSize = dest.dataPosition() - startPosition;
|
||||
dest.setDataPosition(sizePosition);
|
||||
dest.writeInt(parcelableSize);
|
||||
dest.setDataPosition(startPosition + parcelableSize);
|
||||
}
|
||||
|
||||
public static final Creator<OpenPgpError> CREATOR = new Creator<OpenPgpError>() {
|
||||
public OpenPgpError createFromParcel(final Parcel source) {
|
||||
int parcelableVersion = source.readInt();
|
||||
int parcelableSize = source.readInt();
|
||||
int startPosition = source.dataPosition();
|
||||
|
||||
OpenPgpError error = new OpenPgpError();
|
||||
error.errorId = source.readInt();
|
||||
error.message = source.readString();
|
||||
|
||||
// skip over all fields added in future versions of this parcel
|
||||
source.setDataPosition(startPosition + parcelableSize);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
public OpenPgpError[] newArray(final int size) {
|
||||
return new OpenPgpError[size];
|
||||
}
|
||||
};
|
||||
}
|
|
@ -1,132 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
/**
|
||||
* Parcelable versioning has been copied from Dashclock Widget
|
||||
* https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java
|
||||
*/
|
||||
public class OpenPgpMetadata implements Parcelable {
|
||||
/**
|
||||
* Since there might be a case where new versions of the client using the library getting
|
||||
* old versions of the protocol (and thus old versions of this class), we need a versioning
|
||||
* system for the parcels sent between the clients and the providers.
|
||||
*/
|
||||
public static final int PARCELABLE_VERSION = 1;
|
||||
|
||||
String filename;
|
||||
String mimeType;
|
||||
long modificationTime;
|
||||
long originalSize;
|
||||
|
||||
public String getFilename() {
|
||||
return filename;
|
||||
}
|
||||
|
||||
public String getMimeType() {
|
||||
return mimeType;
|
||||
}
|
||||
|
||||
public long getModificationTime() {
|
||||
return modificationTime;
|
||||
}
|
||||
|
||||
public long getOriginalSize() {
|
||||
return originalSize;
|
||||
}
|
||||
|
||||
public OpenPgpMetadata() {
|
||||
}
|
||||
|
||||
public OpenPgpMetadata(String filename, String mimeType, long modificationTime,
|
||||
long originalSize) {
|
||||
this.filename = filename;
|
||||
this.mimeType = mimeType;
|
||||
this.modificationTime = modificationTime;
|
||||
this.originalSize = originalSize;
|
||||
}
|
||||
|
||||
public OpenPgpMetadata(OpenPgpMetadata b) {
|
||||
this.filename = b.filename;
|
||||
this.mimeType = b.mimeType;
|
||||
this.modificationTime = b.modificationTime;
|
||||
this.originalSize = b.originalSize;
|
||||
}
|
||||
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
/**
|
||||
* NOTE: When adding fields in the process of updating this API, make sure to bump
|
||||
* {@link #PARCELABLE_VERSION}.
|
||||
*/
|
||||
dest.writeInt(PARCELABLE_VERSION);
|
||||
// Inject a placeholder that will store the parcel size from this point on
|
||||
// (not including the size itself).
|
||||
int sizePosition = dest.dataPosition();
|
||||
dest.writeInt(0);
|
||||
int startPosition = dest.dataPosition();
|
||||
// version 1
|
||||
dest.writeString(filename);
|
||||
dest.writeString(mimeType);
|
||||
dest.writeLong(modificationTime);
|
||||
dest.writeLong(originalSize);
|
||||
// Go back and write the size
|
||||
int parcelableSize = dest.dataPosition() - startPosition;
|
||||
dest.setDataPosition(sizePosition);
|
||||
dest.writeInt(parcelableSize);
|
||||
dest.setDataPosition(startPosition + parcelableSize);
|
||||
}
|
||||
|
||||
public static final Creator<OpenPgpMetadata> CREATOR = new Creator<OpenPgpMetadata>() {
|
||||
public OpenPgpMetadata createFromParcel(final Parcel source) {
|
||||
int parcelableVersion = source.readInt();
|
||||
int parcelableSize = source.readInt();
|
||||
int startPosition = source.dataPosition();
|
||||
|
||||
OpenPgpMetadata vr = new OpenPgpMetadata();
|
||||
vr.filename = source.readString();
|
||||
vr.mimeType = source.readString();
|
||||
vr.modificationTime = source.readLong();
|
||||
vr.originalSize = source.readLong();
|
||||
|
||||
// skip over all fields added in future versions of this parcel
|
||||
source.setDataPosition(startPosition + parcelableSize);
|
||||
|
||||
return vr;
|
||||
}
|
||||
|
||||
public OpenPgpMetadata[] newArray(final int size) {
|
||||
return new OpenPgpMetadata[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String out = "\nfilename: " + filename;
|
||||
out += "\nmimeType: " + mimeType;
|
||||
out += "\nmodificationTime: " + modificationTime;
|
||||
out += "\noriginalSize: " + originalSize;
|
||||
return out;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,183 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import org.openintents.openpgp.util.OpenPgpUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Parcelable versioning has been copied from Dashclock Widget
|
||||
* https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java
|
||||
*/
|
||||
public class OpenPgpSignatureResult implements Parcelable {
|
||||
/**
|
||||
* Since there might be a case where new versions of the client using the library getting
|
||||
* old versions of the protocol (and thus old versions of this class), we need a versioning
|
||||
* system for the parcels sent between the clients and the providers.
|
||||
*/
|
||||
public static final int PARCELABLE_VERSION = 2;
|
||||
|
||||
// generic error on signature verification
|
||||
public static final int SIGNATURE_ERROR = 0;
|
||||
// successfully verified signature, with certified key
|
||||
public static final int SIGNATURE_SUCCESS_CERTIFIED = 1;
|
||||
// no key was found for this signature verification
|
||||
public static final int SIGNATURE_KEY_MISSING = 2;
|
||||
// successfully verified signature, but with uncertified key
|
||||
public static final int SIGNATURE_SUCCESS_UNCERTIFIED = 3;
|
||||
// key has been revoked
|
||||
public static final int SIGNATURE_KEY_REVOKED = 4;
|
||||
// key is expired
|
||||
public static final int SIGNATURE_KEY_EXPIRED = 5;
|
||||
|
||||
int status;
|
||||
boolean signatureOnly;
|
||||
String primaryUserId;
|
||||
ArrayList<String> userIds;
|
||||
long keyId;
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public boolean isSignatureOnly() {
|
||||
return signatureOnly;
|
||||
}
|
||||
|
||||
public void setSignatureOnly(boolean signatureOnly) {
|
||||
this.signatureOnly = signatureOnly;
|
||||
}
|
||||
|
||||
public String getPrimaryUserId() {
|
||||
return primaryUserId;
|
||||
}
|
||||
|
||||
public void setPrimaryUserId(String primaryUserId) {
|
||||
this.primaryUserId = primaryUserId;
|
||||
}
|
||||
|
||||
public ArrayList<String> getUserIds() {
|
||||
return userIds;
|
||||
}
|
||||
|
||||
public void setUserIds(ArrayList<String> userIds) {
|
||||
this.userIds = userIds;
|
||||
}
|
||||
|
||||
public long getKeyId() {
|
||||
return keyId;
|
||||
}
|
||||
|
||||
public void setKeyId(long keyId) {
|
||||
this.keyId = keyId;
|
||||
}
|
||||
|
||||
public OpenPgpSignatureResult() {
|
||||
|
||||
}
|
||||
|
||||
public OpenPgpSignatureResult(int signatureStatus, String signatureUserId,
|
||||
boolean signatureOnly, long keyId, ArrayList<String> userIds) {
|
||||
this.status = signatureStatus;
|
||||
this.signatureOnly = signatureOnly;
|
||||
this.primaryUserId = signatureUserId;
|
||||
this.keyId = keyId;
|
||||
this.userIds = userIds;
|
||||
}
|
||||
|
||||
public OpenPgpSignatureResult(OpenPgpSignatureResult b) {
|
||||
this.status = b.status;
|
||||
this.primaryUserId = b.primaryUserId;
|
||||
this.signatureOnly = b.signatureOnly;
|
||||
this.keyId = b.keyId;
|
||||
this.userIds = b.userIds;
|
||||
}
|
||||
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
/**
|
||||
* NOTE: When adding fields in the process of updating this API, make sure to bump
|
||||
* {@link #PARCELABLE_VERSION}.
|
||||
*/
|
||||
dest.writeInt(PARCELABLE_VERSION);
|
||||
// Inject a placeholder that will store the parcel size from this point on
|
||||
// (not including the size itself).
|
||||
int sizePosition = dest.dataPosition();
|
||||
dest.writeInt(0);
|
||||
int startPosition = dest.dataPosition();
|
||||
// version 1
|
||||
dest.writeInt(status);
|
||||
dest.writeByte((byte) (signatureOnly ? 1 : 0));
|
||||
dest.writeString(primaryUserId);
|
||||
dest.writeLong(keyId);
|
||||
// version 2
|
||||
dest.writeStringList(userIds);
|
||||
// Go back and write the size
|
||||
int parcelableSize = dest.dataPosition() - startPosition;
|
||||
dest.setDataPosition(sizePosition);
|
||||
dest.writeInt(parcelableSize);
|
||||
dest.setDataPosition(startPosition + parcelableSize);
|
||||
}
|
||||
|
||||
public static final Creator<OpenPgpSignatureResult> CREATOR = new Creator<OpenPgpSignatureResult>() {
|
||||
public OpenPgpSignatureResult createFromParcel(final Parcel source) {
|
||||
int parcelableVersion = source.readInt();
|
||||
int parcelableSize = source.readInt();
|
||||
int startPosition = source.dataPosition();
|
||||
|
||||
OpenPgpSignatureResult vr = new OpenPgpSignatureResult();
|
||||
vr.status = source.readInt();
|
||||
vr.signatureOnly = source.readByte() == 1;
|
||||
vr.primaryUserId = source.readString();
|
||||
vr.keyId = source.readLong();
|
||||
vr.userIds = new ArrayList<String>();
|
||||
source.readStringList(vr.userIds);
|
||||
|
||||
// skip over all fields added in future versions of this parcel
|
||||
source.setDataPosition(startPosition + parcelableSize);
|
||||
|
||||
return vr;
|
||||
}
|
||||
|
||||
public OpenPgpSignatureResult[] newArray(final int size) {
|
||||
return new OpenPgpSignatureResult[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String out = "\nstatus: " + status;
|
||||
out += "\nprimaryUserId: " + primaryUserId;
|
||||
out += "\nuserIds: " + userIds;
|
||||
out += "\nsignatureOnly: " + signatureOnly;
|
||||
out += "\nkeyId: " + OpenPgpUtils.convertKeyIdToHex(keyId);
|
||||
return out;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,306 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp.util;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.util.Log;
|
||||
|
||||
import org.openintents.openpgp.IOpenPgpService;
|
||||
import org.openintents.openpgp.OpenPgpError;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
public class OpenPgpApi {
|
||||
|
||||
public static final String TAG = "OpenPgp API";
|
||||
|
||||
public static final String SERVICE_INTENT = "org.openintents.openpgp.IOpenPgpService";
|
||||
|
||||
/**
|
||||
* Version history
|
||||
* ---------------
|
||||
* <p/>
|
||||
* 3:
|
||||
* - first public stable version
|
||||
* <p/>
|
||||
* 4:
|
||||
* - No changes to existing methods -> backward compatible
|
||||
* - Introduction of ACTION_DECRYPT_METADATA, RESULT_METADATA, EXTRA_ORIGINAL_FILENAME, and OpenPgpMetadata parcel
|
||||
* - Introduction of internal NFC extras: EXTRA_NFC_SIGNED_HASH, EXTRA_NFC_SIG_CREATION_TIMESTAMP
|
||||
* 5:
|
||||
* - OpenPgpSignatureResult: new consts SIGNATURE_KEY_REVOKED and SIGNATURE_KEY_EXPIRED
|
||||
* - OpenPgpSignatureResult: ArrayList<String> userIds
|
||||
*/
|
||||
public static final int API_VERSION = 5;
|
||||
|
||||
/**
|
||||
* General extras
|
||||
* --------------
|
||||
*
|
||||
* required extras:
|
||||
* int EXTRA_API_VERSION (always required)
|
||||
*
|
||||
* returned extras:
|
||||
* int RESULT_CODE (RESULT_CODE_ERROR, RESULT_CODE_SUCCESS or RESULT_CODE_USER_INTERACTION_REQUIRED)
|
||||
* OpenPgpError RESULT_ERROR (if RESULT_CODE == RESULT_CODE_ERROR)
|
||||
* PendingIntent RESULT_INTENT (if RESULT_CODE == RESULT_CODE_USER_INTERACTION_REQUIRED)
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sign only
|
||||
* <p/>
|
||||
* optional extras:
|
||||
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
|
||||
* String EXTRA_PASSPHRASE (key passphrase)
|
||||
*/
|
||||
public static final String ACTION_SIGN = "org.openintents.openpgp.action.SIGN";
|
||||
|
||||
/**
|
||||
* Encrypt
|
||||
* <p/>
|
||||
* required extras:
|
||||
* String[] EXTRA_USER_IDS (=emails of recipients, if more than one key has a user_id, a PendingIntent is returned via RESULT_INTENT)
|
||||
* or
|
||||
* long[] EXTRA_KEY_IDS
|
||||
* <p/>
|
||||
* optional extras:
|
||||
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
|
||||
* String EXTRA_PASSPHRASE (key passphrase)
|
||||
* String EXTRA_ORIGINAL_FILENAME (original filename to be encrypted as metadata)
|
||||
*/
|
||||
public static final String ACTION_ENCRYPT = "org.openintents.openpgp.action.ENCRYPT";
|
||||
|
||||
/**
|
||||
* Sign and encrypt
|
||||
* <p/>
|
||||
* required extras:
|
||||
* String[] EXTRA_USER_IDS (=emails of recipients, if more than one key has a user_id, a PendingIntent is returned via RESULT_INTENT)
|
||||
* or
|
||||
* long[] EXTRA_KEY_IDS
|
||||
* <p/>
|
||||
* optional extras:
|
||||
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
|
||||
* String EXTRA_PASSPHRASE (key passphrase)
|
||||
* String EXTRA_ORIGINAL_FILENAME (original filename to be encrypted as metadata)
|
||||
*/
|
||||
public static final String ACTION_SIGN_AND_ENCRYPT = "org.openintents.openpgp.action.SIGN_AND_ENCRYPT";
|
||||
|
||||
/**
|
||||
* Decrypts and verifies given input stream. This methods handles encrypted-only, signed-and-encrypted,
|
||||
* and also signed-only input.
|
||||
* <p/>
|
||||
* If OpenPgpSignatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_MISSING
|
||||
* in addition a PendingIntent is returned via RESULT_INTENT to download missing keys.
|
||||
* <p/>
|
||||
* optional extras:
|
||||
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
|
||||
* <p/>
|
||||
* returned extras:
|
||||
* OpenPgpSignatureResult RESULT_SIGNATURE
|
||||
* OpenPgpDecryptMetadata RESULT_METADATA
|
||||
*/
|
||||
public static final String ACTION_DECRYPT_VERIFY = "org.openintents.openpgp.action.DECRYPT_VERIFY";
|
||||
|
||||
/**
|
||||
* Decrypts the header of an encrypted file to retrieve metadata such as original filename.
|
||||
* <p/>
|
||||
* This does not decrypt the actual content of the file.
|
||||
* <p/>
|
||||
* returned extras:
|
||||
* OpenPgpDecryptMetadata RESULT_METADATA
|
||||
*/
|
||||
public static final String ACTION_DECRYPT_METADATA = "org.openintents.openpgp.action.DECRYPT_METADATA";
|
||||
|
||||
/**
|
||||
* Get key ids based on given user ids (=emails)
|
||||
* <p/>
|
||||
* required extras:
|
||||
* String[] EXTRA_USER_IDS
|
||||
* <p/>
|
||||
* returned extras:
|
||||
* long[] RESULT_KEY_IDS
|
||||
*/
|
||||
public static final String ACTION_GET_KEY_IDS = "org.openintents.openpgp.action.GET_KEY_IDS";
|
||||
|
||||
/**
|
||||
* This action returns RESULT_CODE_SUCCESS if the OpenPGP Provider already has the key
|
||||
* corresponding to the given key id in its database.
|
||||
* <p/>
|
||||
* It returns RESULT_CODE_USER_INTERACTION_REQUIRED if the Provider does not have the key.
|
||||
* The PendingIntent from RESULT_INTENT can be used to retrieve those from a keyserver.
|
||||
* <p/>
|
||||
* required extras:
|
||||
* long EXTRA_KEY_ID
|
||||
*/
|
||||
public static final String ACTION_GET_KEY = "org.openintents.openpgp.action.GET_KEY";
|
||||
|
||||
/* Intent extras */
|
||||
public static final String EXTRA_API_VERSION = "api_version";
|
||||
|
||||
public static final String EXTRA_ACCOUNT_NAME = "account_name";
|
||||
|
||||
// SIGN, ENCRYPT, SIGN_AND_ENCRYPT, DECRYPT_VERIFY
|
||||
// request ASCII Armor for output
|
||||
// OpenPGP Radix-64, 33 percent overhead compared to binary, see http://tools.ietf.org/html/rfc4880#page-53)
|
||||
public static final String EXTRA_REQUEST_ASCII_ARMOR = "ascii_armor";
|
||||
|
||||
// ENCRYPT, SIGN_AND_ENCRYPT
|
||||
public static final String EXTRA_USER_IDS = "user_ids";
|
||||
public static final String EXTRA_KEY_IDS = "key_ids";
|
||||
// optional extras:
|
||||
public static final String EXTRA_PASSPHRASE = "passphrase";
|
||||
public static final String EXTRA_ORIGINAL_FILENAME = "original_filename";
|
||||
|
||||
// internal NFC states
|
||||
public static final String EXTRA_NFC_SIGNED_HASH = "nfc_signed_hash";
|
||||
public static final String EXTRA_NFC_SIG_CREATION_TIMESTAMP = "nfc_sig_creation_timestamp";
|
||||
public static final String EXTRA_NFC_DECRYPTED_SESSION_KEY = "nfc_decrypted_session_key";
|
||||
|
||||
// GET_KEY
|
||||
public static final String EXTRA_KEY_ID = "key_id";
|
||||
public static final String RESULT_KEY_IDS = "key_ids";
|
||||
|
||||
/* Service Intent returns */
|
||||
public static final String RESULT_CODE = "result_code";
|
||||
|
||||
// get actual error object from RESULT_ERROR
|
||||
public static final int RESULT_CODE_ERROR = 0;
|
||||
// success!
|
||||
public static final int RESULT_CODE_SUCCESS = 1;
|
||||
// get PendingIntent from RESULT_INTENT, start PendingIntent with startIntentSenderForResult,
|
||||
// and execute service method again in onActivityResult
|
||||
public static final int RESULT_CODE_USER_INTERACTION_REQUIRED = 2;
|
||||
|
||||
public static final String RESULT_ERROR = "error";
|
||||
public static final String RESULT_INTENT = "intent";
|
||||
|
||||
// DECRYPT_VERIFY
|
||||
public static final String RESULT_SIGNATURE = "signature";
|
||||
public static final String RESULT_METADATA = "metadata";
|
||||
|
||||
IOpenPgpService mService;
|
||||
Context mContext;
|
||||
|
||||
public OpenPgpApi(Context context, IOpenPgpService service) {
|
||||
this.mContext = context;
|
||||
this.mService = service;
|
||||
}
|
||||
|
||||
public interface IOpenPgpCallback {
|
||||
void onReturn(final Intent result);
|
||||
}
|
||||
|
||||
private class OpenPgpAsyncTask extends AsyncTask<Void, Integer, Intent> {
|
||||
Intent data;
|
||||
InputStream is;
|
||||
OutputStream os;
|
||||
IOpenPgpCallback callback;
|
||||
|
||||
private OpenPgpAsyncTask(Intent data, InputStream is, OutputStream os, IOpenPgpCallback callback) {
|
||||
this.data = data;
|
||||
this.is = is;
|
||||
this.os = os;
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Intent doInBackground(Void... unused) {
|
||||
return executeApi(data, is, os);
|
||||
}
|
||||
|
||||
protected void onPostExecute(Intent result) {
|
||||
callback.onReturn(result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
public void executeApiAsync(Intent data, InputStream is, OutputStream os, IOpenPgpCallback callback) {
|
||||
OpenPgpAsyncTask task = new OpenPgpAsyncTask(data, is, os, callback);
|
||||
|
||||
// don't serialize async tasks!
|
||||
// http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
|
||||
} else {
|
||||
task.execute((Void[]) null);
|
||||
}
|
||||
}
|
||||
|
||||
public Intent executeApi(Intent data, InputStream is, OutputStream os) {
|
||||
try {
|
||||
data.putExtra(EXTRA_API_VERSION, OpenPgpApi.API_VERSION);
|
||||
|
||||
Intent result;
|
||||
|
||||
// pipe the input and output
|
||||
ParcelFileDescriptor input = null;
|
||||
if (is != null) {
|
||||
input = ParcelFileDescriptorUtil.pipeFrom(is,
|
||||
new ParcelFileDescriptorUtil.IThreadListener() {
|
||||
|
||||
@Override
|
||||
public void onThreadFinished(Thread thread) {
|
||||
//Log.d(OpenPgpApi.TAG, "Copy to service finished");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
ParcelFileDescriptor output = null;
|
||||
if (os != null) {
|
||||
output = ParcelFileDescriptorUtil.pipeTo(os,
|
||||
new ParcelFileDescriptorUtil.IThreadListener() {
|
||||
|
||||
@Override
|
||||
public void onThreadFinished(Thread thread) {
|
||||
//Log.d(OpenPgpApi.TAG, "Service finished writing!");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
// blocks until result is ready
|
||||
result = mService.execute(data, input, output);
|
||||
// close() is required to halt the TransferThread
|
||||
if (output != null) {
|
||||
output.close();
|
||||
}
|
||||
// TODO: close input?
|
||||
|
||||
// set class loader to current context to allow unparcelling
|
||||
// of OpenPgpError and OpenPgpSignatureResult
|
||||
// http://stackoverflow.com/a/3806769
|
||||
result.setExtrasClassLoader(mContext.getClassLoader());
|
||||
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
Log.e(OpenPgpApi.TAG, "Exception in executeApi call", e);
|
||||
Intent result = new Intent();
|
||||
result.putExtra(RESULT_CODE, RESULT_CODE_ERROR);
|
||||
result.putExtra(RESULT_ERROR,
|
||||
new OpenPgpError(OpenPgpError.CLIENT_SIDE_ERROR, e.getMessage()));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,257 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp.util;
|
||||
|
||||
import android.app.AlertDialog.Builder;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.preference.DialogPreference;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ListAdapter;
|
||||
import android.widget.TextView;
|
||||
import org.openintents.openpgp.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Does not extend ListPreference, but is very similar to it!
|
||||
* http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/preference/ListPreference.java/?v=source
|
||||
*/
|
||||
public class OpenPgpListPreference extends DialogPreference {
|
||||
private static final String OPENKEYCHAIN_PACKAGE = "org.sufficientlysecure.keychain";
|
||||
private static final String MARKET_INTENT_URI_BASE = "market://details?id=%s";
|
||||
private static final Intent MARKET_INTENT = new Intent(Intent.ACTION_VIEW, Uri.parse(
|
||||
String.format(MARKET_INTENT_URI_BASE, OPENKEYCHAIN_PACKAGE)));
|
||||
|
||||
private ArrayList<OpenPgpProviderEntry> mLegacyList = new ArrayList<OpenPgpProviderEntry>();
|
||||
private ArrayList<OpenPgpProviderEntry> mList = new ArrayList<OpenPgpProviderEntry>();
|
||||
|
||||
private String mSelectedPackage;
|
||||
|
||||
public OpenPgpListPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public OpenPgpListPreference(Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Public method to add new entries for legacy applications
|
||||
*
|
||||
* @param packageName
|
||||
* @param simpleName
|
||||
* @param icon
|
||||
*/
|
||||
public void addLegacyProvider(int position, String packageName, String simpleName, Drawable icon) {
|
||||
mLegacyList.add(position, new OpenPgpProviderEntry(packageName, simpleName, icon));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPrepareDialogBuilder(Builder builder) {
|
||||
mList.clear();
|
||||
|
||||
// add "none"-entry
|
||||
mList.add(0, new OpenPgpProviderEntry("",
|
||||
getContext().getString(R.string.openpgp_list_preference_none),
|
||||
getContext().getResources().getDrawable(R.drawable.ic_action_cancel_launchersize)));
|
||||
|
||||
// add all additional (legacy) providers
|
||||
mList.addAll(mLegacyList);
|
||||
|
||||
// search for OpenPGP providers...
|
||||
ArrayList<OpenPgpProviderEntry> providerList = new ArrayList<OpenPgpProviderEntry>();
|
||||
Intent intent = new Intent(OpenPgpApi.SERVICE_INTENT);
|
||||
List<ResolveInfo> resInfo = getContext().getPackageManager().queryIntentServices(intent, 0);
|
||||
if (!resInfo.isEmpty()) {
|
||||
for (ResolveInfo resolveInfo : resInfo) {
|
||||
if (resolveInfo.serviceInfo == null)
|
||||
continue;
|
||||
|
||||
String packageName = resolveInfo.serviceInfo.packageName;
|
||||
String simpleName = String.valueOf(resolveInfo.serviceInfo.loadLabel(getContext()
|
||||
.getPackageManager()));
|
||||
Drawable icon = resolveInfo.serviceInfo.loadIcon(getContext().getPackageManager());
|
||||
|
||||
providerList.add(new OpenPgpProviderEntry(packageName, simpleName, icon));
|
||||
}
|
||||
}
|
||||
|
||||
if (providerList.isEmpty()) {
|
||||
// add install links if provider list is empty
|
||||
resInfo = getContext().getPackageManager().queryIntentActivities
|
||||
(MARKET_INTENT, 0);
|
||||
for (ResolveInfo resolveInfo : resInfo) {
|
||||
Intent marketIntent = new Intent(MARKET_INTENT);
|
||||
marketIntent.setPackage(resolveInfo.activityInfo.packageName);
|
||||
Drawable icon = resolveInfo.activityInfo.loadIcon(getContext().getPackageManager());
|
||||
String marketName = String.valueOf(resolveInfo.activityInfo.applicationInfo
|
||||
.loadLabel(getContext().getPackageManager()));
|
||||
String simpleName = String.format(getContext().getString(R.string
|
||||
.openpgp_install_openkeychain_via), marketName);
|
||||
mList.add(new OpenPgpProviderEntry(OPENKEYCHAIN_PACKAGE, simpleName,
|
||||
icon, marketIntent));
|
||||
}
|
||||
} else {
|
||||
// add provider
|
||||
mList.addAll(providerList);
|
||||
}
|
||||
|
||||
// Init ArrayAdapter with OpenPGP Providers
|
||||
ListAdapter adapter = new ArrayAdapter<OpenPgpProviderEntry>(getContext(),
|
||||
android.R.layout.select_dialog_singlechoice, android.R.id.text1, mList) {
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
// User super class to create the View
|
||||
View v = super.getView(position, convertView, parent);
|
||||
TextView tv = (TextView) v.findViewById(android.R.id.text1);
|
||||
|
||||
// Put the image on the TextView
|
||||
tv.setCompoundDrawablesWithIntrinsicBounds(mList.get(position).icon, null,
|
||||
null, null);
|
||||
|
||||
// Add margin between image and text (support various screen densities)
|
||||
int dp10 = (int) (10 * getContext().getResources().getDisplayMetrics().density + 0.5f);
|
||||
tv.setCompoundDrawablePadding(dp10);
|
||||
|
||||
return v;
|
||||
}
|
||||
};
|
||||
|
||||
builder.setSingleChoiceItems(adapter, getIndexOfProviderList(getValue()),
|
||||
new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
OpenPgpProviderEntry entry = mList.get(which);
|
||||
|
||||
if (entry.intent != null) {
|
||||
/*
|
||||
* Intents are called as activity
|
||||
*
|
||||
* Current approach is to assume the user installed the app.
|
||||
* If he does not, the selected package is not valid.
|
||||
*
|
||||
* However applications should always consider this could happen,
|
||||
* as the user might remove the currently used OpenPGP app.
|
||||
*/
|
||||
getContext().startActivity(entry.intent);
|
||||
}
|
||||
|
||||
mSelectedPackage = entry.packageName;
|
||||
|
||||
/*
|
||||
* Clicking on an item simulates the positive button click, and dismisses
|
||||
* the dialog.
|
||||
*/
|
||||
OpenPgpListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
* The typical interaction for list-based dialogs is to have click-on-an-item dismiss the
|
||||
* dialog instead of the user having to press 'Ok'.
|
||||
*/
|
||||
builder.setPositiveButton(null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDialogClosed(boolean positiveResult) {
|
||||
super.onDialogClosed(positiveResult);
|
||||
|
||||
if (positiveResult && (mSelectedPackage != null)) {
|
||||
if (callChangeListener(mSelectedPackage)) {
|
||||
setValue(mSelectedPackage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int getIndexOfProviderList(String packageName) {
|
||||
for (OpenPgpProviderEntry app : mList) {
|
||||
if (app.packageName.equals(packageName)) {
|
||||
return mList.indexOf(app);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public void setValue(String packageName) {
|
||||
mSelectedPackage = packageName;
|
||||
persistString(packageName);
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return mSelectedPackage;
|
||||
}
|
||||
|
||||
public String getEntry() {
|
||||
return getEntryByValue(mSelectedPackage);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object onGetDefaultValue(TypedArray a, int index) {
|
||||
return a.getString(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
|
||||
setValue(restoreValue ? getPersistedString(mSelectedPackage) : (String) defaultValue);
|
||||
}
|
||||
|
||||
public String getEntryByValue(String packageName) {
|
||||
for (OpenPgpProviderEntry app : mList) {
|
||||
if (app.packageName.equals(packageName)) {
|
||||
return app.simpleName;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static class OpenPgpProviderEntry {
|
||||
private String packageName;
|
||||
private String simpleName;
|
||||
private Drawable icon;
|
||||
private Intent intent;
|
||||
|
||||
public OpenPgpProviderEntry(String packageName, String simpleName, Drawable icon) {
|
||||
this.packageName = packageName;
|
||||
this.simpleName = simpleName;
|
||||
this.icon = icon;
|
||||
}
|
||||
|
||||
public OpenPgpProviderEntry(String packageName, String simpleName, Drawable icon, Intent intent) {
|
||||
this(packageName, simpleName, icon);
|
||||
this.intent = intent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return simpleName;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,124 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp.util;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.IBinder;
|
||||
|
||||
import org.openintents.openpgp.IOpenPgpService;
|
||||
|
||||
public class OpenPgpServiceConnection {
|
||||
|
||||
// callback interface
|
||||
public interface OnBound {
|
||||
public void onBound(IOpenPgpService service);
|
||||
|
||||
public void onError(Exception e);
|
||||
}
|
||||
|
||||
private Context mApplicationContext;
|
||||
|
||||
private IOpenPgpService mService;
|
||||
private String mProviderPackageName;
|
||||
|
||||
private OnBound mOnBoundListener;
|
||||
|
||||
/**
|
||||
* Create new connection
|
||||
*
|
||||
* @param context
|
||||
* @param providerPackageName specify package name of OpenPGP provider,
|
||||
* e.g., "org.sufficientlysecure.keychain"
|
||||
*/
|
||||
public OpenPgpServiceConnection(Context context, String providerPackageName) {
|
||||
this.mApplicationContext = context.getApplicationContext();
|
||||
this.mProviderPackageName = providerPackageName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new connection with callback
|
||||
*
|
||||
* @param context
|
||||
* @param providerPackageName specify package name of OpenPGP provider,
|
||||
* e.g., "org.sufficientlysecure.keychain"
|
||||
* @param onBoundListener callback, executed when connection to service has been established
|
||||
*/
|
||||
public OpenPgpServiceConnection(Context context, String providerPackageName,
|
||||
OnBound onBoundListener) {
|
||||
this(context, providerPackageName);
|
||||
this.mOnBoundListener = onBoundListener;
|
||||
}
|
||||
|
||||
public IOpenPgpService getService() {
|
||||
return mService;
|
||||
}
|
||||
|
||||
public boolean isBound() {
|
||||
return (mService != null);
|
||||
}
|
||||
|
||||
private ServiceConnection mServiceConnection = new ServiceConnection() {
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
mService = IOpenPgpService.Stub.asInterface(service);
|
||||
if (mOnBoundListener != null) {
|
||||
mOnBoundListener.onBound(mService);
|
||||
}
|
||||
}
|
||||
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
mService = null;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* If not already bound, bind to service!
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public void bindToService() {
|
||||
// if not already bound...
|
||||
if (mService == null) {
|
||||
try {
|
||||
Intent serviceIntent = new Intent(OpenPgpApi.SERVICE_INTENT);
|
||||
// NOTE: setPackage is very important to restrict the intent to this provider only!
|
||||
serviceIntent.setPackage(mProviderPackageName);
|
||||
boolean connect = mApplicationContext.bindService(serviceIntent, mServiceConnection,
|
||||
Context.BIND_AUTO_CREATE);
|
||||
if (!connect) {
|
||||
throw new Exception("bindService() returned false!");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (mOnBoundListener != null) {
|
||||
mOnBoundListener.onError(e);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// already bound, but also inform client about it with callback
|
||||
if (mOnBoundListener != null) {
|
||||
mOnBoundListener.onBound(mService);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void unbindFromService() {
|
||||
mApplicationContext.unbindService(mServiceConnection);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp.util;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ResolveInfo;
|
||||
|
||||
public class OpenPgpUtils {
|
||||
|
||||
public static final Pattern PGP_MESSAGE = Pattern.compile(
|
||||
".*?(-----BEGIN PGP MESSAGE-----.*?-----END PGP MESSAGE-----).*",
|
||||
Pattern.DOTALL);
|
||||
|
||||
public static final Pattern PGP_SIGNED_MESSAGE = Pattern.compile(
|
||||
".*?(-----BEGIN PGP SIGNED MESSAGE-----.*?-----BEGIN PGP SIGNATURE-----.*?-----END PGP SIGNATURE-----).*",
|
||||
Pattern.DOTALL);
|
||||
|
||||
public static final int PARSE_RESULT_NO_PGP = -1;
|
||||
public static final int PARSE_RESULT_MESSAGE = 0;
|
||||
public static final int PARSE_RESULT_SIGNED_MESSAGE = 1;
|
||||
|
||||
public static int parseMessage(String message) {
|
||||
Matcher matcherSigned = PGP_SIGNED_MESSAGE.matcher(message);
|
||||
Matcher matcherMessage = PGP_MESSAGE.matcher(message);
|
||||
|
||||
if (matcherMessage.matches()) {
|
||||
return PARSE_RESULT_MESSAGE;
|
||||
} else if (matcherSigned.matches()) {
|
||||
return PARSE_RESULT_SIGNED_MESSAGE;
|
||||
} else {
|
||||
return PARSE_RESULT_NO_PGP;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isAvailable(Context context) {
|
||||
Intent intent = new Intent(OpenPgpApi.SERVICE_INTENT);
|
||||
List<ResolveInfo> resInfo = context.getPackageManager().queryIntentServices(intent, 0);
|
||||
if (!resInfo.isEmpty()) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static String convertKeyIdToHex(long keyId) {
|
||||
return "0x" + convertKeyIdToHex32bit(keyId >> 32) + convertKeyIdToHex32bit(keyId);
|
||||
}
|
||||
|
||||
private static String convertKeyIdToHex32bit(long keyId) {
|
||||
String hexString = Long.toHexString(keyId & 0xffffffffL).toLowerCase(Locale.ENGLISH);
|
||||
while (hexString.length() < 8) {
|
||||
hexString = "0" + hexString;
|
||||
}
|
||||
return hexString;
|
||||
}
|
||||
}
|
|
@ -1,106 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
* 2013 Florian Schmaus <flo@geekplace.eu>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openintents.openpgp.util;
|
||||
|
||||
import android.os.ParcelFileDescriptor;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
* Partially based on <a href="http://stackoverflow.com/questions/18212152/">Stackoverflow: Transfer InputStream to another Service (across process boundaries)</a>
|
||||
**/
|
||||
public class ParcelFileDescriptorUtil {
|
||||
|
||||
public interface IThreadListener {
|
||||
void onThreadFinished(final Thread thread);
|
||||
}
|
||||
|
||||
public static ParcelFileDescriptor pipeFrom(InputStream inputStream, IThreadListener listener)
|
||||
throws IOException {
|
||||
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
|
||||
ParcelFileDescriptor readSide = pipe[0];
|
||||
ParcelFileDescriptor writeSide = pipe[1];
|
||||
|
||||
// start the transfer thread
|
||||
new TransferThread(inputStream, new ParcelFileDescriptor.AutoCloseOutputStream(writeSide),
|
||||
listener)
|
||||
.start();
|
||||
|
||||
return readSide;
|
||||
}
|
||||
|
||||
public static ParcelFileDescriptor pipeTo(OutputStream outputStream, IThreadListener listener)
|
||||
throws IOException {
|
||||
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
|
||||
ParcelFileDescriptor readSide = pipe[0];
|
||||
ParcelFileDescriptor writeSide = pipe[1];
|
||||
|
||||
// start the transfer thread
|
||||
new TransferThread(new ParcelFileDescriptor.AutoCloseInputStream(readSide), outputStream,
|
||||
listener)
|
||||
.start();
|
||||
|
||||
return writeSide;
|
||||
}
|
||||
|
||||
static class TransferThread extends Thread {
|
||||
final InputStream mIn;
|
||||
final OutputStream mOut;
|
||||
final IThreadListener mListener;
|
||||
|
||||
TransferThread(InputStream in, OutputStream out, IThreadListener listener) {
|
||||
super("ParcelFileDescriptor Transfer Thread");
|
||||
mIn = in;
|
||||
mOut = out;
|
||||
mListener = listener;
|
||||
setDaemon(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
byte[] buf = new byte[1024];
|
||||
int len;
|
||||
|
||||
try {
|
||||
while ((len = mIn.read(buf)) > 0) {
|
||||
mOut.write(buf, 0, len);
|
||||
}
|
||||
mOut.flush(); // just to be safe
|
||||
} catch (IOException e) {
|
||||
//Log.e(OpenPgpApi.TAG, "TransferThread" + getId() + ": writing failed", e);
|
||||
} finally {
|
||||
try {
|
||||
mIn.close();
|
||||
} catch (IOException e) {
|
||||
//Log.e(OpenPgpApi.TAG, "TransferThread" + getId(), e);
|
||||
}
|
||||
try {
|
||||
mOut.close();
|
||||
} catch (IOException e) {
|
||||
//Log.e(OpenPgpApi.TAG, "TransferThread" + getId(), e);
|
||||
}
|
||||
}
|
||||
if (mListener != null) {
|
||||
//Log.d(OpenPgpApi.TAG, "TransferThread " + getId() + " finished!");
|
||||
mListener.onThreadFinished(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
# To enable ProGuard in your project, edit project.properties
|
||||
# to define the proguard.config property as described in that file.
|
||||
#
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the ProGuard
|
||||
# include property in project.properties.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
|
@ -1,27 +0,0 @@
|
|||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in /home/sam/android-sdk-linux/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the ProGuard
|
||||
# include property in project.properties.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
-dontwarn javax.naming.**
|
||||
|
||||
-keep class * extends java.util.ListResourceBundle {
|
||||
protected Object[][] getContents();
|
||||
}
|
||||
|
||||
-keepnames class * implements android.os.Parcelable {
|
||||
public static final ** CREATOR;
|
||||
}
|
BIN
screenshots.png
Before Width: | Height: | Size: 1011 KiB After Width: | Height: | Size: 195 KiB |
|
@ -1,4 +1,3 @@
|
|||
include ':libs:MemorizingTrustManager'
|
||||
include ':libs:openpgp-api-lib'
|
||||
|
||||
rootProject.name = 'Conversations'
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
package eu.siacs.conversations.services;
|
||||
|
||||
import eu.siacs.conversations.entities.Account;
|
||||
|
||||
public class PushManagementService {
|
||||
|
||||
protected final XmppConnectionService mXmppConnectionService;
|
||||
|
||||
public PushManagementService(XmppConnectionService service) {
|
||||
this.mXmppConnectionService = service;
|
||||
}
|
||||
|
||||
public void registerPushTokenOnServer(Account account) {
|
||||
//stub implementation. only affects playstore flavor
|
||||
}
|
||||
|
||||
public boolean available(Account account) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isStub() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean availableAndUseful(Account account) {
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,8 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest
|
||||
package="eu.siacs.conversations"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="eu.siacs.conversations">
|
||||
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
|
@ -14,20 +13,34 @@
|
|||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||
|
||||
<uses-permission
|
||||
android:name="android.permission.READ_PHONE_STATE"
|
||||
tools:node="remove" />
|
||||
|
||||
<uses-sdk tools:overrideLibrary="net.ypresto.androidtranscoder" />
|
||||
|
||||
|
||||
<application
|
||||
android:networkSecurityConfig="@xml/network_security_configuration"
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/ConversationsTheme"
|
||||
tools:replace="android:label" >
|
||||
tools:replace="android:label">
|
||||
|
||||
<meta-data android:name="com.google.android.gms.car.application"
|
||||
android:resource="@xml/automotive_app_desc" />
|
||||
|
||||
<service android:name=".services.XmppConnectionService" />
|
||||
|
||||
<receiver android:name=".services.EventReceiver" >
|
||||
<receiver android:name=".services.EventReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
|
||||
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
|
||||
<action android:name="android.media.RINGER_MODE_CHANGED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
|
@ -35,7 +48,9 @@
|
|||
android:name=".ui.ConversationActivity"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleTask"
|
||||
android:windowSoftInputMode="stateHidden" >
|
||||
android:minWidth="300dp"
|
||||
android:minHeight="300dp"
|
||||
android:windowSoftInputMode="stateHidden">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
|
@ -44,8 +59,8 @@
|
|||
</activity>
|
||||
<activity
|
||||
android:name=".ui.StartConversationActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/title_activity_start_conversation" >
|
||||
android:label="@string/title_activity_start_conversation"
|
||||
android:launchMode="singleTask">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SENDTO" />
|
||||
|
||||
|
@ -69,7 +84,33 @@
|
|||
|
||||
<data android:scheme="xmpp" />
|
||||
</intent-filter>
|
||||
<intent-filter android:autoVerify="true">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<data android:scheme="https" />
|
||||
<data android:host="conversations.im" />
|
||||
<data android:pathPrefix="/i/" />
|
||||
<data android:pathPrefix="/j/" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".ui.WelcomeActivity"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleTask"/>
|
||||
<activity
|
||||
android:name=".ui.MagicCreateActivity"
|
||||
android:label="@string/create_account"
|
||||
android:launchMode="singleTask"/>
|
||||
<activity
|
||||
android:name=".ui.SetPresenceActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/change_presence"
|
||||
android:launchMode="singleTask"
|
||||
android:windowSoftInputMode="stateHidden|adjustResize" />
|
||||
<activity
|
||||
android:name=".ui.SettingsActivity"
|
||||
android:label="@string/title_activity_settings" />
|
||||
|
@ -79,15 +120,16 @@
|
|||
<activity
|
||||
android:name=".ui.BlocklistActivity"
|
||||
android:label="@string/title_activity_block_list" />
|
||||
<activity
|
||||
android:name=".ui.ChangePasswordActivity"
|
||||
android:label="@string/change_password_on_server" />
|
||||
<activity
|
||||
android:name=".ui.ChangePasswordActivity"
|
||||
android:label="@string/change_password_on_server" />
|
||||
<activity
|
||||
android:name=".ui.ManageAccountActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/title_activity_manage_accounts" />
|
||||
android:label="@string/title_activity_manage_accounts"
|
||||
android:launchMode="singleTask" />
|
||||
<activity
|
||||
android:name=".ui.EditAccountActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:windowSoftInputMode="stateHidden|adjustResize" />
|
||||
<activity
|
||||
android:name=".ui.ConferenceDetailsActivity"
|
||||
|
@ -107,7 +149,7 @@
|
|||
android:windowSoftInputMode="stateHidden" />
|
||||
<activity
|
||||
android:name=".ui.ShareWithActivity"
|
||||
android:label="@string/app_name" >
|
||||
android:label="@string/app_name">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
|
||||
|
@ -129,19 +171,54 @@
|
|||
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
|
||||
<meta-data
|
||||
android:name="android.service.chooser.chooser_target_service"
|
||||
android:value=".services.ContactChooserTargetService" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".ui.TrustKeysActivity"
|
||||
android:label="@string/trust_omemo_fingerprints"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name="de.duenndns.ssl.MemorizingActivity"
|
||||
android:theme="@style/ConversationsTheme"
|
||||
tools:replace="android:theme"/>
|
||||
tools:replace="android:theme" />
|
||||
<activity
|
||||
android:name=".ui.AboutActivity"
|
||||
android:label="@string/title_activity_about"
|
||||
android:parentActivityName=".ui.SettingsActivity" >
|
||||
android:parentActivityName=".ui.SettingsActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="eu.siacs.conversations.ui.SettingsActivity" />
|
||||
</activity>
|
||||
<activity android:name="com.soundcloud.android.crop.CropImageActivity" />
|
||||
|
||||
<service android:name=".services.ExportLogsService" />
|
||||
<service
|
||||
android:name=".services.ContactChooserTargetService"
|
||||
android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.chooser.ChooserTargetService" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<provider
|
||||
android:name="android.support.v4.content.FileProvider"
|
||||
android:authorities="${applicationId}.files"
|
||||
android:exported="false"
|
||||
android:grantUriPermissions="true">
|
||||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
android:resource="@xml/file_paths" />
|
||||
</provider>
|
||||
<provider
|
||||
android:authorities="${applicationId}.barcodes"
|
||||
android:name=".services.BarcodeProvider"
|
||||
android:exported="false"
|
||||
android:grantUriPermissions="true"/>
|
||||
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
|
|
@ -6,39 +6,115 @@ import eu.siacs.conversations.xmpp.chatstate.ChatState;
|
|||
|
||||
public final class Config {
|
||||
|
||||
|
||||
private static final int UNENCRYPTED = 1;
|
||||
private static final int OPENPGP = 2;
|
||||
private static final int OTR = 4;
|
||||
private static final int OMEMO = 8;
|
||||
|
||||
private static final int ENCRYPTION_MASK = UNENCRYPTED | OPENPGP | OTR | OMEMO;
|
||||
|
||||
public static boolean supportUnencrypted() {
|
||||
return (ENCRYPTION_MASK & UNENCRYPTED) != 0;
|
||||
}
|
||||
|
||||
public static boolean supportOpenPgp() {
|
||||
return (ENCRYPTION_MASK & OPENPGP) != 0;
|
||||
}
|
||||
|
||||
public static boolean supportOtr() {
|
||||
return (ENCRYPTION_MASK & OTR) != 0;
|
||||
}
|
||||
|
||||
public static boolean supportOmemo() {
|
||||
return (ENCRYPTION_MASK & OMEMO) != 0;
|
||||
}
|
||||
|
||||
public static boolean multipleEncryptionChoices() {
|
||||
return (ENCRYPTION_MASK & (ENCRYPTION_MASK - 1)) != 0;
|
||||
}
|
||||
|
||||
public static final String LOGTAG = "conversations";
|
||||
|
||||
public static final String BUG_REPORTS = "bugs@conversations.im";
|
||||
|
||||
|
||||
public static final String DOMAIN_LOCK = null; //only allow account creation for this domain
|
||||
public static final String MAGIC_CREATE_DOMAIN = "conversations.im";
|
||||
public static final boolean DISALLOW_REGISTRATION_IN_UI = false; //hide the register checkbox
|
||||
|
||||
public static final boolean ALLOW_NON_TLS_CONNECTIONS = false; //very dangerous. you should have a good reason to set this to true
|
||||
public static final boolean FORCE_ORBOT = false; // always use TOR
|
||||
public static final boolean HIDE_MESSAGE_TEXT_IN_NOTIFICATION = false;
|
||||
public static final boolean SHOW_CONNECTED_ACCOUNTS = false; //show number of connected accounts in foreground notification
|
||||
public static final boolean SHOW_DISABLE_FOREGROUND = false; //if set to true the foreground notification has a button to disable it
|
||||
|
||||
public static final boolean ALWAYS_NOTIFY_BY_DEFAULT = false;
|
||||
|
||||
public static final int PING_MAX_INTERVAL = 300;
|
||||
public static final int IDLE_PING_INTERVAL = 600; //540 is minimum according to docs;
|
||||
public static final int PING_MIN_INTERVAL = 30;
|
||||
public static final int PING_TIMEOUT = 10;
|
||||
public static final int LOW_PING_TIMEOUT = 1; // used after push received
|
||||
public static final int PING_TIMEOUT = 15;
|
||||
public static final int SOCKET_TIMEOUT = 15;
|
||||
public static final int CONNECT_TIMEOUT = 90;
|
||||
public static final int CARBON_GRACE_PERIOD = 60;
|
||||
public static final int CONNECT_DISCO_TIMEOUT = 20;
|
||||
public static final int MINI_GRACE_PERIOD = 750;
|
||||
|
||||
public static final int AVATAR_SIZE = 192;
|
||||
public static final Bitmap.CompressFormat AVATAR_FORMAT = Bitmap.CompressFormat.WEBP;
|
||||
|
||||
public static final int IMAGE_SIZE = 1920;
|
||||
public static final Bitmap.CompressFormat IMAGE_FORMAT = Bitmap.CompressFormat.JPEG;
|
||||
public static final int IMAGE_QUALITY = 75;
|
||||
public static final int IMAGE_MAX_SIZE = 524288; //512KiB
|
||||
|
||||
public static final int MESSAGE_MERGE_WINDOW = 20;
|
||||
|
||||
public static final int PAGE_SIZE = 50;
|
||||
public static final int MAX_NUM_PAGES = 3;
|
||||
|
||||
public static final int PROGRESS_UI_UPDATE_INTERVAL = 750;
|
||||
public static final int REFRESH_UI_INTERVAL = 500;
|
||||
|
||||
public static final boolean NO_PROXY_LOOKUP = false; //useful to debug ibb
|
||||
public static final boolean DISABLE_STRING_PREP = false; // setting to true might increase startup performance
|
||||
public static final boolean EXTENDED_SM_LOGGING = true; // log stanza counts
|
||||
public static final boolean RESET_ATTEMPT_COUNT_ON_NETWORK_CHANGE = true; //setting to true might increase power consumption
|
||||
public static final int MAX_DISPLAY_MESSAGE_CHARS = 4096;
|
||||
public static final int MAX_STORAGE_MESSAGE_CHARS = 1024 * 1024 * 1024;
|
||||
|
||||
public static final long MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;
|
||||
public static final long MAM_MAX_CATCHUP = MILLISECONDS_IN_DAY / 2;
|
||||
public static final int MAM_MAX_MESSAGES = 500;
|
||||
|
||||
public static final long OMEMO_AUTO_EXPIRY = 7 * MILLISECONDS_IN_DAY;
|
||||
public static final boolean REMOVE_BROKEN_DEVICES = false;
|
||||
public static final boolean OMEMO_PADDING = false;
|
||||
public static boolean PUT_AUTH_TAG_INTO_KEY = true;
|
||||
|
||||
|
||||
public static final boolean DISABLE_PROXY_LOOKUP = false; //useful to debug ibb
|
||||
public static final boolean DISABLE_HTTP_UPLOAD = false;
|
||||
public static final boolean DISABLE_STRING_PREP = false; // setting to true might increase startup performance
|
||||
public static final boolean EXTENDED_SM_LOGGING = false; // log stanza counts
|
||||
public static final boolean BACKGROUND_STANZA_LOGGING = false; //log all stanzas that were received while the app is in background
|
||||
public static final boolean RESET_ATTEMPT_COUNT_ON_NETWORK_CHANGE = true; //setting to true might increase power consumption
|
||||
|
||||
public static final boolean ENCRYPT_ON_HTTP_UPLOADED = false;
|
||||
|
||||
public static final boolean X509_VERIFICATION = false; //use x509 certificates to verify OMEMO keys
|
||||
|
||||
public static final boolean ONLY_INTERNAL_STORAGE = false; //use internal storage instead of sdcard to save attachments
|
||||
|
||||
public static final boolean IGNORE_ID_REWRITE_IN_MUC = true;
|
||||
|
||||
public static final boolean PARSE_REAL_JID_FROM_MUC_MAM = false; //dangerous if server doesn’t filter
|
||||
|
||||
public static final long MAM_MAX_CATCHUP = MILLISECONDS_IN_DAY * 5;
|
||||
public static final int MAM_MAX_MESSAGES = 750;
|
||||
|
||||
public static final long FREQUENT_RESTARTS_DETECTION_WINDOW = 12 * 60 * 60 * 1000; // 10 hours
|
||||
public static final long FREQUENT_RESTARTS_THRESHOLD = 0; // previous value was 16;
|
||||
|
||||
public static final ChatState DEFAULT_CHATSTATE = ChatState.ACTIVE;
|
||||
public static final int TYPING_TIMEOUT = 8;
|
||||
|
||||
public static final int EXPIRY_INTERVAL = 30 * 60 * 1000; // 30 minutes
|
||||
|
||||
public static final String ENABLED_CIPHERS[] = {
|
||||
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
|
||||
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA384",
|
||||
|
@ -77,6 +153,5 @@ public final class Config {
|
|||
};
|
||||
|
||||
private Config() {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,20 @@
|
|||
package eu.siacs.conversations.crypto;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import net.java.otr4j.OtrEngineHost;
|
||||
import net.java.otr4j.OtrException;
|
||||
import net.java.otr4j.OtrPolicy;
|
||||
import net.java.otr4j.OtrPolicyImpl;
|
||||
import net.java.otr4j.crypto.OtrCryptoEngineImpl;
|
||||
import net.java.otr4j.crypto.OtrCryptoException;
|
||||
import net.java.otr4j.session.FragmenterInstructions;
|
||||
import net.java.otr4j.session.InstanceTag;
|
||||
import net.java.otr4j.session.SessionID;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.security.KeyFactory;
|
||||
import java.security.KeyPair;
|
||||
|
@ -11,31 +26,16 @@ import java.security.spec.DSAPrivateKeySpec;
|
|||
import java.security.spec.DSAPublicKeySpec;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import eu.siacs.conversations.Config;
|
||||
import eu.siacs.conversations.entities.Account;
|
||||
import eu.siacs.conversations.entities.Conversation;
|
||||
import eu.siacs.conversations.generator.MessageGenerator;
|
||||
import eu.siacs.conversations.services.XmppConnectionService;
|
||||
import eu.siacs.conversations.utils.CryptoHelper;
|
||||
import eu.siacs.conversations.xmpp.chatstate.ChatState;
|
||||
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
||||
import eu.siacs.conversations.xmpp.jid.Jid;
|
||||
import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
|
||||
|
||||
import net.java.otr4j.OtrEngineHost;
|
||||
import net.java.otr4j.OtrException;
|
||||
import net.java.otr4j.OtrPolicy;
|
||||
import net.java.otr4j.OtrPolicyImpl;
|
||||
import net.java.otr4j.crypto.OtrCryptoEngineImpl;
|
||||
import net.java.otr4j.crypto.OtrCryptoException;
|
||||
import net.java.otr4j.session.InstanceTag;
|
||||
import net.java.otr4j.session.SessionID;
|
||||
import net.java.otr4j.session.FragmenterInstructions;
|
||||
|
||||
public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
|
||||
|
||||
private Account account;
|
||||
|
@ -53,28 +53,30 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
|
|||
this.mXmppConnectionService = service;
|
||||
}
|
||||
|
||||
private KeyPair loadKey(JSONObject keys) {
|
||||
private KeyPair loadKey(final JSONObject keys) {
|
||||
if (keys == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
BigInteger x = new BigInteger(keys.getString("otr_x"), 16);
|
||||
BigInteger y = new BigInteger(keys.getString("otr_y"), 16);
|
||||
BigInteger p = new BigInteger(keys.getString("otr_p"), 16);
|
||||
BigInteger q = new BigInteger(keys.getString("otr_q"), 16);
|
||||
BigInteger g = new BigInteger(keys.getString("otr_g"), 16);
|
||||
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
|
||||
DSAPublicKeySpec pubKeySpec = new DSAPublicKeySpec(y, p, q, g);
|
||||
DSAPrivateKeySpec privateKeySpec = new DSAPrivateKeySpec(x, p, q, g);
|
||||
PublicKey publicKey = keyFactory.generatePublic(pubKeySpec);
|
||||
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
|
||||
return new KeyPair(publicKey, privateKey);
|
||||
} catch (JSONException e) {
|
||||
return null;
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
return null;
|
||||
} catch (InvalidKeySpecException e) {
|
||||
return null;
|
||||
synchronized (keys) {
|
||||
try {
|
||||
BigInteger x = new BigInteger(keys.getString("otr_x"), 16);
|
||||
BigInteger y = new BigInteger(keys.getString("otr_y"), 16);
|
||||
BigInteger p = new BigInteger(keys.getString("otr_p"), 16);
|
||||
BigInteger q = new BigInteger(keys.getString("otr_q"), 16);
|
||||
BigInteger g = new BigInteger(keys.getString("otr_g"), 16);
|
||||
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
|
||||
DSAPublicKeySpec pubKeySpec = new DSAPublicKeySpec(y, p, q, g);
|
||||
DSAPrivateKeySpec privateKeySpec = new DSAPrivateKeySpec(x, p, q, g);
|
||||
PublicKey publicKey = keyFactory.generatePublic(pubKeySpec);
|
||||
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
|
||||
return new KeyPair(publicKey, privateKey);
|
||||
} catch (JSONException e) {
|
||||
return null;
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
return null;
|
||||
} catch (InvalidKeySpecException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -122,7 +124,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
|
|||
|
||||
@Override
|
||||
public String getFallbackMessage(SessionID arg0) {
|
||||
return "I would like to start a private (OTR encrypted) conversation but your client doesn’t seem to support that";
|
||||
return MessageGenerator.OTR_FALLBACK_MESSAGE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -180,10 +182,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
|
|||
packet.setAttribute("to", session.getAccountID() + "/" + session.getUserID());
|
||||
}
|
||||
packet.setBody(body);
|
||||
packet.addChild("private", "urn:xmpp:carbons:2");
|
||||
packet.addChild("no-copy", "urn:xmpp:hints");
|
||||
packet.addChild("no-permanent-store", "urn:xmpp:hints");
|
||||
|
||||
MessageGenerator.addMessageHints(packet);
|
||||
try {
|
||||
Jid jid = Jid.fromSessionID(session);
|
||||
Conversation conversation = mXmppConnectionService.find(account,jid);
|
||||
|
@ -195,8 +194,9 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
|
|||
} catch (final InvalidJidException ignored) {
|
||||
|
||||
}
|
||||
|
||||
packet.setType(MessagePacket.TYPE_CHAT);
|
||||
packet.addChild("encryption","urn:xmpp:eme:0")
|
||||
.setAttribute("namespace","urn:xmpp:otr:0");
|
||||
account.getXmppConnection().sendMessagePacket(packet);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,240 @@
|
|||
package eu.siacs.conversations.crypto;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Intent;
|
||||
|
||||
import org.openintents.openpgp.util.OpenPgpApi;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import eu.siacs.conversations.entities.Conversation;
|
||||
import eu.siacs.conversations.entities.DownloadableFile;
|
||||
import eu.siacs.conversations.entities.Message;
|
||||
import eu.siacs.conversations.http.HttpConnectionManager;
|
||||
import eu.siacs.conversations.services.XmppConnectionService;
|
||||
|
||||
public class PgpDecryptionService {
|
||||
|
||||
private final XmppConnectionService mXmppConnectionService;
|
||||
private OpenPgpApi openPgpApi = null;
|
||||
|
||||
protected final ArrayDeque<Message> messages = new ArrayDeque();
|
||||
protected final HashSet<Message> pendingNotifications = new HashSet<>();
|
||||
Message currentMessage;
|
||||
private PendingIntent pendingIntent;
|
||||
|
||||
|
||||
public PgpDecryptionService(XmppConnectionService service) {
|
||||
this.mXmppConnectionService = service;
|
||||
}
|
||||
|
||||
public synchronized boolean decrypt(final Message message, boolean notify) {
|
||||
messages.add(message);
|
||||
if (notify && pendingIntent == null) {
|
||||
pendingNotifications.add(message);
|
||||
continueDecryption();
|
||||
return false;
|
||||
} else {
|
||||
continueDecryption();
|
||||
return notify;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void decrypt(final List<Message> list) {
|
||||
for(Message message : list) {
|
||||
if (message.getEncryption() == Message.ENCRYPTION_PGP) {
|
||||
messages.add(message);
|
||||
}
|
||||
}
|
||||
continueDecryption();
|
||||
}
|
||||
|
||||
public synchronized void discard(List<Message> discards) {
|
||||
this.messages.removeAll(discards);
|
||||
this.pendingNotifications.removeAll(discards);
|
||||
}
|
||||
|
||||
public synchronized void discard(Message message) {
|
||||
this.messages.remove(message);
|
||||
this.pendingNotifications.remove(message);
|
||||
}
|
||||
|
||||
public void giveUpCurrentDecryption(){
|
||||
Message message;
|
||||
synchronized (this) {
|
||||
if(currentMessage != null) {
|
||||
return;
|
||||
}
|
||||
message = messages.peekFirst();
|
||||
if (message == null) {
|
||||
return;
|
||||
}
|
||||
discard(message);
|
||||
}
|
||||
synchronized (message){
|
||||
if (message.getEncryption() == Message.ENCRYPTION_PGP) {
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
|
||||
}
|
||||
}
|
||||
mXmppConnectionService.updateMessage(message);
|
||||
continueDecryption(true);
|
||||
}
|
||||
|
||||
protected synchronized void decryptNext() {
|
||||
if (pendingIntent == null
|
||||
&& getOpenPgpApi() != null
|
||||
&& (currentMessage = messages.poll()) != null) {
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
executeApi(currentMessage);
|
||||
decryptNext();
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void continueDecryption(boolean resetPending) {
|
||||
if (resetPending) {
|
||||
this.pendingIntent = null;
|
||||
}
|
||||
continueDecryption();
|
||||
}
|
||||
|
||||
public synchronized void continueDecryption() {
|
||||
if (currentMessage == null) {
|
||||
decryptNext();
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized OpenPgpApi getOpenPgpApi() {
|
||||
if (openPgpApi == null) {
|
||||
this.openPgpApi = mXmppConnectionService.getOpenPgpApi();
|
||||
}
|
||||
return this.openPgpApi;
|
||||
}
|
||||
|
||||
private void executeApi(Message message) {
|
||||
synchronized (message) {
|
||||
Intent params = new Intent();
|
||||
params.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY);
|
||||
if (message.getType() == Message.TYPE_TEXT) {
|
||||
InputStream is = new ByteArrayInputStream(message.getBody().getBytes());
|
||||
final OutputStream os = new ByteArrayOutputStream();
|
||||
Intent result = getOpenPgpApi().executeApi(params, is, os);
|
||||
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) {
|
||||
case OpenPgpApi.RESULT_CODE_SUCCESS:
|
||||
try {
|
||||
os.flush();
|
||||
final String body = os.toString();
|
||||
if (body == null) {
|
||||
throw new IOException("body was null");
|
||||
}
|
||||
message.setBody(body);
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTED);
|
||||
final HttpConnectionManager manager = mXmppConnectionService.getHttpConnectionManager();
|
||||
if (message.trusted()
|
||||
&& message.treatAsDownloadable()
|
||||
&& manager.getAutoAcceptFileSize() > 0) {
|
||||
manager.createNewDownloadConnection(message);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
|
||||
}
|
||||
mXmppConnectionService.updateMessage(message);
|
||||
break;
|
||||
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
|
||||
synchronized (PgpDecryptionService.this) {
|
||||
PendingIntent pendingIntent = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
|
||||
messages.addFirst(message);
|
||||
currentMessage = null;
|
||||
storePendingIntent(pendingIntent);
|
||||
}
|
||||
break;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
|
||||
mXmppConnectionService.updateMessage(message);
|
||||
break;
|
||||
}
|
||||
} else if (message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE) {
|
||||
try {
|
||||
final DownloadableFile inputFile = mXmppConnectionService.getFileBackend().getFile(message, false);
|
||||
final DownloadableFile outputFile = mXmppConnectionService.getFileBackend().getFile(message, true);
|
||||
outputFile.getParentFile().mkdirs();
|
||||
outputFile.createNewFile();
|
||||
InputStream is = new FileInputStream(inputFile);
|
||||
OutputStream os = new FileOutputStream(outputFile);
|
||||
Intent result = getOpenPgpApi().executeApi(params, is, os);
|
||||
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) {
|
||||
case OpenPgpApi.RESULT_CODE_SUCCESS:
|
||||
URL url = message.getFileParams().url;
|
||||
mXmppConnectionService.getFileBackend().updateFileParams(message, url);
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTED);
|
||||
inputFile.delete();
|
||||
mXmppConnectionService.getFileBackend().updateMediaScanner(outputFile);
|
||||
mXmppConnectionService.updateMessage(message);
|
||||
break;
|
||||
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
|
||||
synchronized (PgpDecryptionService.this) {
|
||||
PendingIntent pendingIntent = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
|
||||
messages.addFirst(message);
|
||||
currentMessage = null;
|
||||
storePendingIntent(pendingIntent);
|
||||
}
|
||||
break;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
|
||||
mXmppConnectionService.updateMessage(message);
|
||||
break;
|
||||
}
|
||||
} catch (final IOException e) {
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
|
||||
mXmppConnectionService.updateMessage(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
notifyIfPending(message);
|
||||
}
|
||||
|
||||
private synchronized void notifyIfPending(Message message) {
|
||||
if (pendingNotifications.remove(message)) {
|
||||
mXmppConnectionService.getNotificationService().push(message);
|
||||
}
|
||||
}
|
||||
|
||||
private void storePendingIntent(PendingIntent pendingIntent) {
|
||||
this.pendingIntent = pendingIntent;
|
||||
mXmppConnectionService.updateConversationUi();
|
||||
}
|
||||
|
||||
public synchronized boolean hasPendingIntent(Conversation conversation) {
|
||||
if (pendingIntent == null) {
|
||||
return false;
|
||||
} else {
|
||||
for(Message message : messages) {
|
||||
if (message.getConversation() == conversation) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public PendingIntent getPendingIntent() {
|
||||
return pendingIntent;
|
||||
}
|
||||
|
||||
public boolean isConnected() {
|
||||
return getOpenPgpApi() != null;
|
||||
}
|
||||
}
|
|
@ -1,5 +1,14 @@
|
|||
package eu.siacs.conversations.crypto;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
import org.openintents.openpgp.OpenPgpError;
|
||||
import org.openintents.openpgp.OpenPgpSignatureResult;
|
||||
import org.openintents.openpgp.util.OpenPgpApi;
|
||||
import org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.FileInputStream;
|
||||
|
@ -7,24 +16,17 @@ import java.io.FileOutputStream;
|
|||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URL;
|
||||
|
||||
import org.openintents.openpgp.OpenPgpSignatureResult;
|
||||
import org.openintents.openpgp.util.OpenPgpApi;
|
||||
import org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback;
|
||||
|
||||
import eu.siacs.conversations.Config;
|
||||
import eu.siacs.conversations.R;
|
||||
import eu.siacs.conversations.entities.Account;
|
||||
import eu.siacs.conversations.entities.Contact;
|
||||
import eu.siacs.conversations.entities.Conversation;
|
||||
import eu.siacs.conversations.entities.DownloadableFile;
|
||||
import eu.siacs.conversations.entities.Message;
|
||||
import eu.siacs.conversations.http.HttpConnectionManager;
|
||||
import eu.siacs.conversations.persistance.FileBackend;
|
||||
import eu.siacs.conversations.services.XmppConnectionService;
|
||||
import eu.siacs.conversations.ui.UiCallback;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
|
||||
public class PgpEngine {
|
||||
private OpenPgpApi api;
|
||||
|
@ -35,119 +37,29 @@ public class PgpEngine {
|
|||
this.mXmppConnectionService = service;
|
||||
}
|
||||
|
||||
public void decrypt(final Message message,
|
||||
final UiCallback<Message> callback) {
|
||||
Intent params = new Intent();
|
||||
params.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY);
|
||||
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, message
|
||||
.getConversation().getAccount().getJid().toBareJid().toString());
|
||||
if (message.getType() == Message.TYPE_TEXT) {
|
||||
InputStream is = new ByteArrayInputStream(message.getBody()
|
||||
.getBytes());
|
||||
final OutputStream os = new ByteArrayOutputStream();
|
||||
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
|
||||
|
||||
@Override
|
||||
public void onReturn(Intent result) {
|
||||
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE,
|
||||
OpenPgpApi.RESULT_CODE_ERROR)) {
|
||||
case OpenPgpApi.RESULT_CODE_SUCCESS:
|
||||
try {
|
||||
os.flush();
|
||||
if (message.getEncryption() == Message.ENCRYPTION_PGP) {
|
||||
message.setBody(os.toString());
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTED);
|
||||
final HttpConnectionManager manager = mXmppConnectionService.getHttpConnectionManager();
|
||||
if (message.trusted()
|
||||
&& message.bodyContainsDownloadable()
|
||||
&& manager.getAutoAcceptFileSize() > 0) {
|
||||
manager.createNewConnection(message);
|
||||
}
|
||||
callback.success(message);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
callback.error(R.string.openpgp_error, message);
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
|
||||
callback.userInputRequried((PendingIntent) result
|
||||
.getParcelableExtra(OpenPgpApi.RESULT_INTENT),
|
||||
message);
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
callback.error(R.string.openpgp_error, message);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE) {
|
||||
try {
|
||||
final DownloadableFile inputFile = this.mXmppConnectionService
|
||||
.getFileBackend().getFile(message, false);
|
||||
final DownloadableFile outputFile = this.mXmppConnectionService
|
||||
.getFileBackend().getFile(message, true);
|
||||
outputFile.getParentFile().mkdirs();
|
||||
outputFile.createNewFile();
|
||||
InputStream is = new FileInputStream(inputFile);
|
||||
OutputStream os = new FileOutputStream(outputFile);
|
||||
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
|
||||
|
||||
@Override
|
||||
public void onReturn(Intent result) {
|
||||
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE,
|
||||
OpenPgpApi.RESULT_CODE_ERROR)) {
|
||||
case OpenPgpApi.RESULT_CODE_SUCCESS:
|
||||
URL url = message.getImageParams().url;
|
||||
mXmppConnectionService.getFileBackend().updateFileParams(message,url);
|
||||
message.setEncryption(Message.ENCRYPTION_DECRYPTED);
|
||||
PgpEngine.this.mXmppConnectionService
|
||||
.updateMessage(message);
|
||||
inputFile.delete();
|
||||
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
|
||||
intent.setData(Uri.fromFile(outputFile));
|
||||
mXmppConnectionService.sendBroadcast(intent);
|
||||
callback.success(message);
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
|
||||
callback.userInputRequried(
|
||||
(PendingIntent) result
|
||||
.getParcelableExtra(OpenPgpApi.RESULT_INTENT),
|
||||
message);
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
callback.error(R.string.openpgp_error, message);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (final IOException e) {
|
||||
callback.error(R.string.error_decrypting_file, message);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void encrypt(final Message message,
|
||||
final UiCallback<Message> callback) {
|
||||
|
||||
public void encrypt(final Message message, final UiCallback<Message> callback) {
|
||||
Intent params = new Intent();
|
||||
params.setAction(OpenPgpApi.ACTION_ENCRYPT);
|
||||
if (message.getConversation().getMode() == Conversation.MODE_SINGLE) {
|
||||
long[] keys = { message.getConversation().getContact()
|
||||
.getPgpKeyId() };
|
||||
final Conversation conversation = message.getConversation();
|
||||
if (conversation.getMode() == Conversation.MODE_SINGLE) {
|
||||
long[] keys = {
|
||||
conversation.getContact().getPgpKeyId(),
|
||||
conversation.getAccount().getPgpId()
|
||||
};
|
||||
params.putExtra(OpenPgpApi.EXTRA_KEY_IDS, keys);
|
||||
} else {
|
||||
params.putExtra(OpenPgpApi.EXTRA_KEY_IDS, message.getConversation()
|
||||
.getMucOptions().getPgpKeyIds());
|
||||
params.putExtra(OpenPgpApi.EXTRA_KEY_IDS, conversation.getMucOptions().getPgpKeyIds());
|
||||
}
|
||||
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, message
|
||||
.getConversation().getAccount().getJid().toBareJid().toString());
|
||||
|
||||
if (message.getType() == Message.TYPE_TEXT) {
|
||||
if (!message.needsUploading()) {
|
||||
params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
|
||||
|
||||
InputStream is = new ByteArrayInputStream(message.getBody()
|
||||
.getBytes());
|
||||
String body;
|
||||
if (message.hasFileOnRemoteHost()) {
|
||||
body = message.getFileParams().url.toString();
|
||||
} else {
|
||||
body = message.getBody();
|
||||
}
|
||||
InputStream is = new ByteArrayInputStream(body.getBytes());
|
||||
final OutputStream os = new ByteArrayOutputStream();
|
||||
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
|
||||
|
||||
|
@ -179,12 +91,13 @@ public class PgpEngine {
|
|||
message);
|
||||
break;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
logError(conversation.getAccount(), (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
|
||||
callback.error(R.string.openpgp_error, message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE) {
|
||||
} else {
|
||||
try {
|
||||
DownloadableFile inputFile = this.mXmppConnectionService
|
||||
.getFileBackend().getFile(message, true);
|
||||
|
@ -192,8 +105,8 @@ public class PgpEngine {
|
|||
.getFileBackend().getFile(message, false);
|
||||
outputFile.getParentFile().mkdirs();
|
||||
outputFile.createNewFile();
|
||||
InputStream is = new FileInputStream(inputFile);
|
||||
OutputStream os = new FileOutputStream(outputFile);
|
||||
final InputStream is = new FileInputStream(inputFile);
|
||||
final OutputStream os = new FileOutputStream(outputFile);
|
||||
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
|
||||
|
||||
@Override
|
||||
|
@ -201,6 +114,12 @@ public class PgpEngine {
|
|||
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE,
|
||||
OpenPgpApi.RESULT_CODE_ERROR)) {
|
||||
case OpenPgpApi.RESULT_CODE_SUCCESS:
|
||||
try {
|
||||
os.flush();
|
||||
} catch (IOException ignored) {
|
||||
//ignored
|
||||
}
|
||||
FileBackend.close(os);
|
||||
callback.success(message);
|
||||
break;
|
||||
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
|
||||
|
@ -210,6 +129,7 @@ public class PgpEngine {
|
|||
message);
|
||||
break;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
logError(conversation.getAccount(), (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
|
||||
callback.error(R.string.openpgp_error, message);
|
||||
break;
|
||||
}
|
||||
|
@ -243,7 +163,6 @@ public class PgpEngine {
|
|||
Intent params = new Intent();
|
||||
params.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY);
|
||||
params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
|
||||
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, account.getJid().toBareJid().toString());
|
||||
InputStream is = new ByteArrayInputStream(pgpSig.toString().getBytes());
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
Intent result = api.executeApi(params, is, os);
|
||||
|
@ -260,19 +179,48 @@ public class PgpEngine {
|
|||
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
|
||||
return 0;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
logError(account, (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void chooseKey(final Account account, final UiCallback<Account> callback) {
|
||||
Intent p = new Intent();
|
||||
p.setAction(OpenPgpApi.ACTION_GET_SIGN_KEY_ID);
|
||||
api.executeApiAsync(p, null, null, new IOpenPgpCallback() {
|
||||
|
||||
@Override
|
||||
public void onReturn(Intent result) {
|
||||
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, 0)) {
|
||||
case OpenPgpApi.RESULT_CODE_SUCCESS:
|
||||
callback.success(account);
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
|
||||
callback.userInputRequried((PendingIntent) result
|
||||
.getParcelableExtra(OpenPgpApi.RESULT_INTENT),
|
||||
account);
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
logError(account, (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
|
||||
callback.error(R.string.openpgp_error, account);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void generateSignature(final Account account, String status,
|
||||
final UiCallback<Account> callback) {
|
||||
if (account.getPgpId() == 0) {
|
||||
return;
|
||||
}
|
||||
Intent params = new Intent();
|
||||
params.setAction(OpenPgpApi.ACTION_CLEARTEXT_SIGN);
|
||||
params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
|
||||
params.setAction(OpenPgpApi.ACTION_SIGN);
|
||||
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, account.getJid().toBareJid().toString());
|
||||
params.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, account.getPgpId());
|
||||
InputStream is = new ByteArrayInputStream(status.getBytes());
|
||||
final OutputStream os = new ByteArrayOutputStream();
|
||||
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": signing status message \""+status+"\"");
|
||||
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
|
||||
|
||||
@Override
|
||||
|
@ -302,7 +250,7 @@ public class PgpEngine {
|
|||
callback.error(R.string.openpgp_error, account);
|
||||
return;
|
||||
}
|
||||
account.setKey("pgp_signature", signatureBuilder.toString());
|
||||
account.setPgpSignature(signatureBuilder.toString());
|
||||
callback.success(account);
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
|
||||
|
@ -311,7 +259,13 @@ public class PgpEngine {
|
|||
account);
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
callback.error(R.string.openpgp_error, account);
|
||||
OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR);
|
||||
if (error != null && "signing subkey not found!".equals(error.getMessage())) {
|
||||
callback.error(0,account);
|
||||
} else {
|
||||
logError(account, error);
|
||||
callback.error(R.string.unable_to_connect_to_keychain, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -321,8 +275,6 @@ public class PgpEngine {
|
|||
Intent params = new Intent();
|
||||
params.setAction(OpenPgpApi.ACTION_GET_KEY);
|
||||
params.putExtra(OpenPgpApi.EXTRA_KEY_ID, contact.getPgpKeyId());
|
||||
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, contact.getAccount()
|
||||
.getJid().toBareJid().toString());
|
||||
api.executeApiAsync(params, null, null, new IOpenPgpCallback() {
|
||||
|
||||
@Override
|
||||
|
@ -337,30 +289,27 @@ public class PgpEngine {
|
|||
contact);
|
||||
return;
|
||||
case OpenPgpApi.RESULT_CODE_ERROR:
|
||||
logError(contact.getAccount(), (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
|
||||
callback.error(R.string.openpgp_error, contact);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public PendingIntent getIntentForKey(Contact contact) {
|
||||
Intent params = new Intent();
|
||||
params.setAction(OpenPgpApi.ACTION_GET_KEY);
|
||||
params.putExtra(OpenPgpApi.EXTRA_KEY_ID, contact.getPgpKeyId());
|
||||
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, contact.getAccount()
|
||||
.getJid().toBareJid().toString());
|
||||
Intent result = api.executeApi(params, null, null);
|
||||
return (PendingIntent) result
|
||||
.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
|
||||
private static void logError(Account account, OpenPgpError error) {
|
||||
if (error != null) {
|
||||
Log.d(Config.LOGTAG,account.getJid().toBareJid().toString()+": OpenKeychain error '"+error.getMessage()+"' code="+error.getErrorId());
|
||||
} else {
|
||||
Log.d(Config.LOGTAG,account.getJid().toBareJid().toString()+": OpenKeychain error with no message");
|
||||
}
|
||||
}
|
||||
|
||||
public PendingIntent getIntentForKey(Account account, long pgpKeyId) {
|
||||
|
||||
public PendingIntent getIntentForKey(long pgpKeyId) {
|
||||
Intent params = new Intent();
|
||||
params.setAction(OpenPgpApi.ACTION_GET_KEY);
|
||||
params.putExtra(OpenPgpApi.EXTRA_KEY_ID, pgpKeyId);
|
||||
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, account.getJid().toBareJid().toString());
|
||||
Intent result = api.executeApi(params, null, null);
|
||||
return (PendingIntent) result
|
||||
.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
|
||||
return (PendingIntent) result.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,167 @@
|
|||
package eu.siacs.conversations.crypto;
|
||||
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
|
||||
import org.bouncycastle.asn1.ASN1Primitive;
|
||||
import org.bouncycastle.asn1.DERIA5String;
|
||||
import org.bouncycastle.asn1.DERTaggedObject;
|
||||
import org.bouncycastle.asn1.DERUTF8String;
|
||||
import org.bouncycastle.asn1.DLSequence;
|
||||
import org.bouncycastle.asn1.x500.RDN;
|
||||
import org.bouncycastle.asn1.x500.X500Name;
|
||||
import org.bouncycastle.asn1.x500.style.BCStyle;
|
||||
import org.bouncycastle.asn1.x500.style.IETFUtils;
|
||||
import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateEncodingException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import javax.net.ssl.SSLSession;
|
||||
|
||||
import de.duenndns.ssl.DomainHostnameVerifier;
|
||||
|
||||
public class XmppDomainVerifier implements DomainHostnameVerifier {
|
||||
|
||||
private static final String LOGTAG = "XmppDomainVerifier";
|
||||
|
||||
private static final String SRV_NAME = "1.3.6.1.5.5.7.8.7";
|
||||
private static final String XMPP_ADDR = "1.3.6.1.5.5.7.8.5";
|
||||
|
||||
@Override
|
||||
public boolean verify(String domain, String hostname, SSLSession sslSession) {
|
||||
try {
|
||||
Certificate[] chain = sslSession.getPeerCertificates();
|
||||
if (chain.length == 0 || !(chain[0] instanceof X509Certificate)) {
|
||||
return false;
|
||||
}
|
||||
X509Certificate certificate = (X509Certificate) chain[0];
|
||||
final List<String> commonNames = getCommonNames(certificate);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && isSelfSigned(certificate)) {
|
||||
if (commonNames.size() == 1 && matchDomain(domain,commonNames)) {
|
||||
Log.d(LOGTAG,"accepted CN in self signed cert as work around for "+domain);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Collection<List<?>> alternativeNames = certificate.getSubjectAlternativeNames();
|
||||
List<String> xmppAddrs = new ArrayList<>();
|
||||
List<String> srvNames = new ArrayList<>();
|
||||
List<String> domains = new ArrayList<>();
|
||||
if (alternativeNames != null) {
|
||||
for (List<?> san : alternativeNames) {
|
||||
Integer type = (Integer) san.get(0);
|
||||
if (type == 0) {
|
||||
Pair<String, String> otherName = parseOtherName((byte[]) san.get(1));
|
||||
if (otherName != null) {
|
||||
switch (otherName.first) {
|
||||
case SRV_NAME:
|
||||
srvNames.add(otherName.second);
|
||||
break;
|
||||
case XMPP_ADDR:
|
||||
xmppAddrs.add(otherName.second);
|
||||
break;
|
||||
default:
|
||||
Log.d(LOGTAG, "oid: " + otherName.first + " value: " + otherName.second);
|
||||
}
|
||||
}
|
||||
} else if (type == 2) {
|
||||
Object value = san.get(1);
|
||||
if (value instanceof String) {
|
||||
domains.add((String) value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (srvNames.size() == 0 && xmppAddrs.size() == 0 && domains.size() == 0) {
|
||||
domains.addAll(commonNames);
|
||||
}
|
||||
Log.d(LOGTAG, "searching for " + domain + " in srvNames: " + srvNames + " xmppAddrs: " + xmppAddrs + " domains:" + domains);
|
||||
if (hostname != null) {
|
||||
Log.d(LOGTAG,"also trying to verify hostname "+hostname);
|
||||
}
|
||||
return xmppAddrs.contains(domain)
|
||||
|| srvNames.contains("_xmpp-client." + domain)
|
||||
|| matchDomain(domain, domains)
|
||||
|| (hostname != null && matchDomain(hostname,domains));
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static List<String> getCommonNames(X509Certificate certificate) {
|
||||
List<String> domains = new ArrayList<>();
|
||||
try {
|
||||
X500Name x500name = new JcaX509CertificateHolder(certificate).getSubject();
|
||||
RDN[] rdns = x500name.getRDNs(BCStyle.CN);
|
||||
for (int i = 0; i < rdns.length; ++i) {
|
||||
domains.add(IETFUtils.valueToString(x500name.getRDNs(BCStyle.CN)[i].getFirst().getValue()));
|
||||
}
|
||||
return domains;
|
||||
} catch (CertificateEncodingException e) {
|
||||
return domains;
|
||||
}
|
||||
}
|
||||
|
||||
private static Pair<String, String> parseOtherName(byte[] otherName) {
|
||||
try {
|
||||
ASN1Primitive asn1Primitive = ASN1Primitive.fromByteArray(otherName);
|
||||
if (asn1Primitive instanceof DERTaggedObject) {
|
||||
ASN1Primitive inner = ((DERTaggedObject) asn1Primitive).getObject();
|
||||
if (inner instanceof DLSequence) {
|
||||
DLSequence sequence = (DLSequence) inner;
|
||||
if (sequence.size() >= 2 && sequence.getObjectAt(1) instanceof DERTaggedObject) {
|
||||
String oid = sequence.getObjectAt(0).toString();
|
||||
ASN1Primitive value = ((DERTaggedObject) sequence.getObjectAt(1)).getObject();
|
||||
if (value instanceof DERUTF8String) {
|
||||
return new Pair<>(oid, ((DERUTF8String) value).getString());
|
||||
} else if (value instanceof DERIA5String) {
|
||||
return new Pair<>(oid, ((DERIA5String) value).getString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean matchDomain(String needle, List<String> haystack) {
|
||||
for (String entry : haystack) {
|
||||
if (entry.startsWith("*.")) {
|
||||
int i = needle.indexOf('.');
|
||||
Log.d(LOGTAG, "comparing " + needle.substring(i) + " and " + entry.substring(1));
|
||||
if (i != -1 && needle.substring(i).equals(entry.substring(1))) {
|
||||
Log.d(LOGTAG, "domain " + needle + " matched " + entry);
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
if (entry.equals(needle)) {
|
||||
Log.d(LOGTAG, "domain " + needle + " matched " + entry);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean isSelfSigned(X509Certificate certificate) {
|
||||
try {
|
||||
certificate.verify(certificate.getPublicKey());
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean verify(String domain, SSLSession sslSession) {
|
||||
return verify(domain,null,sslSession);
|
||||
}
|
||||
}
|