Compare commits
626 Commits
dev_3.3_BL
...
dev_v3.13.
| Author | SHA1 | Date |
|---|---|---|
|
|
8e3f20794d | 8 months ago |
|
|
c1dae542c9 | 10 months ago |
|
|
220c954a4a | 10 months ago |
|
|
303e9114a3 | 11 months ago |
|
|
fff45cd3a8 | 11 months ago |
|
|
1ee86d0813 | 11 months ago |
|
|
0c3ef15895 | 11 months ago |
|
|
f7599a47e7 | 11 months ago |
|
|
a0528da4cd | 11 months ago |
|
|
cb68731679 | 11 months ago |
|
|
f56a1627db | 11 months ago |
|
|
260edfa303 | 11 months ago |
|
|
5fc939bf1e | 11 months ago |
|
|
f621f8c8d1 | 11 months ago |
|
|
f8a66a58f8 | 11 months ago |
|
|
57415bd670 | 11 months ago |
|
|
390455e5a2 | 11 months ago |
|
|
ec96fecf2f | 11 months ago |
|
|
bdcda02b26 | 11 months ago |
|
|
68eab7639c | 11 months ago |
|
|
cb7a444d83 | 11 months ago |
|
|
c1212c2c6a | 11 months ago |
|
|
4564b42018 | 11 months ago |
|
|
d921b1d081 | 11 months ago |
|
|
b308079255 | 11 months ago |
|
|
7a821a4604 | 11 months ago |
|
|
a2dd8f2e35 | 11 months ago |
|
|
4cde49cb51 | 11 months ago |
|
|
bbf18baade | 11 months ago |
|
|
2e9f6bcb51 | 11 months ago |
|
|
8d23ea6fda | 12 months ago |
|
|
9074bf2e65 | 12 months ago |
|
|
b46eb6214e | 12 months ago |
|
|
4b40d5d5a0 | 12 months ago |
|
|
5dbd97aa46 | 12 months ago |
|
|
556ff02e64 | 12 months ago |
|
|
e3b75b18c8 | 12 months ago |
|
|
cb8eb316ec | 12 months ago |
|
|
159135bb77 | 12 months ago |
|
|
88cd6f811a | 12 months ago |
|
|
ca965a6d06 | 12 months ago |
|
|
e6fcb1fddf | 12 months ago |
|
|
951a5a4932 | 12 months ago |
|
|
ae4c287af2 | 12 months ago |
|
|
8ffcebc44e | 12 months ago |
|
|
9590d268a0 | 1 year ago |
|
|
a1600dbfce | 1 year ago |
|
|
0dc32e061f | 1 year ago |
|
|
d865bd9c3b | 1 year ago |
|
|
7842f95d7b | 1 year ago |
|
|
e876eaaa33 | 1 year ago |
|
|
d4c741e1ec | 1 year ago |
|
|
21fda7987a | 1 year ago |
|
|
e5198f093a | 1 year ago |
|
|
e2efc3749c | 1 year ago |
|
|
91b9e792c6 | 1 year ago |
|
|
c2785c5f68 | 1 year ago |
|
|
7ed401fb1c | 1 year ago |
|
|
0706d9f5f9 | 1 year ago |
|
|
889828d4d4 | 1 year ago |
|
|
8b74c9df61 | 1 year ago |
|
|
e66e42edda | 1 year ago |
|
|
b93d373c6f | 1 year ago |
|
|
2c746bf783 | 1 year ago |
|
|
81ddb81b8e | 1 year ago |
|
|
3bf1e3fceb | 1 year ago |
|
|
08965c72c8 | 1 year ago |
|
|
b445d1d59e | 1 year ago |
|
|
1080a59106 | 1 year ago |
|
|
2c5be020e9 | 1 year ago |
|
|
7d33ace5c9 | 1 year ago |
|
|
f74a3301da | 1 year ago |
|
|
744e3978d3 | 1 year ago |
|
|
a24582a578 | 1 year ago |
|
|
04413aa7d6 | 1 year ago |
|
|
6cf86e2e84 | 1 year ago |
|
|
06192292d0 | 1 year ago |
|
|
2a37777b9a | 1 year ago |
|
|
c2f38f1b7f | 1 year ago |
|
|
2ab0d0b682 | 1 year ago |
|
|
0221cb1250 | 1 year ago |
|
|
d98f2c31a2 | 1 year ago |
|
|
7cafe3aaa9 | 1 year ago |
|
|
11b83d1276 | 1 year ago |
|
|
c77ffb1730 | 1 year ago |
|
|
780f645cbe | 1 year ago |
|
|
a31c677919 | 1 year ago |
|
|
95a4d8dd14 | 1 year ago |
|
|
880611f7bb | 1 year ago |
|
|
e9accb00ef | 1 year ago |
|
|
62bc29d450 | 1 year ago |
|
|
bd3dca6719 | 1 year ago |
|
|
59335ac04d | 1 year ago |
|
|
8509c3d94d | 1 year ago |
|
|
c4de4c1bd9 | 1 year ago |
|
|
b677be9e3c | 1 year ago |
|
|
ff7afe5997 | 1 year ago |
|
|
4bfaf0a0d8 | 1 year ago |
|
|
21b2fae806 | 1 year ago |
|
|
f52aed49fd | 1 year ago |
|
|
c6787ff966 | 1 year ago |
|
|
615f3bfa8e | 1 year ago |
|
|
cd460ee31b | 1 year ago |
|
|
229efb2e25 | 1 year ago |
|
|
c72892b1a6 | 1 year ago |
|
|
32cf61d1bf | 1 year ago |
|
|
b5eaedb721 | 1 year ago |
|
|
3f22d69058 | 1 year ago |
|
|
0e73d6d23e | 1 year ago |
|
|
e0de0768b6 | 1 year ago |
|
|
ab33d06b91 | 1 year ago |
|
|
6f0f422adf | 1 year ago |
|
|
65d7f3f9b9 | 1 year ago |
|
|
d474eb9a24 | 1 year ago |
|
|
9909cfaa57 | 1 year ago |
|
|
291cf16d22 | 1 year ago |
|
|
baa7790b89 | 1 year ago |
|
|
545cfcd6d9 | 1 year ago |
|
|
924c111771 | 1 year ago |
|
|
cfcba179c4 | 1 year ago |
|
|
b80e171d25 | 1 year ago |
|
|
1561a776e3 | 1 year ago |
|
|
cd7da0dd70 | 1 year ago |
|
|
21403a2bba | 1 year ago |
|
|
849164be2c | 1 year ago |
|
|
931e748a54 | 1 year ago |
|
|
dff03796e9 | 1 year ago |
|
|
c58cbae99c | 1 year ago |
|
|
1cadee754e | 1 year ago |
|
|
20bfdc3652 | 1 year ago |
|
|
091f3b0830 | 1 year ago |
|
|
8e46738982 | 1 year ago |
|
|
0bdfa9157b | 1 year ago |
|
|
41b0e65e41 | 1 year ago |
|
|
068b6c8494 | 1 year ago |
|
|
f58e07d789 | 1 year ago |
|
|
7188919172 | 1 year ago |
|
|
82de56266e | 1 year ago |
|
|
d9b4b1575d | 1 year ago |
|
|
2997f49a95 | 1 year ago |
|
|
6386da8936 | 1 year ago |
|
|
9d444ccca3 | 1 year ago |
|
|
71542e9db6 | 1 year ago |
|
|
6a555ace41 | 1 year ago |
|
|
42dbe066fd | 1 year ago |
|
|
18b4fc5317 | 1 year ago |
|
|
14a5fec61a | 1 year ago |
|
|
3d44aa2e64 | 1 year ago |
|
|
3071a20b8a | 1 year ago |
|
|
c6ee01c652 | 1 year ago |
|
|
605f02afe2 | 1 year ago |
|
|
073cb9f7e8 | 1 year ago |
|
|
cee903dd6b | 1 year ago |
|
|
7ddd932c51 | 1 year ago |
|
|
34ffec93fd | 1 year ago |
|
|
a6ee6869cc | 1 year ago |
|
|
81b94814ce | 1 year ago |
|
|
ecd4422905 | 1 year ago |
|
|
fb13096f94 | 1 year ago |
|
|
05abea2d53 | 1 year ago |
|
|
fe9d259cbd | 1 year ago |
|
|
b042292f9a | 1 year ago |
|
|
69493934b1 | 1 year ago |
|
|
057994dfd2 | 1 year ago |
|
|
936682ff95 | 1 year ago |
|
|
cf72ffe9ce | 1 year ago |
|
|
8cc1e08421 | 1 year ago |
|
|
8862cc6c06 | 1 year ago |
|
|
1e98539537 | 2 years ago |
|
|
fd70387b2d | 2 years ago |
|
|
ef36e8bd30 | 2 years ago |
|
|
06c0580d84 | 2 years ago |
|
|
03e5604f68 | 2 years ago |
|
|
e4d0b93c9f | 2 years ago |
|
|
7b4a98bbb9 | 2 years ago |
|
|
f80892b630 | 2 years ago |
|
|
633059b0be | 2 years ago |
|
|
b64cf0bf6c | 2 years ago |
|
|
faeba6a14c | 2 years ago |
|
|
e14dc10c1c | 2 years ago |
|
|
92ccbaa2b5 | 2 years ago |
|
|
49c11537b3 | 2 years ago |
|
|
db91921de1 | 2 years ago |
|
|
88940d2c54 | 2 years ago |
|
|
c6e74e73d0 | 2 years ago |
|
|
3aaaf3c01c | 2 years ago |
|
|
5883b06fcb | 2 years ago |
|
|
e045c375d2 | 2 years ago |
|
|
2b293d3c96 | 2 years ago |
|
|
f42223292a | 2 years ago |
|
|
6c98f9f94f | 2 years ago |
|
|
536c95c825 | 2 years ago |
|
|
b6ba9fff2f | 2 years ago |
|
|
dc17576c26 | 2 years ago |
|
|
6f0cfebc89 | 2 years ago |
|
|
21c29e6355 | 2 years ago |
|
|
b6adfb2534 | 2 years ago |
|
|
1c66351011 | 2 years ago |
|
|
e193568aaf | 2 years ago |
|
|
771b20f21c | 2 years ago |
|
|
60a35032e5 | 2 years ago |
|
|
145cd6010a | 2 years ago |
|
|
7065b00c5c | 2 years ago |
|
|
e27594d017 | 2 years ago |
|
|
72d459ce10 | 2 years ago |
|
|
ae7fbbfb98 | 2 years ago |
|
|
94c3992c8d | 2 years ago |
|
|
f83d538472 | 2 years ago |
|
|
7ca806571f | 2 years ago |
|
|
787a3d8662 | 2 years ago |
|
|
1ee19ac696 | 2 years ago |
|
|
e996653253 | 2 years ago |
|
|
05d0d2d5a7 | 2 years ago |
|
|
6efb316377 | 2 years ago |
|
|
2d82b97680 | 2 years ago |
|
|
29830f4f55 | 2 years ago |
|
|
cba8369a51 | 2 years ago |
|
|
a5d68bf470 | 2 years ago |
|
|
87c7dcb68a | 2 years ago |
|
|
029f174a6c | 2 years ago |
|
|
96b7fea5c9 | 2 years ago |
|
|
1e8953538a | 2 years ago |
|
|
147fb6cee8 | 2 years ago |
|
|
76545bd152 | 2 years ago |
|
|
393ea45d2c | 2 years ago |
|
|
6d2484e6ac | 2 years ago |
|
|
f714d17686 | 2 years ago |
|
|
f8d797f80a | 2 years ago |
|
|
98389e3f68 | 2 years ago |
|
|
9f629afb9c | 2 years ago |
|
|
f36fc4d88d | 2 years ago |
|
|
d3d8d1f121 | 2 years ago |
|
|
50ba0372db | 2 years ago |
|
|
34778d91d7 | 2 years ago |
|
|
baaacdb2f8 | 2 years ago |
|
|
0eb0a94f48 | 2 years ago |
|
|
cab1854cce | 2 years ago |
|
|
a39d2840e0 | 2 years ago |
|
|
66ec7b5ca4 | 2 years ago |
|
|
ed037edf22 | 2 years ago |
|
|
8838eb4769 | 2 years ago |
|
|
5e8fe20f52 | 2 years ago |
|
|
b1432280a1 | 2 years ago |
|
|
fb4cf08b89 | 2 years ago |
|
|
11a43eb0ae | 2 years ago |
|
|
53015422e5 | 2 years ago |
|
|
43741e24cf | 2 years ago |
|
|
0eaeb75207 | 2 years ago |
|
|
82e933a06f | 2 years ago |
|
|
4c5ba6048f | 2 years ago |
|
|
1b545c4d0b | 2 years ago |
|
|
ca8533190a | 2 years ago |
|
|
adf00e101f | 2 years ago |
|
|
31aa09e35b | 2 years ago |
|
|
d65325f998 | 2 years ago |
|
|
554548bc9a | 2 years ago |
|
|
9501c2ea9a | 2 years ago |
|
|
984459d314 | 2 years ago |
|
|
b3f2904e9a | 2 years ago |
|
|
1094d297f4 | 2 years ago |
|
|
52e63fe5e4 | 2 years ago |
|
|
d0e743dcc9 | 2 years ago |
|
|
f6b89e1ae6 | 2 years ago |
|
|
752d5e5944 | 2 years ago |
|
|
4dc0a3f6c2 | 2 years ago |
|
|
84159656b6 | 2 years ago |
|
|
8a319cc2f2 | 2 years ago |
|
|
8f9882fc5c | 2 years ago |
|
|
88d79367ba | 2 years ago |
|
|
de5317ae55 | 2 years ago |
|
|
8edf65daf1 | 2 years ago |
|
|
c948a1780c | 2 years ago |
|
|
be4022cee5 | 2 years ago |
|
|
e9404f1656 | 2 years ago |
|
|
2b560840aa | 2 years ago |
|
|
02878b7df9 | 2 years ago |
|
|
0ef716f536 | 2 years ago |
|
|
2e25940b62 | 2 years ago |
|
|
515896c265 | 2 years ago |
|
|
76f5fc2ef8 | 2 years ago |
|
|
69ed32917f | 2 years ago |
|
|
5b7b40c732 | 2 years ago |
|
|
6c9ab32d98 | 2 years ago |
|
|
c97fd25cdd | 2 years ago |
|
|
e962469c7e | 2 years ago |
|
|
d9cf383648 | 2 years ago |
|
|
9a0a658083 | 2 years ago |
|
|
3a64858905 | 2 years ago |
|
|
f65fe26fd2 | 2 years ago |
|
|
3a65113149 | 2 years ago |
|
|
f5df1b1d01 | 2 years ago |
|
|
704d691816 | 2 years ago |
|
|
51bbc42ca9 | 2 years ago |
|
|
21e4bb5138 | 2 years ago |
|
|
9c957741b4 | 2 years ago |
|
|
011f5b1f57 | 2 years ago |
|
|
eefdb1fa3e | 2 years ago |
|
|
582f1f1566 | 2 years ago |
|
|
29c2fd067e | 2 years ago |
|
|
8441a0ef00 | 2 years ago |
|
|
0588e68c67 | 2 years ago |
|
|
672d0b7e8c | 2 years ago |
|
|
9a102be7c7 | 2 years ago |
|
|
96d5c3ce1d | 2 years ago |
|
|
5f90435442 | 2 years ago |
|
|
6e30df2a29 | 2 years ago |
|
|
4c0d758dd1 | 2 years ago |
|
|
9ab10eebce | 2 years ago |
|
|
d1b13d5ce9 | 2 years ago |
|
|
a4a638aa37 | 2 years ago |
|
|
c9be715436 | 2 years ago |
|
|
69e64fd5fb | 2 years ago |
|
|
f8e7ccf73f | 2 years ago |
|
|
7b181192f6 | 2 years ago |
|
|
e18ba6822a | 2 years ago |
|
|
660ec3a207 | 2 years ago |
|
|
52a5e978a7 | 2 years ago |
|
|
3dffb26aee | 2 years ago |
|
|
5e9d08b9aa | 2 years ago |
|
|
08b4c8f86e | 2 years ago |
|
|
968e59707e | 2 years ago |
|
|
99e2edea31 | 2 years ago |
|
|
2ebaed4841 | 2 years ago |
|
|
d6dacfb743 | 2 years ago |
|
|
5256d8873f | 2 years ago |
|
|
fe37de9621 | 2 years ago |
|
|
63f5f7890e | 2 years ago |
|
|
eee2ccf148 | 2 years ago |
|
|
727a9f1363 | 2 years ago |
|
|
e0c9914206 | 2 years ago |
|
|
7fc47ebf34 | 2 years ago |
|
|
162b2fd22a | 2 years ago |
|
|
64568edc01 | 2 years ago |
|
|
d255ada2ea | 2 years ago |
|
|
b6d222a7ea | 2 years ago |
|
|
b42c47f074 | 2 years ago |
|
|
0e04012219 | 2 years ago |
|
|
a4ed832147 | 2 years ago |
|
|
e0ae8d7c8e | 2 years ago |
|
|
d4519e1507 | 2 years ago |
|
|
001417f9b3 | 2 years ago |
|
|
357f0f8c24 | 2 years ago |
|
|
a12558076f | 2 years ago |
|
|
46ad672649 | 2 years ago |
|
|
735582e3ab | 2 years ago |
|
|
6983e309e0 | 2 years ago |
|
|
6e558bf5a6 | 2 years ago |
|
|
90dc8e5e05 | 2 years ago |
|
|
32757c85f8 | 2 years ago |
|
|
180cc43705 | 2 years ago |
|
|
cb79d625d1 | 2 years ago |
|
|
30b57ff5f0 | 2 years ago |
|
|
ccdf410995 | 2 years ago |
|
|
9043e3c687 | 2 years ago |
|
|
e28805f70f | 2 years ago |
|
|
b4138b2066 | 2 years ago |
|
|
c65d668c92 | 2 years ago |
|
|
3792a67ae7 | 2 years ago |
|
|
7850748ea2 | 2 years ago |
|
|
30c14c2167 | 2 years ago |
|
|
0168f06bb9 | 2 years ago |
|
|
1b0961a08f | 2 years ago |
|
|
c29e2c88f0 | 2 years ago |
|
|
eb1bddf772 | 2 years ago |
|
|
f1a74749f7 | 2 years ago |
|
|
bbc42bd1e7 | 2 years ago |
|
|
d3bdcfa975 | 2 years ago |
|
|
48202ffd12 | 2 years ago |
|
|
bea15150aa | 2 years ago |
|
|
ec0bed04d3 | 2 years ago |
|
|
fe7c2c6873 | 2 years ago |
|
|
ac52ba75a7 | 2 years ago |
|
|
98a5b7d049 | 2 years ago |
|
|
27ed5c95f2 | 2 years ago |
|
|
e67bd54c04 | 2 years ago |
|
|
b39357a497 | 2 years ago |
|
|
63621b5fed | 2 years ago |
|
|
cd8b76a374 | 2 years ago |
|
|
e1718270eb | 2 years ago |
|
|
e6d093a84c | 2 years ago |
|
|
86d3e03c06 | 2 years ago |
|
|
37aa700b2e | 2 years ago |
|
|
e5d8505c2d | 2 years ago |
|
|
4b28581c55 | 2 years ago |
|
|
75bfeaa716 | 2 years ago |
|
|
27b6e04d33 | 2 years ago |
|
|
3401496739 | 2 years ago |
|
|
86f5e81fea | 2 years ago |
|
|
d0c7b08eac | 2 years ago |
|
|
fddb423451 | 2 years ago |
|
|
aa04e943ef | 2 years ago |
|
|
98a2545a9b | 2 years ago |
|
|
c1fbce7eae | 2 years ago |
|
|
cfa341aba5 | 2 years ago |
|
|
4ac11b2169 | 2 years ago |
|
|
e4ce158277 | 2 years ago |
|
|
4338da513d | 2 years ago |
|
|
52b3c196d6 | 2 years ago |
|
|
704c0bbbc6 | 2 years ago |
|
|
fe665fd5ae | 2 years ago |
|
|
512db615be | 2 years ago |
|
|
ccb9e93d62 | 2 years ago |
|
|
2008ccf92c | 2 years ago |
|
|
b769959823 | 2 years ago |
|
|
0e67851646 | 2 years ago |
|
|
f7dffea2eb | 2 years ago |
|
|
724a26ca68 | 2 years ago |
|
|
a9d4cb2fd8 | 2 years ago |
|
|
bcfeff2661 | 2 years ago |
|
|
cfd8b5e8a5 | 2 years ago |
|
|
264aed70a0 | 2 years ago |
|
|
d3b4f37c73 | 2 years ago |
|
|
165f3fb9f6 | 2 years ago |
|
|
47779f6fa7 | 2 years ago |
|
|
faf3bbdd9e | 2 years ago |
|
|
01db5408c9 | 2 years ago |
|
|
80167378d9 | 2 years ago |
|
|
eef6f78fd6 | 2 years ago |
|
|
c6c4f933b2 | 2 years ago |
|
|
0a9aee0246 | 2 years ago |
|
|
421bae2037 | 2 years ago |
|
|
f2a57255fc | 2 years ago |
|
|
8b468fe4b5 | 2 years ago |
|
|
6a74cdd2da | 2 years ago |
|
|
70077c97db | 2 years ago |
|
|
6f99aca8a5 | 2 years ago |
|
|
77651f9652 | 2 years ago |
|
|
22b48aef92 | 2 years ago |
|
|
70176e0cb1 | 2 years ago |
|
|
359a177797 | 2 years ago |
|
|
beb3453ff5 | 2 years ago |
|
|
b450091457 | 2 years ago |
|
|
f2079d4bbd | 2 years ago |
|
|
0a9d3e2b4d | 2 years ago |
|
|
557a3baafe | 2 years ago |
|
|
881b1fba53 | 2 years ago |
|
|
e914925181 | 2 years ago |
|
|
ded6e02663 | 2 years ago |
|
|
6671dea8d8 | 2 years ago |
|
|
a0bca92195 | 2 years ago |
|
|
f534ee6f58 | 2 years ago |
|
|
62dc3c162a | 2 years ago |
|
|
2def9f3744 | 2 years ago |
|
|
d73cc13100 | 2 years ago |
|
|
fb62ce2f19 | 2 years ago |
|
|
1ddac14efb | 2 years ago |
|
|
a24afd4302 | 2 years ago |
|
|
f211fd5617 | 2 years ago |
|
|
cb9ced27c2 | 2 years ago |
|
|
1ecb8ebfe9 | 2 years ago |
|
|
542864c89c | 2 years ago |
|
|
f8fb336740 | 2 years ago |
|
|
d459600f22 | 2 years ago |
|
|
5cca651963 | 2 years ago |
|
|
75b969b265 | 2 years ago |
|
|
7f890bb24a | 2 years ago |
|
|
8c46d2577d | 2 years ago |
|
|
8c520d9431 | 2 years ago |
|
|
432e64e51d | 2 years ago |
|
|
b4bc99369f | 2 years ago |
|
|
245716119e | 2 years ago |
|
|
6dd5fda997 | 2 years ago |
|
|
5c8bb241b3 | 2 years ago |
|
|
8bdcfcb764 | 2 years ago |
|
|
0e8c1a8b2f | 2 years ago |
|
|
9d1b153739 | 2 years ago |
|
|
b579e494c1 | 2 years ago |
|
|
413535ef0b | 2 years ago |
|
|
649521c31f | 2 years ago |
|
|
c96c151f44 | 2 years ago |
|
|
d6f51f6c82 | 2 years ago |
|
|
7d2744d29c | 2 years ago |
|
|
7f753014df | 2 years ago |
|
|
47ccf68b3a | 2 years ago |
|
|
7c426b90e5 | 2 years ago |
|
|
a6a541b903 | 2 years ago |
|
|
1a5687a27c | 2 years ago |
|
|
ec13edc28b | 2 years ago |
|
|
8f591654a5 | 2 years ago |
|
|
b10383c3ff | 2 years ago |
|
|
dd0099236d | 2 years ago |
|
|
1997dbe128 | 2 years ago |
|
|
c7ee76d816 | 2 years ago |
|
|
e4492cbc1f | 2 years ago |
|
|
cb2bacf539 | 2 years ago |
|
|
4fcc698f50 | 2 years ago |
|
|
bbee4dba66 | 2 years ago |
|
|
cbc38940ea | 2 years ago |
|
|
ed748a626b | 2 years ago |
|
|
23b7d85911 | 2 years ago |
|
|
81de6f9848 | 2 years ago |
|
|
4231c85055 | 2 years ago |
|
|
d5dd8757e9 | 2 years ago |
|
|
772992e3ff | 2 years ago |
|
|
3f1ba19c64 | 2 years ago |
|
|
41cd55e02b | 2 years ago |
|
|
13b2db47b5 | 2 years ago |
|
|
6bd6572e7e | 2 years ago |
|
|
ee5fb615db | 2 years ago |
|
|
185f54d26d | 2 years ago |
|
|
0a478e077a | 2 years ago |
|
|
542501f5c5 | 2 years ago |
|
|
a5e0de08ce | 2 years ago |
|
|
8544b3ce3d | 2 years ago |
|
|
720c0ac6e9 | 2 years ago |
|
|
55f1e4166e | 2 years ago |
|
|
4d52f639aa | 2 years ago |
|
|
0c534cffae | 2 years ago |
|
|
2c9e51aef0 | 2 years ago |
|
|
1c34843bc5 | 2 years ago |
|
|
6a8de14d5d | 2 years ago |
|
|
519f396e76 | 2 years ago |
|
|
40656a65d8 | 2 years ago |
|
|
49d3df8c87 | 2 years ago |
|
|
47801ecb36 | 2 years ago |
|
|
d8836d5e89 | 2 years ago |
|
|
c1fd6313b1 | 2 years ago |
|
|
c63a1fadf5 | 2 years ago |
|
|
6a6ac76973 | 2 years ago |
|
|
8a42bf8b2f | 2 years ago |
|
|
dfc6e86442 | 2 years ago |
|
|
aa605a2e47 | 2 years ago |
|
|
1c19b36d2d | 2 years ago |
|
|
b26f535749 | 2 years ago |
|
|
9c2948db29 | 2 years ago |
|
|
50816d452e | 2 years ago |
|
|
b3587688b8 | 2 years ago |
|
|
391331f508 | 2 years ago |
|
|
971bab465c | 2 years ago |
|
|
03d550936e | 2 years ago |
|
|
cb56750e6b | 2 years ago |
|
|
04244675e1 | 2 years ago |
|
|
6f8be66f42 | 2 years ago |
|
|
511c9788da | 2 years ago |
|
|
2a4059fd66 | 2 years ago |
|
|
1eb38b1dc4 | 2 years ago |
|
|
3523daa9fa | 2 years ago |
|
|
1492efdedb | 2 years ago |
|
|
f9d3602e9a | 2 years ago |
|
|
6ff864c4cd | 2 years ago |
|
|
8bf5479f56 | 2 years ago |
|
|
e8e7a726f5 | 2 years ago |
|
|
b45cbbcf29 | 3 years ago |
|
|
7c804f77fb | 3 years ago |
|
|
dac842f50c | 3 years ago |
|
|
d11b12ac9a | 3 years ago |
|
|
c5e88ac7ba | 3 years ago |
|
|
645e266af8 | 3 years ago |
|
|
f0a4bd6925 | 3 years ago |
|
|
3f6c05825d | 3 years ago |
|
|
4e962bda07 | 3 years ago |
|
|
0f4f98f31c | 3 years ago |
|
|
f2bf57f8cc | 3 years ago |
|
|
e780df90e1 | 3 years ago |
|
|
d8e9f36844 | 3 years ago |
|
|
c0595a8dc6 | 3 years ago |
|
|
abcf82346e | 3 years ago |
|
|
31144c7c27 | 3 years ago |
|
|
2048747a62 | 3 years ago |
|
|
a58e4452b8 | 3 years ago |
|
|
6f20f1b871 | 3 years ago |
|
|
72ee34f9a7 | 3 years ago |
|
|
652c19cdf8 | 3 years ago |
|
|
3642ca6a47 | 3 years ago |
|
|
1300dadce1 | 3 years ago |
|
|
4a7ca9cd46 | 3 years ago |
|
|
5c5ed35df8 | 3 years ago |
|
|
3e63d80655 | 3 years ago |
|
|
ae0fca865d | 3 years ago |
|
|
a9ae44ca89 | 3 years ago |
|
|
dd79b1dfca | 3 years ago |
|
|
4afdf5545e | 3 years ago |
|
|
d251ca0e1c | 3 years ago |
|
|
786dd76f57 | 3 years ago |
|
|
3353c93de9 | 3 years ago |
|
|
da0a164b0e | 3 years ago |
|
|
d261557cd7 | 3 years ago |
|
|
ff23f3a8cb | 3 years ago |
|
|
b2ec6c76bf | 3 years ago |
|
|
f624c70cee | 3 years ago |
|
|
fe606b7823 | 3 years ago |
|
|
20572f463a | 3 years ago |
|
|
0e054429ef | 3 years ago |
|
|
bc27121c4e | 3 years ago |
|
|
96f948a8c8 | 3 years ago |
|
|
94296cec0d | 3 years ago |
|
|
38648df897 | 3 years ago |
|
|
d073eb9d5f | 3 years ago |
|
|
77ab9373f8 | 3 years ago |
|
|
b337343df3 | 3 years ago |
|
|
710e6274db | 3 years ago |
|
|
31d8443f87 | 3 years ago |
|
|
9f44b25353 | 3 years ago |
|
|
7bc105c6c7 | 3 years ago |
|
|
12af8bb8a9 | 3 years ago |
|
|
792b3ea249 | 3 years ago |
|
|
e4fe4baa27 | 3 years ago |
|
|
83ca5e8e4c | 3 years ago |
|
|
58e598843b | 3 years ago |
|
|
f28fcbd006 | 3 years ago |
|
|
17acae0a95 | 3 years ago |
|
|
101f2dcab8 | 3 years ago |
|
|
60d5ba4a9e | 3 years ago |
|
|
078482c21d | 3 years ago |
|
|
cf30762eec | 3 years ago |
|
|
2437d2da9c | 3 years ago |
|
|
01ee9a2710 | 3 years ago |
|
|
77f3d0a238 | 3 years ago |
|
|
e098705374 | 3 years ago |
|
|
7280e2a1d7 | 3 years ago |
|
|
17e7886907 | 3 years ago |
|
|
b64ba9211e | 3 years ago |
|
|
906fd5fd6a | 3 years ago |
|
|
2fea4b2b07 | 3 years ago |
|
|
3675d05911 | 3 years ago |
|
|
0514fecae2 | 3 years ago |
|
|
83c15196c8 | 3 years ago |
|
|
ddcd0bb73c | 3 years ago |
|
|
9d2df00d87 | 3 years ago |
|
|
0e4e285954 | 3 years ago |
|
|
e79454973c | 3 years ago |
|
|
9a7d0af6ea | 3 years ago |
|
|
128bd2ec54 | 3 years ago |
|
|
8e14084467 | 3 years ago |
|
|
98abc5a069 | 3 years ago |
|
|
e50a67ea12 | 3 years ago |
Binary file not shown.
@ -0,0 +1,15 @@
|
||||
-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIICajCCAVICAQAwJTEjMCEGCSqGSIb3DQEJARYUSGFyb29uNjEzOEBnbWFpbC5j
|
||||
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4E8y9zluekbsXX6+i
|
||||
HLa0GrZE+r8rJsmcNyhiONDkpCTQuuidRb4PH+DWPpxwtndKpgzPemCXavaAPY8I
|
||||
vSf5/aLTzClLvuX4OqNsb9Y8v8jlt7uYud6hPYK+VKZmIyynqeHldur0+RQScVY7
|
||||
Z4MbgxWYAXd0K49o1Vj8KcYP1G37XIaUwOf+Ib3az4abnrsou7w9PSHnKREPU1A8
|
||||
syBR56/Zcm3I9e+4nLyk2kjhkp6zR8KKW3s0teqHkW+V2nqd6eU+ZwOOmP3FVuwl
|
||||
X+kfVabTc42Nb7toDaIvxEI+LlrNCUTCptE5uvY+vId0bwjcL88Ti9zshPETgLd8
|
||||
F7mHAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAMTsBtXA79BL7aJoe87iHwCaR
|
||||
lyOoeG5vUVJhQxhkb7pXD6TT00H3DEn43MCD+Nu9KNq3ZAARTsbnoB1MzYQ+Qs0w
|
||||
uIx3K+sKKqzo3tKY78cjpKYW68qSY8QHPH8z0PJ/a18Mz1VGjhV9sanRc57fkf8Y
|
||||
SfzG+jKB+y9AeC4R5PAVkv/EScZKVyb8+hFNZRMBOfnME7QRWm51MlnzfgavB/Sr
|
||||
SSb9KrKzA65UKM9fv0JhNftiFVwsMDA42RuwSE7rVqzoejb47sFNnEBprt4Jel+5
|
||||
FJt/C//NKspMlW2cdRbPek7adaBuZCvEO+b0TDnvMQXnJTO5K0LCzGb5MRuGUg==
|
||||
-----END CERTIFICATE REQUEST-----
|
||||
@ -0,0 +1,8 @@
|
||||
-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIH6MIGfAgEAMD0xIzAhBgkqhkiG9w0BCQEWFEhhcm9vbjYxMzhAZ21haWwuY29t
|
||||
MQkwBwYDVQQDDAAxCzAJBgNVBAYTAkFFMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
|
||||
QgAEiHGgNfm6LyD0k41YUNxGibQT5t2T9+QTVb6v5YrfCYslJIurcpeia8pzl/HJ
|
||||
p1f4qxCR04cEYE3tcunyzkJd26AAMAwGCCqGSM49BAMCBQADSAAwRQIhAJWZqbmD
|
||||
e9jyqPHW578V6xsf5Axgf64GBBFMpZ8+ZukDAiAYu0BbgeiU4RwCrezA71iH95yZ
|
||||
ge9MoPuNHejpDKGeQQ==
|
||||
-----END CERTIFICATE REQUEST-----
|
||||
@ -0,0 +1,8 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf2758
|
||||
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\expandedcolortbl;;}
|
||||
\paperw11900\paperh16840\margl1440\margr1440\vieww11520\viewh8400\viewkind0
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
|
||||
|
||||
\f0\fs24 \cf0 HMG@54321}
|
||||
@ -0,0 +1,74 @@
|
||||
MIIQaQYJKoZIhvcNAQcCoIIQWjCCEFYCAQExCzAJBgUrDgMCGgUAMHgGCSqGSIb3DQEHAaBrBGl7
|
||||
InRlYW1JZCI6IjNBMzU5RTg2WkYiLCJkb21haW4iOiJ1YXQuaG1nd2Vic2VydmljZXMuY29tIiwi
|
||||
ZGF0ZUNyZWF0ZWQiOiIyMDI1LTA0LTA5LDA4OjUzOjAzIiwidmVyc2lvbiI6MX2ggg0_MIIENDCC
|
||||
AxygAwIBAgIIPVn4N-rR2J8wDQYJKoZIhvcNAQELBQAwczEtMCsGA1UEAwwkQXBwbGUgaVBob25l
|
||||
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
|
||||
eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwHhcNMjQxMjE2MTkyMTAxWhcNMjkx
|
||||
MjExMTgxMzU5WjBZMTUwMwYDVQQDDCxBcHBsZSBpUGhvbmUgT1MgUHJvdmlzaW9uaW5nIFByb2Zp
|
||||
bGUgU2lnbmluZzETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3
|
||||
DQEBAQUAA4IBDwAwggEKAoIBAQDQkzGr-FMe360eL2T3yU3Xlr5fSz15ZFxD7inDQNL6LxygtrwR
|
||||
c-_wIrDf3vn5zlXj9UIBtSNlQRI793xGfYkTRZVE7JaVYmaXkAMA2eCuxdmxnCAtluCF7W9r01LT
|
||||
gzzUASMl6eXG1BHYeaoIwt0VWPXvipNLDUvuDbaHk3UREFXLDHgH2zdwRjuX-sTreCng9Ox442Ha
|
||||
QFeAB7uInKXHSW3IJtOVH00hoo1oc4Me5llahZZVVLCVLiXcdw1hh4GNiaQDezwAdyyJalnTZETZ
|
||||
dKVbirFSYV9uBDDU8-IQNAyVjEvhe9YrhYPyJzmNcAgj4hSI_5P0LW1MJuKLN4YtAgMBAAGjgeUw
|
||||
geIwDAYDVR0TAQH_BAIwADAfBgNVHSMEGDAWgBRv8ZUYYlzgyPHF7WwYyeDTZFKYIDBABggrBgEF
|
||||
BQcBAQQ0MDIwMAYIKwYBBQUHMAGGJGh0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtYWlwY2Ew
|
||||
NzAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8vY3JsLmFwcGxlLmNvbS9haXBjYS5jcmwwHQYDVR0O
|
||||
BBYEFLy1xem9_MvQntyUsB74IZRc_wkuMA4GA1UdDwEB_wQEAwIHgDAPBgkqhkiG92NkBjoEAgUA
|
||||
MA0GCSqGSIb3DQEBCwUAA4IBAQAyNMLpd6pf4MbKovN3WeeKZ7jxUfP7sPaXv7ERo-GhPLsjkukS
|
||||
k6JxHbzxmnFvpDxvNpK24EeCopPj57iPu98lRGICz8289_uNiglweGXCGU0ly3JiIeSpaPkQmi56
|
||||
Dyi-pgMG0VVhH698-JTUcQ7i0yVUi86t1WgHW70te8diRXm5qYdM-Bg7gK4QS3HYeCvmCq-a59lN
|
||||
zOpbt6OXVWvsDaB4x8Cwz8vcEEwwkhNxlNav4OzJ6cmbziUy7hENIRcki_GVLiJiRkV_4NvXFlTB
|
||||
uT7T2oq5Zfa0tCN_eF3ZcnZkY6cIVcfZt5TbI7_zk6fUBERDDcriVrIrlCikPXKHMIIERDCCAyyg
|
||||
AwIBAgIIXGPK5Eo3U8kwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFw
|
||||
cGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQD
|
||||
Ew1BcHBsZSBSb290IENBMB4XDTE3MDUxMDIxMjczMFoXDTMwMTIzMTAwMDAwMFowczEtMCsGA1UE
|
||||
AwwkQXBwbGUgaVBob25lIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZp
|
||||
Y2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0G
|
||||
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJRWoBDz6DBIbH_L_cXvAege4XMHNjJi7ePXokzZM-
|
||||
TzlHunW-88DS8Vmiqx_-CoY82S2aB_IOa7kpkRpfIgqL8XJYBa5MS0TFeaeAPLCI4IwMJ4RdGeWH
|
||||
GTbL48V2t7D0QXJR9AVcg0uibaZRuPEm33terWUMxrKYUYy7fRtMwU7ICMfS7WQLtN0bjU9AfRuP
|
||||
SJaSW_PQmH7ZvKQZDplhu0FdAcxbd3p9JNDc01P_w9zFlCy2Wk2OGCM5vdnGUj7R8vQliqEqh_3Y
|
||||
DEYpUf_tF2yJJWuHv4ppFJ93n8MVt2iziEW9hOYGAkFkD60qKLgVyeCsp4q6cgQ0sniM-LKFAgMB
|
||||
AAGjgewwgekwDwYDVR0TAQH_BAUwAwEB_zAfBgNVHSMEGDAWgBQr0GlHlHYJ_vRrjS5ApvdHTX8I
|
||||
XjBEBggrBgEFBQcBAQQ4MDYwNAYIKwYBBQUHMAGGKGh0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3Nw
|
||||
MDMtYXBwbGVyb290Y2EwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9v
|
||||
dC5jcmwwHQYDVR0OBBYEFG_xlRhiXODI8cXtbBjJ4NNkUpggMA4GA1UdDwEB_wQEAwIBBjAQBgoq
|
||||
hkiG92NkBgISBAIFADANBgkqhkiG9w0BAQsFAAOCAQEAOs-smI2-kiAhCa2V87FcIfo2LVcgRHRz
|
||||
ZJIIs5as922X-ls0OCfPEkbTPBHwB8mZkLHR6BEJpeOla2xjCD-eJfrVmZxM5uXOjrJNaOyLq6Oi
|
||||
T4oRFT7cFCscxkS2b2fFW0-VKS2HXD_cgx53T-3aVKct5xOBwWPEVAsbSwpqKCII1DeSfH9nKF-v
|
||||
PT-3rFkdODRkWu4zShlCRCnEyhhr4cFTLS30TcIV9jMyGHjxJm-KTeuUTKPo_w-zA4tl2usu2GVQ
|
||||
n9yfit8xqIRU3FJSQdKyEx0xRkeIXz7uw_KMIwSV66yKPoJsBp8u44tDmmJbNA30mc8s7rpyhhkj
|
||||
pfyOtTCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNV
|
||||
BAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYw
|
||||
FAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjEL
|
||||
MAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmlj
|
||||
YXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEF
|
||||
AAOCAQ8AMIIBCgKCAQEA5JGpCR-R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQ
|
||||
CdN_QaiY-dHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm_IlA7pV
|
||||
j01dDfFkNSMVSxVZHbOU9_acns9QusFYUGePCLQg98usLCBvcLY_ATCMt0PPD5098ytJKBrI_s61
|
||||
uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs_j743DN5qNMRX4fTGtQlkGJ
|
||||
xHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP_Z15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYw
|
||||
DgYDVR0PAQH_BAQDAgEGMA8GA1UdEwEB_wQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn-9GuNLkCm
|
||||
90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn-9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQw
|
||||
ggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBs
|
||||
ZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFu
|
||||
eSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
|
||||
ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2Vy
|
||||
dGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14
|
||||
t-2Mm9zzd5vydtJ3ME_BH4WDhRuZPUc38qmbQI4s1LGQEti-9HOb7tJkD8t5TzTYoj75eP9ryAfs
|
||||
fTmDi1Mg0zjEsb-aTwpr_yv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UX
|
||||
F6jcfiI1yiXV2Q_Wa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy_5
|
||||
U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU-12TZ_wYdV2aeZuTJC-9jVcZ5-oVK3G72TQiQSKscPHbZN
|
||||
nF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAoUwggKBAgEBMH8wczEtMCsGA1UEAwwkQXBwbGUgaVBo
|
||||
b25lIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhv
|
||||
cml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMCCD1Z-Dfq0difMAkGBSsOAwIa
|
||||
BQCggdwwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjUwNDA5MDg1
|
||||
MzAzWjAjBgkqhkiG9w0BCQQxFgQUAFaGI1aIk0pvFl6XU5VvRpeio9QwKQYJKoZIhvcNAQk0MRww
|
||||
GjAJBgUrDgMCGgUAoQ0GCSqGSIb3DQEBAQUAMFIGCSqGSIb3DQEJDzFFMEMwCgYIKoZIhvcNAwcw
|
||||
DgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEoMA0G
|
||||
CSqGSIb3DQEBAQUABIIBAHdhBvowTL1e7Q-KFo3GAoa_c3I5iQH79ks6sZ9U4zu3xhpjrReRlA5d
|
||||
ORAcMvUnUT0sjDj2ISsLKzUnDXNlcPE8fqfkMI_7LYlWvnNalVtrJmL6CUheBuTKMQ_Z_lZLLI4o
|
||||
J46YUzCU9M4vpcgO6EpOQTNrqLx2sOs-V_my1p-Hig7UqdHNviX4gL4xjg7yUXNoevZ9ixPLXI4C
|
||||
aPmg5q2NCECPxS7g36hJ_gHtRC6awR8qvK3-mSZPPfMzh0sHih76h2RWcv13UHSNygn3SF0MLhsS
|
||||
5m9tf6r1sJOCAr2_ri-65d2GN1vhGXfoXQ0KFy9N2Cao3IsRs5unBb6pk5c
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,16 @@
|
||||
-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIICgjCCAWoCAQAwPTEjMCEGCSqGSIb3DQEJARYUSGFyb29uNjEzOEBnbWFpbC5j
|
||||
b20xCTAHBgNVBAMMADELMAkGA1UEBhMCQUUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQDHadAER62mSf+wOxPu9rF1EvifDxbAEv6znZIHvwimgShdPLLS
|
||||
rkFdN4VpSHMzrASqpHnlSL3wxO6eym9pATH3WfLvKIQxnn9OkO5fScjQi0RkFbe0
|
||||
JqTqN2LaFxrSFrhqQ/1p/izr690HqjrfquRI8t8evatyTku67/xcCj6uSIVLfJoS
|
||||
8YCDVn0Y+w9n2Vw/+kHiNY6P96qp/CfXZgMLFpUu0mqcmZl97htfmB9AH2tC45yh
|
||||
mKxDJiKEnk69zVCh/bkc9tFE1tUDkkKblJTCEyWfdDUUYM4ET3t3fBqWB78F4J3m
|
||||
XglByGZmHgY2+7nsSQBiq7k9tFN2c7FZ9BD3AgMBAAGgADANBgkqhkiG9w0BAQsF
|
||||
AAOCAQEAJxqoyfEJ7V83ffCAqkYNNEcCQMIRi1Y4cTTm/5KZGA/UPeDeX48/bm4K
|
||||
XIf2zbv88OGASInBrvMDp0x0zs13Dx2yXxofGN+iQSBwN6jPV/upmm0DjgTmgUGh
|
||||
BJste70LaU228ADzWDw8UJm/GKjK8WvE0XOGpPKYq9cuVW3M+6QRoRHXy0eJc2PX
|
||||
VgopsuhHUyA5trxM7k4yc6GgYVx+fAwMaplovTwn5U8XK6bDEIvCjImfat/u4Wp8
|
||||
R31p0BQzQaeyWfpp9Ucn/fvQSeB+wtjhHuA1ukcyWY1kBYOyCMIHymFrJLaTpUj7
|
||||
aQFYZDV28HYv0yWhWIAD9Pu+aDHWpA==
|
||||
-----END CERTIFICATE REQUEST-----
|
||||
@ -0,0 +1,74 @@
|
||||
Bag Attributes
|
||||
friendlyName: VoIP Services: com.HMG.HMG-Smartphone
|
||||
localKeyID: 70 4A 99 03 F8 D7 92 FA F7 2F DD 3B D8 BF 2C F0 BD CE 21 C8
|
||||
subject=/UID=com.HMG.HMG-Smartphone.voip/CN=VoIP Services: com.HMG.HMG-Smartphone/OU=3A359E86ZF/O=Dr Sulaiman Al Habib Medical Center/C=SA
|
||||
issuer=/CN=Apple Worldwide Developer Relations Certification Authority/OU=G4/O=Apple Inc./C=US
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGkTCCBXmgAwIBAgIQFB+/PYFlrZ6SCzSX9cqOBDANBgkqhkiG9w0BAQsFADB1
|
||||
MUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBD
|
||||
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTELMAkGA1UECwwCRzQxEzARBgNVBAoMCkFw
|
||||
cGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTI0MDYwOTEyMDc1MVoXDTI1MDcwOTEy
|
||||
MDc1MFowga0xKzApBgoJkiaJk/IsZAEBDBtjb20uSE1HLkhNRy1TbWFydHBob25l
|
||||
LnZvaXAxLjAsBgNVBAMMJVZvSVAgU2VydmljZXM6IGNvbS5ITUcuSE1HLVNtYXJ0
|
||||
cGhvbmUxEzARBgNVBAsMCjNBMzU5RTg2WkYxLDAqBgNVBAoMI0RyIFN1bGFpbWFu
|
||||
IEFsIEhhYmliIE1lZGljYWwgQ2VudGVyMQswCQYDVQQGEwJTQTCCASIwDQYJKoZI
|
||||
hvcNAQEBBQADggEPADCCAQoCggEBAMdp0ARHraZJ/7A7E+72sXUS+J8PFsAS/rOd
|
||||
kge/CKaBKF08stKuQV03hWlIczOsBKqkeeVIvfDE7p7Kb2kBMfdZ8u8ohDGef06Q
|
||||
7l9JyNCLRGQVt7QmpOo3YtoXGtIWuGpD/Wn+LOvr3QeqOt+q5Ejy3x69q3JOS7rv
|
||||
/FwKPq5IhUt8mhLxgINWfRj7D2fZXD/6QeI1jo/3qqn8J9dmAwsWlS7SapyZmX3u
|
||||
G1+YH0Afa0LjnKGYrEMmIoSeTr3NUKH9uRz20UTW1QOSQpuUlMITJZ90NRRgzgRP
|
||||
e3d8GpYHvwXgneZeCUHIZmYeBjb7uexJAGKruT20U3ZzsVn0EPcCAwEAAaOCAuIw
|
||||
ggLeMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUW9n6HeeaGgujmXYiUIY+kchb
|
||||
d6gwcAYIKwYBBQUHAQEEZDBiMC0GCCsGAQUFBzAChiFodHRwOi8vY2VydHMuYXBw
|
||||
bGUuY29tL3d3ZHJnNC5kZXIwMQYIKwYBBQUHMAGGJWh0dHA6Ly9vY3NwLmFwcGxl
|
||||
LmNvbS9vY3NwMDMtd3dkcmc0MDUwggEeBgNVHSAEggEVMIIBETCCAQ0GCSqGSIb3
|
||||
Y2QFATCB/zCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRp
|
||||
ZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRo
|
||||
ZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1
|
||||
c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGlj
|
||||
ZSBzdGF0ZW1lbnRzLjA3BggrBgEFBQcCARYraHR0cHM6Ly93d3cuYXBwbGUuY29t
|
||||
L2NlcnRpZmljYXRlYXV0aG9yaXR5LzATBgNVHSUEDDAKBggrBgEFBQcDAjAyBgNV
|
||||
HR8EKzApMCegJaAjhiFodHRwOi8vY3JsLmFwcGxlLmNvbS93d2RyZzQtNi5jcmww
|
||||
HQYDVR0OBBYEFHBKmQP415L69y/dO9i/LPC9ziHIMA4GA1UdDwEB/wQEAwIHgDAQ
|
||||
BgoqhkiG92NkBgMBBAIFADAQBgoqhkiG92NkBgMCBAIFADBDBgoqhkiG92NkBgME
|
||||
BDUMM2NvbS5ITUcuSE1HLVNtYXJ0cGhvbmUsIGNvbS5ITUcuSE1HLVNtYXJ0cGhv
|
||||
bmUudm9pcDAQBgoqhkiG92NkBgMFBAIFADAmBgoqhkiG92NkBgMDBBgMFmNvbS5I
|
||||
TUcuSE1HLVNtYXJ0cGhvbmUwDQYJKoZIhvcNAQELBQADggEBAJAcIzSskk8/GbxQ
|
||||
7nGUPPEWFswL66xTt3GusHmeXkKDXG3ac+4jLk8yU7gunos77CNDm+9TkShdJ2Rg
|
||||
tTRopK4ockqwoPrCeEVrooHR4e42YvmkB6AfYKJRnQZQVJIpW0OES7vrtoWVGoNj
|
||||
ktHOV+wFIuAQPI9P4z0RFyRw85MHr+jFqxeLU/1500PwCxIiNHkIcUtzZgrnr22R
|
||||
7rgkxav+RrjLjXVQvC4VJispKCU7yR69Xv1rsC5zc7OTCuCkbQ9FvnfsiUz5ZDzp
|
||||
3D0gGojU9wmJ1yVk9HiZsuiVwmg/LbDHI3pSYbxz3n1UHB6Pu0jX3c3Uxkx674HD
|
||||
/0uvHzg=
|
||||
-----END CERTIFICATE-----
|
||||
Bag Attributes
|
||||
localKeyID: 70 4A 99 03 F8 D7 92 FA F7 2F DD 3B D8 BF 2C F0 BD CE 21 C8
|
||||
Key Attributes: <No Attributes>
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHadAER62mSf+w
|
||||
OxPu9rF1EvifDxbAEv6znZIHvwimgShdPLLSrkFdN4VpSHMzrASqpHnlSL3wxO6e
|
||||
ym9pATH3WfLvKIQxnn9OkO5fScjQi0RkFbe0JqTqN2LaFxrSFrhqQ/1p/izr690H
|
||||
qjrfquRI8t8evatyTku67/xcCj6uSIVLfJoS8YCDVn0Y+w9n2Vw/+kHiNY6P96qp
|
||||
/CfXZgMLFpUu0mqcmZl97htfmB9AH2tC45yhmKxDJiKEnk69zVCh/bkc9tFE1tUD
|
||||
kkKblJTCEyWfdDUUYM4ET3t3fBqWB78F4J3mXglByGZmHgY2+7nsSQBiq7k9tFN2
|
||||
c7FZ9BD3AgMBAAECggEBALTXH58SBcd86hS+rsgSDkJ2ruNIQsBzOWpYJjtCIi0l
|
||||
ih5r0lu/TWWk2SbuXhLpF95MhILLIf18Ck4UlU5rmA2SE/6RBrkc3KS6SII/no6J
|
||||
Db+Z9lu4g+wnyEyxkVAe7KTp/aGmsMROxMaTuQpnptkE8BSnuxhRKtpfksNBQzC2
|
||||
19OkEy4JAO7xWbm9w/ASiCtYf0Vj26DQo982Fe44cpG08iB2v1uUJINQkGzmg+85
|
||||
vvn5A1ECpSpgd/eOa68ojxeNSU7iFGZPbpjuincLPBFlC5zp9KD1Bt6p2KwIizBl
|
||||
GPYTp6a1DnWly6n0PuLN0fl/nRmI6ar48Ja1Qzk8NvECgYEA5iQo9lnjNOHjT6bk
|
||||
hj5QXMz3MDMCPdJo6jQyADtmsC/F4RjufujfXPhMv2v8JLAjQjNMgfhTSF68zYHf
|
||||
i1qW8e/CgWu7mGQEIhWtxiTkLou8zW3VjxwpgfeUsGI5L+PxoN53ZUVcetLz4Y58
|
||||
8ATEhlxh02uGmG2k3HbvFu9NBT8CgYEA3dHJfFX2xv53ZD1E2IE1rM3j7a32s7VB
|
||||
k/YX8ODrAJxwNmy/vm4gd5h6ofqVS1/IV4NHFbmQ5c1tzB44YGOEZH5Ta9hhHgHU
|
||||
xoa3q6t+kjR9KrQvxjTSe9mW5x/jAgU0Wp/XrAfMZxc2eukb4/sJAGKG0kyFeX5O
|
||||
5abVixWj7kkCgYAafd8ZPI+i7r2z1YpIybOGezGZIsYHR8k77HY1AKF5doZYuv35
|
||||
LeVIVmy/PDbyIjRs0mrkKymrEvy4y1JoQC1P/EFvlG8rw5eWNNikDmsV0JATNal3
|
||||
p84/X7iF9UiP8rVFx1YHGkzi9pWMSVKobmQQ82FvbNk5gqWPm0E6aqF7EQKBgQDB
|
||||
mE0PlT9SIdk1xTuG8g5UiUV6tS/xXCql5kyy0LqJx/8voO4gV6FCf/PX1wnhxPDn
|
||||
YA30agaKaiZ/1YhCp9hulMpd/3WTaOm5cu5uh7hqBiGP2b8wb/2cViWcBnpr0vsE
|
||||
dSkYXZ4KA3pq/3R2HyyWB2e/t0Vu6cwWJuuM/hAa8QKBgGNRStNVSMPvzx2X7mB6
|
||||
EqdlWqVbfSTHJiZKyNPWHlSuZgdQ14BRwq7KZ0ysZy+kOX4rh1rIfqzrKc62xEXB
|
||||
E+fmIpu+DUOM5ojEPCf9Om87r3fMJ54SjM7z1dtVc+Muy4TnFZ4UQcN9txWbnkAo
|
||||
++H5gC9DBedOEXkwoCYjoeuM
|
||||
-----END PRIVATE KEY-----
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,53 @@
|
||||
package com.cloud.diplomaticquarterapp
|
||||
|
||||
import com.ejada.hmg.MainActivity
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.cloud.diplomaticquarterapp.penguin.PenguinView
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
|
||||
class PenguinInPlatformBridge(
|
||||
private var flutterEngine: FlutterEngine,
|
||||
private var mainActivity: MainActivity
|
||||
) {
|
||||
|
||||
private lateinit var channel: MethodChannel
|
||||
|
||||
companion object {
|
||||
private const val CHANNEL = "launch_penguin_ui"
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
fun create() {
|
||||
// openTok = OpenTok(mainActivity, flutterEngine)
|
||||
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
|
||||
channel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
|
||||
when (call.method) {
|
||||
"launchPenguin" -> {
|
||||
print("the platform channel is being called")
|
||||
val args = call.arguments as Map<String, Any>?
|
||||
Log.d("TAG", "configureFlutterEngine: $args")
|
||||
println("args")
|
||||
args?.let {
|
||||
PenguinView(
|
||||
mainActivity,
|
||||
100,
|
||||
args,
|
||||
flutterEngine.dartExecutor.binaryMessenger,
|
||||
activity = mainActivity,
|
||||
channel
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
result.notImplemented()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
package com.cloud.diplomaticquarterapp.PermissionManager
|
||||
|
||||
import android.Manifest
|
||||
import android.os.Build
|
||||
|
||||
object PermissionHelper {
|
||||
|
||||
fun getRequiredPermissions(): Array<String> {
|
||||
val permissions = mutableListOf(
|
||||
Manifest.permission.INTERNET,
|
||||
Manifest.permission.ACCESS_FINE_LOCATION,
|
||||
Manifest.permission.ACCESS_COARSE_LOCATION,
|
||||
Manifest.permission.ACCESS_NETWORK_STATE,
|
||||
Manifest.permission.BLUETOOTH,
|
||||
Manifest.permission.BLUETOOTH_ADMIN,
|
||||
// Manifest.permission.ACTIVITY_RECOGNITION
|
||||
)
|
||||
|
||||
// For Android 12 (API level 31) and above, add specific permissions
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12 (API 31) and above
|
||||
permissions.add(Manifest.permission.BLUETOOTH_SCAN)
|
||||
permissions.add(Manifest.permission.BLUETOOTH_CONNECT)
|
||||
permissions.add(Manifest.permission.HIGH_SAMPLING_RATE_SENSORS)
|
||||
}
|
||||
|
||||
return permissions.toTypedArray()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,50 @@
|
||||
package com.cloud.diplomaticquarterapp.PermissionManager
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
|
||||
class PermissionManager(
|
||||
private val context: Context,
|
||||
val listener: PermissionListener,
|
||||
private val requestCode: Int,
|
||||
vararg permissions: String
|
||||
) {
|
||||
|
||||
private val permissionsArray = permissions
|
||||
|
||||
interface PermissionListener {
|
||||
fun onPermissionGranted()
|
||||
fun onPermissionDenied()
|
||||
}
|
||||
|
||||
fun arePermissionsGranted(): Boolean {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
permissionsArray.all {
|
||||
ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
|
||||
}
|
||||
} else {
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
fun requestPermissions(activity: Activity) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
ActivityCompat.requestPermissions(activity, permissionsArray, requestCode)
|
||||
}
|
||||
}
|
||||
|
||||
fun handlePermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
|
||||
if (this.requestCode == requestCode) {
|
||||
val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
|
||||
if (allGranted) {
|
||||
listener.onPermissionGranted()
|
||||
} else {
|
||||
listener.onPermissionDenied()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
package com.cloud.diplomaticquarterapp.PermissionManager
|
||||
|
||||
// PermissionResultReceiver.kt
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
|
||||
class PermissionResultReceiver(
|
||||
private val callback: (Boolean) -> Unit
|
||||
) : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
val granted = intent?.getBooleanExtra("PERMISSION_GRANTED", false) ?: false
|
||||
callback(granted)
|
||||
}
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.ble;
|
||||
|
||||
public class BPModelMeasuring {
|
||||
|
||||
public int pressure;
|
||||
public int pr;
|
||||
public boolean deflate;
|
||||
public boolean pulse;
|
||||
|
||||
public BPModelMeasuring(int pressure, int pr, boolean deflate, boolean pulse) {
|
||||
this.pressure = pressure;
|
||||
this.pr = pr;
|
||||
this.deflate = deflate;
|
||||
this.pulse = pulse;
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.ble;
|
||||
|
||||
public class BPModelResult {
|
||||
|
||||
public boolean deflate;
|
||||
public int dia;
|
||||
public int mean;
|
||||
public int pr;
|
||||
public int pressure;
|
||||
public int result;
|
||||
public int sys;
|
||||
|
||||
public BPModelResult(boolean deflate, int dia, int mean, int pr, int pressure, int result, int sys) {
|
||||
this.deflate = deflate;
|
||||
this.dia = dia;
|
||||
this.mean = mean;
|
||||
this.pr = pr;
|
||||
this.pressure = pressure;
|
||||
this.result = result;
|
||||
this.sys = sys;
|
||||
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,22 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.ble;
|
||||
|
||||
public class OxymeterModel {
|
||||
|
||||
public int spo2;
|
||||
public int pr;
|
||||
public float pi;
|
||||
public boolean isProbeOff;
|
||||
public boolean isPulseSearching;
|
||||
public boolean isCheckProbe;
|
||||
public int battery;
|
||||
|
||||
public OxymeterModel(int spo2, int pr, float pi, boolean isProbeOff, boolean isPulseSearching, boolean isCheckProbe, int battery) {
|
||||
this.spo2 = spo2;
|
||||
this.pr = pr;
|
||||
this.pi = pi;
|
||||
this.isProbeOff = isProbeOff;
|
||||
this.isPulseSearching = isPulseSearching;
|
||||
this.isCheckProbe = isCheckProbe;
|
||||
this.battery = battery;
|
||||
}
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.ble.utils;
|
||||
|
||||
public class AlgorithmUtil {
|
||||
public static native double[] filter(double var0, boolean var2);
|
||||
|
||||
public static native short[] shortFilter(short[] var0);
|
||||
|
||||
static {
|
||||
System.loadLibrary("online-lib");
|
||||
System.loadLibrary("offline-lib");
|
||||
}
|
||||
}
|
||||
@ -1,57 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.ble.utils;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class EcgData {
|
||||
|
||||
private long startTime; // 时间戳s
|
||||
private int duration;
|
||||
private String fileName;
|
||||
private byte[] data;
|
||||
private short[] shortData;
|
||||
|
||||
public long getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
public void setStartTime(long startTime) {
|
||||
this.startTime = startTime;
|
||||
}
|
||||
|
||||
public int getDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
||||
public void setDuration(int duration) {
|
||||
this.duration = duration;
|
||||
}
|
||||
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
||||
public void setFileName(String fileName) {
|
||||
this.fileName = fileName;
|
||||
}
|
||||
|
||||
public byte[] getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(byte[] data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public short[] getShortData() {
|
||||
return shortData;
|
||||
}
|
||||
|
||||
public void setShortData(short[] shortData) {
|
||||
this.shortData = shortData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "{" + "startTime:" + startTime + ", duration:" + duration + ", fileName:'" + fileName + '\'' + ", data:" + Arrays.toString(data) + ", shortData:" + Arrays.toString(shortData) + '}';
|
||||
}
|
||||
}
|
||||
@ -1,49 +0,0 @@
|
||||
//package com.cloud.diplomaticquarterapp.ble.utils;
|
||||
//
|
||||
////
|
||||
//// Source code recreated from a .class file by IntelliJ IDEA
|
||||
//// (powered by FernFlower decompiler)
|
||||
////
|
||||
//
|
||||
//
|
||||
//import doac.doba;
|
||||
//import doac.dobn;
|
||||
//import doac.docn;
|
||||
//
|
||||
//public class FilterUtil {
|
||||
// public FilterUtil() {
|
||||
// }
|
||||
//
|
||||
// public static short[] getEcgFileFilterData(int var0, byte[] var1) {
|
||||
// if (var0 != 7 && var0 != 8) {
|
||||
// if (var0 == 19) {
|
||||
// return AlgorithmUtil.shortFilter((new doba(var1)).doan());
|
||||
// }
|
||||
//
|
||||
// if (var0 == 52) {
|
||||
// return AlgorithmUtil.shortFilter((new docn("", var1, "")).doah());
|
||||
// }
|
||||
//
|
||||
// if (var0 != 77 && var0 != 127) {
|
||||
// if (var0 == 32) {
|
||||
// return AlgorithmUtil.shortFilter((new doba(var1)).doan());
|
||||
// }
|
||||
//
|
||||
// if (var0 != 33 && var0 != 74 && var0 != 75) {
|
||||
// switch (var0) {
|
||||
// case 145:
|
||||
// case 146:
|
||||
// case 147:
|
||||
// case 148:
|
||||
// case 149:
|
||||
// break;
|
||||
// default:
|
||||
// return new short[0];
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return AlgorithmUtil.shortFilter(DecompressUtil.er1Decompress((new dobn(var1)).doad()));
|
||||
// }
|
||||
//}
|
||||
@ -1,50 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.ble.utils;
|
||||
|
||||
//
|
||||
// Source code recreated from a .class file by IntelliJ IDEA
|
||||
// (powered by FernFlower decompiler)
|
||||
//
|
||||
|
||||
public class HexString {
|
||||
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
|
||||
|
||||
private HexString() {
|
||||
}
|
||||
|
||||
public static String bytesToHex(byte[] var0) {
|
||||
char[] var1 = new char[var0.length * 2];
|
||||
|
||||
for(int var2 = 0; var2 < var0.length; ++var2) {
|
||||
int var3 = var0[var2] & 255;
|
||||
int var4 = var2 * 2;
|
||||
char[] var5;
|
||||
char[] var10001 = var5 = HEX_ARRAY;
|
||||
int var10002 = var3;
|
||||
var1[var4] = var5[var3 >>> 4];
|
||||
var3 = var4 + 1;
|
||||
var1[var3] = var10001[var10002 & 15];
|
||||
}
|
||||
|
||||
return new String(var1);
|
||||
}
|
||||
|
||||
public static byte[] hexToBytes(String var0) {
|
||||
if (var0.length() % 2 == 1) {
|
||||
throw new IllegalArgumentException("hexToBytes requires an even-length String parameter");
|
||||
} else {
|
||||
int var1;
|
||||
byte[] var2 = new byte[(var1 = var0.length()) / 2];
|
||||
|
||||
for(int var3 = 0; var3 < var1; var3 += 2) {
|
||||
int var4 = var3 / 2;
|
||||
var2[var4] = (byte)((Character.digit(var0.charAt(var3), 16) << 4) + Character.digit(var0.charAt(var3 + 1), 16));
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
}
|
||||
|
||||
public static String trimStr(String var0) {
|
||||
return var0.trim();
|
||||
}
|
||||
}
|
||||
@ -1,7 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro
|
||||
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
|
||||
//object UiChannel {
|
||||
// val progressChannel = Channel<Int>(Channel.CONFLATED)
|
||||
//}
|
||||
@ -1,5 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import android.bluetooth.BluetoothDevice
|
||||
|
||||
data class BleBean(var name: String, var bluetoothDevice: BluetoothDevice)
|
||||
@ -1,11 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import java.util.*
|
||||
|
||||
data class BpBean(
|
||||
var date: Date = Date(),
|
||||
var timeString: String = "",
|
||||
var sys: Int = 0,
|
||||
var dia: Int=0,
|
||||
var pr: Int = 0
|
||||
)
|
||||
@ -1,17 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import java.util.*
|
||||
|
||||
data class DlcBean(
|
||||
var date: Date = Date(),
|
||||
var timeString: String = "",
|
||||
var hr: Int = 0,
|
||||
var eface: Int = 0,
|
||||
var oxy: Int = 0,
|
||||
var pi: Int = 0,
|
||||
var oface: Int = 0,
|
||||
var prFlag: Int = 0,
|
||||
var pr: Int = 0,
|
||||
var bpiFace: Int = 0,
|
||||
var voice: Int = 0
|
||||
)
|
||||
@ -1,11 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import java.util.*
|
||||
|
||||
data class EcgBean(
|
||||
var date: Date = Date(),
|
||||
var timeString: String = "",
|
||||
var way: Int = 0,
|
||||
var face: Int = 0,
|
||||
var voice: Int = 0
|
||||
)
|
||||
@ -1,10 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import java.util.*
|
||||
|
||||
data class GluBean(
|
||||
var date: Date = Date(),
|
||||
var timeString: String = "",
|
||||
var glu:Float=0f,
|
||||
var note:String=""
|
||||
)
|
||||
@ -1,13 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import java.util.*
|
||||
|
||||
data class OxyBean(
|
||||
var date: Date = Date(),
|
||||
var timeString: String = "",
|
||||
var way: Int = 0,
|
||||
var oxy: Int = 0,
|
||||
var pr: Int = 0,
|
||||
var pi: Int = 0,
|
||||
var face: Int = 0
|
||||
)
|
||||
@ -1,52 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
import java.util.*
|
||||
|
||||
data class PedBean(
|
||||
var date: Date = Date(),
|
||||
var timeString: String? = "",
|
||||
var step: Int = 0,
|
||||
var dis: Float = 0f,
|
||||
var speed: Float = 0f,
|
||||
var cal: Float = 0f,
|
||||
var fat: Float = 0f,
|
||||
var time: Int = 0
|
||||
) : Parcelable {
|
||||
constructor(parcel: Parcel) : this(
|
||||
TODO("date"),
|
||||
parcel.readString(),
|
||||
parcel.readInt(),
|
||||
parcel.readFloat(),
|
||||
parcel.readFloat(),
|
||||
parcel.readFloat(),
|
||||
parcel.readFloat(),
|
||||
parcel.readInt()
|
||||
) {
|
||||
}
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.writeString(timeString)
|
||||
parcel.writeInt(step)
|
||||
parcel.writeFloat(dis)
|
||||
parcel.writeFloat(speed)
|
||||
parcel.writeFloat(cal)
|
||||
parcel.writeFloat(fat)
|
||||
parcel.writeInt(time)
|
||||
}
|
||||
|
||||
override fun describeContents(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
companion object CREATOR : Parcelable.Creator<PedBean> {
|
||||
override fun createFromParcel(parcel: Parcel): PedBean {
|
||||
return PedBean(parcel)
|
||||
}
|
||||
|
||||
override fun newArray(size: Int): Array<PedBean?> {
|
||||
return arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,15 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import java.util.*
|
||||
|
||||
data class SlpBean(
|
||||
var date: Date = Date(),
|
||||
var timeString: String = "",
|
||||
var time: Int = 0,
|
||||
var lowTime: Int = 0,
|
||||
var lowCount: Int = 0,
|
||||
var minO2: Int = 0,
|
||||
var meanO2: Int = 0,
|
||||
var face: Int = 0
|
||||
|
||||
)
|
||||
@ -1,11 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import java.util.*
|
||||
|
||||
data class TmpBean(
|
||||
var date: Date = Date(),
|
||||
var timeString: String = "",
|
||||
var way: Int = 0,
|
||||
var tmp: Float = 0f,
|
||||
var face: Int = 0
|
||||
)
|
||||
@ -1,19 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.bean
|
||||
|
||||
import com.google.gson.Gson
|
||||
import java.util.*
|
||||
|
||||
data class UserBean(
|
||||
var id: String = "",
|
||||
var name: String = "",
|
||||
var ico: Int = 0,
|
||||
var sex: Int = 0,
|
||||
var birthday: Date = Date(),
|
||||
var weight: Int = 0,
|
||||
var height: Int = 0,
|
||||
var color: Int = 0
|
||||
)
|
||||
|
||||
fun UserBean.toJson(): String {
|
||||
return Gson().toJson(this)
|
||||
}
|
||||
@ -1,40 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.constant;
|
||||
|
||||
public class BTConstant {
|
||||
|
||||
// Bluetooth Command length
|
||||
public final static int WRITE_CONTENT_PKG_DATA_LENGTH = 1024;
|
||||
public final static int READ_CONTENT_ACK_DATA_LENGTH = 1024;
|
||||
public final static int COMMON_PKG_LENGTH = 8;
|
||||
public final static int COMMON_ACK_PKG_LENGTH = 12;
|
||||
public final static int READ_CONTENT_ACK_PKG_FRONT_LENGTH = 8;
|
||||
public final static int GET_INFO_ACK_PKG_LENGTH = 8 + 256;
|
||||
|
||||
public final static byte ACK_CMD_OK = 0;
|
||||
public final static byte ACK_CMD_BAD = 1;
|
||||
|
||||
// Bluetooth Max file name length
|
||||
public final static byte BT_WRITE_FILE_NAME_MAX_LENGTH = 30;
|
||||
public final static byte BT_READ_FILE_NAME_MAX_LENGTH = 30;
|
||||
|
||||
// Bluetooth Command word
|
||||
public final static byte CMD_WORD_START_WRITE = 0x00;
|
||||
public final static byte CMD_WORD_WRITE_CONTENT = 0x01;
|
||||
public final static byte CMD_WORD_END_WRITE = 0x02;
|
||||
public final static byte CMD_WORD_START_READ = 0x03;
|
||||
public final static byte CMD_WORD_READ_CONTENT = 0x04;
|
||||
public final static byte CMD_WORD_END_READ = 0x05;
|
||||
public final static byte CMD_WORD_DEL_FILE = 0x06;
|
||||
public final static byte CMD_WORD_LIST_START = 0x07;
|
||||
public final static byte CMD_WORD_LIST_DATA = 0x08;
|
||||
public final static byte CMD_WORD_LIST_END = 0x09;
|
||||
public final static byte CMD_WORD_LANG_UPDATE_START = 0x0A;
|
||||
public final static byte CMD_WORD_LANG_UPDATE_DATA = 0x0B;
|
||||
public final static byte CMD_WORD_LANG_UPDATE_END = 0x0C;
|
||||
public final static byte CMD_WORD_APP_UPDATE_START = 0x0D;
|
||||
public final static byte CMD_WORD_APP_UPDATE_DATA = 0x0E;
|
||||
public final static byte CMD_WORD_APP_UPDATE_END = 0x0F;
|
||||
public final static byte CMD_WORD_GET_INFO = 0x14;
|
||||
public final static byte CMD_WORD_PING = 0x15;
|
||||
public final static byte CMD_WORD_PARA_SYNC = 0x16;
|
||||
}
|
||||
@ -1,58 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.BpBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import java.util.*
|
||||
|
||||
|
||||
class BpInfo constructor(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size/11
|
||||
var Bp: ArrayList<BpBean> = arrayListOf<BpBean>()
|
||||
|
||||
|
||||
init {
|
||||
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k * 11
|
||||
val year: Int = toUInt(setRange(start, 2))
|
||||
val month: Int = toUInt(setRange(start + 2, 1)) - 1
|
||||
val date: Int = toUInt(setRange(start + 3, 1))
|
||||
val hour: Int = toUInt(setRange(start + 4, 1))
|
||||
val minute: Int = toUInt(setRange(start + 5, 1))
|
||||
val second: Int = toUInt(setRange(start + 6, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month
|
||||
calendar[Calendar.DATE] = date
|
||||
calendar[Calendar.HOUR] = hour
|
||||
calendar[Calendar.MINUTE] = minute
|
||||
calendar[Calendar.SECOND] = second
|
||||
Bp.add(BpBean())
|
||||
Bp[k].apply {
|
||||
this.date = calendar.time
|
||||
timeString = String.format(
|
||||
"%04d%02d%02d%02d%02d%02d",
|
||||
year,
|
||||
month + 1,
|
||||
date,
|
||||
hour,
|
||||
minute,
|
||||
second
|
||||
)
|
||||
sys = toUInt(setRange(start + 7, 2))
|
||||
dia = toUInt(setRange(start + 9, 1))
|
||||
pr = toUInt(setRange(start + 10, 1))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import com.cloud.diplomaticquarterapp.utils.unsigned
|
||||
|
||||
|
||||
class CheckMeResponse(var bytes: ByteArray) {
|
||||
var cmd: Int = bytes[1].unsigned()
|
||||
var pkgNo: Int = toUInt(bytes.copyOfRange(3, 5))
|
||||
var len: Int = toUInt(bytes.copyOfRange(5, 7))
|
||||
var content: ByteArray = bytes.copyOfRange(7, 7 + len)
|
||||
}
|
||||
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import android.util.Log
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import org.json.JSONObject
|
||||
|
||||
class DeviceInfo(buf: ByteArray) {
|
||||
var len: Int = toUInt(buf.copyOfRange(5, 7))
|
||||
var content: ByteArray = buf.copyOfRange(7, 7 + len)
|
||||
var deviceStr: String = String(content)
|
||||
var json: JSONObject
|
||||
|
||||
init {
|
||||
Log.i("byteSize", buf.decodeToString())
|
||||
Log.i("len::", len.toString())
|
||||
deviceStr = deviceStr.substring(0, deviceStr.indexOf("}") + 1)
|
||||
json = JSONObject(deviceStr)
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,69 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.DlcBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import java.util.*
|
||||
|
||||
|
||||
class DlcInfo(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size / 17
|
||||
var dlc: ArrayList<DlcBean> = arrayListOf<DlcBean>()
|
||||
|
||||
|
||||
init {
|
||||
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k * 17
|
||||
val year: Int = toUInt(setRange(start, 2))
|
||||
val month: Int = toUInt(setRange(start + 2, 1))
|
||||
val date: Int = toUInt(setRange(start + 3, 1))
|
||||
val hour: Int = toUInt(setRange(start + 4, 1))
|
||||
val minute: Int = toUInt(setRange(start + 5, 1))
|
||||
val second: Int = toUInt(setRange(start + 6, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month - 1
|
||||
calendar[Calendar.DATE] = date
|
||||
calendar[Calendar.HOUR] = hour
|
||||
calendar[Calendar.MINUTE] = minute
|
||||
calendar[Calendar.SECOND] = second
|
||||
dlc.add(DlcBean())
|
||||
dlc[k].apply {
|
||||
this.date = calendar.time
|
||||
timeString = String.format(
|
||||
"%04d%02d%02d%02d%02d%02d",
|
||||
year,
|
||||
month,
|
||||
date,
|
||||
hour,
|
||||
minute,
|
||||
second
|
||||
)
|
||||
hr = toUInt(setRange(start + 7, 2))
|
||||
eface = toUInt(setRange(start + 9, 1))
|
||||
if (eface > 2) eface = 2
|
||||
oxy = toUInt(setRange(start + 10, 1))
|
||||
pi = toUInt(setRange(start + 11, 1))
|
||||
oface = toUInt(setRange(start + 12, 1))
|
||||
if (oface > 2) oface = 2
|
||||
prFlag = toUInt(setRange(start + 13, 1))
|
||||
pr = toUInt(setRange(start + 14, 1))
|
||||
bpiFace = toUInt(setRange(start + 15, 1))
|
||||
if (bpiFace > 2) bpiFace = 2
|
||||
voice = toUInt(setRange(start + 16, 1))
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,60 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.EcgBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import java.util.*
|
||||
|
||||
|
||||
class EcgInfo(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size / 10
|
||||
var ecg: ArrayList<EcgBean> = arrayListOf<EcgBean>()
|
||||
|
||||
|
||||
init {
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k * 10
|
||||
val year: Int = toUInt(setRange(start, 2))
|
||||
val month: Int = toUInt(setRange(start + 2, 1)) - 1
|
||||
val date: Int = toUInt(setRange(start + 3, 1))
|
||||
val hour: Int = toUInt(setRange(start + 4, 1))
|
||||
val minute: Int = toUInt(setRange(start + 5, 1))
|
||||
val second: Int = toUInt(setRange(start + 6, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month
|
||||
calendar[Calendar.DATE] = date
|
||||
calendar[Calendar.HOUR] = hour
|
||||
calendar[Calendar.MINUTE] = minute
|
||||
calendar[Calendar.SECOND] = second
|
||||
ecg.add(EcgBean())
|
||||
ecg[k].apply {
|
||||
this.date = calendar.time
|
||||
timeString = String.format(
|
||||
"%04d%02d%02d%02d%02d%02d",
|
||||
year,
|
||||
month + 1,
|
||||
date,
|
||||
hour,
|
||||
minute,
|
||||
second
|
||||
)
|
||||
way = toUInt(setRange(start + 7, 1))
|
||||
face = toUInt(setRange(start + 8, 1))
|
||||
if (face > 2) face = 2
|
||||
voice = toUInt(setRange(start + 9, 1))
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,64 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
|
||||
|
||||
class EcgWaveInfo constructor(var bytes: ByteArray) {
|
||||
|
||||
var hrSize: Int = toUInt(bytes.copyOfRange(0, 2))
|
||||
var waveSize: Int = toUInt(bytes.copyOfRange(2, 6)) - 4
|
||||
var hr: Int = toUInt(bytes.copyOfRange(6, 8))
|
||||
var st: Int = toUInt(bytes.copyOfRange(8, 10))
|
||||
var qrs: Int = toUInt(bytes.copyOfRange(10, 12))
|
||||
var pvcs: Int = toUInt(bytes.copyOfRange(12, 14))
|
||||
var qtc: Int = toUInt(bytes.copyOfRange(14, 16))
|
||||
var result: Int = toUInt(bytes.copyOfRange(16, 17))
|
||||
var qt: Int = toUInt(bytes.copyOfRange(19, 21))
|
||||
var hrList: IntArray = IntArray(hrSize / 2)
|
||||
var waveList: IntArray = IntArray(waveSize / 2)
|
||||
var waveIntSize = waveSize / 2
|
||||
val total = 2500
|
||||
var waveViewSize = waveIntSize / total
|
||||
|
||||
|
||||
init {
|
||||
|
||||
for (index in 0 until hrSize / 2) {
|
||||
hrList[index] = toUInt(setRange(index * 2 + 22, 2))
|
||||
}
|
||||
// for (index in 0 until waveSize / 2) {
|
||||
|
||||
// waveList[index] =
|
||||
// bytes[23 + index * 2 + hrSize].toInt() * 256 + bytes[22 + index * 2 + hrSize].toInt()
|
||||
// }
|
||||
|
||||
|
||||
// waveList= ECGInnerItem(bytes).ecgData
|
||||
waveIntSize=waveList.size
|
||||
waveViewSize=waveIntSize/total
|
||||
if (waveViewSize * total < waveIntSize) {
|
||||
waveViewSize++
|
||||
}
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
fun getWave(index: Int): IntArray {
|
||||
val result = IntArray(total)
|
||||
for (k in 0 until total) {
|
||||
result[k] = if (k + index * total < waveList.size) {
|
||||
waveList[k + index * total]
|
||||
} else {
|
||||
1000000
|
||||
}
|
||||
|
||||
}
|
||||
return result
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -1,57 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.GluBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import java.util.*
|
||||
|
||||
|
||||
class GluInfo constructor(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size / 32
|
||||
var Glu: ArrayList<GluBean> = arrayListOf<GluBean>()
|
||||
|
||||
|
||||
init {
|
||||
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k * 32
|
||||
val year: Int = toUInt(setRange(start, 2))
|
||||
val month: Int = toUInt(setRange(start + 2, 1)) - 1
|
||||
val date: Int = toUInt(setRange(start + 3, 1))
|
||||
val hour: Int = toUInt(setRange(start + 4, 1))
|
||||
val minute: Int = toUInt(setRange(start + 5, 1))
|
||||
val second: Int = toUInt(setRange(start + 6, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month
|
||||
calendar[Calendar.DATE] = date
|
||||
calendar[Calendar.HOUR] = hour
|
||||
calendar[Calendar.MINUTE] = minute
|
||||
calendar[Calendar.SECOND] = second
|
||||
Glu.add(GluBean())
|
||||
Glu[k].apply {
|
||||
this.date = calendar.time
|
||||
timeString = String.format(
|
||||
"%04d%02d%02d%02d%02d%02d",
|
||||
year,
|
||||
month + 1,
|
||||
date,
|
||||
hour,
|
||||
minute,
|
||||
second
|
||||
)
|
||||
glu= toUInt(setRange(start+7,2)).toFloat()/10f
|
||||
note=String(setRange(start+12,20))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,56 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.OxyBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import java.util.*
|
||||
|
||||
|
||||
class OxyInfo constructor(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size / 12
|
||||
var Oxy: ArrayList<OxyBean> = arrayListOf()
|
||||
|
||||
init {
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k * 12
|
||||
val year: Int = toUInt(setRange(start, 2))
|
||||
val month: Int = toUInt(setRange(start + 2, 1)) - 1
|
||||
val date: Int = toUInt(setRange(start + 3, 1))
|
||||
val hour: Int = toUInt(setRange(start + 4, 1))
|
||||
val minute: Int = toUInt(setRange(start + 5, 1))
|
||||
val second: Int = toUInt(setRange(start + 6, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month
|
||||
calendar[Calendar.DATE] = date
|
||||
calendar[Calendar.HOUR] = hour
|
||||
calendar[Calendar.MINUTE] = minute
|
||||
calendar[Calendar.SECOND] = second
|
||||
Oxy.add(OxyBean())
|
||||
Oxy[k].apply {
|
||||
this.date = calendar.time
|
||||
timeString = String.format(
|
||||
"%04d%02d%02d%02d%02d%02d",
|
||||
year,
|
||||
month + 1,
|
||||
date,
|
||||
hour,
|
||||
minute,
|
||||
second
|
||||
)
|
||||
way = toUInt(setRange(start + 7, 1))
|
||||
if (way > 2) way = 2
|
||||
oxy = toUInt(setRange(start + 8, 1))
|
||||
pr = toUInt(setRange(start + 9, 1))
|
||||
pi = toUInt(setRange(start + 10, 1))
|
||||
face = toUInt(setRange(start + 11, 1))
|
||||
if (face > 2) face = 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,28 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import com.cloud.diplomaticquarterapp.utils.unsigned
|
||||
|
||||
|
||||
class OxyWaveInfo constructor(var bytes: ByteArray) {
|
||||
val size1: Int = toUInt(bytes.copyOfRange(0, 2))
|
||||
val size2: Int = toUInt(bytes.copyOfRange(2, 6))
|
||||
val o2Array = IntArray(size1 / 3)
|
||||
val pulseArray = IntArray(size1 / 3)
|
||||
val waveArray = IntArray(size2)
|
||||
|
||||
|
||||
init {
|
||||
for (k in 0 until size1 / 3) {
|
||||
o2Array[k] = bytes[k * 3 + 6].unsigned()
|
||||
pulseArray[k] =
|
||||
bytes[k * 3 + 7].unsigned() + bytes[k * 3 + 8].unsigned() * 256
|
||||
}
|
||||
for (k in 0 until size2) {
|
||||
waveArray[k] = bytes[k + 6 + size1].unsigned()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,63 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import android.util.Log
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.PedBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import java.util.*
|
||||
|
||||
|
||||
class PedInfo constructor(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size / 29
|
||||
var Ped: ArrayList<PedBean> = arrayListOf<PedBean>()
|
||||
|
||||
|
||||
init {
|
||||
Log.i("pedoSize",bytes.size.toString())
|
||||
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k * 29
|
||||
val year: Int = toUInt(setRange(start, 2))
|
||||
val month: Int = toUInt(setRange(start + 2, 1)) - 1
|
||||
val date: Int = toUInt(setRange(start + 3, 1))
|
||||
val hour: Int = toUInt(setRange(start + 4, 1))
|
||||
val minute: Int = toUInt(setRange(start + 5, 1))
|
||||
val second: Int = toUInt(setRange(start + 6, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month
|
||||
calendar[Calendar.DATE] = date
|
||||
calendar[Calendar.HOUR] = hour
|
||||
calendar[Calendar.MINUTE] = minute
|
||||
calendar[Calendar.SECOND] = second
|
||||
Ped.add(PedBean())
|
||||
Ped[k].apply {
|
||||
this.date = calendar.time
|
||||
timeString = String.format(
|
||||
"%04d%02d%02d%02d%02d%02d",
|
||||
year,
|
||||
month + 1,
|
||||
date,
|
||||
hour,
|
||||
minute,
|
||||
second
|
||||
)
|
||||
step = toUInt(setRange(start + 7, 4))
|
||||
dis = toUInt(setRange(start + 11, 4)).toFloat() / 100f
|
||||
speed = toUInt(setRange(start + 15, 4)).toFloat() / 10f
|
||||
cal = toUInt(setRange(start + 19, 4)).toFloat() / 100f
|
||||
fat = toUInt(setRange(start + 23, 2)).toFloat() / 100f
|
||||
time = toUInt(setRange(start + 25, 2))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import android.util.Log
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.SlpBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import java.util.*
|
||||
|
||||
|
||||
class SlpInfo constructor(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size / 18
|
||||
var Slp: ArrayList<SlpBean> = arrayListOf<SlpBean>()
|
||||
fun byteArray2String(byteArray: ByteArray): String {
|
||||
var fuc = ""
|
||||
for (b in byteArray) {
|
||||
val st = String.format("%02X", b)
|
||||
fuc += ("$st ");
|
||||
}
|
||||
return fuc
|
||||
}
|
||||
|
||||
init {
|
||||
|
||||
Log.e("sleepSIze",byteArray2String(bytes))
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k *18
|
||||
val year: Int = toUInt(setRange(start, 2))
|
||||
val month: Int = toUInt(setRange(start + 2, 1)) - 1
|
||||
val date: Int = toUInt(setRange(start + 3, 1))
|
||||
val hour: Int = toUInt(setRange(start + 4, 1))
|
||||
val minute: Int = toUInt(setRange(start + 5, 1))
|
||||
val second: Int = toUInt(setRange(start + 6, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month
|
||||
calendar[Calendar.DATE] = date
|
||||
calendar[Calendar.HOUR] = hour
|
||||
calendar[Calendar.MINUTE] = minute
|
||||
calendar[Calendar.SECOND] = second
|
||||
Slp.add(SlpBean())
|
||||
Slp[k].apply {
|
||||
this.date = calendar.time
|
||||
timeString = String.format(
|
||||
"%04d%02d%02d%02d%02d%02d",
|
||||
year,
|
||||
month + 1,
|
||||
date,
|
||||
hour,
|
||||
minute,
|
||||
second
|
||||
)
|
||||
time = toUInt(setRange(start + 7, 4))
|
||||
lowTime = toUInt(setRange(start + 11, 2))
|
||||
lowCount = toUInt(setRange(start + 13, 2))
|
||||
minO2 = toUInt(setRange(start + 15, 1))
|
||||
meanO2 = toUInt(setRange(start + 16, 1))
|
||||
face = toUInt(setRange(start + 17, 1))
|
||||
if (face > 2) face = 2
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,59 +0,0 @@
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.TmpBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import java.util.*
|
||||
|
||||
|
||||
class TmpInfo constructor(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size / 11
|
||||
var Tmp: ArrayList<TmpBean> = arrayListOf<TmpBean>()
|
||||
|
||||
|
||||
init {
|
||||
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k * 11
|
||||
val year: Int = toUInt(setRange(start, 2))
|
||||
val month: Int = toUInt(setRange(start + 2, 1)) - 1
|
||||
val date: Int = toUInt(setRange(start + 3, 1))
|
||||
val hour: Int = toUInt(setRange(start + 4, 1))
|
||||
val minute: Int = toUInt(setRange(start + 5, 1))
|
||||
val second: Int = toUInt(setRange(start + 6, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month
|
||||
calendar[Calendar.DATE] = date
|
||||
calendar[Calendar.HOUR] = hour
|
||||
calendar[Calendar.MINUTE] = minute
|
||||
calendar[Calendar.SECOND] = second
|
||||
Tmp.add(TmpBean())
|
||||
Tmp[k].apply {
|
||||
this.date = calendar.time
|
||||
timeString = String.format(
|
||||
"%04d%02d%02d%02d%02d%02d",
|
||||
year,
|
||||
month + 1,
|
||||
date,
|
||||
hour,
|
||||
minute,
|
||||
second
|
||||
)
|
||||
way = toUInt(setRange(start + 7, 1))
|
||||
if (way > 2) way = 2
|
||||
tmp = toUInt(setRange(start + 8, 2)).toFloat() / 10f
|
||||
face = toUInt(setRange(start + 10, 1))
|
||||
if (face > 2) face = 2
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,46 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.bean.UserBean
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import com.cloud.diplomaticquarterapp.utils.unsigned
|
||||
import java.util.*
|
||||
|
||||
|
||||
class UserInfo constructor(var bytes: ByteArray) {
|
||||
var size: Int = bytes.size / 27
|
||||
var user: Array<UserBean> = Array(size) {
|
||||
UserBean()
|
||||
}
|
||||
|
||||
init {
|
||||
|
||||
var start: Int
|
||||
for (k in 0 until size) {
|
||||
start = k * 27
|
||||
user[k].id = bytes[start].unsigned().toString()
|
||||
user[k].name = String(setRange(start + 1, 16))
|
||||
user[k].ico = bytes[start + 17].unsigned()
|
||||
user[k].sex = bytes[start + 18].unsigned()
|
||||
val year: Int = toUInt(setRange(start + 19, 2))
|
||||
val month: Int = toUInt(setRange(start + 21, 1)) - 1
|
||||
val date: Int = toUInt(setRange(start + 22, 1))
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar[Calendar.YEAR] = year
|
||||
calendar[Calendar.MONTH] = month
|
||||
calendar[Calendar.DATE] = date
|
||||
user[k].birthday = calendar.time
|
||||
user[k].weight = toUInt(setRange(start + 23, 2)) /10
|
||||
user[k].height = toUInt(setRange(start + 25, 2))
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun setRange(start: Int, len: Int): ByteArray {
|
||||
return bytes.copyOfRange(start, start + len)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,111 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.manager;
|
||||
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.bluetooth.BluetoothGattService;
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.UUID;
|
||||
|
||||
import no.nordicsemi.android.ble.BleManager;
|
||||
import no.nordicsemi.android.ble.data.Data;
|
||||
|
||||
public class BleDataManager extends BleManager {
|
||||
private BluetoothGattCharacteristic write_char;
|
||||
private BluetoothGattCharacteristic notify_char;
|
||||
private OnNotifyListener listener;
|
||||
|
||||
public BleDataManager(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public void setNotifyListener(OnNotifyListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BleManagerGattCallback getGattCallback() {
|
||||
return new MyManagerGattCallback();
|
||||
}
|
||||
|
||||
public void sendCmd(byte[] bytes) {
|
||||
// Log.i("----- Current Write Command -----", "");
|
||||
writeCharacteristic(write_char, bytes)
|
||||
.split()
|
||||
.done(device -> {
|
||||
})
|
||||
.enqueue();
|
||||
}
|
||||
|
||||
|
||||
public interface OnNotifyListener {
|
||||
void onNotify(BluetoothDevice device, Data data);
|
||||
}
|
||||
|
||||
private class MyManagerGattCallback extends BleManagerGattCallback {
|
||||
@Override
|
||||
public boolean isRequiredServiceSupported(BluetoothGatt gatt) {
|
||||
final BluetoothGattService service = gatt.getService(service_uuid);
|
||||
|
||||
|
||||
if (service != null) {
|
||||
write_char = service.getCharacteristic(write_uuid);
|
||||
notify_char = service.getCharacteristic(notify_uuid);
|
||||
}
|
||||
|
||||
boolean notify = false;
|
||||
if (notify_char != null) {
|
||||
final int properties = notify_char.getProperties();
|
||||
notify = (properties & BluetoothGattCharacteristic.PROPERTY_NOTIFY) != 0;
|
||||
}
|
||||
boolean writeRequest = false;
|
||||
if (write_char != null) {
|
||||
final int properties = write_char.getProperties();
|
||||
int writeType = BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT;
|
||||
if ((properties & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) != 0) {
|
||||
writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE;
|
||||
}
|
||||
write_char.setWriteType(writeType);
|
||||
writeRequest = (properties & BluetoothGattCharacteristic.PROPERTY_WRITE) != 0 || (properties & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) != 0;
|
||||
/// LepuBleLog.d(TAG, "writeChar writeRequest == " + writeRequest);
|
||||
|
||||
}
|
||||
// Return true if all required services have been found
|
||||
return write_char != null && notify_char != null
|
||||
&& notify && writeRequest;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOptionalServiceSupported(BluetoothGatt gatt) {
|
||||
return super.isOptionalServiceSupported(gatt);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initialize() {
|
||||
beginAtomicRequestQueue()
|
||||
.add(requestMtu(23) // Remember, GATT needs 3 bytes extra. This will allow packet size of 244 bytes.
|
||||
.with((device, mtu) -> Log.d("TAG", "MTU set to " + mtu))
|
||||
.fail((device, status) -> log(Log.WARN, "Requested MTU not supported: " + status)))
|
||||
.add(enableNotifications(notify_char))
|
||||
.done(device -> Log.d("TAG", "Target initialized"))
|
||||
.enqueue();
|
||||
setNotificationCallback(notify_char)
|
||||
.with((device, data) -> {
|
||||
listener.onNotify(device, data);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceDisconnected() {
|
||||
write_char = null;
|
||||
notify_char = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static final UUID service_uuid = UUID.fromString("14839ac4-7d7e-415c-9a42-167340cf2339");
|
||||
public static final UUID write_uuid = UUID.fromString("8B00ACE7-EB0B-49B0-BBE9-9AEE0A26E1A3");
|
||||
public static final UUID notify_uuid = UUID.fromString("0734594A-A8E7-4B1A-A6B1-CD5243059A57");
|
||||
}
|
||||
@ -1,64 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.manager
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.bluetooth.BluetoothAdapter
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.BluetoothManager
|
||||
import android.bluetooth.le.BluetoothLeScanner
|
||||
import android.bluetooth.le.ScanCallback
|
||||
import android.bluetooth.le.ScanResult
|
||||
import android.bluetooth.le.ScanSettings
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.cloud.diplomaticquarterapp.utils.Constant
|
||||
|
||||
|
||||
class BleScanManager {
|
||||
interface Scan {
|
||||
fun scanReturn(name: String, bluetoothDevice: BluetoothDevice)
|
||||
}
|
||||
|
||||
private var bluetoothAdapter: BluetoothAdapter? = null
|
||||
private lateinit var leScanner: BluetoothLeScanner
|
||||
private var scan: Scan? = null
|
||||
private val leScanCallback: ScanCallback = object : ScanCallback() {
|
||||
@SuppressLint("MissingPermission")
|
||||
override fun onScanResult(
|
||||
callbackType: Int, result: ScanResult
|
||||
) {
|
||||
super.onScanResult(callbackType, result)
|
||||
val device = result.device
|
||||
if (device?.name == null) return;
|
||||
scan?.apply {
|
||||
scanReturn(device.name, device)
|
||||
}
|
||||
Log.i("scanned ble", " ${device.name}")
|
||||
}
|
||||
|
||||
override fun onBatchScanResults(results: List<ScanResult>) {}
|
||||
override fun onScanFailed(errorCode: Int) {}
|
||||
}
|
||||
|
||||
fun setCallBack(scan: Scan) {
|
||||
this.scan = scan
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
fun initScan(context: Context) {
|
||||
context.apply {
|
||||
val settings: ScanSettings = ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).build()
|
||||
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
|
||||
bluetoothAdapter = bluetoothManager.adapter
|
||||
leScanner = bluetoothAdapter!!.bluetoothLeScanner
|
||||
leScanner.startScan(null, settings, leScanCallback)
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
fun stopScan() {
|
||||
leScanner.stopScan(leScanCallback)
|
||||
}
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.constant.BTConstant
|
||||
import com.cloud.diplomaticquarterapp.utils.CRCUtils
|
||||
import kotlin.experimental.inv
|
||||
|
||||
class EndReadPkg {
|
||||
var buf: ByteArray = ByteArray(BTConstant.COMMON_PKG_LENGTH)
|
||||
|
||||
init {
|
||||
// TODO Auto-generated constructor stub
|
||||
buf[0] = 0xAA.toByte()
|
||||
buf[1] = BTConstant.CMD_WORD_END_READ
|
||||
buf[2] = BTConstant.CMD_WORD_END_READ.inv()
|
||||
buf[3] = 0 //Package number, the default is 0
|
||||
buf[4] = 0
|
||||
buf[5] = 0 //data chunk size, the default is 0
|
||||
buf[6] = 0
|
||||
buf[buf.size - 1] = CRCUtils.calCRC8(buf)
|
||||
}
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg
|
||||
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.constant.BTConstant
|
||||
import com.cloud.diplomaticquarterapp.utils.CRCUtils
|
||||
import kotlin.experimental.inv
|
||||
|
||||
|
||||
class GetDeviceInfoPkg() {
|
||||
val buf: ByteArray = ByteArray(BTConstant.COMMON_PKG_LENGTH)
|
||||
|
||||
init {
|
||||
buf[0] = 0xAA.toByte()
|
||||
buf[1] = BTConstant.CMD_WORD_GET_INFO
|
||||
buf[2] = BTConstant.CMD_WORD_GET_INFO.inv()
|
||||
buf[3] = 0.toByte() //Package number
|
||||
buf[4] = 0.toByte()
|
||||
buf[5] = 0.toByte()
|
||||
buf[6] = 0.toByte()
|
||||
buf[buf.size - 1] = CRCUtils.calCRC8(buf)
|
||||
}
|
||||
}
|
||||
@ -1,19 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.constant.BTConstant
|
||||
import com.cloud.diplomaticquarterapp.utils.CRCUtils
|
||||
import kotlin.experimental.inv
|
||||
|
||||
class ReadContentPkg(pkgNum: Int) {
|
||||
val buf: ByteArray = ByteArray(BTConstant.COMMON_PKG_LENGTH)
|
||||
|
||||
init {
|
||||
buf[0] = 0xAA.toByte()
|
||||
buf[1] = BTConstant.CMD_WORD_READ_CONTENT
|
||||
buf[2] = BTConstant.CMD_WORD_READ_CONTENT.inv()
|
||||
buf[3] = pkgNum.toByte() //Package number
|
||||
buf[4] = (pkgNum shr 8).toByte()
|
||||
buf[5] = 0 //data chunk size, the default is 0
|
||||
buf[6] = 0
|
||||
buf[buf.size - 1] = CRCUtils.calCRC8(buf)
|
||||
}
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.constant.BTConstant
|
||||
import com.cloud.diplomaticquarterapp.utils.CRCUtils
|
||||
import kotlin.experimental.inv
|
||||
|
||||
class StartReadPkg(fileName: String?) {
|
||||
val buf: ByteArray = ByteArray(BTConstant.COMMON_PKG_LENGTH + fileName!!.length + 1)
|
||||
|
||||
init {
|
||||
buf[0] = (0xAA).toByte()
|
||||
buf[1] = BTConstant.CMD_WORD_START_READ
|
||||
buf[2] = BTConstant.CMD_WORD_START_READ.inv()
|
||||
buf[3] = 0 //Package number, the default is 0
|
||||
buf[4] = 0
|
||||
buf[5] = (buf.size - BTConstant.COMMON_PKG_LENGTH).toByte() //data chunk size
|
||||
buf[6] = (buf.size - BTConstant.COMMON_PKG_LENGTH shr 8).toByte()
|
||||
val tempFileName = fileName!!.toCharArray()
|
||||
for (i in tempFileName.indices) {
|
||||
buf[i + 7] = tempFileName[i].toByte()
|
||||
}
|
||||
buf[buf.size - 1] = CRCUtils.calCRC8(buf)
|
||||
}
|
||||
}
|
||||
@ -1,224 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.check_me_pro.ble.worker
|
||||
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.content.Context
|
||||
import android.os.Environment
|
||||
import android.util.Log
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.CheckMeResponse
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.DeviceInfo
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.UserInfo
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.manager.BleDataManager
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.EndReadPkg
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.GetDeviceInfoPkg
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.ReadContentPkg
|
||||
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.StartReadPkg
|
||||
import com.cloud.diplomaticquarterapp.utils.CRCUtils
|
||||
import com.cloud.diplomaticquarterapp.utils.Constant
|
||||
import com.cloud.diplomaticquarterapp.utils.add
|
||||
import com.cloud.diplomaticquarterapp.utils.toUInt
|
||||
import com.google.gson.Gson
|
||||
import io.flutter.plugin.common.EventChannel
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import no.nordicsemi.android.ble.data.Data
|
||||
import java.io.File
|
||||
import kotlin.experimental.inv
|
||||
|
||||
class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
|
||||
private var pool: ByteArray? = null
|
||||
private val deviceChannel = Channel<DeviceInfo>(Channel.CONFLATED)
|
||||
private val fileChannel = Channel<Int>(Channel.CONFLATED)
|
||||
private val connectChannel = Channel<String>(Channel.CONFLATED)
|
||||
private var myBleDataManager: BleDataManager? = null
|
||||
private val dataScope = CoroutineScope(Dispatchers.IO)
|
||||
private val mutex = Mutex()
|
||||
|
||||
private var cmdState = 0;
|
||||
var pkgTotal = 0;
|
||||
var currentPkg = 0;
|
||||
var fileData: ByteArray? = null
|
||||
var currentFileName = ""
|
||||
var result = 1;
|
||||
var currentFileSize = 0
|
||||
|
||||
|
||||
companion object {
|
||||
val fileProgressChannel = Channel<FileProgress>(Channel.CONFLATED)
|
||||
}
|
||||
|
||||
data class FileProgress(
|
||||
var name: String = "", var progress: Int = 0, var success: Boolean = false
|
||||
)
|
||||
|
||||
private val comeData = object : BleDataManager.OnNotifyListener {
|
||||
override fun onNotify(device: BluetoothDevice?, data: Data?) {
|
||||
data?.value?.apply {
|
||||
pool = add(pool, this)
|
||||
}
|
||||
pool?.apply {
|
||||
pool = handleDataPool(pool)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
val gson = Gson()
|
||||
|
||||
|
||||
private fun handleDataPool(bytes: ByteArray?): ByteArray? {
|
||||
val bytesLeft: ByteArray? = bytes
|
||||
|
||||
if (bytes == null || bytes.size < 8) {
|
||||
return bytes
|
||||
}
|
||||
loop@ for (i in 0 until bytes.size - 7) {
|
||||
if (bytes[i] != 0x55.toByte() || bytes[i + 1] != bytes[i + 2].inv()) {
|
||||
continue@loop
|
||||
}
|
||||
|
||||
// need content length
|
||||
val len = toUInt(bytes.copyOfRange(i + 5, i + 7))
|
||||
if (i + 8 + len > bytes.size) {
|
||||
continue@loop
|
||||
}
|
||||
|
||||
val temp: ByteArray = bytes.copyOfRange(i, i + 8 + len)
|
||||
if (temp.last() == CRCUtils.calCRC8(temp)) {
|
||||
|
||||
if (cmdState in 1..3) {
|
||||
val bleResponse = CheckMeResponse(temp)
|
||||
if (cmdState == 1) {
|
||||
currentFileSize = toUInt(bleResponse.content)
|
||||
pkgTotal = currentFileSize / 512
|
||||
if (bleResponse.cmd == 1) {
|
||||
result = 1
|
||||
val pkg = EndReadPkg()
|
||||
sendCmd(pkg.buf)
|
||||
cmdState = 3
|
||||
} else if (bleResponse.cmd == 0) {
|
||||
val pkg = ReadContentPkg(currentPkg)
|
||||
sendCmd(pkg.buf)
|
||||
currentPkg++
|
||||
cmdState = 2;
|
||||
}
|
||||
|
||||
|
||||
} else if (cmdState == 2) {
|
||||
bleResponse.content.apply {
|
||||
fileData = add(fileData, this)
|
||||
fileData?.let {
|
||||
dataScope.launch {
|
||||
fileProgressChannel.send(
|
||||
FileProgress(
|
||||
currentFileName, it.size * 100 / currentFileSize, true
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (currentPkg > pkgTotal) {
|
||||
fileData?.apply {
|
||||
result = 0
|
||||
Log.i("file", "receive $currentFileName")
|
||||
File(Constant.getPathX(currentFileName)).writeBytes(this)
|
||||
|
||||
}
|
||||
val pkg = EndReadPkg()
|
||||
Log.i("file", "bytes ${pkg.buf}")
|
||||
sendCmd(pkg.buf)
|
||||
cmdState = 3
|
||||
|
||||
|
||||
} else {
|
||||
val pkg = ReadContentPkg(currentPkg)
|
||||
sendCmd(pkg.buf)
|
||||
currentPkg++
|
||||
}
|
||||
|
||||
} else if (cmdState == 3) {
|
||||
fileData = null
|
||||
currentPkg = 0
|
||||
cmdState = 0
|
||||
dataScope.launch {
|
||||
fileProgressChannel.send(
|
||||
FileProgress(
|
||||
currentFileName, 100, result == 0
|
||||
)
|
||||
)
|
||||
fileChannel.send(result)
|
||||
}
|
||||
}
|
||||
} else if (cmdState == 4) {
|
||||
val deviceInfo = DeviceInfo(temp)
|
||||
|
||||
val json = deviceInfo.json
|
||||
var s: String = ""
|
||||
for (k in json.keys()) {
|
||||
s += "$k: "
|
||||
s += "${json.get(k)} "
|
||||
}
|
||||
val returnData = mapOf("type" to "infoDataCheckMe", "data" to gson.toJson(json))
|
||||
updateEventSink(returnData)
|
||||
}
|
||||
|
||||
|
||||
val tempBytes: ByteArray? = if (i + 8 + len == bytes.size) null else bytes.copyOfRange(
|
||||
i + 8 + len, bytes.size
|
||||
)
|
||||
|
||||
return handleDataPool(tempBytes)
|
||||
}
|
||||
}
|
||||
|
||||
return bytesLeft
|
||||
}
|
||||
|
||||
private fun sendCmd(bs: ByteArray) {
|
||||
myBleDataManager?.sendCmd(bs)
|
||||
}
|
||||
|
||||
|
||||
fun initWorker(context: Context, bluetoothDevice: BluetoothDevice?) {
|
||||
myBleDataManager = BleDataManager(context)
|
||||
myBleDataManager?.setNotifyListener(comeData)
|
||||
bluetoothDevice?.let {
|
||||
myBleDataManager?.connect(it)?.useAutoConnect(false)?.retry(150, 100)?.done {
|
||||
dataScope.launch {
|
||||
connectChannel.send("yes")
|
||||
}
|
||||
}?.enqueue()
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun waitConnect() {
|
||||
connectChannel.receive()
|
||||
}
|
||||
|
||||
suspend fun getFile(name: String): Int {
|
||||
mutex.withLock {
|
||||
this.currentFileName = name
|
||||
cmdState = 1
|
||||
val pkg = StartReadPkg(name)
|
||||
Log.i("----- Current PKG -----", pkg.buf.toString());
|
||||
sendCmd(pkg.buf)
|
||||
return fileChannel.receive()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getDeviceInfo() {
|
||||
cmdState = 4
|
||||
val pkg = GetDeviceInfoPkg()
|
||||
sendCmd(pkg.buf)
|
||||
|
||||
}
|
||||
|
||||
fun disconnect() {
|
||||
myBleDataManager?.disconnect()?.enqueue()
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
package com.cloud.diplomaticquarterapp.penguin
|
||||
|
||||
enum class PenguinMethod {
|
||||
// initializePenguin("initializePenguin"),
|
||||
// configurePenguin("configurePenguin"),
|
||||
// showPenguinUI("showPenguinUI"),
|
||||
// onPenNavUIDismiss("onPenNavUIDismiss"),
|
||||
// onReportIssue("onReportIssue"),
|
||||
// onPenNavSuccess("onPenNavSuccess"),
|
||||
onPenNavInitializationError // onLocationOffCampus("onLocationOffCampus"),
|
||||
// navigateToPOI("navigateToPOI"),
|
||||
// openSharedLocation("openSharedLocation");
|
||||
}
|
||||
@ -0,0 +1,97 @@
|
||||
package com.cloud.diplomaticquarterapp.penguin
|
||||
|
||||
import android.content.Context
|
||||
import com.google.gson.Gson
|
||||
import com.peng.pennavmap.PlugAndPlaySDK
|
||||
import com.peng.pennavmap.connections.ApiController
|
||||
import com.peng.pennavmap.interfaces.RefIdDelegate
|
||||
import com.peng.pennavmap.models.TokenModel
|
||||
import com.peng.pennavmap.models.postmodels.PostToken
|
||||
import com.peng.pennavmap.utils.AppSharedData
|
||||
import okhttp3.ResponseBody
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import android.util.Log
|
||||
|
||||
|
||||
class PenguinNavigator() {
|
||||
|
||||
fun navigateTo(mContext: Context, refID: String, delegate: RefIdDelegate,clientID : String,clientKey : String ) {
|
||||
val postToken = PostToken(clientID, clientKey)
|
||||
getToken(mContext, postToken, object : RefIdDelegate {
|
||||
override fun onRefByIDSuccess(PoiId: String?) {
|
||||
Log.e("navigateTo", "PoiId is+++++++ $PoiId")
|
||||
|
||||
PlugAndPlaySDK.navigateTo(mContext, refID, object : RefIdDelegate {
|
||||
override fun onRefByIDSuccess(PoiId: String?) {
|
||||
Log.e("navigateTo", "PoiId 2is+++++++ $PoiId")
|
||||
|
||||
delegate.onRefByIDSuccess(refID)
|
||||
|
||||
}
|
||||
|
||||
override fun onGetByRefIDError(error: String?) {
|
||||
delegate.onRefByIDSuccess(error)
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
override fun onGetByRefIDError(error: String?) {
|
||||
delegate.onRefByIDSuccess(error)
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
fun getToken(mContext: Context, postToken: PostToken?, apiTokenCallBack: RefIdDelegate) {
|
||||
try {
|
||||
// Create the API call
|
||||
val purposesCall: Call<ResponseBody> = ApiController.getInstance(mContext)
|
||||
.apiMethods
|
||||
.getToken(postToken)
|
||||
|
||||
// Enqueue the call for asynchronous execution
|
||||
purposesCall.enqueue(object : Callback<ResponseBody?> {
|
||||
override fun onResponse(
|
||||
call: Call<ResponseBody?>,
|
||||
response: Response<ResponseBody?>
|
||||
) {
|
||||
if (response.isSuccessful() && response.body() != null) {
|
||||
try {
|
||||
response.body()?.use { responseBody ->
|
||||
val responseBodyString: String = responseBody.string() // Use `string()` to get the actual response content
|
||||
if (responseBodyString.isNotEmpty()) {
|
||||
val tokenModel = Gson().fromJson(responseBodyString, TokenModel::class.java)
|
||||
if (tokenModel != null && tokenModel.token != null) {
|
||||
AppSharedData.apiToken = tokenModel.token
|
||||
apiTokenCallBack.onRefByIDSuccess(tokenModel.token)
|
||||
} else {
|
||||
apiTokenCallBack.onGetByRefIDError("Failed to parse token model")
|
||||
}
|
||||
} else {
|
||||
apiTokenCallBack.onGetByRefIDError("Response body is empty")
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
apiTokenCallBack.onGetByRefIDError("An error occurred: ${e.message}")
|
||||
}
|
||||
} else {
|
||||
apiTokenCallBack.onGetByRefIDError("Unsuccessful response: " + response.code())
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<ResponseBody?>, t: Throwable) {
|
||||
apiTokenCallBack.onGetByRefIDError(t.message)
|
||||
}
|
||||
})
|
||||
} catch (error: Exception) {
|
||||
apiTokenCallBack.onGetByRefIDError("Exception during API call: $error")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,321 @@
|
||||
package com.cloud.diplomaticquarterapp.penguin
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Context.RECEIVER_EXPORTED
|
||||
import android.content.IntentFilter
|
||||
import android.graphics.Color
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.RelativeLayout
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.cloud.diplomaticquarterapp.PermissionManager.PermissionHelper
|
||||
import com.cloud.diplomaticquarterapp.PermissionManager.PermissionManager
|
||||
import com.cloud.diplomaticquarterapp.PermissionManager.PermissionResultReceiver
|
||||
import com.ejada.hmg.MainActivity
|
||||
import com.peng.pennavmap.PlugAndPlayConfiguration
|
||||
import com.peng.pennavmap.PlugAndPlaySDK
|
||||
import com.peng.pennavmap.enums.InitializationErrorType
|
||||
import com.peng.pennavmap.interfaces.PenNavUIDelegate
|
||||
import com.peng.pennavmap.utils.Languages
|
||||
import io.flutter.plugin.common.BinaryMessenger
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import io.flutter.plugin.platform.PlatformView
|
||||
import com.cloud.diplomaticquarterapp.penguin.PenguinNavigator
|
||||
import com.peng.pennavmap.interfaces.PIEventsDelegate
|
||||
import com.peng.pennavmap.interfaces.PILocationDelegate
|
||||
import com.peng.pennavmap.interfaces.RefIdDelegate
|
||||
import com.peng.pennavmap.models.PIReportIssue
|
||||
/**
|
||||
* Custom PlatformView for displaying Penguin UI components within a Flutter app.
|
||||
* Implements `PlatformView` for rendering the view, `MethodChannel.MethodCallHandler` for handling method calls,
|
||||
* and `PenNavUIDelegate` for handling SDK events.
|
||||
*/
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
internal class PenguinView(
|
||||
context: Context,
|
||||
id: Int,
|
||||
val creationParams: Map<String, Any>,
|
||||
messenger: BinaryMessenger,
|
||||
activity: MainActivity,
|
||||
val channel: MethodChannel
|
||||
) : PlatformView, MethodChannel.MethodCallHandler, PenNavUIDelegate {
|
||||
// The layout for displaying the Penguin UI
|
||||
private val mapLayout: RelativeLayout = RelativeLayout(context)
|
||||
private val _context: Context = context
|
||||
|
||||
private val permissionResultReceiver: PermissionResultReceiver
|
||||
private val permissionIntentFilter = IntentFilter("PERMISSION_RESULT_ACTION")
|
||||
|
||||
private companion object {
|
||||
const val PERMISSIONS_REQUEST_CODE = 1
|
||||
}
|
||||
|
||||
private lateinit var permissionManager: PermissionManager
|
||||
|
||||
// Reference to the main activity
|
||||
private var _activity: Activity = activity
|
||||
|
||||
private lateinit var mContext: Context
|
||||
|
||||
lateinit var navigator: PenguinNavigator
|
||||
|
||||
init {
|
||||
// Set layout parameters for the mapLayout
|
||||
mapLayout.layoutParams = ViewGroup.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
|
||||
mContext = context
|
||||
|
||||
|
||||
permissionResultReceiver = PermissionResultReceiver { granted ->
|
||||
if (granted) {
|
||||
onPermissionsGranted()
|
||||
} else {
|
||||
onPermissionsDenied()
|
||||
}
|
||||
}
|
||||
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
mContext.registerReceiver(
|
||||
permissionResultReceiver,
|
||||
permissionIntentFilter,
|
||||
RECEIVER_EXPORTED
|
||||
)
|
||||
} else {
|
||||
mContext.registerReceiver(
|
||||
permissionResultReceiver,
|
||||
permissionIntentFilter,
|
||||
)
|
||||
}
|
||||
|
||||
// Set the background color of the layout
|
||||
mapLayout.setBackgroundColor(Color.RED)
|
||||
|
||||
permissionManager = PermissionManager(
|
||||
context = mContext,
|
||||
listener = object : PermissionManager.PermissionListener {
|
||||
override fun onPermissionGranted() {
|
||||
// Handle permissions granted
|
||||
onPermissionsGranted()
|
||||
}
|
||||
|
||||
override fun onPermissionDenied() {
|
||||
// Handle permissions denied
|
||||
onPermissionsDenied()
|
||||
}
|
||||
},
|
||||
requestCode = PERMISSIONS_REQUEST_CODE,
|
||||
*PermissionHelper.getRequiredPermissions()
|
||||
)
|
||||
|
||||
if (!permissionManager.arePermissionsGranted()) {
|
||||
permissionManager.requestPermissions(_activity)
|
||||
} else {
|
||||
// Permissions already granted
|
||||
permissionManager.listener.onPermissionGranted()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun onPermissionsGranted() {
|
||||
// Handle the actions when permissions are granted
|
||||
Log.d("PermissionsResult", "onPermissionsGranted")
|
||||
// Register the platform view factory for creating custom views
|
||||
|
||||
// Initialize the Penguin SDK
|
||||
initPenguin()
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun onPermissionsDenied() {
|
||||
// Handle the actions when permissions are denied
|
||||
Log.d("PermissionsResult", "onPermissionsDenied")
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the view associated with this PlatformView.
|
||||
*
|
||||
* @return The main view for this PlatformView.
|
||||
*/
|
||||
override fun getView(): View {
|
||||
return mapLayout
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up resources associated with this PlatformView.
|
||||
*/
|
||||
override fun dispose() {
|
||||
// Cleanup code if needed
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles method calls from Dart code.
|
||||
*
|
||||
* @param call The method call from Dart.
|
||||
* @param result The result callback to send responses back to Dart.
|
||||
*/
|
||||
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
|
||||
// Handle method calls from Dart code here
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the Penguin SDK with custom configuration and delegates.
|
||||
*/
|
||||
private fun initPenguin() {
|
||||
navigator = PenguinNavigator()
|
||||
// Configure the PlugAndPlaySDK
|
||||
val language = when (creationParams["languageCode"] as String) {
|
||||
"ar" -> Languages.ar
|
||||
"en" -> Languages.en
|
||||
else -> {
|
||||
Languages.en
|
||||
}
|
||||
}
|
||||
Log.d(
|
||||
"TAG",
|
||||
"initPenguin: ${Languages.getLanguageEnum(creationParams["languageCode"] as String)}"
|
||||
)
|
||||
PlugAndPlaySDK.configuration = PlugAndPlayConfiguration.Builder()
|
||||
.setBaseUrl(
|
||||
creationParams["dataURL"] as String,
|
||||
creationParams["positionURL"] as String
|
||||
)
|
||||
.setServiceName(
|
||||
creationParams["dataServiceName"] as String,
|
||||
creationParams["positionServiceName"] as String
|
||||
)
|
||||
.setClientData(
|
||||
creationParams["clientID"] as String,
|
||||
creationParams["clientKey"] as String
|
||||
)
|
||||
.setUserName(creationParams["username"] as String)
|
||||
// .setLanguageID(Languages.en)
|
||||
.setLanguageID(language)
|
||||
.setSimulationModeEnabled(creationParams["isSimulationModeEnabled"] as Boolean)
|
||||
.setEnableBackButton(true)
|
||||
// .setDeepLinkData("deeplink")
|
||||
.setCustomizeColor("#2CA0AF")
|
||||
.setDeepLinkSchema("")
|
||||
.setIsEnableReportIssue(true)
|
||||
.build()
|
||||
|
||||
// Set location delegate to handle location updates
|
||||
// PlugAndPlaySDK.setPiLocationDelegate {
|
||||
// Example code to handle location updates
|
||||
// Uncomment and modify as needed
|
||||
// if (location.size() > 0)
|
||||
// Toast.makeText(_context, "Location Info Latitude: ${location[0]}, Longitude: ${location[1]}", Toast.LENGTH_SHORT).show()
|
||||
// }
|
||||
|
||||
// Set events delegate for reporting issues
|
||||
// PlugAndPlaySDK.setPiEventsDelegate(new PIEventsDelegate() {
|
||||
// @Override
|
||||
// public void onReportIssue(PIReportIssue issue) {
|
||||
// Log.e("Issue Reported: ", issue.getReportType());
|
||||
// }
|
||||
// // Implement issue reporting logic here }
|
||||
// @Override
|
||||
// public void onSharedLocation(String link) {
|
||||
// // Implement Shared location logic here
|
||||
// }
|
||||
// })
|
||||
|
||||
// Start the Penguin SDK
|
||||
PlugAndPlaySDK.start(mContext, this)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Navigates to the specified reference ID.
|
||||
*
|
||||
* @param refID The reference ID to navigate to.
|
||||
*/
|
||||
fun navigateTo(refID: String) {
|
||||
try {
|
||||
if (refID.isBlank()) {
|
||||
Log.e("navigateTo", "Invalid refID: The reference ID is blank.")
|
||||
}
|
||||
// referenceId = refID
|
||||
navigator.navigateTo(mContext, refID,object : RefIdDelegate {
|
||||
override fun onRefByIDSuccess(PoiId: String?) {
|
||||
Log.e("navigateTo", "PoiId is penguin view+++++++ $PoiId")
|
||||
|
||||
// channelFlutter.invokeMethod(
|
||||
// PenguinMethod.navigateToPOI.name,
|
||||
// "navigateTo Success"
|
||||
// )
|
||||
}
|
||||
|
||||
override fun onGetByRefIDError(error: String?) {
|
||||
Log.e("navigateTo", "error is penguin view+++++++ $error")
|
||||
|
||||
// channelFlutter.invokeMethod(
|
||||
// PenguinMethod.navigateToPOI.name,
|
||||
// "navigateTo Failed: Invalid refID"
|
||||
// )
|
||||
}
|
||||
} , creationParams["clientID"] as String, creationParams["clientKey"] as String )
|
||||
|
||||
} catch (e: Exception) {
|
||||
Log.e("navigateTo", "Exception occurred during navigation: ${e.message}", e)
|
||||
// channelFlutter.invokeMethod(
|
||||
// PenguinMethod.navigateToPOI.name,
|
||||
// "Failed: Exception - ${e.message}"
|
||||
// )
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when Penguin UI setup is successful.
|
||||
*
|
||||
* @param warningCode Optional warning code received from the SDK.
|
||||
*/
|
||||
override fun onPenNavSuccess(warningCode: String?) {
|
||||
val clinicId = creationParams["clinicID"] as String
|
||||
|
||||
if(clinicId.isEmpty()) return
|
||||
|
||||
navigateTo(clinicId)
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when there is an initialization error with Penguin UI.
|
||||
*
|
||||
* @param description Description of the error.
|
||||
* @param errorType Type of initialization error.
|
||||
*/
|
||||
override fun onPenNavInitializationError(
|
||||
description: String?,
|
||||
errorType: InitializationErrorType?
|
||||
) {
|
||||
val arguments: Map<String, Any?> = mapOf(
|
||||
"description" to description,
|
||||
"type" to errorType?.name
|
||||
)
|
||||
|
||||
channel.invokeMethod(PenguinMethod.onPenNavInitializationError.name, arguments)
|
||||
Toast.makeText(mContext, "Navigation Error: $description", Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when Penguin UI is dismissed.
|
||||
*/
|
||||
override fun onPenNavUIDismiss() {
|
||||
// Handle UI dismissal if needed
|
||||
try {
|
||||
mContext.unregisterReceiver(permissionResultReceiver)
|
||||
dispose();
|
||||
} catch (e: IllegalArgumentException) {
|
||||
Log.e("PenguinView", "Receiver not registered: $e")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,235 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.smart_ring_2301
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.annotation.TargetApi
|
||||
import android.app.Service
|
||||
import android.bluetooth.BluetoothAdapter
|
||||
import android.bluetooth.BluetoothManager
|
||||
import android.bluetooth.le.ScanCallback
|
||||
import android.bluetooth.le.ScanResult
|
||||
import android.bluetooth.le.ScanSettings
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.ServiceConnection
|
||||
import android.os.Build
|
||||
import android.os.IBinder
|
||||
import android.text.TextUtils
|
||||
import com.jstyle.blesdk2301.callback.BleConnectionListener
|
||||
import com.jstyle.blesdk2301.callback.OnScanResults
|
||||
import com.jstyle.blesdk2301.model.Device
|
||||
import java.util.Locale
|
||||
|
||||
/**
|
||||
* 蓝牙管理类 Bluetooth management class
|
||||
*/
|
||||
@SuppressLint("MissingPermission")
|
||||
class BleManager private constructor(var context: Context) {
|
||||
private var address: String? = null
|
||||
private var bleService: BleService? = null
|
||||
private val serviceConnection: ServiceConnection = object : ServiceConnection {
|
||||
override fun onServiceDisconnected(name: ComponentName) { // TODO Auto-generated method stub
|
||||
bleService = null
|
||||
}
|
||||
|
||||
override fun onServiceConnected(name: ComponentName, service: IBinder) {
|
||||
bleService = (service as BleService.LocalBinder).service
|
||||
if (!TextUtils.isEmpty(address)) {
|
||||
bleService!!.initBluetoothDevice(address, context, NeedReconnect1, bleConnectionListener1)
|
||||
}
|
||||
}
|
||||
}
|
||||
private var serviceIntent: Intent? = null
|
||||
var bluetoothAdapter: BluetoothAdapter?
|
||||
val isBleEnable: Boolean
|
||||
get() = bluetoothAdapter!!.enable()
|
||||
|
||||
/**
|
||||
* 连接蓝牙设备
|
||||
* Connect Bluetooth device
|
||||
*
|
||||
* @param address
|
||||
*/
|
||||
protected var NeedReconnect1 = true
|
||||
protected var bleConnectionListener1: BleConnectionListener? = null
|
||||
fun connectDevice(address: String?, NeedReconnect: Boolean, bleConnectionListener: BleConnectionListener?) {
|
||||
NeedReconnect1 = NeedReconnect
|
||||
bleConnectionListener1 = bleConnectionListener
|
||||
if (!bluetoothAdapter!!.isEnabled || TextUtils.isEmpty(address) || isConnected) return
|
||||
if (bleService == null) {
|
||||
this.address = address
|
||||
} else {
|
||||
bleService!!.initBluetoothDevice(address, context, NeedReconnect, bleConnectionListener)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭蓝牙服务通知
|
||||
* Turn off Bluetooth service notification
|
||||
*/
|
||||
fun enableNotifaction() {
|
||||
if (bleService == null) return
|
||||
bleService!!.setCharacteristicNotification(true)
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入指令到蓝牙设备
|
||||
* Write command to Bluetooth device
|
||||
*/
|
||||
fun writeValue(value: ByteArray?) {
|
||||
if (bleService == null || instance == null) return
|
||||
bleService!!.writeValue(value)
|
||||
}
|
||||
|
||||
/**
|
||||
* 多条指令同时添加后发送到设备
|
||||
* Multiple instructions are added at the same time and sent to the device
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
fun offerValue(data: ByteArray?) {
|
||||
if (bleService == null) return
|
||||
if (data != null) {
|
||||
bleService!!.offerValue(data)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入指令到蓝牙设备
|
||||
* Write command to Bluetooth device
|
||||
*/
|
||||
fun writeValue() {
|
||||
if (bleService == null) return
|
||||
bleService!!.nextQueue()
|
||||
}
|
||||
|
||||
/**
|
||||
* 断开设备 Disconnect the device
|
||||
*/
|
||||
fun disconnectDevice() {
|
||||
if (bleService == null) return
|
||||
bleService!!.disconnect()
|
||||
}
|
||||
|
||||
val isConnected: Boolean
|
||||
/**
|
||||
* 查询设备是否已经连接
|
||||
* Query whether the device is connected
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
get() = if (bleService == null) false else bleService!!.isConnected
|
||||
|
||||
/**
|
||||
* 取消扫描设备
|
||||
* Cancel scanning device
|
||||
*/
|
||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
fun StopDeviceScan() {
|
||||
isinScan = false
|
||||
if (null != bluetoothAdapter && null != bluetoothAdapter!!.bluetoothLeScanner) {
|
||||
bluetoothAdapter!!.bluetoothLeScanner.stopScan(scanCallback)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫描蓝牙设备,用于开始绑定设备
|
||||
* Scan Bluetooth device to start binding device
|
||||
*/
|
||||
private var DevicesName: Array<String>? = null
|
||||
private var onScanResult: OnScanResults? = null
|
||||
private var isinScan = false
|
||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
fun DeviceScanResults(Devicesname: Array<String>, onScanResults: OnScanResults) {
|
||||
if (!isinScan && instance!!.isBleEnable) { //如果蓝牙开关是开启的就进行扫描
|
||||
isinScan = true
|
||||
DevicesName = Devicesname
|
||||
onScanResult = onScanResults
|
||||
//返回已配对设备
|
||||
//获得已配对的远程蓝牙设备的集合
|
||||
val devices = bluetoothAdapter!!.bondedDevices
|
||||
if (devices.size > 0) {
|
||||
for (bluetoothDevice in devices) {
|
||||
if (Canctians(bluetoothDevice.name.lowercase(Locale.getDefault()))) {
|
||||
val device = Device()
|
||||
device.bluetoothDevice = bluetoothDevice
|
||||
device.isIsconted = false
|
||||
device.isPaired = true
|
||||
device.isIsdfu = bluetoothDevice.name.lowercase(Locale.getDefault()).contains("dfu")
|
||||
device.name = bluetoothDevice.name
|
||||
device.mac = bluetoothDevice.address
|
||||
onScanResult!!.Success(device)
|
||||
}
|
||||
}
|
||||
}
|
||||
bluetoothAdapter!!.bluetoothLeScanner.startScan(null, ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build(), scanCallback)
|
||||
}
|
||||
}
|
||||
|
||||
private val scanCallback: ScanCallback = object : ScanCallback() {
|
||||
override fun onScanResult(callbackType: Int, result: ScanResult) {
|
||||
super.onScanResult(callbackType, result)
|
||||
val deviceName = result.device.name
|
||||
if (isinScan && !TextUtils.isEmpty(deviceName) && Canctians(deviceName.lowercase(Locale.getDefault()).trim { it <= ' ' })) {
|
||||
val device = Device()
|
||||
device.bluetoothDevice = result.device
|
||||
device.isIsconted = false
|
||||
device.isPaired = false
|
||||
device.isIsdfu = deviceName.lowercase(Locale.getDefault()).contains("dfu")
|
||||
device.name = result.device.name
|
||||
device.mac = result.device.address
|
||||
device.riss = result.rssi
|
||||
onScanResult!!.Success(device)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBatchScanResults(results: List<ScanResult>) {
|
||||
super.onBatchScanResults(results)
|
||||
}
|
||||
|
||||
override fun onScanFailed(errorCode: Int) {
|
||||
super.onScanFailed(errorCode)
|
||||
onScanResult!!.Fail(errorCode)
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
if (serviceIntent == null) {
|
||||
serviceIntent = Intent(context, BleService::class.java)
|
||||
context.bindService(serviceIntent, serviceConnection, Service.BIND_AUTO_CREATE)
|
||||
}
|
||||
val bluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
|
||||
bluetoothAdapter = bluetoothManager.adapter
|
||||
}
|
||||
|
||||
private fun Canctians(name: String): Boolean {
|
||||
var catian = false
|
||||
if (null == DevicesName || DevicesName!!.size == 0) {
|
||||
return false
|
||||
} else {
|
||||
for (devicesname in DevicesName!!) {
|
||||
if (name.lowercase(Locale.getDefault()).contains(devicesname.lowercase(Locale.getDefault()))) {
|
||||
catian = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return catian
|
||||
}
|
||||
|
||||
companion object {
|
||||
var instance: BleManager? = null
|
||||
private set
|
||||
|
||||
fun init(context: Context) {
|
||||
if (instance != null) {
|
||||
return
|
||||
}
|
||||
synchronized(BleManager::class.java) {
|
||||
if (instance == null) {
|
||||
instance = BleManager(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@ -1,11 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
|
||||
|
||||
/**
|
||||
* Created by Administrator on 2017/4/11.
|
||||
*/
|
||||
class BleData {
|
||||
|
||||
var value: ByteArray? = null
|
||||
var action: String? = null
|
||||
var data: String? = null
|
||||
}
|
||||
@ -1,137 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
|
||||
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import java.util.concurrent.Executors
|
||||
import java.util.concurrent.ScheduledExecutorService
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
/**
|
||||
* 计时器
|
||||
*/
|
||||
class CustomCountDownTimer(
|
||||
//Millis since epoch when alarm should stop.
|
||||
private var millisInFuture: Long, countDownInterval: Long,
|
||||
tickListener: TimerTickListener
|
||||
) {
|
||||
//thread on which the callbacks will be called
|
||||
private val mainThreadHandler = Handler(Looper.getMainLooper())
|
||||
|
||||
//listener interface which is to be implemented by the users of the count down timer
|
||||
interface TimerTickListener {
|
||||
/**
|
||||
* Callback on each tick
|
||||
*
|
||||
* @param millisLeft time left in millisec for the timer to shutdown
|
||||
*/
|
||||
fun onTick(millisLeft: Long)
|
||||
|
||||
/**
|
||||
* Callback to be invokded when timer's time finishes
|
||||
*/
|
||||
fun onFinish()
|
||||
|
||||
/**
|
||||
* Callback to be invokded when timer is canceled
|
||||
*/
|
||||
fun onCancel()
|
||||
}
|
||||
|
||||
/**
|
||||
* Inner class which delegates the events to callbacks provided in the TimerTickListener
|
||||
*/
|
||||
private inner class TimerRunnable : Runnable {
|
||||
override fun run() {
|
||||
if (isCancelled) {
|
||||
scheduler.shutdown()
|
||||
mainThreadHandler.post { tickListener.onCancel() }
|
||||
} else if (isPaused) {
|
||||
} else {
|
||||
stopTimeInFuture = stopTimeInFuture - countdownInterval
|
||||
mainThreadHandler.post(object : Runnable {
|
||||
val millisLeft = stopTimeInFuture
|
||||
override fun run() {
|
||||
if (millisLeft <= 0) {
|
||||
tickListener.onFinish()
|
||||
scheduler.shutdown()
|
||||
} else {
|
||||
tickListener.onTick(millisLeft)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//The interval in millis that the user receives callbacks
|
||||
private val countdownInterval: Long
|
||||
|
||||
//the time at which timer is to stop
|
||||
private var stopTimeInFuture: Long
|
||||
|
||||
//boolean representing if the timer was cancelled
|
||||
var isCancelled = false
|
||||
|
||||
//boolean representing if the timer was paused
|
||||
private var isPaused = false
|
||||
|
||||
//listener which listens to the timer events
|
||||
private val tickListener: TimerTickListener
|
||||
|
||||
//scheduler which provides the thread to create timer
|
||||
private val scheduler: ScheduledExecutorService
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param millisInFuture time in millisec for which timer is to run
|
||||
* @param countDownInterval interval frequency in millisec at which the callback will be invoked
|
||||
* @param tickListener implementation of TimerTickListener which provides callbacks code
|
||||
*/
|
||||
init {
|
||||
stopTimeInFuture = millisInFuture
|
||||
countdownInterval = countDownInterval
|
||||
this.tickListener = tickListener
|
||||
scheduler = Executors.newSingleThreadScheduledExecutor()
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the countdown.
|
||||
*/
|
||||
@Synchronized
|
||||
fun start() {
|
||||
isCancelled = false
|
||||
isPaused = false
|
||||
scheduler.scheduleWithFixedDelay(
|
||||
TimerRunnable(), countdownInterval, countdownInterval,
|
||||
TimeUnit.MILLISECONDS
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels the countdown timer
|
||||
*/
|
||||
@Synchronized
|
||||
fun cancel() {
|
||||
isCancelled = true
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
fun pause() {
|
||||
isPaused = true
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
fun resume() {
|
||||
isPaused = false
|
||||
}
|
||||
|
||||
fun extendTime(delta: Long) {
|
||||
stopTimeInFuture = stopTimeInFuture + delta
|
||||
millisInFuture = millisInFuture + delta
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "CustomCountDownTimer"
|
||||
}
|
||||
}
|
||||
@ -1,248 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.content.ContentResolver
|
||||
import android.content.ContentUris
|
||||
import android.content.Context
|
||||
import android.database.Cursor
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Environment
|
||||
import android.provider.DocumentsContract
|
||||
import android.provider.MediaStore
|
||||
import android.text.TextUtils
|
||||
import android.util.Log
|
||||
import java.io.UnsupportedEncodingException
|
||||
|
||||
/**
|
||||
* Created by Administrator on 2017/4/6.
|
||||
*/
|
||||
object ResolveData {
|
||||
private const val TAG = "ResolveData"
|
||||
private const val SHORTENED_LOCAL_NAME = 0x08
|
||||
private const val COMPLETE_LOCAL_NAME = 0x09
|
||||
private const val oneMinMillis = 60 * 1000L
|
||||
var startString = " 12:00:00"
|
||||
fun getBcd(value: String): Int {
|
||||
return value.toInt(16)
|
||||
}
|
||||
|
||||
fun decodeDeviceName(data: ByteArray): String? {
|
||||
var name: String? = null
|
||||
var fieldLength: Int
|
||||
var fieldName: Int
|
||||
val packetLength = data.size
|
||||
var index = 0
|
||||
while (index < packetLength) {
|
||||
fieldLength = data[index].toInt()
|
||||
if (fieldLength <= 0) break
|
||||
fieldName = data[++index].toInt()
|
||||
if (fieldName == COMPLETE_LOCAL_NAME
|
||||
|| fieldName == SHORTENED_LOCAL_NAME
|
||||
) {
|
||||
name = decodeLocalName(data, index + 1, fieldLength - 1)
|
||||
break
|
||||
}
|
||||
index += fieldLength - 1
|
||||
index++
|
||||
}
|
||||
return name
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
@JvmStatic
|
||||
fun decodeDeviceName(bluetoothDevice: BluetoothDevice, data: ByteArray): String? {
|
||||
var name = bluetoothDevice.name
|
||||
if (!TextUtils.isEmpty(name)) return name
|
||||
var fieldLength: Int
|
||||
var fieldName: Int
|
||||
val packetLength = data.size
|
||||
var index = 0
|
||||
while (index < packetLength) {
|
||||
fieldLength = data[index].toInt()
|
||||
if (fieldLength <= 0) break
|
||||
fieldName = data[++index].toInt()
|
||||
if (fieldName == COMPLETE_LOCAL_NAME
|
||||
|| fieldName == SHORTENED_LOCAL_NAME
|
||||
) {
|
||||
name = decodeLocalName(data, index + 1, fieldLength - 1)
|
||||
break
|
||||
}
|
||||
index += fieldLength - 1
|
||||
index++
|
||||
}
|
||||
return name
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the local name
|
||||
*/
|
||||
fun decodeLocalName(
|
||||
data: ByteArray?, start: Int,
|
||||
length: Int
|
||||
): String? {
|
||||
return try {
|
||||
kotlin.String()
|
||||
} catch (e: UnsupportedEncodingException) {
|
||||
Log.e(
|
||||
"scan", "Unable to convert the complete local name to UTF-8",
|
||||
e
|
||||
)
|
||||
null
|
||||
} catch (e: IndexOutOfBoundsException) {
|
||||
Log.e("scan", "Error when reading complete local name", e)
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转十六进制字符串
|
||||
*
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@JvmStatic
|
||||
fun byte2Hex(data: ByteArray?): String {
|
||||
if (data != null && data.size > 0) {
|
||||
val sb = StringBuilder(data.size)
|
||||
for (tmp in data) {
|
||||
sb.append(String.format("%02X ", tmp))
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
return "no data"
|
||||
}
|
||||
|
||||
fun getRealFilePath(context: Context, uri: Uri?): String? {
|
||||
if (null == uri) return null
|
||||
val scheme = uri.scheme
|
||||
var data: String? = null
|
||||
if (scheme == null) data = uri.path else if (ContentResolver.SCHEME_FILE == scheme) {
|
||||
data = uri.path
|
||||
} else if (ContentResolver.SCHEME_CONTENT == scheme) {
|
||||
val cursor = context.contentResolver.query(uri, arrayOf(MediaStore.Images.ImageColumns.DATA), null, null, null)
|
||||
if (null != cursor) {
|
||||
if (cursor.moveToFirst()) {
|
||||
val index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
|
||||
if (index > -1) {
|
||||
data = cursor.getString(index)
|
||||
}
|
||||
}
|
||||
cursor.close()
|
||||
}
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
/**
|
||||
* 专为Android4.4设计的从Uri获取文件绝对路径
|
||||
*/
|
||||
fun getPath(context: Context, uri: Uri): String? {
|
||||
|
||||
|
||||
// DocumentProvider
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) {
|
||||
// ExternalStorageProvider
|
||||
if (isExternalStorageDocument(uri)) {
|
||||
val docId = DocumentsContract.getDocumentId(uri)
|
||||
val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||
val type = split[0]
|
||||
if ("primary".equals(type, ignoreCase = true)) {
|
||||
return Environment.getExternalStorageDirectory().toString() + "/" + split[1]
|
||||
}
|
||||
|
||||
// TODO handle non-primary volumes
|
||||
} else if (isDownloadsDocument(uri)) {
|
||||
val id = DocumentsContract.getDocumentId(uri)
|
||||
val contentUri = ContentUris.withAppendedId(
|
||||
Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)
|
||||
)
|
||||
return getDataColumn(context, contentUri, null, null)
|
||||
} else if (isMediaDocument(uri)) {
|
||||
val docId = DocumentsContract.getDocumentId(uri)
|
||||
val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||
val type = split[0]
|
||||
var contentUri: Uri? = null
|
||||
if ("image" == type) {
|
||||
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
|
||||
} else if ("video" == type) {
|
||||
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
|
||||
} else if ("audio" == type) {
|
||||
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
|
||||
}
|
||||
val selection = "_id=?"
|
||||
val selectionArgs = arrayOf(split[1])
|
||||
return getDataColumn(context, contentUri, selection, selectionArgs)
|
||||
}
|
||||
} else if ("content".equals(uri.scheme, ignoreCase = true)) {
|
||||
return getDataColumn(context, uri, null, null)
|
||||
} else if ("file".equals(uri.scheme, ignoreCase = true)) {
|
||||
return uri.path
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value of the data column for this Uri. This is useful for
|
||||
* MediaStore Uris, and other file-based ContentProviders.
|
||||
*
|
||||
* @param context
|
||||
* The context.
|
||||
* @param uri
|
||||
* The Uri to query.
|
||||
* @param selection
|
||||
* (Optional) Filter used in the query.
|
||||
* @param selectionArgs
|
||||
* (Optional) Selection arguments used in the query.
|
||||
* @return The value of the _data column, which is typically a file path.
|
||||
*/
|
||||
fun getDataColumn(
|
||||
context: Context, uri: Uri?, selection: String?,
|
||||
selectionArgs: Array<String>?
|
||||
): String? {
|
||||
var cursor: Cursor? = null
|
||||
val column = "_data"
|
||||
val projection = arrayOf(column)
|
||||
try {
|
||||
cursor = context.contentResolver.query(
|
||||
uri!!, projection, selection, selectionArgs,
|
||||
null
|
||||
)
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
val column_index = cursor.getColumnIndexOrThrow(column)
|
||||
return cursor.getString(column_index)
|
||||
}
|
||||
} finally {
|
||||
cursor?.close()
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* @param uri
|
||||
* The Uri to check.
|
||||
* @return Whether the Uri authority is ExternalStorageProvider.
|
||||
*/
|
||||
fun isExternalStorageDocument(uri: Uri): Boolean {
|
||||
return "com.android.externalstorage.documents" == uri.authority
|
||||
}
|
||||
|
||||
/**
|
||||
* @param uri
|
||||
* The Uri to check.
|
||||
* @return Whether the Uri authority is DownloadsProvider.
|
||||
*/
|
||||
fun isDownloadsDocument(uri: Uri): Boolean {
|
||||
return "com.android.providers.downloads.documents" == uri.authority
|
||||
}
|
||||
|
||||
/**
|
||||
* @param uri
|
||||
* The Uri to check.
|
||||
* @return Whether the Uri authority is MediaProvider.
|
||||
*/
|
||||
fun isMediaDocument(uri: Uri): Boolean {
|
||||
return "com.android.providers.media.documents" == uri.authority
|
||||
}
|
||||
}
|
||||
@ -1,34 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
|
||||
|
||||
import io.reactivex.rxjava3.core.Observable
|
||||
import io.reactivex.rxjava3.processors.FlowableProcessor
|
||||
import io.reactivex.rxjava3.processors.PublishProcessor
|
||||
import io.reactivex.rxjava3.subjects.PublishSubject
|
||||
import io.reactivex.rxjava3.subjects.Subject
|
||||
|
||||
|
||||
/**
|
||||
* Created by zhuge on 2017/1/19 0019.
|
||||
*/
|
||||
class RxBus private constructor() {
|
||||
private val bus: Subject<Any>
|
||||
private val mBus: FlowableProcessor<Any>
|
||||
|
||||
init {
|
||||
mBus = PublishProcessor.create<Any>().toSerialized()
|
||||
bus = PublishSubject.create<Any>().toSerialized()
|
||||
}
|
||||
|
||||
fun post(`object`: Any) {
|
||||
bus.onNext(`object`)
|
||||
}
|
||||
|
||||
fun <T : Any> toObservable(eventType: Class<T>): Observable<T> {
|
||||
return bus.ofType(eventType)
|
||||
}
|
||||
|
||||
|
||||
companion object {
|
||||
val instance = RxBus()
|
||||
}
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
|
||||
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.rxjava3.core.ObservableTransformer
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||
|
||||
|
||||
/**
|
||||
* Created by Administrator on 2017/4/26.
|
||||
*/
|
||||
object SchedulersTransformer {
|
||||
private const val TAG = "SchedulersTransformer"
|
||||
fun <T : Any> io2MainObservable(): ObservableTransformer<T, T> {
|
||||
return ObservableTransformer { upstream -> upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) }
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,93 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
|
||||
object SharedPreferenceUtils {
|
||||
const val KEY_REMIND_PSD = "REMIND_PSD"
|
||||
const val KEY_account_type = "KEY_account_type"
|
||||
const val KEY_countryCode = "KEY_countryCode"
|
||||
const val KEY_TimeZone = "KEY_TimeZone"
|
||||
const val KEY_DFU_ADDRESS = "KEY_DFU_ADDRESS"
|
||||
const val KEY_Exercise_Mode = "KEY_Exercise_Mode"
|
||||
const val KEY_Enable_ActivityClock = "KEY_Enable_ActivityClock"
|
||||
const val KEY_UNIT_WEIGHT = "KEY_UNIT_WEIGHT"
|
||||
const val KEY_UNIT_HEIGHT = "KEY_UNIT_HEIGHT"
|
||||
const val KEY_RES_FILEPATH = "KEY_RES_FILEPATH"
|
||||
const val KEY_Is_First = "KEY_Is_First"
|
||||
const val KEY_From_Login = "KEY_From_Login"
|
||||
const val KEY_PHONE = "PHONE"
|
||||
const val KEY_UID = "uid"
|
||||
const val KEY_PSD = "PSD"
|
||||
const val KEY_ADDRESS = "ADDRESS"
|
||||
const val KEY_Language = "Language"
|
||||
const val KEY_LOGIN = "lOGIN"
|
||||
const val KEY_NICKNAME = "nickname"
|
||||
private const val spName = "jstyle_sleep"
|
||||
const val KEY_AUTH_USERID = "KEY_AUTH_USERID"
|
||||
const val KEY_highHeart = "highHeart"
|
||||
const val KEY_highBrEATH = "highBrEATH"
|
||||
const val KEY_lowHeart = "lowHeart"
|
||||
const val KEY_lowBreath = "lowBreath"
|
||||
const val KEY_deviceName = "deviceName"
|
||||
const val KEY_PLAN_ON = "PLAN_ON"
|
||||
const val KEY_PLAN_first = "PLAN_first"
|
||||
const val KEY_Sleep_goal = "KEY_Sleep_goal"
|
||||
const val KEY_Step_goal = "KEY_Step_goal"
|
||||
const val KEY_deviceType = "KEY_deviceType"
|
||||
var sharedPreferences: SharedPreferences? = null
|
||||
private set
|
||||
const val DefaultCountryCode = "0086-"
|
||||
fun init(context: Context) {
|
||||
sharedPreferences = context.getSharedPreferences(spName, Activity.MODE_PRIVATE)
|
||||
}
|
||||
|
||||
fun setSpBoolean(name: String?, bool: Boolean) {
|
||||
sharedPreferences!!.edit().putBoolean(name, bool).commit()
|
||||
}
|
||||
|
||||
fun getSpBoolean(name: String?): Boolean {
|
||||
return sharedPreferences!!.getBoolean(name, false)
|
||||
}
|
||||
|
||||
fun getBoolean(name: String?, defaultValue: Boolean): Boolean {
|
||||
return sharedPreferences!!.getBoolean(name, defaultValue)
|
||||
}
|
||||
|
||||
fun setSpString(name: String?, value: String?) {
|
||||
sharedPreferences!!.edit().putString(name, value).commit()
|
||||
}
|
||||
|
||||
fun getSpString(name: String?): String? {
|
||||
return getString(name, null)
|
||||
}
|
||||
|
||||
fun getString(name: String?, defaultValue: String?): String? {
|
||||
return sharedPreferences!!.getString(name, defaultValue)
|
||||
}
|
||||
|
||||
fun setSpInteger(name: String?, value: Int) {
|
||||
sharedPreferences!!.edit().putInt(name, value).commit()
|
||||
}
|
||||
|
||||
fun getInteger(name: String?, defaultValue: Int): Int {
|
||||
return sharedPreferences!!.getInt(name, defaultValue)
|
||||
}
|
||||
|
||||
fun getSpInteger(name: String?): Int {
|
||||
return getInteger(name, -1)
|
||||
}
|
||||
|
||||
fun setSpFloat(name: String?, value: Float) {
|
||||
sharedPreferences!!.edit().putFloat(name, value).commit()
|
||||
}
|
||||
|
||||
fun getSpFloat(name: String?): Float {
|
||||
return getFloat(name, 0.0f)
|
||||
}
|
||||
|
||||
fun getFloat(name: String?, defaultValue: Float): Float {
|
||||
return sharedPreferences!!.getFloat(name, defaultValue)
|
||||
}
|
||||
}
|
||||
@ -1,34 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.utils
|
||||
|
||||
|
||||
fun add(ori: ByteArray?, add: ByteArray): ByteArray {
|
||||
if (ori == null) {
|
||||
return add
|
||||
}
|
||||
|
||||
val new: ByteArray = ByteArray(ori.size + add.size)
|
||||
for ((index, value) in ori.withIndex()) {
|
||||
new[index] = value
|
||||
}
|
||||
|
||||
for ((index, value) in add.withIndex()) {
|
||||
new[index + ori.size] = value
|
||||
}
|
||||
|
||||
return new
|
||||
}
|
||||
|
||||
|
||||
fun toUInt(bytes: ByteArray): Int {
|
||||
var result = 0
|
||||
for ((i, v) in bytes.withIndex()) {
|
||||
result += v.unsigned().shl(i * 8)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
fun Byte.unsigned(): Int = when {
|
||||
(toInt() < 0) -> 255 + toInt() + 1
|
||||
else -> toInt()
|
||||
}
|
||||
@ -1,58 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.utils;
|
||||
|
||||
|
||||
/**
|
||||
* Tools used to generate CRC8 code
|
||||
*
|
||||
* @author zouhao
|
||||
*/
|
||||
public class CRCUtils {
|
||||
|
||||
/**
|
||||
* CRC8 code table
|
||||
*/
|
||||
private static final char[] Table_CRC8 = {0x00, 0x07, 0x0E, 0x09, 0x1C,
|
||||
0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
|
||||
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46,
|
||||
0x41, 0x54, 0x53, 0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB,
|
||||
0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 0x90,
|
||||
0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1,
|
||||
0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5,
|
||||
0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 0xB7, 0xB0,
|
||||
0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93,
|
||||
0x94, 0x9D, 0x9A, 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
|
||||
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, 0x57, 0x50, 0x59,
|
||||
0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74,
|
||||
0x7D, 0x7A, 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1,
|
||||
0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, 0xF9, 0xFE, 0xF7, 0xF0,
|
||||
0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3,
|
||||
0xD4, 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56,
|
||||
0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10, 0x05,
|
||||
0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
|
||||
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78,
|
||||
0x7F, 0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25,
|
||||
0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 0xAE,
|
||||
0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F,
|
||||
0x8A, 0x8D, 0x84, 0x83, 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC,
|
||||
0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3};
|
||||
|
||||
/**
|
||||
* Generate CRC8 code
|
||||
*
|
||||
* @param buf Data buffer
|
||||
* @return CRC8 code, return 0 when the parameter is error
|
||||
*/
|
||||
public static byte calCRC8(byte[] buf) {
|
||||
if (buf == null || buf.length == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
byte crc = 0;
|
||||
|
||||
for (int i = 0; i < buf.length - 1; i++) {
|
||||
crc = (byte) Table_CRC8[0x00ff & (crc ^ (buf[i]))];
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.utils;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class Constant {
|
||||
public final static String[] EcgWay = {"Hand-Hand", "Hand-Chest", "1-Lead", "2-Lead"};
|
||||
public final static String[] OxyWay = {"Internal", "External", ""};
|
||||
public final static String[] TmpWay = {"Body", "Thing", ""};
|
||||
public static String filePath;
|
||||
|
||||
public static String getPathX(String s) {
|
||||
return filePath + s;
|
||||
}
|
||||
|
||||
public static void initVar(Context context) {
|
||||
File[] fs = context.getExternalFilesDirs(null);
|
||||
if (fs != null && fs.length >= 1) {
|
||||
filePath = fs[0].getAbsolutePath() + "/";
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,7 +0,0 @@
|
||||
package com.cloud.diplomaticquarterapp.utils
|
||||
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
|
||||
object UiChannel {
|
||||
val progressChannel = Channel<Int>(Channel.CONFLATED)
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.cloud.diplomaticquarterapp.whatsapp;
|
||||
|
||||
import static java.sql.DriverManager.println;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.Signature;
|
||||
import android.util.Base64;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class AppSignatureRetriever {
|
||||
|
||||
private static final String HASH_TYPE = "SHA-256";
|
||||
public static final int NUM_HASHED_BYTES = 9;
|
||||
public static final int NUM_BASE64_CHAR = 11;
|
||||
|
||||
|
||||
public void logSignatures(Context context) {
|
||||
Collection<String> appSignatures = getAppSignatures(context);
|
||||
appSignatures.forEach(signature -> println("Signature: " + signature));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the app signatures for the current package.
|
||||
*
|
||||
* @return signatures for current app
|
||||
*/
|
||||
public Collection<String> getAppSignatures(Context context) {
|
||||
try {
|
||||
// Get all package signatures for the current package
|
||||
String packageName = context.getPackageName();
|
||||
println("Package name: " + packageName);
|
||||
PackageManager packageManager = context.getPackageManager();
|
||||
Signature[] signatures = packageManager.getPackageInfo(packageName,
|
||||
PackageManager.GET_SIGNATURES).signatures;
|
||||
|
||||
// For each signature create a compatible hash
|
||||
Collection<String> appCodes = Arrays.stream(signatures)
|
||||
.map(signature -> hash(packageName, signature.toCharsString()))
|
||||
.collect(Collectors.toList());
|
||||
return appCodes;
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
println("Unable to find package to obtain hash.");
|
||||
throw new RuntimeException("Unable to find package to obtain hash.", e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String hash(String packageName, String signature) {
|
||||
String appInfo = packageName + " " + signature;
|
||||
try {
|
||||
MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE);
|
||||
messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8));
|
||||
byte[] hashSignature = messageDigest.digest();
|
||||
|
||||
// truncated into NUM_HASHED_BYTES
|
||||
hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES);
|
||||
// encode into Base64
|
||||
String base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING | Base64.NO_WRAP);
|
||||
base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR);
|
||||
|
||||
println(String.format("pkg: %s -- hash: %s", packageName, base64Hash));
|
||||
return base64Hash;
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new RuntimeException("Unable to generate hash for application", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
|
||||
package com.cloud.diplomaticquarterapp.whatsapp
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import com.whatsapp.otp.android.sdk.WhatsAppOtpHandler
|
||||
import com.whatsapp.otp.android.sdk.WhatsAppOtpIncomingIntentHandler
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
object WhatsApp {
|
||||
val whatsAppOtpHandler = WhatsAppOtpHandler()
|
||||
inline fun handleOTP ( intent: Intent, crossinline validateOTP:(code: String )-> Unit) =
|
||||
WhatsAppOtpIncomingIntentHandler().processOtpCode(
|
||||
intent,
|
||||
// call your function to validate
|
||||
{code -> validateOTP(code) },
|
||||
{error,exception->
|
||||
println("the error is ${error.name}")
|
||||
println("the exception stacktrace is ${exception.message}")
|
||||
println("the exception is cause ${exception.cause}")
|
||||
})
|
||||
|
||||
|
||||
fun performHandShake(context : WeakReference<Context>) = whatsAppOtpHandler.sendOtpIntentToWhatsApp(context.get()!!)
|
||||
|
||||
|
||||
|
||||
fun isWhatsAppInstalled(context : WeakReference<Context>) : Boolean = whatsAppOtpHandler.isWhatsAppInstalled(context.get()!!)
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
package com.cloud.diplomaticquarterapp.whatsapp
|
||||
import android.app.PendingIntent
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import com.cloud.diplomaticquarterapp.whatsapp.WhatsApp
|
||||
import com.cloud.diplomaticquarterapp.whatsapp.WhatsAppOtpPlatformBridge
|
||||
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||
|
||||
class WhatsAppCodeActivity : FlutterFragmentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
WhatsApp.handleOTP(intent){code ->
|
||||
WhatsAppOtpPlatformBridge.result?.success(code);
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
package com.cloud.diplomaticquarterapp.whatsapp
|
||||
|
||||
import com.ejada.hmg.MainActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
class WhatsAppOtpPlatformBridge(
|
||||
private var flutterEngine: FlutterEngine,
|
||||
private var mainActivity: MainActivity
|
||||
) {
|
||||
|
||||
|
||||
private lateinit var channel: MethodChannel
|
||||
|
||||
companion object {
|
||||
private const val CHANNEL = "whats_app_otp"
|
||||
var result: MethodChannel.Result? = null
|
||||
}
|
||||
|
||||
fun invoke() {
|
||||
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
|
||||
channel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
|
||||
when (call.method) {
|
||||
"isWhatsAppInstalled" -> {
|
||||
val isAppInstalled =
|
||||
WhatsApp.isWhatsAppInstalled(WeakReference(mainActivity))
|
||||
result.success(isAppInstalled)
|
||||
}
|
||||
|
||||
"performHandShake" -> {
|
||||
WhatsApp.performHandShake(WeakReference(mainActivity))
|
||||
}
|
||||
|
||||
|
||||
"startListening" -> {
|
||||
WhatsAppOtpPlatformBridge.result = result
|
||||
}
|
||||
|
||||
else -> {
|
||||
result.notImplemented()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context="com.cloud.diplomaticquarterapp.whatsapp.WhatsAppCodeActivity">
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue