mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-17 07:23:21 +01:00
Compare commits
585 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8737995fa | ||
|
|
1bbefea857 | ||
|
|
143630c41b | ||
|
|
577eaa1eae | ||
|
|
316b071c81 | ||
|
|
5a6f55c0a8 | ||
|
|
e008a50acc | ||
|
|
41c3913482 | ||
|
|
803ff76678 | ||
|
|
309081437a | ||
|
|
5f152b73c2 | ||
|
|
f8d3336a1e | ||
|
|
dc1fdffe6a | ||
|
|
622d9c909f | ||
|
|
4e3ef19c1f | ||
|
|
b054a30fa7 | ||
|
|
7266c24354 | ||
|
|
5ec2877bcc | ||
|
|
0d93446c7d | ||
|
|
1e395ab416 | ||
|
|
0acb5ac7cd | ||
|
|
3b18b5d2b7 | ||
|
|
16e63a061d | ||
|
|
a6c8b940c9 | ||
|
|
74d9e3248b | ||
|
|
3af8b6050c | ||
|
|
da966753a1 | ||
|
|
0ad4b3f73e | ||
|
|
e8d072d4be | ||
|
|
b0eed4a095 | ||
|
|
ba720efe61 | ||
|
|
e23d575460 | ||
|
|
7fbcd17759 | ||
|
|
a95ebb2158 | ||
|
|
8a36425cac | ||
|
|
4261ed39dc | ||
|
|
ca37a884fd | ||
|
|
9fbb7683bc | ||
|
|
42e275ef0a | ||
|
|
19ece12e93 | ||
|
|
3ef0d3e4a3 | ||
|
|
602ea46b8b | ||
|
|
95c0bc6052 | ||
|
|
bd4ce1788c | ||
|
|
20d16a8433 | ||
|
|
db4c11cd53 | ||
|
|
f439e1f8e3 | ||
|
|
080b1aab83 | ||
|
|
61ba2ac97a | ||
|
|
7eebb38eda | ||
|
|
43e7d65af5 | ||
|
|
386d8bb312 | ||
|
|
3fbd72092c | ||
|
|
4e5b15cd88 | ||
|
|
8b2aeba3bd | ||
|
|
1d2334b920 | ||
|
|
38a234ae66 | ||
|
|
2c1226dc02 | ||
|
|
1df8ef6464 | ||
|
|
f8d40bf86d | ||
|
|
58ab03b4e3 | ||
|
|
0bf54e6b45 | ||
|
|
8fca0c69ac | ||
|
|
70eb4ca2a1 | ||
|
|
9d9e30725e | ||
|
|
ff9585ec7d | ||
|
|
a418c2750a | ||
|
|
9581994050 | ||
|
|
316d0e67c5 | ||
|
|
503bf04ec5 | ||
|
|
d6b76936dd | ||
|
|
c53d16717b | ||
|
|
2c747daa50 | ||
|
|
0b2d3edcce | ||
|
|
955bcde062 | ||
|
|
a91aa72fb4 | ||
|
|
163ece75b2 | ||
|
|
a8fb5f2598 | ||
|
|
3a62ad67e1 | ||
|
|
48f4e1ddc6 | ||
|
|
c37bb96aab | ||
|
|
a2057e20d2 | ||
|
|
577e05eb51 | ||
|
|
65a30cf2a7 | ||
|
|
121f0c6134 | ||
|
|
7d1897a9d2 | ||
|
|
415dbd1b61 | ||
|
|
cfc1c35203 | ||
|
|
911d7f3be8 | ||
|
|
c06944da13 | ||
|
|
b6dd4a3579 | ||
|
|
b057e145c5 | ||
|
|
772ad3b929 | ||
|
|
46681868d3 | ||
|
|
75795bd7d5 | ||
|
|
1908723fbe | ||
|
|
549992c08a | ||
|
|
845704b9fe | ||
|
|
ba03ca5e0c | ||
|
|
92a9f12b58 | ||
|
|
3437ac63bb | ||
|
|
d798a35c38 | ||
|
|
01b56995d9 | ||
|
|
3f190efb4e | ||
|
|
bb6b149c2e | ||
|
|
65b96fff16 | ||
|
|
0b8e8a7b2f | ||
|
|
a8a6fec19d | ||
|
|
a3fce4c149 | ||
|
|
85265412da | ||
|
|
e636a94de0 | ||
|
|
08509f6693 | ||
|
|
d28fc98cfd | ||
|
|
f584ef1d72 | ||
|
|
67a6df57c8 | ||
|
|
fadbb0adc5 | ||
|
|
58774033b7 | ||
|
|
66f0470960 | ||
|
|
68137cb66f | ||
|
|
4d6cacdb3d | ||
|
|
cf862af3ca | ||
|
|
a8d106a292 | ||
|
|
6155140de4 | ||
|
|
a4637248e8 | ||
|
|
8c4470a27e | ||
|
|
071fbfd916 | ||
|
|
1968438ebb | ||
|
|
7b31383b88 | ||
|
|
093a79045d | ||
|
|
e4928b0084 | ||
|
|
03420cf501 | ||
|
|
541b4674a8 | ||
|
|
6e108a03d1 | ||
|
|
c9dd332abd | ||
|
|
7e605fb6de | ||
|
|
fa2b0aedb0 | ||
|
|
402f49edd9 | ||
|
|
caf2e555dd | ||
|
|
32dc36d937 | ||
|
|
771d49bfa8 | ||
|
|
70dc78601a | ||
|
|
b4d781ddbb | ||
|
|
9c29601b55 | ||
|
|
28c37cb3ac | ||
|
|
bd121e47c8 | ||
|
|
7428e1e2ea | ||
|
|
376cb926b0 | ||
|
|
4ed0056d2a | ||
|
|
177ef8a555 | ||
|
|
7244a1f52f | ||
|
|
8d311923c1 | ||
|
|
9359d56880 | ||
|
|
3214200188 | ||
|
|
841ab7f983 | ||
|
|
53b3728432 | ||
|
|
cf9f98efc9 | ||
|
|
b5c666a1f4 | ||
|
|
b1954a509c | ||
|
|
c2c91cfe42 | ||
|
|
cccbec5744 | ||
|
|
4c89b20fad | ||
|
|
2328fa3e88 | ||
|
|
e19d4624c1 | ||
|
|
345f58ed48 | ||
|
|
4c14ce3937 | ||
|
|
82684c0169 | ||
|
|
2607328255 | ||
|
|
484ce3a1da | ||
|
|
85d5f62301 | ||
|
|
b0571f8184 | ||
|
|
b80dd28b40 | ||
|
|
e0cf0808cf | ||
|
|
ffdd5b62ae | ||
|
|
3b5376ef8b | ||
|
|
cd57fb0d76 | ||
|
|
6986acd6f4 | ||
|
|
2bc571ffd3 | ||
|
|
a8dddf33f8 | ||
|
|
46582a685b | ||
|
|
ad381783f7 | ||
|
|
b81c1eb65c | ||
|
|
2c4d3b3ee4 | ||
|
|
d1400928ce | ||
|
|
49abece92b | ||
|
|
b48b1f031e | ||
|
|
9cefe0bc04 | ||
|
|
ee73b0e229 | ||
|
|
ab0ce58812 | ||
|
|
333a206d36 | ||
|
|
86bb7666ea | ||
|
|
58b5ebf39d | ||
|
|
47947b85c7 | ||
|
|
6910ba6d2e | ||
|
|
08254edae6 | ||
|
|
e67307a961 | ||
|
|
9922621945 | ||
|
|
c7476a2a07 | ||
|
|
ac59528f5c | ||
|
|
97c9728c65 | ||
|
|
80d1694e6e | ||
|
|
28c6e31c7d | ||
|
|
8836b2a570 | ||
|
|
786c2b888b | ||
|
|
c91275c5da | ||
|
|
7b362460e7 | ||
|
|
a1862c3420 | ||
|
|
44ea9ccc59 | ||
|
|
4c9cdf3b8f | ||
|
|
4a6d4f197d | ||
|
|
ae04749336 | ||
|
|
caa743aba2 | ||
|
|
a4469a4285 | ||
|
|
2771b31aab | ||
|
|
5c418a4260 | ||
|
|
17dbdf3b74 | ||
|
|
8315ae47c4 | ||
|
|
50b59805ca | ||
|
|
58bc387d0b | ||
|
|
d2dd6790a0 | ||
|
|
78c7795b89 | ||
|
|
73c25f3476 | ||
|
|
6f9f89734d | ||
|
|
da68bee742 | ||
|
|
e5f1f9394d | ||
|
|
d9d6f8c97e | ||
|
|
a35a141411 | ||
|
|
1e0c7b1120 | ||
|
|
9b9734f82a | ||
|
|
fe437b5234 | ||
|
|
59bb505a3e | ||
|
|
28d8d62cbd | ||
|
|
cb05608422 | ||
|
|
e384a37fab | ||
|
|
9a04cd9e3b | ||
|
|
dd396eb75a | ||
|
|
611b52780e | ||
|
|
20a05220ea | ||
|
|
38e8f24c20 | ||
|
|
58d2c92102 | ||
|
|
f90ba45940 | ||
|
|
1ecf42bfd3 | ||
|
|
ed56c21e5b | ||
|
|
a0c55baf39 | ||
|
|
3b3ef0d545 | ||
|
|
78e7f99344 | ||
|
|
d709d67f54 | ||
|
|
6d30fd11a7 | ||
|
|
4a39c7950f | ||
|
|
3dd5ad2a8a | ||
|
|
d7b7727aa6 | ||
|
|
0199cd24ef | ||
|
|
8513e8c4f9 | ||
|
|
5d2d9017f1 | ||
|
|
879e8f98bd | ||
|
|
2c6524f6c0 | ||
|
|
c9bd81d332 | ||
|
|
2d29b02cea | ||
|
|
c0a279fcc5 | ||
|
|
1a612fab0b | ||
|
|
63e821634a | ||
|
|
62d951b438 | ||
|
|
8d749c404f | ||
|
|
d5b2f4fdd3 | ||
|
|
fae4ca91bd | ||
|
|
6e92ff5096 | ||
|
|
61522cd682 | ||
|
|
74dbd0814a | ||
|
|
05751a5b79 | ||
|
|
7741844055 | ||
|
|
09c07f0707 | ||
|
|
c565db812e | ||
|
|
00b72c9263 | ||
|
|
5c415139fd | ||
|
|
6d944c0f8c | ||
|
|
6744a79325 | ||
|
|
472d86acc0 | ||
|
|
c1ee7a53b5 | ||
|
|
8d44640377 | ||
|
|
cbcbe3f564 | ||
|
|
698923423f | ||
|
|
bc6114f6e0 | ||
|
|
21d91bb2cf | ||
|
|
bda9664cb9 | ||
|
|
9c055a35a9 | ||
|
|
bf794c41da | ||
|
|
de698c8a1a | ||
|
|
f972382f5e | ||
|
|
73b0331884 | ||
|
|
2248abb749 | ||
|
|
13435c0b54 | ||
|
|
5575f75118 | ||
|
|
4ce3c2309c | ||
|
|
cd7ee1a042 | ||
|
|
cd087113e3 | ||
|
|
36b6122b0f | ||
|
|
a74651d915 | ||
|
|
c274805eb0 | ||
|
|
d86d88f313 | ||
|
|
265e875a78 | ||
|
|
8353ad4962 | ||
|
|
9369cafd38 | ||
|
|
989cda6662 | ||
|
|
0570aaeb6e | ||
|
|
5a19117850 | ||
|
|
ff726ec4d2 | ||
|
|
0cd93986bd | ||
|
|
bc7ba5f2c6 | ||
|
|
1ddde6ab92 | ||
|
|
e9f2580bb8 | ||
|
|
b9dc2d3969 | ||
|
|
7e27203bd8 | ||
|
|
5a582c12d8 | ||
|
|
cd925d5f53 | ||
|
|
853a37920c | ||
|
|
2aa0b3700f | ||
|
|
35190ebb63 | ||
|
|
d74350b708 | ||
|
|
bd3e4f9f87 | ||
|
|
7370756344 | ||
|
|
7894377d1d | ||
|
|
6416df241f | ||
|
|
85408f2b12 | ||
|
|
b698daa4cf | ||
|
|
3a035a1b33 | ||
|
|
a11888ff71 | ||
|
|
423b8c942c | ||
|
|
26739491a5 | ||
|
|
6bf39c5102 | ||
|
|
daac3bd143 | ||
|
|
028242826e | ||
|
|
99d9c670b6 | ||
|
|
bc592cc4e2 | ||
|
|
04707b00e7 | ||
|
|
d44abfaeac | ||
|
|
6c30f3d573 | ||
|
|
2e70ed14dd | ||
|
|
7823d4f49f | ||
|
|
7bd3482367 | ||
|
|
709adf05aa | ||
|
|
524736c5b2 | ||
|
|
f53ae66fc9 | ||
|
|
0c102b061c | ||
|
|
ee198e47c8 | ||
|
|
75c2931c8d | ||
|
|
2bb4edecd7 | ||
|
|
b79d9af7ae | ||
|
|
5c50372021 | ||
|
|
d0d32c8f33 | ||
|
|
2aaaa1791e | ||
|
|
6ed63a67cd | ||
|
|
b858955243 | ||
|
|
63a676b0ef | ||
|
|
155b59d71f | ||
|
|
d9dba89781 | ||
|
|
0a572153f0 | ||
|
|
ce46c44b5d | ||
|
|
e6918b592e | ||
|
|
ddbbb4c21a | ||
|
|
d23290107b | ||
|
|
69f4c89f84 | ||
|
|
279f9578cc | ||
|
|
af7989839f | ||
|
|
01fb0c0eb6 | ||
|
|
dab47828c6 | ||
|
|
c070743723 | ||
|
|
9bbd9b56e7 | ||
|
|
311793ac33 | ||
|
|
986923ea6c | ||
|
|
2f6baf8743 | ||
|
|
4c43bf2228 | ||
|
|
585bd5f24c | ||
|
|
d420c0332b | ||
|
|
e32df5d247 | ||
|
|
19a8ec02cb | ||
|
|
798d4b90c3 | ||
|
|
206f1f3775 | ||
|
|
96273bb724 | ||
|
|
c0d9efc930 | ||
|
|
6722d9d15d | ||
|
|
52c2c58988 | ||
|
|
e3efc53b64 | ||
|
|
9a18f5ef6b | ||
|
|
ce8d545d6f | ||
|
|
f875a0c882 | ||
|
|
4bbddf736c | ||
|
|
c1da17df48 | ||
|
|
f6fa8166d2 | ||
|
|
20016adef1 | ||
|
|
265bb29626 | ||
|
|
d16be8c4d7 | ||
|
|
791a38a181 | ||
|
|
d1010eb886 | ||
|
|
471b214b4a | ||
|
|
f505d48d80 | ||
|
|
6d9a2d4787 | ||
|
|
a36e2408f7 | ||
|
|
9012a2afc0 | ||
|
|
4921198cd8 | ||
|
|
530b57644f | ||
|
|
921415632b | ||
|
|
c723b2c6bf | ||
|
|
17d338f7af | ||
|
|
3d9e12e4c1 | ||
|
|
4ca849c151 | ||
|
|
3e6145aed0 | ||
|
|
c960f29e38 | ||
|
|
c230eb179b | ||
|
|
05e77b1d33 | ||
|
|
a2bdea5df2 | ||
|
|
b2b2860a48 | ||
|
|
f71c1d0c5d | ||
|
|
43607edc1c | ||
|
|
08beb7ff43 | ||
|
|
b24c4e3302 | ||
|
|
06a6f0ea0b | ||
|
|
bd38c4f5d2 | ||
|
|
2e4665e5c4 | ||
|
|
1b250300c7 | ||
|
|
7f3966ff07 | ||
|
|
1f7e9df7ff | ||
|
|
fd32ec9598 | ||
|
|
ed12a7691d | ||
|
|
5759609a11 | ||
|
|
6a423cb18b | ||
|
|
c727f93534 | ||
|
|
623d2f2659 | ||
|
|
4dede65e32 | ||
|
|
1c5f4da20f | ||
|
|
33d9840a78 | ||
|
|
3e89e07ad3 | ||
|
|
99c3e043e7 | ||
|
|
3858024116 | ||
|
|
b06f0bba61 | ||
|
|
73ea50d162 | ||
|
|
98580e6a6b | ||
|
|
2f0a63774f | ||
|
|
3d8f364d59 | ||
|
|
2d93b31469 | ||
|
|
e27abcb047 | ||
|
|
29b4b32692 | ||
|
|
bdd6bcb932 | ||
|
|
062fb1fe0b | ||
|
|
4a0631a10c | ||
|
|
a0fdc735e7 | ||
|
|
fa842ac281 | ||
|
|
f8d17b04cb | ||
|
|
0ac9f5d7c0 | ||
|
|
1ad7aa901a | ||
|
|
b0aa440b9d | ||
|
|
dc6deee231 | ||
|
|
1cf52cae71 | ||
|
|
c730a09123 | ||
|
|
01fc7fa179 | ||
|
|
d2c6698824 | ||
|
|
e014779b32 | ||
|
|
fe400894b1 | ||
|
|
051e98898d | ||
|
|
9cf77d320c | ||
|
|
7c11239875 | ||
|
|
3e5af23f43 | ||
|
|
a349fdd79e | ||
|
|
af32996728 | ||
|
|
5fa5a98b87 | ||
|
|
a7f239576f | ||
|
|
c2ec9e579e | ||
|
|
b56e2222f5 | ||
|
|
fc94a9d748 | ||
|
|
4b41989b30 | ||
|
|
e3b569ca5b | ||
|
|
6459ef5b66 | ||
|
|
b085989b22 | ||
|
|
888e7f8ed5 | ||
|
|
d50a9c61b0 | ||
|
|
4fdc2bd76b | ||
|
|
3f990327d8 | ||
|
|
8ccd2864fe | ||
|
|
e7bfefa027 | ||
|
|
1da75018eb | ||
|
|
88be84297e | ||
|
|
e1467480e9 | ||
|
|
92c71b3630 | ||
|
|
24c994d5b2 | ||
|
|
f7d87f3436 | ||
|
|
fd635542c0 | ||
|
|
eb826b2786 | ||
|
|
8cd0381df5 | ||
|
|
305c32cfc5 | ||
|
|
bb21363ca8 | ||
|
|
6968edbeec | ||
|
|
a6acbacaef | ||
|
|
870ae8a46f | ||
|
|
a3c9f04719 | ||
|
|
fdcd24feb1 | ||
|
|
c31b2edeab | ||
|
|
ffecdb3747 | ||
|
|
3031d68863 | ||
|
|
fe1755f250 | ||
|
|
e162eb27c7 | ||
|
|
f4863efb2e | ||
|
|
5b3c51013b | ||
|
|
06bdc36136 | ||
|
|
6e4edbd12d | ||
|
|
c38fafe9fd | ||
|
|
6f213158ed | ||
|
|
3db8f5a2af | ||
|
|
0b5fa18504 | ||
|
|
7ea1080801 | ||
|
|
4c47f337ea | ||
|
|
952990c8af | ||
|
|
f2582cae54 | ||
|
|
e089be310b | ||
|
|
ed5c51d954 | ||
|
|
08915befa5 | ||
|
|
062e958db5 | ||
|
|
9be82a2739 | ||
|
|
0ea3d524da | ||
|
|
437979373c | ||
|
|
22ed8872e6 | ||
|
|
39fe5b1eb5 | ||
|
|
717794a12e | ||
|
|
4ce51c77a8 | ||
|
|
d9ecab5240 | ||
|
|
71b15d269e | ||
|
|
a1009da324 | ||
|
|
26b8de2282 | ||
|
|
9db33c3fec | ||
|
|
2538e48d0f | ||
|
|
68bf41b36a | ||
|
|
3a91bb8947 | ||
|
|
ee930f59db | ||
|
|
6b5feadf6c | ||
|
|
bd084e606c | ||
|
|
bb674a1539 | ||
|
|
951d073ad6 | ||
|
|
b7d671dcbd | ||
|
|
eb4540600e | ||
|
|
22fc874b99 | ||
|
|
282a707bf9 | ||
|
|
942c155723 | ||
|
|
286ae25ac5 | ||
|
|
38ad0903ff | ||
|
|
d76eb9a9e4 | ||
|
|
a3e8ca8d33 | ||
|
|
e1454cfc6a | ||
|
|
df6d446e83 | ||
|
|
2d17082a76 | ||
|
|
9aa4797792 | ||
|
|
3508269c17 | ||
|
|
c18e6e5e67 | ||
|
|
ce86b511f0 | ||
|
|
b65079ec20 | ||
|
|
b99fec4274 | ||
|
|
15677c663b | ||
|
|
1bd5b03636 | ||
|
|
3542c363d9 | ||
|
|
ec44b9aae7 | ||
|
|
e4ec538f13 | ||
|
|
3e54cc5c77 | ||
|
|
b1feb76535 | ||
|
|
a4b7804c9b | ||
|
|
18b2587936 | ||
|
|
1238151d73 | ||
|
|
c25f6d0bc4 | ||
|
|
2ca4748e00 | ||
|
|
1c30a8f38e | ||
|
|
cd29a1715e | ||
|
|
c9d0a11e85 | ||
|
|
4d8ed34d94 | ||
|
|
d98f51395f | ||
|
|
657a7d2a6b | ||
|
|
d6ade56233 | ||
|
|
d88a862e09 | ||
|
|
9c06b07262 | ||
|
|
c5aedc7d85 | ||
|
|
b9c91d195d | ||
|
|
d4d32c2d36 | ||
|
|
b6538101df | ||
|
|
7e4602863f | ||
|
|
0cc35fe881 | ||
|
|
0620410072 | ||
|
|
ea758edb5e | ||
|
|
1ded375f6f | ||
|
|
c67267b589 | ||
|
|
b1eba86445 | ||
|
|
53accdb446 |
19
.github/workflows/docker.yml
vendored
19
.github/workflows/docker.yml
vendored
@@ -1,21 +1,20 @@
|
|||||||
name: Reproducible Build Check
|
name: Check reproducible-build Dockerfile
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 5 * * *'
|
- cron: "0 5 * * *"
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read # to fetch code (actions/checkout)
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v6
|
||||||
- name: Build image
|
- name: Build image
|
||||||
run: cd reproducible-builds && docker build -t signal-android . && cd ..
|
run: |
|
||||||
|
cd reproducible-builds
|
||||||
- name: Test build
|
docker build -t signal-android .
|
||||||
run: docker run --rm -v $(pwd):/project -w /project signal-android ./gradlew clean assemblePlayProdRelease
|
- name: Test build
|
||||||
|
run: docker run --memory=12g --rm -v "$(pwd)":/project -w /project signal-android ./gradlew --no-daemon --max-workers=1 -Dorg.gradle.jvmargs="-Xmx4g -XX:MaxMetaspaceSize=512m" -Dkotlin.compiler.execution.strategy=in-process bundlePlayProdRelease
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -33,3 +33,4 @@ maps.key
|
|||||||
kls_database.db
|
kls_database.db
|
||||||
.kotlin
|
.kotlin
|
||||||
lefthook-local.yml
|
lefthook-local.yml
|
||||||
|
sample-videos/
|
||||||
|
|||||||
@@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
import com.android.build.api.dsl.ManagedVirtualDevice
|
import com.android.build.api.dsl.ManagedVirtualDevice
|
||||||
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
|
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
|
||||||
import java.io.FileInputStream
|
import java.time.Instant
|
||||||
import java.text.SimpleDateFormat
|
import java.time.ZoneOffset
|
||||||
import java.util.Date
|
import java.time.format.DateTimeFormatter
|
||||||
|
import java.util.Locale
|
||||||
import java.util.Properties
|
import java.util.Properties
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
@@ -13,6 +14,7 @@ plugins {
|
|||||||
alias(libs.plugins.ktlint)
|
alias(libs.plugins.ktlint)
|
||||||
alias(libs.plugins.compose.compiler)
|
alias(libs.plugins.compose.compiler)
|
||||||
alias(libs.plugins.kotlinx.serialization)
|
alias(libs.plugins.kotlinx.serialization)
|
||||||
|
alias(benchmarkLibs.plugins.baselineprofile)
|
||||||
id("androidx.navigation.safeargs")
|
id("androidx.navigation.safeargs")
|
||||||
id("kotlin-parcelize")
|
id("kotlin-parcelize")
|
||||||
id("com.squareup.wire")
|
id("com.squareup.wire")
|
||||||
@@ -22,16 +24,35 @@ plugins {
|
|||||||
|
|
||||||
apply(from = "static-ips.gradle.kts")
|
apply(from = "static-ips.gradle.kts")
|
||||||
|
|
||||||
val canonicalVersionCode = 1629
|
val canonicalVersionCode = 1663
|
||||||
val canonicalVersionName = "7.68.1"
|
val canonicalVersionName = "8.2.2"
|
||||||
val currentHotfixVersion = 0
|
val currentHotfixVersion = 0
|
||||||
val maxHotfixVersions = 100
|
val maxHotfixVersions = 100
|
||||||
|
|
||||||
val keystores: Map<String, Properties?> = mapOf("debug" to loadKeystoreProperties("keystore.debug.properties"))
|
// We don't want versions to ever end in 0 so that they don't conflict with nightly versions
|
||||||
|
val possibleHotfixVersions = (0 until maxHotfixVersions).toList().filter { it % 10 != 0 }
|
||||||
|
|
||||||
|
val debugKeystorePropertiesProvider = providers.of(PropertiesFileValueSource::class.java) {
|
||||||
|
parameters.file.set(rootProject.layout.projectDirectory.file("keystore.debug.properties"))
|
||||||
|
}
|
||||||
|
|
||||||
|
val languagesProvider = providers.of(LanguageListValueSource::class.java) {
|
||||||
|
parameters.resDir.set(layout.projectDirectory.dir("src/main/res"))
|
||||||
|
}
|
||||||
|
|
||||||
|
val languagesForBuildConfigProvider = languagesProvider.map { languages ->
|
||||||
|
languages.joinToString(separator = ", ") { language -> "\"$language\"" }
|
||||||
|
}
|
||||||
|
|
||||||
|
val localPropertiesFile = File(rootProject.projectDir, "local.properties")
|
||||||
|
val localProperties: Properties? = if (localPropertiesFile.exists()) {
|
||||||
|
Properties().apply { localPropertiesFile.inputStream().use { load(it) } }
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
val quickstartCredentialsDir: String? = localProperties?.getProperty("quickstart.credentials.dir")
|
||||||
|
|
||||||
val selectableVariants = listOf(
|
val selectableVariants = listOf(
|
||||||
"nightlyBackupRelease",
|
|
||||||
"nightlyBackupSpinner",
|
|
||||||
"nightlyProdSpinner",
|
"nightlyProdSpinner",
|
||||||
"nightlyProdPerf",
|
"nightlyProdPerf",
|
||||||
"nightlyProdRelease",
|
"nightlyProdRelease",
|
||||||
@@ -40,6 +61,8 @@ val selectableVariants = listOf(
|
|||||||
"playProdSpinner",
|
"playProdSpinner",
|
||||||
"playProdCanary",
|
"playProdCanary",
|
||||||
"playProdPerf",
|
"playProdPerf",
|
||||||
|
"playProdMocked",
|
||||||
|
"playProdNonMinifiedMocked",
|
||||||
"playProdBenchmark",
|
"playProdBenchmark",
|
||||||
"playProdInstrumentation",
|
"playProdInstrumentation",
|
||||||
"playProdRelease",
|
"playProdRelease",
|
||||||
@@ -49,18 +72,14 @@ val selectableVariants = listOf(
|
|||||||
"playStagingPerf",
|
"playStagingPerf",
|
||||||
"playStagingInstrumentation",
|
"playStagingInstrumentation",
|
||||||
"playStagingRelease",
|
"playStagingRelease",
|
||||||
|
"playProdQuickstart",
|
||||||
|
"playStagingQuickstart",
|
||||||
"websiteProdSpinner",
|
"websiteProdSpinner",
|
||||||
"websiteProdRelease"
|
"websiteProdRelease",
|
||||||
|
"githubProdSpinner",
|
||||||
|
"githubProdRelease"
|
||||||
)
|
)
|
||||||
|
|
||||||
val signalBuildToolsVersion: String by rootProject.extra
|
|
||||||
val signalCompileSdkVersion: String by rootProject.extra
|
|
||||||
val signalTargetSdkVersion: Int by rootProject.extra
|
|
||||||
val signalMinSdkVersion: Int by rootProject.extra
|
|
||||||
val signalNdkVersion: String by rootProject.extra
|
|
||||||
val signalJavaVersion: JavaVersion by rootProject.extra
|
|
||||||
val signalKotlinJvmTarget: String by rootProject.extra
|
|
||||||
|
|
||||||
wire {
|
wire {
|
||||||
kotlin {
|
kotlin {
|
||||||
javaInterop = true
|
javaInterop = true
|
||||||
@@ -71,7 +90,7 @@ wire {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protoPath {
|
protoPath {
|
||||||
srcDir("${project.rootDir}/libsignal-service/src/main/protowire")
|
srcDir("${project.rootDir}/lib/libsignal-service/src/main/protowire")
|
||||||
}
|
}
|
||||||
// Handled by libsignal
|
// Handled by libsignal
|
||||||
prune("signalservice.DecryptionErrorMessage")
|
prune("signalservice.DecryptionErrorMessage")
|
||||||
@@ -84,9 +103,9 @@ ktlint {
|
|||||||
android {
|
android {
|
||||||
namespace = "org.thoughtcrime.securesms"
|
namespace = "org.thoughtcrime.securesms"
|
||||||
|
|
||||||
buildToolsVersion = signalBuildToolsVersion
|
buildToolsVersion = libs.versions.buildTools.get()
|
||||||
compileSdkVersion = signalCompileSdkVersion
|
compileSdkVersion = libs.versions.compileSdk.get()
|
||||||
ndkVersion = signalNdkVersion
|
ndkVersion = libs.versions.ndk.get()
|
||||||
|
|
||||||
flavorDimensions += listOf("distribution", "environment")
|
flavorDimensions += listOf("distribution", "environment")
|
||||||
testBuildType = "instrumentation"
|
testBuildType = "instrumentation"
|
||||||
@@ -94,12 +113,12 @@ android {
|
|||||||
android.bundle.language.enableSplit = false
|
android.bundle.language.enableSplit = false
|
||||||
|
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = signalKotlinJvmTarget
|
jvmTarget = libs.versions.kotlinJvmTarget.get()
|
||||||
freeCompilerArgs = listOf("-Xjvm-default=all")
|
freeCompilerArgs = listOf("-Xjvm-default=all")
|
||||||
suppressWarnings = true
|
suppressWarnings = true
|
||||||
}
|
}
|
||||||
|
|
||||||
keystores["debug"]?.let { properties ->
|
debugKeystorePropertiesProvider.orNull?.let { properties ->
|
||||||
signingConfigs.getByName("debug").apply {
|
signingConfigs.getByName("debug").apply {
|
||||||
storeFile = file("${project.rootDir}/${properties.getProperty("storeFile")}")
|
storeFile = file("${project.rootDir}/${properties.getProperty("storeFile")}")
|
||||||
storePassword = properties.getProperty("storePassword")
|
storePassword = properties.getProperty("storePassword")
|
||||||
@@ -139,8 +158,8 @@ android {
|
|||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
isCoreLibraryDesugaringEnabled = true
|
isCoreLibraryDesugaringEnabled = true
|
||||||
sourceCompatibility = signalJavaVersion
|
sourceCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get())
|
||||||
targetCompatibility = signalJavaVersion
|
targetCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get())
|
||||||
}
|
}
|
||||||
|
|
||||||
packaging {
|
packaging {
|
||||||
@@ -162,7 +181,8 @@ android {
|
|||||||
"META-INF/LICENSE-notice.md",
|
"META-INF/LICENSE-notice.md",
|
||||||
"META-INF/proguard/androidx-annotations.pro",
|
"META-INF/proguard/androidx-annotations.pro",
|
||||||
"**/*.dylib",
|
"**/*.dylib",
|
||||||
"**/*.dll"
|
"**/*.dll",
|
||||||
|
"**/*.proto"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -178,11 +198,14 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
versionCode = (canonicalVersionCode * maxHotfixVersions) + currentHotfixVersion
|
if (currentHotfixVersion >= maxHotfixVersions) {
|
||||||
|
throw AssertionError("Hotfix version offset is too large!")
|
||||||
|
}
|
||||||
|
versionCode = (canonicalVersionCode * maxHotfixVersions) + possibleHotfixVersions[currentHotfixVersion]
|
||||||
versionName = canonicalVersionName
|
versionName = canonicalVersionName
|
||||||
|
|
||||||
minSdk = signalMinSdkVersion
|
minSdk = libs.versions.minSdk.get().toInt()
|
||||||
targetSdk = signalTargetSdkVersion
|
targetSdk = libs.versions.targetSdk.get().toInt()
|
||||||
|
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
project.ext.set("archivesBaseName", "Signal")
|
project.ext.set("archivesBaseName", "Signal")
|
||||||
@@ -215,13 +238,13 @@ android {
|
|||||||
buildConfigField("String[]", "SIGNAL_CDSI_IPS", rootProject.extra["cdsi_ips"] as String)
|
buildConfigField("String[]", "SIGNAL_CDSI_IPS", rootProject.extra["cdsi_ips"] as String)
|
||||||
buildConfigField("String[]", "SIGNAL_SVR2_IPS", rootProject.extra["svr2_ips"] as String)
|
buildConfigField("String[]", "SIGNAL_SVR2_IPS", rootProject.extra["svr2_ips"] as String)
|
||||||
buildConfigField("String", "SIGNAL_AGENT", "\"OWA\"")
|
buildConfigField("String", "SIGNAL_AGENT", "\"OWA\"")
|
||||||
buildConfigField("String", "SVR2_MRENCLAVE_LEGACY", "\"093be9ea32405e85ae28dbb48eb668aebeb7dbe29517b9b86ad4bec4dfe0e6a6\"")
|
buildConfigField("String", "SVR2_MRENCLAVE_LEGACY", "\"29cd63c87bea751e3bfd0fbd401279192e2e5c99948b4ee9437eafc4968355fb\"")
|
||||||
buildConfigField("String", "SVR2_MRENCLAVE", "\"29cd63c87bea751e3bfd0fbd401279192e2e5c99948b4ee9437eafc4968355fb\"")
|
buildConfigField("String", "SVR2_MRENCLAVE", "\"1240acbd4aa26974184844c8a46b1022d3957ac8a76c1fd8f5b1a15141ee0708\"")
|
||||||
buildConfigField("String[]", "UNIDENTIFIED_SENDER_TRUST_ROOTS", "new String[]{ \"BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF\", \"BUkY0I+9+oPgDCn4+Ac6Iu813yvqkDr/ga8DzLxFxuk6\"}")
|
buildConfigField("String[]", "UNIDENTIFIED_SENDER_TRUST_ROOTS", "new String[]{ \"BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF\", \"BUkY0I+9+oPgDCn4+Ac6Iu813yvqkDr/ga8DzLxFxuk6\"}")
|
||||||
buildConfigField("String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X36nOoGPs54XsEGzPdEV+itQNGUFEjY6X9Uv+Acuks7NpyGvCoKxGwgKgE5XyJ+nNKlyHHOLb6N1NuHyBrZrgtY/JYJHRooo5CEqYKBqdFnmbTVGEkCvJKxLnjwKWf+fEPoWeQFj5ObDjcKMZf2Jm2Ae69x+ikU5gBXsRmoF94GXTLfN0/vLt98KDPnxwAQL9j5V1jGOY8jQl6MLxEs56cwXN0dqCnImzVH3TZT1cJ8SW1BRX6qIVxEzjsSGx3yxF3suAilPMqGRp4ffyopjMD1JXiKR2RwLKzizUe5e8XyGOy9fplzhw3jVzTRyUZTRSZKkMLWcQ/gv0E4aONNqs4P+NameAZYOD12qRkxosQQP5uux6B2nRyZ7sAV54DgFyLiRcq1FvwKw2EPQdk4HDoePrO/RNUbyNddnM/mMgj4FW65xCoT1LmjrIjsv/Ggdlx46ueczhMgtBunx1/w8k8V+l8LVZ8gAT6wkU5J+DPQalQguMg12Jzug3q4TbdHiGCmD9EunCwOmsLuLJkz6EcSYXtrlDEnAM+hicw7iergYLLlMXpfTdGxJCWJmP4zqUFeTTmsmhsjGBt7NiEB/9pFFEB3pSbf4iiUukw63Eo8Aqnf4iwob6X1QviCWuc8t0LUlT9vALgh/f2DPVOOmR0RW6bgRvc7DSF20V/omg+YBw==\"")
|
buildConfigField("String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X36nOoGPs54XsEGzPdEV+itQNGUFEjY6X9Uv+Acuks7NpyGvCoKxGwgKgE5XyJ+nNKlyHHOLb6N1NuHyBrZrgtY/JYJHRooo5CEqYKBqdFnmbTVGEkCvJKxLnjwKWf+fEPoWeQFj5ObDjcKMZf2Jm2Ae69x+ikU5gBXsRmoF94GXTLfN0/vLt98KDPnxwAQL9j5V1jGOY8jQl6MLxEs56cwXN0dqCnImzVH3TZT1cJ8SW1BRX6qIVxEzjsSGx3yxF3suAilPMqGRp4ffyopjMD1JXiKR2RwLKzizUe5e8XyGOy9fplzhw3jVzTRyUZTRSZKkMLWcQ/gv0E4aONNqs4P+NameAZYOD12qRkxosQQP5uux6B2nRyZ7sAV54DgFyLiRcq1FvwKw2EPQdk4HDoePrO/RNUbyNddnM/mMgj4FW65xCoT1LmjrIjsv/Ggdlx46ueczhMgtBunx1/w8k8V+l8LVZ8gAT6wkU5J+DPQalQguMg12Jzug3q4TbdHiGCmD9EunCwOmsLuLJkz6EcSYXtrlDEnAM+hicw7iergYLLlMXpfTdGxJCWJmP4zqUFeTTmsmhsjGBt7NiEB/9pFFEB3pSbf4iiUukw63Eo8Aqnf4iwob6X1QviCWuc8t0LUlT9vALgh/f2DPVOOmR0RW6bgRvc7DSF20V/omg+YBw==\"")
|
||||||
buildConfigField("String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AByD873dTilmOSG0TjKrvpeaKEsUmIO8Vx9BeMmftwUs9v7ikPwM8P3OHyT0+X3EUMZrSe9VUp26Wai51Q9I8mdk0hX/yo7CeFGJyzoOqn8e/i4Ygbn5HoAyXJx5eXfIbqpc0bIxzju4H/HOQeOpt6h742qii5u/cbwOhFZCsMIbElZTaeU+BWMBQiZHIGHT5IE0qCordQKZ5iPZom0HeFa8Yq0ShuEyAl0WINBiY6xE3H/9WnvzXBbMuuk//eRxXgzO8ieCeK8FwQNxbfXqZm6Ro1cMhCOF3u7xoX83QhpN\"")
|
buildConfigField("String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AByD873dTilmOSG0TjKrvpeaKEsUmIO8Vx9BeMmftwUs9v7ikPwM8P3OHyT0+X3EUMZrSe9VUp26Wai51Q9I8mdk0hX/yo7CeFGJyzoOqn8e/i4Ygbn5HoAyXJx5eXfIbqpc0bIxzju4H/HOQeOpt6h742qii5u/cbwOhFZCsMIbElZTaeU+BWMBQiZHIGHT5IE0qCordQKZ5iPZom0HeFa8Yq0ShuEyAl0WINBiY6xE3H/9WnvzXBbMuuk//eRxXgzO8ieCeK8FwQNxbfXqZm6Ro1cMhCOF3u7xoX83QhpN\"")
|
||||||
buildConfigField("String", "BACKUP_SERVER_PUBLIC_PARAMS", "\"AJwNSU55fsFCbgaxGRD11wO1juAs8Yr5GF8FPlGzzvdJJIKH5/4CC7ZJSOe3yL2vturVaRU2Cx0n751Vt8wkj1bozK3CBV1UokxV09GWf+hdVImLGjXGYLLhnI1J2TWEe7iWHyb553EEnRb5oxr9n3lUbNAJuRmFM7hrr0Al0F0wrDD4S8lo2mGaXe0MJCOM166F8oYRQqpFeEHfiLnxA1O8ZLh7vMdv4g9jI5phpRBTsJ5IjiJrWeP0zdIGHEssUeprDZ9OUJ14m0v61eYJMKsf59Bn+mAT2a7YfB+Don9O\"")
|
buildConfigField("String", "BACKUP_SERVER_PUBLIC_PARAMS", "\"AJwNSU55fsFCbgaxGRD11wO1juAs8Yr5GF8FPlGzzvdJJIKH5/4CC7ZJSOe3yL2vturVaRU2Cx0n751Vt8wkj1bozK3CBV1UokxV09GWf+hdVImLGjXGYLLhnI1J2TWEe7iWHyb553EEnRb5oxr9n3lUbNAJuRmFM7hrr0Al0F0wrDD4S8lo2mGaXe0MJCOM166F8oYRQqpFeEHfiLnxA1O8ZLh7vMdv4g9jI5phpRBTsJ5IjiJrWeP0zdIGHEssUeprDZ9OUJ14m0v61eYJMKsf59Bn+mAT2a7YfB+Don9O\"")
|
||||||
buildConfigField("String[]", "LANGUAGES", "new String[]{ ${languageList().map { "\"$it\"" }.joinToString(separator = ", ")} }")
|
buildConfigField("String[]", "LANGUAGES", "new String[]{ ${languagesForBuildConfigProvider.get()} }")
|
||||||
buildConfigField("int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode")
|
buildConfigField("int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode")
|
||||||
buildConfigField("String", "DEFAULT_CURRENCIES", "\"EUR,AUD,GBP,CAD,CNY\"")
|
buildConfigField("String", "DEFAULT_CURRENCIES", "\"EUR,AUD,GBP,CAD,CNY\"")
|
||||||
buildConfigField("String", "GIPHY_API_KEY", "\"3o6ZsYH6U6Eri53TXy\"")
|
buildConfigField("String", "GIPHY_API_KEY", "\"3o6ZsYH6U6Eri53TXy\"")
|
||||||
@@ -238,7 +261,7 @@ android {
|
|||||||
buildConfigField("String", "STRIPE_PUBLISHABLE_KEY", "\"pk_live_6cmGZopuTsV8novGgJJW9JpC00vLIgtQ1D\"")
|
buildConfigField("String", "STRIPE_PUBLISHABLE_KEY", "\"pk_live_6cmGZopuTsV8novGgJJW9JpC00vLIgtQ1D\"")
|
||||||
buildConfigField("boolean", "TRACING_ENABLED", "false")
|
buildConfigField("boolean", "TRACING_ENABLED", "false")
|
||||||
buildConfigField("boolean", "LINK_DEVICE_UX_ENABLED", "false")
|
buildConfigField("boolean", "LINK_DEVICE_UX_ENABLED", "false")
|
||||||
buildConfigField("boolean", "USE_STRING_ID", "true")
|
buildConfigField("boolean", "USE_STRING_ID", "false")
|
||||||
|
|
||||||
ndk {
|
ndk {
|
||||||
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
|
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
|
||||||
@@ -260,7 +283,7 @@ android {
|
|||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
getByName("debug") {
|
getByName("debug") {
|
||||||
if (keystores["debug"] != null) {
|
if (debugKeystorePropertiesProvider.orNull != null) {
|
||||||
signingConfig = signingConfigs["debug"]
|
signingConfig = signingConfigs["debug"]
|
||||||
}
|
}
|
||||||
isDefault = true
|
isDefault = true
|
||||||
@@ -337,8 +360,25 @@ android {
|
|||||||
isDebuggable = false
|
isDebuggable = false
|
||||||
isMinifyEnabled = true
|
isMinifyEnabled = true
|
||||||
matchingFallbacks += "debug"
|
matchingFallbacks += "debug"
|
||||||
|
applicationIdSuffix = ".benchmark"
|
||||||
|
|
||||||
buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Benchmark\"")
|
buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Benchmark\"")
|
||||||
buildConfigField("boolean", "TRACING_ENABLED", "true")
|
buildConfigField("boolean", "TRACING_ENABLED", "true")
|
||||||
|
buildConfigField("String[]", "UNIDENTIFIED_SENDER_TRUST_ROOTS", "new String[]{ \"BVT/2gHqbrG1xzuIypLIOjFgMtihrMld1/5TGADL6Dhv\"}")
|
||||||
|
|
||||||
|
manifestPlaceholders["applicationClass"] = "org.thoughtcrime.securesms.BenchmarkApplicationContext"
|
||||||
|
}
|
||||||
|
|
||||||
|
create("mocked") {
|
||||||
|
initWith(getByName("debug"))
|
||||||
|
isDefault = false
|
||||||
|
isDebuggable = false
|
||||||
|
isMinifyEnabled = true
|
||||||
|
matchingFallbacks += "debug"
|
||||||
|
buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Benchmark\"")
|
||||||
|
buildConfigField("boolean", "TRACING_ENABLED", "true")
|
||||||
|
|
||||||
|
manifestPlaceholders["applicationClass"] = "org.thoughtcrime.securesms.ApplicationContext"
|
||||||
}
|
}
|
||||||
|
|
||||||
create("canary") {
|
create("canary") {
|
||||||
@@ -348,6 +388,14 @@ android {
|
|||||||
matchingFallbacks += "debug"
|
matchingFallbacks += "debug"
|
||||||
buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Canary\"")
|
buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Canary\"")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
create("quickstart") {
|
||||||
|
initWith(getByName("debug"))
|
||||||
|
isDefault = false
|
||||||
|
isMinifyEnabled = false
|
||||||
|
matchingFallbacks += "debug"
|
||||||
|
buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Quickstart\"")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
productFlavors {
|
productFlavors {
|
||||||
@@ -366,17 +414,18 @@ android {
|
|||||||
buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"website\"")
|
buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"website\"")
|
||||||
}
|
}
|
||||||
|
|
||||||
create("nightly") {
|
create("github") {
|
||||||
val apkUpdateManifestUrl = if (file("${project.rootDir}/nightly-url.txt").exists()) {
|
|
||||||
file("${project.rootDir}/nightly-url.txt").readText().trim()
|
|
||||||
} else {
|
|
||||||
"<unset>"
|
|
||||||
}
|
|
||||||
|
|
||||||
dimension = "distribution"
|
dimension = "distribution"
|
||||||
versionNameSuffix = "-nightly-untagged-${getDateSuffix()}"
|
buildConfigField("boolean", "MANAGES_APP_UPDATES", "false")
|
||||||
buildConfigField("boolean", "MANAGES_APP_UPDATES", "true")
|
buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "null")
|
||||||
buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "\"${apkUpdateManifestUrl}\"")
|
buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"github\"")
|
||||||
|
}
|
||||||
|
|
||||||
|
create("nightly") {
|
||||||
|
dimension = "distribution"
|
||||||
|
versionNameSuffix = "-nightly-untagged-${getGitHash()}"
|
||||||
|
buildConfigField("boolean", "MANAGES_APP_UPDATES", "false")
|
||||||
|
buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "null")
|
||||||
buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"nightly\"")
|
buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"nightly\"")
|
||||||
buildConfigField("boolean", "LINK_DEVICE_UX_ENABLED", "true")
|
buildConfigField("boolean", "LINK_DEVICE_UX_ENABLED", "true")
|
||||||
}
|
}
|
||||||
@@ -402,8 +451,8 @@ android {
|
|||||||
buildConfigField("String", "SIGNAL_CDN3_URL", "\"https://cdn3-staging.signal.org\"")
|
buildConfigField("String", "SIGNAL_CDN3_URL", "\"https://cdn3-staging.signal.org\"")
|
||||||
buildConfigField("String", "SIGNAL_CDSI_URL", "\"https://cdsi.staging.signal.org\"")
|
buildConfigField("String", "SIGNAL_CDSI_URL", "\"https://cdsi.staging.signal.org\"")
|
||||||
buildConfigField("String", "SIGNAL_SVR2_URL", "\"https://svr2.staging.signal.org\"")
|
buildConfigField("String", "SIGNAL_SVR2_URL", "\"https://svr2.staging.signal.org\"")
|
||||||
buildConfigField("String", "SVR2_MRENCLAVE_LEGACY", "\"2e8cefe6e3f389d8426adb24e9b7fb7adf10902c96f06f7bbcee36277711ed91\"")
|
buildConfigField("String", "SVR2_MRENCLAVE_LEGACY", "\"a75542d82da9f6914a1e31f8a7407053b99cc99a0e7291d8fbd394253e19b036\"")
|
||||||
buildConfigField("String", "SVR2_MRENCLAVE", "\"a75542d82da9f6914a1e31f8a7407053b99cc99a0e7291d8fbd394253e19b036\"")
|
buildConfigField("String", "SVR2_MRENCLAVE", "\"97f151f6ed078edbbfd72fa9cae694dcc08353f1f5e8d9ccd79a971b10ffc535\"")
|
||||||
buildConfigField("String[]", "UNIDENTIFIED_SENDER_TRUST_ROOTS", "new String[]{\"BbqY1DzohE4NUZoVF+L18oUPrK3kILllLEJh2UnPSsEx\", \"BYhU6tPjqP46KGZEzRs1OL4U39V5dlPJ/X09ha4rErkm\"}")
|
buildConfigField("String[]", "UNIDENTIFIED_SENDER_TRUST_ROOTS", "new String[]{\"BbqY1DzohE4NUZoVF+L18oUPrK3kILllLEJh2UnPSsEx\", \"BYhU6tPjqP46KGZEzRs1OL4U39V5dlPJ/X09ha4rErkm\"}")
|
||||||
buildConfigField("String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"ABSY21VckQcbSXVNCGRYJcfWHiAMZmpTtTELcDmxgdFbtp/bWsSxZdMKzfCp8rvIs8ocCU3B37fT3r4Mi5qAemeGeR2X+/YmOGR5ofui7tD5mDQfstAI9i+4WpMtIe8KC3wU5w3Inq3uNWVmoGtpKndsNfwJrCg0Hd9zmObhypUnSkfYn2ooMOOnBpfdanRtrvetZUayDMSC5iSRcXKpdlukrpzzsCIvEwjwQlJYVPOQPj4V0F4UXXBdHSLK05uoPBCQG8G9rYIGedYsClJXnbrgGYG3eMTG5hnx4X4ntARBgELuMWWUEEfSK0mjXg+/2lPmWcTZWR9nkqgQQP0tbzuiPm74H2wMO4u1Wafe+UwyIlIT9L7KLS19Aw8r4sPrXZSSsOZ6s7M1+rTJN0bI5CKY2PX29y5Ok3jSWufIKcgKOnWoP67d5b2du2ZVJjpjfibNIHbT/cegy/sBLoFwtHogVYUewANUAXIaMPyCLRArsKhfJ5wBtTminG/PAvuBdJ70Z/bXVPf8TVsR292zQ65xwvWTejROW6AZX6aqucUjlENAErBme1YHmOSpU6tr6doJ66dPzVAWIanmO/5mgjNEDeK7DDqQdB1xd03HT2Qs2TxY3kCK8aAb/0iM0HQiXjxZ9HIgYhbtvGEnDKW5ILSUydqH/KBhW4Pb0jZWnqN/YgbWDKeJxnDbYcUob5ZY5Lt5ZCMKuaGUvCJRrCtuugSMaqjowCGRempsDdJEt+cMaalhZ6gczklJB/IbdwENW9KeVFPoFNFzhxWUIS5ML9riVYhAtE6JE5jX0xiHNVIIPthb458cfA8daR0nYfYAUKogQArm0iBezOO+mPk5vCNWI+wwkyFCqNDXz/qxl1gAntuCJtSfq9OC3NkdhQlgYQ==\"")
|
buildConfigField("String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"ABSY21VckQcbSXVNCGRYJcfWHiAMZmpTtTELcDmxgdFbtp/bWsSxZdMKzfCp8rvIs8ocCU3B37fT3r4Mi5qAemeGeR2X+/YmOGR5ofui7tD5mDQfstAI9i+4WpMtIe8KC3wU5w3Inq3uNWVmoGtpKndsNfwJrCg0Hd9zmObhypUnSkfYn2ooMOOnBpfdanRtrvetZUayDMSC5iSRcXKpdlukrpzzsCIvEwjwQlJYVPOQPj4V0F4UXXBdHSLK05uoPBCQG8G9rYIGedYsClJXnbrgGYG3eMTG5hnx4X4ntARBgELuMWWUEEfSK0mjXg+/2lPmWcTZWR9nkqgQQP0tbzuiPm74H2wMO4u1Wafe+UwyIlIT9L7KLS19Aw8r4sPrXZSSsOZ6s7M1+rTJN0bI5CKY2PX29y5Ok3jSWufIKcgKOnWoP67d5b2du2ZVJjpjfibNIHbT/cegy/sBLoFwtHogVYUewANUAXIaMPyCLRArsKhfJ5wBtTminG/PAvuBdJ70Z/bXVPf8TVsR292zQ65xwvWTejROW6AZX6aqucUjlENAErBme1YHmOSpU6tr6doJ66dPzVAWIanmO/5mgjNEDeK7DDqQdB1xd03HT2Qs2TxY3kCK8aAb/0iM0HQiXjxZ9HIgYhbtvGEnDKW5ILSUydqH/KBhW4Pb0jZWnqN/YgbWDKeJxnDbYcUob5ZY5Lt5ZCMKuaGUvCJRrCtuugSMaqjowCGRempsDdJEt+cMaalhZ6gczklJB/IbdwENW9KeVFPoFNFzhxWUIS5ML9riVYhAtE6JE5jX0xiHNVIIPthb458cfA8daR0nYfYAUKogQArm0iBezOO+mPk5vCNWI+wwkyFCqNDXz/qxl1gAntuCJtSfq9OC3NkdhQlgYQ==\"")
|
||||||
buildConfigField("String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AHILOIrFPXX9laLbalbA9+L1CXpSbM/bTJXZGZiuyK1JaI6dK5FHHWL6tWxmHKYAZTSYmElmJ5z2A5YcirjO/yfoemE03FItyaf8W1fE4p14hzb5qnrmfXUSiAIVrhaXVwIwSzH6RL/+EO8jFIjJ/YfExfJ8aBl48CKHgu1+A6kWynhttonvWWx6h7924mIzW0Czj2ROuh4LwQyZypex4GuOPW8sgIT21KNZaafgg+KbV7XM1x1tF3XA17B4uGUaDbDw2O+nR1+U5p6qHPzmJ7ggFjSN6Utu+35dS1sS0P9N\"")
|
buildConfigField("String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AHILOIrFPXX9laLbalbA9+L1CXpSbM/bTJXZGZiuyK1JaI6dK5FHHWL6tWxmHKYAZTSYmElmJ5z2A5YcirjO/yfoemE03FItyaf8W1fE4p14hzb5qnrmfXUSiAIVrhaXVwIwSzH6RL/+EO8jFIjJ/YfExfJ8aBl48CKHgu1+A6kWynhttonvWWx6h7924mIzW0Czj2ROuh4LwQyZypex4GuOPW8sgIT21KNZaafgg+KbV7XM1x1tF3XA17B4uGUaDbDw2O+nR1+U5p6qHPzmJ7ggFjSN6Utu+35dS1sS0P9N\"")
|
||||||
@@ -413,22 +462,10 @@ android {
|
|||||||
buildConfigField("String", "RECAPTCHA_PROOF_URL", "\"https://signalcaptchas.org/staging/challenge/generate.html\"")
|
buildConfigField("String", "RECAPTCHA_PROOF_URL", "\"https://signalcaptchas.org/staging/challenge/generate.html\"")
|
||||||
buildConfigField("org.signal.libsignal.net.Network.Environment", "LIBSIGNAL_NET_ENV", "org.signal.libsignal.net.Network.Environment.STAGING")
|
buildConfigField("org.signal.libsignal.net.Network.Environment", "LIBSIGNAL_NET_ENV", "org.signal.libsignal.net.Network.Environment.STAGING")
|
||||||
buildConfigField("int", "LIBSIGNAL_LOG_LEVEL", "org.signal.libsignal.protocol.logging.SignalProtocolLogger.DEBUG")
|
buildConfigField("int", "LIBSIGNAL_LOG_LEVEL", "org.signal.libsignal.protocol.logging.SignalProtocolLogger.DEBUG")
|
||||||
buildConfigField("boolean", "USE_STRING_ID", "false")
|
|
||||||
|
|
||||||
buildConfigField("String", "BUILD_ENVIRONMENT_TYPE", "\"Staging\"")
|
buildConfigField("String", "BUILD_ENVIRONMENT_TYPE", "\"Staging\"")
|
||||||
buildConfigField("String", "STRIPE_PUBLISHABLE_KEY", "\"pk_test_sngOd8FnXNkpce9nPXawKrJD00kIDngZkD\"")
|
buildConfigField("String", "STRIPE_PUBLISHABLE_KEY", "\"pk_test_sngOd8FnXNkpce9nPXawKrJD00kIDngZkD\"")
|
||||||
}
|
}
|
||||||
|
|
||||||
create("backup") {
|
|
||||||
initWith(getByName("staging"))
|
|
||||||
|
|
||||||
dimension = "environment"
|
|
||||||
|
|
||||||
applicationIdSuffix = ".backup"
|
|
||||||
|
|
||||||
buildConfigField("boolean", "MANAGES_APP_UPDATES", "true")
|
|
||||||
buildConfigField("String", "BUILD_ENVIRONMENT_TYPE", "\"Backup\"")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lint {
|
lint {
|
||||||
@@ -438,42 +475,61 @@ android {
|
|||||||
ignoreWarnings = true
|
ignoreWarnings = true
|
||||||
quiet = true
|
quiet = true
|
||||||
disable += "LintError"
|
disable += "LintError"
|
||||||
}
|
lintConfig = rootProject.file("lint.xml")
|
||||||
|
|
||||||
applicationVariants.all {
|
|
||||||
outputs
|
|
||||||
.map { it as com.android.build.gradle.internal.api.ApkVariantOutputImpl }
|
|
||||||
.forEach { output ->
|
|
||||||
if (output.baseName.contains("nightly")) {
|
|
||||||
var tag = getCurrentGitTag()
|
|
||||||
if (!tag.isNullOrEmpty()) {
|
|
||||||
if (tag.startsWith("v")) {
|
|
||||||
tag = tag.substring(1)
|
|
||||||
}
|
|
||||||
output.versionNameOverride = tag
|
|
||||||
output.outputFileName = output.outputFileName.replace(".apk", "-${output.versionNameOverride}.apk")
|
|
||||||
} else {
|
|
||||||
output.outputFileName = output.outputFileName.replace(".apk", "-$versionName.apk")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
output.outputFileName = output.outputFileName.replace(".apk", "-$versionName.apk")
|
|
||||||
|
|
||||||
if (currentHotfixVersion >= maxHotfixVersions) {
|
|
||||||
throw AssertionError("Hotfix version is too large!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
androidComponents {
|
androidComponents {
|
||||||
beforeVariants { variant ->
|
beforeVariants { variant ->
|
||||||
variant.enable = variant.name in selectableVariants
|
variant.enable = variant.name in selectableVariants
|
||||||
}
|
}
|
||||||
onVariants { variant ->
|
onVariants(selector().all()) { variant: com.android.build.api.variant.ApplicationVariant ->
|
||||||
// Include the test-only library on debug builds.
|
// Include the test-only library on debug builds.
|
||||||
if (variant.buildType != "instrumentation") {
|
if (variant.buildType != "instrumentation") {
|
||||||
variant.packaging.jniLibs.excludes.add("**/libsignal_jni_testing.so")
|
variant.packaging.jniLibs.excludes.add("**/libsignal_jni_testing.so")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Starting with minSdk 23, Android leaves native libraries uncompressed, which is fine for the Play Store, but not for our self-distributed APKs.
|
||||||
|
// This reverts it to the legacy behavior, compressing the native libraries, and drastically reducing the APK file size.
|
||||||
|
if (variant.name.contains("website", ignoreCase = true) || variant.name.contains("github", ignoreCase = true)) {
|
||||||
|
variant.packaging.jniLibs.useLegacyPackaging.set(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Version overrides
|
||||||
|
if (variant.name.contains("nightly", ignoreCase = true)) {
|
||||||
|
var tag = getNightlyTagForCurrentCommit()
|
||||||
|
if (!tag.isNullOrEmpty()) {
|
||||||
|
if (tag.startsWith("v")) {
|
||||||
|
tag = tag.substring(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// We add a multiple of maxHotfixVersions to nightlies to ensure we're always at least that many versions ahead
|
||||||
|
val nightlyBuffer = (5 * maxHotfixVersions)
|
||||||
|
val nightlyVersionCode = (canonicalVersionCode * maxHotfixVersions) + (getNightlyBuildNumber(tag) * 10) + nightlyBuffer
|
||||||
|
|
||||||
|
variant.outputs.forEach { output ->
|
||||||
|
output.versionName.set("$tag | ${getLastCommitDateTimeUtc()}")
|
||||||
|
output.versionCode.set(nightlyVersionCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onVariants(selector().withBuildType("quickstart")) { variant ->
|
||||||
|
val environment = variant.flavorName?.let { name ->
|
||||||
|
when {
|
||||||
|
name.contains("staging", ignoreCase = true) -> "staging"
|
||||||
|
name.contains("prod", ignoreCase = true) -> "prod"
|
||||||
|
else -> "prod"
|
||||||
|
}
|
||||||
|
} ?: "prod"
|
||||||
|
|
||||||
|
val taskProvider = tasks.register<CopyQuickstartCredentialsTask>("copyQuickstartCredentials${variant.name.capitalize()}") {
|
||||||
|
if (quickstartCredentialsDir != null) {
|
||||||
|
inputDir.set(File(quickstartCredentialsDir))
|
||||||
|
}
|
||||||
|
filePrefix.set("${environment}_")
|
||||||
|
}
|
||||||
|
variant.sources.assets?.addGeneratedSourceDirectory(taskProvider) { it.outputDir }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,6 +542,41 @@ android {
|
|||||||
java.srcDir(path)
|
java.srcDir(path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
getByName("mocked") {
|
||||||
|
java.srcDir("$projectDir/src/benchmarkShared/java")
|
||||||
|
manifest.srcFile("$projectDir/src/benchmarkShared/AndroidManifest.xml")
|
||||||
|
}
|
||||||
|
|
||||||
|
getByName("benchmark") {
|
||||||
|
java.srcDir("$projectDir/src/benchmarkShared/java")
|
||||||
|
manifest.srcFile("$projectDir/src/benchmarkShared/AndroidManifest.xml")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.configureEach {
|
||||||
|
outputs.configureEach {
|
||||||
|
if (this is com.android.build.gradle.internal.api.BaseVariantOutputImpl) {
|
||||||
|
val fileVersionName = versionName.substringBefore(" |")
|
||||||
|
outputFileName = outputFileName.replace(".apk", "-$fileVersionName.apk")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
baselineProfile {
|
||||||
|
warnings {
|
||||||
|
disabledVariants = false
|
||||||
|
}
|
||||||
|
|
||||||
|
mergeIntoMain = true
|
||||||
|
|
||||||
|
variants.create("mocked") {
|
||||||
|
from(project(":baseline-profile"))
|
||||||
|
}
|
||||||
|
|
||||||
|
dexLayoutOptimization = false
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -493,21 +584,25 @@ dependencies {
|
|||||||
ktlintRuleset(libs.ktlint.twitter.compose)
|
ktlintRuleset(libs.ktlint.twitter.compose)
|
||||||
coreLibraryDesugaring(libs.android.tools.desugar)
|
coreLibraryDesugaring(libs.android.tools.desugar)
|
||||||
|
|
||||||
implementation(project(":libsignal-service"))
|
implementation(project(":lib:libsignal-service"))
|
||||||
implementation(project(":paging"))
|
implementation(project(":lib:paging"))
|
||||||
implementation(project(":core-util"))
|
implementation(project(":core:util"))
|
||||||
implementation(project(":glide-config"))
|
implementation(project(":lib:glide"))
|
||||||
implementation(project(":video"))
|
implementation(project(":lib:video"))
|
||||||
implementation(project(":device-transfer"))
|
implementation(project(":lib:device-transfer"))
|
||||||
implementation(project(":image-editor"))
|
implementation(project(":lib:image-editor"))
|
||||||
implementation(project(":donations"))
|
implementation(project(":lib:donations"))
|
||||||
implementation(project(":debuglogs-viewer"))
|
implementation(project(":lib:debuglogs-viewer"))
|
||||||
implementation(project(":contacts"))
|
implementation(project(":lib:contacts"))
|
||||||
implementation(project(":qr"))
|
implementation(project(":lib:qr"))
|
||||||
implementation(project(":sticky-header-grid"))
|
implementation(project(":lib:sticky-header-grid"))
|
||||||
implementation(project(":photoview"))
|
implementation(project(":lib:photoview"))
|
||||||
implementation(project(":core-ui"))
|
implementation(project(":lib:blurhash"))
|
||||||
implementation(project(":core-models"))
|
implementation(project(":core:ui"))
|
||||||
|
implementation(project(":core:models"))
|
||||||
|
implementation(project(":core:models-jvm"))
|
||||||
|
implementation(project(":feature:camera"))
|
||||||
|
implementation(project(":feature:registration"))
|
||||||
|
|
||||||
implementation(libs.androidx.fragment.ktx)
|
implementation(libs.androidx.fragment.ktx)
|
||||||
implementation(libs.androidx.appcompat) {
|
implementation(libs.androidx.appcompat) {
|
||||||
@@ -531,6 +626,8 @@ dependencies {
|
|||||||
implementation(libs.androidx.navigation.fragment.ktx)
|
implementation(libs.androidx.navigation.fragment.ktx)
|
||||||
implementation(libs.androidx.navigation.ui.ktx)
|
implementation(libs.androidx.navigation.ui.ktx)
|
||||||
implementation(libs.androidx.navigation.compose)
|
implementation(libs.androidx.navigation.compose)
|
||||||
|
implementation(libs.androidx.navigation3.runtime)
|
||||||
|
implementation(libs.androidx.navigation3.ui)
|
||||||
implementation(libs.androidx.lifecycle.viewmodel.ktx)
|
implementation(libs.androidx.lifecycle.viewmodel.ktx)
|
||||||
implementation(libs.androidx.lifecycle.livedata.ktx)
|
implementation(libs.androidx.lifecycle.livedata.ktx)
|
||||||
implementation(libs.androidx.lifecycle.process)
|
implementation(libs.androidx.lifecycle.process)
|
||||||
@@ -607,9 +704,10 @@ dependencies {
|
|||||||
implementation(libs.androidx.credentials.compat)
|
implementation(libs.androidx.credentials.compat)
|
||||||
implementation(libs.kotlinx.serialization.json)
|
implementation(libs.kotlinx.serialization.json)
|
||||||
|
|
||||||
implementation(project(":billing"))
|
implementation(project(":lib:billing"))
|
||||||
|
implementation(project(":feature:media-send"))
|
||||||
|
|
||||||
"spinnerImplementation"(project(":spinner"))
|
"spinnerImplementation"(project(":lib:spinner"))
|
||||||
|
|
||||||
"canaryImplementation"(libs.square.leakcanary)
|
"canaryImplementation"(libs.square.leakcanary)
|
||||||
|
|
||||||
@@ -635,7 +733,7 @@ dependencies {
|
|||||||
}
|
}
|
||||||
testImplementation(testLibs.conscrypt.openjdk.uber)
|
testImplementation(testLibs.conscrypt.openjdk.uber)
|
||||||
testImplementation(testLibs.mockk)
|
testImplementation(testLibs.mockk)
|
||||||
testImplementation(testFixtures(project(":libsignal-service")))
|
testImplementation(testFixtures(project(":lib:libsignal-service")))
|
||||||
testImplementation(testLibs.espresso.core)
|
testImplementation(testLibs.espresso.core)
|
||||||
testImplementation(testLibs.kotlinx.coroutines.test)
|
testImplementation(testLibs.kotlinx.coroutines.test)
|
||||||
testImplementation(libs.androidx.compose.ui.test.junit4)
|
testImplementation(libs.androidx.compose.ui.test.junit4)
|
||||||
@@ -656,31 +754,29 @@ dependencies {
|
|||||||
androidTestUtil(testLibs.androidx.test.orchestrator)
|
androidTestUtil(testLibs.androidx.test.orchestrator)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun assertIsGitRepo() {
|
tasks.withType<Test>().configureEach {
|
||||||
if (!file("${project.rootDir}/.git").exists()) {
|
testLogging {
|
||||||
throw IllegalStateException("Must be a git repository to guarantee reproducible builds! (git hash is part of APK)")
|
events("failed")
|
||||||
|
exceptionFormat = TestExceptionFormat.FULL
|
||||||
|
showCauses = true
|
||||||
|
showExceptions = true
|
||||||
|
showStackTraces = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getLastCommitTimestamp(): String {
|
fun getLastCommitTimestamp(): String {
|
||||||
assertIsGitRepo()
|
|
||||||
|
|
||||||
return providers.exec {
|
return providers.exec {
|
||||||
commandLine("git", "log", "-1", "--pretty=format:%ct")
|
commandLine("git", "log", "-1", "--pretty=format:%ct")
|
||||||
}.standardOutput.asText.get() + "000"
|
}.standardOutput.asText.get() + "000"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getGitHash(): String {
|
fun getGitHash(): String {
|
||||||
assertIsGitRepo()
|
|
||||||
|
|
||||||
return providers.exec {
|
return providers.exec {
|
||||||
commandLine("git", "rev-parse", "HEAD")
|
commandLine("git", "rev-parse", "HEAD")
|
||||||
}.standardOutput.asText.get().trim().substring(0, 12)
|
}.standardOutput.asText.get().trim().substring(0, 12)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getCurrentGitTag(): String? {
|
fun getNightlyTagForCurrentCommit(): String? {
|
||||||
assertIsGitRepo()
|
|
||||||
|
|
||||||
val output = providers.exec {
|
val output = providers.exec {
|
||||||
commandLine("git", "tag", "--points-at", "HEAD")
|
commandLine("git", "tag", "--points-at", "HEAD")
|
||||||
}.standardOutput.asText.get().trim()
|
}.standardOutput.asText.get().trim()
|
||||||
@@ -693,65 +789,116 @@ fun getCurrentGitTag(): String? {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType<Test>().configureEach {
|
fun getNightlyBuildNumber(tag: String?): Int {
|
||||||
testLogging {
|
if (tag == null) {
|
||||||
events("failed")
|
return 0
|
||||||
exceptionFormat = TestExceptionFormat.FULL
|
|
||||||
showCauses = true
|
|
||||||
showExceptions = true
|
|
||||||
showStackTraces = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val match = Regex("-(\\d{3})$").find(tag)
|
||||||
|
return match?.groupValues?.get(1)?.toIntOrNull() ?: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
gradle.taskGraph.whenReady {
|
fun getLastCommitDateTimeUtc(): String {
|
||||||
if (gradle.startParameter.taskNames.any { it.contains("nightly", ignoreCase = true) }) {
|
val timestamp = providers.exec {
|
||||||
if (!file("${project.rootDir}/nightly-url.txt").exists()) {
|
commandLine("git", "log", "-1", "--pretty=format:%ct")
|
||||||
throw GradleException("Missing required file: nightly-url.txt")
|
}.standardOutput.asText.get().trim().toLong()
|
||||||
}
|
val instant = Instant.ofEpochSecond(timestamp)
|
||||||
}
|
val formatter = DateTimeFormatter.ofPattern("MMM d '@' HH:mm 'UTC'", Locale.US)
|
||||||
}
|
.withZone(ZoneOffset.UTC)
|
||||||
|
return formatter.format(instant)
|
||||||
fun loadKeystoreProperties(filename: String): Properties? {
|
|
||||||
val keystorePropertiesFile = file("${project.rootDir}/$filename")
|
|
||||||
|
|
||||||
return if (keystorePropertiesFile.exists()) {
|
|
||||||
val keystoreProperties = Properties()
|
|
||||||
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
|
|
||||||
keystoreProperties
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getDateSuffix(): String {
|
|
||||||
return SimpleDateFormat("yyyy-MM-dd-HH:mm").format(Date())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getMapsKey(): String {
|
fun getMapsKey(): String {
|
||||||
val mapKey = file("${project.rootDir}/maps.key")
|
return providers
|
||||||
|
.gradleProperty("mapsKey")
|
||||||
|
.orElse(providers.environmentVariable("MAPS_KEY"))
|
||||||
|
.orElse("AIzaSyCSx9xea86GwDKGznCAULE9Y5a8b-TfN9U")
|
||||||
|
.get()
|
||||||
|
}
|
||||||
|
|
||||||
return if (mapKey.exists()) {
|
abstract class LanguageListValueSource : ValueSource<List<String>, LanguageListValueSource.Params> {
|
||||||
mapKey.readLines()[0]
|
interface Params : ValueSourceParameters {
|
||||||
} else {
|
@get:InputDirectory
|
||||||
"AIzaSyCSx9xea86GwDKGznCAULE9Y5a8b-TfN9U"
|
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||||
|
val resDir: DirectoryProperty
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun obtain(): List<String> {
|
||||||
|
// In API 35, language codes for Hebrew and Indonesian now use the ISO 639-1 code ("he" and "id").
|
||||||
|
// However, the value resources still only support the outdated code ("iw" and "in") so we have
|
||||||
|
// to manually indicate that we support these languages.
|
||||||
|
val updatedLanguageCodes = listOf("he", "id")
|
||||||
|
|
||||||
|
val resRoot = parameters.resDir.asFile.get()
|
||||||
|
|
||||||
|
val languages = resRoot
|
||||||
|
.walkTopDown()
|
||||||
|
.filter { it.isFile && it.name == "strings.xml" }
|
||||||
|
.mapNotNull { stringFile -> stringFile.parentFile?.name }
|
||||||
|
.map { valuesFolderName -> valuesFolderName.removePrefix("values-") }
|
||||||
|
.filter { valuesFolderName -> valuesFolderName != "values" }
|
||||||
|
.map { languageCode -> languageCode.replace("-r", "_") }
|
||||||
|
.toList()
|
||||||
|
.distinct()
|
||||||
|
.sorted()
|
||||||
|
|
||||||
|
return languages + updatedLanguageCodes + "en"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Project.languageList(): List<String> {
|
abstract class PropertiesFileValueSource : ValueSource<Properties?, PropertiesFileValueSource.Params> {
|
||||||
// In API 35, language codes for Hebrew and Indonesian now use the ISO 639-1 code ("he" and "id").
|
interface Params : ValueSourceParameters {
|
||||||
// However, the value resources still only support the outdated code ("iw" and "in") so we have
|
@get:InputFile
|
||||||
// to manually indicate that we support these languages.
|
@get:Optional
|
||||||
val updatedLanguageCodes = listOf("he", "id")
|
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||||
|
val file: RegularFileProperty
|
||||||
|
}
|
||||||
|
|
||||||
return fileTree("src/main/res") { include("**/strings.xml") }
|
override fun obtain(): Properties? {
|
||||||
.map { stringFile -> stringFile.parentFile.name }
|
val f: File = parameters.file.asFile.get()
|
||||||
.map { valuesFolderName -> valuesFolderName.replace("values-", "") }
|
if (!f.exists()) return null
|
||||||
.filter { valuesFolderName -> valuesFolderName != "values" }
|
|
||||||
.map { languageCode -> languageCode.replace("-r", "_") }
|
return Properties().apply {
|
||||||
.distinct()
|
f.inputStream().use { load(it) }
|
||||||
.sorted() + updatedLanguageCodes + "en"
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun String.capitalize(): String {
|
fun String.capitalize(): String {
|
||||||
return this.replaceFirstChar { it.uppercase() }
|
return this.replaceFirstChar { it.uppercase() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract class CopyQuickstartCredentialsTask : DefaultTask() {
|
||||||
|
@get:InputDirectory
|
||||||
|
@get:Optional
|
||||||
|
abstract val inputDir: DirectoryProperty
|
||||||
|
|
||||||
|
@get:Input
|
||||||
|
abstract val filePrefix: Property<String>
|
||||||
|
|
||||||
|
@get:OutputDirectory
|
||||||
|
abstract val outputDir: DirectoryProperty
|
||||||
|
|
||||||
|
@TaskAction
|
||||||
|
fun copy() {
|
||||||
|
if (!inputDir.isPresent) {
|
||||||
|
throw GradleException("quickstart.credentials.dir is not set in local.properties. This is required for quickstart builds.")
|
||||||
|
}
|
||||||
|
|
||||||
|
val prefix = filePrefix.get()
|
||||||
|
val candidates = inputDir.get().asFile.listFiles()
|
||||||
|
?.filter { it.extension == "json" && it.name.startsWith(prefix) }
|
||||||
|
?: emptyList()
|
||||||
|
|
||||||
|
if (candidates.isEmpty()) {
|
||||||
|
throw GradleException("No credential files matching '$prefix*.json' found in ${inputDir.get().asFile}. Add files like '${prefix}account1.json' to your credentials directory.")
|
||||||
|
}
|
||||||
|
|
||||||
|
val chosen = candidates.random()
|
||||||
|
logger.lifecycle("Selected quickstart credential: ${chosen.name}")
|
||||||
|
|
||||||
|
val dest = outputDir.get().asFile.resolve("quickstart")
|
||||||
|
dest.mkdirs()
|
||||||
|
chosen.copyTo(dest.resolve(chosen.name), overwrite = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user