Compare commits
1358 Commits
1.1.3
...
1.1.4-pre4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
470545337d | ||
|
|
ab610e9da5 | ||
|
|
5420712bda | ||
|
|
55733d30c5 | ||
|
|
2090fd2312 | ||
|
|
f3bad60fb6 | ||
|
|
d805306d20 | ||
|
|
831a3052fa | ||
|
|
52151765f8 | ||
|
|
422b413778 | ||
|
|
1943b65788 | ||
|
|
629be129ff | ||
|
|
6ff256637a | ||
|
|
34e9afd7ad | ||
|
|
0cd57c9bb0 | ||
|
|
22d9fbddf9 | ||
|
|
65746ae2bd | ||
|
|
685852c0a4 | ||
|
|
b2100f3872 | ||
|
|
86125d5ecd | ||
|
|
086c93d24f | ||
|
|
aea1992f5d | ||
|
|
6b38322c3b | ||
|
|
865ddad147 | ||
|
|
6709fa4d21 | ||
|
|
705417f65b | ||
|
|
690c4f5786 | ||
|
|
e00c176bdf | ||
|
|
8d14f42fd8 | ||
|
|
6688fcf3e9 | ||
|
|
308bd26172 | ||
|
|
a94493705d | ||
|
|
e251eaf811 | ||
|
|
1826b6a059 | ||
|
|
be5a1af040 | ||
|
|
17b7eb7e0f | ||
|
|
60c25e4b65 | ||
|
|
2c92845af0 | ||
|
|
4a4aa569ec | ||
|
|
95f1d1485d | ||
|
|
e7f27e4913 | ||
|
|
dc61d9007f | ||
|
|
88c2ba8059 | ||
|
|
309c871919 | ||
|
|
745a510ffa | ||
|
|
8fbc8fda3d | ||
|
|
dbde90459b | ||
|
|
b788794f4b | ||
|
|
06b433aa60 | ||
|
|
6093848811 | ||
|
|
34c5d6812f | ||
|
|
aaad7fc6dc | ||
|
|
fac37e59aa | ||
|
|
11c6745fd7 | ||
|
|
30aa29598b | ||
|
|
85c72731f6 | ||
|
|
27c9c266c1 | ||
|
|
720f3e10e8 | ||
|
|
162a79145f | ||
|
|
9e31326bf5 | ||
|
|
e77fe2587c | ||
|
|
c75a68dacc | ||
|
|
16fa47e8e9 | ||
|
|
2df6c91a3d | ||
|
|
bd490b87ca | ||
|
|
597fca9fbf | ||
|
|
810505ea1d | ||
|
|
d108373c33 | ||
|
|
c0287d05be | ||
|
|
be998b8ee1 | ||
|
|
ef1ccabc8a | ||
|
|
edb5ea7a7a | ||
|
|
b4c1568869 | ||
|
|
83e25ec0bf | ||
|
|
6d55321699 | ||
|
|
26a5b7b7a7 | ||
|
|
f663301eae | ||
|
|
eb9f3cd21c | ||
|
|
05119edacb | ||
|
|
554e96c820 | ||
|
|
40a19f2766 | ||
|
|
b723529d7f | ||
|
|
9f33488248 | ||
|
|
80a4c8c24d | ||
|
|
170b2aa6d9 | ||
|
|
e2639b6951 | ||
|
|
b954c6f893 | ||
|
|
104d295389 | ||
|
|
3caa684b2e | ||
|
|
af7a1a6ee9 | ||
|
|
add519120c | ||
|
|
01552801f2 | ||
|
|
afb09e8a0a | ||
|
|
deb48d1ada | ||
|
|
cf84a92808 | ||
|
|
26ccb92b44 | ||
|
|
3fa697a037 | ||
|
|
f72c13df62 | ||
|
|
7b51f15753 | ||
|
|
d246462535 | ||
|
|
3208661a52 | ||
|
|
2e614fa03c | ||
|
|
b7f70ee0b3 | ||
|
|
cb52840bad | ||
|
|
bd3d6cf34c | ||
|
|
cf835e330b | ||
|
|
14fd660ce2 | ||
|
|
0a8282d3e3 | ||
|
|
574e432e09 | ||
|
|
4b9f251dae | ||
|
|
f0e2a63d11 | ||
|
|
3c964787df | ||
|
|
199ddc0e7e | ||
|
|
1071a29b26 | ||
|
|
90ce74cf91 | ||
|
|
05bb27ee2b | ||
|
|
53ef4219eb | ||
|
|
dd5c2229b3 | ||
|
|
5c28376210 | ||
|
|
aa8eef46da | ||
|
|
f7d4db6aad | ||
|
|
edc9a1ca7b | ||
|
|
05c9269531 | ||
|
|
e945daba3a | ||
|
|
1029621b63 | ||
|
|
c8613fbe07 | ||
|
|
c4e87925cf | ||
|
|
83e5095cc3 | ||
|
|
a57323e5a8 | ||
|
|
3eb9c5b8ba | ||
|
|
cf403aaf78 | ||
|
|
2325814f6d | ||
|
|
e5c86e1d2e | ||
|
|
26c420023f | ||
|
|
cbb838fff8 | ||
|
|
3c466d5748 | ||
|
|
db79a03ec4 | ||
|
|
65b432ed2c | ||
|
|
6ca7efe8d1 | ||
|
|
916931dd11 | ||
|
|
819a28c48c | ||
|
|
f281e6e36a | ||
|
|
c46058ef4d | ||
|
|
39cc42d542 | ||
|
|
3a78ead3a6 | ||
|
|
a05ecd020b | ||
|
|
e00f009a64 | ||
|
|
b977f5228e | ||
|
|
4003ca6c4d | ||
|
|
9072d6e051 | ||
|
|
bb36876d1e | ||
|
|
d17dbe139e | ||
|
|
d567c296f8 | ||
|
|
0c6bc9d58a | ||
|
|
6d48c70020 | ||
|
|
569484014e | ||
|
|
c89a39cf5c | ||
|
|
418a1e8d39 | ||
|
|
148e0872b4 | ||
|
|
b1432b5ff5 | ||
|
|
75e86952fd | ||
|
|
03b095905a | ||
|
|
77a444b896 | ||
|
|
e770e39c8f | ||
|
|
55bed2e830 | ||
|
|
a875ff3988 | ||
|
|
a4a866d3f5 | ||
|
|
4e5c4169fa | ||
|
|
fbf47d7485 | ||
|
|
ba16f3d597 | ||
|
|
8a62f5bbee | ||
|
|
042a7df7f3 | ||
|
|
610ed02dd4 | ||
|
|
f7184aff4e | ||
|
|
473515efc5 | ||
|
|
aee65b0a9c | ||
|
|
e46488d11e | ||
|
|
f43bc74868 | ||
|
|
f223befad6 | ||
|
|
e0243461bb | ||
|
|
2877372f67 | ||
|
|
d6c12195f8 | ||
|
|
e280f6ee4a | ||
|
|
4275719844 | ||
|
|
f41af00b31 | ||
|
|
10ed5f2ea4 | ||
|
|
44ba554e0e | ||
|
|
c346d586a5 | ||
|
|
52fb332378 | ||
|
|
5f5387b941 | ||
|
|
db682066ba | ||
|
|
3ee8c68eac | ||
|
|
a9ceb04d07 | ||
|
|
f60a714c06 | ||
|
|
e240a6caae | ||
|
|
829b966382 | ||
|
|
58f3949a22 | ||
|
|
dfb823c30c | ||
|
|
b32922af8f | ||
|
|
753e10ef20 | ||
|
|
05153fda72 | ||
|
|
8bf55ec95a | ||
|
|
d2023b1750 | ||
|
|
b51c6b65a1 | ||
|
|
e3337f1e7c | ||
|
|
5ff6ef8801 | ||
|
|
74f7c5d0ea | ||
|
|
b43c07bd51 | ||
|
|
7cdcd6df97 | ||
|
|
7439160f03 | ||
|
|
b496ea4da4 | ||
|
|
0f1665bf08 | ||
|
|
83459df3b7 | ||
|
|
9ce84fb997 | ||
|
|
708bf27710 | ||
|
|
dae64e74d5 | ||
|
|
8414c0f71f | ||
|
|
18f5ddd937 | ||
|
|
a231492f49 | ||
|
|
6f2570c5be | ||
|
|
721bf2d59f | ||
|
|
e5301c3cf8 | ||
|
|
20893ef65f | ||
|
|
12c13cd25a | ||
|
|
81f72e2c4a | ||
|
|
d2e5e71729 | ||
|
|
158e8f7cb8 | ||
|
|
7886a901a3 | ||
|
|
0264a4c01f | ||
|
|
2eb86658b7 | ||
|
|
0b95476d8f | ||
|
|
27023a305d | ||
|
|
ef7cfdd92e | ||
|
|
4b067c5ed2 | ||
|
|
7be3774675 | ||
|
|
fcf758e290 | ||
|
|
79e30047f5 | ||
|
|
c6a377b9d4 | ||
|
|
bc3ce66322 | ||
|
|
17568c8c27 | ||
|
|
a1555826c3 | ||
|
|
07b7c42f13 | ||
|
|
2d66b1d8ca | ||
|
|
604d78ad6a | ||
|
|
5f3f158932 | ||
|
|
345402d2fe | ||
|
|
0bc0c36f14 | ||
|
|
dcb893ed07 | ||
|
|
3bfb0db307 | ||
|
|
9b8d4a62fa | ||
|
|
6f48a97b4b | ||
|
|
5644e9a0e1 | ||
|
|
f440edf43b | ||
|
|
30a8b4d25c | ||
|
|
41245d5256 | ||
|
|
89b1a63946 | ||
|
|
448d7c38db | ||
|
|
cc4100d74f | ||
|
|
768f3e20b1 | ||
|
|
91a1b77d83 | ||
|
|
9d9784f3c2 | ||
|
|
6c6c4cffd2 | ||
|
|
cb167dae29 | ||
|
|
0bf9d13967 | ||
|
|
0963713fad | ||
|
|
d69a996be4 | ||
|
|
fcdb04b728 | ||
|
|
a2c24fb33c | ||
|
|
25f4ed6636 | ||
|
|
a0bed68c79 | ||
|
|
75c2cf70a0 | ||
|
|
f3b9749a85 | ||
|
|
c05fbde3fa | ||
|
|
f824477ddb | ||
|
|
54fe38047f | ||
|
|
de9d16cc61 | ||
|
|
7c6f82891d | ||
|
|
4e710fca79 | ||
|
|
4f3f01d80a | ||
|
|
4a4cd3017f | ||
|
|
89a418c7c5 | ||
|
|
f4d3ec39a0 | ||
|
|
3655c31a48 | ||
|
|
bc2de4828b | ||
|
|
206602e49a | ||
|
|
f5d52237c5 | ||
|
|
88288f4a7a | ||
|
|
bdf3cfc750 | ||
|
|
4c758bb1a3 | ||
|
|
5f77a8aa19 | ||
|
|
9fbe824d6d | ||
|
|
d61706d4f3 | ||
|
|
208db62d93 | ||
|
|
10efd96788 | ||
|
|
f1e4130201 | ||
|
|
63a286056c | ||
|
|
dc9b345e99 | ||
|
|
c67866a148 | ||
|
|
d893102939 | ||
|
|
82b4f76b95 | ||
|
|
a6ac2c4522 | ||
|
|
fdb817cadd | ||
|
|
c7dabba3b2 | ||
|
|
19e4ae6c04 | ||
|
|
6ec0d8f589 | ||
|
|
f151e63923 | ||
|
|
f77f853fd1 | ||
|
|
930afa4c60 | ||
|
|
bffcfd1f90 | ||
|
|
e3c920dc87 | ||
|
|
13f1392821 | ||
|
|
7376fc788a | ||
|
|
5c1312bbcd | ||
|
|
db4283af4a | ||
|
|
77e418e4b7 | ||
|
|
ccde326e38 | ||
|
|
4a00b45c5c | ||
|
|
b149ee4998 | ||
|
|
707d2f4b07 | ||
|
|
b960359a39 | ||
|
|
f50b1d2beb | ||
|
|
50efe1e24c | ||
|
|
daf5d302e3 | ||
|
|
84e24b5827 | ||
|
|
19cf085e3e | ||
|
|
459d7cb9f1 | ||
|
|
e56e216c59 | ||
|
|
08c9ebc42e | ||
|
|
924fb4bf81 | ||
|
|
f60c0b9a10 | ||
|
|
7c0d161b9a | ||
|
|
0a8b632200 | ||
|
|
401f5268a6 | ||
|
|
d508e0822e | ||
|
|
6147df2030 | ||
|
|
b990f9cf87 | ||
|
|
0fb01f1b7c | ||
|
|
91fe0492c1 | ||
|
|
19bbdaac65 | ||
|
|
1462e6ecf1 | ||
|
|
3364b52e33 | ||
|
|
4ac05caa28 | ||
|
|
132a7e15de | ||
|
|
c2c8a5166b | ||
|
|
a260b1640a | ||
|
|
3031d5e3b0 | ||
|
|
5f2e863cc2 | ||
|
|
9a63e23478 | ||
|
|
c9450992d9 | ||
|
|
8aeb035e55 | ||
|
|
924d51d41b | ||
|
|
b643cb1bd0 | ||
|
|
1f77ee178e | ||
|
|
6d599891dc | ||
|
|
4e9fdfbfbd | ||
|
|
d4ac9ab79a | ||
|
|
ad4fba4f44 | ||
|
|
6092bab75c | ||
|
|
365d9e1223 | ||
|
|
9c3b2717ac | ||
|
|
8b6320730c | ||
|
|
c34eeba859 | ||
|
|
d6914c42b3 | ||
|
|
39778247f6 | ||
|
|
1d91b183fd | ||
|
|
b2a4875ba7 | ||
|
|
077b31e4c9 | ||
|
|
dbcc19cac1 | ||
|
|
83de915e54 | ||
|
|
8ce33736a0 | ||
|
|
3edac65ae8 | ||
|
|
db3b74e33f | ||
|
|
89a077be5c | ||
|
|
76a5b6221d | ||
|
|
18f8831b7e | ||
|
|
b674d102e3 | ||
|
|
86e52eec4c | ||
|
|
fd55383778 | ||
|
|
f29385ccef | ||
|
|
3993ff8a8e | ||
|
|
a130b5db98 | ||
|
|
2d22501d08 | ||
|
|
b478427522 | ||
|
|
70164fa3f7 | ||
|
|
8e1b2be073 | ||
|
|
b6b67884f4 | ||
|
|
fe97a485c7 | ||
|
|
86c64fdd05 | ||
|
|
da56c66168 | ||
|
|
5bd6b38908 | ||
|
|
81cfe3efe1 | ||
|
|
0a9897f6a4 | ||
|
|
0b495f100f | ||
|
|
70b55e5fdd | ||
|
|
9c2f3d3f86 | ||
|
|
5452b3de4f | ||
|
|
b1666095a6 | ||
|
|
7fa6d81dc8 | ||
|
|
04a10e62d6 | ||
|
|
ecce23589a | ||
|
|
b6aa6aebb9 | ||
|
|
4bd4178cbf | ||
|
|
04a157c64a | ||
|
|
ac60ac417b | ||
|
|
1efd62803a | ||
|
|
218e829fd4 | ||
|
|
acb3784071 | ||
|
|
f87957b170 | ||
|
|
043310ca00 | ||
|
|
43d71bb368 | ||
|
|
12eb430d8c | ||
|
|
cfb42075dc | ||
|
|
9b5457ffc0 | ||
|
|
3099bd6ca1 | ||
|
|
ea32f705f5 | ||
|
|
66b7d27dc4 | ||
|
|
05b512e8cc | ||
|
|
a2da381f1a | ||
|
|
e4654d63c3 | ||
|
|
38b1af2696 | ||
|
|
81c6abb879 | ||
|
|
d4ad738888 | ||
|
|
a62670eecf | ||
|
|
25adc4face | ||
|
|
8fd62cf2f3 | ||
|
|
a360212dc7 | ||
|
|
d7dec1bc4d | ||
|
|
8be86a2d95 | ||
|
|
34949b8a7f | ||
|
|
40502e3bff | ||
|
|
0de2603e30 | ||
|
|
e330359192 | ||
|
|
ab80b2a5af | ||
|
|
f642bfcf48 | ||
|
|
805a63cf59 | ||
|
|
4d430ba42c | ||
|
|
5f734758b4 | ||
|
|
8157dbc530 | ||
|
|
391d862b17 | ||
|
|
271856ca89 | ||
|
|
d7eb734aaf | ||
|
|
1d4eabb770 | ||
|
|
906c21e252 | ||
|
|
7ae92970ef | ||
|
|
cf0bf1e587 | ||
|
|
616c129ffd | ||
|
|
1326cc4966 | ||
|
|
35bc4a6ece | ||
|
|
e54a0f127f | ||
|
|
070ecad54b | ||
|
|
205ae2bf55 | ||
|
|
d35c85f389 | ||
|
|
026e40855c | ||
|
|
553be52260 | ||
|
|
69f9fb398f | ||
|
|
98985a7fa4 | ||
|
|
3f71e79809 | ||
|
|
55138957b7 | ||
|
|
901e8d9cb8 | ||
|
|
f140fc53ad | ||
|
|
9b8b699ace | ||
|
|
39a355ab4c | ||
|
|
22f9285627 | ||
|
|
152eaf2627 | ||
|
|
d15b8091bc | ||
|
|
de9eb2292e | ||
|
|
9b86e24513 | ||
|
|
9a97a5d110 | ||
|
|
964668c982 | ||
|
|
0514c0d999 | ||
|
|
4a782332d3 | ||
|
|
72734d4b4e | ||
|
|
8d34e6f340 | ||
|
|
c899ea95e1 | ||
|
|
0b57cd3555 | ||
|
|
f9b4f587c2 | ||
|
|
279f586a90 | ||
|
|
2f3f712256 | ||
|
|
6748a20ddb | ||
|
|
90ccb86a6f | ||
|
|
574bf861f0 | ||
|
|
5bff1747e6 | ||
|
|
17ea416c98 | ||
|
|
ab57aee8c1 | ||
|
|
8c80fc3578 | ||
|
|
85ab250551 | ||
|
|
3f3a1a6d7f | ||
|
|
68fe3bbd4b | ||
|
|
a8054be82e | ||
|
|
3b6fd8019b | ||
|
|
91af974bd4 | ||
|
|
024a249e6b | ||
|
|
024e74115e | ||
|
|
7b4f08bb05 | ||
|
|
f75036cb8e | ||
|
|
0510fbb65a | ||
|
|
9e4bc24365 | ||
|
|
0f41d5b2f8 | ||
|
|
a282baf5a2 | ||
|
|
dea29054e6 | ||
|
|
efaff0ae79 | ||
|
|
2d75d89825 | ||
|
|
bcd0d63db7 | ||
|
|
26f921b7e4 | ||
|
|
4d1a9517e1 | ||
|
|
222070feba | ||
|
|
b28882cff5 | ||
|
|
fb22e5ab66 | ||
|
|
11a0f2faca | ||
|
|
dd6ff101d1 | ||
|
|
286193f08f | ||
|
|
6353ecc13e | ||
|
|
767e93615c | ||
|
|
76998e7761 | ||
|
|
df205f2b9d | ||
|
|
3e63875659 | ||
|
|
fcb7330970 | ||
|
|
b19c718a2a | ||
|
|
661e7bfa78 | ||
|
|
867efecc54 | ||
|
|
bd31ab5d07 | ||
|
|
bd1ffb0f24 | ||
|
|
a8fa4d72f3 | ||
|
|
2d1697064d | ||
|
|
a915650bb6 | ||
|
|
1da30d5d8f | ||
|
|
a2f72ee3f3 | ||
|
|
2e4c24393d | ||
|
|
e7b229a60f | ||
|
|
562f9035e8 | ||
|
|
7689fe8aa4 | ||
|
|
ceca78368d | ||
|
|
3fa6d9820f | ||
|
|
2f4c739f0b | ||
|
|
4e68c765c5 | ||
|
|
0dfc4e15bd | ||
|
|
e8147680e6 | ||
|
|
2b3d326c41 | ||
|
|
6414b377da | ||
|
|
ea80d9a39c | ||
|
|
ef671f6503 | ||
|
|
cfc66e4364 | ||
|
|
1477a9058a | ||
|
|
cdeb843a84 | ||
|
|
07d2b3b464 | ||
|
|
a49caa871d | ||
|
|
fb004a0bb9 | ||
|
|
6f69a45195 | ||
|
|
877732e1e7 | ||
|
|
caa58e9d7d | ||
|
|
2cfad80214 | ||
|
|
9b3c3efb09 | ||
|
|
c491b5283b | ||
|
|
7f70ee5045 | ||
|
|
57fa8b4f3e | ||
|
|
974a74a3c7 | ||
|
|
478b71d6b3 | ||
|
|
5940c4f032 | ||
|
|
9e50a195a4 | ||
|
|
b7b3460248 | ||
|
|
36bf6f4ceb | ||
|
|
56491591ab | ||
|
|
0b05edd6ff | ||
|
|
c090cae1a1 | ||
|
|
a46bde68f5 | ||
|
|
ddf7d82656 | ||
|
|
23813eb224 | ||
|
|
77e4a30bc5 | ||
|
|
15f4ae2567 | ||
|
|
b3f117d28e | ||
|
|
17a75da540 | ||
|
|
f8caa46eab | ||
|
|
8d4bbc1a1c | ||
|
|
b5f2510cce | ||
|
|
978f27c700 | ||
|
|
b4ca42e0c0 | ||
|
|
4abffeed32 | ||
|
|
9b5628cb65 | ||
|
|
85f06ed65d | ||
|
|
f6b5d358e0 | ||
|
|
a42881ba9f | ||
|
|
d5991b4354 | ||
|
|
101e49fe74 | ||
|
|
1cbeacbd0f | ||
|
|
4b6b3e8377 | ||
|
|
b3ab417c85 | ||
|
|
defc6911d6 | ||
|
|
6c757ec395 | ||
|
|
b876840d08 | ||
|
|
30bad3a066 | ||
|
|
ca993df0c6 | ||
|
|
451a84e696 | ||
|
|
e65ec1b0b9 | ||
|
|
aed45b08ac | ||
|
|
7f93b42a1b | ||
|
|
a831b41623 | ||
|
|
4d193a1f72 | ||
|
|
51750a4ad5 | ||
|
|
8fe6e3f4b7 | ||
|
|
6d7b0e8dd5 | ||
|
|
43409826f3 | ||
|
|
bb6bd95e9b | ||
|
|
d4d1602b45 | ||
|
|
bd3c76ef43 | ||
|
|
3722ff1f33 | ||
|
|
dc1cca0d4c | ||
|
|
3dad24e7b4 | ||
|
|
c591b57f22 | ||
|
|
91389f91d1 | ||
|
|
ec811f75e6 | ||
|
|
51e88939d6 | ||
|
|
f4470c383e | ||
|
|
ed99aee3fd | ||
|
|
40fb93f036 | ||
|
|
64f7ba2a1a | ||
|
|
6a45f993ae | ||
|
|
0bdf620c2f | ||
|
|
b8d2ff7e9b | ||
|
|
91142be3bd | ||
|
|
8159e1b1df | ||
|
|
27b05098cc | ||
|
|
1e851d34b6 | ||
|
|
f10aa38bfd | ||
|
|
9a1b15029e | ||
|
|
2063c366c2 | ||
|
|
afe812e2be | ||
|
|
738cd61825 | ||
|
|
c28729af5b | ||
|
|
4d7d9abc60 | ||
|
|
8c7001c801 | ||
|
|
039e1696dd | ||
|
|
636e083044 | ||
|
|
fcaba24cee | ||
|
|
33b8902375 | ||
|
|
65eecb8dcf | ||
|
|
e0fe16fd14 | ||
|
|
7bb0307e6a | ||
|
|
cba70c3507 | ||
|
|
f779ed63e8 | ||
|
|
07e34eb17b | ||
|
|
f220db96ed | ||
|
|
a0abd472e0 | ||
|
|
0d27d88719 | ||
|
|
e212144250 | ||
|
|
2f5a3d66fc | ||
|
|
ff0ff42222 | ||
|
|
0dc209d30a | ||
|
|
2aeecb05d3 | ||
|
|
65404ce356 | ||
|
|
246061c69e | ||
|
|
92f96c93f0 | ||
|
|
993c1f309a | ||
|
|
7856857cca | ||
|
|
1f2f00d49c | ||
|
|
3afdd9d3f3 | ||
|
|
42fa4a2fff | ||
|
|
3d4bcbc082 | ||
|
|
4c0443ec28 | ||
|
|
8b28a31d09 | ||
|
|
e6e9ce7d57 | ||
|
|
9ad57dccb0 | ||
|
|
95caf111ae | ||
|
|
abdde1f811 | ||
|
|
ae901c709d | ||
|
|
a2af297a84 | ||
|
|
f9e28d1de9 | ||
|
|
a2ef4e6f84 | ||
|
|
e5f3c3c922 | ||
|
|
6f4321ae14 | ||
|
|
a5c7ec0d60 | ||
|
|
6bc0a8b4aa | ||
|
|
538494b7ec | ||
|
|
ed60c274fc | ||
|
|
bbc498f882 | ||
|
|
0932b3d625 | ||
|
|
9d4d37f2e7 | ||
|
|
6fc7e47111 | ||
|
|
c05ad1e724 | ||
|
|
5ed86b9165 | ||
|
|
75cbd20f54 | ||
|
|
3c07b7347b | ||
|
|
d0ebedac0a | ||
|
|
d86caac189 | ||
|
|
c2b02b9b8d | ||
|
|
a4e8ea37aa | ||
|
|
f56ca9c082 | ||
|
|
e27476bc32 | ||
|
|
8ca4f7c8d3 | ||
|
|
1c4eb0766b | ||
|
|
87a812b7e0 | ||
|
|
f42a6200ed | ||
|
|
a252ee0655 | ||
|
|
498988c2e3 | ||
|
|
261922d73a | ||
|
|
ebe08c23e4 | ||
|
|
70edd4cc3a | ||
|
|
fa48a07970 | ||
|
|
0259ca963a | ||
|
|
8dc9f68584 | ||
|
|
4db7711a36 | ||
|
|
7b9e4b2f82 | ||
|
|
07c04a9e7e | ||
|
|
8427ebc36e | ||
|
|
a99fc8fa72 | ||
|
|
5959288491 | ||
|
|
0522dd5ad4 | ||
|
|
d886569dc3 | ||
|
|
12c711424b | ||
|
|
cb6ead96d1 | ||
|
|
c4e7263ed6 | ||
|
|
4972e64cad | ||
|
|
5ea8a7d313 | ||
|
|
296cd863d2 | ||
|
|
9ccf91659f | ||
|
|
f0e3b776bb | ||
|
|
3638d65008 | ||
|
|
2cc9324f08 | ||
|
|
bc8907b3ef | ||
|
|
14f8ec37c5 | ||
|
|
2b567e7cb3 | ||
|
|
b58a3ec044 | ||
|
|
2d0d578bb4 | ||
|
|
54ba05c4aa | ||
|
|
27b251b06e | ||
|
|
5643ebfe48 | ||
|
|
d9c2f6bf91 | ||
|
|
3eb404a9e2 | ||
|
|
bc9c20c509 | ||
|
|
7cc0c83df1 | ||
|
|
41daefa6c4 | ||
|
|
38fa8a10b7 | ||
|
|
07d37a1209 | ||
|
|
509f0d1266 | ||
|
|
7966bab62d | ||
|
|
a136c150ad | ||
|
|
a89fe6b026 | ||
|
|
56460c937d | ||
|
|
f2080bfb7b | ||
|
|
012d55452e | ||
|
|
6ac482ed5e | ||
|
|
68df173558 | ||
|
|
d9c6c31a4d | ||
|
|
d3d2715418 | ||
|
|
a93fbd4444 | ||
|
|
9fee9a4cf1 | ||
|
|
4bbc008788 | ||
|
|
671b6e1ef7 | ||
|
|
634bae915a | ||
|
|
a7bbfc983e | ||
|
|
17548e935e | ||
|
|
15f84712cd | ||
|
|
2f34ae7d45 | ||
|
|
16cbe7e43c | ||
|
|
8d633377ae | ||
|
|
0b867c254f | ||
|
|
08a47e6c1d | ||
|
|
6c9cd8b120 | ||
|
|
71e7219084 | ||
|
|
c13063b230 | ||
|
|
26ca69cb83 | ||
|
|
afc8c5f873 | ||
|
|
4d3f739a0c | ||
|
|
1781fdb7ca | ||
|
|
32aa37505c | ||
|
|
9f9ed7dd4b | ||
|
|
03e3b897cf | ||
|
|
3bc20ce1d4 | ||
|
|
9ce9940306 | ||
|
|
da35cf471e | ||
|
|
c517df2c09 | ||
|
|
02dee71670 | ||
|
|
1eadcd41f6 | ||
|
|
e8185535b0 | ||
|
|
b68bebfa2e | ||
|
|
3801bdf9d7 | ||
|
|
9a6ba82467 | ||
|
|
3a52c1199c | ||
|
|
ea5c0584cc | ||
|
|
01b30d942b | ||
|
|
5aa5308a50 | ||
|
|
de029b7043 | ||
|
|
a45da453ce | ||
|
|
e1b73f4766 | ||
|
|
99b19e7b03 | ||
|
|
37bd849a86 | ||
|
|
4eb6f78a38 | ||
|
|
68f03f2311 | ||
|
|
2a60a9b393 | ||
|
|
1d4b08672b | ||
|
|
b0d9a1dada | ||
|
|
796494e53f | ||
|
|
cef7bfd534 | ||
|
|
36ff4a0ed3 | ||
|
|
6a6894030b | ||
|
|
497d31ddf7 | ||
|
|
783218429c | ||
|
|
0ccd15047b | ||
|
|
fe2a6ec006 | ||
|
|
a3ecf59fae | ||
|
|
4f4f89a1d7 | ||
|
|
ece3bdd2e8 | ||
|
|
f403ed1a21 | ||
|
|
17e3a0206a | ||
|
|
5da86d85de | ||
|
|
d3cbc95235 | ||
|
|
a7eebcc209 | ||
|
|
fca22eb592 | ||
|
|
1202e5ec0f | ||
|
|
03830533eb | ||
|
|
850e5a199e | ||
|
|
2d11158ecd | ||
|
|
a34c18b262 | ||
|
|
560b1e40cc | ||
|
|
3cd512857c | ||
|
|
356adbef5c | ||
|
|
42d7445d83 | ||
|
|
3a0f32fce7 | ||
|
|
6bc128cfda | ||
|
|
6f2d697748 | ||
|
|
4de180c23a | ||
|
|
af289c533f | ||
|
|
82d615fbbf | ||
|
|
457f2ea6c7 | ||
|
|
41ad5c45ed | ||
|
|
e9da2e8d6b | ||
|
|
a8cfbb12fd | ||
|
|
6d89b7769e | ||
|
|
2d86daec83 | ||
|
|
a5e8594611 | ||
|
|
99810ef512 | ||
|
|
2317b831db | ||
|
|
e073086cf4 | ||
|
|
b14844f459 | ||
|
|
8719c8f639 | ||
|
|
d3cec0ec72 | ||
|
|
a8daf02610 | ||
|
|
f9b844fb1a | ||
|
|
6d1d6b575a | ||
|
|
0a5a094e54 | ||
|
|
754da4777a | ||
|
|
216e3e606e | ||
|
|
bb013a8fe6 | ||
|
|
6b6449f023 | ||
|
|
fcf3348371 | ||
|
|
f90f759667 | ||
|
|
b02e6c04b9 | ||
|
|
08dc04f874 | ||
|
|
4776b84c7c | ||
|
|
78d13b586a | ||
|
|
f522ecd42d | ||
|
|
44fa2a8c3e | ||
|
|
ff30c8c2bf | ||
|
|
4aaaffbcea | ||
|
|
21da122902 | ||
|
|
849904ad45 | ||
|
|
1c0bae600f | ||
|
|
f1433c6e9b | ||
|
|
2dc106adcb | ||
|
|
df6738f607 | ||
|
|
ee64f1e7f1 | ||
|
|
d921f6176b | ||
|
|
7009c3400a | ||
|
|
7bd481b090 | ||
|
|
7fafa88eb7 | ||
|
|
cb3e57feec | ||
|
|
9a7d73cb6b | ||
|
|
f5c2bd47d5 | ||
|
|
c154d25f7a | ||
|
|
8c259205f5 | ||
|
|
849329b66b | ||
|
|
f542565dc5 | ||
|
|
08aedbf0b0 | ||
|
|
09c8a41c52 | ||
|
|
6a7d14a3f8 | ||
|
|
5b171ec044 | ||
|
|
978d634cb3 | ||
|
|
7437d8c592 | ||
|
|
e190ca5868 | ||
|
|
64fc995f6b | ||
|
|
2d0e801a1a | ||
|
|
d409424871 | ||
|
|
b855ef9865 | ||
|
|
86abf006d0 | ||
|
|
d1a6798f2e | ||
|
|
f64d543ec7 | ||
|
|
2abf01362c | ||
|
|
9bbd934f8e | ||
|
|
6ab72b65aa | ||
|
|
c39de1e245 | ||
|
|
d112843a8a | ||
|
|
89df091542 | ||
|
|
d870c36a96 | ||
|
|
fc55bf33d0 | ||
|
|
f99740ef2d | ||
|
|
f9f30a5f13 | ||
|
|
f70cf05870 | ||
|
|
22866012ca | ||
|
|
cdb2718aeb | ||
|
|
e4f3203351 | ||
|
|
d6b388ad5c | ||
|
|
61819d9f27 | ||
|
|
3ccc7ef69d | ||
|
|
e834311664 | ||
|
|
fd8dff327c | ||
|
|
a9df8cd883 | ||
|
|
909394965e | ||
|
|
2d5991e0c5 | ||
|
|
e7ae66a3dc | ||
|
|
5929150047 | ||
|
|
acb6bc569e | ||
|
|
678db34c81 | ||
|
|
134bfd43ff | ||
|
|
8712248ef2 | ||
|
|
c97227e807 | ||
|
|
40429021be | ||
|
|
e89bd2fedf | ||
|
|
9da3a538fb | ||
|
|
a904414f3d | ||
|
|
f003e8bf35 | ||
|
|
7399915357 | ||
|
|
7aa0289c1f | ||
|
|
99d0b1c468 | ||
|
|
84a342a0e0 | ||
|
|
db1c836a3e | ||
|
|
6539457f83 | ||
|
|
82f9f48a8e | ||
|
|
2ddfea5cf3 | ||
|
|
79aee2fdd9 | ||
|
|
5dc8b8e54f | ||
|
|
72fa9c51f0 | ||
|
|
6ea8ffea7a | ||
|
|
eea5257da2 | ||
|
|
385cffefb8 | ||
|
|
347420c531 | ||
|
|
cc774015f9 | ||
|
|
da3f64feab | ||
|
|
76d031e8d1 | ||
|
|
25995b0ed6 | ||
|
|
3cdd40a710 | ||
|
|
f36f8d69fc | ||
|
|
5655e6ccdf | ||
|
|
49fff821b1 | ||
|
|
3b34cecdcd | ||
|
|
3693d6c350 | ||
|
|
54cb1a6fc0 | ||
|
|
ab7b1524b6 | ||
|
|
2b4a27076c | ||
|
|
63a7fa95f5 | ||
|
|
a15b932a69 | ||
|
|
3a6b6614a4 | ||
|
|
6ff83e34f3 | ||
|
|
e4cadc5a40 | ||
|
|
907d37dd4c | ||
|
|
00d30313af | ||
|
|
950dd82e3c | ||
|
|
c53c3a387c | ||
|
|
5d0b2dc8e3 | ||
|
|
f5e9375917 | ||
|
|
cdfab7a7db | ||
|
|
f3e6a59e4f | ||
|
|
239c9ca2a7 | ||
|
|
becb566ca8 | ||
|
|
aa378d924b | ||
|
|
812f351ddd | ||
|
|
b9adf26ee0 | ||
|
|
018cd058ca | ||
|
|
cd3385be63 | ||
|
|
d4e4813c78 | ||
|
|
8030912087 | ||
|
|
4879701008 | ||
|
|
6ab8e5925e | ||
|
|
52dda9964c | ||
|
|
1825329236 | ||
|
|
60a650f798 | ||
|
|
0f78669faf | ||
|
|
015309b3dc | ||
|
|
a74edd22c1 | ||
|
|
7a6085e923 | ||
|
|
bf464994df | ||
|
|
a611a88f69 | ||
|
|
025b5c8e6d | ||
|
|
d37685f7cf | ||
|
|
10a22b5186 | ||
|
|
d9a74c43dc | ||
|
|
90c8aeb05d | ||
|
|
34f63612a4 | ||
|
|
edfa9a8dd1 | ||
|
|
95fa19f121 | ||
|
|
79d0d314f5 | ||
|
|
ddbf168c87 | ||
|
|
0eee8bbac2 | ||
|
|
92f02b5943 | ||
|
|
f110c2a55f | ||
|
|
8ddf42fff1 | ||
|
|
d2c34d64c3 | ||
|
|
2341027972 | ||
|
|
006c9301d9 | ||
|
|
1f8955d0b3 | ||
|
|
5a758ebb3a | ||
|
|
97bef56006 | ||
|
|
96ba36ed67 | ||
|
|
edf84fcc8f | ||
|
|
a8428e52d2 | ||
|
|
fd8559228e | ||
|
|
d6587cf3b6 | ||
|
|
7c3e3cb1f8 | ||
|
|
9d0ac30fad | ||
|
|
68d11d7638 | ||
|
|
3881b3dc74 | ||
|
|
99b14d0f0e | ||
|
|
066f3d4132 | ||
|
|
b15fdfa2ff | ||
|
|
94fa0652ac | ||
|
|
5c54e131ba | ||
|
|
1fc85fd618 | ||
|
|
e1c561b613 | ||
|
|
950620bf9e | ||
|
|
ae7a1e2373 | ||
|
|
bddeb72d9b | ||
|
|
b99cf4f629 | ||
|
|
b07cf62bdd | ||
|
|
57d2d3f5d9 | ||
|
|
7854c5e6b9 | ||
|
|
0b8e95477c | ||
|
|
c2e9a7deb3 | ||
|
|
361a6a4c1d | ||
|
|
8eca9a6644 | ||
|
|
0770f325ab | ||
|
|
98d52760b3 | ||
|
|
0ebe976b8a | ||
|
|
21fe0ef288 | ||
|
|
28ef1890d1 | ||
|
|
d6f238c720 | ||
|
|
44bf9dd9e1 | ||
|
|
e357da5162 | ||
|
|
c296aa036a | ||
|
|
12c46f938d | ||
|
|
b4412f5b37 | ||
|
|
5f2ac0d59b | ||
|
|
2a73725455 | ||
|
|
a8725e64ee | ||
|
|
727ae8cd2b | ||
|
|
714f288170 | ||
|
|
3da64d2641 | ||
|
|
2556290a6e | ||
|
|
66b547a904 | ||
|
|
c1ab273478 | ||
|
|
4aa3d5f273 | ||
|
|
a6a1de169b | ||
|
|
af6188be77 | ||
|
|
bd39de2109 | ||
|
|
33375aeb7d | ||
|
|
fafe6c1e91 | ||
|
|
68b072bf44 | ||
|
|
99cdec62a1 | ||
|
|
59797a2f5f | ||
|
|
5cc661e314 | ||
|
|
2ce79d21b5 | ||
|
|
b75fda3596 | ||
|
|
2efa6f4ace | ||
|
|
95e50e436b | ||
|
|
35a53bc8ac | ||
|
|
58c16ef52e | ||
|
|
847ac80d5f | ||
|
|
0408b27ca5 | ||
|
|
2949adbbfd | ||
|
|
2f616ba237 | ||
|
|
b50ead327c | ||
|
|
2fe0f43cb6 | ||
|
|
b85413be9b | ||
|
|
c88776c4a0 | ||
|
|
b7cb977f2b | ||
|
|
3048e36d2f | ||
|
|
64f37fa743 | ||
|
|
737b7d0507 | ||
|
|
973dad4176 | ||
|
|
46110adb8f | ||
|
|
b5c7ed1c34 | ||
|
|
86678ec15a | ||
|
|
893fb63a72 | ||
|
|
3b717cfc58 | ||
|
|
ed40a91a52 | ||
|
|
8b1bec6ed2 | ||
|
|
a6a3476cb2 | ||
|
|
fac3c19d3f | ||
|
|
dc1451c3af | ||
|
|
08b0a93064 | ||
|
|
72dd0b9e81 | ||
|
|
8236b93717 | ||
|
|
c4c5eee2eb | ||
|
|
5cc9c59c76 | ||
|
|
bf4ecc85dd | ||
|
|
da5c2148ad | ||
|
|
bfcea11320 | ||
|
|
ed19e13630 | ||
|
|
6497fb6cd0 | ||
|
|
9c21f03df8 | ||
|
|
7667e73d9d | ||
|
|
ff2ed0421c | ||
|
|
56c5ad360a | ||
|
|
ef644d2837 | ||
|
|
4642eda98d | ||
|
|
8ef163dd38 | ||
|
|
5986add7dd | ||
|
|
c990cf1660 | ||
|
|
76c16c035e | ||
|
|
d5a244ce7f | ||
|
|
432c5133e6 | ||
|
|
a9f9b324a9 | ||
|
|
4735297285 | ||
|
|
3abff4b9da | ||
|
|
c32b98fa7f | ||
|
|
a605c0fcfb | ||
|
|
1e83b4557f | ||
|
|
c3d729fc77 | ||
|
|
00ea891784 | ||
|
|
c98dbccbd7 | ||
|
|
4a68122c31 | ||
|
|
9c4a52de87 | ||
|
|
6c11140f43 | ||
|
|
11398ca64b | ||
|
|
312ce6e639 | ||
|
|
139b48c457 | ||
|
|
f1f478e193 | ||
|
|
1abaf3db3f | ||
|
|
f6bfbc3ed6 | ||
|
|
d2890d72e5 | ||
|
|
5c029c8f64 | ||
|
|
c37a631df2 | ||
|
|
82030b8d06 | ||
|
|
e362f75dac | ||
|
|
3fecf7c0a4 | ||
|
|
801043468d | ||
|
|
1b4f588671 | ||
|
|
7ad48570f0 | ||
|
|
5b8c68303f | ||
|
|
87d3d0ca14 | ||
|
|
b330440371 | ||
|
|
2a173ef804 | ||
|
|
bceabae06f | ||
|
|
69667c135d | ||
|
|
587870ad71 | ||
|
|
609fab345a | ||
|
|
29c47cee78 | ||
|
|
6a9795f561 | ||
|
|
72e7f0aa9f | ||
|
|
acfa384c0c | ||
|
|
c2d27ddd04 | ||
|
|
0a6950e34a | ||
|
|
1c3d77b95d | ||
|
|
fb11208bbe | ||
|
|
94f05127b6 | ||
|
|
25a3046c3c | ||
|
|
f479fc37ba | ||
|
|
3ee19a8f08 | ||
|
|
b8d2ad68dd | ||
|
|
8434c488da | ||
|
|
41f251ad50 | ||
|
|
8e99ff1173 | ||
|
|
a921b983f5 | ||
|
|
81eeda0a68 | ||
|
|
1a54f61355 | ||
|
|
382cd5b73d | ||
|
|
e236485bc7 | ||
|
|
0e69e23606 | ||
|
|
0ef85f2551 | ||
|
|
8d3990124e | ||
|
|
7f912a1781 | ||
|
|
d9ae1dd97a | ||
|
|
307db51aec | ||
|
|
347a704b54 | ||
|
|
9e242fb902 | ||
|
|
192cd60a4f | ||
|
|
a98d8511d6 | ||
|
|
811b79610c | ||
|
|
14129e8f21 | ||
|
|
16de044d3d | ||
|
|
e573a8a9c0 | ||
|
|
108648cabf | ||
|
|
8e4ce07d19 | ||
|
|
09cebd70ae | ||
|
|
6a615c408b | ||
|
|
9ebc054c8c | ||
|
|
b2c520bd91 | ||
|
|
6506afa732 | ||
|
|
d1c74b9389 | ||
|
|
61ca7bc1cb | ||
|
|
f94cb2a4b5 | ||
|
|
4c56fcd6a8 | ||
|
|
d5bb2ec165 | ||
|
|
27bc68f264 | ||
|
|
516eed76b7 | ||
|
|
4190c17cdc | ||
|
|
3d0fedfb61 | ||
|
|
9d57deffb4 | ||
|
|
cc1951c721 | ||
|
|
1cd8d4913d | ||
|
|
19890e29e9 | ||
|
|
f759dba7da | ||
|
|
fb6f92a70b | ||
|
|
f22cad42d7 | ||
|
|
cfb6c674ea | ||
|
|
415c68a570 | ||
|
|
15b949bb9c | ||
|
|
316a9809e4 | ||
|
|
3f5aa03056 | ||
|
|
6bc33795a3 | ||
|
|
3191ae27a5 | ||
|
|
b25de52b9e | ||
|
|
a08b4648d5 | ||
|
|
e7a7c945de | ||
|
|
571f358280 | ||
|
|
7ddc3adfaa | ||
|
|
957c326148 | ||
|
|
0b246d03a6 | ||
|
|
5dd3ff32b6 | ||
|
|
a48d262637 | ||
|
|
b5d17b5161 | ||
|
|
980733ba22 | ||
|
|
7043fdc35d | ||
|
|
81713a6bc4 | ||
|
|
959bcfaa30 | ||
|
|
fa465f792d | ||
|
|
74bf78b9cd | ||
|
|
8c408e59f6 | ||
|
|
25d27e42ed | ||
|
|
0f2b0cc5f2 | ||
|
|
00ea34f45d | ||
|
|
ec936c1821 | ||
|
|
2ff84857e7 | ||
|
|
84ed34f3a7 | ||
|
|
f0508e1bc2 | ||
|
|
8ea7bf36d7 | ||
|
|
8819461eed | ||
|
|
7c30668c87 | ||
|
|
a3424950ca | ||
|
|
ebc42eb05e | ||
|
|
fc6ff44471 | ||
|
|
be03377449 | ||
|
|
e52934093a | ||
|
|
ebfd98488e | ||
|
|
6a68af77dc | ||
|
|
e5c0fb7cb2 | ||
|
|
d9611cce80 | ||
|
|
4b48aba2ae | ||
|
|
47fbb6cd0e | ||
|
|
dae71d427c | ||
|
|
46bc2ceb78 | ||
|
|
6f98200179 | ||
|
|
a57b4c56a5 | ||
|
|
6c3062ba2d | ||
|
|
064c8a9dfe | ||
|
|
7dd47736fb | ||
|
|
84cc65489f | ||
|
|
2b9cb54d91 | ||
|
|
54c7fef217 | ||
|
|
ba74cb8c01 | ||
|
|
675932aa69 | ||
|
|
d996e0a7dd | ||
|
|
b6279f702a | ||
|
|
695a89b91a | ||
|
|
09753b6bbd | ||
|
|
6502b97388 | ||
|
|
95d84647b7 | ||
|
|
8f5065332e | ||
|
|
71c8cbb8da | ||
|
|
3217731486 | ||
|
|
a4e63fe0e8 | ||
|
|
cdb8f6845c | ||
|
|
0a7d286c47 | ||
|
|
e17fd0071d | ||
|
|
a9ba30b9b9 | ||
|
|
4267a3b8e0 | ||
|
|
50022ae635 | ||
|
|
0991621152 | ||
|
|
192f8924c8 | ||
|
|
51a12d7266 | ||
|
|
1417fcda6e | ||
|
|
6114e6f033 | ||
|
|
bc2dbc59ce | ||
|
|
7c5075413e | ||
|
|
52175b0b69 | ||
|
|
f0a3515279 | ||
|
|
3c2ccf7d40 | ||
|
|
abd01e1a27 | ||
|
|
0f63976a00 | ||
|
|
6817eb6e56 | ||
|
|
a951d42623 | ||
|
|
8f5c2bf3ba | ||
|
|
7744217d17 | ||
|
|
a84c153bdd | ||
|
|
31a0a90ba4 | ||
|
|
383ce777e3 | ||
|
|
e7ac88ffb1 | ||
|
|
9657c77999 | ||
|
|
afd508f28b | ||
|
|
634612c1a2 | ||
|
|
76545397d4 | ||
|
|
d2f586a7f1 | ||
|
|
7cfebcb6ed | ||
|
|
9a3766e7b7 | ||
|
|
588a06bece | ||
|
|
e45a126862 | ||
|
|
a581945c9e | ||
|
|
331fd0d619 | ||
|
|
c6e229d571 | ||
|
|
b2c3b1ff95 | ||
|
|
3fc12fcc09 | ||
|
|
e098631553 | ||
|
|
0fcd55755e | ||
|
|
65e7c0c4f4 | ||
|
|
70aecd1e38 | ||
|
|
a40c773491 | ||
|
|
b4abb58a41 | ||
|
|
e368436bc6 | ||
|
|
6c96b3a7f5 | ||
|
|
149f0c082d | ||
|
|
994199b5a2 | ||
|
|
8db3d80151 | ||
|
|
93af1e7c44 | ||
|
|
54e90bd986 | ||
|
|
ca16551917 | ||
|
|
f4977d2855 | ||
|
|
bd91fb7c6d | ||
|
|
e1805896f4 | ||
|
|
31a639400e | ||
|
|
d6b24561fa | ||
|
|
7ba9646d38 | ||
|
|
58a7cf1e75 | ||
|
|
1a327198f7 | ||
|
|
e4fe91ef92 | ||
|
|
afcf817c4f | ||
|
|
21550815db | ||
|
|
02af3a18ff | ||
|
|
a5a13b45cf | ||
|
|
0fd232ab3a | ||
|
|
8d83143ca6 | ||
|
|
74452cd622 | ||
|
|
cf2e8cec54 | ||
|
|
5231faf254 | ||
|
|
959d4de78a | ||
|
|
f5d7dc6b6a | ||
|
|
b761c35d10 | ||
|
|
7f3f7f6bdd | ||
|
|
c5877b7c5e | ||
|
|
9e4187ef17 | ||
|
|
bf7ce3e5a2 | ||
|
|
2c55314491 | ||
|
|
d28efef672 | ||
|
|
49b631d560 | ||
|
|
896510f852 | ||
|
|
1d8e469a46 | ||
|
|
caee40a5d9 | ||
|
|
7de051e6bb | ||
|
|
18cec3c752 | ||
|
|
3b46655051 | ||
|
|
f72ad572fb | ||
|
|
a57ea2adb6 |
23
.github/ISSUE_TEMPLATE/bug-反馈.md
vendored
@@ -1,23 +0,0 @@
|
||||
---
|
||||
name: Bug 反馈
|
||||
about: 描述你所遇到的bug
|
||||
title: "[Bug] "
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### 问题描述
|
||||
请提供一个清晰而简明的问题描述。
|
||||
|
||||
### 复现步骤
|
||||
请提供复现该问题所需的具体步骤。
|
||||
|
||||
### 预期行为
|
||||
请描述你期望的正确行为或结果。
|
||||
|
||||
### 错误日志
|
||||
请提供设置->关于->错误日志中的内容,粘贴在下方代码框中。如果没有,请提供您的app版本号、系统版本、设备型号等相关信息。
|
||||
|
||||
### 相关信息
|
||||
请补充截图、录屏、BV号等其他有助于解决问题的信息。
|
||||
58
.github/ISSUE_TEMPLATE/bug-反馈.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
name: Bug 反馈
|
||||
description: 描述你所遇到的bug
|
||||
labels: [ "bug" ]
|
||||
title: "[Bug] "
|
||||
body:
|
||||
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: 检查清单
|
||||
options:
|
||||
- label: 之前没有人提交过类似或相同的 bug report。
|
||||
required: true
|
||||
- label: 正在使用最新版本。
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: version
|
||||
attributes:
|
||||
label: 版本号
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: steps
|
||||
attributes:
|
||||
label: 复现步骤
|
||||
description: 请提供复现该问题所需的具体步骤。
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: 预期行为
|
||||
description: 请描述你期望的正确行为或结果。
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: actual
|
||||
attributes:
|
||||
label: 实际行为
|
||||
description: 请描述实际的行为或结果。
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: log
|
||||
attributes:
|
||||
label: 错误日志
|
||||
description: 请提供设置->关于->错误日志中的内容,粘贴在下方代码框中。如果没有,请提供您的app版本号、系统版本、设备型号等相关信息。
|
||||
|
||||
- type: textarea
|
||||
id: info
|
||||
attributes:
|
||||
label: 相关信息
|
||||
description: 请补充截图、录屏、BV号等其他有助于解决问题的信息。
|
||||
20
.github/ISSUE_TEMPLATE/功能请求.md
vendored
@@ -1,20 +0,0 @@
|
||||
---
|
||||
name: 功能请求
|
||||
about: 对于功能的一些建议
|
||||
title: "[FR] "
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### 功能描述
|
||||
请提供对所请求功能的清晰描述。
|
||||
|
||||
### 目标
|
||||
请描述你希望通过这个功能实现的目标。
|
||||
|
||||
### 解决方案
|
||||
如果你有任何关于如何实现这个功能的想法或建议,请在这里提供。
|
||||
|
||||
### 其他
|
||||
请提供已实现该功能或类似功能的应用
|
||||
35
.github/ISSUE_TEMPLATE/功能请求.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
name: 功能请求
|
||||
description: 对于功能的一些建议
|
||||
labels: [ "enhancement" ]
|
||||
title: "[FR] "
|
||||
body:
|
||||
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: 检查清单
|
||||
options:
|
||||
- label: 之前没有人提交过类似或相同的功能请求。
|
||||
required: true
|
||||
- label: 正在使用最新版本。
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: desc
|
||||
attributes:
|
||||
label: 功能描述
|
||||
description: 请提供对所请求功能的清晰描述。
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: 解决方案
|
||||
description: 如果你有任何关于如何实现这个功能的想法或建议,请在这里提供。
|
||||
|
||||
- type: textarea
|
||||
id: addition
|
||||
attributes:
|
||||
label: 其他
|
||||
description: 请提供已实现该功能或类似功能的应用
|
||||
24
.github/workflows/android.yml
vendored
@@ -1,6 +1,14 @@
|
||||
name: Android Release
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- reopened
|
||||
- ready_for_review
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
@@ -33,19 +41,6 @@ jobs:
|
||||
channel: stable
|
||||
flutter-version-file: pubspec.yaml
|
||||
|
||||
- name: 修复3.24的stable显示中文不正确问题 // from orz12
|
||||
run: |
|
||||
version=$(grep -m 1 'flutter:' pubspec.yaml | awk '{print $2}')
|
||||
if [ "$(echo "$version < 3.27.0" | awk '{print ($1 < $2)}')" -eq 1 ]; then
|
||||
cd $FLUTTER_ROOT
|
||||
git config --global user.name "orz12"
|
||||
git config --global user.email "orz12@test.com"
|
||||
git cherry-pick d4124bd --strategy-option theirs
|
||||
# flutter precache
|
||||
flutter --version
|
||||
cd -
|
||||
fi
|
||||
|
||||
- name: 下载项目依赖
|
||||
run: flutter pub get
|
||||
|
||||
@@ -55,6 +50,7 @@ jobs:
|
||||
sed -i "s/version: .*/version: $version_name-$(git rev-parse --short HEAD)+$(git rev-list --count HEAD)/g" pubspec.yaml
|
||||
|
||||
- name: Write key
|
||||
if: github.event_name != 'pull_request'
|
||||
run: |
|
||||
if [ ! -z "${{ secrets.SIGN_KEYSTORE_BASE64 }}" ]; then
|
||||
echo "${{ secrets.SIGN_KEYSTORE_BASE64 }}" | base64 --decode > android/app/key.jks
|
||||
@@ -89,4 +85,4 @@ jobs:
|
||||
with:
|
||||
name: app-x86_64
|
||||
path: |
|
||||
build/app/outputs/flutter-apk/app-x86_64-release.apk
|
||||
build/app/outputs/flutter-apk/app-x86_64-release.apk
|
||||
|
||||
8
.github/workflows/ios.yml
vendored
@@ -1,6 +1,14 @@
|
||||
name: Build for iOS
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- reopened
|
||||
- ready_for_review
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
|
||||
4
.gitignore
vendored
@@ -135,4 +135,6 @@ app.*.symbols
|
||||
!/dev/ci/**/Gemfile.lock
|
||||
!.vscode/settings.json
|
||||
|
||||
/lib/build_config.dart
|
||||
/lib/build_config.dart
|
||||
|
||||
devtools_options.yaml
|
||||
|
||||
4
.vscode/settings.json
vendored
@@ -2,5 +2,9 @@
|
||||
"editor.formatOnSave": true,
|
||||
"[dart]": {
|
||||
"editor.formatOnType": true
|
||||
},
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit",
|
||||
// "source.fixAll": "explicit",
|
||||
}
|
||||
}
|
||||
41
README.md
@@ -47,6 +47,39 @@
|
||||
|
||||
## feat
|
||||
|
||||
- [x] 播放课堂视频
|
||||
- [x] 发起投票
|
||||
- [x] 发布动态/评论支持`富文本编辑`/`表情显示`/`@用户`
|
||||
- [x] 修改消息设置
|
||||
- [x] 修改聊天设置
|
||||
- [x] 展示折叠消息
|
||||
- [x] 查看用户图文
|
||||
- [x] 动态话题
|
||||
- [x] 直播分区
|
||||
- [x] 分享`视频`/`番剧`/`动态`/`专栏`/`直播`至消息
|
||||
- [x] 创建/修改/删除关注分组
|
||||
- [x] 移除粉丝
|
||||
- [x] 直播弹幕发送表情
|
||||
- [x] 收藏夹排序
|
||||
- [x] 稍后再看 ~~`未看`~~ / `未看完` / ~~`已看完`~~ 分类
|
||||
- [x] WebDAV 备份/恢复设置
|
||||
- [x] 保存评论/动态
|
||||
- [x] 高级弹幕 by [@My-Responsitories](https://github.com/My-Responsitories)
|
||||
- [x] 取消/置顶评论
|
||||
- [x] 记笔记
|
||||
- [x] 多账号支持 by [@My-Responsitories](https://github.com/My-Responsitories)
|
||||
- [x] 屏蔽带货动态/评论
|
||||
- [x] 互动视频
|
||||
- [x] 发评/动态反诈
|
||||
- [x] 高能进度条
|
||||
- [x] 滑动跳转预览视频缩略图
|
||||
- [x] Live Photo
|
||||
- [x] 复制/移动/排序收藏夹/稍后再看视频
|
||||
- [x] 超分辨率
|
||||
- [x] 合并弹幕
|
||||
- [x] 会员彩色弹幕
|
||||
- [x] 播放全部/继续播放/倒序播放
|
||||
- [x] Cookie登录
|
||||
- [x] 显示视频分段信息
|
||||
- [x] 调节字幕大小
|
||||
- [x] 调节全屏弹幕大小
|
||||
@@ -59,7 +92,6 @@
|
||||
- [x] 评论楼中楼定位点击查看的评论
|
||||
- [x] 评论楼中楼按热度/时间排序
|
||||
- [x] 评论点踩
|
||||
- [x] 显示ops专栏
|
||||
- [x] 私信发图
|
||||
- [x] 投币动画
|
||||
- [x] 取消/追番,更新追番状态
|
||||
@@ -73,9 +105,9 @@
|
||||
- [x] 筛选搜索
|
||||
- [x] 转发动态
|
||||
- [x] 合集图片
|
||||
- [x] 删除/置顶私信
|
||||
- [x] 举报用户/评论/视频
|
||||
- [x] 删除/发布文本/图片动态
|
||||
- [x] 删除/置顶/撤回私信
|
||||
- [x] 举报用户/评论/视频/动态
|
||||
- [x] 删除/发布/置顶文本/图片动态
|
||||
- [x] 其他
|
||||
|
||||
## opt
|
||||
@@ -144,7 +176,6 @@
|
||||
- [x] 音质选择(视视频而定)
|
||||
- [x] 解码格式选择(视视频而定)
|
||||
- [x] 弹幕
|
||||
- [ ] 直播弹幕
|
||||
- [x] 字幕
|
||||
- [x] 记忆播放
|
||||
- [x] 视频比例:高度/宽度适应、填充、包含等
|
||||
|
||||
@@ -9,6 +9,14 @@
|
||||
# packages, and plugins designed to encourage good coding practices.
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
analyzer:
|
||||
exclude:
|
||||
- lib/grpc/bilibili/**
|
||||
- lib/grpc/google/**
|
||||
|
||||
formatter:
|
||||
trailing_commas: preserve
|
||||
|
||||
linter:
|
||||
# The lint rules applied to this project can be customized in the
|
||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||
@@ -21,9 +29,37 @@ linter:
|
||||
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||
# producing the lint.
|
||||
# https://dart.dev/tools/linter-rules
|
||||
rules:
|
||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||
|
||||
# - always_specify_types
|
||||
# - avoid_positional_boolean_parameters
|
||||
- always_declare_return_types
|
||||
- always_use_package_imports
|
||||
- avoid_empty_else
|
||||
- avoid_field_initializers_in_const_classes
|
||||
- avoid_print
|
||||
- avoid_relative_lib_imports
|
||||
- avoid_shadowing_type_parameters
|
||||
- avoid_single_cascade_in_expression_statements
|
||||
- avoid_slow_async_io
|
||||
- avoid_type_to_string
|
||||
- avoid_types_as_parameter_names
|
||||
- avoid_unnecessary_containers
|
||||
- avoid_void_async
|
||||
- await_only_futures
|
||||
- camel_case_extensions
|
||||
- camel_case_types
|
||||
- cancel_subscriptions
|
||||
- cascade_invocations
|
||||
- prefer_const_constructors
|
||||
- prefer_const_declarations
|
||||
- sized_box_for_whitespace
|
||||
- unnecessary_late
|
||||
- use_colored_box
|
||||
- use_decorated_box
|
||||
- use_named_constants
|
||||
- use_null_aware_elements
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
||||
|
||||
2
android/app/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/.cxx
|
||||
/build
|
||||
@@ -1,106 +0,0 @@
|
||||
plugins {
|
||||
id "com.android.application"
|
||||
id "kotlin-android"
|
||||
id "dev.flutter.flutter-gradle-plugin"
|
||||
}
|
||||
|
||||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
if (localPropertiesFile.exists()) {
|
||||
localPropertiesFile.withReader('UTF-8') { reader ->
|
||||
localProperties.load(reader)
|
||||
}
|
||||
}
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||
if (flutterVersionCode == null) {
|
||||
flutterVersionCode = '1'
|
||||
}
|
||||
|
||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||
if (flutterVersionName == null) {
|
||||
flutterVersionName = '1.0'
|
||||
}
|
||||
|
||||
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||
def keystoreProperties = new Properties()
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||
}
|
||||
|
||||
def _filePath = System.getenv("KEYSTORE") ?: keystoreProperties["storeFile"]
|
||||
def _storeFile = _filePath != null ? file(_filePath) : null
|
||||
def _storePassword = System.getenv("KEYSTORE_PASSWORD") ?: keystoreProperties["storePassword"]
|
||||
def _keyAlias = System.getenv("KEY_ALIAS") ?: keystoreProperties["keyAlias"]
|
||||
def _keyPassword = System.getenv("KEY_PASSWORD") ?: keystoreProperties["keyPassword"]
|
||||
|
||||
android {
|
||||
compileSdkVersion flutter.compileSdkVersion
|
||||
|
||||
namespace 'com.example.piliplus'
|
||||
ndkVersion flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.example.piliplus"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
minSdkVersion flutter.minSdkVersion
|
||||
multiDexEnabled true
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
// 添加签名配置
|
||||
if(_storeFile != null) {
|
||||
release {
|
||||
// 配置密钥库文件的位置、别名、密码等信息
|
||||
storeFile _storeFile
|
||||
storePassword _storePassword
|
||||
keyAlias _keyAlias
|
||||
keyPassword _keyPassword
|
||||
v1SigningEnabled true
|
||||
v2SigningEnabled true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
// TODO: Add your own signing config for the release build.
|
||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||
signingConfig _storeFile != null ? signingConfigs.release : signingConfigs.debug
|
||||
}
|
||||
debug {
|
||||
applicationIdSuffix ".debug"
|
||||
}
|
||||
}
|
||||
|
||||
project.android.applicationVariants.all { variant ->
|
||||
variant.outputs.each { output ->
|
||||
output.versionCodeOverride = variant.versionCode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
}
|
||||
81
android/app/build.gradle.kts
Normal file
@@ -0,0 +1,81 @@
|
||||
import com.android.build.gradle.internal.api.ApkVariantOutputImpl
|
||||
import org.jetbrains.kotlin.konan.properties.Properties
|
||||
|
||||
plugins {
|
||||
id("com.android.application")
|
||||
id("kotlin-android")
|
||||
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||
id("dev.flutter.flutter-gradle-plugin")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.example.piliplus"
|
||||
compileSdk = flutter.compileSdkVersion
|
||||
ndkVersion = flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = JavaVersion.VERSION_17.toString()
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "com.example.piliplus"
|
||||
minSdk = flutter.minSdkVersion
|
||||
targetSdk = flutter.targetSdkVersion
|
||||
versionCode = flutter.versionCode
|
||||
versionName = flutter.versionName
|
||||
}
|
||||
|
||||
packagingOptions {
|
||||
jniLibs {
|
||||
useLegacyPackaging = true
|
||||
}
|
||||
}
|
||||
|
||||
val keyProperties = Properties().also {
|
||||
val properties = rootProject.file("key.properties")
|
||||
if (properties.exists())
|
||||
it.load(properties.inputStream())
|
||||
}
|
||||
|
||||
val config = keyProperties.getProperty("storeFile")?.let {
|
||||
signingConfigs.create("release") {
|
||||
storeFile = file(it)
|
||||
storePassword = keyProperties.getProperty("storePassword")
|
||||
keyAlias = keyProperties.getProperty("keyAlias")
|
||||
keyPassword = keyProperties.getProperty("keyPassword")
|
||||
enableV1Signing = true
|
||||
enableV2Signing = true
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
all {
|
||||
signingConfig = config ?: signingConfigs["debug"]
|
||||
}
|
||||
// release {
|
||||
// proguardFiles(
|
||||
// getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||
// "proguard-rules.pro"
|
||||
// )
|
||||
// }
|
||||
debug {
|
||||
applicationIdSuffix = ".debug"
|
||||
}
|
||||
}
|
||||
|
||||
applicationVariants.all {
|
||||
val variant = this
|
||||
variant.outputs.forEach { output ->
|
||||
(output as ApkVariantOutputImpl).versionCodeOverride = flutter.versionCode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source = "../.."
|
||||
}
|
||||
1
android/app/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1 @@
|
||||
-keep class com.yalantis.ucrop.util.RectUtils { *; }
|
||||
@@ -1,132 +0,0 @@
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.example.piliplus">
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
the Flutter tool needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission
|
||||
android:name="android.permission.INTERNET"
|
||||
/>
|
||||
|
||||
<application
|
||||
android:label="PiliPlus Debug"
|
||||
tools:replace="android:label">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTask"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize"
|
||||
android:supportsPictureInPicture="true"
|
||||
android:resizeableActivity="true"
|
||||
>
|
||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||
the Android process has started. This theme is visible to the user
|
||||
while the Flutter UI initializes. After that, this theme continues
|
||||
to determine the Window background behind the Flutter UI. -->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.NormalTheme"
|
||||
android:resource="@style/NormalTheme"
|
||||
/>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
<intent-filter android:label="PiliPlus Debug">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="http"/>
|
||||
<data android:scheme="https"/>
|
||||
<data android:host="*.bilibili.com"/>
|
||||
<data android:host="*.bilibili.cn"/>
|
||||
<data android:host="*.bilibili.tv"/>
|
||||
<data android:host="bilibili.com"/>
|
||||
<data android:host="bilibili.cn"/>
|
||||
<data android:host="bilibili.tv"/>
|
||||
<data android:host="b23.tv" />
|
||||
<!--<data android:host="live.bilibili.com"/>-->
|
||||
<!--<data android:host="www.bilibili.com"/>-->
|
||||
<!--<data android:host="www.bilibili.tv"/>-->
|
||||
<!--<data android:host="www.bilibili.cn"/>-->
|
||||
<!--<data android:host="m.bilibili.cn"/>-->
|
||||
<!--<data android:host="m.bilibili.com"/>-->
|
||||
<!--<data android:host="bilibili.cn"/>-->
|
||||
<!--<data android:host="bilibili.com"/>-->
|
||||
<!--<data android:host="bangumi.bilibili.com"/>-->
|
||||
<!--<data android:host="space.bilibili.com"/>-->
|
||||
</intent-filter>
|
||||
<intent-filter android:label="PiliPlus Debug">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<action android:name="android.intent.action.SEARCH" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="bilibili"/>
|
||||
<data android:host="forward" />
|
||||
<data android:host="comment"
|
||||
android:pathPattern="/detail/.*/.*/.*" />
|
||||
<data android:host="uper" />
|
||||
<data android:host="article"
|
||||
android:pathPattern="/readlist" />
|
||||
<data android:host="advertise" android:path="/home" />
|
||||
<data android:host="clip" />
|
||||
<data android:host="search" />
|
||||
<data android:host="stardust-search" />
|
||||
<data android:host="music" />
|
||||
<data android:host="bangumi"
|
||||
android:pathPattern="/season.*" />
|
||||
<data android:host="bangumi" android:pathPattern="/.*" />
|
||||
<data android:host="pictureshow"
|
||||
android:pathPrefix="/creative_center" />
|
||||
<data android:host="cliparea" />
|
||||
<data android:host="im" />
|
||||
<data android:host="im" android:path="/notifications" />
|
||||
<data android:host="following" />
|
||||
<data android:host="following"
|
||||
android:pathPattern="/detail/.*" />
|
||||
<data android:host="following"
|
||||
android:path="/publishInfo/" />
|
||||
<data android:host="laser" android:pathPattern="/.*" />
|
||||
<data android:host="livearea" />
|
||||
<data android:host="live" />
|
||||
<data android:host="catalog" />
|
||||
<data android:host="browser" />
|
||||
<data android:host="user_center" />
|
||||
<data android:host="login" />
|
||||
<data android:host="space" />
|
||||
<data android:host="author" />
|
||||
<data android:host="tag" />
|
||||
<data android:host="rank" />
|
||||
<data android:host="external" />
|
||||
<data android:host="blank" />
|
||||
<data android:host="home" />
|
||||
<data android:host="root" />
|
||||
<data android:host="video" />
|
||||
<data android:host="story" />
|
||||
<data android:host="podcast" />
|
||||
<data android:host="search" />
|
||||
<data android:host="main" android:path="/favorite" />
|
||||
<data android:host="pgc" android:path="/theater/match" />
|
||||
<data android:host="pgc" android:path="/theater/square" />
|
||||
<data android:host="m.bilibili.com"
|
||||
android:path="/topic-detail" />
|
||||
<data android:host="article" />
|
||||
<data android:host="pegasus"
|
||||
android:pathPattern="/channel/v2/.*" />
|
||||
<data android:host="feed" android:pathPattern="/channel" />
|
||||
<data android:host="vip" />
|
||||
<data android:host="user_center" android:path="/vip" />
|
||||
<data android:host="history" />
|
||||
<data android:host="charge" android:path="/rank" />
|
||||
<data android:host="assistant" />
|
||||
<data android:host="assistant" />
|
||||
<data android:host="feedback" />
|
||||
<data android:host="auth" android:path="/launch" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="512dp"
|
||||
android:width="512dp"
|
||||
android:viewportWidth="512.0"
|
||||
android:viewportHeight="512.0">
|
||||
<path
|
||||
android:fillColor="#FF5CB67B"
|
||||
android:pathData="M456.65,256C456.65,366.81 366.81,456.65 256,456.65 145.19,456.65 55.35,366.81 55.35,256 55.35,145.18 145.19,55.35 256,55.35 366.81,55.35 456.65,145.18 456.65,256Z"
|
||||
android:strokeWidth="0.783784"
|
||||
android:fillType="evenOdd" />
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M270.04,256L156.1,256l15.61,-76.8h98.32c21.21,0 38.4,17.19 38.4,38.4 0,21.21 -17.19,38.4 -38.4,38.4zM270.04,128L202.46,128l-50.1,256h52.76l15.18,-76.8h49.73c49.49,0 89.6,-40.12 89.6,-89.6 0,-49.49 -40.11,-89.6 -89.6,-89.6z"
|
||||
android:fillType="evenOdd" />
|
||||
</vector>
|
||||
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#FF5CB67B</color>
|
||||
</resources>
|
||||
3
android/app/src/debug/res/values/string.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<string name="app_name">PiliPlus debug</string>
|
||||
</resources>
|
||||
@@ -36,14 +36,17 @@
|
||||
</queries>
|
||||
|
||||
<application
|
||||
android:label="PiliPlus"
|
||||
android:label="@string/app_name"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:enableOnBackInvokedCallback="true"
|
||||
android:enableOnBackInvokedCallback="false"
|
||||
android:allowBackup="false"
|
||||
android:fullBackupContent="false"
|
||||
tools:replace="android:allowBackup">
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.EnableImpeller"
|
||||
android:value="false" />
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
@@ -55,6 +58,9 @@
|
||||
android:supportsPictureInPicture="true"
|
||||
android:resizeableActivity="true"
|
||||
>
|
||||
|
||||
<meta-data android:name="flutter_deeplinking_enabled" android:value="false" />
|
||||
|
||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||
the Android process has started. This theme is visible to the user
|
||||
while the Flutter UI initializes. After that, this theme continues
|
||||
@@ -105,9 +111,10 @@
|
||||
android:pathPattern="/readlist" />
|
||||
<data android:host="advertise" android:path="/home" />
|
||||
<data android:host="clip" />
|
||||
<data android:host="search" />
|
||||
<data android:host="search" android:pathPattern=".*" />
|
||||
<data android:host="stardust-search" />
|
||||
<data android:host="music" />
|
||||
<data android:host="cheese" />
|
||||
<data android:host="bangumi"
|
||||
android:pathPattern="/season.*" />
|
||||
<data android:host="bangumi" android:pathPattern="/.*" />
|
||||
@@ -139,7 +146,6 @@
|
||||
<data android:host="video" />
|
||||
<data android:host="story" />
|
||||
<data android:host="podcast" />
|
||||
<data android:host="search" />
|
||||
<data android:host="main" android:path="/favorite" />
|
||||
<data android:host="pgc" android:path="/theater/match" />
|
||||
<data android:host="pgc" android:path="/theater/square" />
|
||||
@@ -154,7 +160,6 @@
|
||||
<data android:host="history" />
|
||||
<data android:host="charge" android:path="/rank" />
|
||||
<data android:host="assistant" />
|
||||
<data android:host="assistant" />
|
||||
<data android:host="feedback" />
|
||||
<data android:host="auth" android:path="/launch" />
|
||||
</intent-filter>
|
||||
@@ -172,7 +177,7 @@
|
||||
<activity
|
||||
android:name="com.yalantis.ucrop.UCropActivity"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
|
||||
android:theme="@style/Ucrop.CropTheme"/>
|
||||
|
||||
<receiver
|
||||
android:name="com.ryanheise.audioservice.MediaButtonReceiver"
|
||||
|
||||
BIN
android/app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
@@ -4,10 +4,13 @@ import io.flutter.embedding.android.FlutterActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import com.ryanheise.audioservice.AudioServiceActivity
|
||||
import android.content.ComponentName
|
||||
import android.content.Intent
|
||||
import android.content.res.Configuration
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.provider.Settings
|
||||
import android.view.WindowManager.LayoutParams
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
@@ -21,6 +24,55 @@ class MainActivity : AudioServiceActivity() {
|
||||
methodChannel.setMethodCallHandler { call, result ->
|
||||
if (call.method == "back") {
|
||||
back()
|
||||
} else if (call.method == "biliSendCommAntifraud") {
|
||||
try {
|
||||
val action = call.argument<Int>("action") ?: 0
|
||||
val oid = call.argument<Number>("oid") ?: 0L
|
||||
val type = call.argument<Int>("type") ?: 0
|
||||
val rpid = call.argument<Number>("rpid") ?: 0L
|
||||
val root = call.argument<Number>("root") ?: 0L
|
||||
val parent = call.argument<Number>("parent") ?: 0L
|
||||
val ctime = call.argument<Number>("ctime") ?: 0L
|
||||
val commentText = call.argument<String>("comment_text") ?: ""
|
||||
val pictures = call.argument<String?>("pictures")
|
||||
val sourceId = call.argument<String>("source_id") ?: ""
|
||||
val uid = call.argument<Number>("uid") ?: 0L
|
||||
val cookies = call.argument<List<String>>("cookies") ?: emptyList<String>()
|
||||
|
||||
val intent = Intent().apply {
|
||||
component = ComponentName("icu.freedomIntrovert.biliSendCommAntifraud", "icu.freedomIntrovert.biliSendCommAntifraud.ByXposedLaunchedActivity")
|
||||
putExtra("action", action)
|
||||
putExtra("oid", oid.toLong())
|
||||
putExtra("type", type)
|
||||
putExtra("rpid", rpid.toLong())
|
||||
putExtra("root", root.toLong())
|
||||
putExtra("parent", parent.toLong())
|
||||
putExtra("ctime", ctime.toLong())
|
||||
putExtra("comment_text", commentText)
|
||||
if(pictures != null)
|
||||
putExtra("pictures", pictures)
|
||||
putExtra("source_id", sourceId)
|
||||
putExtra("uid", uid.toLong())
|
||||
putStringArrayListExtra("cookies", ArrayList(cookies))
|
||||
}
|
||||
startActivity(intent)
|
||||
} catch (e: Exception) {}
|
||||
} else if (call.method == "linkVerifySettings") {
|
||||
try {
|
||||
val intent = Intent(android.provider.Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
|
||||
Uri.parse("package:" + context.packageName))
|
||||
context.startActivity(intent)
|
||||
} catch (t: Throwable) {
|
||||
try {
|
||||
val intent = Intent("android.intent.action.MAIN", Uri.parse("package:" + context.packageName))
|
||||
intent.setClassName("com.android.settings", "com.android.settings.applications.InstalledAppOpenByDefaultActivity")
|
||||
context.startActivity(intent)
|
||||
} catch (t2: Throwable) {
|
||||
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
|
||||
Uri.parse("package:" + context.packageName))
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result.notImplemented()
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 8.8 KiB |
@@ -1,16 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="512dp"
|
||||
android:width="512dp"
|
||||
android:viewportWidth="512.0"
|
||||
android:viewportHeight="512.0">
|
||||
android:height="108dp"
|
||||
android:width="108dp"
|
||||
android:viewportWidth="108.0"
|
||||
android:viewportHeight="108.0">
|
||||
<path
|
||||
android:fillColor="#FF5CB67B"
|
||||
android:pathData="M456.65,256C456.65,366.81 366.81,456.65 256,456.65 145.19,456.65 55.35,366.81 55.35,256 55.35,145.18 145.19,55.35 256,55.35 366.81,55.35 456.65,145.18 456.65,256Z"
|
||||
android:strokeWidth="0.783784"
|
||||
android:fillColor="@color/ic_launcher_foreground"
|
||||
android:pathData="M56,54L39.78,54l2.22,-10.94h14c3.02,0 5.47,2.45 5.47,5.47 0,3.02 -2.45,5.47 -5.47,5.47zM56,35.77h-9.62l-7.13,36.45h7.51L48.92,61.29h7.08c7.05,0 12.76,-5.71 12.76,-12.76 0,-7.05 -5.71,-12.76 -12.76,-12.76z"
|
||||
android:fillType="evenOdd" />
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M270.04,256L156.1,256l15.61,-76.8h98.32c21.21,0 38.4,17.19 38.4,38.4 0,21.21 -17.19,38.4 -38.4,38.4zM270.04,128L202.46,128l-50.1,256h52.76l15.18,-76.8h49.73c49.49,0 89.6,-40.12 89.6,-89.6 0,-49.49 -40.11,-89.6 -89.6,-89.6z"
|
||||
android:fillType="evenOdd" />
|
||||
</vector>
|
||||
</vector>
|
||||
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="512dp"
|
||||
android:width="512dp"
|
||||
android:viewportWidth="512.0"
|
||||
android:viewportHeight="512.0">
|
||||
<path
|
||||
android:fillColor="#FF5CB67B"
|
||||
android:pathData="M456.65,256C456.65,366.81 366.81,456.65 256,456.65 145.19,456.65 55.35,366.81 55.35,256 55.35,145.18 145.19,55.35 256,55.35 366.81,55.35 456.65,145.18 456.65,256Z"
|
||||
android:strokeWidth="0.783784"
|
||||
android:fillType="evenOdd" />
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M270.04,256L156.1,256l15.61,-76.8h98.32c21.21,0 38.4,17.19 38.4,38.4 0,21.21 -17.19,38.4 -38.4,38.4zM270.04,128L202.46,128l-50.1,256h52.76l15.18,-76.8h49.73c49.49,0 89.6,-40.12 89.6,-89.6 0,-49.49 -40.11,-89.6 -89.6,-89.6z"
|
||||
android:fillType="evenOdd" />
|
||||
</vector>
|
||||
@@ -2,15 +2,11 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="24dp"
|
||||
android:width="24dp"
|
||||
android:viewportWidth="512.0"
|
||||
android:viewportHeight="512.0">
|
||||
android:viewportWidth="108.0"
|
||||
android:viewportHeight="108.0">
|
||||
<path
|
||||
android:fillColor="#FF5CB67B"
|
||||
android:pathData="M456.65,256C456.65,366.81 366.81,456.65 256,456.65 145.19,456.65 55.35,366.81 55.35,256 55.35,145.18 145.19,55.35 256,55.35 366.81,55.35 456.65,145.18 456.65,256Z"
|
||||
android:strokeWidth="0.783784"
|
||||
android:fillType="evenOdd" />
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M270.04,256L156.1,256l15.61,-76.8h98.32c21.21,0 38.4,17.19 38.4,38.4 0,21.21 -17.19,38.4 -38.4,38.4zM270.04,128L202.46,128l-50.1,256h52.76l15.18,-76.8h49.73c49.49,0 89.6,-40.12 89.6,-89.6 0,-49.49 -40.11,-89.6 -89.6,-89.6z"
|
||||
android:pathData="M57.54,54L28.82,54l3.93,-19.36h24.78c5.35,0 9.68,4.33 9.68,9.68 0,5.35 -4.33,9.68 -9.68,9.68zM57.54,21.73L40.5,21.73L27.88,86.27h13.3l3.83,-19.36h12.54c12.48,0 22.59,-10.11 22.59,-22.59 0,-12.48 -10.11,-22.59 -22.59,-22.59z"
|
||||
android:strokeWidth="0.252073"
|
||||
android:fillType="evenOdd" />
|
||||
</vector>
|
||||
|
||||
@@ -1,14 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground>
|
||||
<inset
|
||||
android:drawable="@drawable/ic_launcher_foreground"
|
||||
android:inset="16%" />
|
||||
</foreground>
|
||||
<monochrome>
|
||||
<inset
|
||||
android:drawable="@drawable/ic_launcher_monochrome"
|
||||
android:inset="16%" />
|
||||
</monochrome>
|
||||
</adaptive-icon>
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 914 B |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 3.4 KiB |
3
android/app/src/main/res/raw/keep.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:keep="@drawable/*" />
|
||||
5
android/app/src/main/res/values-night-v31/colors.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_foreground">@android:color/system_accent1_100</color>
|
||||
<color name="ic_launcher_background">@android:color/system_neutral1_800</color>
|
||||
</resources>
|
||||
5
android/app/src/main/res/values-v31/colors.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_foreground">@android:color/system_neutral2_700</color>
|
||||
<color name="ic_launcher_background">@android:color/system_accent1_100</color>
|
||||
</resources>
|
||||
8
android/app/src/main/res/values-v35/styles.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="Ucrop.CropTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<item name="android:windowLightStatusBar">true</item>
|
||||
<item name="android:fitsSystemWindows">true</item>
|
||||
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#FF5CB67B</color>
|
||||
<color name="ic_launcher_foreground">#FF5CB67B</color>
|
||||
<color name="ic_launcher_background">#FFFFFFFF</color>
|
||||
</resources>
|
||||
3
android/app/src/main/res/values/string.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<string name="app_name">PiliPlus</string>
|
||||
</resources>
|
||||
@@ -21,4 +21,6 @@
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="o_mr1">shortEdges</item>
|
||||
</style>
|
||||
|
||||
<style name="Ucrop.CropTheme" parent="Theme.AppCompat.Light.NoActionBar"/>
|
||||
</resources>
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
allprojects {
|
||||
repositories {
|
||||
maven { url "https://maven.aliyun.com/repository/google" }
|
||||
maven { url "https://maven.aliyun.com/repository/central" }
|
||||
maven { url "https://maven.aliyun.com/repository/jcenter" }
|
||||
maven { url "https://maven.aliyun.com/repository/public" }
|
||||
maven { url "http://download.flutter.io"
|
||||
allowInsecureProtocol = true
|
||||
}
|
||||
google()
|
||||
mavenCentral()
|
||||
maven { url 'https://jitpack.io' }
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.buildDir = '../build'
|
||||
subprojects {
|
||||
afterEvaluate { project ->
|
||||
if (project.extensions.findByName("android") != null) {
|
||||
Integer pluginCompileSdk = project.android.compileSdk
|
||||
if (pluginCompileSdk != null && pluginCompileSdk < 31) {
|
||||
project.logger.error(
|
||||
"Warning: Overriding compileSdk version in Flutter plugin: "
|
||||
+ project.name
|
||||
+ " from "
|
||||
+ pluginCompileSdk
|
||||
+ " to 31 (to work around https://issuetracker.google.com/issues/199180389)."
|
||||
+ "\nIf there is not a new version of " + project.name + ", consider filing an issue against "
|
||||
+ project.name
|
||||
+ " to increase their compileSdk to the latest (otherwise try updating to the latest version)."
|
||||
)
|
||||
project.android {
|
||||
compileSdk 31
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
tasks.register("clean", Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
67
android/build.gradle.kts
Normal file
@@ -0,0 +1,67 @@
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
val newBuildDir: Directory =
|
||||
rootProject.layout.buildDirectory
|
||||
.dir("../../build")
|
||||
.get()
|
||||
rootProject.layout.buildDirectory.value(newBuildDir)
|
||||
|
||||
subprojects {
|
||||
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
|
||||
project.layout.buildDirectory.value(newSubprojectBuildDir)
|
||||
}
|
||||
|
||||
subprojects {
|
||||
afterEvaluate {
|
||||
if (project.extensions.findByName("android") != null) {
|
||||
val androidExtension =
|
||||
project.extensions.getByName("android") as com.android.build.gradle.BaseExtension
|
||||
|
||||
if (androidExtension.namespace == null) {
|
||||
androidExtension.namespace = project.group.toString()
|
||||
}
|
||||
|
||||
androidExtension.compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
project.tasks.withType<KotlinCompile>().configureEach {
|
||||
kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
}
|
||||
|
||||
val pluginCompileSdkStr = androidExtension.compileSdkVersion
|
||||
val pluginCompileSdk = pluginCompileSdkStr
|
||||
?.removePrefix("android-")
|
||||
?.toIntOrNull()
|
||||
if (pluginCompileSdk != null && pluginCompileSdk < 31) {
|
||||
project.logger.error(
|
||||
"Warning: Overriding compileSdk version in Flutter plugin: ${project.name} " +
|
||||
"from $pluginCompileSdk to 31 (to work around https://issuetracker.google.com/issues/199180389).\n" +
|
||||
"If there is not a new version of ${project.name}, consider filing an issue against ${project.name} " +
|
||||
"to increase their compileSdk to the latest (otherwise try updating to the latest version)."
|
||||
)
|
||||
androidExtension.setCompileSdkVersion(31)
|
||||
}
|
||||
}
|
||||
|
||||
project.buildDir = File(rootProject.buildDir, project.name)
|
||||
}
|
||||
}
|
||||
|
||||
subprojects {
|
||||
project.evaluationDependsOn(":app")
|
||||
}
|
||||
|
||||
tasks.register<Delete>("clean") {
|
||||
delete(rootProject.layout.buildDirectory)
|
||||
}
|
||||
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
pluginManagement {
|
||||
def flutterSdkPath = {
|
||||
def properties = new Properties()
|
||||
file("local.properties").withInputStream { properties.load(it) }
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
return flutterSdkPath
|
||||
}()
|
||||
|
||||
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
|
||||
|
||||
repositories {
|
||||
maven { url "https://maven.aliyun.com/repository/google" }
|
||||
maven { url "https://maven.aliyun.com/repository/central" }
|
||||
maven { url "https://maven.aliyun.com/repository/jcenter" }
|
||||
maven { url "https://maven.aliyun.com/repository/public" }
|
||||
maven { url "http://download.flutter.io"
|
||||
allowInsecureProtocol = true
|
||||
}
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "7.2.0" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.9.22" apply false
|
||||
}
|
||||
|
||||
include ":app"
|
||||
26
android/settings.gradle.kts
Normal file
@@ -0,0 +1,26 @@
|
||||
pluginManagement {
|
||||
val flutterSdkPath =
|
||||
run {
|
||||
val properties = java.util.Properties()
|
||||
file("local.properties").inputStream().use { properties.load(it) }
|
||||
val flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
|
||||
flutterSdkPath
|
||||
}
|
||||
|
||||
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
|
||||
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
|
||||
id("com.android.application") version "8.9.1" apply false
|
||||
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
|
||||
}
|
||||
|
||||
include(":app")
|
||||
BIN
assets/fonts/custom_icon.ttf
Normal file
BIN
assets/fonts/digital_id_num.ttf
Normal file
BIN
assets/images/live/live.gif
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
assets/images/logo/logo_2.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
assets/images/logo/logo_3.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 514 B After Width: | Height: | Size: 915 B |
|
Before Width: | Height: | Size: 524 B After Width: | Height: | Size: 876 B |
|
Before Width: | Height: | Size: 518 B After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 541 B After Width: | Height: | Size: 991 B |
|
Before Width: | Height: | Size: 498 B After Width: | Height: | Size: 912 B |
|
Before Width: | Height: | Size: 539 B After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 517 B After Width: | Height: | Size: 1.1 KiB |
BIN
assets/images/lv/lv6_s.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
assets/images/paycoins/ic_panel_close.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 45 KiB |
BIN
assets/images/topic-header-bg.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
assets/images/trending_banner.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
@@ -2,6 +2,8 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>FlutterDeepLinkingEnabled</key>
|
||||
<false/>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
import 'package:PiliPlus/http/constants.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class StyleString {
|
||||
static const double cardSpace = 8;
|
||||
static const double safeSpace = 12;
|
||||
static BorderRadius mdRadius = BorderRadius.circular(10);
|
||||
static const BorderRadius mdRadius = BorderRadius.all(imgRadius);
|
||||
static const Radius imgRadius = Radius.circular(10);
|
||||
static const double aspectRatio = 16 / 10;
|
||||
static const bottomSheetRadius = BorderRadius.only(
|
||||
topLeft: Radius.circular(18),
|
||||
topRight: Radius.circular(18),
|
||||
);
|
||||
}
|
||||
|
||||
class Constants {
|
||||
@@ -21,34 +26,56 @@ class Constants {
|
||||
static const String traceId =
|
||||
'11111111111111111111111111111111:1111111111111111:0:0';
|
||||
static const String userAgent =
|
||||
'Mozilla/5.0 BiliDroid/1.46.2 (bbcallen@gmail.com) os/android model/vivo mobi_app/android_hd build/2001100 channel/yingyongbao innerVer/2001100 osVer/14 network/2';
|
||||
'Mozilla/5.0 BiliDroid/2.0.1 (bbcallen@gmail.com) os/android model/android_hd mobi_app/android_hd build/2001100 channel/master innerVer/2001100 osVer/15 network/2';
|
||||
static const String statistics =
|
||||
'%7B%22appId%22%3A5%2C%22platform%22%3A3%2C%22version%22%3A%221.46.2%22%2C%22abtest%22%3A%22%22%7D';
|
||||
//Uri.encodeComponent('{"appId": 5,"platform": 3,"version": "1.46.2","abtest": ""}');
|
||||
'{"appId":5,"platform":3,"version":"2.0.1","abtest":""}';
|
||||
// 请求时会自动encodeComponent
|
||||
|
||||
// 超分辨率滤镜
|
||||
// app
|
||||
static const String userAgentApp =
|
||||
'Mozilla/5.0 BiliDroid/8.43.0 (bbcallen@gmail.com) os/android model/android mobi_app/android build/8430300 channel/master innerVer/8430300 osVer/15 network/2';
|
||||
|
||||
static const String statisticsApp =
|
||||
'{"appId":1,"platform":3,"version":"8.43.0","abtest":""}';
|
||||
|
||||
static const baseHeaders = {
|
||||
'connection': 'keep-alive',
|
||||
'accept-encoding': 'br,gzip',
|
||||
'referer': HttpString.baseUrl,
|
||||
'env': 'prod',
|
||||
'app-key': 'android64',
|
||||
'x-bili-aurora-zone': 'sh001',
|
||||
};
|
||||
|
||||
static final urlRegex = RegExp(
|
||||
r'https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]',
|
||||
);
|
||||
|
||||
static const goodsUrlPrefix = "https://gaoneng.bilibili.com/tetris";
|
||||
|
||||
// 超分辨率滤镜
|
||||
static const List<String> mpvAnime4KShaders = [
|
||||
'Anime4K_Clamp_Highlights.glsl',
|
||||
'Anime4K_Restore_CNN_VL.glsl',
|
||||
'Anime4K_Upscale_CNN_x2_VL.glsl',
|
||||
'Anime4K_AutoDownscalePre_x2.glsl',
|
||||
'Anime4K_AutoDownscalePre_x4.glsl',
|
||||
'Anime4K_Upscale_CNN_x2_M.glsl'
|
||||
'Anime4K_Upscale_CNN_x2_M.glsl',
|
||||
];
|
||||
|
||||
// 超分辨率滤镜 (轻量)
|
||||
static const List<String> mpvAnime4KShadersLite = [
|
||||
static const mpvAnime4KShadersLite = [
|
||||
'Anime4K_Clamp_Highlights.glsl',
|
||||
'Anime4K_Restore_CNN_M.glsl',
|
||||
'Anime4K_Restore_CNN_S.glsl',
|
||||
'Anime4K_Upscale_CNN_x2_M.glsl',
|
||||
'Anime4K_AutoDownscalePre_x2.glsl',
|
||||
'Anime4K_AutoDownscalePre_x4.glsl',
|
||||
'Anime4K_Upscale_CNN_x2_S.glsl'
|
||||
'Anime4K_Upscale_CNN_x2_S.glsl',
|
||||
];
|
||||
|
||||
//内容来自 https://passport.bilibili.com/web/generic/country/list
|
||||
static const List<Map<String, dynamic>> internationalDialingPrefix = [
|
||||
static List<Map<String, dynamic>> get internationalDialingPrefix => [
|
||||
{"id": 1, "cname": "中国大陆", "country_id": "86"},
|
||||
{"id": 5, "cname": "中国香港特别行政区", "country_id": "852"},
|
||||
{"id": 2, "cname": "中国澳门特别行政区", "country_id": "853"},
|
||||
@@ -263,6 +290,6 @@ class Constants {
|
||||
{"id": 84, "cname": "海地", "country_id": "509"},
|
||||
{"id": 83, "cname": "关岛", "country_id": "1671"},
|
||||
{"id": 82, "cname": "瓜德罗普岛", "country_id": "590"},
|
||||
{"id": 69, "cname": "菲律宾", "country_id": "63"}
|
||||
{"id": 69, "cname": "菲律宾", "country_id": "63"},
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:PiliPlus/utils/global_data.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'skeleton.dart';
|
||||
|
||||
class DynamicCardSkeleton extends StatelessWidget {
|
||||
const DynamicCardSkeleton({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final ThemeData theme = Theme.of(context);
|
||||
final color = theme.colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: Container(
|
||||
padding: const EdgeInsets.only(left: 12, right: 12, top: 12),
|
||||
@@ -13,7 +16,7 @@ class DynamicCardSkeleton extends StatelessWidget {
|
||||
border: Border(
|
||||
bottom: BorderSide(
|
||||
width: 8,
|
||||
color: Theme.of(context).dividerColor.withOpacity(0.05),
|
||||
color: theme.dividerColor.withValues(alpha: 0.05),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -25,8 +28,8 @@ class DynamicCardSkeleton extends StatelessWidget {
|
||||
width: 40,
|
||||
height: 40,
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
color: color,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(20)),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
@@ -34,18 +37,18 @@ class DynamicCardSkeleton extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
width: 100,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
width: 50,
|
||||
height: 11,
|
||||
),
|
||||
],
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
Container(
|
||||
@@ -55,31 +58,31 @@ class DynamicCardSkeleton extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
width: double.infinity,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 7),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
width: double.infinity,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 7),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
width: 300,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 7),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
width: 250,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 7),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
width: 100,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 7),
|
||||
@@ -87,6 +90,7 @@ class DynamicCardSkeleton extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
if (GlobalData().dynamicsWaterfallFlow) const Spacer(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
@@ -99,21 +103,20 @@ class DynamicCardSkeleton extends StatelessWidget {
|
||||
),
|
||||
style: TextButton.styleFrom(
|
||||
padding: const EdgeInsets.fromLTRB(15, 0, 15, 0),
|
||||
foregroundColor: Theme.of(context)
|
||||
.colorScheme
|
||||
.outline
|
||||
.withOpacity(0.2),
|
||||
foregroundColor: theme.colorScheme.outline.withValues(
|
||||
alpha: 0.2,
|
||||
),
|
||||
),
|
||||
label: Text(
|
||||
i == 0
|
||||
? '转发'
|
||||
: i == 1
|
||||
? '评论'
|
||||
: '点赞',
|
||||
? '评论'
|
||||
: '点赞',
|
||||
),
|
||||
)
|
||||
),
|
||||
],
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
66
lib/common/skeleton/fav_pgc_item.dart
Normal file
@@ -0,0 +1,66 @@
|
||||
import 'package:PiliPlus/common/constants.dart';
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class FavPgcItemSkeleton extends StatelessWidget {
|
||||
const FavPgcItemSkeleton({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final color = Theme.of(context).colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: StyleString.safeSpace,
|
||||
vertical: 5,
|
||||
),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
AspectRatio(
|
||||
aspectRatio: 3 / 4,
|
||||
child: LayoutBuilder(
|
||||
builder: (context, boxConstraints) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: color,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(4)),
|
||||
),
|
||||
width: boxConstraints.maxWidth,
|
||||
height: boxConstraints.maxHeight,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
width: 175,
|
||||
height: 12,
|
||||
color: color,
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
Container(
|
||||
width: 55,
|
||||
height: 11,
|
||||
color: color,
|
||||
),
|
||||
const SizedBox(height: 5),
|
||||
Container(
|
||||
width: 35,
|
||||
height: 11,
|
||||
color: color,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,31 +1,35 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:PiliPlus/common/constants.dart';
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'skeleton.dart';
|
||||
|
||||
class MediaBangumiSkeleton extends StatefulWidget {
|
||||
const MediaBangumiSkeleton({super.key});
|
||||
class MediaPgcSkeleton extends StatefulWidget {
|
||||
const MediaPgcSkeleton({super.key});
|
||||
|
||||
@override
|
||||
State<MediaBangumiSkeleton> createState() => _MediaBangumiSkeletonState();
|
||||
State<MediaPgcSkeleton> createState() => _MediaPgcSkeletonState();
|
||||
}
|
||||
|
||||
class _MediaBangumiSkeletonState extends State<MediaBangumiSkeleton> {
|
||||
class _MediaPgcSkeletonState extends State<MediaPgcSkeleton> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Color bgColor = Theme.of(context).colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(
|
||||
StyleString.safeSpace, 7, StyleString.safeSpace, 7),
|
||||
StyleString.safeSpace,
|
||||
7,
|
||||
StyleString.safeSpace,
|
||||
7,
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 111,
|
||||
height: 148,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(6)),
|
||||
color: bgColor),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(6)),
|
||||
color: bgColor,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
Expanded(
|
||||
@@ -35,25 +39,25 @@ class _MediaBangumiSkeletonState extends State<MediaBangumiSkeleton> {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: bgColor,
|
||||
width: 200,
|
||||
height: 20,
|
||||
margin: const EdgeInsets.only(bottom: 15),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: bgColor,
|
||||
width: 150,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: bgColor,
|
||||
width: 150,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: bgColor,
|
||||
width: 150,
|
||||
height: 13,
|
||||
),
|
||||
@@ -62,9 +66,10 @@ class _MediaBangumiSkeletonState extends State<MediaBangumiSkeleton> {
|
||||
width: 90,
|
||||
height: 35,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius:
|
||||
const BorderRadius.all(Radius.circular(20)),
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
borderRadius: const BorderRadius.all(
|
||||
Radius.circular(20),
|
||||
),
|
||||
color: bgColor,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
53
lib/common/skeleton/msg_feed_sys_msg_.dart
Normal file
@@ -0,0 +1,53 @@
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class MsgFeedSysMsgSkeleton extends StatelessWidget {
|
||||
const MsgFeedSysMsgSkeleton({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final color = Theme.of(context).colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
width: 125,
|
||||
height: 16,
|
||||
color: color,
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
height: 12,
|
||||
color: color,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
height: 12,
|
||||
color: color,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Container(
|
||||
width: 100,
|
||||
height: 12,
|
||||
color: color,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Container(
|
||||
width: 100,
|
||||
height: 10,
|
||||
color: color,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
36
lib/common/skeleton/msg_feed_top.dart
Normal file
@@ -0,0 +1,36 @@
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class MsgFeedTopSkeleton extends StatelessWidget {
|
||||
const MsgFeedTopSkeleton({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final color = Theme.of(context).colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: ListTile(
|
||||
leading: Container(
|
||||
width: 45,
|
||||
height: 45,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: color,
|
||||
),
|
||||
),
|
||||
title: UnconstrainedBox(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Container(
|
||||
width: 100,
|
||||
height: 11,
|
||||
color: color,
|
||||
),
|
||||
),
|
||||
subtitle: Container(
|
||||
color: color,
|
||||
width: 125,
|
||||
height: 11,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -10,11 +10,12 @@ class Skeleton extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final color = Theme.of(context).colorScheme.surface.withAlpha(10);
|
||||
var shimmerGradient = LinearGradient(
|
||||
colors: [
|
||||
Colors.transparent,
|
||||
Theme.of(context).colorScheme.surface.withAlpha(10),
|
||||
Theme.of(context).colorScheme.surface.withAlpha(10),
|
||||
color,
|
||||
color,
|
||||
Colors.transparent,
|
||||
],
|
||||
stops: const [
|
||||
@@ -73,14 +74,14 @@ class ShimmerState extends State<Shimmer> with SingleTickerProviderStateMixin {
|
||||
}
|
||||
|
||||
LinearGradient get gradient => LinearGradient(
|
||||
colors: widget.linearGradient.colors,
|
||||
stops: widget.linearGradient.stops,
|
||||
begin: widget.linearGradient.begin,
|
||||
end: widget.linearGradient.end,
|
||||
transform: _SlidingGradientTransform(
|
||||
slidePercent: _shimmerController.value,
|
||||
),
|
||||
);
|
||||
colors: widget.linearGradient.colors,
|
||||
stops: widget.linearGradient.stops,
|
||||
begin: widget.linearGradient.begin,
|
||||
end: widget.linearGradient.end,
|
||||
transform: _SlidingGradientTransform(
|
||||
slidePercent: _shimmerController.value,
|
||||
),
|
||||
);
|
||||
|
||||
bool get isSized =>
|
||||
(context.findRenderObject() as RenderBox?)?.hasSize ?? false;
|
||||
@@ -99,7 +100,7 @@ class ShimmerState extends State<Shimmer> with SingleTickerProviderStateMixin {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return widget.child ?? const SizedBox();
|
||||
return widget.child ?? const SizedBox.shrink();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +166,7 @@ class _ShimmerLoadingState extends State<ShimmerLoading> {
|
||||
|
||||
final shimmer = Shimmer.of(context)!;
|
||||
if (!shimmer.isSized) {
|
||||
return const SizedBox();
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
final shimmerSize = shimmer.size;
|
||||
final gradient = shimmer.gradient;
|
||||
|
||||
51
lib/common/skeleton/space_opus.dart
Normal file
@@ -0,0 +1,51 @@
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:PiliPlus/utils/utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class SpaceOpusSkeleton extends StatelessWidget {
|
||||
const SpaceOpusSkeleton({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final surface = Theme.of(context).colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: Card(
|
||||
clipBehavior: Clip.hardEdge,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(6)),
|
||||
),
|
||||
child: LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
height:
|
||||
(0.68 + 0.82 * Utils.random.nextDouble()) *
|
||||
constraints.maxWidth,
|
||||
color: surface,
|
||||
),
|
||||
Container(
|
||||
height: 10,
|
||||
color: surface,
|
||||
margin: const EdgeInsets.all(10),
|
||||
width: constraints.maxWidth * 0.7,
|
||||
),
|
||||
Container(
|
||||
height: 10,
|
||||
color: surface,
|
||||
margin: const EdgeInsets.only(
|
||||
left: 10,
|
||||
right: 10,
|
||||
bottom: 10,
|
||||
),
|
||||
width: constraints.maxWidth,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,93 +1,79 @@
|
||||
import 'package:PiliPlus/common/constants.dart';
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'skeleton.dart';
|
||||
|
||||
class VideoCardHSkeleton extends StatelessWidget {
|
||||
const VideoCardHSkeleton({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final color = Theme.of(context).colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: StyleString.safeSpace,
|
||||
vertical: 5,
|
||||
),
|
||||
child: LayoutBuilder(
|
||||
builder: (context, boxConstraints) {
|
||||
double width =
|
||||
(boxConstraints.maxWidth - StyleString.cardSpace * 6) / 2;
|
||||
return SizedBox(
|
||||
height: width / StyleString.aspectRatio,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
AspectRatio(
|
||||
aspectRatio: StyleString.aspectRatio,
|
||||
child: LayoutBuilder(
|
||||
builder: (context, boxConstraints) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color:
|
||||
Theme.of(context).colorScheme.onInverseSurface,
|
||||
borderRadius: StyleString.mdRadius,
|
||||
),
|
||||
);
|
||||
},
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
AspectRatio(
|
||||
aspectRatio: StyleString.aspectRatio,
|
||||
child: LayoutBuilder(
|
||||
builder: (context, boxConstraints) {
|
||||
return DecoratedBox(
|
||||
decoration: BoxDecoration(
|
||||
color: color,
|
||||
borderRadius: StyleString.mdRadius,
|
||||
),
|
||||
),
|
||||
// VideoContent(videoItem: videoItem)
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(10, 4, 6, 4),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(10, 4, 6, 4),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
color: color,
|
||||
width: 200,
|
||||
height: 11,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
),
|
||||
Container(
|
||||
color: color,
|
||||
width: 150,
|
||||
height: 13,
|
||||
),
|
||||
const Spacer(),
|
||||
Container(
|
||||
color: color,
|
||||
width: 100,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
width: 200,
|
||||
height: 11,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
color: color,
|
||||
width: 40,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(right: 8),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
width: 150,
|
||||
color: color,
|
||||
width: 40,
|
||||
height: 13,
|
||||
),
|
||||
const Spacer(),
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
width: 100,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onInverseSurface,
|
||||
width: 40,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(right: 8),
|
||||
),
|
||||
Container(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onInverseSurface,
|
||||
width: 40,
|
||||
height: 13,
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
)),
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import 'package:PiliPlus/common/constants.dart';
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'skeleton.dart';
|
||||
|
||||
class VideoCardVSkeleton extends StatelessWidget {
|
||||
const VideoCardVSkeleton({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final color = Theme.of(context).colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: Column(
|
||||
children: [
|
||||
@@ -14,9 +15,9 @@ class VideoCardVSkeleton extends StatelessWidget {
|
||||
aspectRatio: StyleString.aspectRatio,
|
||||
child: LayoutBuilder(
|
||||
builder: (context, boxConstraints) {
|
||||
return Container(
|
||||
return DecoratedBox(
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
borderRadius: StyleString.mdRadius,
|
||||
),
|
||||
);
|
||||
@@ -37,24 +38,24 @@ class VideoCardVSkeleton extends StatelessWidget {
|
||||
width: 200,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
),
|
||||
Container(
|
||||
width: 150,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 12),
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
),
|
||||
Container(
|
||||
width: 110,
|
||||
height: 13,
|
||||
margin: const EdgeInsets.only(bottom: 5),
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
),
|
||||
Container(
|
||||
width: 75,
|
||||
height: 13,
|
||||
color: Theme.of(context).colorScheme.onInverseSurface,
|
||||
color: color,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'skeleton.dart';
|
||||
|
||||
class VideoReplySkeleton extends StatelessWidget {
|
||||
const VideoReplySkeleton({super.key});
|
||||
@@ -26,17 +26,20 @@ class VideoReplySkeleton extends StatelessWidget {
|
||||
width: 80,
|
||||
height: 13,
|
||||
color: bgColor,
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
margin:
|
||||
const EdgeInsets.only(top: 4, left: 57, right: 6, bottom: 6),
|
||||
margin: const EdgeInsets.only(
|
||||
top: 4,
|
||||
left: 57,
|
||||
right: 6,
|
||||
bottom: 6,
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
width: 300,
|
||||
@@ -72,9 +75,9 @@ class VideoReplySkeleton extends StatelessWidget {
|
||||
margin: const EdgeInsets.only(bottom: 4),
|
||||
color: bgColor,
|
||||
),
|
||||
const SizedBox(width: 8)
|
||||
const SizedBox(width: 8),
|
||||
],
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
41
lib/common/skeleton/whisper_item.dart
Normal file
@@ -0,0 +1,41 @@
|
||||
import 'package:PiliPlus/common/skeleton/skeleton.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class WhisperItemSkeleton extends StatelessWidget {
|
||||
const WhisperItemSkeleton({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final color = Theme.of(context).colorScheme.onInverseSurface;
|
||||
return Skeleton(
|
||||
child: ListTile(
|
||||
leading: Container(
|
||||
width: 45,
|
||||
height: 45,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: color,
|
||||
),
|
||||
),
|
||||
title: UnconstrainedBox(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Container(
|
||||
width: 100,
|
||||
height: 11,
|
||||
color: color,
|
||||
),
|
||||
),
|
||||
subtitle: Container(
|
||||
color: color,
|
||||
width: 125,
|
||||
height: 11,
|
||||
),
|
||||
trailing: Container(
|
||||
color: color,
|
||||
width: 50,
|
||||
height: 11,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
import 'package:PiliPlus/common/widgets/no_splash_factory.dart';
|
||||
import 'package:PiliPlus/common/widgets/overlay_pop.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AnimatedDialog extends StatefulWidget {
|
||||
const AnimatedDialog({
|
||||
super.key,
|
||||
required this.videoItem,
|
||||
required this.closeFn,
|
||||
});
|
||||
|
||||
final dynamic videoItem;
|
||||
final Function closeFn;
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => AnimatedDialogState();
|
||||
}
|
||||
|
||||
class AnimatedDialogState extends State<AnimatedDialog>
|
||||
with SingleTickerProviderStateMixin {
|
||||
late AnimationController controller;
|
||||
late Animation<double> opacityAnimation;
|
||||
late Animation<double> scaleAnimation;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
controller = AnimationController(
|
||||
vsync: this, duration: const Duration(milliseconds: 255));
|
||||
opacityAnimation = Tween<double>(begin: 0.0, end: 0.6)
|
||||
.animate(CurvedAnimation(parent: controller, curve: Curves.linear));
|
||||
scaleAnimation = CurvedAnimation(parent: controller, curve: Curves.linear);
|
||||
controller.addListener(() => setState(() {}));
|
||||
controller.forward();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller.removeListener(() {});
|
||||
controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void closeFn() async {
|
||||
await controller.reverse();
|
||||
widget.closeFn();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Material(
|
||||
color: Colors.black.withOpacity(opacityAnimation.value),
|
||||
child: InkWell(
|
||||
highlightColor: Colors.transparent,
|
||||
splashColor: Colors.transparent,
|
||||
splashFactory: NoSplashFactory(),
|
||||
onTap: closeFn,
|
||||
child: Center(
|
||||
child: FadeTransition(
|
||||
opacity: scaleAnimation,
|
||||
child: ScaleTransition(
|
||||
scale: scaleAnimation,
|
||||
child: OverlayPop(
|
||||
videoItem: widget.videoItem,
|
||||
closeFn: closeFn,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,351 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
const double _kPanelHeaderCollapsedHeight = kMinInteractiveDimension;
|
||||
|
||||
class _SaltedKey<S, V> extends LocalKey {
|
||||
const _SaltedKey(this.salt, this.value);
|
||||
|
||||
final S salt;
|
||||
final V value;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (other.runtimeType != runtimeType) return false;
|
||||
return other is _SaltedKey<S, V> &&
|
||||
other.salt == salt &&
|
||||
other.value == value;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, salt, value);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
final String saltString = S == String ? "<'$salt'>" : '<$salt>';
|
||||
final String valueString = V == String ? "<'$value'>" : '<$value>';
|
||||
return '[$saltString $valueString]';
|
||||
}
|
||||
}
|
||||
|
||||
class AppExpansionPanelList extends StatefulWidget {
|
||||
/// Creates an expansion panel list widget. The [expansionCallback] is
|
||||
/// triggered when an expansion panel expand/collapse button is pushed.
|
||||
///
|
||||
/// The [children] and [animationDuration] arguments must not be null.
|
||||
const AppExpansionPanelList({
|
||||
super.key,
|
||||
required this.children,
|
||||
this.expansionCallback,
|
||||
this.animationDuration = kThemeAnimationDuration,
|
||||
this.expandedHeaderPadding = EdgeInsets.zero,
|
||||
this.dividerColor,
|
||||
this.elevation = 2,
|
||||
}) : _allowOnlyOnePanelOpen = false,
|
||||
initialOpenPanelValue = null;
|
||||
|
||||
/// The children of the expansion panel list. They are laid out in a similar
|
||||
/// fashion to [ListBody].
|
||||
final List<AppExpansionPanel> children;
|
||||
|
||||
/// The callback that gets called whenever one of the expand/collapse buttons
|
||||
/// is pressed. The arguments passed to the callback are the index of the
|
||||
/// pressed panel and whether the panel is currently expanded or not.
|
||||
///
|
||||
/// If AppExpansionPanelList.radio is used, the callback may be called a
|
||||
/// second time if a different panel was previously open. The arguments
|
||||
/// passed to the second callback are the index of the panel that will close
|
||||
/// and false, marking that it will be closed.
|
||||
///
|
||||
/// For AppExpansionPanelList, the callback needs to setState when it's notified
|
||||
/// about the closing/opening panel. On the other hand, the callback for
|
||||
/// AppExpansionPanelList.radio is simply meant to inform the parent widget of
|
||||
/// changes, as the radio panels' open/close states are managed internally.
|
||||
///
|
||||
/// This callback is useful in order to keep track of the expanded/collapsed
|
||||
/// panels in a parent widget that may need to react to these changes.
|
||||
final ExpansionPanelCallback? expansionCallback;
|
||||
|
||||
/// The duration of the expansion animation.
|
||||
final Duration animationDuration;
|
||||
|
||||
// Whether multiple panels can be open simultaneously
|
||||
final bool _allowOnlyOnePanelOpen;
|
||||
|
||||
/// The value of the panel that initially begins open. (This value is
|
||||
/// only used when initializing with the [AppExpansionPanelList.radio]
|
||||
/// constructor.)
|
||||
final Object? initialOpenPanelValue;
|
||||
|
||||
/// The padding that surrounds the panel header when expanded.
|
||||
///
|
||||
/// By default, 16px of space is added to the header vertically (above and below)
|
||||
/// during expansion.
|
||||
final EdgeInsets expandedHeaderPadding;
|
||||
|
||||
/// Defines color for the divider when [AppExpansionPanel.isExpanded] is false.
|
||||
///
|
||||
/// If `dividerColor` is null, then [DividerThemeData.color] is used. If that
|
||||
/// is null, then [ThemeData.dividerColor] is used.
|
||||
final Color? dividerColor;
|
||||
|
||||
/// Defines elevation for the [AppExpansionPanel] while it's expanded.
|
||||
///
|
||||
/// By default, the value of elevation is 2.
|
||||
final double elevation;
|
||||
|
||||
@override
|
||||
State<AppExpansionPanelList> createState() => _AppExpansionPanelListState();
|
||||
}
|
||||
|
||||
class _AppExpansionPanelListState extends State<AppExpansionPanelList> {
|
||||
ExpansionPanelRadio? _currentOpenPanel;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
if (widget._allowOnlyOnePanelOpen) {
|
||||
assert(_allIdentifiersUnique(),
|
||||
'All ExpansionPanelRadio identifier values must be unique.');
|
||||
if (widget.initialOpenPanelValue != null) {
|
||||
_currentOpenPanel = searchPanelByValue(
|
||||
widget.children.cast<ExpansionPanelRadio>(),
|
||||
widget.initialOpenPanelValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(AppExpansionPanelList oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
|
||||
if (widget._allowOnlyOnePanelOpen) {
|
||||
assert(_allIdentifiersUnique(),
|
||||
'All ExpansionPanelRadio identifier values must be unique.');
|
||||
// If the previous widget was non-radio AppExpansionPanelList, initialize the
|
||||
// open panel to widget.initialOpenPanelValue
|
||||
if (!oldWidget._allowOnlyOnePanelOpen) {
|
||||
_currentOpenPanel = searchPanelByValue(
|
||||
widget.children.cast<ExpansionPanelRadio>(),
|
||||
widget.initialOpenPanelValue);
|
||||
}
|
||||
} else {
|
||||
_currentOpenPanel = null;
|
||||
}
|
||||
}
|
||||
|
||||
bool _allIdentifiersUnique() {
|
||||
final Map<Object, bool> identifierMap = <Object, bool>{};
|
||||
for (final ExpansionPanelRadio child
|
||||
in widget.children.cast<ExpansionPanelRadio>()) {
|
||||
identifierMap[child.value] = true;
|
||||
}
|
||||
return identifierMap.length == widget.children.length;
|
||||
}
|
||||
|
||||
bool _isChildExpanded(int index) {
|
||||
if (widget._allowOnlyOnePanelOpen) {
|
||||
final ExpansionPanelRadio radioWidget =
|
||||
widget.children[index] as ExpansionPanelRadio;
|
||||
return _currentOpenPanel?.value == radioWidget.value;
|
||||
}
|
||||
return widget.children[index].isExpanded;
|
||||
}
|
||||
|
||||
void _handlePressed(bool isExpanded, int index) {
|
||||
widget.expansionCallback?.call(index, isExpanded);
|
||||
|
||||
if (widget._allowOnlyOnePanelOpen) {
|
||||
final ExpansionPanelRadio pressedChild =
|
||||
widget.children[index] as ExpansionPanelRadio;
|
||||
|
||||
// If another ExpansionPanelRadio was already open, apply its
|
||||
// expansionCallback (if any) to false, because it's closing.
|
||||
for (int childIndex = 0;
|
||||
childIndex < widget.children.length;
|
||||
childIndex += 1) {
|
||||
final ExpansionPanelRadio child =
|
||||
widget.children[childIndex] as ExpansionPanelRadio;
|
||||
if (widget.expansionCallback != null &&
|
||||
childIndex != index &&
|
||||
child.value == _currentOpenPanel?.value) {
|
||||
widget.expansionCallback?.call(childIndex, false);
|
||||
}
|
||||
}
|
||||
|
||||
setState(() {
|
||||
_currentOpenPanel = isExpanded ? null : pressedChild;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ExpansionPanelRadio? searchPanelByValue(
|
||||
List<ExpansionPanelRadio> panels, Object? value) {
|
||||
for (final ExpansionPanelRadio panel in panels) {
|
||||
if (panel.value == value) return panel;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
assert(
|
||||
kElevationToShadow.containsKey(widget.elevation),
|
||||
'Invalid value for elevation. See the kElevationToShadow constant for'
|
||||
' possible elevation values.',
|
||||
);
|
||||
|
||||
final List<MergeableMaterialItem> items = <MergeableMaterialItem>[];
|
||||
|
||||
for (int index = 0; index < widget.children.length; index += 1) {
|
||||
//todo: Uncomment to add gap between selected panels
|
||||
/*if (_isChildExpanded(index) && index != 0 && !_isChildExpanded(index - 1))
|
||||
items.add(MaterialGap(key: _SaltedKey<BuildContext, int>(context, index * 2 - 1)));*/
|
||||
|
||||
final AppExpansionPanel child = widget.children[index];
|
||||
final Widget headerWidget = child.headerBuilder(
|
||||
context,
|
||||
_isChildExpanded(index),
|
||||
);
|
||||
|
||||
Widget? expandIconContainer = ExpandIcon(
|
||||
isExpanded: _isChildExpanded(index),
|
||||
onPressed: !child.canTapOnHeader
|
||||
? (bool isExpanded) => _handlePressed(isExpanded, index)
|
||||
: null,
|
||||
);
|
||||
if (!child.canTapOnHeader) {
|
||||
final MaterialLocalizations localizations =
|
||||
MaterialLocalizations.of(context);
|
||||
expandIconContainer = Semantics(
|
||||
label: _isChildExpanded(index)
|
||||
? localizations.expandedIconTapHint
|
||||
: localizations.collapsedIconTapHint,
|
||||
container: true,
|
||||
child: expandIconContainer,
|
||||
);
|
||||
}
|
||||
|
||||
final iconContainer = child.iconBuilder;
|
||||
if (iconContainer != null) {
|
||||
expandIconContainer = iconContainer(
|
||||
expandIconContainer,
|
||||
_isChildExpanded(index),
|
||||
);
|
||||
}
|
||||
|
||||
Widget header = Row(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: AnimatedContainer(
|
||||
duration: widget.animationDuration,
|
||||
curve: Curves.fastOutSlowIn,
|
||||
margin: _isChildExpanded(index)
|
||||
? widget.expandedHeaderPadding
|
||||
: EdgeInsets.zero,
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
minHeight: _kPanelHeaderCollapsedHeight),
|
||||
child: headerWidget,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (expandIconContainer != null) expandIconContainer,
|
||||
],
|
||||
);
|
||||
if (child.canTapOnHeader) {
|
||||
header = MergeSemantics(
|
||||
child: InkWell(
|
||||
onTap: () => _handlePressed(_isChildExpanded(index), index),
|
||||
child: header,
|
||||
),
|
||||
);
|
||||
}
|
||||
items.add(
|
||||
MaterialSlice(
|
||||
key: _SaltedKey<BuildContext, int>(context, index * 2),
|
||||
color: child.backgroundColor,
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
header,
|
||||
AnimatedCrossFade(
|
||||
firstChild: Container(height: 0.0),
|
||||
secondChild: child.body,
|
||||
firstCurve:
|
||||
const Interval(0.0, 0.6, curve: Curves.fastOutSlowIn),
|
||||
secondCurve:
|
||||
const Interval(0.4, 1.0, curve: Curves.fastOutSlowIn),
|
||||
sizeCurve: Curves.fastOutSlowIn,
|
||||
crossFadeState: _isChildExpanded(index)
|
||||
? CrossFadeState.showSecond
|
||||
: CrossFadeState.showFirst,
|
||||
duration: widget.animationDuration,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
if (_isChildExpanded(index) && index != widget.children.length - 1) {
|
||||
items.add(MaterialGap(
|
||||
key: _SaltedKey<BuildContext, int>(context, index * 2 + 1)));
|
||||
}
|
||||
}
|
||||
|
||||
return MergeableMaterial(
|
||||
hasDividers: true,
|
||||
dividerColor: widget.dividerColor,
|
||||
elevation: widget.elevation,
|
||||
children: items,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
typedef ExpansionPanelIconBuilder = Widget? Function(
|
||||
Widget child,
|
||||
bool isExpanded,
|
||||
);
|
||||
|
||||
class AppExpansionPanel {
|
||||
/// Creates an expansion panel to be used as a child for [ExpansionPanelList].
|
||||
/// See [ExpansionPanelList] for an example on how to use this widget.
|
||||
///
|
||||
/// The [headerBuilder], [body], and [isExpanded] arguments must not be null.
|
||||
AppExpansionPanel({
|
||||
required this.headerBuilder,
|
||||
required this.body,
|
||||
this.iconBuilder,
|
||||
this.isExpanded = false,
|
||||
this.canTapOnHeader = false,
|
||||
this.backgroundColor,
|
||||
});
|
||||
|
||||
/// The widget builder that builds the expansion panels' header.
|
||||
final ExpansionPanelHeaderBuilder headerBuilder;
|
||||
|
||||
/// The widget builder that builds the expansion panels' icon.
|
||||
///
|
||||
/// If not pass any function, then default icon will be displayed.
|
||||
///
|
||||
/// If builder function return null, then icon will not displayed.
|
||||
final ExpansionPanelIconBuilder? iconBuilder;
|
||||
|
||||
/// The body of the expansion panel that's displayed below the header.
|
||||
///
|
||||
/// This widget is visible only when the panel is expanded.
|
||||
final Widget body;
|
||||
|
||||
/// Whether the panel is expanded.
|
||||
///
|
||||
/// Defaults to false.
|
||||
final bool isExpanded;
|
||||
|
||||
/// Whether tapping on the panel's header will expand/collapse it.
|
||||
///
|
||||
/// Defaults to false.
|
||||
final bool canTapOnHeader;
|
||||
|
||||
/// Defines the background color of the panel.
|
||||
///
|
||||
/// Defaults to [ThemeData.cardColor].
|
||||
final Color? backgroundColor;
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppBarWidget extends StatelessWidget implements PreferredSizeWidget {
|
||||
const AppBarWidget({
|
||||
required this.child,
|
||||
required this.controller,
|
||||
required this.visible,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final PreferredSizeWidget child;
|
||||
final AnimationController controller;
|
||||
final bool visible;
|
||||
|
||||
@override
|
||||
Size get preferredSize => child.preferredSize;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
visible ? controller.reverse() : controller.forward();
|
||||
return SlideTransition(
|
||||
position: Tween<Offset>(
|
||||
begin: Offset.zero,
|
||||
end: const Offset(0, -1),
|
||||
).animate(CurvedAnimation(
|
||||
parent: controller,
|
||||
curve: Curves.easeInOutBack,
|
||||
)),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
}
|
||||