Compare commits
699 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
74d658f928 | ||
|
|
24a1572752 | ||
|
|
80099635be | ||
|
|
cd28526ccc | ||
|
|
277e10daf1 | ||
|
|
a6fb3c87c4 | ||
|
|
bf6474a488 | ||
|
|
08f8d6ac6a | ||
|
|
0c80efc686 | ||
|
|
e1b6561b70 | ||
|
|
56e91db0b4 | ||
|
|
ce3b6fdc37 | ||
|
|
885427fa85 | ||
|
|
b77365e60f | ||
|
|
b3d601aa35 | ||
|
|
f1aca45ce3 | ||
|
|
46b1902af2 | ||
|
|
96cee7e5c2 | ||
|
|
8a32811226 | ||
|
|
18dbaee4b5 | ||
|
|
9c7cea23a7 | ||
|
|
519b085dd2 | ||
|
|
66d3bc6c7b | ||
|
|
40270f219a | ||
|
|
08fba15fee | ||
|
|
379e1a354b | ||
|
|
eacfca715c | ||
|
|
4bfff4b7e9 | ||
|
|
bbad583e53 | ||
|
|
359202a594 | ||
|
|
7f68f7dd9d | ||
|
|
77a9de570c | ||
|
|
a02b193b90 | ||
|
|
789eb30d2b | ||
|
|
7a653a5bb7 | ||
|
|
c929977773 | ||
|
|
d21ec9d727 | ||
|
|
5332d0ac62 | ||
|
|
6508eb57fc | ||
|
|
b7cc19b719 | ||
|
|
925ebf3210 | ||
|
|
b1ff6805eb | ||
|
|
1f4646dbdc | ||
|
|
6612e77579 | ||
|
|
2fd6d5cd2e | ||
|
|
0531b97e19 | ||
|
|
7336b52e14 | ||
|
|
cc03275ad3 | ||
|
|
09909514d5 | ||
|
|
a3dd8cb00d | ||
|
|
d207f7e2b2 | ||
|
|
cc348e5d35 | ||
|
|
aeed19532f | ||
|
|
b52f870e29 | ||
|
|
7889c32be0 | ||
|
|
1ca91d684f | ||
|
|
648f76bd22 | ||
|
|
f8d772149b | ||
|
|
181156de10 | ||
|
|
a038a3366f | ||
|
|
c43dc175d0 | ||
|
|
fd3f7f4a37 | ||
|
|
20e5c0e292 | ||
|
|
768c639d2b | ||
|
|
9bd7f8347b | ||
|
|
ae57022102 | ||
|
|
12d95dd4b1 | ||
|
|
57ac5cb9bf | ||
|
|
24508be4d4 | ||
|
|
9136ff3ea3 | ||
|
|
4460d80b72 | ||
|
|
eb8c178603 | ||
|
|
ad08cfaad0 | ||
|
|
96845ad7cf | ||
|
|
16412821bf | ||
|
|
3c0f4402a8 | ||
|
|
260087d1fa | ||
|
|
3361ef949a | ||
|
|
dfe0e960dc | ||
|
|
98e0623cb7 | ||
|
|
97084db4de | ||
|
|
165c76bb69 | ||
|
|
e0e4145481 | ||
|
|
8c4e7e0e43 | ||
|
|
dee41dad9e | ||
|
|
47d596af08 | ||
|
|
4019a7c225 | ||
|
|
db0c199674 | ||
|
|
f11a1fd9cc | ||
|
|
892754bbae | ||
|
|
a0de0c2005 | ||
|
|
6b5f5c54dd | ||
|
|
fdac632b1c | ||
|
|
43f804c7a8 | ||
|
|
e85220d727 | ||
|
|
489d46e922 | ||
|
|
b2fdb049e2 | ||
|
|
878031cae8 | ||
|
|
aeb0b90281 | ||
|
|
83eb04eed3 | ||
|
|
aeb3916741 | ||
|
|
c42b0677d1 | ||
|
|
08f7e4900c | ||
|
|
8e5c31f7f3 | ||
|
|
23e777cd94 | ||
|
|
fe22bb1035 | ||
|
|
0da9c7f965 | ||
|
|
48adb0b256 | ||
|
|
b2eeeeddfb | ||
|
|
5ee2b6de48 | ||
|
|
4e0b5d79df | ||
|
|
027fac90b4 | ||
|
|
24118e0dc3 | ||
|
|
faf478a092 | ||
|
|
f4a7b00b1b | ||
|
|
df7680e06c | ||
|
|
bbe68974b2 | ||
|
|
aad300bd9c | ||
|
|
12ce568d3c | ||
|
|
25d3f76f9e | ||
|
|
aece93d63d | ||
|
|
45e667abf7 | ||
|
|
5869b39035 | ||
|
|
d981d57a8f | ||
|
|
1f9d1edc5c | ||
|
|
4944ee6078 | ||
|
|
c4b2b909e0 | ||
|
|
08f3928ebc | ||
|
|
350c177be8 | ||
|
|
d3103cb966 | ||
|
|
eec3721e9d | ||
|
|
8058f8f376 | ||
|
|
eae67fd482 | ||
|
|
d10727b87d | ||
|
|
52d6dc9376 | ||
|
|
6ff38e8068 | ||
|
|
b54f4a846c | ||
|
|
b69fa34b9f | ||
|
|
e1f050ac7e | ||
|
|
76668b65fc | ||
|
|
7524cc31c1 | ||
|
|
a7f832107d | ||
|
|
674b0d7285 | ||
|
|
d618a09f6d | ||
|
|
995b1fe63c | ||
|
|
6200f4f790 | ||
|
|
a16c312292 | ||
|
|
1d907bc2d4 | ||
|
|
d267ba4cde | ||
|
|
07c31ebde1 | ||
|
|
2c353628a3 | ||
|
|
3d170d88fb | ||
|
|
90171b2ebd | ||
|
|
36298893db | ||
|
|
ca7d71eed4 | ||
|
|
d0e2771a2f | ||
|
|
6b80bc5b5e | ||
|
|
016a613fd5 | ||
|
|
c6865f48f5 | ||
|
|
3935bd67f8 | ||
|
|
917993a4fa | ||
|
|
1d807002f8 | ||
|
|
f95e1138a0 | ||
|
|
1d16d74383 | ||
|
|
4713e99c7b | ||
|
|
1e122b36a3 | ||
|
|
c87335ff56 | ||
|
|
b8dd0e2fb1 | ||
|
|
3a754d5703 | ||
|
|
e39fa172cb | ||
|
|
8c0d2b67e4 | ||
|
|
12cba1f8fb | ||
|
|
bf5ae30bda | ||
|
|
2973b47555 | ||
|
|
65cba31306 | ||
|
|
629920c2b3 | ||
|
|
e0f00fd4f5 | ||
|
|
083680b563 | ||
|
|
9a637c484b | ||
|
|
175ef04c70 | ||
|
|
1d11f8316c | ||
|
|
bb8027d663 | ||
|
|
bfa5c66006 | ||
|
|
0a606f6d23 | ||
|
|
e4611508ca | ||
|
|
3a8ac8298d | ||
|
|
6ab6d0d205 | ||
|
|
30d398f5f1 | ||
|
|
85de7d08fd | ||
|
|
9f9724ce36 | ||
|
|
264acd0532 | ||
|
|
7a495c9bd6 | ||
|
|
42549bf1a6 | ||
|
|
56c97001fa | ||
|
|
4ad8b1aef8 | ||
|
|
92e8160505 | ||
|
|
0b19cdc95c | ||
|
|
c4b6674492 | ||
|
|
cd2fa7943b | ||
|
|
6245f25b7c | ||
|
|
3c29d4a19f | ||
|
|
f917952083 | ||
|
|
6fe22a5fa4 | ||
|
|
8ea12399d3 | ||
|
|
2947d9aeec | ||
|
|
17551f813b | ||
|
|
8022a0cd92 | ||
|
|
e5edaeb147 | ||
|
|
4b1bd48487 | ||
|
|
980a539ad2 | ||
|
|
cef329376b | ||
|
|
230546d57f | ||
|
|
b418ef0f99 | ||
|
|
343245f290 | ||
|
|
5ec2db5dca | ||
|
|
c21f4e1d2e | ||
|
|
a49404b877 | ||
|
|
1982408881 | ||
|
|
4e352e1430 | ||
|
|
4fa0f5ffeb | ||
|
|
fc91894336 | ||
|
|
176f66b437 | ||
|
|
0a0a5bd60f | ||
|
|
e5504e0bdf | ||
|
|
220c068822 | ||
|
|
1214c17389 | ||
|
|
a82f6b16b7 | ||
|
|
7f74574a7f | ||
|
|
6d6185dc5e | ||
|
|
21e0b08716 | ||
|
|
651a6d6b3d | ||
|
|
658054b13d | ||
|
|
58ebfb71d1 | ||
|
|
842fb976cd | ||
|
|
8c28183410 | ||
|
|
5ae1036f4d | ||
|
|
cf70854af5 | ||
|
|
da1f7bea4f | ||
|
|
a8180a04ab | ||
|
|
55acdfba2a | ||
|
|
4b4498e84d | ||
|
|
f483653506 | ||
|
|
6e3def2c13 | ||
|
|
6416378b78 | ||
|
|
3591bce1b5 | ||
|
|
174a00c469 | ||
|
|
f07cb350d4 | ||
|
|
3d8fbe05f3 | ||
|
|
1fc1d69dae | ||
|
|
af401e7b27 | ||
|
|
bc274b2cf7 | ||
|
|
488c732f3c | ||
|
|
4d58e52729 | ||
|
|
0b7d7bbe7f | ||
|
|
75ac9fd38d | ||
|
|
d8d7b6a766 | ||
|
|
aaa7bae55f | ||
|
|
1786a5e910 | ||
|
|
d9d93ffad3 | ||
|
|
032b9f1f17 | ||
|
|
eba629e5a7 | ||
|
|
41fb8b6bf4 | ||
|
|
430e6025fa | ||
|
|
57a16c4904 | ||
|
|
4525aee9a1 | ||
|
|
e99aae3ed4 | ||
|
|
a9cff1f49a | ||
|
|
f5b0f06bba | ||
|
|
f65e72fdc1 | ||
|
|
979565691f | ||
|
|
9c115efecb | ||
|
|
1ce7749826 | ||
|
|
ef232aba88 | ||
|
|
0c9619a550 | ||
|
|
8b9d20d908 | ||
|
|
1006254090 | ||
|
|
b784f94a64 | ||
|
|
34c382daea | ||
|
|
1b57be1d64 | ||
|
|
25676cff8c | ||
|
|
476c9f5840 | ||
|
|
d663f047bd | ||
|
|
7663a53e1c | ||
|
|
117d8b99df | ||
|
|
bec69b4706 | ||
|
|
0beb876cb4 | ||
|
|
666eb75779 | ||
|
|
b31bcc2a9c | ||
|
|
2c1458e026 | ||
|
|
8d65b5117e | ||
|
|
1e0c8a594f | ||
|
|
b05da7d27c | ||
|
|
00e6cf537a | ||
|
|
c2c1c6dfcc | ||
|
|
753d4cd981 | ||
|
|
86cfc10741 | ||
|
|
492e2f2e7e | ||
|
|
560cceca9b | ||
|
|
f19f8ca2a7 | ||
|
|
925cf982ca | ||
|
|
30a7e3b429 | ||
|
|
f978c6f7d7 | ||
|
|
facbf8ec02 | ||
|
|
ac338e9299 | ||
|
|
d18e6412f0 | ||
|
|
373096b339 | ||
|
|
bb4bff50b3 | ||
|
|
c9baf04505 | ||
|
|
938fec1ab3 | ||
|
|
ed9f04332e | ||
|
|
c20e8d1aea | ||
|
|
3a13f111eb | ||
|
|
6c95c683ba | ||
|
|
d666f59c1b | ||
|
|
28869498ae | ||
|
|
81104a3f38 | ||
|
|
48cdbf6b6b | ||
|
|
7e9ce00166 | ||
|
|
c3431b0921 | ||
|
|
27210317fd | ||
|
|
312b51a5fd | ||
|
|
96a649ca9c | ||
|
|
445d8168e1 | ||
|
|
24a219853e | ||
|
|
4271159294 | ||
|
|
9ff94a4402 | ||
|
|
448b8fa160 | ||
|
|
aa46eb4c6d | ||
|
|
7e35fa8710 | ||
|
|
66b9e9b5c1 | ||
|
|
ad45bafd62 | ||
|
|
4cb2b34d11 | ||
|
|
2b8482cb06 | ||
|
|
57bc6ad98e | ||
|
|
8ec8816e45 | ||
|
|
801bc2ab66 | ||
|
|
5fec87e688 | ||
|
|
9490c00f9f | ||
|
|
a14dde8183 | ||
|
|
b742cda635 | ||
|
|
2e92acbfd5 | ||
|
|
7af904d860 | ||
|
|
59289a2f40 | ||
|
|
b08d0a76ee | ||
|
|
cc8fdbe4a6 | ||
|
|
64eb477f4f | ||
|
|
68f368dc94 | ||
|
|
219d9b2a59 | ||
|
|
a7e1506ea0 | ||
|
|
f61cfaa781 | ||
|
|
66de395549 | ||
|
|
242f382da3 | ||
|
|
a879bd09b4 | ||
|
|
ed273fbfce | ||
|
|
31cb8f9fab | ||
|
|
2aeb6598dc | ||
|
|
9810083304 | ||
|
|
23fd0482c8 | ||
|
|
39f9e16a61 | ||
|
|
c3a5e759b7 | ||
|
|
f9d5aeee91 | ||
|
|
371631856a | ||
|
|
73f33bc0a3 | ||
|
|
ed595a3815 | ||
|
|
7c8fa27aaf | ||
|
|
b326b1b3d7 | ||
|
|
f527064e55 | ||
|
|
3a074ef6c5 | ||
|
|
7fbae16a53 | ||
|
|
98018ca590 | ||
|
|
7d5724d8d5 | ||
|
|
ba17a5592c | ||
|
|
7332e81e6e | ||
|
|
5aeacef511 | ||
|
|
8f3fd3b37e | ||
|
|
0fd58860a8 | ||
|
|
8edd3774d2 | ||
|
|
dd1a4cba76 | ||
|
|
1123fb3ca6 | ||
|
|
5bfd340176 | ||
|
|
7cb2f203b1 | ||
|
|
412d0a19e7 | ||
|
|
f2a50141b7 | ||
|
|
7f65ce0e84 | ||
|
|
8f577a4368 | ||
|
|
09f89afe2a | ||
|
|
d1dcdc2f50 | ||
|
|
e31a5f705c | ||
|
|
04314d507b | ||
|
|
409c5a0ba3 | ||
|
|
68f09125d4 | ||
|
|
ac2d4911fe | ||
|
|
26c2eaddff | ||
|
|
d41d6bd758 | ||
|
|
86b8bbfb5f | ||
|
|
7658b4c9fe | ||
|
|
f1384eef34 | ||
|
|
c7c4a011ef | ||
|
|
bdd73135f0 | ||
|
|
b367410aaf | ||
|
|
c27404cc3a | ||
|
|
9ff2359b4c | ||
|
|
d28ecb509e | ||
|
|
048e7d0ef6 | ||
|
|
1b49a6f3f7 | ||
|
|
fd6e4880d2 | ||
|
|
f27bbd318f | ||
|
|
79dfb11fa4 | ||
|
|
3bf9126595 | ||
|
|
a5a90dfbdd | ||
|
|
ac767f63ae | ||
|
|
782862294d | ||
|
|
eded4b2e16 | ||
|
|
707ba55e1d | ||
|
|
b71a533024 | ||
|
|
36093b9199 | ||
|
|
bd14a35e23 | ||
|
|
406da9732c | ||
|
|
219aa06835 | ||
|
|
43decb21f4 | ||
|
|
b152da9d21 | ||
|
|
14ce2305ce | ||
|
|
a65cb92f37 | ||
|
|
4a54115e31 | ||
|
|
3a80838b4c | ||
|
|
bb16da0f4a | ||
|
|
714ae7b9f0 | ||
|
|
f5f60cc9eb | ||
|
|
057c5f7ec8 | ||
|
|
d704588624 | ||
|
|
c82a6cc0e1 | ||
|
|
603d83ba1b | ||
|
|
fd15235124 | ||
|
|
0c1e5a9628 | ||
|
|
6403d135ea | ||
|
|
a7b33c48b3 | ||
|
|
4e31190291 | ||
|
|
e99a06654e | ||
|
|
cf4d0565c5 | ||
|
|
6b5a874db5 | ||
|
|
defc7a8fa4 | ||
|
|
06d568e61d | ||
|
|
6064c88f2c | ||
|
|
77b3430339 | ||
|
|
0f125cd63f | ||
|
|
65f84b116f | ||
|
|
2d008a5cc3 | ||
|
|
4dcd4483e9 | ||
|
|
0102ce2144 | ||
|
|
71d5887bcc | ||
|
|
76ce301d91 | ||
|
|
692ccd7838 | ||
|
|
bf97b1c115 | ||
|
|
6eda3c68a8 | ||
|
|
ca9a53bde9 | ||
|
|
9b9327c25e | ||
|
|
a2be4c73a1 | ||
|
|
720987197d | ||
|
|
c52e83fe10 | ||
|
|
e97e03b814 | ||
|
|
ac9b85e10b | ||
|
|
8e80af657f | ||
|
|
93f9afd98d | ||
|
|
c9178db87d | ||
|
|
18743f66e8 | ||
|
|
72ae2ec5c4 | ||
|
|
0a407d869e | ||
|
|
8c8b684cb4 | ||
|
|
63d1b86b5e | ||
|
|
49a9055a73 | ||
|
|
4f444bd3c9 | ||
|
|
1efab98f91 | ||
|
|
b8677b4c02 | ||
|
|
e6400d8305 | ||
|
|
7bdfdcc1f8 | ||
|
|
9d9c12a52d | ||
|
|
1aa9da57aa | ||
|
|
0b57e42652 | ||
|
|
9a988e82c4 | ||
|
|
9e83448cd0 | ||
|
|
8d9a3cbb1e | ||
|
|
fc5a40ace0 | ||
|
|
9f2d0b5b07 | ||
|
|
7e98e98ad0 | ||
|
|
f6085aa89b | ||
|
|
32905aa16b | ||
|
|
8a240d506b | ||
|
|
b6f07fdf85 | ||
|
|
9a7ab172ac | ||
|
|
3d6c70629d | ||
|
|
c8d13a6fa1 | ||
|
|
b24ac01493 | ||
|
|
be21da5e3b | ||
|
|
b6fea7dc9b | ||
|
|
adc2e96bf2 | ||
|
|
807dc612a7 | ||
|
|
1612de8231 | ||
|
|
4576ddf09c | ||
|
|
bb96de47be | ||
|
|
ccfc56e629 | ||
|
|
e6cde49247 | ||
|
|
1de41a8d24 | ||
|
|
953c62cc66 | ||
|
|
c2f5569010 | ||
|
|
baef35d263 | ||
|
|
8b8345d0e6 | ||
|
|
3bab677607 | ||
|
|
79362162d2 | ||
|
|
ca537c6321 | ||
|
|
79382ce6f8 | ||
|
|
ea70aa21a9 | ||
|
|
e9f1b2a9b4 | ||
|
|
981513086b | ||
|
|
9f4bfe75d1 | ||
|
|
dcd8bbbd01 | ||
|
|
cadfa5e034 | ||
|
|
76ea0c4978 | ||
|
|
c1321203c1 | ||
|
|
a8388db1c3 | ||
|
|
f0589c2f33 | ||
|
|
fbe7d64d5d | ||
|
|
a5722b2445 | ||
|
|
18e57e20ed | ||
|
|
5b83bf35d0 | ||
|
|
97fb8d8561 | ||
|
|
fe5a72ae90 | ||
|
|
643a48afec | ||
|
|
e50598dfa3 | ||
|
|
46fb1f0ac0 | ||
|
|
eaaeee6ee7 | ||
|
|
522c5562eb | ||
|
|
ef8c63c176 | ||
|
|
12537ec7f3 | ||
|
|
8b791ed19e | ||
|
|
a1fdd0c0d2 | ||
|
|
0b7097082d | ||
|
|
c903192d7c | ||
|
|
d8b5e0f5a1 | ||
|
|
fb8d476c34 | ||
|
|
b4652e2486 | ||
|
|
b0d37dc997 | ||
|
|
778930015e | ||
|
|
fb8c45a86d | ||
|
|
13b0533277 | ||
|
|
6cb6b1534d | ||
|
|
4098f2e498 | ||
|
|
19093a4ead | ||
|
|
c7e2cb9d06 | ||
|
|
6be22170d8 | ||
|
|
2077b0ab4c | ||
|
|
bc2ca86a95 | ||
|
|
a443582ca9 | ||
|
|
2162397575 | ||
|
|
6cfb32570b | ||
|
|
a8d66fd0a4 | ||
|
|
b46d3d28a9 | ||
|
|
44372059cd | ||
|
|
64668147d9 | ||
|
|
e21e71b442 | ||
|
|
10f646f125 | ||
|
|
187b76e04c | ||
|
|
f2c36cae37 | ||
|
|
77a6357ae4 | ||
|
|
6c1be53f86 | ||
|
|
59e02f047b | ||
|
|
321250f30e | ||
|
|
7559036abe | ||
|
|
6080b57f8a | ||
|
|
ddf654a641 | ||
|
|
bf8e187962 | ||
|
|
cf252c3ec4 | ||
|
|
d65541fb3e | ||
|
|
20ef99cfc7 | ||
|
|
87a003918d | ||
|
|
f5c3c90f37 | ||
|
|
ee690092ba | ||
|
|
34a386abce | ||
|
|
05f4c42bf9 | ||
|
|
1510dc9bc2 | ||
|
|
2a85b621f5 | ||
|
|
97abf2f230 | ||
|
|
1f2d38730d | ||
|
|
5c000f50aa | ||
|
|
581931b679 | ||
|
|
709a91b1db | ||
|
|
6ddb8d01ec | ||
|
|
81d3144da2 | ||
|
|
be2e8b7169 | ||
|
|
a21774031b | ||
|
|
de4dc9b9a0 | ||
|
|
7ae2859c78 | ||
|
|
8228472031 | ||
|
|
7ca5a2bd02 | ||
|
|
8858c7f619 | ||
|
|
992d7e3303 | ||
|
|
bce135cba8 | ||
|
|
8c30bedefb | ||
|
|
e26f2910f3 | ||
|
|
0b1208a11c | ||
|
|
261919f17a | ||
|
|
4206cbd557 | ||
|
|
f537a00409 | ||
|
|
c1f2c062fe | ||
|
|
0ad136fcc6 | ||
|
|
edc203c9ed | ||
|
|
03fbceccaa | ||
|
|
f0e0c0e4fc | ||
|
|
4f1715913e | ||
|
|
33d46209ef | ||
|
|
06288af18d | ||
|
|
c3d0fbaf06 | ||
|
|
91cb2106a9 | ||
|
|
1b53a4db99 | ||
|
|
77464db1b0 | ||
|
|
36faaf0b97 | ||
|
|
e56893fd64 | ||
|
|
c553e2077a | ||
|
|
76ed927839 | ||
|
|
08de84a889 | ||
|
|
52b81cc115 | ||
|
|
de08c6c5b1 | ||
|
|
ee566bd2a3 | ||
|
|
9d8aec1aa6 | ||
|
|
9dc8fe77bc | ||
|
|
409851a64c | ||
|
|
cd1b556fb1 | ||
|
|
d9de502894 | ||
|
|
467fc935f0 | ||
|
|
a16309c69a | ||
|
|
a98f9c698b | ||
|
|
6431e7145d | ||
|
|
bbea27d380 | ||
|
|
e359b1c0a4 | ||
|
|
47348190ab | ||
|
|
cbf99fad18 | ||
|
|
2162b8c22d | ||
|
|
967d13ebac | ||
|
|
c06d5f1f30 | ||
|
|
46df52fddd | ||
|
|
5bf0724c2f | ||
|
|
29252679a1 | ||
|
|
cfc121bbca | ||
|
|
e964985524 | ||
|
|
bf9ffc97f2 | ||
|
|
d0b1addc6f | ||
|
|
96c4d7e903 | ||
|
|
a17df7af88 | ||
|
|
1bae178bc6 | ||
|
|
06519a0e5c | ||
|
|
bd49f4314d | ||
|
|
0e0c43c4f5 | ||
|
|
b221f38465 | ||
|
|
d56c7a3bb4 | ||
|
|
568f86acd0 | ||
|
|
a57def2f92 | ||
|
|
ba149d0e96 | ||
|
|
4527b229ed | ||
|
|
4e64d0b24e | ||
|
|
dfa5763605 | ||
|
|
9dc3edb40e | ||
|
|
2d4fb2b163 | ||
|
|
56f66e9e8f | ||
|
|
aa7f412f14 | ||
|
|
9de1c79da6 | ||
|
|
c8ac925146 | ||
|
|
da85caf684 | ||
|
|
1b7751c5d1 | ||
|
|
93dfd84fa1 | ||
|
|
d3b36238d4 | ||
|
|
3706c66f5f | ||
|
|
cc11a624ad | ||
|
|
62368b62b9 | ||
|
|
52570a3bad | ||
|
|
62696002e6 | ||
|
|
27979ce869 | ||
|
|
4a9f2263f2 | ||
|
|
0d0855bbf9 | ||
|
|
1162d13dd8 | ||
|
|
05cfa9e847 | ||
|
|
f2022c9360 | ||
|
|
1689e5eb9c | ||
|
|
46f7f51d3a | ||
|
|
989137211e | ||
|
|
13bfe66c9f | ||
|
|
1d0f9ed1ed | ||
|
|
7c5f62e192 | ||
|
|
68128c52e5 | ||
|
|
c5e89c1fb6 | ||
|
|
1b1da5f3af | ||
|
|
32583b1a9e | ||
|
|
d98f4b599f | ||
|
|
97f1c1b6f8 | ||
|
|
d4c36e2057 | ||
|
|
4fc836a34b | ||
|
|
562f5f66fe | ||
|
|
357cf34b07 | ||
|
|
0f2781ff6a | ||
|
|
8f93cc5e62 | ||
|
|
bcd32a8616 |
2
.bundle/config
Normal file
@@ -0,0 +1,2 @@
|
||||
---
|
||||
BUNDLE_PATH: "vendor/bundle"
|
||||
9
.editorconfig
Normal file
@@ -0,0 +1,9 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
insert_final_newline = true
|
||||
2
.env
@@ -1,4 +1,4 @@
|
||||
VITE_APP_API_URL=http://localhost:2021
|
||||
VITE_IS_LANDING_DEFAULT=false
|
||||
VITE_IS_LANDING_DEFAULT=true
|
||||
VITE_OPENREPLAY_PROJECT_KEY=
|
||||
VITE_IS_SELF_HOSTED=false
|
||||
@@ -1,4 +1,5 @@
|
||||
VITE_APP_API_URL=http://localhost:2021
|
||||
VITE_APP_REDIRECT_URL=http://localhost:5173
|
||||
VITE_APP_GOOGLE_CLIENT_ID=USE_YOUR_OWN_CLIENT_ID
|
||||
VITE_IS_SELF_HOSTED=true
|
||||
VITE_IS_SELF_HOSTED=true
|
||||
VITE_IS_LANDING_DEFAULT=true
|
||||
21
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
name: Build validation
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 20
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.x
|
||||
cache: 'npm'
|
||||
- name: Install dependencies
|
||||
run: npm i
|
||||
- run: npm run build
|
||||
22
.gitignore
vendored
@@ -22,3 +22,25 @@ dist-ssr
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
resources/android/**/*
|
||||
resources/ios/**/*
|
||||
|
||||
# Secrets (pulled via scripts/pull-secrets.sh)
|
||||
.env.production
|
||||
android/app/google-services.json
|
||||
android/app/release/*.jks
|
||||
android/keystore.properties
|
||||
android/local.properties
|
||||
android/play-service-account.json
|
||||
ios/App/App/GoogleService-Info.plist
|
||||
ios/*.p8
|
||||
|
||||
# Release build outputs
|
||||
build/android
|
||||
build/ios
|
||||
fastlane/report.xml
|
||||
fastlane/Preview.html
|
||||
fastlane/.env
|
||||
fastlane/*.log
|
||||
vendor/bundle
|
||||
85
AUTOMATED_RELEASE.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# Automated Release Pipeline
|
||||
|
||||
Builds and (optionally) uploads signed Android and iOS release artifacts from the CLI — no Android Studio or Xcode GUI needed for routine releases.
|
||||
|
||||
## Quick start
|
||||
|
||||
```sh
|
||||
./scripts/pull-secrets.sh # pulls all signing secrets from Vaultwarden
|
||||
./scripts/release.sh # bump patch version, build + sign both platforms
|
||||
./scripts/release.sh --upload # also upload: Android → Play internal track, iOS → TestFlight
|
||||
```
|
||||
|
||||
Common flags on `release.sh`:
|
||||
|
||||
| Flag | Effect |
|
||||
|---|---|
|
||||
| `--android` / `--ios` | Build only one platform |
|
||||
| `--bump minor\|major` | Bump type (default: `patch`) |
|
||||
| `--skip-bump` | Build with the current version, don't bump |
|
||||
| `--upload` | Upload after building |
|
||||
| `--track TRACK` | Play Store track for `--upload` (default: `internal`) |
|
||||
|
||||
Outputs:
|
||||
- Android: `android/app/build/outputs/bundle/release/app-release.aab`
|
||||
- iOS: `build/ios/Donetick.ipa`
|
||||
|
||||
## One-time machine setup
|
||||
|
||||
1. `bundle install` — installs fastlane (Ruby gems, local to the repo via `vendor/bundle`)
|
||||
2. `./scripts/pull-secrets.sh` — pulls all secrets below from Vaultwarden
|
||||
3. `android/local.properties` needs `sdk.dir=<path to Android SDK>` — not pulled from vault, machine-specific. Android Studio creates this automatically; if building headless-only, create it manually.
|
||||
4. Export `ASC_ISSUER_ID` (App Store Connect API key issuer ID) — either in your shell profile, or add it to the `Donetick Env Production` vault note so `pull-secrets.sh` delivers it into `.env.production` (which `release.sh` auto-sources).
|
||||
5. A working Apple Distribution certificate + the `Donetick App Store(fastline)` provisioning profile must be installed in your keychain / `~/Library/MobileDevice/Provisioning Profiles/` (see "iOS signing model" below) — **not** currently pulled from vault, machine-specific one-time setup.
|
||||
|
||||
## Secrets pulled by `scripts/pull-secrets.sh`
|
||||
|
||||
All secrets live in Vaultwarden (`https://www.bitwarden.com`) as Secure Notes, named exactly as below:
|
||||
|
||||
| Vault item name | Written to | Encoding |
|
||||
|---|---|---|
|
||||
| Donetick Google Services Android | `android/app/google-services.json` | raw |
|
||||
| Donetick Android Keystore | `android/app/release/donetick.jks` | base64 |
|
||||
| Donetick Keystore Password | (used inline for `android/keystore.properties`) | raw |
|
||||
| Donetick Google Play Service Account | `android/play-service-account.json` | raw |
|
||||
| Donetick Google Services iOS | `ios/App/App/GoogleService-Info.plist` | raw |
|
||||
| Donetick App Store Connect Key | `ios/AuthKey_84F695CDQ3.p8` | base64 |
|
||||
| Donetick Env Production | `.env.production` | raw |
|
||||
|
||||
None of these files are committed to git — all covered by `.gitignore`.
|
||||
|
||||
## iOS signing model (important — don't relitigate this)
|
||||
|
||||
The App target uses **manual signing for Release**, not Automatic. This was a deliberate choice, not the default:
|
||||
|
||||
- The project has **two** Apple Distribution-type certificates on the Apple Developer account: an Xcode Cloud–managed one (private key never leaves Apple, can't be used for local CLI signing) and a plain one created via Xcode → Settings → Accounts → Manage Certificates (private key is in the local keychain, usable). Automatic signing kept binding to the wrong (Managed) one.
|
||||
- Fix: `ios/App/App.xcodeproj/project.pbxproj` → App target → Release config has `CODE_SIGN_STYLE = Manual`, `CODE_SIGN_IDENTITY = "Apple Distribution"`, `PROVISIONING_PROFILE_SPECIFIER = "Donetick App Store(fastline)"`. Debug config is untouched (still Automatic, for local dev builds in Xcode).
|
||||
- `fastlane/Fastfile`'s `ios release` lane passes explicit `export_options: { signingStyle: "manual", provisioningProfiles: {...} }` to `build_app` — do **not** switch this back to `-allowProvisioningUpdates`/automatic without a good reason, it re-triggers the ambiguous cert selection.
|
||||
|
||||
**If you ever add/change an entitlement** (new Capability in Signing & Capabilities, e.g. a new permission), the existing provisioning profile becomes stale and exports will fail with an error like `"App.app" requires a provisioning profile with the X feature`. Fix:
|
||||
1. developer.apple.com → Identifiers → `com.donetick.app` → confirm the new capability is checked
|
||||
2. developer.apple.com → Profiles → find `Donetick App Store(fastline)` → regenerate it → download
|
||||
3. Install it locally: get its UUID (`security cms -D -i <file>.mobileprovision | plutil -extract UUID xml1 -o - -`) and copy to `~/Library/MobileDevice/Provisioning Profiles/<uuid>.mobileprovision`
|
||||
|
||||
**If the Distribution certificate ever expires/is revoked**, redo the one-time Xcode step: Settings → Accounts → Manage Certificates → `+` → Apple Distribution, then regenerate the profile as above.
|
||||
|
||||
## Android signing model
|
||||
|
||||
Standard keystore signing via `android/keystore.properties`, read by `android/app/build.gradle`. One historical gotcha already fixed: `storeFile` must be `release/donetick.jks` (relative to the `android/app` module dir), **not** `app/release/donetick.jks` — that extra `app/` silently resolved to a double-nested wrong path and broke CLI builds (Android Studio may have masked this before).
|
||||
|
||||
## Play Store upload gotchas
|
||||
|
||||
- The service account (`fastline-471@donetick-5f910.iam.gserviceaccount.com`) needs the **Google Play Android Developer API enabled** in its GCP project (`donetick-5f910`), **and** explicit per-app release permission granted in Play Console → Users and permissions (not just account-level access) — **and you have to actually click Save**, the UI will silently not persist it otherwise.
|
||||
- Google Play Console permission changes can take time to propagate on Google's backend even after saving (historically documented as up to ~24h, though in practice it was near-instant once actually saved).
|
||||
- The Play Developer API requires the app to have had **at least one manual release** uploaded through the Play Console website before API uploads work at all — not an issue for Donetick (already satisfied) but relevant if this is ever set up for a brand-new app.
|
||||
|
||||
## Fastlane lanes reference
|
||||
|
||||
```sh
|
||||
bundle exec fastlane android release # build signed .aab
|
||||
bundle exec fastlane android apk # build signed .apk (sideloading/testing)
|
||||
bundle exec fastlane android upload [track:X] # upload .aab to Play Store (default track: internal)
|
||||
|
||||
bundle exec fastlane ios release # build signed .ipa
|
||||
bundle exec fastlane ios upload # upload .ipa to TestFlight
|
||||
```
|
||||
233
Gemfile.lock
Normal file
@@ -0,0 +1,233 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.9)
|
||||
abbrev (0.1.2)
|
||||
addressable (2.9.0)
|
||||
public_suffix (>= 2.0.2, < 8.0)
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.3.2)
|
||||
aws-partitions (1.1109.0)
|
||||
aws-sdk-core (3.224.1)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
base64
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
logger
|
||||
aws-sdk-kms (1.101.0)
|
||||
aws-sdk-core (~> 3, >= 3.216.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.188.0)
|
||||
aws-sdk-core (~> 3, >= 3.224.1)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.11.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
base64 (0.2.0)
|
||||
claide (1.1.0)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
commander (4.6.0)
|
||||
highline (~> 2.0.0)
|
||||
csv (3.3.5)
|
||||
declarative (0.0.20)
|
||||
digest-crc (0.7.0)
|
||||
rake (>= 12.0.0, < 14.0.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
dotenv (2.8.1)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.109.0)
|
||||
faraday (1.10.6)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
faraday-httpclient (~> 1.0)
|
||||
faraday-multipart (~> 1.0)
|
||||
faraday-net_http (~> 1.0)
|
||||
faraday-net_http_persistent (~> 1.0)
|
||||
faraday-patron (~> 1.0)
|
||||
faraday-rack (~> 1.0)
|
||||
faraday-retry (~> 1.0)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-cookie_jar (0.0.8)
|
||||
faraday (>= 0.8.0)
|
||||
http-cookie (>= 1.0.0)
|
||||
faraday-em_http (1.0.0)
|
||||
faraday-em_synchrony (1.0.1)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-multipart (1.2.0)
|
||||
multipart-post (~> 2.0)
|
||||
faraday-net_http (1.0.2)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday-retry (1.0.4)
|
||||
faraday_middleware (1.2.1)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.4.1)
|
||||
fastlane (2.230.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
abbrev (~> 0.1.2)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
aws-sdk-s3 (~> 1.0)
|
||||
babosa (>= 1.0.3, < 2.0.0)
|
||||
base64 (~> 0.2.0)
|
||||
bundler (>= 1.12.0, < 3.0.0)
|
||||
colored (~> 1.2)
|
||||
commander (~> 4.6)
|
||||
csv (~> 3.3)
|
||||
dotenv (>= 2.1.1, < 3.0.0)
|
||||
emoji_regex (>= 0.1, < 4.0)
|
||||
excon (>= 0.71.0, < 1.0.0)
|
||||
faraday (~> 1.0)
|
||||
faraday-cookie_jar (~> 0.0.6)
|
||||
faraday_middleware (~> 1.0)
|
||||
fastimage (>= 2.1.0, < 3.0.0)
|
||||
fastlane-sirp (>= 1.0.0)
|
||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||
google-apis-androidpublisher_v3 (~> 0.3)
|
||||
google-apis-playcustomapp_v1 (~> 0.1)
|
||||
google-cloud-env (>= 1.6.0, < 2.0.0)
|
||||
google-cloud-storage (~> 1.31)
|
||||
highline (~> 2.0)
|
||||
http-cookie (~> 1.0.5)
|
||||
json (< 3.0.0)
|
||||
jwt (>= 2.1.0, < 3)
|
||||
logger (>= 1.6, < 2.0)
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multipart-post (>= 2.0.0, < 3.0.0)
|
||||
mutex_m (~> 0.3.0)
|
||||
naturally (~> 2.2)
|
||||
nkf (~> 0.2.0)
|
||||
optparse (>= 0.1.1, < 1.0.0)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
rubyzip (>= 2.0.0, < 3.0.0)
|
||||
security (= 0.1.5)
|
||||
simctl (~> 1.6.3)
|
||||
terminal-notifier (>= 2.0.0, < 3.0.0)
|
||||
terminal-table (~> 3)
|
||||
tty-screen (>= 0.6.3, < 1.0.0)
|
||||
tty-spinner (>= 0.8.0, < 1.0.0)
|
||||
word_wrap (~> 1.0.0)
|
||||
xcodeproj (>= 1.13.0, < 2.0.0)
|
||||
xcpretty (~> 0.4.1)
|
||||
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
|
||||
fastlane-sirp (1.1.0)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.54.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-core (0.11.3)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
mini_mime (~> 1.0)
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
google-apis-iamcredentials_v1 (0.17.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.13.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-storage_v1 (0.29.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-cloud-core (1.6.1)
|
||||
google-cloud-env (>= 1.0, < 3.a)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.6.0)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
google-cloud-errors (1.3.1)
|
||||
google-cloud-storage (1.45.0)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.29.0)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.8.1)
|
||||
faraday (>= 0.17.3, < 3.a)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
multi_json (~> 1.11)
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (>= 0.16, < 2.a)
|
||||
highline (2.0.3)
|
||||
http-cookie (1.0.8)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.9.0)
|
||||
mutex_m
|
||||
jmespath (1.6.2)
|
||||
json (2.7.6)
|
||||
jwt (2.10.3)
|
||||
base64
|
||||
logger (1.7.0)
|
||||
mini_magick (4.13.2)
|
||||
mini_mime (1.1.5)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.4.1)
|
||||
mutex_m (0.3.0)
|
||||
nanaimo (0.4.0)
|
||||
naturally (2.3.0)
|
||||
nkf (0.2.0)
|
||||
optparse (0.8.1)
|
||||
os (1.1.4)
|
||||
plist (3.7.2)
|
||||
public_suffix (5.1.1)
|
||||
rake (13.4.2)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
retriable (3.8.0)
|
||||
rexml (3.4.4)
|
||||
rouge (3.28.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.4.1)
|
||||
security (0.1.5)
|
||||
signet (0.18.0)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.5, < 3.a)
|
||||
jwt (>= 1.5, < 3.0)
|
||||
multi_json (~> 1.10)
|
||||
simctl (1.6.10)
|
||||
CFPropertyList
|
||||
naturally
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (3.0.2)
|
||||
unicode-display_width (>= 1.1.1, < 3)
|
||||
trailblazer-option (0.1.2)
|
||||
tty-cursor (0.7.1)
|
||||
tty-screen (0.8.2)
|
||||
tty-spinner (0.9.3)
|
||||
tty-cursor (~> 0.7)
|
||||
uber (0.1.0)
|
||||
unf (0.2.0)
|
||||
unicode-display_width (2.6.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.28.1)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
base64
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.4.0)
|
||||
nkf
|
||||
rexml (>= 3.3.6, < 4.0)
|
||||
xcpretty (0.4.1)
|
||||
rouge (~> 3.28.0)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
xcpretty (~> 0.2, >= 0.0.7)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
fastlane
|
||||
|
||||
BUNDLED WITH
|
||||
1.17.2
|
||||
11
README.md
@@ -20,12 +20,9 @@ As an avid for open-source, I was eager to create a solution that could benefit
|
||||
- Recurring Tasks: Schedule tasks to repeat daily, weekly, monthly, or yearly, with flexible customization options.
|
||||
- Progress Tracking: Track the completion status of tasks and view historical data.
|
||||
|
||||
## Installation
|
||||
## Development Environment
|
||||
|
||||
1. Clone the repository:
|
||||
2. Navigate to the project directory: `cd frontend`
|
||||
3. Download dependency `npm install`
|
||||
4. Run locally `npm start`
|
||||
Follow the full instructions here: https://github.com/donetick/donetick?tab=readme-ov-file#development-environment
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -41,7 +38,7 @@ Contributions are welcome! If you would like to contribute to Donetick, please f
|
||||
|
||||
Donetick is a work in progress and has been a fantastic learning experience for me as I've honed my React skills,I'm looking for collaborators to help improve and refine the Donetick. Feel free to open PR or suggest changes.
|
||||
|
||||
## Plans :
|
||||
## Plans:
|
||||
|
||||
My goal is to expand Donetick by offering a hosted infrastructure option. This will make it even easier for users to access and utilize Donetick's features without the need for self-hosting.
|
||||
|
||||
@@ -49,4 +46,4 @@ While maintaining Donetick's commitment to open source, this hosted option will
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. I might consider changing it later to something else
|
||||
This project is licensed under the AGPLv3 License. See the [LICENSE](LICENSE) file for more details. I might consider changing it later to something else
|
||||
|
||||
101
android/.gitignore
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
|
||||
|
||||
# Built application files
|
||||
*.apk
|
||||
*.aar
|
||||
*.ap_
|
||||
*.aab
|
||||
|
||||
# Files for the ART/Dalvik VM
|
||||
*.dex
|
||||
|
||||
# Java class files
|
||||
*.class
|
||||
|
||||
# Generated files
|
||||
bin/
|
||||
gen/
|
||||
out/
|
||||
# Uncomment the following line in case you need and you don't have the release build type files in your app
|
||||
# release/
|
||||
|
||||
# Gradle files
|
||||
.gradle/
|
||||
build/
|
||||
|
||||
# Local configuration file (sdk path, etc)
|
||||
local.properties
|
||||
|
||||
# Proguard folder generated by Eclipse
|
||||
proguard/
|
||||
|
||||
# Log Files
|
||||
*.log
|
||||
|
||||
# Android Studio Navigation editor temp files
|
||||
.navigation/
|
||||
|
||||
# Android Studio captures folder
|
||||
captures/
|
||||
|
||||
# IntelliJ
|
||||
*.iml
|
||||
.idea/workspace.xml
|
||||
.idea/tasks.xml
|
||||
.idea/gradle.xml
|
||||
.idea/assetWizardSettings.xml
|
||||
.idea/dictionaries
|
||||
.idea/libraries
|
||||
# Android Studio 3 in .gitignore file.
|
||||
.idea/caches
|
||||
.idea/modules.xml
|
||||
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
|
||||
.idea/navEditor.xml
|
||||
|
||||
# Keystore files
|
||||
# Uncomment the following lines if you do not want to check your keystore files in.
|
||||
#*.jks
|
||||
#*.keystore
|
||||
|
||||
# External native build folder generated in Android Studio 2.2 and later
|
||||
.externalNativeBuild
|
||||
.cxx/
|
||||
|
||||
# Google Services (e.g. APIs or Firebase)
|
||||
# google-services.json
|
||||
|
||||
# Freeline
|
||||
freeline.py
|
||||
freeline/
|
||||
freeline_project_description.json
|
||||
|
||||
# fastlane
|
||||
fastlane/report.xml
|
||||
fastlane/Preview.html
|
||||
fastlane/screenshots
|
||||
fastlane/test_output
|
||||
fastlane/readme.md
|
||||
|
||||
# Version control
|
||||
vcs.xml
|
||||
|
||||
# lint
|
||||
lint/intermediates/
|
||||
lint/generated/
|
||||
lint/outputs/
|
||||
lint/tmp/
|
||||
# lint/reports/
|
||||
|
||||
# Android Profiling
|
||||
*.hprof
|
||||
|
||||
# Cordova plugins for Capacitor
|
||||
capacitor-cordova-android-plugins
|
||||
|
||||
# Copied web assets
|
||||
app/src/main/assets/public
|
||||
|
||||
# Generated Config files
|
||||
app/src/main/assets/capacitor.config.json
|
||||
app/src/main/assets/capacitor.plugins.json
|
||||
app/src/main/res/xml/config.xml
|
||||
2
android/app/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/build/*
|
||||
!/build/.npmkeep
|
||||
71
android/app/build.gradle
Normal file
@@ -0,0 +1,71 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
def keystorePropertiesFile = rootProject.file("keystore.properties")
|
||||
def keystoreProperties = new Properties()
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||
}
|
||||
|
||||
android {
|
||||
namespace "com.donetick.app"
|
||||
compileSdk rootProject.ext.compileSdkVersion
|
||||
defaultConfig {
|
||||
applicationId "com.donetick.app"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 37
|
||||
versionName "1.2.16"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
aaptOptions {
|
||||
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
||||
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
|
||||
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
|
||||
}
|
||||
}
|
||||
signingConfigs {
|
||||
release {
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
storeFile file(keystoreProperties['storeFile'])
|
||||
storePassword keystoreProperties['storePassword']
|
||||
keyAlias keystoreProperties['keyAlias']
|
||||
keyPassword keystoreProperties['keyPassword']
|
||||
}
|
||||
}
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
signingConfig keystorePropertiesFile.exists() ? signingConfigs.release : signingConfigs.debug
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
flatDir{
|
||||
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
|
||||
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
|
||||
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
|
||||
implementation project(':capacitor-android')
|
||||
testImplementation "junit:junit:$junitVersion"
|
||||
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
|
||||
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
|
||||
implementation project(':capacitor-cordova-android-plugins')
|
||||
}
|
||||
|
||||
apply from: 'capacitor.build.gradle'
|
||||
|
||||
try {
|
||||
def servicesJSON = file('google-services.json')
|
||||
if (servicesJSON.text) {
|
||||
apply plugin: 'com.google.gms.google-services'
|
||||
}
|
||||
} catch(Exception e) {
|
||||
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
|
||||
}
|
||||
35
android/app/capacitor.build.gradle
Normal file
@@ -0,0 +1,35 @@
|
||||
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
|
||||
|
||||
android {
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_21
|
||||
targetCompatibility JavaVersion.VERSION_21
|
||||
}
|
||||
}
|
||||
|
||||
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
|
||||
dependencies {
|
||||
implementation project(':capacitor-community-sqlite')
|
||||
implementation project(':capacitor-app')
|
||||
implementation project(':capacitor-browser')
|
||||
implementation project(':capacitor-device')
|
||||
implementation project(':capacitor-local-llm')
|
||||
implementation project(':capacitor-local-notifications')
|
||||
implementation project(':capacitor-network')
|
||||
implementation project(':capacitor-preferences')
|
||||
implementation project(':capacitor-push-notifications')
|
||||
implementation project(':capacitor-status-bar')
|
||||
implementation project(':capgo-capacitor-document-scanner')
|
||||
implementation project(':capgo-capacitor-nfc')
|
||||
implementation project(':capgo-capacitor-social-login')
|
||||
implementation project(':jcesarmobile-capacitor-ocr')
|
||||
implementation project(':revenuecat-purchases-capacitor')
|
||||
implementation project(':revenuecat-purchases-capacitor-ui')
|
||||
implementation project(':capacitor-plugin-safe-area')
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (hasProperty('postBuildExtras')) {
|
||||
postBuildExtras()
|
||||
}
|
||||
21
android/app/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# 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 *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
37
android/app/release/output-metadata.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"version": 3,
|
||||
"artifactType": {
|
||||
"type": "APK",
|
||||
"kind": "Directory"
|
||||
},
|
||||
"applicationId": "com.donetick.app",
|
||||
"variantName": "release",
|
||||
"elements": [
|
||||
{
|
||||
"type": "SINGLE",
|
||||
"filters": [],
|
||||
"attributes": [],
|
||||
"versionCode": 25,
|
||||
"versionName": "1.2.3",
|
||||
"outputFile": "app-release.apk"
|
||||
}
|
||||
],
|
||||
"elementType": "File",
|
||||
"baselineProfiles": [
|
||||
{
|
||||
"minApi": 28,
|
||||
"maxApi": 30,
|
||||
"baselineProfiles": [
|
||||
"baselineProfiles/1/app-release.dm"
|
||||
]
|
||||
},
|
||||
{
|
||||
"minApi": 31,
|
||||
"maxApi": 2147483647,
|
||||
"baselineProfiles": [
|
||||
"baselineProfiles/0/app-release.dm"
|
||||
]
|
||||
}
|
||||
],
|
||||
"minSdkVersionForDexing": 28
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.getcapacitor.myapp;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ExampleInstrumentedTest {
|
||||
|
||||
@Test
|
||||
public void useAppContext() throws Exception {
|
||||
// Context of the app under test.
|
||||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||
|
||||
assertEquals("com.getcapacitor.app", appContext.getPackageName());
|
||||
}
|
||||
}
|
||||
72
android/app/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
android:usesCleartextTraffic="true">
|
||||
<activity
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
|
||||
android:name=".MainActivity"
|
||||
android:label="@string/title_activity_main"
|
||||
android:theme="@style/AppTheme.NoActionBarLaunch"
|
||||
android:launchMode="singleTask"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- Deep link intent filter for OAuth and other donetick:// URLs -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="donetick" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- NFC NDEF dispatch: open app directly when a donetick:// tag is scanned -->
|
||||
<intent-filter>
|
||||
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:scheme="donetick" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.fileprovider"
|
||||
android:exported="false"
|
||||
android:grantUriPermissions="true">
|
||||
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
|
||||
</provider>
|
||||
|
||||
<!-- Push Notifications Icon -->
|
||||
<meta-data
|
||||
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||
android:resource="@mipmap/ic_launcher" />
|
||||
|
||||
<!-- Push Notifications Color -->
|
||||
<meta-data
|
||||
android:name="com.google.firebase.messaging.default_notification_color"
|
||||
android:resource="@android:color/white" />
|
||||
</application>
|
||||
|
||||
<!-- Permissions -->
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
|
||||
<!-- Android 14+ partial photo access via system photo picker; no READ_MEDIA_IMAGES needed -->
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
|
||||
<!-- Explicitly block READ_MEDIA_IMAGES if any library injects it -->
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" tools:node="remove" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" tools:node="remove" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
</manifest>
|
||||
BIN
android/app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
49
android/app/src/main/java/com/donetick/app/MainActivity.java
Normal file
@@ -0,0 +1,49 @@
|
||||
package com.donetick.app;
|
||||
|
||||
import com.getcapacitor.BridgeActivity;
|
||||
|
||||
import ee.forgr.capacitor.social.login.GoogleProvider;
|
||||
import ee.forgr.capacitor.social.login.SocialLoginPlugin;
|
||||
import ee.forgr.capacitor.social.login.ModifiedMainActivityForSocialLoginPlugin;
|
||||
import com.getcapacitor.PluginHandle;
|
||||
import com.getcapacitor.Plugin;
|
||||
import android.content.Intent;
|
||||
import android.nfc.NfcAdapter;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
public class MainActivity extends BridgeActivity implements ModifiedMainActivityForSocialLoginPlugin {
|
||||
|
||||
// Capacitor only forwards ACTION_VIEW deep links, so normalize Donetick NFC intents before dispatch.
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent) {
|
||||
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())
|
||||
&& intent.getData() != null
|
||||
&& "donetick".equals(intent.getData().getScheme())) {
|
||||
intent.setAction(Intent.ACTION_VIEW);
|
||||
}
|
||||
super.onNewIntent(intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
||||
if (requestCode >= GoogleProvider.REQUEST_AUTHORIZE_GOOGLE_MIN && requestCode < GoogleProvider.REQUEST_AUTHORIZE_GOOGLE_MAX) {
|
||||
PluginHandle pluginHandle = getBridge().getPlugin("SocialLogin");
|
||||
if (pluginHandle == null) {
|
||||
Log.i("Google Activity Result", "SocialLogin login handle is null");
|
||||
return;
|
||||
}
|
||||
Plugin plugin = pluginHandle.getInstance();
|
||||
if (!(plugin instanceof SocialLoginPlugin)) {
|
||||
Log.i("Google Activity Result", "SocialLogin plugin instance is not SocialLoginPlugin");
|
||||
return;
|
||||
}
|
||||
((SocialLoginPlugin) plugin).handleGoogleLoginIntent(requestCode, data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void IHaveModifiedTheMainActivityForTheUseWithSocialLoginPlugin() {}
|
||||
}
|
||||
BIN
android/app/src/main/res/drawable-land-hdpi/splash.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
android/app/src/main/res/drawable-land-ldpi/splash.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
android/app/src/main/res/drawable-land-mdpi/splash.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
android/app/src/main/res/drawable-land-night-hdpi/splash.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
android/app/src/main/res/drawable-land-night-ldpi/splash.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
android/app/src/main/res/drawable-land-night-mdpi/splash.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
android/app/src/main/res/drawable-land-night-xhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
android/app/src/main/res/drawable-land-night-xxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
android/app/src/main/res/drawable-land-xhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
android/app/src/main/res/drawable-land-xxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
android/app/src/main/res/drawable-land-xxxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
android/app/src/main/res/drawable-night/splash.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
android/app/src/main/res/drawable-port-hdpi/splash.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
android/app/src/main/res/drawable-port-ldpi/splash.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
android/app/src/main/res/drawable-port-mdpi/splash.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
android/app/src/main/res/drawable-port-night-hdpi/splash.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
android/app/src/main/res/drawable-port-night-ldpi/splash.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
android/app/src/main/res/drawable-port-night-mdpi/splash.png
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
BIN
android/app/src/main/res/drawable-port-night-xhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
android/app/src/main/res/drawable-port-night-xxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
android/app/src/main/res/drawable-port-xhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
android/app/src/main/res/drawable-port-xxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
android/app/src/main/res/drawable-port-xxxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
android/app/src/main/res/drawable/splash.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background>
|
||||
<inset android:drawable="@mipmap/ic_launcher_background" android:inset="16.7%" />
|
||||
</background>
|
||||
<foreground>
|
||||
<inset android:drawable="@mipmap/ic_launcher_foreground" android:inset="16.7%" />
|
||||
</foreground>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background>
|
||||
<inset android:drawable="@mipmap/ic_launcher_background" android:inset="16.7%" />
|
||||
</background>
|
||||
<foreground>
|
||||
<inset android:drawable="@mipmap/ic_launcher_foreground" android:inset="16.7%" />
|
||||
</foreground>
|
||||
</adaptive-icon>
|
||||
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png
Normal file
|
After Width: | Height: | Size: 531 B |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
android/app/src/main/res/mipmap-ldpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png
Normal file
|
After Width: | Height: | Size: 277 B |
BIN
android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png
Normal file
|
After Width: | Height: | Size: 350 B |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
Normal file
|
After Width: | Height: | Size: 697 B |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 28 KiB |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 40 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#FFFFFF</color>
|
||||
</resources>
|
||||
7
android/app/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="app_name">Donetick</string>
|
||||
<string name="title_activity_main">Donetick</string>
|
||||
<string name="package_name">com.donetick.app</string>
|
||||
<string name="custom_url_scheme">com.donetick.app</string>
|
||||
</resources>
|
||||
22
android/app/src/main/res/values/styles.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
</style>
|
||||
|
||||
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
|
||||
<item name="android:background">@drawable/splash</item>
|
||||
</style>
|
||||
</resources>
|
||||
5
android/app/src/main/res/xml/file_paths.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<external-path name="my_images" path="." />
|
||||
<cache-path name="my_cache_images" path="." />
|
||||
</paths>
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.getcapacitor.myapp;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
public class ExampleUnitTest {
|
||||
|
||||
@Test
|
||||
public void addition_isCorrect() throws Exception {
|
||||
assertEquals(4, 2 + 2);
|
||||
}
|
||||
}
|
||||
29
android/build.gradle
Normal file
@@ -0,0 +1,29 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.10.1'
|
||||
classpath 'com.google.gms:google-services:4.4.2'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
}
|
||||
|
||||
apply from: "variables.gradle"
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
54
android/capacitor.settings.gradle
Normal file
@@ -0,0 +1,54 @@
|
||||
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
|
||||
include ':capacitor-android'
|
||||
project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
|
||||
|
||||
include ':capacitor-community-sqlite'
|
||||
project(':capacitor-community-sqlite').projectDir = new File('../node_modules/@capacitor-community/sqlite/android')
|
||||
|
||||
include ':capacitor-app'
|
||||
project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
|
||||
|
||||
include ':capacitor-browser'
|
||||
project(':capacitor-browser').projectDir = new File('../node_modules/@capacitor/browser/android')
|
||||
|
||||
include ':capacitor-device'
|
||||
project(':capacitor-device').projectDir = new File('../node_modules/@capacitor/device/android')
|
||||
|
||||
include ':capacitor-local-llm'
|
||||
project(':capacitor-local-llm').projectDir = new File('../node_modules/@capacitor/local-llm/android')
|
||||
|
||||
include ':capacitor-local-notifications'
|
||||
project(':capacitor-local-notifications').projectDir = new File('../node_modules/@capacitor/local-notifications/android')
|
||||
|
||||
include ':capacitor-network'
|
||||
project(':capacitor-network').projectDir = new File('../node_modules/@capacitor/network/android')
|
||||
|
||||
include ':capacitor-preferences'
|
||||
project(':capacitor-preferences').projectDir = new File('../node_modules/@capacitor/preferences/android')
|
||||
|
||||
include ':capacitor-push-notifications'
|
||||
project(':capacitor-push-notifications').projectDir = new File('../node_modules/@capacitor/push-notifications/android')
|
||||
|
||||
include ':capacitor-status-bar'
|
||||
project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android')
|
||||
|
||||
include ':capgo-capacitor-document-scanner'
|
||||
project(':capgo-capacitor-document-scanner').projectDir = new File('../node_modules/@capgo/capacitor-document-scanner/android')
|
||||
|
||||
include ':capgo-capacitor-nfc'
|
||||
project(':capgo-capacitor-nfc').projectDir = new File('../node_modules/@capgo/capacitor-nfc/android')
|
||||
|
||||
include ':capgo-capacitor-social-login'
|
||||
project(':capgo-capacitor-social-login').projectDir = new File('../node_modules/@capgo/capacitor-social-login/android')
|
||||
|
||||
include ':jcesarmobile-capacitor-ocr'
|
||||
project(':jcesarmobile-capacitor-ocr').projectDir = new File('../node_modules/@jcesarmobile/capacitor-ocr/android')
|
||||
|
||||
include ':revenuecat-purchases-capacitor'
|
||||
project(':revenuecat-purchases-capacitor').projectDir = new File('../node_modules/@revenuecat/purchases-capacitor/android')
|
||||
|
||||
include ':revenuecat-purchases-capacitor-ui'
|
||||
project(':revenuecat-purchases-capacitor-ui').projectDir = new File('../node_modules/@revenuecat/purchases-capacitor-ui/android')
|
||||
|
||||
include ':capacitor-plugin-safe-area'
|
||||
project(':capacitor-plugin-safe-area').projectDir = new File('../node_modules/capacitor-plugin-safe-area/android')
|
||||
22
android/gradle.properties
Normal file
@@ -0,0 +1,22 @@
|
||||
# Project-wide Gradle settings.
|
||||
|
||||
# IDE (e.g. Android Studio) users:
|
||||
# Gradle settings configured through the IDE *will override*
|
||||
# any settings specified in this file.
|
||||
|
||||
# For more details on how to configure your build environment visit
|
||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||
|
||||
# Specifies the JVM arguments used for the daemon process.
|
||||
# The setting is particularly useful for tweaking memory settings.
|
||||
org.gradle.jvmargs=-Xmx1536m
|
||||
|
||||
# When configured, Gradle will run in incubating parallel mode.
|
||||
# This option should only be used with decoupled projects. More details, visit
|
||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||
# org.gradle.parallel=true
|
||||
|
||||
# AndroidX package structure to make it clearer which packages are bundled with the
|
||||
# Android operating system, and which are packaged with your app's APK
|
||||
# https://developer.android.com/topic/libraries/support-library/androidx-rn
|
||||
android.useAndroidX=true
|
||||
BIN
android/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
7
android/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
248
android/gradlew
vendored
Executable file
@@ -0,0 +1,248 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# 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
|
||||
#
|
||||
# https://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.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
if ! command -v xargs >/dev/null 2>&1
|
||||
then
|
||||
die "xargs is not available"
|
||||
fi
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
92
android/gradlew.bat
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
5
android/settings.gradle
Normal file
@@ -0,0 +1,5 @@
|
||||
include ':app'
|
||||
include ':capacitor-cordova-android-plugins'
|
||||
project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
|
||||
|
||||
apply from: 'capacitor.settings.gradle'
|
||||
0
android/signing.properties
Normal file
17
android/variables.gradle
Normal file
@@ -0,0 +1,17 @@
|
||||
ext {
|
||||
minSdkVersion = 28
|
||||
compileSdkVersion = 36
|
||||
targetSdkVersion = 36
|
||||
androidxActivityVersion = '1.11.0'
|
||||
androidxAppCompatVersion = '1.7.1'
|
||||
androidxCoordinatorLayoutVersion = '1.3.0'
|
||||
androidxCoreVersion = '1.17.0'
|
||||
androidxFragmentVersion = '1.8.9'
|
||||
coreSplashScreenVersion = '1.0.1'
|
||||
androidxWebkitVersion = '1.14.0'
|
||||
junitVersion = '4.13.2'
|
||||
androidxJunitVersion = '1.3.0'
|
||||
androidxEspressoCoreVersion = '3.7.0'
|
||||
cordovaAndroidVersion = '10.1.1'
|
||||
firebaseMessagingVersion = '24.1.0'
|
||||
}
|
||||
BIN
assets/ipad_dashbard_calendar.png
Normal file
|
After Width: | Height: | Size: 419 KiB |
BIN
assets/logo.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
84
bump-version.js
Executable file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { execSync } from 'child_process'
|
||||
import fs from 'fs'
|
||||
import path from 'path'
|
||||
import { fileURLToPath } from 'url'
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url)
|
||||
const __dirname = path.dirname(__filename)
|
||||
|
||||
// Read package.json
|
||||
const packageJsonPath = path.join(__dirname, 'package.json')
|
||||
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
|
||||
|
||||
// Get current version
|
||||
const currentVersion = packageJson.version
|
||||
console.log(`Current version: ${currentVersion}`)
|
||||
|
||||
// Parse version (assuming semver format: major.minor.patch)
|
||||
const versionParts = currentVersion.split('.').map(Number)
|
||||
const [major, minor, patch] = versionParts
|
||||
|
||||
// Bump patch version by default (can be modified to accept arguments for major/minor)
|
||||
const bumpType = process.argv[2] || 'patch'
|
||||
let newVersion
|
||||
|
||||
switch (bumpType) {
|
||||
case 'major':
|
||||
newVersion = `${major + 1}.0.0`
|
||||
break
|
||||
case 'minor':
|
||||
newVersion = `${major}.${minor + 1}.0`
|
||||
break
|
||||
case 'patch':
|
||||
default:
|
||||
newVersion = `${major}.${minor}.${patch + 1}`
|
||||
break
|
||||
}
|
||||
|
||||
console.log(`New version: ${newVersion}`)
|
||||
|
||||
// Update package.json
|
||||
packageJson.version = newVersion
|
||||
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n')
|
||||
console.log('✓ Updated package.json')
|
||||
|
||||
// Read Android build.gradle to get current versionCode
|
||||
const buildGradlePath = path.join(__dirname, 'android', 'app', 'build.gradle')
|
||||
let buildGradle = fs.readFileSync(buildGradlePath, 'utf8')
|
||||
|
||||
// Extract current versionCode
|
||||
const versionCodeMatch = buildGradle.match(/versionCode\s+(\d+)/)
|
||||
const currentVersionCode = versionCodeMatch ? parseInt(versionCodeMatch[1]) : 1
|
||||
const newVersionCode = currentVersionCode + 1
|
||||
|
||||
console.log(`Android versionCode: ${currentVersionCode} → ${newVersionCode}`)
|
||||
|
||||
// Use capacitor-set-version to update both iOS and Android
|
||||
try {
|
||||
console.log('\nUpdating iOS and Android versions...')
|
||||
|
||||
// Set version and build number for both platforms
|
||||
execSync(
|
||||
`npx capacitor-set-version set -v ${newVersion} -b ${newVersionCode}`,
|
||||
{
|
||||
stdio: 'inherit',
|
||||
},
|
||||
)
|
||||
|
||||
console.log('\n✓ Successfully bumped version to', newVersion)
|
||||
console.log(`✓ Build number: ${newVersionCode}`)
|
||||
console.log('\nNext steps:')
|
||||
console.log('1. Review the changes')
|
||||
console.log(
|
||||
'2. Commit: git add . && git commit -m "Bump version to ' +
|
||||
newVersion +
|
||||
'"',
|
||||
)
|
||||
console.log('3. Tag: git tag v' + newVersion)
|
||||
console.log('4. Push: git push origin develop --tags')
|
||||
} catch (error) {
|
||||
console.error('Error updating versions:', error.message)
|
||||
process.exit(1)
|
||||
}
|
||||
28
capacitor.config.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import type { CapacitorConfig } from '@capacitor/cli'
|
||||
|
||||
const config: CapacitorConfig = {
|
||||
appId: 'com.donetick.app',
|
||||
appName: 'Donetick',
|
||||
webDir: 'dist',
|
||||
android: {
|
||||
allowMixedContent: true,
|
||||
},
|
||||
plugins: {
|
||||
PushNotifications: {
|
||||
presentationOptions: ['badge', 'sound', 'alert'],
|
||||
},
|
||||
LocalNotifications: {
|
||||
smallIcon: 'ic_stat_icon_config_sample',
|
||||
iconColor: '#488AFF',
|
||||
sound: 'beep.wav',
|
||||
},
|
||||
// GoogleAuth: {
|
||||
// scopes: ['profile', 'email', 'openid'],
|
||||
// clientId: process.env.VITE_APP_GOOGLE_CLIENT_ID,
|
||||
// androidClientId: process.env.VITE_APP_ANDRIOD_CLIENT_ID,
|
||||
// iosClientId: process.env.VITE_APP_IOS_CLIENT_ID,
|
||||
// },
|
||||
},
|
||||
}
|
||||
|
||||
export default config
|
||||
15
crowdin.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
# Crowdin configuration for Donetick
|
||||
# See: https://support.crowdin.com/configuration-file/
|
||||
|
||||
project_id: "donetick"
|
||||
api_token_env: CROWDIN_API_TOKEN
|
||||
preserve_hierarchy: true
|
||||
|
||||
languages_mapping:
|
||||
two_letters_code:
|
||||
zh-CN: zh-CN
|
||||
|
||||
files:
|
||||
- source: /public/locales/en/*.json
|
||||
translation: /public/locales/%two_letters_code%/%original_file_name%
|
||||
update_option: update_as_unapproved
|
||||
4
fastlane/Appfile
Normal file
@@ -0,0 +1,4 @@
|
||||
app_identifier("com.donetick.app")
|
||||
team_id("6UJJ78R3BS")
|
||||
|
||||
apple_id(ENV["APPLE_ID"]) if ENV["APPLE_ID"]
|
||||
113
fastlane/Fastfile
Normal file
@@ -0,0 +1,113 @@
|
||||
require "shellwords"
|
||||
|
||||
default_platform(:ios)
|
||||
|
||||
IOS_KEY_PATH = File.expand_path("../ios/AuthKey_84F695CDQ3.p8")
|
||||
IOS_OUTPUT_DIR = File.expand_path("../build/ios")
|
||||
ANDROID_PROJECT_DIR = File.expand_path("../android")
|
||||
PLAY_JSON_KEY_PATH = File.expand_path("../android/play-service-account.json")
|
||||
|
||||
platform :ios do
|
||||
desc "Build a signed, App Store-ready .ipa"
|
||||
lane :release do
|
||||
Dir.chdir(File.expand_path("../ios/App")) do
|
||||
Bundler.with_clean_env do
|
||||
sh("pod install --repo-update")
|
||||
end
|
||||
end
|
||||
|
||||
build_app(
|
||||
workspace: "ios/App/App.xcworkspace",
|
||||
scheme: "App",
|
||||
export_method: "app-store",
|
||||
output_directory: IOS_OUTPUT_DIR,
|
||||
output_name: "Donetick.ipa",
|
||||
export_options: {
|
||||
signingStyle: "manual",
|
||||
provisioningProfiles: {
|
||||
"com.donetick.app" => "Donetick App Store(fastline)",
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
UI.success("Signed .ipa at #{IOS_OUTPUT_DIR}/Donetick.ipa")
|
||||
end
|
||||
|
||||
desc "Upload the built .ipa to TestFlight"
|
||||
lane :upload do
|
||||
UI.user_error!("Missing #{IOS_KEY_PATH} — run scripts/pull-secrets.sh first") unless File.exist?(IOS_KEY_PATH)
|
||||
UI.user_error!("ASC_ISSUER_ID is not set (App Store Connect API key issuer id)") if ENV["ASC_ISSUER_ID"].to_s.empty?
|
||||
|
||||
ipa_path = File.join(IOS_OUTPUT_DIR, "Donetick.ipa")
|
||||
UI.user_error!("Missing #{ipa_path} — run `fastlane ios release` first") unless File.exist?(ipa_path)
|
||||
|
||||
api_key = app_store_connect_api_key(
|
||||
key_id: ENV["ASC_KEY_ID"] || "84F695CDQ3",
|
||||
issuer_id: ENV["ASC_ISSUER_ID"],
|
||||
key_filepath: IOS_KEY_PATH,
|
||||
duration: 1200,
|
||||
in_house: false,
|
||||
)
|
||||
|
||||
upload_to_testflight(
|
||||
api_key: api_key,
|
||||
ipa: ipa_path,
|
||||
skip_waiting_for_build_processing: true,
|
||||
skip_submission: true,
|
||||
)
|
||||
|
||||
UI.success("Uploaded to TestFlight")
|
||||
end
|
||||
end
|
||||
|
||||
platform :android do
|
||||
desc "Build a signed release .aab"
|
||||
lane :release do
|
||||
keystore_properties = File.join(ANDROID_PROJECT_DIR, "keystore.properties")
|
||||
UI.user_error!("Missing #{keystore_properties} — run scripts/pull-secrets.sh first") unless File.exist?(keystore_properties)
|
||||
|
||||
gradle(
|
||||
task: "bundle",
|
||||
build_type: "Release",
|
||||
project_dir: "#{ANDROID_PROJECT_DIR}/",
|
||||
)
|
||||
|
||||
aab_path = lane_context[SharedValues::GRADLE_AAB_OUTPUT_PATH]
|
||||
UI.success("Signed .aab at #{aab_path}")
|
||||
end
|
||||
|
||||
desc "Build a signed release .apk (for sideloading/testing)"
|
||||
lane :apk do
|
||||
keystore_properties = File.join(ANDROID_PROJECT_DIR, "keystore.properties")
|
||||
UI.user_error!("Missing #{keystore_properties} — run scripts/pull-secrets.sh first") unless File.exist?(keystore_properties)
|
||||
|
||||
gradle(
|
||||
task: "assemble",
|
||||
build_type: "Release",
|
||||
project_dir: "#{ANDROID_PROJECT_DIR}/",
|
||||
)
|
||||
|
||||
apk_path = lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]
|
||||
UI.success("Signed .apk at #{apk_path}")
|
||||
end
|
||||
|
||||
desc "Upload the built .aab to the Play Store (internal testing track by default)"
|
||||
lane :upload do |options|
|
||||
UI.user_error!("Missing #{PLAY_JSON_KEY_PATH} — run scripts/pull-secrets.sh first") unless File.exist?(PLAY_JSON_KEY_PATH)
|
||||
|
||||
aab_path = File.join(ANDROID_PROJECT_DIR, "app/build/outputs/bundle/release/app-release.aab")
|
||||
UI.user_error!("Missing #{aab_path} — run `fastlane android release` first") unless File.exist?(aab_path)
|
||||
|
||||
upload_to_play_store(
|
||||
json_key: PLAY_JSON_KEY_PATH,
|
||||
package_name: "com.donetick.app",
|
||||
aab: aab_path,
|
||||
track: options[:track] || "internal",
|
||||
skip_upload_metadata: true,
|
||||
skip_upload_images: true,
|
||||
skip_upload_screenshots: true,
|
||||
)
|
||||
|
||||
UI.success("Uploaded to Play Store (#{options[:track] || 'internal'} track)")
|
||||
end
|
||||
end
|
||||
69
fastlane/README.md
Normal file
@@ -0,0 +1,69 @@
|
||||
fastlane documentation
|
||||
----
|
||||
|
||||
# Installation
|
||||
|
||||
Make sure you have the latest version of the Xcode command line tools installed:
|
||||
|
||||
```sh
|
||||
xcode-select --install
|
||||
```
|
||||
|
||||
For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
|
||||
|
||||
# Available Actions
|
||||
|
||||
## iOS
|
||||
|
||||
### ios release
|
||||
|
||||
```sh
|
||||
[bundle exec] fastlane ios release
|
||||
```
|
||||
|
||||
Build a signed, App Store-ready .ipa
|
||||
|
||||
### ios upload
|
||||
|
||||
```sh
|
||||
[bundle exec] fastlane ios upload
|
||||
```
|
||||
|
||||
Upload the built .ipa to TestFlight
|
||||
|
||||
----
|
||||
|
||||
|
||||
## Android
|
||||
|
||||
### android release
|
||||
|
||||
```sh
|
||||
[bundle exec] fastlane android release
|
||||
```
|
||||
|
||||
Build a signed release .aab
|
||||
|
||||
### android apk
|
||||
|
||||
```sh
|
||||
[bundle exec] fastlane android apk
|
||||
```
|
||||
|
||||
Build a signed release .apk (for sideloading/testing)
|
||||
|
||||
### android upload
|
||||
|
||||
```sh
|
||||
[bundle exec] fastlane android upload
|
||||
```
|
||||
|
||||
Upload the built .aab to the Play Store (internal testing track by default)
|
||||
|
||||
----
|
||||
|
||||
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
|
||||
|
||||
More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
|
||||
|
||||
The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
|
||||
BIN
icons/icon-128.webp
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
BIN
icons/icon-192.webp
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
icons/icon-256.webp
Normal file
|
After Width: | Height: | Size: 21 KiB |