Compare commits
574 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8dec5d906a | ||
|
|
ae02b5c135 | ||
|
|
fe94119627 | ||
|
|
ee13bd08cb | ||
|
|
6a464ad3e7 | ||
|
|
f0d2a42ee3 | ||
|
|
b18ce51e4c | ||
|
|
535b3826f8 | ||
|
|
f1a884e200 | ||
|
|
072e2246a8 | ||
|
|
2c3ecf654a | ||
|
|
8699136d6d | ||
|
|
35803b7014 | ||
|
|
af358f8f99 | ||
|
|
138183798c | ||
|
|
8b3066cf99 | ||
|
|
91e21f59af | ||
|
|
85144e339f | ||
|
|
dbd9b145ea | ||
|
|
287181622d | ||
|
|
7f76bba866 | ||
|
|
4b791fe86b | ||
|
|
e17a582ae7 | ||
|
|
a271088e9a | ||
|
|
712d686559 | ||
|
|
481dd1b3e2 | ||
|
|
bd435094b6 | ||
|
|
16fa08d952 | ||
|
|
aa89953bf5 | ||
|
|
06cba22ad8 | ||
|
|
5923ce5ebc | ||
|
|
01eac1aec6 | ||
|
|
46189dcd43 | ||
|
|
1d9f304735 | ||
|
|
362b74e6a5 | ||
|
|
ee68e3f01b | ||
|
|
09e2de0390 | ||
|
|
12c9972b24 | ||
|
|
df32f93095 | ||
|
|
70d95b353e | ||
|
|
13eba3b3a6 | ||
|
|
1afdc9e7e3 | ||
|
|
38a113b5fb | ||
|
|
25f478e265 | ||
|
|
6a25662566 | ||
|
|
55af990071 | ||
|
|
927a4bbaa4 | ||
|
|
a101c621ec | ||
|
|
e25338e817 | ||
|
|
ecb1751cf5 | ||
|
|
aa54047d44 | ||
|
|
e02f82ee31 | ||
|
|
e8ff31d8d9 | ||
|
|
072805dd8f | ||
|
|
5626e0f5bc | ||
|
|
9fee7dc787 | ||
|
|
f86d97a96f | ||
|
|
6b0e8efadc | ||
|
|
7dba65c2cc | ||
|
|
497c670a98 | ||
|
|
d77790c6fa | ||
|
|
2c8311a0ff | ||
|
|
7bf5a8eaec | ||
|
|
bdffbc0757 | ||
|
|
c085eaa0a3 | ||
|
|
5580e0b29e | ||
|
|
3b174c6b4b | ||
|
|
d5acdde3c4 | ||
|
|
a1afa2ddee | ||
|
|
66d2c04834 | ||
|
|
81559b6a8f | ||
|
|
3d8c06e726 | ||
|
|
32d30df8a3 | ||
|
|
1b0746df6d | ||
|
|
a0b9a43e15 | ||
|
|
58f770cb6d | ||
|
|
0db624c3c6 | ||
|
|
79718d6ade | ||
|
|
2bcad00193 | ||
|
|
b22893eb54 | ||
|
|
9a8a97dbac | ||
|
|
9d1f05eab4 | ||
|
|
cb74756752 | ||
|
|
2ea00d12f3 | ||
|
|
b59a816a8b | ||
|
|
9363b2e26c | ||
|
|
0932602bbb | ||
|
|
85ad2c0097 | ||
|
|
19916388f2 | ||
|
|
d604107b7f | ||
|
|
f329965b3b | ||
|
|
c4e8c9048d | ||
|
|
da8e1d1183 | ||
|
|
b1bf8462da | ||
|
|
665a288af5 | ||
|
|
ec3e0ccf6d | ||
|
|
ea8e16c418 | ||
|
|
0b8ca66692 | ||
|
|
921b8340f0 | ||
|
|
873be55e78 | ||
|
|
772fa9a4df | ||
|
|
121d9e2c58 | ||
|
|
bca3488748 | ||
|
|
0af6a30347 | ||
|
|
d38d775cc9 | ||
|
|
5fc1151e90 | ||
|
|
737a61a3e9 | ||
|
|
4c8caec6bc | ||
|
|
9cccc9f0cc | ||
|
|
7cfee896b1 | ||
|
|
1dddf5c41a | ||
|
|
dc75776d3f | ||
|
|
018c30b73f | ||
|
|
0d8f776e8d | ||
|
|
df0a8b10d1 | ||
|
|
aeaec5465b | ||
|
|
8f15d65c5b | ||
|
|
7e19403aa9 | ||
|
|
bd18acc6a1 | ||
|
|
7046458db6 | ||
|
|
beab57218c | ||
|
|
46cd27c012 | ||
|
|
18123b2755 | ||
|
|
bbda0f33bd | ||
|
|
1edd364a33 | ||
|
|
89d6acb623 | ||
|
|
ff2f648379 | ||
|
|
0d9cf1cd91 | ||
|
|
40505f7628 | ||
|
|
3dee5372f2 | ||
|
|
6ee5b1014b | ||
|
|
189ba62385 | ||
|
|
b09e7ff2bc | ||
|
|
31492a0af3 | ||
|
|
f3d81252f0 | ||
|
|
e795b85ab8 | ||
|
|
3c4e4677d4 | ||
|
|
9f584da9ab | ||
|
|
a440848584 | ||
|
|
2301aa6425 | ||
|
|
263f2bf4c1 | ||
|
|
59d0c9a7ce | ||
|
|
19432a6362 | ||
|
|
97ec1cd385 | ||
|
|
162d60bbdc | ||
|
|
3bcdc7871d | ||
|
|
1f845a3682 | ||
|
|
a0a97a9451 | ||
|
|
c6261687b3 | ||
|
|
6deb311ecc | ||
|
|
0c6c8d5546 | ||
|
|
4e391c0e56 | ||
|
|
9788aa494a | ||
|
|
4f0cc7ab71 | ||
|
|
0bf9a00af2 | ||
|
|
fa9baced7a | ||
|
|
1f51f41954 | ||
|
|
bc8599315e | ||
|
|
1c49a33651 | ||
|
|
13ab8a74d6 | ||
|
|
51155f105c | ||
|
|
af46aa7c78 | ||
|
|
a7d46753aa | ||
|
|
161f257985 | ||
|
|
223de0ba4a | ||
|
|
2fa9c34e98 | ||
|
|
5d5011e409 | ||
|
|
fd4357bdad | ||
|
|
1a073f9661 | ||
|
|
e73c204d1c | ||
|
|
80cb0b46bc | ||
|
|
680a5f256a | ||
|
|
2b02d04219 | ||
|
|
7a61d73e65 | ||
|
|
972116ee96 | ||
|
|
d780607363 | ||
|
|
236004aef9 | ||
|
|
07bc133096 | ||
|
|
50427ef2d3 | ||
|
|
63eef42ca0 | ||
|
|
8723b195df | ||
|
|
ae86b47268 | ||
|
|
9901a0d770 | ||
|
|
da48607154 | ||
|
|
35f3a80eb1 | ||
|
|
0da1bf7a3b | ||
|
|
c027fca339 | ||
|
|
5ac98f5ef8 | ||
|
|
3cb0cca801 | ||
|
|
b4fd4c76a0 | ||
|
|
ecf19115c6 | ||
|
|
d475936bbb | ||
|
|
c404d69b54 | ||
|
|
6edc9cf7e9 | ||
|
|
71d89284f1 | ||
|
|
39473ba15c | ||
|
|
3f3fa3dc11 | ||
|
|
3f06099d38 | ||
|
|
450cf282aa | ||
|
|
804c452f6d | ||
|
|
c576f62d28 | ||
|
|
73651723dd | ||
|
|
82cc713372 | ||
|
|
6d0788268d | ||
|
|
c183cb6d7a | ||
|
|
3b83db0177 | ||
|
|
03f4dcb687 | ||
|
|
9415daba07 | ||
|
|
553571027d | ||
|
|
273ddda076 | ||
|
|
3c8f08a380 | ||
|
|
b5ac8175dc | ||
|
|
d765a9b6eb | ||
|
|
409afd8eac | ||
|
|
d7640d4c5d | ||
|
|
3828da4864 | ||
|
|
a45f7db85c | ||
|
|
df6a9e9286 | ||
|
|
c516f80dc1 | ||
|
|
0ef2f296f5 | ||
|
|
48597983e2 | ||
|
|
a6a4a057fe | ||
|
|
c7cfc07c9b | ||
|
|
51ad390584 | ||
|
|
b4c7795d25 | ||
|
|
78ef2a0355 | ||
|
|
4530424dec | ||
|
|
3543314ff0 | ||
|
|
4ade18bd31 | ||
|
|
951a899705 | ||
|
|
6d678a2e6e | ||
|
|
8b912e68ee | ||
|
|
8059834e91 | ||
|
|
4349603f51 | ||
|
|
160f254e57 | ||
|
|
45497396d1 | ||
|
|
d041ea6b6a | ||
|
|
a2e601ced0 | ||
|
|
35277ca729 | ||
|
|
f3ffe5d037 | ||
|
|
38866547ec | ||
|
|
f4cd9b3b9f | ||
|
|
e687c3f2ba | ||
|
|
97cbfdea4e | ||
|
|
af97e8aef1 | ||
|
|
2094ecb0ba | ||
|
|
928436eda3 | ||
|
|
5b1a7de921 | ||
|
|
e679f2a1b2 | ||
|
|
9113b376b9 | ||
|
|
9169ec9b81 | ||
|
|
41605aabb7 | ||
|
|
fe56be4ea1 | ||
|
|
e916ef9b45 | ||
|
|
aa51f380b5 | ||
|
|
a9883261da | ||
|
|
314a06d43f | ||
|
|
0992636fa3 | ||
|
|
184b7c9cbb | ||
|
|
47fd128509 | ||
|
|
5f88c09b1c | ||
|
|
525c99c0ae | ||
|
|
46bcdf0adf | ||
|
|
4b2a0d7e4e | ||
|
|
53f2508941 | ||
|
|
cb0ddaf084 | ||
|
|
3dd9b2c694 | ||
|
|
8516b14d4a | ||
|
|
cdc8f43a66 | ||
|
|
ce5cf80f96 | ||
|
|
c7522ccf10 | ||
|
|
f817cb7be5 | ||
|
|
f22acb4bd6 | ||
|
|
26d894e02c | ||
|
|
32f37cd98a | ||
|
|
66bd13d5d5 | ||
|
|
31e294ae4f | ||
|
|
3b771408ae | ||
|
|
e55f19c7e5 | ||
|
|
e24f6ee0e4 | ||
|
|
d1e92391d4 | ||
|
|
c24829f6a4 | ||
|
|
7f9ddb4875 | ||
|
|
c644e3e675 | ||
|
|
a9864c7fb5 | ||
|
|
2d57e47d55 | ||
|
|
377e5a6751 | ||
|
|
c17cc3f601 | ||
|
|
8bfd84fa16 | ||
|
|
629d4c3ee9 | ||
|
|
50284d0eb6 | ||
|
|
6a848513b1 | ||
|
|
5b5d3abd2b | ||
|
|
c06d606164 | ||
|
|
6b6fb66a7d | ||
|
|
80a85f3858 | ||
|
|
ee5222165c | ||
|
|
73367c9698 | ||
|
|
ce370d4575 | ||
|
|
374685eeae | ||
|
|
3453ca1c5b | ||
|
|
650913f1e8 | ||
|
|
07683d2342 | ||
|
|
519ec07af8 | ||
|
|
d356b68c33 | ||
|
|
69f3509c17 | ||
|
|
23d68ac9cc | ||
|
|
d4219bdd3f | ||
|
|
ff396081e1 | ||
|
|
b65df31ff9 | ||
|
|
c88c2c58a5 | ||
|
|
1d72df573a | ||
|
|
0f6001b312 | ||
|
|
f9f33336db | ||
|
|
8ba8322836 | ||
|
|
1142a67f88 | ||
|
|
95eb1d545e | ||
|
|
f234bae2a3 | ||
|
|
5ea6a48ee1 | ||
|
|
e6ac747f5d | ||
|
|
11e637bcb7 | ||
|
|
89935e4f80 | ||
|
|
f1f9ec47be | ||
|
|
ca69e44f99 | ||
|
|
820f5d1bb5 | ||
|
|
ee9ed6386d | ||
|
|
a97ca0b240 | ||
|
|
b5dc15cb9a | ||
|
|
75a41fb028 | ||
|
|
7cf1baec25 | ||
|
|
0763917adf | ||
|
|
2344d7ce51 | ||
|
|
f8724bae66 | ||
|
|
b705c56948 | ||
|
|
60b9fe5809 | ||
|
|
32ea38867a | ||
|
|
dd1044ee3d | ||
|
|
7f4e828567 | ||
|
|
64ec55ba54 | ||
|
|
39fa784540 | ||
|
|
4a20f2fd89 | ||
|
|
1a860399d9 | ||
|
|
502b259b8c | ||
|
|
c010fda0db | ||
|
|
743b9d1d54 | ||
|
|
7506282950 | ||
|
|
2346accccc | ||
|
|
dd69b75c7f | ||
|
|
a71ebaedc3 | ||
|
|
1c85b91f32 | ||
|
|
b130644c47 | ||
|
|
0febf9ef0d | ||
|
|
c1e9a5dcfc | ||
|
|
3ddba35295 | ||
|
|
2aede4a341 | ||
|
|
19d6e25f06 | ||
|
|
0b5d3bfddd | ||
|
|
823c2607d9 | ||
|
|
d8bbac3096 | ||
|
|
8af2b7dd66 | ||
|
|
d480f13024 | ||
|
|
40a02cc8e0 | ||
|
|
505c145794 | ||
|
|
79648f2e07 | ||
|
|
02b03328d1 | ||
|
|
34046ecb4b | ||
|
|
6ecba949c2 | ||
|
|
3edadfa475 | ||
|
|
99aab8bc2e | ||
|
|
0c52656a5e | ||
|
|
1e0be54c43 | ||
|
|
bf91c1f9f3 | ||
|
|
3314228b9c | ||
|
|
8c26242af7 | ||
|
|
a75bd355cf | ||
|
|
ea19b936cb | ||
|
|
3dbd5cee3a | ||
|
|
07c312fa33 | ||
|
|
8d15dcb5c9 | ||
|
|
fd9d2bfccc | ||
|
|
3497270b26 | ||
|
|
1f505e1a28 | ||
|
|
96758aba7e | ||
|
|
b538244b6f | ||
|
|
04e7e54556 | ||
|
|
372002dfa5 | ||
|
|
401b21b715 | ||
|
|
e09d1fec5d | ||
|
|
2e8ab3bd43 | ||
|
|
c060038e50 | ||
|
|
d73f84dbb4 | ||
|
|
3e69119df2 | ||
|
|
a9e11e3734 | ||
|
|
ca742146d9 | ||
|
|
de47ab6ad3 | ||
|
|
9cff4a32b2 | ||
|
|
1744ef86bf | ||
|
|
46b3bafeb7 | ||
|
|
76b372f822 | ||
|
|
782485edd0 | ||
|
|
84f444ab55 | ||
|
|
83283d6bda | ||
|
|
4cd3769115 | ||
|
|
c44b4adf60 | ||
|
|
fa59f45184 | ||
|
|
79323dfe58 | ||
|
|
2bfb402c25 | ||
|
|
13e1866820 | ||
|
|
1462aaa30e | ||
|
|
5fbe50b2f9 | ||
|
|
d747596ce1 | ||
|
|
696fff3f5d | ||
|
|
87108d5640 | ||
|
|
8bc0b1cbaf | ||
|
|
b6110ad703 | ||
|
|
f48d2ef40d | ||
|
|
3e4bfe22d8 | ||
|
|
199e2cbaec | ||
|
|
24f9f961b9 | ||
|
|
e9b3f52f0e | ||
|
|
acf0649150 | ||
|
|
df2e35d683 | ||
|
|
19074465a0 | ||
|
|
7d8e143963 | ||
|
|
48c004794c | ||
|
|
b011b3e7a2 | ||
|
|
43daff617a | ||
|
|
ef6a1dc5a4 | ||
|
|
8c5b2d623b | ||
|
|
d3a2c4012c | ||
|
|
67a9089952 | ||
|
|
22ecbee791 | ||
|
|
e07ffa54ee | ||
|
|
be560875da | ||
|
|
fdf7e409bf | ||
|
|
d9255bf02d | ||
|
|
40b88a2d4c | ||
|
|
c966066c67 | ||
|
|
5a1209f77d | ||
|
|
fdd1732331 | ||
|
|
e46af16db5 | ||
|
|
9f6a7044a9 | ||
|
|
f4c46184bd | ||
|
|
e7bf9ce9a7 | ||
|
|
5bf13dc655 | ||
|
|
f4cbeec974 | ||
|
|
eecaefff6a | ||
|
|
cd0feb4fd5 | ||
|
|
42aba1e8e3 | ||
|
|
7d03fce760 | ||
|
|
177133041e | ||
|
|
b563a1a859 | ||
|
|
c81081c2cd | ||
|
|
910c62530e | ||
|
|
f20a4e3954 | ||
|
|
9254d9d2bb | ||
|
|
e8c0c8928e | ||
|
|
3ad5b584d6 | ||
|
|
84a2132f9c | ||
|
|
a70fa29891 | ||
|
|
79230e1faa | ||
|
|
d1c6ac4bf6 | ||
|
|
1c0fa27d6a | ||
|
|
1f41421c56 | ||
|
|
1e5c55429c | ||
|
|
acf7040ba5 | ||
|
|
6a60145bd8 | ||
|
|
e74cd11bd0 | ||
|
|
6aa70de7ac | ||
|
|
1719cdf2e3 | ||
|
|
8c528b2093 | ||
|
|
8270a3d138 | ||
|
|
361bec9060 | ||
|
|
731d5c6f5f | ||
|
|
85ce7971fc | ||
|
|
43054c2965 | ||
|
|
8693c42331 | ||
|
|
bfe6c15a4f | ||
|
|
fb1a16b861 | ||
|
|
311b9bd4da | ||
|
|
58e1b1d5d2 | ||
|
|
9d6eef85f1 | ||
|
|
275344d421 | ||
|
|
e911970c8d | ||
|
|
eb5df74dc5 | ||
|
|
95d4623e6c | ||
|
|
8c8e97c610 | ||
|
|
b68903bc92 | ||
|
|
bff901dd69 | ||
|
|
5dc4273d96 | ||
|
|
a7622a8c5e | ||
|
|
8ecad85d3f | ||
|
|
4955178426 | ||
|
|
e211546923 | ||
|
|
055481f8a3 | ||
|
|
b84727fcd8 | ||
|
|
59097dd8d7 | ||
|
|
cc9dc38eb4 | ||
|
|
85b7200d25 | ||
|
|
349c9941bf | ||
|
|
7646edcd23 | ||
|
|
d5976fb379 | ||
|
|
a93666b2af | ||
|
|
e715bed254 | ||
|
|
1af1acea40 | ||
|
|
060cc07592 | ||
|
|
d3c012cad2 | ||
|
|
20e74eade2 | ||
|
|
d3f9499f03 | ||
|
|
f99c57eb60 | ||
|
|
d7074325f4 | ||
|
|
1ba6fe5260 | ||
|
|
ee6d62950d | ||
|
|
f8fb2b5483 | ||
|
|
164dc070bd | ||
|
|
7539b5c507 | ||
|
|
68be50b26e | ||
|
|
6cbe06f394 | ||
|
|
a9f2db6380 | ||
|
|
4a492ffcd2 | ||
|
|
b5c66b50b9 | ||
|
|
ebfe5ace65 | ||
|
|
c242dc6f6d | ||
|
|
bcfcc43956 | ||
|
|
ab6507965b | ||
|
|
78b816c5e6 | ||
|
|
ec32535419 | ||
|
|
c607d1a2fd | ||
|
|
81c1e61d8b | ||
|
|
1dc0e38865 | ||
|
|
19dcacfbbe | ||
|
|
10d8498f1b | ||
|
|
d3620bf033 | ||
|
|
467041825c | ||
|
|
fa380c75f7 | ||
|
|
2882737958 | ||
|
|
aebc719f0b | ||
|
|
d21b72758b | ||
|
|
40cc97aedd | ||
|
|
9a897954b4 | ||
|
|
2e151c7137 | ||
|
|
84d6b14e36 | ||
|
|
97d25c8e9c | ||
|
|
82cf72c677 | ||
|
|
3777b9237b | ||
|
|
2ed7034284 | ||
|
|
98dc7f4738 | ||
|
|
12efbac58a | ||
|
|
00cfc35102 | ||
|
|
31d352a79e | ||
|
|
753e1620ed | ||
|
|
597caad073 | ||
|
|
5b04c0feeb | ||
|
|
0d0ce30e65 | ||
|
|
5117435c8a | ||
|
|
383e721f4b | ||
|
|
1aaa19a969 | ||
|
|
770df54403 | ||
|
|
3e67b331ef | ||
|
|
26442e9516 | ||
|
|
3cd715afd9 | ||
|
|
0ecdaab240 | ||
|
|
801ec1a874 | ||
|
|
ebf0f9372b | ||
|
|
06c534dc50 | ||
|
|
04289885c2 | ||
|
|
8e7b9490de | ||
|
|
cec1ff48fd | ||
|
|
85fad7d3ad | ||
|
|
028c44ba64 | ||
|
|
7923adb4fb | ||
|
|
4b9d00a042 | ||
|
|
0df0384f96 | ||
|
|
5402dadbd9 |
21
.gitignore
vendored
@@ -1,21 +1,8 @@
|
||||
################################################################################
|
||||
# This .gitignore file was automatically created by Microsoft(R) Visual Studio.
|
||||
################################################################################
|
||||
*.pdb
|
||||
*.xml
|
||||
*.xsd
|
||||
bin/
|
||||
adb/
|
||||
rclone/
|
||||
thumbnails/
|
||||
notes/
|
||||
AndroidSideloader.csproj.user
|
||||
|
||||
.vs/
|
||||
/.vs/AndroidSideloader/v16/.suo
|
||||
/adb/adb.exe
|
||||
installedPackages.json
|
||||
AndroidSideloader.csproj.user
|
||||
AndroidSideloader.csproj.user
|
||||
AndroidSideloader.csproj.user
|
||||
/AndroidSideloader v2.1.exe
|
||||
/crashlog.txt
|
||||
/debuglog.txt
|
||||
bin/
|
||||
packages/
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"ExpandedNodes": [
|
||||
""
|
||||
],
|
||||
"SelectedNode": "\\Sideloader.cs",
|
||||
"PreviewInSolutionExplorer": false
|
||||
}
|
||||
BIN
.vs/slnx.sqlite
450
ADB.cs
@@ -1,24 +1,23 @@
|
||||
using System;
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using JR.Utils.GUI.Forms;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
|
||||
|
||||
class ADB
|
||||
internal class ADB
|
||||
{
|
||||
static Process adb = new Process();
|
||||
public static string adbFolderPath = "C:\\RSL\\2.1.1\\ADB";
|
||||
public static string adbFilePath = adbFolderPath + "\\adb.exe";
|
||||
private static readonly Process adb = new Process();
|
||||
public static string adbFolderPath = Path.Combine(Path.GetPathRoot(Environment.SystemDirectory), "RSL", "platform-tools");
|
||||
public static string adbFilePath = Path.Combine(adbFolderPath, "adb.exe");
|
||||
public static string DeviceID = "";
|
||||
public static string package = "";
|
||||
public static ProcessOutput RunAdbCommandToString(string command)
|
||||
{
|
||||
// Replacing "adb" from command if the user added it
|
||||
command = command.Replace("adb", "");
|
||||
|
||||
Properties.Settings.Default.ADBFolder = adbFolderPath;
|
||||
Properties.Settings.Default.ADBPath = adbFilePath;
|
||||
Properties.Settings.Default.Save();
|
||||
@@ -28,76 +27,75 @@ namespace AndroidSideloader
|
||||
}
|
||||
if (!command.Contains("dumpsys") && !command.Contains("shell pm list packages") && !command.Contains("KEYCODE_WAKEUP"))
|
||||
{
|
||||
|
||||
string logcmd = command;
|
||||
|
||||
if (logcmd.Contains(Environment.CurrentDirectory))
|
||||
{
|
||||
logcmd = logcmd.Replace($"{Environment.CurrentDirectory}", $"CurrentDirectory");
|
||||
Logger.Log($"Running command: {logcmd}");
|
||||
}
|
||||
adb.StartInfo.FileName = adbFilePath;
|
||||
adb.StartInfo.Arguments = command;
|
||||
adb.StartInfo.RedirectStandardError = true;
|
||||
adb.StartInfo.RedirectStandardInput = true;
|
||||
adb.StartInfo.RedirectStandardOutput = true;
|
||||
adb.StartInfo.CreateNoWindow = true;
|
||||
adb.StartInfo.UseShellExecute = false;
|
||||
adb.StartInfo.WorkingDirectory = adbFolderPath;
|
||||
adb.Start();
|
||||
adb.StandardInput.WriteLine(command);
|
||||
adb.StandardInput.Flush();
|
||||
adb.StandardInput.Close();
|
||||
|
||||
string output = "";
|
||||
string error = "";
|
||||
|
||||
try
|
||||
{
|
||||
output = adb.StandardOutput.ReadToEnd();
|
||||
error = adb.StandardError.ReadToEnd();
|
||||
}
|
||||
catch { }
|
||||
if (command.Contains("connect"))
|
||||
{
|
||||
bool graceful = adb.WaitForExit(3000); //Wait 3 secs.
|
||||
if (!graceful)
|
||||
{
|
||||
adb.Kill();
|
||||
}
|
||||
|
||||
_ = Logger.Log($"Running command: {logcmd}");
|
||||
}
|
||||
else
|
||||
adb.WaitForExit();
|
||||
if (error.Contains("ADB_VENDOR_KEYS") && !Properties.Settings.Default.adbdebugwarned)
|
||||
|
||||
using (Process adb = new Process())
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show("Please check inside your headset for ADB DEBUGGING prompt, check box to \"Always allow from this computer.\" and hit OK.\nPlease note that even if you have done this\nbefore it will reset itself from time to time.\n\nPress CANCEL if you want to disable this prompt (FOR DEBUGGING ONLY, NOT RECOMMENDED).", "ADB Debugging not enabled.", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult == DialogResult.Cancel)
|
||||
adb.StartInfo.FileName = adbFilePath;
|
||||
adb.StartInfo.Arguments = command;
|
||||
adb.StartInfo.RedirectStandardError = true;
|
||||
adb.StartInfo.RedirectStandardOutput = true;
|
||||
adb.StartInfo.CreateNoWindow = true;
|
||||
adb.StartInfo.UseShellExecute = false;
|
||||
adb.StartInfo.WorkingDirectory = adbFolderPath;
|
||||
_ = adb.Start();
|
||||
|
||||
string output = "";
|
||||
string error = "";
|
||||
|
||||
try
|
||||
{
|
||||
Properties.Settings.Default.adbdebugwarned = true;
|
||||
Properties.Settings.Default.Save();
|
||||
output = adb.StandardOutput.ReadToEnd();
|
||||
error = adb.StandardError.ReadToEnd();
|
||||
}
|
||||
else
|
||||
ADB.WakeDevice();
|
||||
catch { }
|
||||
|
||||
if (command.Contains("connect"))
|
||||
{
|
||||
bool graceful = adb.WaitForExit(3000);
|
||||
if (!graceful)
|
||||
{
|
||||
adb.Kill();
|
||||
adb.WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
if (error.Contains("ADB_VENDOR_KEYS") && !Properties.Settings.Default.adbdebugwarned)
|
||||
{
|
||||
ADBDebugWarning();
|
||||
}
|
||||
if (error.Contains("not enough storage space"))
|
||||
{
|
||||
_ = FlexibleMessageBox.Show(Program.form, "There is not enough room on your device to install this package. Please clear AT LEAST 2x the amount of the app you are trying to install.");
|
||||
}
|
||||
if (!output.Contains("version") && !output.Contains("KEYCODE_WAKEUP") && !output.Contains("Filesystem") && !output.Contains("package:") && !output.Equals(null))
|
||||
{
|
||||
_ = Logger.Log(output);
|
||||
}
|
||||
|
||||
_ = Logger.Log(error, LogLevel.ERROR);
|
||||
return new ProcessOutput(output, error);
|
||||
}
|
||||
if (error.Contains("not enough storage space"))
|
||||
{
|
||||
FlexibleMessageBox.Show("There is not enough room on your device to install this package. Please clear AT LEAST 2x the amount of the app you are trying to install.");
|
||||
}
|
||||
if (!output.Contains("version") && !output.Contains("KEYCODE_WAKEUP") && !output.Contains("Filesystem") && !output.Contains("package:") && !output.Equals(null))
|
||||
Logger.Log(output);
|
||||
Logger.Log(error);
|
||||
return new ProcessOutput(output, error);
|
||||
}
|
||||
|
||||
public static ProcessOutput RunAdbCommandToStringWOADB(string result, string path)
|
||||
{
|
||||
string command = result;
|
||||
Properties.Settings.Default.ADBFolder = adbFolderPath;
|
||||
Properties.Settings.Default.ADBPath = adbFilePath;
|
||||
Properties.Settings.Default.Save();
|
||||
|
||||
string logcmd = command;
|
||||
if (logcmd.Contains(Environment.CurrentDirectory))
|
||||
{
|
||||
logcmd = logcmd.Replace($"{Environment.CurrentDirectory}", $"CurrentDirectory");
|
||||
Logger.Log($"Running command: {logcmd}");
|
||||
}
|
||||
|
||||
_ = Logger.Log($"Running command: {logcmd}");
|
||||
|
||||
adb.StartInfo.FileName = "cmd.exe";
|
||||
adb.StartInfo.RedirectStandardError = true;
|
||||
@@ -106,7 +104,7 @@ namespace AndroidSideloader
|
||||
adb.StartInfo.CreateNoWindow = true;
|
||||
adb.StartInfo.UseShellExecute = false;
|
||||
adb.StartInfo.WorkingDirectory = Path.GetDirectoryName(path);
|
||||
adb.Start();
|
||||
_ = adb.Start();
|
||||
adb.StandardInput.WriteLine(command);
|
||||
adb.StandardInput.Flush();
|
||||
adb.StandardInput.Close();
|
||||
@@ -127,48 +125,37 @@ namespace AndroidSideloader
|
||||
if (!graceful)
|
||||
{
|
||||
adb.Kill();
|
||||
}
|
||||
else
|
||||
adb.WaitForExit();
|
||||
}
|
||||
}
|
||||
else if (command.Contains("install"))
|
||||
else if (command.Contains("connect"))
|
||||
{
|
||||
bool graceful = adb.WaitForExit(120000);
|
||||
bool graceful = adb.WaitForExit(3000);
|
||||
if (!graceful)
|
||||
{
|
||||
adb.Kill();
|
||||
}
|
||||
else
|
||||
adb.WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
if (error.Contains("ADB_VENDOR_KEYS") && Properties.Settings.Default.adbdebugwarned)
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show("Please check inside your headset for ADB DEBUGGING prompt, check box to \"Always allow from this computer.\" and hit OK.\nPlease note that even if you have done this\nbefore it will reset itself from time to time.\n\nPress CANCEL if you want to disable this prompt (FOR DEBUGGING ONLY, NOT RECOMMENDED).", "ADB Debugging not enabled.", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult == DialogResult.Cancel)
|
||||
{
|
||||
Properties.Settings.Default.adbdebugwarned = true;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
else
|
||||
ADB.WakeDevice();
|
||||
ADBDebugWarning();
|
||||
}
|
||||
Logger.Log(output);
|
||||
Logger.Log(error);
|
||||
_ = Logger.Log(output);
|
||||
_ = Logger.Log(error, LogLevel.ERROR);
|
||||
return new ProcessOutput(output, error);
|
||||
}
|
||||
public static ProcessOutput RunCommandToString(string result, string path = "")
|
||||
{
|
||||
string command = result;
|
||||
Properties.Settings.Default.ADBFolder = adbFolderPath;
|
||||
Properties.Settings.Default.ADBPath = adbFilePath;
|
||||
Properties.Settings.Default.Save();
|
||||
|
||||
string logcmd = command;
|
||||
if (logcmd.Contains(Environment.CurrentDirectory))
|
||||
{
|
||||
logcmd = logcmd.Replace($"{Environment.CurrentDirectory}", $"CurrentDirectory");
|
||||
Logger.Log($"Running command: {logcmd}");
|
||||
adb.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
|
||||
}
|
||||
|
||||
_ = Logger.Log($"Running command: {logcmd}");
|
||||
adb.StartInfo.FileName = $@"{Path.GetPathRoot(Environment.SystemDirectory)}\Windows\System32\cmd.exe";
|
||||
adb.StartInfo.Arguments = command;
|
||||
adb.StartInfo.RedirectStandardError = true;
|
||||
adb.StartInfo.RedirectStandardInput = true;
|
||||
@@ -176,7 +163,7 @@ namespace AndroidSideloader
|
||||
adb.StartInfo.CreateNoWindow = true;
|
||||
adb.StartInfo.UseShellExecute = false;
|
||||
adb.StartInfo.WorkingDirectory = Path.GetDirectoryName(path);
|
||||
adb.Start();
|
||||
_ = adb.Start();
|
||||
adb.StandardInput.WriteLine(command);
|
||||
adb.StandardInput.Flush();
|
||||
adb.StandardInput.Close();
|
||||
@@ -197,33 +184,35 @@ namespace AndroidSideloader
|
||||
if (!graceful)
|
||||
{
|
||||
adb.Kill();
|
||||
adb.WaitForExit();
|
||||
}
|
||||
}
|
||||
else
|
||||
adb.WaitForExit();
|
||||
|
||||
|
||||
if (error.Contains("ADB_VENDOR_KEYS") && Properties.Settings.Default.adbdebugwarned)
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show("Please check inside your headset for ADB DEBUGGING prompt, check box to \"Always allow from this computer.\" and hit OK.\nPlease note that even if you have done this\nbefore it will reset itself from time to time.\n\nPress CANCEL if you want to disable this prompt (FOR DEBUGGING ONLY, NOT RECOMMENDED).", "ADB Debugging not enabled.", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult == DialogResult.Cancel)
|
||||
{
|
||||
Properties.Settings.Default.adbdebugwarned = true;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
else
|
||||
ADB.WakeDevice();
|
||||
ADBDebugWarning();
|
||||
}
|
||||
Logger.Log(output);
|
||||
Logger.Log(error);
|
||||
_ = Logger.Log(output);
|
||||
_ = Logger.Log(error, LogLevel.ERROR);
|
||||
return new ProcessOutput(output, error);
|
||||
}
|
||||
|
||||
public static void ADBDebugWarning()
|
||||
{
|
||||
Program.form.Invoke(() =>
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show(Program.form, "On your headset, click on the Notifications Bell, and then select the USB Detected notification to enable Connections.", "ADB Debugging not enabled.", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult == DialogResult.Cancel)
|
||||
{
|
||||
// Properties.Settings.Default.adbdebugwarned = true;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static ProcessOutput UninstallPackage(string package)
|
||||
{
|
||||
WakeDevice();
|
||||
ProcessOutput output = new ProcessOutput("", "");
|
||||
output += RunAdbCommandToString($"shell pm uninstall -k --user 0 {package}");
|
||||
output += RunAdbCommandToString($"shell pm uninstall {package}");
|
||||
return output;
|
||||
}
|
||||
@@ -231,249 +220,96 @@ namespace AndroidSideloader
|
||||
public static string GetAvailableSpace()
|
||||
{
|
||||
long totalSize = 0;
|
||||
|
||||
long usedSize = 0;
|
||||
|
||||
long freeSize = 0;
|
||||
WakeDevice();
|
||||
var output = RunAdbCommandToString("shell df").Output.Split('\n');
|
||||
|
||||
string[] output = RunAdbCommandToString("shell df").Output.Split('\n');
|
||||
|
||||
foreach (string currLine in output)
|
||||
{
|
||||
if (currLine.StartsWith("/data/media"))
|
||||
if (currLine.StartsWith("/dev/fuse") || currLine.StartsWith("/data/media"))
|
||||
{
|
||||
var foo = currLine.Split(' ');
|
||||
int i = 0;
|
||||
foreach (string curr in foo)
|
||||
string[] foo = currLine.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (foo.Length >= 4)
|
||||
{
|
||||
if (curr.Length > 1)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
totalSize = Int64.Parse(curr) / 1000;
|
||||
break;
|
||||
case 2:
|
||||
usedSize = Int64.Parse(curr) / 1000;
|
||||
break;
|
||||
case 3:
|
||||
freeSize = Int64.Parse(curr) / 1000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
totalSize = long.Parse(foo[1]) / 1000;
|
||||
usedSize = long.Parse(foo[2]) / 1000;
|
||||
freeSize = long.Parse(foo[3]) / 1000;
|
||||
break; // Assuming we only need the first matching line
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $"Total space: {String.Format("{0:0.00}", (double)totalSize / 1000)}GB\nUsed space: {String.Format("{0:0.00}", (double)usedSize / 1000)}GB\nFree space: {String.Format("{0:0.00}", (double)freeSize / 1000)}GB";
|
||||
return $"Total space: {string.Format("{0:0.00}", (double)totalSize / 1000)}GB\nUsed space: {string.Format("{0:0.00}", (double)usedSize / 1000)}GB\nFree space: {string.Format("{0:0.00}", (double)freeSize / 1000)}GB";
|
||||
}
|
||||
|
||||
public static void WakeDevice()
|
||||
{
|
||||
string devicesout = RunAdbCommandToString("shell input keyevent KEYCODE_WAKEUP").Output;
|
||||
if (!devicesout.Contains("found") && !Properties.Settings.Default.nodevicemode)
|
||||
{
|
||||
if (Properties.Settings.Default.IPAddress.Contains("connect"))
|
||||
{
|
||||
|
||||
RunAdbCommandToString(Properties.Settings.Default.IPAddress);
|
||||
string response = RunAdbCommandToString(Properties.Settings.Default.IPAddress).Output;
|
||||
|
||||
if (response.Contains("cannot") || String.IsNullOrEmpty(response))
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show("Either your Quest is idle or you have rebooted the device.\nRSL's wireless ADB will persist on PC reboot but not on Quest reboot.\n\nNOTE: If you haven't rebooted your Quest it may be idle.\n\nTo prevent this press the HOLD button 2x prior to launching RSL. Or\nkeep your Quest plugged into power to keep it permanently \"awake\".\n\nHave you assigned your Quest a static IP in your router configuration?\n\nIf you no longer want to use Wireless ADB or your device was idle please hit CANCEL.", "DEVICE REBOOTED\\IDLE?", MessageBoxButtons.YesNoCancel);
|
||||
if (dialogResult == DialogResult.Cancel)
|
||||
{
|
||||
DialogResult dialogResult2 = FlexibleMessageBox.Show("PRESS YES TO DISABLE WIRELESS ADB.\n\nIf your Quest went idle press the HOLD button on the device twice then press NO to reconnect.\n\nIf you just want to exit this prompt press CANCEL.", "DISABLE WIRELESS ADB?", MessageBoxButtons.YesNoCancel);
|
||||
if (dialogResult2 == DialogResult.No)
|
||||
WakeDevice();
|
||||
if (dialogResult2 == DialogResult.Yes)
|
||||
{
|
||||
Properties.Settings.Default.IPAddress = "";
|
||||
Properties.Settings.Default.Save();
|
||||
WakeDevice();
|
||||
}
|
||||
if (dialogResult2 == DialogResult.Cancel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
else if (dialogResult == DialogResult.Yes)
|
||||
{
|
||||
FlexibleMessageBox.Show("Connect your Quest to USB so we can reconnect to your saved IP address!");
|
||||
RunAdbCommandToString("devices");
|
||||
Thread.Sleep(250);
|
||||
RunAdbCommandToString("disconnect");
|
||||
Thread.Sleep(50);
|
||||
RunAdbCommandToString("connect");
|
||||
Thread.Sleep(50);
|
||||
RunAdbCommandToString("tcpip 5555");
|
||||
Thread.Sleep(500);
|
||||
RunAdbCommandToString(Properties.Settings.Default.IPAddress);
|
||||
MessageBox.Show($"Connected! We can now automatically enable wake on wifi. This makes it so Rookie can work wirelessly even if the device has entered \"sleep mode\". This setting is NOT permanent and resets upon Quest reboot just like wireless ADB functionality.\n\n After testing with this setting off and on the difference in battery usage seems nonexistent. We recommend this setting for the majority of users for ease of use purposes. If you click NO you must keep your Quest connected to a charger OR wake your device and then put it back on hold before using Rookie wirelessly. Do you want to enable wake on wifi?", "Enable Wake on Wifi?", MessageBoxButtons.YesNo);
|
||||
if (dialogResult == DialogResult.Yes)
|
||||
{
|
||||
|
||||
RunAdbCommandToString("shell settings put global wifi_wakeup_available 1");
|
||||
RunAdbCommandToString("shell settings put global wifi_wakeup_enabled 1");
|
||||
}
|
||||
if (dialogResult == DialogResult.No)
|
||||
{
|
||||
|
||||
Program.form.ChangeTitlebarToDevice();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (dialogResult == DialogResult.No)
|
||||
{
|
||||
FlexibleMessageBox.Show("You must repeat the entire connection process, press OK to begin.", "Reconfigure Wireless ADB", MessageBoxButtons.OK);
|
||||
RunAdbCommandToString("devices");
|
||||
RunAdbCommandToString("tcpip 5555");
|
||||
FlexibleMessageBox.Show("Press OK to get your Quest's local IP address.", "Obtain local IP address", MessageBoxButtons.OK);
|
||||
Thread.Sleep(1000);
|
||||
string input = RunAdbCommandToString("shell ip route").Output;
|
||||
|
||||
Properties.Settings.Default.WirelessADB = true;
|
||||
Properties.Settings.Default.Save();
|
||||
string[] strArrayOne = new string[] { "" };
|
||||
strArrayOne = input.Split(' ');
|
||||
if (strArrayOne[0].Length > 7)
|
||||
{
|
||||
string IPaddr = strArrayOne[8];
|
||||
string IPcmnd = "connect " + IPaddr + ":5555";
|
||||
FlexibleMessageBox.Show($"Your Quest's local IP address is: {IPaddr}\n\nPlease disconnect your Quest then wait 2 seconds.\nOnce it is disconnected hit OK", "", MessageBoxButtons.OK);
|
||||
Thread.Sleep(2000);
|
||||
ADB.RunAdbCommandToString(IPcmnd);
|
||||
Properties.Settings.Default.IPAddress = IPcmnd;
|
||||
Properties.Settings.Default.Save();
|
||||
|
||||
MessageBox.Show($"Connected! We can now automatically disable the Quest wifi chip from falling asleep. This makes it so Rookie can work wirelessly even if the device has entered \"sleep mode\". This setting is NOT permanent and resets upon Quest reboot, just like wireless ADB functionality.\n\nNOTE: This may cause the device battery to drain while it is in sleep mode at a very slightly increased rate. We recommend this setting for the majority of users for ease of use purposes. If you click NO you must keep your Quest connected to a charger or wake your device and then put it back on hold before using Rookie wirelessly. Do you want us to stop sleep mode from disabling wireless ADB?", "", MessageBoxButtons.YesNo);
|
||||
if (dialogResult == DialogResult.Yes)
|
||||
{
|
||||
|
||||
ADB.RunAdbCommandToString("shell settings put global wifi_wakeup_available 1");
|
||||
ADB.RunAdbCommandToString("shell settings put global wifi_wakeup_enabled 1");
|
||||
}
|
||||
Program.form.ChangeTitlebarToDevice();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static ProcessOutput Sideload(string path = "", string packagename = "")
|
||||
public static bool wirelessadbON;
|
||||
public static ProcessOutput Sideload(string path, string packagename = "")
|
||||
{
|
||||
|
||||
WakeDevice();
|
||||
ProcessOutput ret = new ProcessOutput();
|
||||
ret += RunAdbCommandToString($"install -g -r \"{path}\"");
|
||||
ret += RunAdbCommandToString($"install -g \"{path}\"");
|
||||
string out2 = ret.Output + ret.Error;
|
||||
if (out2.Contains("failed"))
|
||||
{
|
||||
string BackupFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
|
||||
Logger.Log(out2);
|
||||
_ = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
|
||||
_ = Logger.Log(out2);
|
||||
if (out2.Contains("offline") && !Properties.Settings.Default.nodevicemode)
|
||||
{
|
||||
DialogResult dialogResult2 = FlexibleMessageBox.Show("Device is offline. Press Yes to reconnect, or if you don't wish to connect and just want to download the game (requires unchecking \"Delete games after install\" from settings menu) then press No.", "Device offline.", MessageBoxButtons.YesNoCancel);
|
||||
if (dialogResult2 == DialogResult.Yes)
|
||||
ADB.WakeDevice();
|
||||
DialogResult dialogResult2 = FlexibleMessageBox.Show(Program.form, "Device is offline. Press Yes to reconnect, or if you don't wish to connect and just want to download the game (requires unchecking \"Delete games after install\" from settings menu) then press No.", "Device offline.", MessageBoxButtons.YesNoCancel);
|
||||
}
|
||||
if (out2.Contains($"INSTALL_FAILED_UPDATE_INCOMPATIBLE") || out2.Contains("INSTALL_FAILED_VERSION_DOWNGRADE") || out2.Contains("signatures do not match") || out2.Contains("failed to install"))
|
||||
if (out2.Contains($"signatures do not match previously") || out2.Contains("INSTALL_FAILED_VERSION_DOWNGRADE") || out2.Contains("signatures do not match") || out2.Contains("failed to install"))
|
||||
{
|
||||
ret.Error = string.Empty;
|
||||
ret.Output = string.Empty;
|
||||
|
||||
|
||||
FlexibleMessageBox.Show($"In place upgrade for {packagename} failed. We will need to upgrade by uninstalling, and keeping savedata isn't guaranteed. Continue?", "UPGRADE FAILED!", MessageBoxButtons.OKCancel);
|
||||
|
||||
string date_str = DateTime.Today.ToString("yyyy.MM.dd");
|
||||
string CurrBackups = Path.Combine(BackupFolder, date_str);
|
||||
|
||||
|
||||
FlexibleMessageBox.Show($"Searching for save files...", "Searching!", MessageBoxButtons.OK);
|
||||
if (Directory.Exists($"/sdcard/Android/data/{packagename}"))
|
||||
if (!Properties.Settings.Default.AutoReinstall)
|
||||
{
|
||||
FlexibleMessageBox.Show($"Trying to backup save to Documents\\Rookie Backups\\{date_str}(YYYY.MM.DD)\\{packagename}", "Save files found", MessageBoxButtons.OK);
|
||||
Directory.CreateDirectory(CurrBackups);
|
||||
ADB.RunAdbCommandToString($"pull \"/sdcard/Android/data/{packagename}\" \"{CurrBackups}\"");
|
||||
}
|
||||
else
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show($"No savedata found! Continue with the uninstall!", "None Found", MessageBoxButtons.OK);
|
||||
if (dialogResult == DialogResult.Cancel)
|
||||
bool cancelClicked = false;
|
||||
|
||||
if (!Properties.Settings.Default.AutoReinstall)
|
||||
{
|
||||
return ret;
|
||||
Program.form.Invoke((MethodInvoker)(() =>
|
||||
{
|
||||
DialogResult dialogResult1 = FlexibleMessageBox.Show(Program.form, "In place upgrade has failed. Rookie can attempt to backup your save data and reinstall the game automatically, however some games do not store their saves in an accessible location (less than 5%). Continue with reinstall?", "In place upgrade failed.", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult1 == DialogResult.Cancel)
|
||||
cancelClicked = true;
|
||||
}));
|
||||
}
|
||||
|
||||
if (cancelClicked)
|
||||
return ret;
|
||||
}
|
||||
ADB.WakeDevice();
|
||||
ret += ADB.RunAdbCommandToString("shell pm uninstall " + package);
|
||||
ret += RunAdbCommandToString($"install -g -r \"{path}\"");
|
||||
|
||||
Program.form.changeTitle("Performing reinstall, please wait...");
|
||||
_ = ADB.RunAdbCommandToString("kill-server");
|
||||
_ = ADB.RunAdbCommandToString("devices");
|
||||
_ = ADB.RunAdbCommandToString($"pull \"/sdcard/Android/data/{MainForm.CurrPCKG}\" \"{Environment.CurrentDirectory}\"");
|
||||
Program.form.changeTitle("Uninstalling game...");
|
||||
_ = Sideloader.UninstallGame(MainForm.CurrPCKG);
|
||||
Program.form.changeTitle("Reinstalling Game");
|
||||
ret += ADB.RunAdbCommandToString($"install -g \"{path}\"");
|
||||
_ = ADB.RunAdbCommandToString($"push \"{Environment.CurrentDirectory}\\{MainForm.CurrPCKG}\" /sdcard/Android/data/");
|
||||
if (Directory.Exists($"{Environment.CurrentDirectory}\\{MainForm.CurrPCKG}"))
|
||||
{
|
||||
Directory.Delete($"{Environment.CurrentDirectory}\\{MainForm.CurrPCKG}", true);
|
||||
}
|
||||
|
||||
Program.form.changeTitle(" \n\n");
|
||||
return ret;
|
||||
}
|
||||
ret += RunAdbCommandToString($"install -g -r \"{path}\"");
|
||||
}
|
||||
string gamenameforQU = Sideloader.PackageNametoGameName(packagename);
|
||||
if (Properties.Settings.Default.QUturnedon)
|
||||
{
|
||||
if (gamenameforQU.Contains("-QU") || path.Contains("-QU"))
|
||||
{
|
||||
string gameName = packagename;
|
||||
packagename = Sideloader.gameNameToPackageName(gameName);
|
||||
|
||||
Program.form.ChangeTitle("Pushing Custom QU S3 Config.JSON.");
|
||||
if (!Directory.Exists($"/sdcard/android/data/{packagename}"))
|
||||
RunAdbCommandToString($"shell mkdir /sdcard/android/data/{packagename}");
|
||||
if (!Directory.Exists($"/sdcard/android/data/{packagename}/private"))
|
||||
RunAdbCommandToString($"shell mkdir /sdcard/android/data/{packagename}/private");
|
||||
|
||||
Random r = new Random();
|
||||
int x = r.Next(999999999);
|
||||
int y = r.Next(9999999);
|
||||
|
||||
var sum = ((long)y * (long)1000000000) + (long)x;
|
||||
|
||||
int x2 = r.Next(999999999);
|
||||
int y2 = r.Next(9999999);
|
||||
|
||||
var sum2 = ((long)y2 * (long)1000000000) + (long)x2;
|
||||
ADB.WakeDevice();
|
||||
Properties.Settings.Default.QUStringF = $"{{\"user_id\":{sum},\"app_id\":\"{sum2}\",";
|
||||
Properties.Settings.Default.Save();
|
||||
string boff = Properties.Settings.Default.QUStringF + Properties.Settings.Default.QUString;
|
||||
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\config.json", boff);
|
||||
string blank = "";
|
||||
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\delete_settings", blank);
|
||||
ret += ADB.RunAdbCommandToString($"push \"{Properties.Settings.Default.MainDir}\\delete_settings\" /sdcard/android/data/{packagename}/private/delete_settings");
|
||||
ret += ADB.RunAdbCommandToString($"push \"{Properties.Settings.Default.MainDir}\\config.json\" /sdcard/android/data/{packagename}/private/config.json");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Program.form.ChangeTitle("");
|
||||
Program.form.changeTitle(string.Empty);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static ProcessOutput CopyOBB(string path)
|
||||
{
|
||||
WakeDevice();
|
||||
|
||||
string folder = Path.GetFileName(path);
|
||||
if (!folder.Contains("+") && !folder.Contains("_") && folder.Contains("."))
|
||||
{
|
||||
return RunAdbCommandToString($"push \"{path}\" \"/sdcard/Android/obb\"");
|
||||
}
|
||||
return new ProcessOutput();
|
||||
string lastFolder = Path.GetFileName(path);
|
||||
return folder.Contains(".")
|
||||
? RunAdbCommandToString($"shell rm -rf \"/sdcard/Android/obb/{lastFolder}\" && mkdir \"/sdcard/Android/obb/{lastFolder}\"") + RunAdbCommandToString($"push \"{path}\" \"/sdcard/Android/obb\"")
|
||||
: new ProcessOutput("No OBB Folder found");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="packages\Costura.Fody.4.1.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" />
|
||||
<Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
@@ -15,6 +15,7 @@
|
||||
<Deterministic>true</Deterministic>
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
@@ -27,9 +28,9 @@
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<UseShortFileNames>True</UseShortFileNames>
|
||||
@@ -48,14 +49,14 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>icon.ico</ApplicationIcon>
|
||||
@@ -135,24 +136,44 @@
|
||||
<ManifestKeyFile>AndroidSideloader_TemporaryKey.pfx</ManifestKeyFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Costura, Version=4.1.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Costura.Fody.4.1.0\lib\net40\Costura.dll</HintPath>
|
||||
<Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Reference Include="Microsoft.Web.WebView2.Core, Version=1.0.2478.35, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Microsoft.Web.WebView2.1.0.2478.35\lib\net45\Microsoft.Web.WebView2.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Web.WebView2.WinForms, Version=1.0.2478.35, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Microsoft.Web.WebView2.1.0.2478.35\lib\net45\Microsoft.Web.WebView2.WinForms.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Web.WebView2.Wpf, Version=1.0.2478.35, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Microsoft.Web.WebView2.1.0.2478.35\lib\net45\Microsoft.Web.WebView2.Wpf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SergeUtils">
|
||||
<HintPath>.\SergeUtils.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System">
|
||||
<HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.DirectoryServices" />
|
||||
<Reference Include="System.IO.Compression" />
|
||||
<Reference Include="System.Management" />
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Drawing">
|
||||
<HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.Drawing.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
@@ -160,8 +181,40 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ADB.cs" />
|
||||
<Compile Include="RoundButton.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ColumnSort.cs" />
|
||||
<Compile Include="Donors.cs" />
|
||||
<Compile Include="DonorsListView.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="DonorsListView.Designer.cs">
|
||||
<DependentUpon>DonorsListView.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FlexibleMessageBox.cs" />
|
||||
<Compile Include="RoundedRectangleF.cs" />
|
||||
<Compile Include="Sideloader\GetDependencies.cs" />
|
||||
<Compile Include="Splash.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Splash.Designer.cs">
|
||||
<DependentUpon>Splash.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Models\PublicConfig.cs" />
|
||||
<Compile Include="NewApps.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="NewApps.Designer.cs">
|
||||
<DependentUpon>NewApps.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Transparenter.cs" />
|
||||
<Compile Include="UpdateForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="UpdateForm.Designer.cs">
|
||||
<DependentUpon>UpdateForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="MainForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
@@ -186,19 +239,6 @@
|
||||
<DependentUpon>SettingsForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Sideloader.cs" />
|
||||
<Compile Include="spoofer.cs" />
|
||||
<Compile Include="SpoofForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="SpoofForm.Designer.cs">
|
||||
<DependentUpon>SpoofForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ThemeForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ThemeForm.Designer.cs">
|
||||
<DependentUpon>ThemeForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Updater.cs" />
|
||||
<Compile Include="UsernameForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
@@ -211,6 +251,22 @@
|
||||
<Compile Include="SelectFolder.cs" />
|
||||
<Compile Include="Utilities\StringUtilities.cs" />
|
||||
<Compile Include="Utilities\GeneralUtilities.cs" />
|
||||
<Compile Include="Utilities\UpdateGameData.cs" />
|
||||
<Compile Include="Utilities\UploadGame.cs" />
|
||||
<Compile Include="Utilities\Zip.cs" />
|
||||
<Compile Include="Utilities\Metrics.cs" />
|
||||
<EmbeddedResource Include="DonorsListView.resx">
|
||||
<DependentUpon>DonorsListView.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Splash.resx">
|
||||
<DependentUpon>Splash.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="NewApps.resx">
|
||||
<DependentUpon>NewApps.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="UpdateForm.resx">
|
||||
<DependentUpon>UpdateForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="MainForm.resx">
|
||||
<DependentUpon>MainForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
@@ -233,17 +289,14 @@
|
||||
<DependentUpon>SettingsForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="SpoofForm.resx">
|
||||
<DependentUpon>SpoofForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="ThemeForm.resx">
|
||||
<DependentUpon>ThemeForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="UsernameForm.resx">
|
||||
<DependentUpon>UsernameForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<None Include="codenames" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\DataSources\AndroidSideloader.Properties.Resources.datasource" />
|
||||
<None Include="Properties\DataSources\AndroidSideloader.Properties.Settings.datasource" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
@@ -253,6 +306,12 @@
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<None Include="Rookie Offline.cmd">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="CleanupInstall.cmd">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="version" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@@ -262,13 +321,14 @@
|
||||
<Content Include="changelog.txt" />
|
||||
<Content Include="icon.ico" />
|
||||
<Content Include="ChangelogHistory.txt" />
|
||||
<None Include="Resources\battery11.png" />
|
||||
<Content Include="Resources\pattern_cubes.png" />
|
||||
<Content Include="Resources\pattern_herringbone.png" />
|
||||
<Content Include="Resources\splashimage.png" />
|
||||
<Content Include="Resources\splashimage_deps.png" />
|
||||
<Content Include="Resources\splashimage_offline.png" />
|
||||
<Content Include="Resources\splashimage_rclone.png" />
|
||||
<None Include="Resources\battery.png" />
|
||||
<None Include="Resources\battery1.png" />
|
||||
<Content Include="Resources\bluekey.png" />
|
||||
<Content Include="Resources\redkey.png" />
|
||||
<None Include="Resources\greenkey.png" />
|
||||
<None Include="Resources\orangekey.png" />
|
||||
<None Include="Resources\ajax-loader.gif" />
|
||||
<None Include="Resources\SearchGlass.PNG" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@@ -285,13 +345,14 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="packages\Fody.6.0.0\build\Fody.targets" Condition="Exists('packages\Fody.6.0.0\build\Fody.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('packages\Fody.6.0.0\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.0.0\build\Fody.targets'))" />
|
||||
<Error Condition="!Exists('packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.4.1.0\build\Costura.Fody.props'))" />
|
||||
<Error Condition="!Exists('packages\Microsoft.Web.WebView2.1.0.2478.35\build\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Microsoft.Web.WebView2.1.0.2478.35\build\Microsoft.Web.WebView2.targets'))" />
|
||||
<Error Condition="!Exists('packages\Fody.6.8.1\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.8.1\build\Fody.targets'))" />
|
||||
<Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
|
||||
<Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
|
||||
</Target>
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>
|
||||
@@ -301,4 +362,7 @@
|
||||
<PostBuildEvent>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Import Project="packages\Microsoft.Web.WebView2.1.0.2478.35\build\Microsoft.Web.WebView2.targets" Condition="Exists('packages\Microsoft.Web.WebView2.1.0.2478.35\build\Microsoft.Web.WebView2.targets')" />
|
||||
<Import Project="packages\Fody.6.8.1\build\Fody.targets" Condition="Exists('packages\Fody.6.8.1\build\Fody.targets')" />
|
||||
<Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
|
||||
</Project>
|
||||
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectView>ShowAllFiles</ProjectView>
|
||||
<PublishUrlHistory>publish\</PublishUrlHistory>
|
||||
<InstallUrlHistory />
|
||||
<SupportUrlHistory />
|
||||
<UpdateUrlHistory />
|
||||
<BootstrapperUrlHistory />
|
||||
<ErrorReportUrlHistory />
|
||||
<FallbackCulture>en-US</FallbackCulture>
|
||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
474
App.config
@@ -1,219 +1,255 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="AndroidSideloader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
<section name="AndroidADB.Sideloader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
|
||||
</startup>
|
||||
<userSettings>
|
||||
<AndroidSideloader.Properties.Settings>
|
||||
<setting name="checkForUpdates" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="enableMessageBoxes" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="firstRun" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="deleteAllAfterInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="autoUpdateConfig" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="userJsonOnGameInstall" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CallUpgrade" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="BackColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="ButtonColor" serializeAs="String">
|
||||
<value>ActiveCaptionText</value>
|
||||
</setting>
|
||||
<setting name="SubButtonColor" serializeAs="String">
|
||||
<value>64, 64, 64</value>
|
||||
</setting>
|
||||
<setting name="TextBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="ComboBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="FontColor" serializeAs="String">
|
||||
<value>White</value>
|
||||
</setting>
|
||||
<setting name="FontStyle" serializeAs="String">
|
||||
<value>Microsoft Sans Serif, 11pt</value>
|
||||
</setting>
|
||||
<setting name="BackPicturePath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="SpoofGames" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="BandwithLimit" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="BigFontStyle" serializeAs="String">
|
||||
<value>Microsoft Sans Serif, 14pt</value>
|
||||
</setting>
|
||||
<setting name="ResignAPKs" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="IPAddress" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="InstalledApps" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="ADBPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="QUsett" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="QuChecked" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="QUhz" serializeAs="String">
|
||||
<value>0</value>
|
||||
</setting>
|
||||
<setting name="QUres" serializeAs="String">
|
||||
<value>0</value>
|
||||
</setting>
|
||||
<setting name="QUy" serializeAs="String">
|
||||
<value>0</value>
|
||||
</setting>
|
||||
<setting name="QUx" serializeAs="String">
|
||||
<value>0</value>
|
||||
</setting>
|
||||
<setting name="QUname" serializeAs="String">
|
||||
<value>Change Me</value>
|
||||
</setting>
|
||||
<setting name="QUString" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="MainDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="QUStringF" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="delsh" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CurrPckg" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="ADBFolder" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="WirelessADB" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CurrentGamename" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="PackageNameToCB" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="EnterKeyInstall" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="DownUpHeld" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CurrentLogPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="CurrentLogName" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="CurrentCrashPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="CurrentCrashName" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="QUturnedon" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="QblindOn" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="adbdebugwarned" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="nodevicemode" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="BMBFchecked" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</AndroidSideloader.Properties.Settings>
|
||||
<AndroidADB.Sideloader.Properties.Settings>
|
||||
<setting name="checkForUpdates" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="enableMessageBoxes" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="logRclone" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="firstRun" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="deleteAllAfterInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="autoUpdateConfig" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="userJsonOnGameInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="CallUpgrade" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="BackColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="PanelColor" serializeAs="String">
|
||||
<value>ActiveCaptionText</value>
|
||||
</setting>
|
||||
<setting name="ButtonColor" serializeAs="String">
|
||||
<value>ActiveCaptionText</value>
|
||||
</setting>
|
||||
<setting name="SubButtonColor" serializeAs="String">
|
||||
<value>64, 64, 64</value>
|
||||
</setting>
|
||||
<setting name="TextBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="ComboBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="FontColor" serializeAs="String">
|
||||
<value>White</value>
|
||||
</setting>
|
||||
<setting name="FontStyle" serializeAs="String">
|
||||
<value>Microsoft Sans Serif, 11.25pt</value>
|
||||
</setting>
|
||||
<setting name="BackPicturePath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="SpoofGames" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</AndroidADB.Sideloader.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<section name="AndroidSideloader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
|
||||
<section name="AndroidADB.Sideloader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
|
||||
</startup>
|
||||
<userSettings>
|
||||
<AndroidSideloader.Properties.Settings>
|
||||
<setting name="checkForUpdates" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="enableMessageBoxes" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="firstRun" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="deleteAllAfterInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="autoUpdateConfig" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="userJsonOnGameInstall" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CallUpgrade" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="FontStyle" serializeAs="String">
|
||||
<value>Microsoft Sans Serif, 11.25pt</value>
|
||||
</setting>
|
||||
<setting name="BackPicturePath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="SpoofGames" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="BigFontStyle" serializeAs="String">
|
||||
<value>Microsoft Sans Serif, 14pt</value>
|
||||
</setting>
|
||||
<setting name="ResignAPKs" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="IPAddress" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="InstalledApps" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="ADBPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="MainDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="delsh" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CurrPckg" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="ADBFolder" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="WirelessADB" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CurrentGamename" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="PackageNameToCB" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="DownUpHeld" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CurrentLogPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="CurrentLogName" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="CurrentCrashPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="CurrentCrashName" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="adbdebugwarned" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="nodevicemode" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="BMBFchecked" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="GamesList" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="UploadedGameList" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="GlobalUsername" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="lastTimeShared" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="AutoReinstall" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="NonAppPackages" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="LastLaunch" serializeAs="String">
|
||||
<value>04/20/1969 16:20:00</value>
|
||||
</setting>
|
||||
<setting name="SubmittedUpdates" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="ListUpped" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="LastLaunch2" serializeAs="String">
|
||||
<value>04/20/1969 16:20:00</value>
|
||||
</setting>
|
||||
<setting name="Wired" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="FontColor" serializeAs="String">
|
||||
<value>White</value>
|
||||
</setting>
|
||||
<setting name="ComboBoxColor" serializeAs="String">
|
||||
<value>25, 25, 25</value>
|
||||
</setting>
|
||||
<setting name="SubButtonColor" serializeAs="String">
|
||||
<value>25, 25, 25</value>
|
||||
</setting>
|
||||
<setting name="TextBoxColor" serializeAs="String">
|
||||
<value>25, 25, 25</value>
|
||||
</setting>
|
||||
<setting name="ButtonColor" serializeAs="String">
|
||||
<value>Black</value>
|
||||
</setting>
|
||||
<setting name="BackColor" serializeAs="String">
|
||||
<value>1, 1, 1</value>
|
||||
</setting>
|
||||
<setting name="AppPackages" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="TrailersOn" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="downloadDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="customDownloadDir" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="customBackupDir" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="backupDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="singleThreadMode" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="virtualFilesystemCompatibility" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="UpdateSettings" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="UUID" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="createPubMirrorFile" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="useDownloadedFiles" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="bandwidthLimit" serializeAs="String">
|
||||
<value>0</value>
|
||||
</setting>
|
||||
</AndroidSideloader.Properties.Settings>
|
||||
<AndroidADB.Sideloader.Properties.Settings>
|
||||
<setting name="checkForUpdates" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="enableMessageBoxes" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="logRclone" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="firstRun" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="deleteAllAfterInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="autoUpdateConfig" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="singleThreadMode" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="userJsonOnGameInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="CallUpgrade" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="BackColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="PanelColor" serializeAs="String">
|
||||
<value>ActiveCaptionText</value>
|
||||
</setting>
|
||||
<setting name="ButtonColor" serializeAs="String">
|
||||
<value>ActiveCaptionText</value>
|
||||
</setting>
|
||||
<setting name="SubButtonColor" serializeAs="String">
|
||||
<value>64, 64, 64</value>
|
||||
</setting>
|
||||
<setting name="TextBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="ComboBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="FontColor" serializeAs="String">
|
||||
<value>White</value>
|
||||
</setting>
|
||||
<setting name="FontStyle" serializeAs="String">
|
||||
<value>Microsoft Sans Serif, 11.25pt</value>
|
||||
</setting>
|
||||
<setting name="BackPicturePath" serializeAs="String">
|
||||
<value/>
|
||||
</setting>
|
||||
<setting name="SpoofGames" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</AndroidADB.Sideloader.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
|
||||
1022
ChangelogHistory.txt
26
CleanupInstall.cmd
Normal file
@@ -0,0 +1,26 @@
|
||||
@echo off
|
||||
|
||||
echo Killing AndroidSideloader processes...
|
||||
taskkill /F /FI "IMAGENAME eq AndroidSideloader*" /T
|
||||
|
||||
echo Killing adb.exe processes...
|
||||
taskkill /F /FI "IMAGENAME eq adb.exe" /T
|
||||
|
||||
|
||||
set "folderPath=C:\Users\%username%\AppData\Local\Rookie.WTF\"
|
||||
echo Deleting contents of %folderPath%...
|
||||
for /D %%i in ("%folderPath%\*") do (
|
||||
rd /s /q "%%i"
|
||||
)
|
||||
del /q "%folderPath%\*.*"
|
||||
|
||||
|
||||
set "folderPath=C:\Users\%username%\AppData\Local\Rookie.AndroidSideloader\"
|
||||
echo Deleting contents of %folderPath%...
|
||||
for /D %%i in ("%folderPath%\*") do (
|
||||
rd /s /q "%%i"
|
||||
)
|
||||
del /q "%folderPath%\*.*"
|
||||
|
||||
echo Cleanup complete.
|
||||
pause
|
||||
@@ -6,20 +6,11 @@ using System.Windows.Forms;
|
||||
/// </summary>
|
||||
public class ListViewColumnSorter : IComparer
|
||||
{
|
||||
/// <summary>
|
||||
/// Specifies the column to be sorted
|
||||
/// </summary>
|
||||
private int ColumnToSort;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the order in which to sort (i.e. 'Ascending').
|
||||
/// </summary>
|
||||
private SortOrder OrderOfSort;
|
||||
|
||||
/// <summary>
|
||||
/// Case insensitive comparer object
|
||||
/// </summary>
|
||||
private CaseInsensitiveComparer ObjectCompare;
|
||||
private readonly CaseInsensitiveComparer ObjectCompare;
|
||||
|
||||
/// <summary>
|
||||
/// Class constructor. Initializes various elements
|
||||
@@ -27,10 +18,10 @@ public class ListViewColumnSorter : IComparer
|
||||
public ListViewColumnSorter()
|
||||
{
|
||||
// Initialize the column to '0'
|
||||
ColumnToSort = 0;
|
||||
SortColumn = 0;
|
||||
|
||||
// Initialize the sort order to 'none'
|
||||
OrderOfSort = SortOrder.Ascending;
|
||||
Order = SortOrder.Ascending;
|
||||
|
||||
// Initialize the CaseInsensitiveComparer object
|
||||
ObjectCompare = new CaseInsensitiveComparer();
|
||||
@@ -50,20 +41,30 @@ public class ListViewColumnSorter : IComparer
|
||||
// Cast the objects to be compared to ListViewItem objects
|
||||
listviewX = (ListViewItem)x;
|
||||
listviewY = (ListViewItem)y;
|
||||
if (SortColumn == 5 || SortColumn == 6)
|
||||
{
|
||||
try
|
||||
{
|
||||
int yNum = int.Parse(cleanNumber(listviewY.SubItems[SortColumn].Text));
|
||||
int xNum = int.Parse(cleanNumber(listviewX.SubItems[SortColumn].Text));
|
||||
return xNum == yNum ? 0 : xNum > yNum && Order == SortOrder.Ascending ? -1 : 1;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
// Compare the two items
|
||||
compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
|
||||
compareResult = ObjectCompare.Compare(listviewX.SubItems[SortColumn].Text, listviewY.SubItems[SortColumn].Text);
|
||||
|
||||
// Calculate correct return value based on object comparison
|
||||
if (OrderOfSort == SortOrder.Ascending)
|
||||
if (Order == SortOrder.Ascending)
|
||||
{
|
||||
// Ascending sort is selected, return normal result of compare operation
|
||||
return compareResult;
|
||||
}
|
||||
else if (OrderOfSort == SortOrder.Descending)
|
||||
else if (Order == SortOrder.Descending)
|
||||
{
|
||||
// Descending sort is selected, return negative result of compare operation
|
||||
return (-compareResult);
|
||||
return -compareResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -75,31 +76,16 @@ public class ListViewColumnSorter : IComparer
|
||||
/// <summary>
|
||||
/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
|
||||
/// </summary>
|
||||
public int SortColumn
|
||||
{
|
||||
set
|
||||
{
|
||||
ColumnToSort = value;
|
||||
}
|
||||
get
|
||||
{
|
||||
return ColumnToSort;
|
||||
}
|
||||
}
|
||||
public int SortColumn { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
|
||||
/// </summary>
|
||||
public SortOrder Order
|
||||
public SortOrder Order { set; get; }
|
||||
|
||||
private string cleanNumber(string number)
|
||||
{
|
||||
set
|
||||
{
|
||||
OrderOfSort = value;
|
||||
}
|
||||
get
|
||||
{
|
||||
return OrderOfSort;
|
||||
}
|
||||
return number.Substring(0);
|
||||
}
|
||||
|
||||
}
|
||||
54
Donors.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
internal class Donors
|
||||
{
|
||||
public static int GameNameIndex = 0;
|
||||
public static int PackageNameIndex = 1;
|
||||
public static int VersionCodeIndex = 2;
|
||||
public static int UpdateOrNew = 3;
|
||||
/* Game Name
|
||||
* Package Name
|
||||
* Version Code
|
||||
* Update or New app
|
||||
*/
|
||||
public static List<string> newAppProperties = new List<string>();
|
||||
public static List<string> donorGameProperties = new List<string>();
|
||||
|
||||
public static List<string[]> donorGames = new List<string[]>();
|
||||
public static List<string[]> newApps = new List<string[]>();
|
||||
public static void initDonorGames()
|
||||
{
|
||||
donorGameProperties.Clear();
|
||||
donorGames.Clear();
|
||||
if (!string.IsNullOrEmpty(MainForm.donorApps))
|
||||
{
|
||||
string[] gameListSplited = MainForm.donorApps.Split('\n');
|
||||
foreach (string game in gameListSplited)
|
||||
{
|
||||
if (game.Length > 1)
|
||||
{
|
||||
donorGames.Add(game.Split(';'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void initNewApps()
|
||||
{
|
||||
newApps.Clear();
|
||||
if (!string.IsNullOrEmpty(DonorsListViewForm.newAppsForList))
|
||||
{
|
||||
string[] newListSplited = DonorsListViewForm.newAppsForList.Split('\n');
|
||||
foreach (string game in newListSplited)
|
||||
{
|
||||
if (game.Length > 1)
|
||||
{
|
||||
newApps.Add(game.Split(';'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
314
DonorsListView.Designer.cs
generated
Normal file
@@ -0,0 +1,314 @@
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class DonorsListViewForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DonorsListViewForm));
|
||||
this.DonorsListView = new System.Windows.Forms.ListView();
|
||||
this.GameNameIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.PackageNameIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.VersionCodeIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.UpdateOrNew = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.SkipButton = new AndroidSideloader.RoundButton();
|
||||
this.DonateButton = new AndroidSideloader.RoundButton();
|
||||
this.panel2 = new System.Windows.Forms.Panel();
|
||||
this.bothdet = new System.Windows.Forms.Label();
|
||||
this.newdet = new System.Windows.Forms.Label();
|
||||
this.upddet = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.TimerDesc = new System.Windows.Forms.Label();
|
||||
this.DonationTimer = new System.Windows.Forms.Timer(this.components);
|
||||
this.panel1.SuspendLayout();
|
||||
this.panel2.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// DonorsListView
|
||||
//
|
||||
this.DonorsListView.AccessibleRole = System.Windows.Forms.AccessibleRole.None;
|
||||
this.DonorsListView.BackColor = global::AndroidSideloader.Properties.Settings.Default.ComboBoxColor;
|
||||
this.DonorsListView.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.DonorsListView.CausesValidation = false;
|
||||
this.DonorsListView.CheckBoxes = true;
|
||||
this.DonorsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.GameNameIndex,
|
||||
this.PackageNameIndex,
|
||||
this.VersionCodeIndex,
|
||||
this.UpdateOrNew});
|
||||
this.DonorsListView.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "ComboBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DonorsListView.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DonorsListView.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DonorsListView.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.DonorsListView.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.DonorsListView.FullRowSelect = true;
|
||||
this.DonorsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
||||
this.DonorsListView.HideSelection = false;
|
||||
this.DonorsListView.ImeMode = System.Windows.Forms.ImeMode.On;
|
||||
this.DonorsListView.Location = new System.Drawing.Point(6, 6);
|
||||
this.DonorsListView.MinimumSize = new System.Drawing.Size(100, 100);
|
||||
this.DonorsListView.Name = "DonorsListView";
|
||||
this.DonorsListView.RightToLeftLayout = true;
|
||||
this.DonorsListView.Size = new System.Drawing.Size(419, 219);
|
||||
this.DonorsListView.TabIndex = 0;
|
||||
this.DonorsListView.TileSize = new System.Drawing.Size(100, 100);
|
||||
this.DonorsListView.UseCompatibleStateImageBehavior = false;
|
||||
this.DonorsListView.View = System.Windows.Forms.View.Details;
|
||||
this.DonorsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.DonorsListView_ItemChecked);
|
||||
this.DonorsListView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseDown);
|
||||
this.DonorsListView.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseMove);
|
||||
this.DonorsListView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseUp);
|
||||
//
|
||||
// GameNameIndex
|
||||
//
|
||||
this.GameNameIndex.Text = "Game Name";
|
||||
this.GameNameIndex.Width = 219;
|
||||
//
|
||||
// PackageNameIndex
|
||||
//
|
||||
this.PackageNameIndex.DisplayIndex = 2;
|
||||
this.PackageNameIndex.Text = "Packagename";
|
||||
this.PackageNameIndex.Width = 0;
|
||||
//
|
||||
// VersionCodeIndex
|
||||
//
|
||||
this.VersionCodeIndex.DisplayIndex = 3;
|
||||
this.VersionCodeIndex.Text = "Version";
|
||||
this.VersionCodeIndex.Width = 113;
|
||||
//
|
||||
// UpdateOrNew
|
||||
//
|
||||
this.UpdateOrNew.DisplayIndex = 1;
|
||||
this.UpdateOrNew.Text = "Donation Type";
|
||||
this.UpdateOrNew.Width = 85;
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
this.panel1.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.panel1.BackgroundImage = global::AndroidSideloader.Properties.Resources.pattern_cubes;
|
||||
this.panel1.Controls.Add(this.SkipButton);
|
||||
this.panel1.Controls.Add(this.DonateButton);
|
||||
this.panel1.Controls.Add(this.panel2);
|
||||
this.panel1.Controls.Add(this.bothdet);
|
||||
this.panel1.Controls.Add(this.newdet);
|
||||
this.panel1.Controls.Add(this.upddet);
|
||||
this.panel1.Controls.Add(this.label2);
|
||||
this.panel1.Controls.Add(this.TimerDesc);
|
||||
this.panel1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.panel1.Location = new System.Drawing.Point(-7, -7);
|
||||
this.panel1.Name = "panel1";
|
||||
this.panel1.Size = new System.Drawing.Size(463, 345);
|
||||
this.panel1.TabIndex = 1;
|
||||
this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseDown);
|
||||
this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseMove);
|
||||
this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseUp);
|
||||
//
|
||||
// SkipButton
|
||||
//
|
||||
this.SkipButton.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.SkipButton.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.SkipButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.SkipButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
|
||||
this.SkipButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SkipButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SkipButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SkipButton.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.SkipButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.SkipButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.SkipButton.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
|
||||
this.SkipButton.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
|
||||
this.SkipButton.Location = new System.Drawing.Point(22, 277);
|
||||
this.SkipButton.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.SkipButton.Name = "SkipButton";
|
||||
this.SkipButton.Radius = 5;
|
||||
this.SkipButton.Size = new System.Drawing.Size(102, 36);
|
||||
this.SkipButton.Stroke = true;
|
||||
this.SkipButton.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.SkipButton.TabIndex = 96;
|
||||
this.SkipButton.Text = "Skip";
|
||||
this.SkipButton.Transparency = false;
|
||||
this.SkipButton.Click += new System.EventHandler(this.SkipButton_Click);
|
||||
//
|
||||
// DonateButton
|
||||
//
|
||||
this.DonateButton.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.DonateButton.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.DonateButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.DonateButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
|
||||
this.DonateButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DonateButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DonateButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DonateButton.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.DonateButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.DonateButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.DonateButton.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
|
||||
this.DonateButton.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
|
||||
this.DonateButton.Location = new System.Drawing.Point(130, 277);
|
||||
this.DonateButton.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.DonateButton.Name = "DonateButton";
|
||||
this.DonateButton.Radius = 5;
|
||||
this.DonateButton.Size = new System.Drawing.Size(311, 36);
|
||||
this.DonateButton.Stroke = true;
|
||||
this.DonateButton.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.DonateButton.TabIndex = 95;
|
||||
this.DonateButton.Text = "Automatically share selected apps";
|
||||
this.DonateButton.Transparency = false;
|
||||
this.DonateButton.Click += new System.EventHandler(this.DonateButton_Click);
|
||||
//
|
||||
// panel2
|
||||
//
|
||||
this.panel2.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.panel2.Controls.Add(this.DonorsListView);
|
||||
this.panel2.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.panel2.Location = new System.Drawing.Point(16, 43);
|
||||
this.panel2.Name = "panel2";
|
||||
this.panel2.Size = new System.Drawing.Size(430, 230);
|
||||
this.panel2.TabIndex = 2;
|
||||
//
|
||||
// bothdet
|
||||
//
|
||||
this.bothdet.AutoSize = true;
|
||||
this.bothdet.BackColor = System.Drawing.Color.Transparent;
|
||||
this.bothdet.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.25F, System.Drawing.FontStyle.Bold);
|
||||
this.bothdet.Location = new System.Drawing.Point(125, 7);
|
||||
this.bothdet.Name = "bothdet";
|
||||
this.bothdet.Size = new System.Drawing.Size(213, 17);
|
||||
this.bothdet.TabIndex = 3;
|
||||
this.bothdet.Text = "Updates/new apps detected!";
|
||||
this.bothdet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.bothdet.Visible = false;
|
||||
this.bothdet.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseDown);
|
||||
this.bothdet.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseMove);
|
||||
this.bothdet.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseUp);
|
||||
//
|
||||
// newdet
|
||||
//
|
||||
this.newdet.AutoSize = true;
|
||||
this.newdet.BackColor = System.Drawing.Color.Transparent;
|
||||
this.newdet.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.25F, System.Drawing.FontStyle.Bold);
|
||||
this.newdet.Location = new System.Drawing.Point(120, 7);
|
||||
this.newdet.Name = "newdet";
|
||||
this.newdet.Size = new System.Drawing.Size(150, 17);
|
||||
this.newdet.TabIndex = 3;
|
||||
this.newdet.Text = "New apps detected!";
|
||||
this.newdet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.newdet.Visible = false;
|
||||
this.newdet.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseDown);
|
||||
this.newdet.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseMove);
|
||||
this.newdet.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseUp);
|
||||
//
|
||||
// upddet
|
||||
//
|
||||
this.upddet.AutoSize = true;
|
||||
this.upddet.BackColor = System.Drawing.Color.Transparent;
|
||||
this.upddet.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.25F, System.Drawing.FontStyle.Bold);
|
||||
this.upddet.Location = new System.Drawing.Point(120, 7);
|
||||
this.upddet.Name = "upddet";
|
||||
this.upddet.Size = new System.Drawing.Size(185, 17);
|
||||
this.upddet.TabIndex = 3;
|
||||
this.upddet.Text = "Game Updates Detected";
|
||||
this.upddet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.upddet.Visible = false;
|
||||
this.upddet.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseDown);
|
||||
this.upddet.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseMove);
|
||||
this.upddet.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseUp);
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.BackColor = System.Drawing.Color.Transparent;
|
||||
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label2.Location = new System.Drawing.Point(23, 23);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(416, 15);
|
||||
this.label2.TabIndex = 3;
|
||||
this.label2.Text = "All Apps are donated by users! Without them none of this would be possible!";
|
||||
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.label2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseDown);
|
||||
this.label2.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseMove);
|
||||
this.label2.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseUp);
|
||||
//
|
||||
// TimerDesc
|
||||
//
|
||||
this.TimerDesc.AutoSize = true;
|
||||
this.TimerDesc.BackColor = System.Drawing.Color.Transparent;
|
||||
this.TimerDesc.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.TimerDesc.Location = new System.Drawing.Point(28, 321);
|
||||
this.TimerDesc.Name = "TimerDesc";
|
||||
this.TimerDesc.Size = new System.Drawing.Size(406, 13);
|
||||
this.TimerDesc.TabIndex = 3;
|
||||
this.TimerDesc.Text = "Don\'t share free apps. Rookie will extract/upload apps in background.";
|
||||
this.TimerDesc.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.TimerDesc.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseDown);
|
||||
this.TimerDesc.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseMove);
|
||||
this.TimerDesc.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseUp);
|
||||
//
|
||||
// DonorsListViewForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.Gainsboro;
|
||||
this.ClientSize = new System.Drawing.Size(449, 336);
|
||||
this.ControlBox = false;
|
||||
this.Controls.Add(this.panel1);
|
||||
this.ForeColor = System.Drawing.Color.White;
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "DonorsListViewForm";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Load += new System.EventHandler(this.DonorsListViewForm_Load);
|
||||
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseDown);
|
||||
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseMove);
|
||||
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DonorsListViewForm_MouseUp);
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.panel1.PerformLayout();
|
||||
this.panel2.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ListView DonorsListView;
|
||||
private System.Windows.Forms.Panel panel1;
|
||||
private System.Windows.Forms.Label TimerDesc;
|
||||
private System.Windows.Forms.ColumnHeader GameNameIndex;
|
||||
private System.Windows.Forms.ColumnHeader PackageNameIndex;
|
||||
private System.Windows.Forms.ColumnHeader VersionCodeIndex;
|
||||
private System.Windows.Forms.ColumnHeader UpdateOrNew;
|
||||
public System.Windows.Forms.Timer DonationTimer;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label bothdet;
|
||||
private System.Windows.Forms.Label newdet;
|
||||
private System.Windows.Forms.Label upddet;
|
||||
private System.Windows.Forms.Panel panel2;
|
||||
private RoundButton DonateButton;
|
||||
private RoundButton SkipButton;
|
||||
}
|
||||
}
|
||||
163
DonorsListView.cs
Normal file
@@ -0,0 +1,163 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class DonorsListViewForm : Form
|
||||
{
|
||||
|
||||
private bool mouseDown;
|
||||
private Point lastLocation;
|
||||
|
||||
public DonorsListViewForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
Donors.initDonorGames();
|
||||
List<ListViewItem> DGameList = new List<ListViewItem>();
|
||||
foreach (string[] release in Donors.donorGames)
|
||||
{
|
||||
ListViewItem DGame = new ListViewItem(release);
|
||||
DGameList.Add(DGame);
|
||||
}
|
||||
ListViewItem[] arr = DGameList.ToArray();
|
||||
DonorsListView.BeginUpdate();
|
||||
DonorsListView.Items.Clear();
|
||||
DonorsListView.Items.AddRange(arr);
|
||||
DonorsListView.EndUpdate();
|
||||
}
|
||||
|
||||
public static string DonorsLocal = MainForm.donorApps;
|
||||
public static bool ifuploads = false;
|
||||
public static string newAppsForList = "";
|
||||
|
||||
|
||||
private void DonorsListViewForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
MainForm.updatesNotified = true;
|
||||
if (MainForm.updates && MainForm.newapps)
|
||||
{
|
||||
bothdet.Visible = true;
|
||||
}
|
||||
else if (MainForm.updates && !MainForm.newapps)
|
||||
{
|
||||
upddet.Visible = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
newdet.Visible = true;
|
||||
}
|
||||
|
||||
foreach (ListViewItem listItem in DonorsListView.Items)
|
||||
{
|
||||
if (listItem.SubItems[Donors.UpdateOrNew].Text.Contains("Update"))
|
||||
{
|
||||
listItem.BackColor = Color.FromArgb(0, 79, 97);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private async void DonateButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (DonorsListView.CheckedItems.Count > 0)
|
||||
{
|
||||
bool uncheckednewapps = false;
|
||||
foreach (ListViewItem listItem in DonorsListView.Items)
|
||||
{
|
||||
if (!listItem.Checked)
|
||||
{
|
||||
if (listItem.SubItems[Donors.UpdateOrNew].Text.Contains("New"))
|
||||
{
|
||||
uncheckednewapps = true;
|
||||
newAppsForList += listItem.SubItems[Donors.GameNameIndex].Text + ";" + listItem.SubItems[Donors.PackageNameIndex].Text + "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uncheckednewapps)
|
||||
{
|
||||
|
||||
NewApps NewAppForm = new NewApps();
|
||||
_ = NewAppForm.ShowDialog();
|
||||
Hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
Hide();
|
||||
}
|
||||
int count = DonorsListView.CheckedItems.Count;
|
||||
_ = new string[count];
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
ulong vcode = Convert.ToUInt64(DonorsListView.CheckedItems[i].SubItems[Donors.VersionCodeIndex].Text);
|
||||
if (DonorsListView.CheckedItems[i].SubItems[Donors.UpdateOrNew].Text.Contains("Update"))
|
||||
{
|
||||
await Program.form.extractAndPrepareGameToUploadAsync(DonorsListView.CheckedItems[i].SubItems[Donors.GameNameIndex].Text, DonorsListView.CheckedItems[i].SubItems[Donors.PackageNameIndex].Text, vcode, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
await Program.form.extractAndPrepareGameToUploadAsync(DonorsListView.CheckedItems[i].SubItems[Donors.GameNameIndex].Text, DonorsListView.CheckedItems[i].SubItems[Donors.PackageNameIndex].Text, vcode, false);
|
||||
}
|
||||
|
||||
ifuploads = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (ifuploads)
|
||||
{
|
||||
MainForm.doUpload();
|
||||
}
|
||||
Close();
|
||||
}
|
||||
|
||||
private void DonorsListView_ItemChecked(object sender, ItemCheckedEventArgs e)
|
||||
{
|
||||
SkipButton.Enabled = DonorsListView.CheckedItems.Count == 0;
|
||||
DonateButton.Enabled = !SkipButton.Enabled;
|
||||
}
|
||||
|
||||
private void SkipButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool uncheckednewapps = false;
|
||||
foreach (ListViewItem listItem in DonorsListView.Items)
|
||||
{
|
||||
if (!listItem.Checked)
|
||||
{
|
||||
if (listItem.SubItems[Donors.UpdateOrNew].Text.Contains("New"))
|
||||
{
|
||||
uncheckednewapps = true;
|
||||
newAppsForList += listItem.SubItems[Donors.GameNameIndex].Text + ";" + listItem.SubItems[Donors.PackageNameIndex].Text + "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uncheckednewapps)
|
||||
{
|
||||
NewApps NewAppForm = new NewApps();
|
||||
_ = NewAppForm.ShowDialog();
|
||||
}
|
||||
Close();
|
||||
}
|
||||
|
||||
private void DonorsListViewForm_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
mouseDown = true;
|
||||
lastLocation = e.Location;
|
||||
}
|
||||
|
||||
private void DonorsListViewForm_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (mouseDown)
|
||||
{
|
||||
Location = new Point(
|
||||
Location.X - lastLocation.X + e.X, Location.Y - lastLocation.Y + e.Y);
|
||||
Update();
|
||||
}
|
||||
}
|
||||
|
||||
private void DonorsListViewForm_MouseUp(object sender, MouseEventArgs e)
|
||||
{
|
||||
mouseDown = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
6972
DonorsListView.resx
Normal file
674
LICENSE
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
2956
MainForm.Designer.cs
generated
6994
MainForm.cs
@@ -117,4 +117,67 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="speedLabel_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>798, 17</value>
|
||||
</metadata>
|
||||
<metadata name="etaLabel_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>428, 56</value>
|
||||
</metadata>
|
||||
<metadata name="startsideloadbutton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>596, 17</value>
|
||||
</metadata>
|
||||
<metadata name="devicesbutton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>539, 95</value>
|
||||
</metadata>
|
||||
<metadata name="obbcopybutton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>359, 95</value>
|
||||
</metadata>
|
||||
<metadata name="backupadbbutton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="backupbutton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>187, 95</value>
|
||||
</metadata>
|
||||
<metadata name="restorebutton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 95</value>
|
||||
</metadata>
|
||||
<metadata name="getApkButton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>1363, 56</value>
|
||||
</metadata>
|
||||
<metadata name="uninstallAppButton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>1163, 56</value>
|
||||
</metadata>
|
||||
<metadata name="pullAppToDesktopBtn_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>948, 56</value>
|
||||
</metadata>
|
||||
<metadata name="copyBulkObbButton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>743, 56</value>
|
||||
</metadata>
|
||||
<metadata name="aboutBtn_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>711, 95</value>
|
||||
</metadata>
|
||||
<metadata name="settingsButton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>569, 56</value>
|
||||
</metadata>
|
||||
<metadata name="QuestOptionsButton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>221, 56</value>
|
||||
</metadata>
|
||||
<metadata name="btnOpenDownloads_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>392, 17</value>
|
||||
</metadata>
|
||||
<metadata name="btnRunAdbCmd_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>209, 17</value>
|
||||
</metadata>
|
||||
<metadata name="ADBWirelessDisable_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 56</value>
|
||||
</metadata>
|
||||
<metadata name="ADBWirelessEnable_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>1333, 17</value>
|
||||
</metadata>
|
||||
<metadata name="UpdateGamesButton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>1124, 17</value>
|
||||
</metadata>
|
||||
<metadata name="listApkButton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>955, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
22
Models/PublicConfig.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace AndroidSideloader.Models
|
||||
{
|
||||
[JsonObject(MemberSerialization.OptIn)]
|
||||
public class PublicConfig
|
||||
{
|
||||
[JsonProperty("baseUri")]
|
||||
public string BaseUri { get; set; }
|
||||
|
||||
private string password;
|
||||
|
||||
[JsonProperty("password")]
|
||||
public string Password
|
||||
{
|
||||
get => password;
|
||||
set => password = Encoding.UTF8.GetString(Convert.FromBase64String(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
159
NewApps.Designer.cs
generated
Normal file
@@ -0,0 +1,159 @@
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class NewApps
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NewApps));
|
||||
this.NewAppsListView = new System.Windows.Forms.ListView();
|
||||
this.GameNameIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.PackageNameIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.panel2 = new System.Windows.Forms.Panel();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.NewAppsButton = new AndroidSideloader.RoundButton();
|
||||
this.panel2.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// NewAppsListView
|
||||
//
|
||||
this.NewAppsListView.AccessibleRole = System.Windows.Forms.AccessibleRole.None;
|
||||
this.NewAppsListView.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.NewAppsListView.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.NewAppsListView.CausesValidation = false;
|
||||
this.NewAppsListView.CheckBoxes = true;
|
||||
this.NewAppsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.GameNameIndex,
|
||||
this.PackageNameIndex});
|
||||
this.NewAppsListView.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.NewAppsListView.ForeColor = System.Drawing.Color.White;
|
||||
this.NewAppsListView.FullRowSelect = true;
|
||||
this.NewAppsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
||||
this.NewAppsListView.HideSelection = false;
|
||||
this.NewAppsListView.Location = new System.Drawing.Point(3, 5);
|
||||
this.NewAppsListView.Name = "NewAppsListView";
|
||||
this.NewAppsListView.RightToLeftLayout = true;
|
||||
this.NewAppsListView.Size = new System.Drawing.Size(288, 167);
|
||||
this.NewAppsListView.TabIndex = 1;
|
||||
this.NewAppsListView.UseCompatibleStateImageBehavior = false;
|
||||
this.NewAppsListView.View = System.Windows.Forms.View.Details;
|
||||
this.NewAppsListView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label2_MouseDown);
|
||||
this.NewAppsListView.MouseMove += new System.Windows.Forms.MouseEventHandler(this.label2_MouseMove);
|
||||
this.NewAppsListView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label2_MouseUp);
|
||||
//
|
||||
// GameNameIndex
|
||||
//
|
||||
this.GameNameIndex.Text = "Game Name";
|
||||
this.GameNameIndex.Width = 284;
|
||||
//
|
||||
// PackageNameIndex
|
||||
//
|
||||
this.PackageNameIndex.Width = 0;
|
||||
//
|
||||
// panel2
|
||||
//
|
||||
this.panel2.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.panel2.Controls.Add(this.NewAppsListView);
|
||||
this.panel2.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.panel2.Location = new System.Drawing.Point(9, 31);
|
||||
this.panel2.Name = "panel2";
|
||||
this.panel2.Size = new System.Drawing.Size(295, 175);
|
||||
this.panel2.TabIndex = 8;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.BackColor = System.Drawing.Color.Transparent;
|
||||
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.25F, System.Drawing.FontStyle.Bold);
|
||||
this.label2.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
||||
this.label2.Location = new System.Drawing.Point(28, 7);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(256, 17);
|
||||
this.label2.TabIndex = 9;
|
||||
this.label2.Text = "Check box of all free/non-VR apps";
|
||||
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.label2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label2_MouseDown);
|
||||
this.label2.MouseMove += new System.Windows.Forms.MouseEventHandler(this.label2_MouseMove);
|
||||
this.label2.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label2_MouseUp);
|
||||
//
|
||||
// NewAppsButton
|
||||
//
|
||||
this.NewAppsButton.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.NewAppsButton.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.NewAppsButton.BackColor = System.Drawing.Color.Transparent;
|
||||
this.NewAppsButton.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.NewAppsButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.NewAppsButton.ForeColor = System.Drawing.Color.White;
|
||||
this.NewAppsButton.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.NewAppsButton.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.NewAppsButton.Location = new System.Drawing.Point(12, 212);
|
||||
this.NewAppsButton.Name = "NewAppsButton";
|
||||
this.NewAppsButton.Radius = 5;
|
||||
this.NewAppsButton.Size = new System.Drawing.Size(288, 29);
|
||||
this.NewAppsButton.Stroke = true;
|
||||
this.NewAppsButton.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.NewAppsButton.TabIndex = 2;
|
||||
this.NewAppsButton.Text = "Accept";
|
||||
this.NewAppsButton.Transparency = false;
|
||||
this.NewAppsButton.Click += new System.EventHandler(this.DonateButton_Click);
|
||||
//
|
||||
// NewApps
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.BackgroundImage = global::AndroidSideloader.Properties.Resources.pattern_cubes;
|
||||
this.ClientSize = new System.Drawing.Size(313, 248);
|
||||
this.ControlBox = false;
|
||||
this.Controls.Add(this.NewAppsButton);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.panel2);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "NewApps";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Load += new System.EventHandler(this.NewApps_Load);
|
||||
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label2_MouseDown);
|
||||
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.label2_MouseMove);
|
||||
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label2_MouseUp);
|
||||
this.panel2.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ListView NewAppsListView;
|
||||
private System.Windows.Forms.ColumnHeader GameNameIndex;
|
||||
private System.Windows.Forms.Panel panel2;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.ColumnHeader PackageNameIndex;
|
||||
private RoundButton NewAppsButton;
|
||||
}
|
||||
}
|
||||
80
NewApps.cs
Normal file
@@ -0,0 +1,80 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class NewApps : Form
|
||||
{
|
||||
private bool mouseDown;
|
||||
private Point lastLocation;
|
||||
|
||||
public NewApps()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void label2_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
mouseDown = true;
|
||||
lastLocation = e.Location;
|
||||
}
|
||||
|
||||
private void label2_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (mouseDown)
|
||||
{
|
||||
Location = new Point(
|
||||
Location.X - lastLocation.X + e.X, Location.Y - lastLocation.Y + e.Y);
|
||||
|
||||
Update();
|
||||
}
|
||||
}
|
||||
|
||||
private void label2_MouseUp(object sender, MouseEventArgs e)
|
||||
{
|
||||
mouseDown = false;
|
||||
}
|
||||
|
||||
private void DonateButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
string HWID = SideloaderUtilities.UUID();
|
||||
foreach (ListViewItem listItem in NewAppsListView.Items)
|
||||
{
|
||||
if (listItem.Checked)
|
||||
{
|
||||
Properties.Settings.Default.NonAppPackages += listItem.SubItems[Donors.PackageNameIndex].Text + ";" + HWID + "\n";
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
else
|
||||
{
|
||||
Properties.Settings.Default.AppPackages += listItem.SubItems[Donors.PackageNameIndex].Text + "\n";
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
MainForm.newPackageUpload();
|
||||
Close();
|
||||
}
|
||||
|
||||
private void NewApps_Load(object sender, EventArgs e)
|
||||
{
|
||||
NewAppsListView.Items.Clear();
|
||||
Donors.initNewApps();
|
||||
List<ListViewItem> NewAppList = new List<ListViewItem>();
|
||||
foreach (string[] release in Donors.newApps)
|
||||
{
|
||||
ListViewItem NGame = new ListViewItem(release);
|
||||
if (!NewAppList.Contains(NGame))
|
||||
{
|
||||
NewAppList.Add(NGame);
|
||||
}
|
||||
}
|
||||
ListViewItem[] arr = NewAppList.ToArray();
|
||||
NewAppsListView.BeginUpdate();
|
||||
NewAppsListView.Items.Clear();
|
||||
NewAppsListView.Items.AddRange(arr);
|
||||
NewAppsListView.EndUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
6969
NewApps.resx
Normal file
85
Program.cs
@@ -1,35 +1,50 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using System.Security.Permissions;
|
||||
using System.IO;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
|
||||
static void Main()
|
||||
{
|
||||
AppDomain currentDomain = AppDomain.CurrentDomain;
|
||||
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
|
||||
form = new MainForm();
|
||||
Application.Run(form);
|
||||
//form.Show();
|
||||
}
|
||||
public static MainForm form;
|
||||
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
|
||||
{
|
||||
Exception e = (Exception)args.ExceptionObject;
|
||||
string date_time = DateTime.Now.ToString("dddd, MMMM dd @ hh:mmtt (UTC)");
|
||||
File.WriteAllText(Sideloader.CrashLogPath, $"Date/Time of crash: {date_time}\nMessage: {e.Message}\nData: {e.Data}\nSource: {e.Source}\nTargetSite: {e.TargetSite}");
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Permissions;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
internal static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
|
||||
private static void Main()
|
||||
{
|
||||
|
||||
AppDomain currentDomain = AppDomain.CurrentDomain;
|
||||
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(CrashHandler);
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
if (AndroidSideloader.Properties.Settings.Default.UpdateSettings)
|
||||
{
|
||||
AndroidSideloader.Properties.Settings.Default.Upgrade();
|
||||
AndroidSideloader.Properties.Settings.Default.UpdateSettings = false;
|
||||
AndroidSideloader.Properties.Settings.Default.Save();
|
||||
}
|
||||
form = new MainForm();
|
||||
Application.Run(form);
|
||||
//form.Show();
|
||||
}
|
||||
public static MainForm form;
|
||||
|
||||
private static void CrashHandler(object sender, UnhandledExceptionEventArgs args)
|
||||
{
|
||||
// Capture unhandled exceptions and write to file.
|
||||
Exception e = (Exception)args.ExceptionObject;
|
||||
string innerExceptionMessage = (e.InnerException != null)
|
||||
? e.InnerException.Message
|
||||
: "None";
|
||||
string date_time = DateTime.Now.ToString("dddd, MMMM dd @ hh:mmtt (UTC)");
|
||||
File.WriteAllText(Sideloader.CrashLogPath, $"Date/Time of crash: {date_time}\nMessage: {e.Message}\nInner Message: {innerExceptionMessage}\nData: {e.Data}\nSource: {e.Source}\nTargetSite: {e.TargetSite}\nStack Trace: \n{e.StackTrace}\n\n\nDebuglog: \n\n\n");
|
||||
// If a debuglog exists we append it to the crashlog.
|
||||
if (File.Exists(Properties.Settings.Default.CurrentLogPath))
|
||||
{
|
||||
File.AppendAllText(Sideloader.CrashLogPath, File.ReadAllText($"{Properties.Settings.Default.CurrentLogPath}"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
@@ -7,9 +6,9 @@ using System.Runtime.InteropServices;
|
||||
// associated with an assembly.
|
||||
//[assembly: AssemblyKeyFileAttribute("keypair.snk")]
|
||||
[assembly: AssemblyTitle("AndroidSideloader")]
|
||||
[assembly: AssemblyDescription("Rookie's Sideloader")]
|
||||
[assembly: AssemblyDescription("Rookie Sideloader")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Rookie.WTF")]
|
||||
[assembly: AssemblyCompany("Rookie.AndroidSideloader")]
|
||||
[assembly: AssemblyProduct("AndroidSideloader")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2020")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
This file is automatically generated by Visual Studio .Net. It is
|
||||
used to store generic object data source configuration information.
|
||||
Renaming the file extension or editing the content of this file may
|
||||
cause the file to be unrecognizable by the program.
|
||||
-->
|
||||
<GenericObjectDataSource DisplayName="Resources" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
|
||||
<TypeInfo>AndroidSideloader.Properties.Resources, Properties.Resources.Designer.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
|
||||
</GenericObjectDataSource>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
This file is automatically generated by Visual Studio .Net. It is
|
||||
used to store generic object data source configuration information.
|
||||
Renaming the file extension or editing the content of this file may
|
||||
cause the file to be unrecognizable by the program.
|
||||
-->
|
||||
<GenericObjectDataSource DisplayName="Settings" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
|
||||
<TypeInfo>AndroidSideloader.Properties.Settings, Properties.Resources.Designer.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
|
||||
</GenericObjectDataSource>
|
||||
94
Properties/Resources.Designer.cs
generated
@@ -19,7 +19,7 @@ namespace AndroidSideloader.Properties {
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
public class Resources {
|
||||
@@ -60,6 +60,16 @@ namespace AndroidSideloader.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap ajax_loader {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("ajax-loader", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@@ -73,9 +83,9 @@ namespace AndroidSideloader.Properties {
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap battery1 {
|
||||
public static System.Drawing.Bitmap Pattern {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("battery1", resourceCulture);
|
||||
object obj = ResourceManager.GetObject("Pattern", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
@@ -83,9 +93,9 @@ namespace AndroidSideloader.Properties {
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap battery11 {
|
||||
public static System.Drawing.Bitmap pattern_cubes {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("battery11", resourceCulture);
|
||||
object obj = ResourceManager.GetObject("pattern_cubes", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
@@ -93,39 +103,9 @@ namespace AndroidSideloader.Properties {
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap bluekey {
|
||||
public static System.Drawing.Bitmap pattern_herringbone {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("bluekey", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap greenkey {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("greenkey", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap orangekey {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("orangekey", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap redkey {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("redkey", resourceCulture);
|
||||
object obj = ResourceManager.GetObject("pattern_herringbone", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
@@ -139,5 +119,45 @@ namespace AndroidSideloader.Properties {
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap splashimage {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("splashimage", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap splashimage_deps {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("splashimage_deps", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap splashimage_offline {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("splashimage_offline", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
public static System.Drawing.Bitmap splashimage_rclone {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("splashimage_rclone", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,28 +118,34 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="orangekey" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\orangekey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="greenkey" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\greenkey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="battery1" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\battery11.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="battery" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\battery.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="ajax-loader" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\ajax-loader.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="SearchGlass" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\SearchGlass.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="bluekey" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\bluekey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
<data name="Pattern" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\Pattern.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="redkey" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\redkey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
<data name="splashimage" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\splashimage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="battery11" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\battery1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
<data name="splashimage_deps" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\splashimage_deps.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="splashimage_rclone" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\splashimage_rclone.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="pattern_cubes" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\pattern_cubes.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="pattern_herringbone" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\pattern_herringbone.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="splashimage_offline" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\splashimage_offline.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
1359
Properties/Settings.Designer.cs
generated
@@ -23,26 +23,8 @@
|
||||
<Setting Name="CallUpgrade" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="BackColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">45, 45, 45</Value>
|
||||
</Setting>
|
||||
<Setting Name="ButtonColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">ActiveCaptionText</Value>
|
||||
</Setting>
|
||||
<Setting Name="SubButtonColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">64, 64, 64</Value>
|
||||
</Setting>
|
||||
<Setting Name="TextBoxColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">45, 45, 45</Value>
|
||||
</Setting>
|
||||
<Setting Name="ComboBoxColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">45, 45, 45</Value>
|
||||
</Setting>
|
||||
<Setting Name="FontColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">White</Value>
|
||||
</Setting>
|
||||
<Setting Name="FontStyle" Type="System.Drawing.Font" Scope="User">
|
||||
<Value Profile="(Default)">Microsoft Sans Serif, 11pt</Value>
|
||||
<Value Profile="(Default)">Microsoft Sans Serif, 11.25pt</Value>
|
||||
</Setting>
|
||||
<Setting Name="BackPicturePath" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
@@ -50,9 +32,6 @@
|
||||
<Setting Name="SpoofGames" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="BandwithLimit" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="BigFontStyle" Type="System.Drawing.Font" Scope="User">
|
||||
<Value Profile="(Default)">Microsoft Sans Serif, 14pt</Value>
|
||||
</Setting>
|
||||
@@ -68,36 +47,9 @@
|
||||
<Setting Name="ADBPath" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="QUsett" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="QuChecked" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="QUhz" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="QUres" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="QUy" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="QUx" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="QUname" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">Change Me</Value>
|
||||
</Setting>
|
||||
<Setting Name="QUString" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="MainDir" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="QUStringF" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="delsh" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
@@ -116,9 +68,6 @@
|
||||
<Setting Name="PackageNameToCB" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="EnterKeyInstall" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="DownUpHeld" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
@@ -134,12 +83,6 @@
|
||||
<Setting Name="CurrentCrashName" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="QUturnedon" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="QblindOn" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="adbdebugwarned" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
@@ -147,7 +90,97 @@
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="BMBFchecked" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="GamesList" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="UploadedGameList" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="GlobalUsername" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="lastTimeShared" Type="System.DateTime" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="AutoReinstall" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="NonAppPackages" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="LastLaunch" Type="System.DateTime" Scope="User">
|
||||
<Value Profile="(Default)">04/20/1969 16:20:00</Value>
|
||||
</Setting>
|
||||
<Setting Name="SubmittedUpdates" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="ListUpped" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="LastLaunch2" Type="System.DateTime" Scope="User">
|
||||
<Value Profile="(Default)">04/20/1969 16:20:00</Value>
|
||||
</Setting>
|
||||
<Setting Name="Wired" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="FontColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">White</Value>
|
||||
</Setting>
|
||||
<Setting Name="ComboBoxColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">25, 25, 25</Value>
|
||||
</Setting>
|
||||
<Setting Name="SubButtonColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">25, 25, 25</Value>
|
||||
</Setting>
|
||||
<Setting Name="TextBoxColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">25, 25, 25</Value>
|
||||
</Setting>
|
||||
<Setting Name="ButtonColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">Black</Value>
|
||||
</Setting>
|
||||
<Setting Name="BackColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">1, 1, 1</Value>
|
||||
</Setting>
|
||||
<Setting Name="AppPackages" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="TrailersOn" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="downloadDir" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="customDownloadDir" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="customBackupDir" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="backupDir" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="singleThreadMode" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="virtualFilesystemCompatibility" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="UpdateSettings" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="UUID" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="createPubMirrorFile" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="useDownloadedFiles" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="bandwidthLimit" Type="System.Single" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
1164
QuestForm.Designer.cs
generated
280
QuestForm.cs
@@ -1,8 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
@@ -12,7 +9,6 @@ namespace AndroidSideloader
|
||||
public static int length = 0;
|
||||
public static string[] result;
|
||||
public bool settingsexist = false;
|
||||
public static bool QUSon = false;
|
||||
public bool delsh = false;
|
||||
public QuestForm()
|
||||
{
|
||||
@@ -20,44 +16,44 @@ namespace AndroidSideloader
|
||||
}
|
||||
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
private void btnApplyTempSettings_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool ChangesMade = false;
|
||||
|
||||
//Quest 2 settings, might remove them in the future since some of them are broken
|
||||
if (RefreshRateComboBox.SelectedIndex != -1)
|
||||
{
|
||||
ADB.WakeDevice();
|
||||
ADB.RunAdbCommandToString($"shell setprop debug.oculus.refreshRate {RefreshRateComboBox.SelectedItem.ToString()}");
|
||||
ADB.RunAdbCommandToString($"shell settings put global 90hz_global {RefreshRateComboBox.SelectedIndex}");
|
||||
ADB.RunAdbCommandToString($"shell settings put global 90hzglobal {RefreshRateComboBox.SelectedIndex}");
|
||||
_ = ADB.RunAdbCommandToString($"shell setprop debug.oculus.refreshRate {RefreshRateComboBox.SelectedItem}");
|
||||
_ = ADB.RunAdbCommandToString($"shell settings put global 90hz_global {RefreshRateComboBox.SelectedIndex}");
|
||||
_ = ADB.RunAdbCommandToString($"shell settings put global 90hzglobal {RefreshRateComboBox.SelectedIndex}");
|
||||
ChangesMade = true;
|
||||
}
|
||||
|
||||
if (TextureResTextBox.Text.Length > 0)
|
||||
{
|
||||
ADB.WakeDevice();
|
||||
Int32.TryParse(TextureResTextBox.Text, out int result);
|
||||
ADB.RunAdbCommandToString($"shell settings put global texture_size_Global {TextureResTextBox.Text}");
|
||||
ADB.RunAdbCommandToString($"shell setprop debug.oculus.textureWidth {TextureResTextBox.Text}");
|
||||
ADB.RunAdbCommandToString($"shell setprop debug.oculus.textureHeight {TextureResTextBox.Text}");
|
||||
_ = int.TryParse(TextureResTextBox.Text, out _);
|
||||
_ = ADB.RunAdbCommandToString($"shell settings put global texture_size_Global {TextureResTextBox.Text}");
|
||||
_ = ADB.RunAdbCommandToString($"shell setprop debug.oculus.textureWidth {TextureResTextBox.Text}");
|
||||
_ = ADB.RunAdbCommandToString($"shell setprop debug.oculus.textureHeight {TextureResTextBox.Text}");
|
||||
ChangesMade = true;
|
||||
}
|
||||
|
||||
if (CPUComboBox.SelectedIndex != -1)
|
||||
{
|
||||
ADB.RunAdbCommandToString($"shell setprop debug.oculus.cpuLevel {CPUComboBox.SelectedItem.ToString()}");
|
||||
_ = ADB.RunAdbCommandToString($"shell setprop debug.oculus.cpuLevel {CPUComboBox.SelectedItem}");
|
||||
ChangesMade = true;
|
||||
}
|
||||
|
||||
if (GPUComboBox.SelectedIndex != -1)
|
||||
{
|
||||
ADB.RunAdbCommandToString($"shell setprop debug.oculus.gpuLevel {GPUComboBox.SelectedItem.ToString()}");
|
||||
_ = ADB.RunAdbCommandToString($"shell setprop debug.oculus.gpuLevel {GPUComboBox.SelectedItem}");
|
||||
ChangesMade = true;
|
||||
}
|
||||
|
||||
if (ChangesMade)
|
||||
MessageBox.Show("Settings applied!");
|
||||
{
|
||||
_ = MessageBox.Show("Settings applied!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -67,71 +63,11 @@ namespace AndroidSideloader
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void ResetQU_click(object sender, EventArgs e)
|
||||
{
|
||||
ResBox.Text = ("0");
|
||||
UsrBox.Text = ("Change Me");
|
||||
FOVx.Text = ("0");
|
||||
FOVy.Text = ("0");
|
||||
QURfrRt.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
private void DeleteShots_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (DeleteShots.Checked)
|
||||
delsh = true;
|
||||
else
|
||||
delsh = false;
|
||||
delsh = DeleteShots.Checked;
|
||||
}
|
||||
private void QUon_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (QUon.Checked)
|
||||
{
|
||||
ResBox.Visible = true;
|
||||
UsrBox.Visible = true;
|
||||
FOVx.Visible = true;
|
||||
FOVy.Visible = true;
|
||||
QURfrRt.Visible = true;
|
||||
ResetQU.Visible = true;
|
||||
QUEnable.Visible = true;
|
||||
label5.Visible = true;
|
||||
label6.Visible = true;
|
||||
label7.Visible = true;
|
||||
label8.Visible = true;
|
||||
label9.Visible = true;
|
||||
label10.Visible = true;
|
||||
deleteButton.Visible = true;
|
||||
ResBox.Text = Properties.Settings.Default.QUres;
|
||||
UsrBox.Text = Properties.Settings.Default.QUname;
|
||||
FOVy.Text = Properties.Settings.Default.QUy;
|
||||
FOVx.Text = Properties.Settings.Default.QUx;
|
||||
QURfrRt.SelectedValue = Properties.Settings.Default.QUhz;
|
||||
Properties.Settings.Default.QUturnedon = true;
|
||||
}
|
||||
else if (!QUon.Checked)
|
||||
{
|
||||
ResBox.Visible = false;
|
||||
UsrBox.Visible = false;
|
||||
FOVx.Visible = false;
|
||||
FOVy.Visible = false;
|
||||
QURfrRt.Visible = false;
|
||||
ResetQU.Visible = false;
|
||||
QUEnable.Visible = false;
|
||||
label5.Visible = false;
|
||||
label6.Visible = false;
|
||||
label7.Visible = false;
|
||||
label8.Visible = false;
|
||||
label9.Visible = false;
|
||||
label10.Visible = false;
|
||||
deleteButton.Visible = false;
|
||||
Properties.Settings.Default.QUturnedon = false;
|
||||
MessageBox.Show("Ok, Deleted your custom settings file.\nIf you would like to re-enable return here and apply settings again");
|
||||
File.Delete($"{Environment.CurrentDirectory}\\Config.Json");
|
||||
File.Delete($"{Environment.CurrentDirectory}\\delete_settings");
|
||||
}
|
||||
|
||||
}
|
||||
private static readonly Random random = new Random();
|
||||
private static readonly object syncLock = new object();
|
||||
public static int RandomNumber(int min, int max)
|
||||
@@ -141,60 +77,12 @@ namespace AndroidSideloader
|
||||
return random.Next(min, max);
|
||||
}
|
||||
}
|
||||
private void QUEnable_Click(object sender, EventArgs e)
|
||||
|
||||
|
||||
|
||||
|
||||
private void QuestForm_FormClosed(object sender, FormClosedEventArgs e)
|
||||
{
|
||||
|
||||
settingsexist = true;
|
||||
MessageBox.Show("OK, any -QU packages installed will have these settings applied!\nTo delete settings: goto main app window, select a game with top menu, and click \"Remove QU Setting\"");
|
||||
if (QUon.Checked)
|
||||
{
|
||||
Properties.Settings.Default.QUturnedon = true;
|
||||
Random r = new Random();
|
||||
|
||||
int x = r.Next(999999999);
|
||||
int y = r.Next(9999999);
|
||||
|
||||
var sum = ((long)y * (long)1000000000) + (long)x;
|
||||
|
||||
int x2 = r.Next(999999999);
|
||||
int y2 = r.Next(9999999);
|
||||
|
||||
var sum2 = ((long)y2 * (long)1000000000) + (long)x2;
|
||||
|
||||
QUSon = true;
|
||||
|
||||
string selected = this.QURfrRt.GetItemText(this.QURfrRt.SelectedItem);
|
||||
|
||||
Properties.Settings.Default.QUString = $"\"refresh_rate\":{selected},\"eye_texture_width\":{ResBox.Text},\"fov_x\":{FOVx.Text},\"fov_y\":{FOVy.Text},\"username\":\"{UsrBox.Text}\"}}";
|
||||
Properties.Settings.Default.QUStringF = $"{{\"user_id\":{sum},\"app_id\":\"{sum2}\",";
|
||||
Properties.Settings.Default.Save();
|
||||
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\delete_settings", "");
|
||||
string boff = Properties.Settings.Default.QUStringF + Properties.Settings.Default.QUString;
|
||||
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\config.json", boff);
|
||||
}
|
||||
else
|
||||
{
|
||||
Properties.Settings.Default.QUturnedon = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void QuestForm_FormClosed(object sender, FormClosedEventArgs e)
|
||||
{
|
||||
if (QUon.Checked)
|
||||
{
|
||||
Properties.Settings.Default.QUsett = true;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
if (!QUon.Checked)
|
||||
{
|
||||
Properties.Settings.Default.QUsett = false;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
if (DeleteShots.Checked)
|
||||
{
|
||||
Properties.Settings.Default.delsh = true;
|
||||
@@ -206,61 +94,17 @@ namespace AndroidSideloader
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
|
||||
private void QuestForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (Properties.Settings.Default.delsh)
|
||||
DeleteShots.Checked = true;
|
||||
if (Properties.Settings.Default.QUsett)
|
||||
{
|
||||
ResBox.Text = Properties.Settings.Default.QUres;
|
||||
UsrBox.Text = Properties.Settings.Default.QUname;
|
||||
FOVy.Text = Properties.Settings.Default.QUy;
|
||||
FOVx.Text = Properties.Settings.Default.QUx;
|
||||
QURfrRt.Text = Properties.Settings.Default.QUhz;
|
||||
QUon.Checked = true;
|
||||
if (settingsexist)
|
||||
QUSon = true;
|
||||
|
||||
|
||||
}
|
||||
DeleteShots.Checked = Properties.Settings.Default.delsh;
|
||||
GlobalUsername.Text = Properties.Settings.Default.GlobalUsername;
|
||||
}
|
||||
|
||||
private void ResBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.QUres = ResBox.Text;
|
||||
Properties.Settings.Default.Save();
|
||||
|
||||
}
|
||||
|
||||
private void UsrBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.QUname = UsrBox.Text;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void FOVx_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.QUx = FOVx.Text;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void FOVy_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.QUy = FOVy.Text;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void QURfrRt_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
string selected = this.QURfrRt.GetItemText(this.QURfrRt.SelectedItem);
|
||||
Properties.Settings.Default.QUhz = selected;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
private void DeleteButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
MessageBox.Show("Ok, Deleted your custom settings file.\nIf you would like to re-enable return here and apply settings again");
|
||||
_ = MessageBox.Show("Ok, Deleted your custom settings file.\nIf you would like to re-enable return here and apply settings again");
|
||||
File.Delete($"{Properties.Settings.Default.MainDir}\\Config.Json");
|
||||
}
|
||||
private void questPics_Click(object sender, EventArgs e)
|
||||
@@ -268,73 +112,77 @@ namespace AndroidSideloader
|
||||
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
|
||||
|
||||
if (!Directory.Exists($"{path}\\Quest ScreenShots"))
|
||||
Directory.CreateDirectory($"{path}\\Quest ScreenShots");
|
||||
MessageBox.Show("Please wait until you get the message that the transfer has finished.");
|
||||
ADB.WakeDevice();
|
||||
Program.form.ChangeTitle("Pulling files...");
|
||||
ADB.RunAdbCommandToString($"pull \"/sdcard/Oculus/Screenshots\" \"{path}\\Quest ScreenShots\"");
|
||||
if (delsh)
|
||||
{
|
||||
DialogResult dialogResult = MessageBox.Show("You have chosen to delete files from headset after transferring, so be sure to move them from your desktop to somewhere safe!", "Warning!", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult == DialogResult.OK)
|
||||
{
|
||||
ADB.RunAdbCommandToString("shell rm -r /sdcard/Oculus/Screenshots");
|
||||
ADB.RunAdbCommandToString("shell mkdir /sdcard/Oculus/Screenshots");
|
||||
}
|
||||
_ = Directory.CreateDirectory($"{path}\\Quest ScreenShots");
|
||||
}
|
||||
MessageBox.Show("Transfer finished! ScreenShots can be found in a folder named Quest Screenshots on your desktop!");
|
||||
Program.form.ChangeTitle("Done!");
|
||||
}
|
||||
private void questVids_Click(object sender, EventArgs e)
|
||||
{
|
||||
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
|
||||
if (!Directory.Exists($"{path}\\Quest VideoShots"))
|
||||
Directory.CreateDirectory($"{path}\\Quest VideoShots");
|
||||
MessageBox.Show("Please wait until you get the message that the transfer has finished.");
|
||||
ADB.WakeDevice();
|
||||
Program.form.ChangeTitle("Pulling files...");
|
||||
ADB.RunAdbCommandToString($"pull \"/sdcard/Oculus/Videoshots\" \"{path}\\Quest VideoShots\"");
|
||||
|
||||
_ = MessageBox.Show("Please wait until you get the message that the transfer has finished.");
|
||||
Program.form.changeTitle("Pulling files...");
|
||||
_ = ADB.RunAdbCommandToString($"pull \"/sdcard/Oculus/Screenshots\" \"{path}\\Quest ScreenShots\"");
|
||||
if (delsh)
|
||||
{
|
||||
DialogResult dialogResult = MessageBox.Show("You have chosen to delete files from headset after transferring, so be sure to move them from your desktop to somewhere safe!", "Warning!", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult == DialogResult.OK)
|
||||
{
|
||||
ADB.RunAdbCommandToString("shell rm -r /sdcard/Oculus/Videoshots");
|
||||
ADB.RunAdbCommandToString("shell mkdir /sdcard/Oculus/Videoshots");
|
||||
_ = ADB.RunAdbCommandToString("shell rm -r /sdcard/Oculus/Screenshots");
|
||||
_ = ADB.RunAdbCommandToString("shell mkdir /sdcard/Oculus/Screenshots");
|
||||
}
|
||||
}
|
||||
MessageBox.Show("Transfer finished! VideoShots can be found in a folder named Quest VideoShots on your desktop!");
|
||||
Program.form.ChangeTitle("Done!");
|
||||
_ = MessageBox.Show("Transfer finished! ScreenShots can be found in a folder named Quest Screenshots on your desktop!");
|
||||
Program.form.changeTitle("Done!");
|
||||
}
|
||||
private void button3_Click(object sender, EventArgs e)
|
||||
private void questVids_Click(object sender, EventArgs e)
|
||||
{
|
||||
UsernameForm Form = new UsernameForm();
|
||||
Form.Show();
|
||||
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
|
||||
if (!Directory.Exists($"{path}\\Quest Recordings"))
|
||||
{
|
||||
_ = Directory.CreateDirectory($"{path}\\Quest Recordings");
|
||||
}
|
||||
|
||||
_ = MessageBox.Show("Please wait until you get the message that the transfer has finished.");
|
||||
Program.form.changeTitle("Pulling files...");
|
||||
_ = ADB.RunAdbCommandToString($"pull \"/sdcard/Oculus/Videoshots\" \"{path}\\Quest Recordings\"");
|
||||
if (delsh)
|
||||
{
|
||||
DialogResult dialogResult = MessageBox.Show("You have chosen to delete files from headset after transferring, so be sure to move them from your desktop to somewhere safe!", "Warning!", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult == DialogResult.OK)
|
||||
{
|
||||
_ = ADB.RunAdbCommandToString("shell rm -r /sdcard/Oculus/Videoshots");
|
||||
_ = ADB.RunAdbCommandToString("shell mkdir /sdcard/Oculus/Videoshots");
|
||||
}
|
||||
}
|
||||
_ = MessageBox.Show("Transfer finished! Recordings can be found in a folder named Quest Recordings on your desktop!");
|
||||
Program.form.changeTitle("Done!");
|
||||
}
|
||||
|
||||
private void btnApplyUsername_Click(object sender, EventArgs e)
|
||||
{
|
||||
_ = ADB.RunAdbCommandToString($"shell settings put global username {GlobalUsername.Text}");
|
||||
_ = MessageBox.Show($"Username set as {GlobalUsername.Text}", "Success");
|
||||
}
|
||||
|
||||
private void Form_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Escape)
|
||||
{
|
||||
this.Close();
|
||||
Close();
|
||||
}
|
||||
}
|
||||
protected override bool ProcessDialogKey(Keys keyData)
|
||||
{
|
||||
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
|
||||
{
|
||||
this.Close();
|
||||
Close();
|
||||
return true;
|
||||
}
|
||||
return base.ProcessDialogKey(keyData);
|
||||
}
|
||||
|
||||
private void WifiWake_Click(object sender, EventArgs e)
|
||||
private void GlobalUsername_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
ADB.RunAdbCommandToString("shell settings put global wifi_wakeup_available 1");
|
||||
ADB.RunAdbCommandToString("shell settings put global wifi_wakeup_enabled 1");
|
||||
MessageBox.Show("Wake on Wifi enabled!\n\nNOTE: This requires having wireless ADB enabled to work. (Obviously)");
|
||||
btnApplyUsername.Enabled = GlobalUsername.TextLength > 0;
|
||||
Properties.Settings.Default.GlobalUsername = GlobalUsername.Text;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
6849
QuestForm.resx
318
RCLONE.cs
@@ -1,22 +1,44 @@
|
||||
using System;
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
using System.Management;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using JR.Utils.GUI.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class RCLONE
|
||||
internal class RCLONE
|
||||
{
|
||||
//Kill all rclone, using a static rclone variable doesn't work for some reason #tofix
|
||||
// Kill RCLONE Processes that were started from Rookie by looking for child processes.
|
||||
public static void killRclone()
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("rclone"))
|
||||
process.Kill();
|
||||
var parentProcessId = Process.GetCurrentProcess().Id;
|
||||
var processes = Process.GetProcessesByName("rclone");
|
||||
|
||||
foreach (var process in processes)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (ManagementObject obj = new ManagementObject($"win32_process.handle='{process.Id}'"))
|
||||
{
|
||||
obj.Get();
|
||||
var ppid = Convert.ToInt32(obj["ParentProcessId"]);
|
||||
|
||||
if (ppid == parentProcessId)
|
||||
{
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_ = Logger.Log($"Exception occured while attempting to shut down RCLONE with exception message: {ex.Message}", LogLevel.ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//For custom configs that use a password
|
||||
// For custom configs that use a password
|
||||
public static void Init()
|
||||
{
|
||||
string PwTxtPath = Path.Combine(Environment.CurrentDirectory, "rclone\\pw.txt");
|
||||
@@ -26,61 +48,68 @@ namespace AndroidSideloader
|
||||
}
|
||||
}
|
||||
|
||||
//Change if you want to use a config
|
||||
public static string configPath = ""; // ".\\a"
|
||||
// Change if you want to use a config
|
||||
public static string downloadConfigPath = "vrp.download.config";
|
||||
public static string uploadConfigPath = "vrp.upload.config";
|
||||
public static string rclonepw = "";
|
||||
|
||||
|
||||
private static Process rclone = new Process();
|
||||
|
||||
//Run rclone command
|
||||
public static ProcessOutput runRcloneCommand(string command, string bandwithLimit = "")
|
||||
{
|
||||
if (!MainForm.HasInternet) return new ProcessOutput("", "No internet");
|
||||
private static readonly Process rclone = new Process();
|
||||
|
||||
// Run an RCLONE Command that accesses the Download Config.
|
||||
public static ProcessOutput runRcloneCommand_DownloadConfig(string command)
|
||||
{
|
||||
if (MainForm.isOffline)
|
||||
{
|
||||
return new ProcessOutput("", "No internet");
|
||||
}
|
||||
|
||||
//Set the password for rclone configs
|
||||
Environment.SetEnvironmentVariable("RCLONE_CRYPT_REMOTE", rclonepw);
|
||||
Environment.SetEnvironmentVariable("RCLONE_CONFIG_PASS", rclonepw);
|
||||
ProcessOutput prcoutput = new ProcessOutput();
|
||||
//Rclone output is unicode, else it will show garbage instead of unicode characters
|
||||
// Rclone output is unicode, else it will show garbage instead of unicode characters
|
||||
rclone.StartInfo.StandardOutputEncoding = Encoding.UTF8;
|
||||
string originalCommand = command;
|
||||
|
||||
//set bandwidth limit
|
||||
if (bandwithLimit.Length > 0)
|
||||
// set configpath if there is any
|
||||
if (downloadConfigPath.Length > 0)
|
||||
{
|
||||
command += $" --bwlimit={bandwithLimit}";
|
||||
command += $" --config {downloadConfigPath}";
|
||||
}
|
||||
|
||||
//set configpath if there is any
|
||||
if (configPath.Length > 0)
|
||||
{
|
||||
command += $" --config {configPath}";
|
||||
}
|
||||
command += $" --inplace";
|
||||
|
||||
//set rclonepw
|
||||
// set rclonepw
|
||||
if (rclonepw.Length > 0)
|
||||
{
|
||||
command += " --ask-password=false";
|
||||
}
|
||||
|
||||
string logcmd = Utilities.StringUtilities.RemoveEverythingBeforeFirst(command, "rclone.exe");
|
||||
if (logcmd.Contains($"\"{Properties.Settings.Default.CurrentLogPath}\""))
|
||||
{
|
||||
logcmd = logcmd.Replace($"\"{Properties.Settings.Default.CurrentLogPath}\"", $"\"{Properties.Settings.Default.CurrentLogName}\"");
|
||||
if (logcmd.Contains(Environment.CurrentDirectory))
|
||||
logcmd = logcmd.Replace($"{Environment.CurrentDirectory}", $"CurrentDirectory");
|
||||
Logger.Log($"Running Rclone command: {logcmd}");
|
||||
}
|
||||
|
||||
rclone.StartInfo.FileName = Environment.CurrentDirectory + "\\rclone\\rclone.exe";
|
||||
if (logcmd.Contains(Environment.CurrentDirectory))
|
||||
{
|
||||
logcmd = logcmd.Replace($"{Environment.CurrentDirectory}", $"CurrentDirectory");
|
||||
}
|
||||
|
||||
_ = Logger.Log($"Running Rclone command: {logcmd}");
|
||||
|
||||
rclone.StartInfo.FileName = Path.Combine(Environment.CurrentDirectory, "rclone", "rclone.exe");
|
||||
rclone.StartInfo.Arguments = command;
|
||||
rclone.StartInfo.RedirectStandardInput = true;
|
||||
rclone.StartInfo.RedirectStandardError = true;
|
||||
rclone.StartInfo.RedirectStandardOutput = true;
|
||||
rclone.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\rclone";
|
||||
rclone.StartInfo.WorkingDirectory = Path.Combine(Environment.CurrentDirectory, "rclone");
|
||||
rclone.StartInfo.CreateNoWindow = true;
|
||||
//On debug we want to see when rclone is open
|
||||
if (MainForm.debugMode == true)
|
||||
// Display RCLONE Window if the binary is being run in Debug Mode.
|
||||
if (MainForm.debugMode)
|
||||
{
|
||||
rclone.StartInfo.CreateNoWindow = false;
|
||||
}
|
||||
rclone.StartInfo.UseShellExecute = false;
|
||||
rclone.Start();
|
||||
|
||||
_ = rclone.Start();
|
||||
rclone.StandardInput.WriteLine(command);
|
||||
rclone.StandardInput.Flush();
|
||||
rclone.StandardInput.Close();
|
||||
@@ -89,31 +118,228 @@ namespace AndroidSideloader
|
||||
string error = rclone.StandardError.ReadToEnd();
|
||||
rclone.WaitForExit();
|
||||
|
||||
//if there is one of these errors, we switch the mirrors
|
||||
if (error.Contains("cannot fetch token") || error.Contains("authError") || (error.Contains("quota") || error.Contains("exceeded") || error.Contains("directory not found")))
|
||||
if (error.Contains("There is not enough space"))
|
||||
{
|
||||
Program.form.Invoke(() =>
|
||||
{
|
||||
_ = FlexibleMessageBox.Show(Program.form, $"There isn't enough disk space to download this game.\r\nPlease ensure you have at least 200MB more the game size available in {Properties.Settings.Default.downloadDir} and try again.",
|
||||
"NOT ENOUGH SPACE",
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error);
|
||||
});
|
||||
return new ProcessOutput("Download failed.", "");
|
||||
}
|
||||
|
||||
// Switch mirror upon matching error output.
|
||||
if (error.Contains("400 Bad Request") || error.Contains("cannot fetch token") || error.Contains("authError") || error.Contains("quota") || error.Contains("exceeded") || error.Contains("directory not found") || error.Contains("Failed to"))
|
||||
{
|
||||
string oldRemote = MainForm.currentRemote;
|
||||
try
|
||||
{
|
||||
Program.form.SwitchMirrors();
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new ProcessOutput("All mirrors are on quota or down...", "All mirrors are on quota or down...");
|
||||
}
|
||||
prcoutput = runRcloneCommand(originalCommand.Replace(oldRemote, MainForm.currentRemote), bandwithLimit);
|
||||
prcoutput = runRcloneCommand_DownloadConfig(originalCommand.Replace(oldRemote, MainForm.currentRemote));
|
||||
}
|
||||
else
|
||||
{
|
||||
prcoutput.Output = output;
|
||||
prcoutput.Error = error;
|
||||
}
|
||||
if (!output.Contains("Game Name;Release Name;") && !output.Contains("package:"))
|
||||
Logger.Log($"Rclone error: {error}\nRclone Output: {output}");
|
||||
if (error.Contains("There is not enough space"))
|
||||
FlexibleMessageBox.Show("There isn't enough space on your PC to properly install this game. Please have at least 2x the size of the game you are trying to download/install available on the drive where Rookie is installed.", "NOT ENOUGH SPACE");
|
||||
return prcoutput;
|
||||
|
||||
if (!output.Contains("Game Name;Release Name;") && !output.Contains("package:") && !output.Contains(".meta"))
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(error))
|
||||
{
|
||||
_ = Logger.Log($"Rclone error: {error}\n", LogLevel.ERROR);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(output))
|
||||
{
|
||||
_ = Logger.Log($"Rclone Output: {output}");
|
||||
}
|
||||
}
|
||||
return prcoutput;
|
||||
}
|
||||
|
||||
public static ProcessOutput runRcloneCommand_UploadConfig(string command)
|
||||
{
|
||||
ProcessOutput prcoutput = new ProcessOutput();
|
||||
// Rclone output is unicode, else it will show garbage instead of unicode characters
|
||||
rclone.StartInfo.StandardOutputEncoding = Encoding.UTF8;
|
||||
|
||||
// set configpath if there is any
|
||||
if (uploadConfigPath.Length > 0)
|
||||
{
|
||||
command += $" --config {uploadConfigPath}";
|
||||
}
|
||||
|
||||
string logcmd = Utilities.StringUtilities.RemoveEverythingBeforeFirst(command, "rclone.exe");
|
||||
if (logcmd.Contains($"\"{Properties.Settings.Default.CurrentLogPath}\""))
|
||||
{
|
||||
logcmd = logcmd.Replace($"\"{Properties.Settings.Default.CurrentLogPath}\"", $"\"{Properties.Settings.Default.CurrentLogName}\"");
|
||||
}
|
||||
|
||||
if (logcmd.Contains(Environment.CurrentDirectory))
|
||||
{
|
||||
logcmd = logcmd.Replace($"{Environment.CurrentDirectory}", $"CurrentDirectory");
|
||||
}
|
||||
|
||||
_ = Logger.Log($"Running Rclone command: {logcmd}");
|
||||
|
||||
command += " --checkers 1 --retries 2 --inplace";
|
||||
|
||||
rclone.StartInfo.FileName = Path.Combine(Environment.CurrentDirectory, "rclone", "rclone.exe");
|
||||
rclone.StartInfo.Arguments = command;
|
||||
rclone.StartInfo.RedirectStandardInput = true;
|
||||
rclone.StartInfo.RedirectStandardError = true;
|
||||
rclone.StartInfo.RedirectStandardOutput = true;
|
||||
rclone.StartInfo.WorkingDirectory = Path.Combine(Environment.CurrentDirectory, "rclone");
|
||||
rclone.StartInfo.CreateNoWindow = true;
|
||||
// Display RCLONE Window if the binary is being run in Debug Mode.
|
||||
if (MainForm.debugMode)
|
||||
{
|
||||
rclone.StartInfo.CreateNoWindow = false;
|
||||
}
|
||||
rclone.StartInfo.UseShellExecute = false;
|
||||
_ = rclone.Start();
|
||||
rclone.StandardInput.WriteLine(command);
|
||||
rclone.StandardInput.Flush();
|
||||
rclone.StandardInput.Close();
|
||||
|
||||
string output = rclone.StandardOutput.ReadToEnd();
|
||||
string error = rclone.StandardError.ReadToEnd();
|
||||
rclone.WaitForExit();
|
||||
|
||||
// if there is one of these errors, we switch the mirrors
|
||||
if (error.Contains("400 Bad Request") || error.Contains("cannot fetch token") || error.Contains("authError") || error.Contains("quota") || error.Contains("exceeded") || error.Contains("directory not found") || error.Contains("Failed to"))
|
||||
{
|
||||
_ = Logger.Log(error, LogLevel.ERROR);
|
||||
return new ProcessOutput("Upload Failed.", "Upload failed.");
|
||||
}
|
||||
else
|
||||
{
|
||||
prcoutput.Output = output;
|
||||
prcoutput.Error = error;
|
||||
}
|
||||
|
||||
if (!output.Contains("Game Name;Release Name;") && !output.Contains("package:") && !output.Contains(".meta"))
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(error))
|
||||
{
|
||||
_ = Logger.Log($"Rclone error: {error}\n", LogLevel.ERROR);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(output))
|
||||
{
|
||||
_ = Logger.Log($"Rclone Output: {output}");
|
||||
}
|
||||
}
|
||||
return prcoutput;
|
||||
}
|
||||
|
||||
public static ProcessOutput runRcloneCommand_PublicConfig(string command)
|
||||
{
|
||||
if (MainForm.isOffline)
|
||||
{
|
||||
return new ProcessOutput("", "No internet");
|
||||
}
|
||||
|
||||
ProcessOutput prcoutput = new ProcessOutput();
|
||||
// Rclone output is unicode, else it will show garbage instead of unicode characters
|
||||
rclone.StartInfo.StandardOutputEncoding = Encoding.UTF8;
|
||||
|
||||
string logcmd = Utilities.StringUtilities.RemoveEverythingBeforeFirst(command, "rclone.exe");
|
||||
if (logcmd.Contains($"\"{Properties.Settings.Default.CurrentLogPath}\""))
|
||||
{
|
||||
logcmd = logcmd.Replace($"\"{Properties.Settings.Default.CurrentLogPath}\"", $"\"{Properties.Settings.Default.CurrentLogName}\"");
|
||||
}
|
||||
|
||||
if (logcmd.Contains(Environment.CurrentDirectory))
|
||||
{
|
||||
logcmd = logcmd.Replace($"{Environment.CurrentDirectory}", $"CurrentDirectory");
|
||||
}
|
||||
|
||||
command += $" --inplace";
|
||||
|
||||
_ = Logger.Log($"Running Rclone command: {logcmd}");
|
||||
|
||||
//set http source & args
|
||||
command += $" --http-url {MainForm.PublicConfigFile.BaseUri} {MainForm.PublicMirrorExtraArgs}";
|
||||
rclone.StartInfo.FileName = Path.Combine(Environment.CurrentDirectory, "rclone", "rclone.exe");
|
||||
rclone.StartInfo.Arguments = command;
|
||||
rclone.StartInfo.RedirectStandardInput = true;
|
||||
rclone.StartInfo.RedirectStandardError = true;
|
||||
rclone.StartInfo.RedirectStandardOutput = true;
|
||||
rclone.StartInfo.WorkingDirectory = Path.Combine(Environment.CurrentDirectory, "rclone");
|
||||
rclone.StartInfo.CreateNoWindow = true;
|
||||
// Display RCLONE Window if the binary is being run in Debug Mode.
|
||||
if (MainForm.debugMode)
|
||||
{
|
||||
rclone.StartInfo.CreateNoWindow = false;
|
||||
}
|
||||
rclone.StartInfo.UseShellExecute = false;
|
||||
_ = rclone.Start();
|
||||
rclone.StandardInput.WriteLine(command);
|
||||
rclone.StandardInput.Flush();
|
||||
rclone.StandardInput.Close();
|
||||
|
||||
string output = rclone.StandardOutput.ReadToEnd();
|
||||
string error = rclone.StandardError.ReadToEnd();
|
||||
rclone.WaitForExit();
|
||||
|
||||
if (error.Contains("There is not enough space"))
|
||||
{
|
||||
Program.form.Invoke(() =>
|
||||
{
|
||||
_ = FlexibleMessageBox.Show(Program.form, $"There isn't enough disk space to download this game.\r\nPlease ensure you have at least 2x the game size available in {Properties.Settings.Default.downloadDir} and try again.",
|
||||
"NOT ENOUGH SPACE",
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error);
|
||||
});
|
||||
return new ProcessOutput("Download failed.", string.Empty);
|
||||
}
|
||||
|
||||
if (error.Contains("Only one usage of each socket address (protocol/network address/port) is normally permitted"))
|
||||
{
|
||||
_ = Logger.Log(error, LogLevel.ERROR);
|
||||
return new ProcessOutput("Failed to fetch from public mirror.", "Failed to fetch from public mirror.\nYou may have a running RCLONE Task!\nCheck your Task Manager, Sort by Network Usage, and kill the process Rsync for Cloud Storage/Rclone");
|
||||
}
|
||||
else if (error.Contains("400 Bad Request")
|
||||
|| error.Contains("cannot fetch token")
|
||||
|| error.Contains("authError")
|
||||
|| error.Contains("quota")
|
||||
|| error.Contains("exceeded")
|
||||
|| error.Contains("directory not found")
|
||||
|| error.Contains("Failed to"))
|
||||
{
|
||||
_ = Logger.Log(error, LogLevel.ERROR);
|
||||
return new ProcessOutput("Failed to fetch from public mirror.", "Failed to fetch from public mirror.");
|
||||
}
|
||||
else
|
||||
{
|
||||
prcoutput.Output = output;
|
||||
prcoutput.Error = error;
|
||||
}
|
||||
|
||||
if (!output.Contains("Game Name;Release Name;") && !output.Contains("package:") && !output.Contains(".meta"))
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(error))
|
||||
{
|
||||
_ = Logger.Log($"Rclone error: {error}\n", LogLevel.ERROR);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(output))
|
||||
{
|
||||
_ = Logger.Log($"Rclone Output: {output}");
|
||||
}
|
||||
}
|
||||
|
||||
return prcoutput;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
48
README.md
@@ -1,21 +1,35 @@
|
||||
# androidsideloader
|
||||
# AndroidSideloader
|
||||
|
||||
!IMPORTANT!
|
||||
This app may be buggy and have problems, I will recode it from scratch when MAUI will be released (This september) and a linux port will be available, making RSL cross-platform.
|
||||

|
||||

|
||||
[](https://github.com/VRPirates/rookie/releases)
|
||||

|
||||
|
||||
This app might get detected as malware, however both the sideloader and the sideloader launcher are open source
|
||||
## Disclaimer
|
||||
This application might get flagged as malware by some antivirus software; however, both the Sideloader and the Sideloader Launcher are open source.
|
||||
**Latest VirusTotal Scan (3/72):** [Check here](https://www.virustotal.com/gui/file/04ce50b0cf7fddaaac3e1940e21234ddfc6f05d352891989f8067310f4ec6a69)
|
||||
|
||||
https://www.virustotal.com/gui/file/977105693610cf360fc29339b918e224180ba393ba05a64b6255af3845cbf376/relations
|
||||
|
||||
Special thanks to
|
||||
- [Everyone who donated!](https://raw.githubusercontent.com/nerdunit/androidsideloader/master/donators.txt)
|
||||
- pmow for all of his work, including rclone, wonka and other projects
|
||||
- flow for being friendly and helping every one
|
||||
- succ for creating and maintaining the server
|
||||
- badcoder5000 for redesigning the UI
|
||||
- gotard for the theme changer
|
||||
- [7zip](https://www.7-zip.org/) team for [7zip](https://www.7-zip.org/) :)
|
||||
- [rclone](https://rclone.org/) team for [rclone](https://rclone.org/) :D
|
||||
- [erike](https://stackoverflow.com/users/57611/erike) for the folder browser dialog code
|
||||
- Serge Weinstock for developing SergeUtils, which is used to search the combo box
|
||||
- https://www.c-sharpcorner.com/members/mike-gold2 for the scrollable message box
|
||||
To run properly, Rookie must be extracted to a non-Protected folder on your drive. We recommend running Rookie from C:\RSL\Rookie
|
||||
Do Not use folders such as- C:\Users; C:\Users\Desktop; C:\Program Files; OneDrive; Google Drive; etc...
|
||||
Rookie will cleanup its own folder. We are not responsible if you run Rookie from a folder containing other files as Rookie may delete them.
|
||||
|
||||
|
||||
## Support
|
||||
For any assistance or questions, please utilize our support channels available at [Live Chats](https://vrpirates.wiki/en/general_information/live-chats).
|
||||
|
||||
## Build Instructions
|
||||
This project is developed using C# with WinForms targeting the .NET Framework 4.5.2. To build the project successfully in Visual Studio 2022, follow these steps:
|
||||
|
||||
1. Clone this repository to your local machine.
|
||||
2. Ensure you have the .NET Framework 4.5.2 installed on your machine.
|
||||
3. Open the solution file (`*.sln`) in Visual Studio 2022.
|
||||
4. Sometimes the building process can fail due to the packages.config, you should migrate it to PackageReference, do this by right clicking on References in the Solution Explorer, and pressing "Migrate packages.config to PackageReference"
|
||||
5. Build the solution by selecting "Build" > "Build Solution" from the Visual Studio menu or pressing `Ctrl + Shift + B`. (or right click the solution in the solution explorer, then press Build)
|
||||
6. Run the application.
|
||||
|
||||
## Contributing
|
||||
We welcome contributions from the community. If you would like to contribute, please fork the repository, branch from the newest beta branch from this repository, make your changes, and submit a pull request.
|
||||
|
||||
## License
|
||||
AndroidSideloader is distributed under the GPL license, meaning any forks of it must have their source code made public on the internet. See the [LICENSE](LICENSE) file for details.
|
||||
|
||||
BIN
Resources/Pattern.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
Resources/ajax-loader.gif
Normal file
|
After Width: | Height: | Size: 723 B |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
6801
Resources/nouns.txt
|
Before Width: | Height: | Size: 2.0 KiB |
BIN
Resources/pattern_cubes.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
Resources/pattern_herringbone.png
Normal file
|
After Width: | Height: | Size: 476 B |
|
Before Width: | Height: | Size: 2.4 KiB |
BIN
Resources/splashimage.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
Resources/splashimage_deps.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
Resources/splashimage_offline.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
Resources/splashimage_rclone.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
10
Rookie Offline.cmd
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
|
||||
|
||||
@echo off
|
||||
|
||||
for /f "tokens=* usebackq" %%f in (`dir /b AndroidSideloader*.exe`) do (set "sideloader=%%f" & goto :next)
|
||||
:next
|
||||
|
||||
echo %sideloader%
|
||||
start "" "%sideloader%" "--offline"
|
||||
295
RoundButton.cs
Normal file
@@ -0,0 +1,295 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
[Description("Rounded Button")]
|
||||
public class RoundButton : Control, IButtonControl
|
||||
{
|
||||
#region Variables
|
||||
private int radius;
|
||||
private MouseState state;
|
||||
private RoundedRectangleF roundedRect;
|
||||
private Color inactive1, inactive2, active1, active2;
|
||||
private Color strokeColor;
|
||||
private bool stroke;
|
||||
|
||||
public bool Stroke
|
||||
{
|
||||
get => stroke;
|
||||
set
|
||||
{
|
||||
stroke = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public Color StrokeColor
|
||||
{
|
||||
get => strokeColor;
|
||||
set
|
||||
{
|
||||
strokeColor = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
#region RoundButton
|
||||
public RoundButton()
|
||||
{
|
||||
Width = 65;
|
||||
Height = 30;
|
||||
stroke = false;
|
||||
strokeColor = Color.Gray;
|
||||
inactive1 = Color.FromArgb(44, 188, 210);
|
||||
inactive2 = Color.FromArgb(33, 167, 188);
|
||||
active1 = Color.FromArgb(64, 168, 183);
|
||||
active2 = Color.FromArgb(36, 164, 183);
|
||||
|
||||
|
||||
radius = 10;
|
||||
roundedRect = new RoundedRectangleF(Width, Height, radius);
|
||||
|
||||
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer |
|
||||
ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor |
|
||||
ControlStyles.UserPaint, true);
|
||||
BackColor = Color.Transparent;
|
||||
ForeColor = Color.Black;
|
||||
Font = new System.Drawing.Font("Comic Sans MS", 10, FontStyle.Bold);
|
||||
state = MouseState.Leave;
|
||||
Transparency = false;
|
||||
}
|
||||
#endregion
|
||||
#region Events
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
#region Transparency
|
||||
if (Transparency)
|
||||
{
|
||||
Transparenter.MakeTransparent(this, e.Graphics);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Drawing
|
||||
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
|
||||
roundedRect = new RoundedRectangleF(Width, Height, radius);
|
||||
e.Graphics.FillRectangle(Brushes.Transparent, ClientRectangle);
|
||||
|
||||
int R1 = (active1.R + inactive1.R) / 2;
|
||||
int G1 = (active1.G + inactive1.G) / 2;
|
||||
int B1 = (active1.B + inactive1.B) / 2;
|
||||
|
||||
int R2 = (active2.R + inactive2.R) / 2;
|
||||
int G2 = (active2.G + inactive2.G) / 2;
|
||||
int B2 = (active2.B + inactive2.B) / 2;
|
||||
|
||||
Rectangle rect = new Rectangle(0, 0, Width, Height);
|
||||
|
||||
if (Enabled)
|
||||
{
|
||||
if (state == MouseState.Leave)
|
||||
{
|
||||
using (LinearGradientBrush inactiveGB = new LinearGradientBrush(rect, inactive1, inactive2, 90f))
|
||||
{
|
||||
e.Graphics.FillPath(inactiveGB, roundedRect.Path);
|
||||
}
|
||||
}
|
||||
else if (state == MouseState.Enter)
|
||||
{
|
||||
using (LinearGradientBrush activeGB = new LinearGradientBrush(rect, active1, active2, 90f))
|
||||
{
|
||||
e.Graphics.FillPath(activeGB, roundedRect.Path);
|
||||
}
|
||||
}
|
||||
else if (state == MouseState.Down)
|
||||
{
|
||||
using (LinearGradientBrush downGB = new LinearGradientBrush(rect, Color.FromArgb(R1, G1, B1), Color.FromArgb(R2, G2, B2), 90f))
|
||||
{
|
||||
e.Graphics.FillPath(downGB, roundedRect.Path);
|
||||
}
|
||||
}
|
||||
|
||||
if (stroke)
|
||||
{
|
||||
using (Pen pen = new Pen(strokeColor, 1))
|
||||
using (GraphicsPath path = new RoundedRectangleF(Width - (radius > 0 ? 0 : 1), Height - (radius > 0 ? 0 : 1), radius).Path)
|
||||
{
|
||||
e.Graphics.DrawPath(pen, path);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Color linear1 = Color.FromArgb(190, 190, 190);
|
||||
Color linear2 = Color.FromArgb(210, 210, 210);
|
||||
using (LinearGradientBrush inactiveGB = new LinearGradientBrush(rect, linear1, linear2, 90f))
|
||||
{
|
||||
e.Graphics.FillPath(inactiveGB, roundedRect.Path);
|
||||
e.Graphics.DrawPath(new Pen(inactiveGB), roundedRect.Path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Text Drawing
|
||||
using (StringFormat sf = new StringFormat()
|
||||
{
|
||||
LineAlignment = StringAlignment.Center,
|
||||
Alignment = StringAlignment.Center,
|
||||
})
|
||||
using (Brush brush = new SolidBrush(ForeColor))
|
||||
{
|
||||
e.Graphics.DrawString(Text, Font, brush, ClientRectangle, sf);
|
||||
}
|
||||
#endregion
|
||||
base.OnPaint(e);
|
||||
}
|
||||
|
||||
protected override void OnMouseDoubleClick(MouseEventArgs e)
|
||||
{
|
||||
base.OnMouseDoubleClick(e);
|
||||
base.OnClick(e);
|
||||
}
|
||||
protected override void OnClick(EventArgs e)
|
||||
{
|
||||
base.OnClick(e);
|
||||
}
|
||||
protected override void OnEnabledChanged(EventArgs e)
|
||||
{
|
||||
Invalidate();
|
||||
base.OnEnabledChanged(e);
|
||||
}
|
||||
protected override void OnResize(EventArgs e)
|
||||
{
|
||||
Invalidate();
|
||||
base.OnResize(e);
|
||||
}
|
||||
protected override void OnMouseEnter(EventArgs e)
|
||||
{
|
||||
state = MouseState.Enter;
|
||||
base.OnMouseEnter(e);
|
||||
Invalidate();
|
||||
}
|
||||
protected override void OnMouseLeave(EventArgs e)
|
||||
{
|
||||
state = MouseState.Leave;
|
||||
base.OnMouseLeave(e);
|
||||
Invalidate();
|
||||
}
|
||||
protected override void OnMouseDown(MouseEventArgs e)
|
||||
{
|
||||
Capture = false;
|
||||
state = MouseState.Down;
|
||||
base.OnMouseDown(e);
|
||||
Invalidate();
|
||||
}
|
||||
protected override void OnMouseUp(MouseEventArgs e)
|
||||
{
|
||||
if (state != MouseState.Leave)
|
||||
{
|
||||
state = MouseState.Enter;
|
||||
}
|
||||
|
||||
base.OnMouseUp(e);
|
||||
Invalidate();
|
||||
}
|
||||
#endregion
|
||||
#region Properties
|
||||
|
||||
|
||||
public int Radius
|
||||
{
|
||||
get => radius;
|
||||
set
|
||||
{
|
||||
radius = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
public Color Inactive1
|
||||
{
|
||||
get => inactive1;
|
||||
set
|
||||
{
|
||||
inactive1 = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
public Color Inactive2
|
||||
{
|
||||
get => inactive2;
|
||||
set
|
||||
{
|
||||
inactive2 = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
public Color Active1
|
||||
{
|
||||
get => active1;
|
||||
set
|
||||
{
|
||||
active1 = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
public Color Active2
|
||||
{
|
||||
get => active2;
|
||||
set
|
||||
{
|
||||
active2 = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
public bool Transparency { get; set; }
|
||||
public override string Text
|
||||
{
|
||||
get => base.Text;
|
||||
set
|
||||
{
|
||||
base.Text = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
public override Color ForeColor
|
||||
{
|
||||
get => base.ForeColor;
|
||||
set
|
||||
{
|
||||
base.ForeColor = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public DialogResult DialogResult
|
||||
{
|
||||
get => System.Windows.Forms.DialogResult.OK;
|
||||
set
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public void NotifyDefault(bool value)
|
||||
{
|
||||
}
|
||||
|
||||
public void PerformClick()
|
||||
{
|
||||
OnClick(EventArgs.Empty);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
public enum MouseState
|
||||
{
|
||||
Enter,
|
||||
Leave,
|
||||
Down,
|
||||
Up,
|
||||
}
|
||||
|
||||
}
|
||||
48
RoundedRectangleF.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public class RoundedRectangleF
|
||||
{
|
||||
private Point location;
|
||||
private readonly float x, y;
|
||||
private readonly float width, height;
|
||||
|
||||
|
||||
public RoundedRectangleF(float width, float height, float radius, float x = 0, float y = 0)
|
||||
{
|
||||
|
||||
location = new Point(0, 0);
|
||||
Radius = radius;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
Path = new GraphicsPath();
|
||||
if (radius <= 0)
|
||||
{
|
||||
Path.AddRectangle(new RectangleF(x, y, width, height));
|
||||
return;
|
||||
}
|
||||
RectangleF upperLeftRect = new RectangleF(x, y, 2 * radius, 2 * radius);
|
||||
RectangleF upperRightRect = new RectangleF(width - (2 * radius) - 1, x, 2 * radius, 2 * radius);
|
||||
RectangleF lowerLeftRect = new RectangleF(x, height - (2 * radius) - 1, 2 * radius, 2 * radius);
|
||||
RectangleF lowerRightRect = new RectangleF(width - (2 * radius) - 1, height - (2 * radius) - 1, 2 * radius, 2 * radius);
|
||||
|
||||
Path.AddArc(upperLeftRect, 180, 90);
|
||||
Path.AddArc(upperRightRect, 270, 90);
|
||||
Path.AddArc(lowerRightRect, 0, 90);
|
||||
Path.AddArc(lowerLeftRect, 90, 90);
|
||||
Path.CloseAllFigures();
|
||||
|
||||
}
|
||||
public RoundedRectangleF()
|
||||
{
|
||||
}
|
||||
public GraphicsPath Path { get; }
|
||||
public RectangleF Rect => new RectangleF(x, y, width, height);
|
||||
public float Radius { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -14,19 +14,18 @@ namespace AndroidSideloader
|
||||
{
|
||||
private string _initialDirectory;
|
||||
private string _title;
|
||||
private string _fileName = "";
|
||||
|
||||
public string InitialDirectory
|
||||
{
|
||||
get { return string.IsNullOrEmpty(_initialDirectory) ? Environment.CurrentDirectory : _initialDirectory; }
|
||||
set { _initialDirectory = value; }
|
||||
get => string.IsNullOrEmpty(_initialDirectory) ? Environment.CurrentDirectory : _initialDirectory;
|
||||
set => _initialDirectory = value;
|
||||
}
|
||||
public string Title
|
||||
{
|
||||
get { return _title ?? "Select a folder"; }
|
||||
set { _title = value; }
|
||||
get => _title ?? "Select a folder";
|
||||
set => _title = value;
|
||||
}
|
||||
public string FileName { get { return _fileName; } }
|
||||
public string FileName { get; private set; } = "";
|
||||
|
||||
public bool Show() { return Show(IntPtr.Zero); }
|
||||
|
||||
@@ -34,10 +33,10 @@ namespace AndroidSideloader
|
||||
/// <returns>true if the user clicks OK</returns>
|
||||
public bool Show(IntPtr hWndOwner)
|
||||
{
|
||||
var result = Environment.OSVersion.Version.Major >= 6
|
||||
ShowDialogResult result = Environment.OSVersion.Version.Major >= 6
|
||||
? VistaDialog.Show(hWndOwner, InitialDirectory, Title)
|
||||
: ShowXpDialog(hWndOwner, InitialDirectory, Title);
|
||||
_fileName = result.FileName;
|
||||
FileName = result.FileName;
|
||||
return result.Result;
|
||||
}
|
||||
|
||||
@@ -49,13 +48,13 @@ namespace AndroidSideloader
|
||||
|
||||
private static ShowDialogResult ShowXpDialog(IntPtr ownerHandle, string initialDirectory, string title)
|
||||
{
|
||||
var folderBrowserDialog = new FolderBrowserDialog
|
||||
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog
|
||||
{
|
||||
Description = title,
|
||||
SelectedPath = initialDirectory,
|
||||
ShowNewFolderButton = false
|
||||
};
|
||||
var dialogResult = new ShowDialogResult();
|
||||
ShowDialogResult dialogResult = new ShowDialogResult();
|
||||
if (folderBrowserDialog.ShowDialog(new WindowWrapper(ownerHandle)) == DialogResult.OK)
|
||||
{
|
||||
dialogResult.Result = true;
|
||||
@@ -69,26 +68,26 @@ namespace AndroidSideloader
|
||||
private const string c_foldersFilter = "Folders|\n";
|
||||
|
||||
private const BindingFlags c_flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
|
||||
private readonly static Assembly s_windowsFormsAssembly = typeof(FileDialog).Assembly;
|
||||
private readonly static Type s_iFileDialogType = s_windowsFormsAssembly.GetType("System.Windows.Forms.FileDialogNative+IFileDialog");
|
||||
private readonly static MethodInfo s_createVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("CreateVistaDialog", c_flags);
|
||||
private readonly static MethodInfo s_onBeforeVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("OnBeforeVistaDialog", c_flags);
|
||||
private readonly static MethodInfo s_getOptionsMethodInfo = typeof(FileDialog).GetMethod("GetOptions", c_flags);
|
||||
private readonly static MethodInfo s_setOptionsMethodInfo = s_iFileDialogType.GetMethod("SetOptions", c_flags);
|
||||
private readonly static uint s_fosPickFoldersBitFlag = (uint)s_windowsFormsAssembly
|
||||
private static readonly Assembly s_windowsFormsAssembly = typeof(FileDialog).Assembly;
|
||||
private static readonly Type s_iFileDialogType = s_windowsFormsAssembly.GetType("System.Windows.Forms.FileDialogNative+IFileDialog");
|
||||
private static readonly MethodInfo s_createVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("CreateVistaDialog", c_flags);
|
||||
private static readonly MethodInfo s_onBeforeVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("OnBeforeVistaDialog", c_flags);
|
||||
private static readonly MethodInfo s_getOptionsMethodInfo = typeof(FileDialog).GetMethod("GetOptions", c_flags);
|
||||
private static readonly MethodInfo s_setOptionsMethodInfo = s_iFileDialogType.GetMethod("SetOptions", c_flags);
|
||||
private static readonly uint s_fosPickFoldersBitFlag = (uint)s_windowsFormsAssembly
|
||||
.GetType("System.Windows.Forms.FileDialogNative+FOS")
|
||||
.GetField("FOS_PICKFOLDERS")
|
||||
.GetValue(null);
|
||||
private readonly static ConstructorInfo s_vistaDialogEventsConstructorInfo = s_windowsFormsAssembly
|
||||
private static readonly ConstructorInfo s_vistaDialogEventsConstructorInfo = s_windowsFormsAssembly
|
||||
.GetType("System.Windows.Forms.FileDialog+VistaDialogEvents")
|
||||
.GetConstructor(c_flags, null, new[] { typeof(FileDialog) }, null);
|
||||
private readonly static MethodInfo s_adviseMethodInfo = s_iFileDialogType.GetMethod("Advise");
|
||||
private readonly static MethodInfo s_unAdviseMethodInfo = s_iFileDialogType.GetMethod("Unadvise");
|
||||
private readonly static MethodInfo s_showMethodInfo = s_iFileDialogType.GetMethod("Show");
|
||||
private static readonly MethodInfo s_adviseMethodInfo = s_iFileDialogType.GetMethod("Advise");
|
||||
private static readonly MethodInfo s_unAdviseMethodInfo = s_iFileDialogType.GetMethod("Unadvise");
|
||||
private static readonly MethodInfo s_showMethodInfo = s_iFileDialogType.GetMethod("Show");
|
||||
|
||||
public static ShowDialogResult Show(IntPtr ownerHandle, string initialDirectory, string title)
|
||||
{
|
||||
var openFileDialog = new OpenFileDialog
|
||||
OpenFileDialog openFileDialog = new OpenFileDialog
|
||||
{
|
||||
AddExtension = false,
|
||||
CheckFileExists = false,
|
||||
@@ -99,11 +98,11 @@ namespace AndroidSideloader
|
||||
Title = title
|
||||
};
|
||||
|
||||
var iFileDialog = s_createVistaDialogMethodInfo.Invoke(openFileDialog, new object[] { });
|
||||
s_onBeforeVistaDialogMethodInfo.Invoke(openFileDialog, new[] { iFileDialog });
|
||||
s_setOptionsMethodInfo.Invoke(iFileDialog, new object[] { (uint)s_getOptionsMethodInfo.Invoke(openFileDialog, new object[] { }) | s_fosPickFoldersBitFlag });
|
||||
var adviseParametersWithOutputConnectionToken = new[] { s_vistaDialogEventsConstructorInfo.Invoke(new object[] { openFileDialog }), 0U };
|
||||
s_adviseMethodInfo.Invoke(iFileDialog, adviseParametersWithOutputConnectionToken);
|
||||
object iFileDialog = s_createVistaDialogMethodInfo.Invoke(openFileDialog, new object[] { });
|
||||
_ = s_onBeforeVistaDialogMethodInfo.Invoke(openFileDialog, new[] { iFileDialog });
|
||||
_ = s_setOptionsMethodInfo.Invoke(iFileDialog, new object[] { (uint)s_getOptionsMethodInfo.Invoke(openFileDialog, new object[] { }) | s_fosPickFoldersBitFlag });
|
||||
object[] adviseParametersWithOutputConnectionToken = new[] { s_vistaDialogEventsConstructorInfo.Invoke(new object[] { openFileDialog }), 0U };
|
||||
_ = s_adviseMethodInfo.Invoke(iFileDialog, adviseParametersWithOutputConnectionToken);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -116,7 +115,7 @@ namespace AndroidSideloader
|
||||
}
|
||||
finally
|
||||
{
|
||||
s_unAdviseMethodInfo.Invoke(iFileDialog, new[] { adviseParametersWithOutputConnectionToken[1] });
|
||||
_ = s_unAdviseMethodInfo.Invoke(iFileDialog, new[] { adviseParametersWithOutputConnectionToken[1] });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -124,9 +123,8 @@ namespace AndroidSideloader
|
||||
// Wrap an IWin32Window around an IntPtr
|
||||
private class WindowWrapper : IWin32Window
|
||||
{
|
||||
private readonly IntPtr _handle;
|
||||
public WindowWrapper(IntPtr handle) { _handle = handle; }
|
||||
public IntPtr Handle { get { return _handle; } }
|
||||
public WindowWrapper(IntPtr handle) { Handle = handle; }
|
||||
public IntPtr Handle { get; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
957
SettingsForm.Designer.cs
generated
@@ -1,402 +1,555 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class SettingsForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.checkForUpdatesCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.applyButton = new System.Windows.Forms.Button();
|
||||
this.enableMessageBoxesCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.resetSettingsButton = new System.Windows.Forms.Button();
|
||||
this.deleteAfterInstallCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.updateConfigCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.userJsonOnGameInstall = new System.Windows.Forms.CheckBox();
|
||||
this.BandwithTextbox = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.BandwithComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.DebugLogCopy = new System.Windows.Forms.Button();
|
||||
this.crashlogID = new System.Windows.Forms.Label();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.debuglogID = new System.Windows.Forms.Label();
|
||||
this.DebugID = new System.Windows.Forms.TextBox();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.CblindBox = new System.Windows.Forms.CheckBox();
|
||||
this.nodevicemodeBox = new System.Windows.Forms.CheckBox();
|
||||
this.bmbfBox = new System.Windows.Forms.CheckBox();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// checkForUpdatesCheckBox
|
||||
//
|
||||
this.checkForUpdatesCheckBox.AutoSize = true;
|
||||
this.checkForUpdatesCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkForUpdatesCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.checkForUpdatesCheckBox.Location = new System.Drawing.Point(12, 12);
|
||||
this.checkForUpdatesCheckBox.Name = "checkForUpdatesCheckBox";
|
||||
this.checkForUpdatesCheckBox.Size = new System.Drawing.Size(148, 22);
|
||||
this.checkForUpdatesCheckBox.TabIndex = 0;
|
||||
this.checkForUpdatesCheckBox.Text = "Check for updates";
|
||||
this.checkForUpdatesCheckBox.UseVisualStyleBackColor = true;
|
||||
this.checkForUpdatesCheckBox.CheckedChanged += new System.EventHandler(this.checkForUpdatesCheckBox_CheckedChanged);
|
||||
//
|
||||
// applyButton
|
||||
//
|
||||
this.applyButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.applyButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.applyButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.applyButton.Location = new System.Drawing.Point(67, 280);
|
||||
this.applyButton.Name = "applyButton";
|
||||
this.applyButton.Size = new System.Drawing.Size(101, 31);
|
||||
this.applyButton.TabIndex = 5;
|
||||
this.applyButton.Text = "Apply";
|
||||
this.applyButton.UseVisualStyleBackColor = false;
|
||||
this.applyButton.Click += new System.EventHandler(this.applyButton_Click);
|
||||
//
|
||||
// enableMessageBoxesCheckBox
|
||||
//
|
||||
this.enableMessageBoxesCheckBox.AutoSize = true;
|
||||
this.enableMessageBoxesCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.enableMessageBoxesCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.enableMessageBoxesCheckBox.Location = new System.Drawing.Point(12, 39);
|
||||
this.enableMessageBoxesCheckBox.Name = "enableMessageBoxesCheckBox";
|
||||
this.enableMessageBoxesCheckBox.Size = new System.Drawing.Size(309, 22);
|
||||
this.enableMessageBoxesCheckBox.TabIndex = 1;
|
||||
this.enableMessageBoxesCheckBox.Text = "Enable Message Boxes on task completed";
|
||||
this.enableMessageBoxesCheckBox.UseVisualStyleBackColor = true;
|
||||
this.enableMessageBoxesCheckBox.CheckedChanged += new System.EventHandler(this.enableMessageBoxesCheckBox_CheckedChanged);
|
||||
//
|
||||
// resetSettingsButton
|
||||
//
|
||||
this.resetSettingsButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.resetSettingsButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.resetSettingsButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.resetSettingsButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.resetSettingsButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.resetSettingsButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.resetSettingsButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.resetSettingsButton.Location = new System.Drawing.Point(174, 280);
|
||||
this.resetSettingsButton.Name = "resetSettingsButton";
|
||||
this.resetSettingsButton.Size = new System.Drawing.Size(101, 31);
|
||||
this.resetSettingsButton.TabIndex = 4;
|
||||
this.resetSettingsButton.Text = "Reset Settings";
|
||||
this.resetSettingsButton.UseVisualStyleBackColor = false;
|
||||
this.resetSettingsButton.Click += new System.EventHandler(this.resetSettingsButton_Click);
|
||||
//
|
||||
// deleteAfterInstallCheckBox
|
||||
//
|
||||
this.deleteAfterInstallCheckBox.AutoSize = true;
|
||||
this.deleteAfterInstallCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.deleteAfterInstallCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.deleteAfterInstallCheckBox.Location = new System.Drawing.Point(12, 65);
|
||||
this.deleteAfterInstallCheckBox.Name = "deleteAfterInstallCheckBox";
|
||||
this.deleteAfterInstallCheckBox.Size = new System.Drawing.Size(288, 22);
|
||||
this.deleteAfterInstallCheckBox.TabIndex = 3;
|
||||
this.deleteAfterInstallCheckBox.Text = "Delete games after download and install";
|
||||
this.deleteAfterInstallCheckBox.UseVisualStyleBackColor = true;
|
||||
this.deleteAfterInstallCheckBox.CheckedChanged += new System.EventHandler(this.deleteAfterInstallCheckBox_CheckedChanged);
|
||||
//
|
||||
// updateConfigCheckBox
|
||||
//
|
||||
this.updateConfigCheckBox.AutoSize = true;
|
||||
this.updateConfigCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.updateConfigCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.updateConfigCheckBox.Location = new System.Drawing.Point(12, 92);
|
||||
this.updateConfigCheckBox.Name = "updateConfigCheckBox";
|
||||
this.updateConfigCheckBox.Size = new System.Drawing.Size(208, 22);
|
||||
this.updateConfigCheckBox.TabIndex = 6;
|
||||
this.updateConfigCheckBox.Text = "Update config automatically";
|
||||
this.updateConfigCheckBox.UseVisualStyleBackColor = true;
|
||||
this.updateConfigCheckBox.CheckedChanged += new System.EventHandler(this.updateConfigCheckBox_CheckedChanged);
|
||||
//
|
||||
// userJsonOnGameInstall
|
||||
//
|
||||
this.userJsonOnGameInstall.AutoSize = true;
|
||||
this.userJsonOnGameInstall.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.userJsonOnGameInstall.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.userJsonOnGameInstall.Location = new System.Drawing.Point(12, 119);
|
||||
this.userJsonOnGameInstall.Name = "userJsonOnGameInstall";
|
||||
this.userJsonOnGameInstall.Size = new System.Drawing.Size(243, 22);
|
||||
this.userJsonOnGameInstall.TabIndex = 9;
|
||||
this.userJsonOnGameInstall.Text = "Push random user.json on install";
|
||||
this.userJsonOnGameInstall.UseVisualStyleBackColor = true;
|
||||
this.userJsonOnGameInstall.CheckedChanged += new System.EventHandler(this.userJsonOnGameInstall_CheckedChanged);
|
||||
//
|
||||
// BandwithTextbox
|
||||
//
|
||||
this.BandwithTextbox.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
|
||||
this.BandwithTextbox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithTextbox.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithTextbox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithTextbox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.BandwithTextbox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.BandwithTextbox.Location = new System.Drawing.Point(52, 248);
|
||||
this.BandwithTextbox.Name = "BandwithTextbox";
|
||||
this.BandwithTextbox.Size = new System.Drawing.Size(177, 24);
|
||||
this.BandwithTextbox.TabIndex = 11;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.label1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.label1.Location = new System.Drawing.Point(40, 225);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(245, 18);
|
||||
this.label1.TabIndex = 12;
|
||||
this.label1.Text = "Download speed limiter, 0 to disable";
|
||||
//
|
||||
// BandwithComboBox
|
||||
//
|
||||
this.BandwithComboBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.ComboBoxColor;
|
||||
this.BandwithComboBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithComboBox.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithComboBox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "ComboBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithComboBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.BandwithComboBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.BandwithComboBox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.BandwithComboBox.FormattingEnabled = true;
|
||||
this.BandwithComboBox.Items.AddRange(new object[] {
|
||||
"B",
|
||||
"K",
|
||||
"M",
|
||||
"G"});
|
||||
this.BandwithComboBox.Location = new System.Drawing.Point(235, 248);
|
||||
this.BandwithComboBox.Name = "BandwithComboBox";
|
||||
this.BandwithComboBox.Size = new System.Drawing.Size(55, 26);
|
||||
this.BandwithComboBox.TabIndex = 13;
|
||||
//
|
||||
// DebugLogCopy
|
||||
//
|
||||
this.DebugLogCopy.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.DebugLogCopy.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DebugLogCopy.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DebugLogCopy.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.DebugLogCopy.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.DebugLogCopy.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.DebugLogCopy.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.DebugLogCopy.Location = new System.Drawing.Point(29, 325);
|
||||
this.DebugLogCopy.Name = "DebugLogCopy";
|
||||
this.DebugLogCopy.Size = new System.Drawing.Size(285, 31);
|
||||
this.DebugLogCopy.TabIndex = 5;
|
||||
this.DebugLogCopy.Text = "Send DebugLog to server.";
|
||||
this.DebugLogCopy.UseVisualStyleBackColor = false;
|
||||
this.DebugLogCopy.Click += new System.EventHandler(this.DebugLogCopy_click);
|
||||
//
|
||||
// crashlogID
|
||||
//
|
||||
this.crashlogID.AutoSize = true;
|
||||
this.crashlogID.Location = new System.Drawing.Point(13, 441);
|
||||
this.crashlogID.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||
this.crashlogID.Name = "crashlogID";
|
||||
this.crashlogID.Size = new System.Drawing.Size(0, 13);
|
||||
this.crashlogID.TabIndex = 15;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.button1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.button1.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.button1.Location = new System.Drawing.Point(29, 360);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(285, 31);
|
||||
this.button1.TabIndex = 5;
|
||||
this.button1.Text = "Reset Debug Log";
|
||||
this.button1.UseVisualStyleBackColor = false;
|
||||
this.button1.Click += new System.EventHandler(this.button1_click);
|
||||
//
|
||||
// debuglogID
|
||||
//
|
||||
this.debuglogID.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F);
|
||||
this.debuglogID.Location = new System.Drawing.Point(29, 436);
|
||||
this.debuglogID.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||
this.debuglogID.Name = "debuglogID";
|
||||
this.debuglogID.Size = new System.Drawing.Size(285, 48);
|
||||
this.debuglogID.TabIndex = 14;
|
||||
this.debuglogID.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// DebugID
|
||||
//
|
||||
this.DebugID.AccessibleRole = System.Windows.Forms.AccessibleRole.Row;
|
||||
this.DebugID.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(45)))));
|
||||
this.DebugID.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.DebugID.Cursor = System.Windows.Forms.Cursors.Default;
|
||||
this.DebugID.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold);
|
||||
this.DebugID.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
||||
this.DebugID.Location = new System.Drawing.Point(29, 407);
|
||||
this.DebugID.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.DebugID.Name = "DebugID";
|
||||
this.DebugID.ReadOnly = true;
|
||||
this.DebugID.ScrollBars = System.Windows.Forms.ScrollBars.Horizontal;
|
||||
this.DebugID.Size = new System.Drawing.Size(285, 21);
|
||||
this.DebugID.TabIndex = 16;
|
||||
this.DebugID.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
this.DebugID.Click += new System.EventHandler(this.DebugID_Click);
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F);
|
||||
this.label2.Location = new System.Drawing.Point(29, 507);
|
||||
this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(284, 86);
|
||||
this.label2.TabIndex = 14;
|
||||
this.label2.Text = "This is your most recent CrashLogID. Click on the CrashLogID to copy it to your c" +
|
||||
"lipboard.";
|
||||
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.AccessibleRole = System.Windows.Forms.AccessibleRole.Row;
|
||||
this.textBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(45)))));
|
||||
this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.textBox1.Cursor = System.Windows.Forms.Cursors.Default;
|
||||
this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold);
|
||||
this.textBox1.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
||||
this.textBox1.Location = new System.Drawing.Point(29, 490);
|
||||
this.textBox1.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.ReadOnly = true;
|
||||
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Horizontal;
|
||||
this.textBox1.Size = new System.Drawing.Size(285, 21);
|
||||
this.textBox1.TabIndex = 16;
|
||||
this.textBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
this.textBox1.Click += new System.EventHandler(this.textBox1_Click);
|
||||
//
|
||||
// CblindBox
|
||||
//
|
||||
this.CblindBox.AutoSize = true;
|
||||
this.CblindBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.CblindBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.CblindBox.Location = new System.Drawing.Point(12, 145);
|
||||
this.CblindBox.Name = "CblindBox";
|
||||
this.CblindBox.Size = new System.Drawing.Size(182, 22);
|
||||
this.CblindBox.TabIndex = 9;
|
||||
this.CblindBox.Text = "Enable colorblind mode";
|
||||
this.CblindBox.UseVisualStyleBackColor = true;
|
||||
this.CblindBox.CheckedChanged += new System.EventHandler(this.CblindBox_CheckedChanged);
|
||||
this.CblindBox.Click += new System.EventHandler(this.CblindBox_Click);
|
||||
//
|
||||
// nodevicemodeBox
|
||||
//
|
||||
this.nodevicemodeBox.AutoSize = true;
|
||||
this.nodevicemodeBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.nodevicemodeBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.nodevicemodeBox.Location = new System.Drawing.Point(12, 196);
|
||||
this.nodevicemodeBox.Name = "nodevicemodeBox";
|
||||
this.nodevicemodeBox.Size = new System.Drawing.Size(181, 22);
|
||||
this.nodevicemodeBox.TabIndex = 9;
|
||||
this.nodevicemodeBox.Text = "Enable no device mode";
|
||||
this.nodevicemodeBox.UseVisualStyleBackColor = true;
|
||||
this.nodevicemodeBox.CheckedChanged += new System.EventHandler(this.nodevicemodeBox_CheckedChanged);
|
||||
//
|
||||
// bmbfBox
|
||||
//
|
||||
this.bmbfBox.AutoSize = true;
|
||||
this.bmbfBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.bmbfBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.bmbfBox.Location = new System.Drawing.Point(12, 170);
|
||||
this.bmbfBox.Name = "bmbfBox";
|
||||
this.bmbfBox.Size = new System.Drawing.Size(281, 22);
|
||||
this.bmbfBox.TabIndex = 9;
|
||||
this.bmbfBox.Text = "Enable BMBF song zips drag and drop";
|
||||
this.bmbfBox.UseVisualStyleBackColor = true;
|
||||
this.bmbfBox.CheckedChanged += new System.EventHandler(this.bmbfBox_CheckedChanged);
|
||||
//
|
||||
// SettingsForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.ClientSize = new System.Drawing.Size(342, 606);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.Controls.Add(this.DebugID);
|
||||
this.Controls.Add(this.crashlogID);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.debuglogID);
|
||||
this.Controls.Add(this.BandwithComboBox);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.BandwithTextbox);
|
||||
this.Controls.Add(this.bmbfBox);
|
||||
this.Controls.Add(this.nodevicemodeBox);
|
||||
this.Controls.Add(this.CblindBox);
|
||||
this.Controls.Add(this.userJsonOnGameInstall);
|
||||
this.Controls.Add(this.updateConfigCheckBox);
|
||||
this.Controls.Add(this.deleteAfterInstallCheckBox);
|
||||
this.Controls.Add(this.enableMessageBoxesCheckBox);
|
||||
this.Controls.Add(this.button1);
|
||||
this.Controls.Add(this.DebugLogCopy);
|
||||
this.Controls.Add(this.applyButton);
|
||||
this.Controls.Add(this.checkForUpdatesCheckBox);
|
||||
this.Controls.Add(this.resetSettingsButton);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ForeColor = System.Drawing.Color.White;
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.MaximizeBox = false;
|
||||
this.Name = "SettingsForm";
|
||||
this.ShowIcon = false;
|
||||
this.Text = "Settings";
|
||||
this.TopMost = true;
|
||||
this.Load += new System.EventHandler(this.SettingsForm_Load);
|
||||
this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.SettingsForm_KeyPress);
|
||||
this.Leave += new System.EventHandler(this.SettingsForm_Leave);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.CheckBox checkForUpdatesCheckBox;
|
||||
private System.Windows.Forms.Button applyButton;
|
||||
private System.Windows.Forms.CheckBox enableMessageBoxesCheckBox;
|
||||
private System.Windows.Forms.Button resetSettingsButton;
|
||||
private System.Windows.Forms.CheckBox deleteAfterInstallCheckBox;
|
||||
private System.Windows.Forms.CheckBox updateConfigCheckBox;
|
||||
private System.Windows.Forms.CheckBox userJsonOnGameInstall;
|
||||
private System.Windows.Forms.TextBox BandwithTextbox;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.ComboBox BandwithComboBox;
|
||||
private System.Windows.Forms.Button DebugLogCopy;
|
||||
private System.Windows.Forms.Label crashlogID;
|
||||
private System.Windows.Forms.Button button1;
|
||||
public System.Windows.Forms.Label debuglogID;
|
||||
private System.Windows.Forms.TextBox DebugID;
|
||||
public System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
private System.Windows.Forms.CheckBox CblindBox;
|
||||
private System.Windows.Forms.CheckBox nodevicemodeBox;
|
||||
private System.Windows.Forms.CheckBox bmbfBox;
|
||||
}
|
||||
}
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class SettingsForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SettingsForm));
|
||||
this.checkForUpdatesCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.enableMessageBoxesCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.deleteAfterInstallCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.updateConfigCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.userJsonOnGameInstall = new System.Windows.Forms.CheckBox();
|
||||
this.crashlogID = new System.Windows.Forms.Label();
|
||||
this.nodevicemodeBox = new System.Windows.Forms.CheckBox();
|
||||
this.bmbfBox = new System.Windows.Forms.CheckBox();
|
||||
this.AutoReinstBox = new System.Windows.Forms.CheckBox();
|
||||
this.trailersOn = new System.Windows.Forms.CheckBox();
|
||||
this.downloadDirectorySetter = new System.Windows.Forms.FolderBrowserDialog();
|
||||
this.backupDirectorySetter = new System.Windows.Forms.FolderBrowserDialog();
|
||||
this.chkSingleThread = new System.Windows.Forms.CheckBox();
|
||||
this.setBackupDirectory = new AndroidSideloader.RoundButton();
|
||||
this.setDownloadDirectory = new AndroidSideloader.RoundButton();
|
||||
this.btnOpenDebug = new AndroidSideloader.RoundButton();
|
||||
this.btnResetDebug = new AndroidSideloader.RoundButton();
|
||||
this.btnUploadDebug = new AndroidSideloader.RoundButton();
|
||||
this.resetSettingsButton = new AndroidSideloader.RoundButton();
|
||||
this.applyButton = new AndroidSideloader.RoundButton();
|
||||
this.virtualFilesystemCompatibilityCheckbox = new System.Windows.Forms.CheckBox();
|
||||
this.openBackupDirectory = new AndroidSideloader.RoundButton();
|
||||
this.openDownloadDirectory = new AndroidSideloader.RoundButton();
|
||||
this.chkUseDownloadedFiles = new System.Windows.Forms.CheckBox();
|
||||
this.bandwidthLabel = new System.Windows.Forms.Label();
|
||||
this.bandwidthLimitTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// checkForUpdatesCheckBox
|
||||
//
|
||||
this.checkForUpdatesCheckBox.AutoSize = true;
|
||||
this.checkForUpdatesCheckBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.checkForUpdatesCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkForUpdatesCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.checkForUpdatesCheckBox.Location = new System.Drawing.Point(13, 11);
|
||||
this.checkForUpdatesCheckBox.Name = "checkForUpdatesCheckBox";
|
||||
this.checkForUpdatesCheckBox.Size = new System.Drawing.Size(226, 22);
|
||||
this.checkForUpdatesCheckBox.TabIndex = 0;
|
||||
this.checkForUpdatesCheckBox.Text = "Check for Application Updates";
|
||||
this.checkForUpdatesCheckBox.UseVisualStyleBackColor = false;
|
||||
this.checkForUpdatesCheckBox.CheckedChanged += new System.EventHandler(this.checkForUpdatesCheckBox_CheckedChanged);
|
||||
//
|
||||
// enableMessageBoxesCheckBox
|
||||
//
|
||||
this.enableMessageBoxesCheckBox.AutoSize = true;
|
||||
this.enableMessageBoxesCheckBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.enableMessageBoxesCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.enableMessageBoxesCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.enableMessageBoxesCheckBox.Location = new System.Drawing.Point(13, 227);
|
||||
this.enableMessageBoxesCheckBox.Name = "enableMessageBoxesCheckBox";
|
||||
this.enableMessageBoxesCheckBox.Size = new System.Drawing.Size(309, 22);
|
||||
this.enableMessageBoxesCheckBox.TabIndex = 1;
|
||||
this.enableMessageBoxesCheckBox.Text = "Enable Message Boxes on task completed";
|
||||
this.enableMessageBoxesCheckBox.UseVisualStyleBackColor = false;
|
||||
this.enableMessageBoxesCheckBox.CheckedChanged += new System.EventHandler(this.enableMessageBoxesCheckBox_CheckedChanged);
|
||||
//
|
||||
// deleteAfterInstallCheckBox
|
||||
//
|
||||
this.deleteAfterInstallCheckBox.AutoSize = true;
|
||||
this.deleteAfterInstallCheckBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.deleteAfterInstallCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.deleteAfterInstallCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.deleteAfterInstallCheckBox.Location = new System.Drawing.Point(13, 92);
|
||||
this.deleteAfterInstallCheckBox.Name = "deleteAfterInstallCheckBox";
|
||||
this.deleteAfterInstallCheckBox.Size = new System.Drawing.Size(288, 22);
|
||||
this.deleteAfterInstallCheckBox.TabIndex = 3;
|
||||
this.deleteAfterInstallCheckBox.Text = "Delete games after download and install";
|
||||
this.deleteAfterInstallCheckBox.UseVisualStyleBackColor = false;
|
||||
this.deleteAfterInstallCheckBox.CheckedChanged += new System.EventHandler(this.deleteAfterInstallCheckBox_CheckedChanged);
|
||||
//
|
||||
// updateConfigCheckBox
|
||||
//
|
||||
this.updateConfigCheckBox.AutoSize = true;
|
||||
this.updateConfigCheckBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.updateConfigCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.updateConfigCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.updateConfigCheckBox.Location = new System.Drawing.Point(13, 38);
|
||||
this.updateConfigCheckBox.Name = "updateConfigCheckBox";
|
||||
this.updateConfigCheckBox.Size = new System.Drawing.Size(256, 22);
|
||||
this.updateConfigCheckBox.TabIndex = 6;
|
||||
this.updateConfigCheckBox.Text = "Update Public Config Automatically";
|
||||
this.updateConfigCheckBox.UseVisualStyleBackColor = false;
|
||||
this.updateConfigCheckBox.CheckedChanged += new System.EventHandler(this.updateConfigCheckBox_CheckedChanged);
|
||||
//
|
||||
// userJsonOnGameInstall
|
||||
//
|
||||
this.userJsonOnGameInstall.AutoSize = true;
|
||||
this.userJsonOnGameInstall.BackColor = System.Drawing.Color.Transparent;
|
||||
this.userJsonOnGameInstall.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.userJsonOnGameInstall.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.userJsonOnGameInstall.Location = new System.Drawing.Point(13, 254);
|
||||
this.userJsonOnGameInstall.Name = "userJsonOnGameInstall";
|
||||
this.userJsonOnGameInstall.Size = new System.Drawing.Size(243, 22);
|
||||
this.userJsonOnGameInstall.TabIndex = 9;
|
||||
this.userJsonOnGameInstall.Text = "Push random user.json on install";
|
||||
this.userJsonOnGameInstall.UseVisualStyleBackColor = false;
|
||||
this.userJsonOnGameInstall.CheckedChanged += new System.EventHandler(this.userJsonOnGameInstall_CheckedChanged);
|
||||
//
|
||||
// crashlogID
|
||||
//
|
||||
this.crashlogID.AutoSize = true;
|
||||
this.crashlogID.Location = new System.Drawing.Point(13, 439);
|
||||
this.crashlogID.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||
this.crashlogID.Name = "crashlogID";
|
||||
this.crashlogID.Size = new System.Drawing.Size(0, 13);
|
||||
this.crashlogID.TabIndex = 15;
|
||||
//
|
||||
// nodevicemodeBox
|
||||
//
|
||||
this.nodevicemodeBox.AutoSize = true;
|
||||
this.nodevicemodeBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.nodevicemodeBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.nodevicemodeBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.nodevicemodeBox.Location = new System.Drawing.Point(13, 65);
|
||||
this.nodevicemodeBox.Name = "nodevicemodeBox";
|
||||
this.nodevicemodeBox.Size = new System.Drawing.Size(226, 22);
|
||||
this.nodevicemodeBox.TabIndex = 9;
|
||||
this.nodevicemodeBox.Text = "Disable Sideloading (Installing)";
|
||||
this.nodevicemodeBox.UseVisualStyleBackColor = false;
|
||||
this.nodevicemodeBox.CheckedChanged += new System.EventHandler(this.nodevicemodeBox_CheckedChanged);
|
||||
//
|
||||
// bmbfBox
|
||||
//
|
||||
this.bmbfBox.AutoSize = true;
|
||||
this.bmbfBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.bmbfBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.bmbfBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.bmbfBox.Location = new System.Drawing.Point(13, 281);
|
||||
this.bmbfBox.Name = "bmbfBox";
|
||||
this.bmbfBox.Size = new System.Drawing.Size(281, 22);
|
||||
this.bmbfBox.TabIndex = 9;
|
||||
this.bmbfBox.Text = "Enable BMBF song zips drag and drop";
|
||||
this.bmbfBox.UseVisualStyleBackColor = false;
|
||||
this.bmbfBox.CheckedChanged += new System.EventHandler(this.bmbfBox_CheckedChanged);
|
||||
//
|
||||
// AutoReinstBox
|
||||
//
|
||||
this.AutoReinstBox.AutoSize = true;
|
||||
this.AutoReinstBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.AutoReinstBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.AutoReinstBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.AutoReinstBox.Location = new System.Drawing.Point(13, 200);
|
||||
this.AutoReinstBox.Name = "AutoReinstBox";
|
||||
this.AutoReinstBox.Size = new System.Drawing.Size(280, 22);
|
||||
this.AutoReinstBox.TabIndex = 9;
|
||||
this.AutoReinstBox.Text = "Enable auto reinstall upon install failure";
|
||||
this.AutoReinstBox.UseVisualStyleBackColor = false;
|
||||
this.AutoReinstBox.CheckedChanged += new System.EventHandler(this.AutoReinstBox_CheckedChanged);
|
||||
this.AutoReinstBox.Click += new System.EventHandler(this.AutoReinstBox_Click);
|
||||
//
|
||||
// trailersOn
|
||||
//
|
||||
this.trailersOn.AutoSize = true;
|
||||
this.trailersOn.BackColor = System.Drawing.Color.Transparent;
|
||||
this.trailersOn.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.trailersOn.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.trailersOn.Location = new System.Drawing.Point(13, 119);
|
||||
this.trailersOn.Name = "trailersOn";
|
||||
this.trailersOn.Size = new System.Drawing.Size(255, 22);
|
||||
this.trailersOn.TabIndex = 23;
|
||||
this.trailersOn.Text = "Use Trailers instead of Thumbnails";
|
||||
this.trailersOn.UseVisualStyleBackColor = false;
|
||||
this.trailersOn.CheckedChanged += new System.EventHandler(this.trailersOn_CheckedChanged);
|
||||
//
|
||||
// downloadDirectorySetter
|
||||
//
|
||||
this.downloadDirectorySetter.RootFolder = System.Environment.SpecialFolder.MyComputer;
|
||||
//
|
||||
// backupDirectorySetter
|
||||
//
|
||||
this.backupDirectorySetter.RootFolder = System.Environment.SpecialFolder.MyComputer;
|
||||
//
|
||||
// chkSingleThread
|
||||
//
|
||||
this.chkSingleThread.AutoSize = true;
|
||||
this.chkSingleThread.BackColor = System.Drawing.Color.Transparent;
|
||||
this.chkSingleThread.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.chkSingleThread.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.chkSingleThread.Location = new System.Drawing.Point(13, 146);
|
||||
this.chkSingleThread.Name = "chkSingleThread";
|
||||
this.chkSingleThread.Size = new System.Drawing.Size(186, 22);
|
||||
this.chkSingleThread.TabIndex = 25;
|
||||
this.chkSingleThread.Text = "Enable Single-Threading";
|
||||
this.chkSingleThread.UseVisualStyleBackColor = false;
|
||||
this.chkSingleThread.CheckedChanged += new System.EventHandler(this.chkSingleThread_CheckedChanged);
|
||||
//
|
||||
// setBackupDirectory
|
||||
//
|
||||
this.setBackupDirectory.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.setBackupDirectory.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.setBackupDirectory.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.setBackupDirectory.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.setBackupDirectory.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.setBackupDirectory.ForeColor = System.Drawing.Color.White;
|
||||
this.setBackupDirectory.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.setBackupDirectory.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.setBackupDirectory.Location = new System.Drawing.Point(28, 596);
|
||||
this.setBackupDirectory.Name = "setBackupDirectory";
|
||||
this.setBackupDirectory.Radius = 5;
|
||||
this.setBackupDirectory.Size = new System.Drawing.Size(285, 31);
|
||||
this.setBackupDirectory.Stroke = true;
|
||||
this.setBackupDirectory.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.setBackupDirectory.TabIndex = 24;
|
||||
this.setBackupDirectory.Text = "Set Backup Directory";
|
||||
this.setBackupDirectory.Transparency = false;
|
||||
this.setBackupDirectory.Click += new System.EventHandler(this.setBackupDirectory_Click);
|
||||
//
|
||||
// setDownloadDirectory
|
||||
//
|
||||
this.setDownloadDirectory.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.setDownloadDirectory.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.setDownloadDirectory.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.setDownloadDirectory.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.setDownloadDirectory.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.setDownloadDirectory.ForeColor = System.Drawing.Color.White;
|
||||
this.setDownloadDirectory.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.setDownloadDirectory.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.setDownloadDirectory.Location = new System.Drawing.Point(28, 559);
|
||||
this.setDownloadDirectory.Name = "setDownloadDirectory";
|
||||
this.setDownloadDirectory.Radius = 5;
|
||||
this.setDownloadDirectory.Size = new System.Drawing.Size(285, 31);
|
||||
this.setDownloadDirectory.Stroke = true;
|
||||
this.setDownloadDirectory.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.setDownloadDirectory.TabIndex = 23;
|
||||
this.setDownloadDirectory.Text = "Set Download Directory";
|
||||
this.setDownloadDirectory.Transparency = false;
|
||||
this.setDownloadDirectory.Click += new System.EventHandler(this.setDownloadDirectory_Click);
|
||||
//
|
||||
// btnOpenDebug
|
||||
//
|
||||
this.btnOpenDebug.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.btnOpenDebug.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.btnOpenDebug.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnOpenDebug.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btnOpenDebug.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.btnOpenDebug.ForeColor = System.Drawing.Color.White;
|
||||
this.btnOpenDebug.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnOpenDebug.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnOpenDebug.Location = new System.Drawing.Point(27, 432);
|
||||
this.btnOpenDebug.Name = "btnOpenDebug";
|
||||
this.btnOpenDebug.Radius = 5;
|
||||
this.btnOpenDebug.Size = new System.Drawing.Size(285, 31);
|
||||
this.btnOpenDebug.Stroke = true;
|
||||
this.btnOpenDebug.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.btnOpenDebug.TabIndex = 21;
|
||||
this.btnOpenDebug.Text = "Open Debug Log";
|
||||
this.btnOpenDebug.Transparency = false;
|
||||
this.btnOpenDebug.Click += new System.EventHandler(this.btnOpenDebug_Click);
|
||||
//
|
||||
// btnResetDebug
|
||||
//
|
||||
this.btnResetDebug.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.btnResetDebug.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.btnResetDebug.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnResetDebug.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btnResetDebug.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.btnResetDebug.ForeColor = System.Drawing.Color.White;
|
||||
this.btnResetDebug.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnResetDebug.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnResetDebug.Location = new System.Drawing.Point(27, 469);
|
||||
this.btnResetDebug.Name = "btnResetDebug";
|
||||
this.btnResetDebug.Radius = 5;
|
||||
this.btnResetDebug.Size = new System.Drawing.Size(285, 31);
|
||||
this.btnResetDebug.Stroke = true;
|
||||
this.btnResetDebug.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.btnResetDebug.TabIndex = 20;
|
||||
this.btnResetDebug.Text = "Reset Debug Log";
|
||||
this.btnResetDebug.Transparency = false;
|
||||
this.btnResetDebug.Click += new System.EventHandler(this.btnResetDebug_click);
|
||||
//
|
||||
// btnUploadDebug
|
||||
//
|
||||
this.btnUploadDebug.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.btnUploadDebug.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.btnUploadDebug.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnUploadDebug.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btnUploadDebug.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.btnUploadDebug.ForeColor = System.Drawing.Color.White;
|
||||
this.btnUploadDebug.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnUploadDebug.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.btnUploadDebug.Location = new System.Drawing.Point(27, 506);
|
||||
this.btnUploadDebug.Name = "btnUploadDebug";
|
||||
this.btnUploadDebug.Radius = 5;
|
||||
this.btnUploadDebug.Size = new System.Drawing.Size(285, 31);
|
||||
this.btnUploadDebug.Stroke = true;
|
||||
this.btnUploadDebug.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.btnUploadDebug.TabIndex = 19;
|
||||
this.btnUploadDebug.Text = "Upload Debug Log";
|
||||
this.btnUploadDebug.Transparency = false;
|
||||
this.btnUploadDebug.Click += new System.EventHandler(this.btnUploadDebug_click);
|
||||
//
|
||||
// resetSettingsButton
|
||||
//
|
||||
this.resetSettingsButton.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.resetSettingsButton.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.resetSettingsButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.resetSettingsButton.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.resetSettingsButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.resetSettingsButton.ForeColor = System.Drawing.Color.White;
|
||||
this.resetSettingsButton.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.resetSettingsButton.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.resetSettingsButton.Location = new System.Drawing.Point(180, 379);
|
||||
this.resetSettingsButton.Name = "resetSettingsButton";
|
||||
this.resetSettingsButton.Radius = 5;
|
||||
this.resetSettingsButton.Size = new System.Drawing.Size(133, 31);
|
||||
this.resetSettingsButton.Stroke = true;
|
||||
this.resetSettingsButton.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.resetSettingsButton.TabIndex = 18;
|
||||
this.resetSettingsButton.Text = "Reset Settings";
|
||||
this.resetSettingsButton.Transparency = false;
|
||||
this.resetSettingsButton.Click += new System.EventHandler(this.resetSettingsButton_Click);
|
||||
//
|
||||
// applyButton
|
||||
//
|
||||
this.applyButton.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.applyButton.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.applyButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.applyButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.applyButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.applyButton.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.applyButton.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.applyButton.Location = new System.Drawing.Point(28, 379);
|
||||
this.applyButton.Name = "applyButton";
|
||||
this.applyButton.Radius = 5;
|
||||
this.applyButton.Size = new System.Drawing.Size(133, 31);
|
||||
this.applyButton.Stroke = true;
|
||||
this.applyButton.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.applyButton.TabIndex = 17;
|
||||
this.applyButton.Text = "Apply Settings";
|
||||
this.applyButton.Transparency = false;
|
||||
this.applyButton.Click += new System.EventHandler(this.applyButton_Click);
|
||||
//
|
||||
// virtualFilesystemCompatibilityCheckbox
|
||||
//
|
||||
this.virtualFilesystemCompatibilityCheckbox.AutoSize = true;
|
||||
this.virtualFilesystemCompatibilityCheckbox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.virtualFilesystemCompatibilityCheckbox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.virtualFilesystemCompatibilityCheckbox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.virtualFilesystemCompatibilityCheckbox.Location = new System.Drawing.Point(13, 308);
|
||||
this.virtualFilesystemCompatibilityCheckbox.Name = "virtualFilesystemCompatibilityCheckbox";
|
||||
this.virtualFilesystemCompatibilityCheckbox.Size = new System.Drawing.Size(279, 22);
|
||||
this.virtualFilesystemCompatibilityCheckbox.TabIndex = 26;
|
||||
this.virtualFilesystemCompatibilityCheckbox.Text = "Enable Virtual Filesystem Compatibility";
|
||||
this.virtualFilesystemCompatibilityCheckbox.UseVisualStyleBackColor = true;
|
||||
this.virtualFilesystemCompatibilityCheckbox.CheckedChanged += new System.EventHandler(this.virtualFilesystemCompatibilityCheckbox_CheckedChanged);
|
||||
//
|
||||
// openBackupDirectory
|
||||
//
|
||||
this.openBackupDirectory.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.openBackupDirectory.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.openBackupDirectory.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.openBackupDirectory.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.openBackupDirectory.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.openBackupDirectory.ForeColor = System.Drawing.Color.White;
|
||||
this.openBackupDirectory.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.openBackupDirectory.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.openBackupDirectory.Location = new System.Drawing.Point(28, 670);
|
||||
this.openBackupDirectory.Name = "openBackupDirectory";
|
||||
this.openBackupDirectory.Radius = 5;
|
||||
this.openBackupDirectory.Size = new System.Drawing.Size(285, 31);
|
||||
this.openBackupDirectory.Stroke = true;
|
||||
this.openBackupDirectory.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.openBackupDirectory.TabIndex = 28;
|
||||
this.openBackupDirectory.Text = "Open Backup Directory";
|
||||
this.openBackupDirectory.Transparency = false;
|
||||
this.openBackupDirectory.Click += new System.EventHandler(this.openBackupDirectory_Click);
|
||||
//
|
||||
// openDownloadDirectory
|
||||
//
|
||||
this.openDownloadDirectory.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.openDownloadDirectory.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.openDownloadDirectory.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.openDownloadDirectory.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.openDownloadDirectory.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.openDownloadDirectory.ForeColor = System.Drawing.Color.White;
|
||||
this.openDownloadDirectory.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.openDownloadDirectory.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.openDownloadDirectory.Location = new System.Drawing.Point(28, 633);
|
||||
this.openDownloadDirectory.Name = "openDownloadDirectory";
|
||||
this.openDownloadDirectory.Radius = 5;
|
||||
this.openDownloadDirectory.Size = new System.Drawing.Size(285, 31);
|
||||
this.openDownloadDirectory.Stroke = true;
|
||||
this.openDownloadDirectory.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.openDownloadDirectory.TabIndex = 27;
|
||||
this.openDownloadDirectory.Text = "Open Download Directory";
|
||||
this.openDownloadDirectory.Transparency = false;
|
||||
this.openDownloadDirectory.Click += new System.EventHandler(this.openDownloadDirectory_Click);
|
||||
//
|
||||
// chkUseDownloadedFiles
|
||||
//
|
||||
this.chkUseDownloadedFiles.AutoSize = true;
|
||||
this.chkUseDownloadedFiles.BackColor = System.Drawing.Color.Transparent;
|
||||
this.chkUseDownloadedFiles.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.chkUseDownloadedFiles.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.chkUseDownloadedFiles.Location = new System.Drawing.Point(13, 173);
|
||||
this.chkUseDownloadedFiles.Name = "chkUseDownloadedFiles";
|
||||
this.chkUseDownloadedFiles.Size = new System.Drawing.Size(227, 22);
|
||||
this.chkUseDownloadedFiles.TabIndex = 29;
|
||||
this.chkUseDownloadedFiles.Text = "Don\'t Prompt to Re-Download";
|
||||
this.chkUseDownloadedFiles.UseVisualStyleBackColor = false;
|
||||
this.chkUseDownloadedFiles.CheckedChanged += new System.EventHandler(this.chkUseDownloadedFiles_CheckedChanged);
|
||||
//
|
||||
// bandwidthLabel
|
||||
//
|
||||
this.bandwidthLabel.AutoSize = true;
|
||||
this.bandwidthLabel.BackColor = System.Drawing.Color.Transparent;
|
||||
this.bandwidthLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.bandwidthLabel.Location = new System.Drawing.Point(10, 338);
|
||||
this.bandwidthLabel.Name = "bandwidthLabel";
|
||||
this.bandwidthLabel.Size = new System.Drawing.Size(115, 18);
|
||||
this.bandwidthLabel.TabIndex = 30;
|
||||
this.bandwidthLabel.Text = "Bandwidth Limit:";
|
||||
this.bandwidthLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// bandwidthLimitTextBox
|
||||
//
|
||||
this.bandwidthLimitTextBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.bandwidthLimitTextBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.bandwidthLimitTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.bandwidthLimitTextBox.ForeColor = System.Drawing.Color.White;
|
||||
this.bandwidthLimitTextBox.Location = new System.Drawing.Point(131, 336);
|
||||
this.bandwidthLimitTextBox.Name = "bandwidthLimitTextBox";
|
||||
this.bandwidthLimitTextBox.Size = new System.Drawing.Size(46, 21);
|
||||
this.bandwidthLimitTextBox.TabIndex = 31;
|
||||
this.bandwidthLimitTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
this.bandwidthLimitTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.bandwidthLimitTextBox_KeyPress);
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.BackColor = System.Drawing.Color.Transparent;
|
||||
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.label1.Location = new System.Drawing.Point(183, 338);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(43, 18);
|
||||
this.label1.TabIndex = 32;
|
||||
this.label1.Text = "MB/s";
|
||||
//
|
||||
// SettingsForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
|
||||
this.ClientSize = new System.Drawing.Size(339, 724);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.bandwidthLimitTextBox);
|
||||
this.Controls.Add(this.bandwidthLabel);
|
||||
this.Controls.Add(this.chkUseDownloadedFiles);
|
||||
this.Controls.Add(this.openBackupDirectory);
|
||||
this.Controls.Add(this.openDownloadDirectory);
|
||||
this.Controls.Add(this.virtualFilesystemCompatibilityCheckbox);
|
||||
this.Controls.Add(this.chkSingleThread);
|
||||
this.Controls.Add(this.setBackupDirectory);
|
||||
this.Controls.Add(this.trailersOn);
|
||||
this.Controls.Add(this.setDownloadDirectory);
|
||||
this.Controls.Add(this.btnOpenDebug);
|
||||
this.Controls.Add(this.btnResetDebug);
|
||||
this.Controls.Add(this.btnUploadDebug);
|
||||
this.Controls.Add(this.resetSettingsButton);
|
||||
this.Controls.Add(this.applyButton);
|
||||
this.Controls.Add(this.crashlogID);
|
||||
this.Controls.Add(this.bmbfBox);
|
||||
this.Controls.Add(this.AutoReinstBox);
|
||||
this.Controls.Add(this.nodevicemodeBox);
|
||||
this.Controls.Add(this.userJsonOnGameInstall);
|
||||
this.Controls.Add(this.updateConfigCheckBox);
|
||||
this.Controls.Add(this.deleteAfterInstallCheckBox);
|
||||
this.Controls.Add(this.enableMessageBoxesCheckBox);
|
||||
this.Controls.Add(this.checkForUpdatesCheckBox);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ForeColor = System.Drawing.Color.White;
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.MaximizeBox = false;
|
||||
this.Name = "SettingsForm";
|
||||
this.ShowIcon = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "Settings";
|
||||
this.Load += new System.EventHandler(this.SettingsForm_Load);
|
||||
this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.SettingsForm_KeyPress);
|
||||
this.Leave += new System.EventHandler(this.SettingsForm_Leave);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.CheckBox checkForUpdatesCheckBox;
|
||||
private System.Windows.Forms.CheckBox enableMessageBoxesCheckBox;
|
||||
private System.Windows.Forms.CheckBox deleteAfterInstallCheckBox;
|
||||
private System.Windows.Forms.CheckBox updateConfigCheckBox;
|
||||
private System.Windows.Forms.CheckBox userJsonOnGameInstall;
|
||||
private System.Windows.Forms.Label crashlogID;
|
||||
private System.Windows.Forms.CheckBox nodevicemodeBox;
|
||||
private System.Windows.Forms.CheckBox bmbfBox;
|
||||
private System.Windows.Forms.CheckBox AutoReinstBox;
|
||||
private RoundButton applyButton;
|
||||
private RoundButton resetSettingsButton;
|
||||
private RoundButton btnResetDebug;
|
||||
private RoundButton btnUploadDebug;
|
||||
private RoundButton btnOpenDebug;
|
||||
private System.Windows.Forms.CheckBox trailersOn;
|
||||
private RoundButton setDownloadDirectory;
|
||||
private System.Windows.Forms.FolderBrowserDialog downloadDirectorySetter;
|
||||
private RoundButton setBackupDirectory;
|
||||
private System.Windows.Forms.FolderBrowserDialog backupDirectorySetter;
|
||||
private System.Windows.Forms.CheckBox chkSingleThread;
|
||||
private System.Windows.Forms.CheckBox virtualFilesystemCompatibilityCheckbox;
|
||||
private RoundButton openBackupDirectory;
|
||||
private RoundButton openDownloadDirectory;
|
||||
private System.Windows.Forms.CheckBox chkUseDownloadedFiles;
|
||||
private System.Windows.Forms.Label bandwidthLabel;
|
||||
private System.Windows.Forms.TextBox bandwidthLimitTextBox;
|
||||
private System.Windows.Forms.Label label1;
|
||||
}
|
||||
}
|
||||
|
||||
530
SettingsForm.cs
@@ -1,228 +1,302 @@
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class SettingsForm : Form
|
||||
{
|
||||
public SettingsForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void SettingsForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
this.CenterToParent();
|
||||
if (!string.IsNullOrEmpty(Properties.Settings.Default.CurrentLogName))
|
||||
textBox1.Text = Properties.Settings.Default.CurrentCrashName;
|
||||
if (!string.IsNullOrEmpty(Properties.Settings.Default.CurrentLogPath))
|
||||
DebugID.Text = Properties.Settings.Default.CurrentLogName;
|
||||
debuglogID.Text = "This is your DebugLogID. Click on your DebugLogID to copy it to your clipboard.";
|
||||
intSettings();
|
||||
intToolTips();
|
||||
}
|
||||
|
||||
//Init form objects with values from settings
|
||||
private void intSettings()
|
||||
{
|
||||
CblindBox.Checked = Properties.Settings.Default.QblindOn;
|
||||
checkForUpdatesCheckBox.Checked = Properties.Settings.Default.checkForUpdates;
|
||||
enableMessageBoxesCheckBox.Checked = Properties.Settings.Default.enableMessageBoxes;
|
||||
deleteAfterInstallCheckBox.Checked = Properties.Settings.Default.deleteAllAfterInstall;
|
||||
updateConfigCheckBox.Checked = Properties.Settings.Default.autoUpdateConfig;
|
||||
userJsonOnGameInstall.Checked = Properties.Settings.Default.userJsonOnGameInstall;
|
||||
nodevicemodeBox.Checked = Properties.Settings.Default.nodevicemode;
|
||||
bmbfBox.Checked = Properties.Settings.Default.BMBFchecked;
|
||||
|
||||
if (Properties.Settings.Default.BandwithLimit.Length > 1)
|
||||
{
|
||||
BandwithTextbox.Text = Properties.Settings.Default.BandwithLimit.Remove(Properties.Settings.Default.BandwithLimit.Length - 1);
|
||||
BandwithComboBox.Text = Properties.Settings.Default.BandwithLimit[Properties.Settings.Default.BandwithLimit.Length - 1].ToString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void intToolTips()
|
||||
{
|
||||
ToolTip checkForUpdatesToolTip = new ToolTip();
|
||||
checkForUpdatesToolTip.SetToolTip(this.checkForUpdatesCheckBox, "If this is checked, the software will check for available updates");
|
||||
ToolTip enableMessageBoxesToolTip = new ToolTip();
|
||||
enableMessageBoxesToolTip.SetToolTip(this.enableMessageBoxesCheckBox, "If this is checked, the software will display message boxes after every completed task");
|
||||
ToolTip deleteAfterInstallToolTip = new ToolTip();
|
||||
deleteAfterInstallToolTip.SetToolTip(this.deleteAfterInstallCheckBox, "If this is checked, the software will delete all game files after downloading and installing a game from a remote server");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public void DebugLogCopy_click(object sender, EventArgs e)
|
||||
{
|
||||
if (File.Exists($"{Properties.Settings.Default.CurrentLogPath}"))
|
||||
{
|
||||
RCLONE.runRcloneCommand($"copy \"{Properties.Settings.Default.CurrentLogPath}\" RSL-debuglogs:DebugLogs/");
|
||||
|
||||
MessageBox.Show($"Your debug log has been copied to the server. Please mention your DebugLog ID ({Properties.Settings.Default.CurrentLogName}) to the Mods (it has been automatically copied to your clipboard).");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void button1_click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
if (File.Exists($"{Properties.Settings.Default.CurrentLogPath}"))
|
||||
File.Delete($"{Properties.Settings.Default.CurrentLogPath}");
|
||||
if (File.Exists($"{Environment.CurrentDirectory}\\debuglog.txt"))
|
||||
File.Delete($"{Environment.CurrentDirectory}\\debuglog.txt");
|
||||
|
||||
|
||||
if (File.Exists($"{Environment.CurrentDirectory}\\nouns\\nouns.txt"))
|
||||
{
|
||||
string[] lines = File.ReadAllLines($"{Environment.CurrentDirectory}\\nouns\\nouns.txt");
|
||||
Random r = new Random();
|
||||
int x = r.Next(6806);
|
||||
int y = r.Next(6806);
|
||||
string randomnoun = lines[new Random(x).Next(lines.Length)];
|
||||
string randomnoun2 = lines[new Random(y).Next(lines.Length)];
|
||||
string combined = randomnoun + "-" + randomnoun2;
|
||||
Properties.Settings.Default.CurrentLogPath = Environment.CurrentDirectory + "\\" + combined + ".txt";
|
||||
Properties.Settings.Default.CurrentLogName = combined;
|
||||
Properties.Settings.Default.Save();
|
||||
DebugID.Text = combined;
|
||||
this.Close();
|
||||
SettingsForm Form = new SettingsForm();
|
||||
Form.Show();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Apply settings
|
||||
private void applyButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (BandwithTextbox.Text.Length > 0 && BandwithTextbox.Text != "0")
|
||||
if (BandwithComboBox.SelectedIndex == -1)
|
||||
{
|
||||
FlexibleMessageBox.Show("You need to select something from the combobox");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Properties.Settings.Default.BandwithLimit = $"{BandwithTextbox.Text.Replace(" ", "")}{BandwithComboBox.Text}";
|
||||
}
|
||||
else
|
||||
Properties.Settings.Default.BandwithLimit = "";
|
||||
|
||||
Properties.Settings.Default.Save();
|
||||
FlexibleMessageBox.Show("Settings applied!");
|
||||
}
|
||||
|
||||
private void checkForUpdatesCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.checkForUpdates = checkForUpdatesCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void enableMessageBoxesCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.enableMessageBoxes = enableMessageBoxesCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void resetSettingsButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.Reset();
|
||||
intSettings();
|
||||
}
|
||||
|
||||
private void deleteAfterInstallCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.deleteAllAfterInstall = deleteAfterInstallCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void updateConfigCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.autoUpdateConfig = updateConfigCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void userJsonOnGameInstall_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.userJsonOnGameInstall = userJsonOnGameInstall.Checked;
|
||||
}
|
||||
|
||||
private void SettingsForm_KeyPress(object sender, KeyPressEventArgs e)
|
||||
{
|
||||
if (e.KeyChar == (char)Keys.Escape)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void SettingsForm_Leave(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
|
||||
private void Form_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Escape)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
}
|
||||
protected override bool ProcessDialogKey(Keys keyData)
|
||||
{
|
||||
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
|
||||
{
|
||||
this.Close();
|
||||
return true;
|
||||
}
|
||||
return base.ProcessDialogKey(keyData);
|
||||
}
|
||||
|
||||
private void DebugID_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\" + Properties.Settings.Default.CurrentLogName + ".txt"))
|
||||
Clipboard.SetText(DebugID.Text);
|
||||
MessageBox.Show("DebugLogID copied to clipboard! Paste it to a moderator/helper for assistance!");
|
||||
}
|
||||
|
||||
private void textBox1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (!String.IsNullOrEmpty(Properties.Settings.Default.CurrentCrashName))
|
||||
{
|
||||
Clipboard.SetText(textBox1.Text);
|
||||
MessageBox.Show("CrashLogID copied to clipboard! Paste it to a moderator/helper for assistance!");
|
||||
}
|
||||
}
|
||||
|
||||
private void CblindBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
Properties.Settings.Default.QblindOn = CblindBox.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
|
||||
}
|
||||
|
||||
private void CblindBox_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (CblindBox.Checked)
|
||||
MessageBox.Show("You must restart Rookie's Sideloader OR click Refresh Updates List for changes to take effect.\n\nNOTE: Colors in the legend at the top right of the main window of Rookie won't update until you restart the program.");
|
||||
}
|
||||
|
||||
private void nodevicemodeBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.nodevicemode = nodevicemodeBox.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void bmbfBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.BMBFchecked = nodevicemodeBox.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class SettingsForm : Form
|
||||
{
|
||||
public SettingsForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void SettingsForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
CenterToParent();
|
||||
intSettings();
|
||||
intToolTips();
|
||||
}
|
||||
|
||||
//Init form objects with values from settings
|
||||
private void intSettings()
|
||||
{
|
||||
checkForUpdatesCheckBox.Checked = Properties.Settings.Default.checkForUpdates;
|
||||
enableMessageBoxesCheckBox.Checked = Properties.Settings.Default.enableMessageBoxes;
|
||||
deleteAfterInstallCheckBox.Checked = Properties.Settings.Default.deleteAllAfterInstall;
|
||||
updateConfigCheckBox.Checked = Properties.Settings.Default.autoUpdateConfig;
|
||||
userJsonOnGameInstall.Checked = Properties.Settings.Default.userJsonOnGameInstall;
|
||||
nodevicemodeBox.Checked = Properties.Settings.Default.nodevicemode;
|
||||
bmbfBox.Checked = Properties.Settings.Default.BMBFchecked;
|
||||
AutoReinstBox.Checked = Properties.Settings.Default.AutoReinstall;
|
||||
trailersOn.Checked = Properties.Settings.Default.TrailersOn;
|
||||
chkSingleThread.Checked = Properties.Settings.Default.singleThreadMode;
|
||||
virtualFilesystemCompatibilityCheckbox.Checked = Properties.Settings.Default.virtualFilesystemCompatibility;
|
||||
bandwidthLimitTextBox.Text = Properties.Settings.Default.bandwidthLimit.ToString();
|
||||
if (nodevicemodeBox.Checked)
|
||||
{
|
||||
deleteAfterInstallCheckBox.Checked = false;
|
||||
deleteAfterInstallCheckBox.Enabled = false;
|
||||
}
|
||||
chkUseDownloadedFiles.Checked = Properties.Settings.Default.useDownloadedFiles;
|
||||
}
|
||||
|
||||
private void intToolTips()
|
||||
{
|
||||
ToolTip checkForUpdatesToolTip = new ToolTip();
|
||||
checkForUpdatesToolTip.SetToolTip(checkForUpdatesCheckBox, "If this is checked, the software will check for available updates");
|
||||
ToolTip enableMessageBoxesToolTip = new ToolTip();
|
||||
enableMessageBoxesToolTip.SetToolTip(enableMessageBoxesCheckBox, "If this is checked, the software will display message boxes after every completed task");
|
||||
ToolTip deleteAfterInstallToolTip = new ToolTip();
|
||||
deleteAfterInstallToolTip.SetToolTip(deleteAfterInstallCheckBox, "If this is checked, the software will delete all game files after downloading and installing a game from a remote server");
|
||||
ToolTip chkUseDownloadedFilesTooltip = new ToolTip();
|
||||
chkUseDownloadedFilesTooltip.SetToolTip(chkUseDownloadedFiles, "If this is checked, Rookie will always install Downloaded files without Re-Downloading or Asking to Re-Download");
|
||||
}
|
||||
|
||||
public void btnUploadDebug_click(object sender, EventArgs e)
|
||||
{
|
||||
if (File.Exists($"{Properties.Settings.Default.CurrentLogPath}"))
|
||||
{
|
||||
string UUID = SideloaderUtilities.UUID();
|
||||
string debugLogPath = $"{Environment.CurrentDirectory}\\{UUID}.log";
|
||||
System.IO.File.Copy("debuglog.txt", debugLogPath);
|
||||
|
||||
Clipboard.SetText(UUID);
|
||||
|
||||
_ = RCLONE.runRcloneCommand_UploadConfig($"copy \"{debugLogPath}\" RSL-gameuploads:DebugLogs");
|
||||
_ = MessageBox.Show($"Your debug log has been copied to the server. ID: {UUID}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void btnResetDebug_click(object sender, EventArgs e)
|
||||
{
|
||||
if (File.Exists($"{Properties.Settings.Default.CurrentLogPath}"))
|
||||
{
|
||||
File.Delete($"{Properties.Settings.Default.CurrentLogPath}");
|
||||
}
|
||||
|
||||
if (File.Exists($"{Environment.CurrentDirectory}\\debuglog.txt"))
|
||||
{
|
||||
File.Delete($"{Environment.CurrentDirectory}\\debuglog.txt");
|
||||
}
|
||||
}
|
||||
|
||||
//Apply settings
|
||||
private void applyButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
string input = bandwidthLimitTextBox.Text;
|
||||
Regex regex = new Regex(@"^\d+(\.\d+)?$");
|
||||
|
||||
if (regex.IsMatch(input) && float.TryParse(input, out float bandwidthLimit))
|
||||
{
|
||||
Properties.Settings.Default.bandwidthLimit = bandwidthLimit;
|
||||
Properties.Settings.Default.Save();
|
||||
this.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Please enter a valid number for the bandwidth limit.");
|
||||
}
|
||||
}
|
||||
|
||||
private void checkForUpdatesCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.checkForUpdates = checkForUpdatesCheckBox.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
private void chkUseDownloadedFiles_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.useDownloadedFiles = chkUseDownloadedFiles.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void enableMessageBoxesCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.enableMessageBoxes = enableMessageBoxesCheckBox.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void resetSettingsButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.Reset();
|
||||
Properties.Settings.Default.customDownloadDir = false;
|
||||
Properties.Settings.Default.customBackupDir = false;
|
||||
MainForm.backupFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
|
||||
Properties.Settings.Default.downloadDir = Environment.CurrentDirectory.ToString();
|
||||
Properties.Settings.Default.createPubMirrorFile = true;
|
||||
intSettings();
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void deleteAfterInstallCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.deleteAllAfterInstall = deleteAfterInstallCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void updateConfigCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.autoUpdateConfig = updateConfigCheckBox.Checked;
|
||||
if (Properties.Settings.Default.autoUpdateConfig == true) {
|
||||
Properties.Settings.Default.createPubMirrorFile = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void userJsonOnGameInstall_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.userJsonOnGameInstall = userJsonOnGameInstall.Checked;
|
||||
}
|
||||
|
||||
private void SettingsForm_KeyPress(object sender, KeyPressEventArgs e)
|
||||
{
|
||||
if (e.KeyChar == (char)Keys.Escape)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void SettingsForm_Leave(object sender, EventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void Form_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Escape)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
}
|
||||
protected override bool ProcessDialogKey(Keys keyData)
|
||||
{
|
||||
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
|
||||
{
|
||||
Close();
|
||||
return true;
|
||||
}
|
||||
return base.ProcessDialogKey(keyData);
|
||||
}
|
||||
|
||||
private void nodevicemodeBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.nodevicemode = nodevicemodeBox.Checked;
|
||||
if (!nodevicemodeBox.Checked)
|
||||
{
|
||||
deleteAfterInstallCheckBox.Checked = true;
|
||||
Properties.Settings.Default.deleteAllAfterInstall = true;
|
||||
deleteAfterInstallCheckBox.Enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
deleteAfterInstallCheckBox.Checked = false;
|
||||
Properties.Settings.Default.deleteAllAfterInstall = false;
|
||||
deleteAfterInstallCheckBox.Enabled = false;
|
||||
}
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void bmbfBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.BMBFchecked = bmbfBox.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void AutoReinstBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.AutoReinstall = AutoReinstBox.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void trailersOn_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.TrailersOn = trailersOn.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void AutoReinstBox_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (AutoReinstBox.Checked)
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show(this, "WARNING: This box enables automatic reinstall when installs fail,\ndue to some games not allowing " +
|
||||
"access to their save data (less than 5%) this\noption can lead to losing your progress." +
|
||||
" However with this option\nchecked when installs fail you won't have to agree to a prompt to perform\nthe reinstall. " +
|
||||
"(ideal when installing from a queue).\n\nNOTE: If your usb/wireless adb connection is extremely slow this option can\ncause larger" +
|
||||
"apk file installations to fail. Enable anyway?", "WARNING", MessageBoxButtons.OKCancel);
|
||||
if (dialogResult == DialogResult.Cancel)
|
||||
{
|
||||
AutoReinstBox.Checked = false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void btnOpenDebug_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (File.Exists($"{Environment.CurrentDirectory}\\debuglog.txt"))
|
||||
{
|
||||
_ = Process.Start($"{Environment.CurrentDirectory}\\debuglog.txt");
|
||||
}
|
||||
}
|
||||
|
||||
private void setDownloadDirectory_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (downloadDirectorySetter.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
Properties.Settings.Default.customDownloadDir = true;
|
||||
Properties.Settings.Default.downloadDir = downloadDirectorySetter.SelectedPath;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
|
||||
private void setBackupDirectory_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (backupDirectorySetter.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
Properties.Settings.Default.customBackupDir = true;
|
||||
Properties.Settings.Default.backupDir = backupDirectorySetter.SelectedPath;
|
||||
MainForm.backupFolder = Properties.Settings.Default.backupDir;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
|
||||
private void chkSingleThread_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.singleThreadMode = chkSingleThread.Checked;
|
||||
}
|
||||
|
||||
private void virtualFilesystemCompatibilityCheckbox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.virtualFilesystemCompatibility = virtualFilesystemCompatibilityCheckbox.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void openDownloadDirectory_Click(object sender, EventArgs e)
|
||||
{
|
||||
string pathToOpen = Properties.Settings.Default.customDownloadDir ? $"{Properties.Settings.Default.downloadDir}" : $"{Environment.CurrentDirectory}";
|
||||
MainForm.OpenDirectory(pathToOpen);
|
||||
}
|
||||
|
||||
private void openBackupDirectory_Click(object sender, EventArgs e)
|
||||
{
|
||||
string pathToOpen = Properties.Settings.Default.customBackupDir ? $"{Path.Combine((Properties.Settings.Default.backupDir), $"Rookie Backups")}" : $"{Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups")}";
|
||||
MainForm.OpenDirectory(pathToOpen);
|
||||
}
|
||||
|
||||
private void bandwidthLimitTextBox_KeyPress(object sender, KeyPressEventArgs e)
|
||||
{
|
||||
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '.'))
|
||||
{
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
|
||||
{
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
8740
SettingsForm.resx
594
Sideloader.cs
@@ -1,299 +1,295 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using Newtonsoft.Json;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
using JR.Utils.GUI.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class Sideloader
|
||||
{
|
||||
public static string TempFolder = Path.Combine(Environment.CurrentDirectory, "temp");
|
||||
public static string CrashLogPath = "crashlog.txt";
|
||||
|
||||
public static string SpooferWarning = @"Please make sure you have installed:
|
||||
- APKTool
|
||||
- Java JDK
|
||||
- aapt
|
||||
And all of them added to PATH, without ANY of them, the spoofer won't work!";
|
||||
|
||||
//push user.json to device (required for some devices like oculus quest)
|
||||
public static void PushUserJsons()
|
||||
{
|
||||
ADB.WakeDevice();
|
||||
foreach (var userJson in UsernameForm.userJsons)
|
||||
{
|
||||
UsernameForm.createUserJsonByName(Utilities.GeneralUtilities.randomString(16), userJson);
|
||||
ADB.RunAdbCommandToString("push \"" + Environment.CurrentDirectory + $"\\{userJson}\" " + " /sdcard/");
|
||||
File.Delete(userJson);
|
||||
}
|
||||
}
|
||||
|
||||
//List of all installed package names from connected device
|
||||
public static Dictionary<string, string> InstalledPackages = new Dictionary<string, string>(); //Packagename and Version
|
||||
//public static List<string> InstalledPackageNames = new List<string>();
|
||||
|
||||
//Remove folder from device
|
||||
public static ProcessOutput RemoveFolder(string path)
|
||||
{
|
||||
ADB.WakeDevice();
|
||||
return ADB.RunAdbCommandToString($"shell rm -r {path}");
|
||||
}
|
||||
public static ProcessOutput RemoveFile(string path)
|
||||
{
|
||||
ADB.WakeDevice();
|
||||
return ADB.RunAdbCommandToString($"shell rm -f {path}");
|
||||
}
|
||||
|
||||
//For games that require manual install, like having another folder that isnt an obb
|
||||
public static ProcessOutput RunADBCommandsFromFile(string path)
|
||||
{
|
||||
ADB.WakeDevice();
|
||||
ProcessOutput output = new ProcessOutput();
|
||||
var commands = File.ReadAllLines(path);
|
||||
foreach (string cmd in commands)
|
||||
{
|
||||
if (cmd.Contains("7z.exe"))
|
||||
{
|
||||
Program.form.ChangeTitle($"Running {cmd}");
|
||||
Logger.Log($"Logging command: {cmd} from file: {path}");
|
||||
ADB.RunCommandToString(cmd, path);
|
||||
}
|
||||
if (cmd.StartsWith("adb"))
|
||||
{
|
||||
string replacement = "";
|
||||
string pattern = "adb";
|
||||
if (ADB.DeviceID.Length > 1)
|
||||
replacement = $"{Properties.Settings.Default.ADBPath} -s {ADB.DeviceID}";
|
||||
else
|
||||
replacement = $"{Properties.Settings.Default.ADBPath}";
|
||||
Regex rgx = new Regex(pattern);
|
||||
string result = rgx.Replace(cmd, replacement);
|
||||
Program.form.ChangeTitle($"Running {result}");
|
||||
Logger.Log($"Logging command: {result} from file: {path}");
|
||||
output += ADB.RunAdbCommandToStringWOADB(result, path);
|
||||
if (output.Error.Contains("mkdir"))
|
||||
output.Error = "";
|
||||
if (output.Output.Contains("reserved"))
|
||||
output.Output = "";
|
||||
}
|
||||
}
|
||||
output.Output += "Custom install successful!";
|
||||
return output;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//Recursive sideload any apk fileD
|
||||
public static ProcessOutput RecursiveOutput = new ProcessOutput();
|
||||
public static void RecursiveSideload(string FolderPath)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (string f in Directory.GetFiles(FolderPath))
|
||||
{
|
||||
if (Path.GetExtension(f) == ".apk")
|
||||
|
||||
RecursiveOutput += ADB.Sideload(f);
|
||||
}
|
||||
|
||||
foreach (string d in Directory.GetDirectories(FolderPath))
|
||||
{
|
||||
RecursiveSideload(d);
|
||||
}
|
||||
}
|
||||
catch (Exception ex) { Logger.Log(ex.Message); }
|
||||
}
|
||||
|
||||
//Recursive copy any obb folder
|
||||
public static void RecursiveCopyOBB(string FolderPath)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (string f in Directory.GetFiles(FolderPath))
|
||||
{
|
||||
RecursiveOutput += ADB.CopyOBB(f);
|
||||
}
|
||||
|
||||
foreach (string d in Directory.GetDirectories(FolderPath))
|
||||
{
|
||||
RecursiveCopyOBB(d);
|
||||
}
|
||||
}
|
||||
catch (Exception ex) { Logger.Log(ex.Message); }
|
||||
}
|
||||
|
||||
//uninstalls an app
|
||||
public static ProcessOutput UninstallGame(string GameName)
|
||||
{
|
||||
ADB.WakeDevice();
|
||||
ProcessOutput output = new ProcessOutput("", "");
|
||||
|
||||
string packageName = Sideloader.gameNameToPackageName(GameName);
|
||||
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show($"Are you sure you want to uninstall {packageName}? this CANNOT be undone!", "WARNING!", MessageBoxButtons.YesNo);
|
||||
if (dialogResult != DialogResult.Yes)
|
||||
return output;
|
||||
|
||||
output = ADB.UninstallPackage(packageName);
|
||||
|
||||
//remove both data and obb if there is any
|
||||
Sideloader.RemoveFolder("/sdcard/Android/obb/" + packageName);
|
||||
Sideloader.RemoveFolder("/sdcard/Android/data/" + packageName);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
public static ProcessOutput DeleteFile(string GameName)
|
||||
{
|
||||
ADB.WakeDevice();
|
||||
ProcessOutput output = new ProcessOutput("", "");
|
||||
|
||||
string packageName = Sideloader.gameNameToPackageName(GameName);
|
||||
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show($"Are you sure you want to uninstall custom QU settings for {packageName}? this CANNOT be undone!", "WARNING!", MessageBoxButtons.YesNo);
|
||||
if (dialogResult != DialogResult.Yes)
|
||||
return output;
|
||||
|
||||
output = Sideloader.RemoveFile($"/sdcard/Android/data/{packageName}/private/Config.Json");
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
//Extracts apk from device, saves it by package name to sideloader folder
|
||||
public static ProcessOutput getApk(string GameName)
|
||||
{
|
||||
|
||||
ADB.WakeDevice();
|
||||
ProcessOutput output = new ProcessOutput("", "");
|
||||
|
||||
string packageName = Sideloader.gameNameToPackageName(GameName);
|
||||
|
||||
output = ADB.RunAdbCommandToString("shell pm path " + packageName);
|
||||
|
||||
string apkPath = output.Output; //Get apk
|
||||
|
||||
apkPath = apkPath.Remove(apkPath.Length - 1);
|
||||
apkPath = apkPath.Remove(0, 8); //remove package:
|
||||
apkPath = apkPath.Remove(apkPath.Length - 1);
|
||||
if (File.Exists($"{Properties.Settings.Default.ADBFolder}\\base.apk"))
|
||||
File.Delete($"{Properties.Settings.Default.ADBFolder}\\base.apk");
|
||||
if (File.Exists($"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk"))
|
||||
File.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk");
|
||||
output += ADB.RunAdbCommandToString("pull " + apkPath); //pull apk
|
||||
|
||||
if (Directory.Exists($"{Properties.Settings.Default.MainDir}\\{packageName}"))
|
||||
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}", true);
|
||||
|
||||
Directory.CreateDirectory($"{Properties.Settings.Default.MainDir}\\{packageName}");
|
||||
|
||||
File.Move($"{Properties.Settings.Default.ADBFolder}\\base.apk", $"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk");
|
||||
return output;
|
||||
}
|
||||
|
||||
public static string gameNameToPackageName(string gameName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (gameName.Contains(game[SideloaderRCLONE.GameNameIndex]))
|
||||
return game[SideloaderRCLONE.PackageNameIndex];
|
||||
if (gameName.Contains(game[SideloaderRCLONE.ReleaseNameIndex]))
|
||||
return game[SideloaderRCLONE.PackageNameIndex];
|
||||
}
|
||||
return gameName;
|
||||
}
|
||||
|
||||
public static string PackageNametoGameName(string gameName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (gameName.Contains(game[SideloaderRCLONE.PackageNameIndex]))
|
||||
return game[SideloaderRCLONE.ReleaseNameIndex];
|
||||
}
|
||||
return gameName;
|
||||
}
|
||||
|
||||
public static string gameNameToSimpleName(string gameName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (gameName.Contains(game[SideloaderRCLONE.GameNameIndex]))
|
||||
return game[SideloaderRCLONE.GameNameIndex];
|
||||
if (gameName.Contains(game[SideloaderRCLONE.ReleaseNameIndex]))
|
||||
return game[SideloaderRCLONE.GameNameIndex];
|
||||
}
|
||||
return gameName;
|
||||
}
|
||||
|
||||
public static string PackageNameToSimpleName(string gameName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (gameName.Contains(game[SideloaderRCLONE.PackageNameIndex]))
|
||||
return game[SideloaderRCLONE.GameNameIndex];
|
||||
}
|
||||
return gameName;
|
||||
}
|
||||
|
||||
|
||||
//Downloads the required files
|
||||
public static void downloadFiles()
|
||||
{
|
||||
var client = new WebClient();
|
||||
ServicePointManager.Expect100Continue = true;
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
|
||||
try
|
||||
{
|
||||
if (!File.Exists("Sideloader Launcher.exe"))
|
||||
client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/Sideloader%20Launcher.exe", "Sideloader Launcher.exe");
|
||||
|
||||
if (!Directory.Exists(ADB.adbFolderPath)) //if there is no adb folder, download and extract
|
||||
{
|
||||
client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/adb.7z", "adb.7z");
|
||||
Utilities.Zip.ExtractFile(Environment.CurrentDirectory + "\\adb.7z", Environment.CurrentDirectory);
|
||||
File.Delete("adb.7z");
|
||||
}
|
||||
|
||||
if (!Directory.Exists(Environment.CurrentDirectory + "\\rclone"))
|
||||
{
|
||||
string url;
|
||||
if (Environment.Is64BitOperatingSystem)
|
||||
url = "https://downloads.rclone.org/v1.55.1/rclone-v1.55.1-windows-amd64.zip";
|
||||
else
|
||||
url = "https://downloads.rclone.org/v1.55.1/rclone-v1.55.1-windows-386.zip";
|
||||
//Since sideloader is build for x86, it should work on both x86 and x64 so we download the according rclone version
|
||||
|
||||
client.DownloadFile(url, "rclone.zip");
|
||||
|
||||
Utilities.Zip.ExtractFile(Environment.CurrentDirectory + "\\rclone.zip", Environment.CurrentDirectory);
|
||||
|
||||
File.Delete("rclone.zip");
|
||||
|
||||
string[] folders = Directory.GetDirectories(Environment.CurrentDirectory);
|
||||
foreach (string folder in folders)
|
||||
{
|
||||
if (folder.Contains("rclone"))
|
||||
{
|
||||
Directory.Move(folder, "rclone");
|
||||
break; //only 1 rclone folder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
FlexibleMessageBox.Show("Your internet is not working properly or rclone/github servers are down, some files may be missing (adb, rclone or launcher)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Management;
|
||||
using System.Net;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
internal class Sideloader
|
||||
{
|
||||
public static string TempFolder = Path.Combine(Environment.CurrentDirectory, "temp");
|
||||
public static string CrashLogPath = "crashlog.txt";
|
||||
|
||||
public static void killWebView2()
|
||||
{
|
||||
var parentProcessId = Process.GetCurrentProcess().Id;
|
||||
var processes = Process.GetProcessesByName("msedgewebview2");
|
||||
|
||||
foreach (var process in processes)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (ManagementObject obj = new ManagementObject($"win32_process.handle='{process.Id}'"))
|
||||
{
|
||||
obj.Get();
|
||||
var ppid = Convert.ToInt32(obj["ParentProcessId"]);
|
||||
|
||||
if (ppid == parentProcessId)
|
||||
{
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_ = Logger.Log($"Exception occured while attempting to shut down WebView2 with exception message: {ex.Message}", LogLevel.ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//push user.json to device (required for some devices like oculus quest)
|
||||
public static void PushUserJsons()
|
||||
{
|
||||
foreach (string userJson in UsernameForm.userJsons)
|
||||
{
|
||||
UsernameForm.createUserJsonByName(Utilities.GeneralUtilities.randomString(16), userJson);
|
||||
_ = ADB.RunAdbCommandToString("push \"" + Environment.CurrentDirectory + $"\\{userJson}\" " + " /sdcard/");
|
||||
File.Delete(userJson);
|
||||
}
|
||||
}
|
||||
|
||||
//List of all installed package names from connected device
|
||||
//public static List<string> InstalledPackageNames = new List<string>(); //Remove folder from device
|
||||
public static ProcessOutput RemoveFolder(string path)
|
||||
{
|
||||
if (path == "/sdcard/Android/obb/" || path == "sdcard/Android/data/")
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return ADB.RunAdbCommandToString($"shell rm -r \"{path}\"");
|
||||
}
|
||||
|
||||
public static ProcessOutput RemoveFile(string path)
|
||||
{
|
||||
return ADB.RunAdbCommandToString($"shell rm -f \"{path}\"");
|
||||
}
|
||||
|
||||
//For games that require manual install, like having another folder that isnt an obb
|
||||
public static ProcessOutput RunADBCommandsFromFile(string path)
|
||||
{
|
||||
ProcessOutput output = new ProcessOutput();
|
||||
string[] commands = File.ReadAllLines(path);
|
||||
string currfolder = Path.GetDirectoryName(path);
|
||||
string[] zipz = Directory.GetFiles(currfolder, "*.7z", SearchOption.AllDirectories);
|
||||
foreach (string zip in zipz)
|
||||
{
|
||||
Utilities.Zip.ExtractFile($"{zip}", currfolder);
|
||||
}
|
||||
foreach (string cmd in commands)
|
||||
{
|
||||
if (cmd.StartsWith("adb"))
|
||||
{
|
||||
string replacement = "";
|
||||
string pattern = "adb";
|
||||
replacement = ADB.DeviceID.Length > 1
|
||||
? $"{Properties.Settings.Default.ADBPath} -s {ADB.DeviceID}"
|
||||
: $"{Properties.Settings.Default.ADBPath}";
|
||||
Regex rgx = new Regex(pattern);
|
||||
string result = rgx.Replace(cmd, replacement);
|
||||
Program.form.changeTitle($"Running {result}");
|
||||
_ = Logger.Log($"Logging command: {result} from file: {path}");
|
||||
output += ADB.RunAdbCommandToStringWOADB(result, path);
|
||||
if (output.Error.Contains("mkdir"))
|
||||
{
|
||||
output.Error = "";
|
||||
}
|
||||
|
||||
if (output.Output.Contains("reserved"))
|
||||
{
|
||||
output.Output = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
output.Output += "Custom install successful!";
|
||||
return output;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//Recursive sideload any apk fileD
|
||||
public static ProcessOutput RecursiveOutput = new ProcessOutput();
|
||||
public static void RecursiveSideload(string FolderPath)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (string f in Directory.GetFiles(FolderPath))
|
||||
{
|
||||
if (Path.GetExtension(f) == ".apk")
|
||||
{
|
||||
RecursiveOutput += ADB.Sideload(f);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (string d in Directory.GetDirectories(FolderPath))
|
||||
{
|
||||
RecursiveSideload(d);
|
||||
}
|
||||
}
|
||||
catch (Exception ex) { _ = Logger.Log(ex.Message, LogLevel.ERROR); }
|
||||
}
|
||||
|
||||
//Recursive copy any obb folder
|
||||
public static void RecursiveCopyOBB(string FolderPath)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (string f in Directory.GetFiles(FolderPath))
|
||||
{
|
||||
RecursiveOutput += ADB.CopyOBB(f);
|
||||
}
|
||||
|
||||
foreach (string d in Directory.GetDirectories(FolderPath))
|
||||
{
|
||||
RecursiveCopyOBB(d);
|
||||
}
|
||||
}
|
||||
catch (Exception ex) { _ = Logger.Log(ex.Message, LogLevel.ERROR); }
|
||||
}
|
||||
|
||||
// Removes the game package and its OBB + Data Folders.
|
||||
public static ProcessOutput UninstallGame(string packagename)
|
||||
{
|
||||
ProcessOutput output = ADB.UninstallPackage(packagename);
|
||||
Program.form.changeTitle("");
|
||||
_ = Sideloader.RemoveFolder("/sdcard/Android/obb/" + packagename);
|
||||
_ = Sideloader.RemoveFolder("/sdcard/Android/data/" + packagename);
|
||||
return output;
|
||||
}
|
||||
|
||||
public static void BackupGame(string packagename)
|
||||
{
|
||||
if (!Properties.Settings.Default.customBackupDir)
|
||||
{
|
||||
MainForm.backupFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
|
||||
}
|
||||
else
|
||||
{
|
||||
MainForm.backupFolder = Path.Combine((Properties.Settings.Default.backupDir), $"Rookie Backups");
|
||||
}
|
||||
if (!Directory.Exists(MainForm.backupFolder))
|
||||
{
|
||||
_ = Directory.CreateDirectory(MainForm.backupFolder);
|
||||
}
|
||||
Program.form.changeTitle($"Attempting to backup any savedata to {MainForm.backupFolder}\\Rookie Backups...");
|
||||
_ = new ProcessOutput("", "");
|
||||
string date_str = DateTime.Today.ToString("yyyy.MM.dd");
|
||||
string CurrBackups = Path.Combine(MainForm.backupFolder, date_str);
|
||||
if (!Directory.Exists(CurrBackups))
|
||||
{
|
||||
_ = Directory.CreateDirectory(CurrBackups);
|
||||
}
|
||||
_ = ADB.RunAdbCommandToString($"pull \"/sdcard/Android/data/{packagename}\" \"{CurrBackups}\"");
|
||||
}
|
||||
|
||||
public static ProcessOutput DeleteFile(string GameName)
|
||||
{
|
||||
ProcessOutput output = new ProcessOutput("", "");
|
||||
|
||||
string packageName = Sideloader.gameNameToPackageName(GameName);
|
||||
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show(Program.form, $"Are you sure you want to uninstall custom QU settings for {packageName}? this CANNOT be undone!", "WARNING!", MessageBoxButtons.YesNo);
|
||||
if (dialogResult != DialogResult.Yes)
|
||||
{
|
||||
return output;
|
||||
}
|
||||
|
||||
output = Sideloader.RemoveFile($"/sdcard/Android/data/{packageName}/private/Config.Json");
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
//Extracts apk from device, saves it by package name to sideloader folder
|
||||
public static ProcessOutput getApk(string GameName)
|
||||
{
|
||||
_ = new ProcessOutput("", "");
|
||||
|
||||
string packageName = Sideloader.gameNameToPackageName(GameName);
|
||||
|
||||
ProcessOutput output = ADB.RunAdbCommandToString("shell pm path " + packageName);
|
||||
|
||||
string apkPath = output.Output; //Get apk
|
||||
|
||||
apkPath = apkPath.Remove(apkPath.Length - 1);
|
||||
apkPath = apkPath.Remove(0, 8); //remove package:
|
||||
apkPath = apkPath.Remove(apkPath.Length - 1);
|
||||
if (File.Exists($"{Properties.Settings.Default.ADBFolder}\\base.apk"))
|
||||
{
|
||||
File.Delete($"{Properties.Settings.Default.ADBFolder}\\base.apk");
|
||||
}
|
||||
|
||||
if (File.Exists($"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk"))
|
||||
{
|
||||
File.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk");
|
||||
}
|
||||
|
||||
output += ADB.RunAdbCommandToString("pull " + apkPath); //pull apk
|
||||
|
||||
if (Directory.Exists($"{Properties.Settings.Default.MainDir}\\{packageName}"))
|
||||
{
|
||||
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}", true);
|
||||
}
|
||||
|
||||
_ = Directory.CreateDirectory($"{Properties.Settings.Default.MainDir}\\{packageName}");
|
||||
|
||||
File.Move($"{Properties.Settings.Default.ADBFolder}\\base.apk", $"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk");
|
||||
return output;
|
||||
}
|
||||
|
||||
public static string gameNameToPackageName(string gameName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (gameName.Equals(game[SideloaderRCLONE.GameNameIndex]) || gameName.Equals(game[SideloaderRCLONE.ReleaseNameIndex]))
|
||||
return game[SideloaderRCLONE.PackageNameIndex];
|
||||
}
|
||||
return gameName;
|
||||
}
|
||||
|
||||
public static string gameNameToVersionCode(string gameName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (gameName.Equals(game[SideloaderRCLONE.GameNameIndex]) || gameName.Equals(game[SideloaderRCLONE.ReleaseNameIndex]))
|
||||
return game[SideloaderRCLONE.VersionCodeIndex];
|
||||
}
|
||||
return gameName;
|
||||
}
|
||||
|
||||
public static string PackageNametoGameName(string packageName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (packageName.Equals(game[SideloaderRCLONE.PackageNameIndex]))
|
||||
return game[SideloaderRCLONE.ReleaseNameIndex];
|
||||
}
|
||||
return packageName;
|
||||
}
|
||||
|
||||
public static string gameNameToSimpleName(string gameName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (gameName.Equals(game[SideloaderRCLONE.GameNameIndex]) || gameName.Equals(game[SideloaderRCLONE.ReleaseNameIndex]))
|
||||
return game[SideloaderRCLONE.GameNameIndex];
|
||||
}
|
||||
return gameName;
|
||||
}
|
||||
|
||||
public static string PackageNameToSimpleName(string packageName)
|
||||
{
|
||||
foreach (string[] game in SideloaderRCLONE.games)
|
||||
{
|
||||
if (packageName.Contains(game[SideloaderRCLONE.PackageNameIndex]))
|
||||
return game[SideloaderRCLONE.GameNameIndex];
|
||||
}
|
||||
return packageName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
227
Sideloader/GetDependencies.cs
Normal file
@@ -0,0 +1,227 @@
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
internal class GetDependencies
|
||||
{
|
||||
public static void updatePublicConfig()
|
||||
{
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
|
||||
| SecurityProtocolType.Tls11
|
||||
| SecurityProtocolType.Tls12
|
||||
| SecurityProtocolType.Ssl3;
|
||||
|
||||
_ = Logger.Log("Attempting to update public config from main.");
|
||||
|
||||
string configUrl = "https://raw.githubusercontent.com/vrpyou/quest/main/vrp-public.json";
|
||||
string fallbackUrl = "https://vrpirates.wiki/downloads/vrp-public.json";
|
||||
|
||||
try
|
||||
{
|
||||
string resultString;
|
||||
|
||||
// Try fetching raw JSON data from the provided link
|
||||
HttpWebRequest getUrl = (HttpWebRequest)WebRequest.Create(configUrl);
|
||||
using (StreamReader responseReader = new StreamReader(getUrl.GetResponse().GetResponseStream()))
|
||||
{
|
||||
resultString = responseReader.ReadToEnd();
|
||||
_ = Logger.Log($"Retrieved updated config from main: {configUrl}.");
|
||||
File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "vrp-public.json"), resultString);
|
||||
_ = Logger.Log("Public config updated successfully from main.");
|
||||
}
|
||||
}
|
||||
catch (Exception mainException)
|
||||
{
|
||||
_ = Logger.Log($"Failed to update public config from main: {mainException.Message}, trying fallback.", LogLevel.ERROR);
|
||||
try
|
||||
{
|
||||
HttpWebRequest getUrl = (HttpWebRequest)WebRequest.Create(fallbackUrl);
|
||||
using (StreamReader responseReader = new StreamReader(getUrl.GetResponse().GetResponseStream()))
|
||||
{
|
||||
string resultString = responseReader.ReadToEnd();
|
||||
_ = Logger.Log($"Retrieved updated config from fallback: {fallbackUrl}.");
|
||||
File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "vrp-public.json"), resultString);
|
||||
_ = Logger.Log("Public config updated successfully from fallback.");
|
||||
}
|
||||
}
|
||||
catch (Exception fallbackException)
|
||||
{
|
||||
_ = Logger.Log($"Failed to update public config from fallback: {fallbackException.Message}.", LogLevel.ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Download required dependencies.
|
||||
public static void downloadFiles()
|
||||
{
|
||||
MainForm.SplashScreen.UpdateBackgroundImage(AndroidSideloader.Properties.Resources.splashimage_deps);
|
||||
|
||||
WebClient client = new WebClient();
|
||||
ServicePointManager.Expect100Continue = true;
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
|
||||
var currentAccessedWebsite = "";
|
||||
try
|
||||
{
|
||||
if (!File.Exists("Sideloader Launcher.exe"))
|
||||
{
|
||||
currentAccessedWebsite = "github";
|
||||
_ = Logger.Log($"Missing 'Sideloader Launcher.exe'. Attempting to download from {currentAccessedWebsite}");
|
||||
client.DownloadFile("https://github.com/VRPirates/rookie/raw/master/Sideloader%20Launcher.exe", "Sideloader Launcher.exe");
|
||||
_ = Logger.Log($"'Sideloader Launcher.exe' download successful");
|
||||
}
|
||||
|
||||
if (!File.Exists("Rookie Offline.cmd"))
|
||||
{
|
||||
currentAccessedWebsite = "github";
|
||||
_ = Logger.Log($"Missing 'Rookie Offline.cmd'. Attempting to download from {currentAccessedWebsite}");
|
||||
client.DownloadFile("https://github.com/VRPirates/rookie/raw/master/Rookie%20Offline.cmd", "Rookie Offline.cmd");
|
||||
_ = Logger.Log($"'Rookie Offline.cmd' download successful");
|
||||
}
|
||||
|
||||
if (!File.Exists("CleanupInstall.cmd"))
|
||||
{
|
||||
currentAccessedWebsite = "github";
|
||||
_ = Logger.Log($"Missing 'CleanupInstall.cmd'. Attempting to download from {currentAccessedWebsite}");
|
||||
client.DownloadFile("https://github.com/VRPirates/rookie/raw/master/CleanupInstall.cmd", "CleanupInstall.cmd");
|
||||
_ = Logger.Log($"'CleanupInstall.cmd' download successful");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_ = FlexibleMessageBox.Show($"You are unable to access raw.githubusercontent.com with the Exception:\n{ex.Message}\n\nSome files may be missing (Offline/Cleanup Script, Launcher)");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!File.Exists($"{Path.GetPathRoot(Environment.SystemDirectory)}RSL\\platform-tools\\adb.exe")) //if adb is not updated, download and auto extract
|
||||
{
|
||||
if (!Directory.Exists($"{Path.GetPathRoot(Environment.SystemDirectory)}RSL\\platform-tools"))
|
||||
{
|
||||
_ = Directory.CreateDirectory($"{Path.GetPathRoot(Environment.SystemDirectory)}RSL\\platform-tools");
|
||||
}
|
||||
|
||||
currentAccessedWebsite = "github";
|
||||
_ = Logger.Log($"Missing adb within {Path.GetPathRoot(Environment.SystemDirectory)}RSL\\platform-tools. Attempting to download from {currentAccessedWebsite}");
|
||||
client.DownloadFile("https://github.com/VRPirates/rookie/raw/master/dependencies.7z", "dependencies.7z");
|
||||
Utilities.Zip.ExtractFile(Path.Combine(Environment.CurrentDirectory, "dependencies.7z"), $"{Path.GetPathRoot(Environment.SystemDirectory)}RSL\\platform-tools");
|
||||
File.Delete("dependencies.7z");
|
||||
_ = Logger.Log($"adb download successful");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_ = FlexibleMessageBox.Show($"You are unable to access raw.githubusercontent.com page with the Exception:\n{ex.Message}\n\nSome files may be missing (ADB)");
|
||||
_ = FlexibleMessageBox.Show("ADB was unable to be downloaded\nRookie will now close.");
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
string wantedRcloneVersion = "1.67.0";
|
||||
bool rcloneSuccess = false;
|
||||
|
||||
rcloneSuccess = downloadRclone(wantedRcloneVersion, false);
|
||||
if (!rcloneSuccess) {
|
||||
rcloneSuccess = downloadRclone(wantedRcloneVersion, true);
|
||||
}
|
||||
if (!rcloneSuccess) {
|
||||
_ = Logger.Log($"Unable to download rclone", LogLevel.ERROR);
|
||||
_ = FlexibleMessageBox.Show("Rclone was unable to be downloaded\nRookie will now close, please use Offline Mode for manual sideloading if needed");
|
||||
Application.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static bool downloadRclone(string wantedRcloneVersion, bool useFallback = false)
|
||||
{
|
||||
try
|
||||
{
|
||||
bool updateRclone = false;
|
||||
string currentRcloneVersion = "0.0.0";
|
||||
|
||||
WebClient client = new WebClient();
|
||||
ServicePointManager.Expect100Continue = true;
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
|
||||
|
||||
_ = Logger.Log($"Checking for Local rclone...");
|
||||
string dirRclone = Path.Combine(Environment.CurrentDirectory, "rclone");
|
||||
string pathToRclone = Path.Combine(dirRclone, "rclone.exe");
|
||||
if (File.Exists(pathToRclone))
|
||||
{
|
||||
var versionInfo = FileVersionInfo.GetVersionInfo(pathToRclone);
|
||||
currentRcloneVersion = versionInfo.ProductVersion;
|
||||
Logger.Log($"Current RCLONE Version {currentRcloneVersion}");
|
||||
if (!MainForm.noRcloneUpdating)
|
||||
{
|
||||
if (currentRcloneVersion != wantedRcloneVersion)
|
||||
{
|
||||
updateRclone = true;
|
||||
_ = Logger.Log($"RCLONE Version does not match ({currentRcloneVersion})! Downloading required version ({wantedRcloneVersion})");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
updateRclone = true;
|
||||
_ = Logger.Log($"RCLONE exe does not exist, attempting to download");
|
||||
}
|
||||
|
||||
if (!Directory.Exists(dirRclone)) {
|
||||
updateRclone = true;
|
||||
_ = Logger.Log($"Missing RCLONE Folder, attempting to download");
|
||||
|
||||
Directory.CreateDirectory(dirRclone);
|
||||
}
|
||||
|
||||
if (updateRclone == true)
|
||||
{
|
||||
MainForm.SplashScreen.UpdateBackgroundImage(AndroidSideloader.Properties.Resources.splashimage_rclone);
|
||||
|
||||
string architecture = Environment.Is64BitOperatingSystem ? "amd64" : "386";
|
||||
string url = $"https://downloads.rclone.org/v{wantedRcloneVersion}/rclone-v{wantedRcloneVersion}-windows-{architecture}.zip";
|
||||
if (useFallback == true) {
|
||||
_ = Logger.Log($"Using git fallback for rclone download");
|
||||
url = $"https://raw.githubusercontent.com/VRPirates/rookie/master/dep/rclone-v{wantedRcloneVersion}-windows-{architecture}.zip";
|
||||
}
|
||||
_ = Logger.Log($"Downloading rclone from {url}");
|
||||
|
||||
_ = Logger.Log("Begin download rclone");
|
||||
client.DownloadFile(url, "rclone.zip");
|
||||
_ = Logger.Log("Complete download rclone");
|
||||
|
||||
_ = Logger.Log($"Extract {Environment.CurrentDirectory}\\rclone.zip");
|
||||
Utilities.Zip.ExtractFile(Path.Combine(Environment.CurrentDirectory, "rclone.zip"), Environment.CurrentDirectory);
|
||||
string dirExtractedRclone = Path.Combine(Environment.CurrentDirectory, $"rclone-v{wantedRcloneVersion}-windows-{architecture}");
|
||||
File.Delete("rclone.zip");
|
||||
_ = Logger.Log("rclone extracted. Moving files");
|
||||
|
||||
foreach (string file in Directory.GetFiles(dirExtractedRclone))
|
||||
{
|
||||
string fileName = Path.GetFileName(file);
|
||||
string destFile = Path.Combine(dirRclone, fileName);
|
||||
if (File.Exists(destFile))
|
||||
{
|
||||
File.Delete(destFile);
|
||||
}
|
||||
File.Move(file, destFile);
|
||||
}
|
||||
Directory.Delete(dirExtractedRclone, true);
|
||||
|
||||
_ = Logger.Log($"rclone download successful");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_ = Logger.Log($"Unable to download rclone: {ex}", LogLevel.ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AndroidSideloader
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public class ProcessOutput
|
||||
{
|
||||
|
||||
@@ -1,13 +1,23 @@
|
||||
using System;
|
||||
using AndroidSideloader.Utilities;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class SideloaderRCLONE
|
||||
internal class rcloneFolder
|
||||
{
|
||||
public string Path { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Size { get; set; }
|
||||
public string ModTime { get; set; }
|
||||
}
|
||||
|
||||
internal class SideloaderRCLONE
|
||||
{
|
||||
public static List<string> RemotesList = new List<string>();
|
||||
|
||||
@@ -17,10 +27,11 @@ namespace AndroidSideloader
|
||||
|
||||
public static int GameNameIndex = 0;
|
||||
public static int ReleaseNameIndex = 1;
|
||||
public static int ReleaseAPKPathIndex = 2;
|
||||
public static int PackageNameIndex = 3;
|
||||
public static int VersionCodeIndex = 4;
|
||||
public static int PackageNameIndex = 2;
|
||||
public static int VersionCodeIndex = 3;
|
||||
public static int ReleaseAPKPathIndex = 4;
|
||||
public static int VersionNameIndex = 5;
|
||||
public static int DownloadsIndex = 6;
|
||||
|
||||
public static List<string> gameProperties = new List<string>();
|
||||
/* Game Name
|
||||
@@ -32,40 +43,103 @@ namespace AndroidSideloader
|
||||
*/
|
||||
public static List<string[]> games = new List<string[]>();
|
||||
|
||||
public static string Nouns = Environment.CurrentDirectory + "\\nouns";
|
||||
public static string ThumbnailsFolder = Environment.CurrentDirectory + "\\thumbnails";
|
||||
public static string NotesFolder = Environment.CurrentDirectory + "\\notes";
|
||||
public static string Nouns = Path.Combine(Environment.CurrentDirectory, "nouns");
|
||||
public static string ThumbnailsFolder = Path.Combine(Environment.CurrentDirectory, "thumbnails");
|
||||
public static string NotesFolder = Path.Combine(Environment.CurrentDirectory, "notes");
|
||||
|
||||
public static void UpdateNouns(string remote)
|
||||
{
|
||||
RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/nouns\" \"{Nouns}\"");
|
||||
}
|
||||
|
||||
_ = Logger.Log($"Updating Nouns");
|
||||
_ = RCLONE.runRcloneCommand_DownloadConfig($"sync \"{remote}:{RcloneGamesFolder}/.meta/nouns\" \"{Nouns}\"");
|
||||
}
|
||||
|
||||
public static void UpdateGamePhotos(string remote)
|
||||
{
|
||||
RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/thumbnails\" \"{ThumbnailsFolder}\"");
|
||||
_ = Logger.Log($"Updating Thumbnails");
|
||||
_ = RCLONE.runRcloneCommand_DownloadConfig($"sync \"{remote}:{RcloneGamesFolder}/.meta/thumbnails\" \"{ThumbnailsFolder}\" --transfers 10");
|
||||
}
|
||||
|
||||
public static void UpdateGameNotes(string remote)
|
||||
{
|
||||
_ = Logger.Log($"Updating Game Notes");
|
||||
_ = RCLONE.runRcloneCommand_DownloadConfig($"sync \"{remote}:{RcloneGamesFolder}/.meta/notes\" \"{NotesFolder}\"");
|
||||
}
|
||||
|
||||
RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/notes\" \"{NotesFolder}\"");
|
||||
public static void UpdateMetadataFromPublic()
|
||||
{
|
||||
_ = Logger.Log($"Downloading Metadata");
|
||||
string rclonecommand =
|
||||
$"sync \":http:/meta.7z\" \"{Environment.CurrentDirectory}\"";
|
||||
_ = RCLONE.runRcloneCommand_PublicConfig(rclonecommand);
|
||||
}
|
||||
|
||||
public static void ProcessMetadataFromPublic()
|
||||
{
|
||||
try
|
||||
{
|
||||
_ = Logger.Log($"Extracting Metadata");
|
||||
Zip.ExtractFile(Path.Combine(Environment.CurrentDirectory, "meta.7z"), Path.Combine(Environment.CurrentDirectory, "meta"),
|
||||
MainForm.PublicConfigFile.Password);
|
||||
|
||||
_ = Logger.Log($"Updating Metadata");
|
||||
|
||||
if (Directory.Exists(Nouns))
|
||||
{
|
||||
Directory.Delete(Nouns, true);
|
||||
}
|
||||
|
||||
if (Directory.Exists(ThumbnailsFolder))
|
||||
{
|
||||
Directory.Delete(ThumbnailsFolder, true);
|
||||
}
|
||||
|
||||
if (Directory.Exists(NotesFolder))
|
||||
{
|
||||
Directory.Delete(NotesFolder, true);
|
||||
}
|
||||
|
||||
Directory.Move(Path.Combine(Environment.CurrentDirectory, "meta", ".meta", "nouns"), Nouns);
|
||||
Directory.Move(Path.Combine(Environment.CurrentDirectory, "meta", ".meta", "thumbnails"), ThumbnailsFolder);
|
||||
Directory.Move(Path.Combine(Environment.CurrentDirectory, "meta", ".meta", "notes"), NotesFolder);
|
||||
|
||||
_ = Logger.Log($"Initializing Games List");
|
||||
string gameList = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "meta", "VRP-GameList.txt"));
|
||||
|
||||
string[] splitList = gameList.Split('\n');
|
||||
splitList = splitList.Skip(1).ToArray();
|
||||
foreach (string game in splitList)
|
||||
{
|
||||
if (game.Length > 1)
|
||||
{
|
||||
string[] splitGame = game.Split(';');
|
||||
games.Add(splitGame);
|
||||
}
|
||||
}
|
||||
|
||||
Directory.Delete(Path.Combine(Environment.CurrentDirectory, "meta"), true);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_ = Logger.Log(e.Message);
|
||||
_ = Logger.Log(e.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RefreshRemotes()
|
||||
{
|
||||
_ = Logger.Log($"Refresh / List Remotes");
|
||||
RemotesList.Clear();
|
||||
var remotes = RCLONE.runRcloneCommand("listremotes").Output.Split('\n');
|
||||
string[] remotes = RCLONE.runRcloneCommand_DownloadConfig("listremotes").Output.Split('\n');
|
||||
|
||||
Logger.Log("Loaded following remotes: ");
|
||||
_ = Logger.Log("Loaded following remotes: ");
|
||||
foreach (string r in remotes)
|
||||
{
|
||||
if (r.Length > 1)
|
||||
{
|
||||
var remote = r.Remove(r.Length - 1);
|
||||
string remote = r.Remove(r.Length - 1);
|
||||
if (remote.Contains("mirror"))
|
||||
{
|
||||
Logger.Log(remote);
|
||||
_ = Logger.Log(remote);
|
||||
RemotesList.Add(remote);
|
||||
}
|
||||
}
|
||||
@@ -74,69 +148,141 @@ namespace AndroidSideloader
|
||||
|
||||
public static void initGames(string remote)
|
||||
{
|
||||
_ = Logger.Log($"Initializing Games List");
|
||||
|
||||
gameProperties.Clear();
|
||||
games.Clear();
|
||||
string tempGameList = RCLONE.runRcloneCommand($"cat \"{remote}:{RcloneGamesFolder}/GameList.txt\"").Output;
|
||||
string tempGameList = RCLONE.runRcloneCommand_DownloadConfig($"cat \"{remote}:{RcloneGamesFolder}/VRP-GameList.txt\"").Output;
|
||||
if (MainForm.debugMode)
|
||||
File.WriteAllText("GamesList.txt", tempGameList);
|
||||
string gamePropertiesLine = Utilities.StringUtilities.RemoveEverythingAfterFirst(tempGameList, "\n");
|
||||
|
||||
foreach (string gameProperty in gamePropertiesLine.Split(';'))
|
||||
{
|
||||
gameProperties.Add(gameProperty);
|
||||
File.WriteAllText("VRP-GamesList.txt", tempGameList);
|
||||
}
|
||||
|
||||
tempGameList = Utilities.StringUtilities.RemoveEverythingBeforeFirst(tempGameList, "\n");
|
||||
|
||||
foreach (string game in tempGameList.Split('\n'))
|
||||
if (!tempGameList.Equals(""))
|
||||
{
|
||||
if (game.Length > 1)
|
||||
games.Add(game.Split(';'));
|
||||
}
|
||||
|
||||
//Output
|
||||
//Console.WriteLine("Headers:");
|
||||
//foreach (string s in gameProperties)
|
||||
//{
|
||||
// Console.WriteLine($"gameProperty: {s}");
|
||||
//}
|
||||
foreach (string[] s in games)
|
||||
{
|
||||
string output = "";
|
||||
for (int i = 0; i < gameProperties.Count; i++)
|
||||
output += s[i] + " ";
|
||||
string[] gameListSplited = tempGameList.Split(new[] { '\n' });
|
||||
gameListSplited = gameListSplited.Skip(1).ToArray();
|
||||
foreach (string game in gameListSplited)
|
||||
{
|
||||
if (game.Length > 1)
|
||||
{
|
||||
string[] splitGame = game.Split(';');
|
||||
games.Add(splitGame);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
|
||||
public static long GetFolderSize(string FolderName, string remote)
|
||||
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
|
||||
public static void updateDownloadConfig()
|
||||
{
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
|
||||
| SecurityProtocolType.Tls11
|
||||
| SecurityProtocolType.Tls12
|
||||
| SecurityProtocolType.Ssl3;
|
||||
_ = Logger.Log($"Attempting to Update Download Config");
|
||||
|
||||
string downloadConfigFilename = "vrp.download.config";
|
||||
|
||||
try
|
||||
{
|
||||
dynamic results = JsonConvert.DeserializeObject<dynamic>(RCLONE.runRcloneCommand($"size \"{remote}:{RcloneGamesFolder}/{FolderName}\" --json").Output);
|
||||
long gameSize = results.bytes.ToObject<long>();
|
||||
return gameSize / 1000000;
|
||||
string configUrl = $"https://vrpirates.wiki/downloads/{downloadConfigFilename}";
|
||||
|
||||
HttpWebRequest getUrl = (HttpWebRequest)WebRequest.Create(configUrl);
|
||||
using (StreamReader responseReader = new StreamReader(getUrl.GetResponse().GetResponseStream()))
|
||||
{
|
||||
string resultString = responseReader.ReadToEnd();
|
||||
|
||||
_ = Logger.Log($"Retrieved updated config from: {configUrl}");
|
||||
|
||||
if (File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new")))
|
||||
{
|
||||
File.Delete(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new"));
|
||||
}
|
||||
|
||||
File.Create(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new")).Close();
|
||||
File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new"), resultString);
|
||||
|
||||
if (!File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", "hash.txt")))
|
||||
{
|
||||
File.Create(Path.Combine(Environment.CurrentDirectory, "rclone", "hash.txt")).Close();
|
||||
}
|
||||
|
||||
string newConfig = CalculateMD5(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new"));
|
||||
string oldConfig = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "rclone", "hash.txt"));
|
||||
|
||||
if (!File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}")))
|
||||
{
|
||||
oldConfig = "Config Doesnt Exist!";
|
||||
}
|
||||
|
||||
_ = Logger.Log($"Online Config Hash: {newConfig}; Local Config Hash: {oldConfig}");
|
||||
|
||||
if (newConfig != oldConfig)
|
||||
{
|
||||
_ = Logger.Log($"Updated Config Hash is different than the current Config. Updating Configuration File.");
|
||||
|
||||
if (File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}")))
|
||||
{
|
||||
File.Delete(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}"));
|
||||
}
|
||||
|
||||
File.Move(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new"), Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}"));
|
||||
|
||||
File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "rclone", "hash.txt"), string.Empty);
|
||||
File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "rclone", "hash.txt"), newConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
_ = Logger.Log($"Updated Config Hash matches last download. Not updating.");
|
||||
|
||||
if (File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new")))
|
||||
{
|
||||
File.Delete(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}g_new"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { return 0; }
|
||||
catch { }
|
||||
}
|
||||
|
||||
public static void updateConfig(string remote)
|
||||
public static void updateUploadConfig()
|
||||
{
|
||||
string localHash = "";
|
||||
try { localHash = File.ReadAllText(Environment.CurrentDirectory + "\\rclone\\hash.txt"); } catch { } //file may not exist
|
||||
|
||||
string hash = RCLONE.runRcloneCommand($"md5sum \"{remote}:Quest Homebrew/Sideloading Methods/1. Rookie Sideloader - VRP Edition/VRP.download.config\"").Output;
|
||||
try { hash = hash.Substring(0, hash.LastIndexOf(" ")); } catch { return; } //remove stuff after hash
|
||||
|
||||
Debug.WriteLine("The local file hash is " + localHash + " and the current a file hash is " + hash);
|
||||
|
||||
if (!string.Equals(localHash, hash))
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
|
||||
| SecurityProtocolType.Tls11
|
||||
| SecurityProtocolType.Tls12
|
||||
| SecurityProtocolType.Ssl3;
|
||||
_ = Logger.Log($"Attempting to Update Upload Config");
|
||||
try
|
||||
{
|
||||
RCLONE.runRcloneCommand(string.Format($"copy \"{remote}:Quest Homebrew/Sideloading Methods/1. Rookie Sideloader - VRP Edition/VRP.download.config\" \"{Environment.CurrentDirectory}\\rclone\""));
|
||||
RCLONE.killRclone();
|
||||
File.WriteAllText(Environment.CurrentDirectory + "\\rclone\\hash.txt", hash);
|
||||
string configUrl = "https://vrpirates.wiki/downloads/vrp.upload.config";
|
||||
|
||||
HttpWebRequest getUrl = (HttpWebRequest)WebRequest.Create(configUrl);
|
||||
using (StreamReader responseReader = new StreamReader(getUrl.GetResponse().GetResponseStream()))
|
||||
{
|
||||
string resultString = responseReader.ReadToEnd();
|
||||
|
||||
_ = Logger.Log($"Retrieved updated config from: {configUrl}");
|
||||
|
||||
File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "rclone", "vrp.upload.config"), resultString);
|
||||
|
||||
_ = Logger.Log("Upload config updated successfully.");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_ = Logger.Log($"Failed to update Upload config: {e.Message}", LogLevel.ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
private static string CalculateMD5(string filename)
|
||||
{
|
||||
using (MD5 md5 = MD5.Create())
|
||||
{
|
||||
using (FileStream stream = File.OpenRead(filename))
|
||||
{
|
||||
byte[] hash = md5.ComputeHash(stream);
|
||||
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,57 +6,44 @@ using System.Text;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class SideloaderUtilities
|
||||
internal class SideloaderUtilities
|
||||
{
|
||||
public static bool CheckFolderIsObb(string path)
|
||||
{
|
||||
string[] files = Directory.GetFiles(path);
|
||||
|
||||
foreach (string file in files)
|
||||
if (file.EndsWith(".obb") || Path.GetDirectoryName(file).Contains(".") && !Path.GetDirectoryName(file).Contains("_data"))
|
||||
{
|
||||
if (file.EndsWith(".obb") || (Path.GetDirectoryName(file).Contains(".") && !Path.GetDirectoryName(file).Contains("_data")))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static string uuid = null;
|
||||
public static string UUID()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2",
|
||||
"SELECT * FROM Win32_Processor");
|
||||
|
||||
foreach (ManagementObject queryObj in searcher.Get())
|
||||
uuid = Properties.Settings.Default.UUID;
|
||||
if (string.IsNullOrEmpty(uuid) != true)
|
||||
{
|
||||
sb.Append(queryObj["NumberOfCores"]);
|
||||
sb.Append(queryObj["ProcessorId"]);
|
||||
sb.Append(queryObj["Name"]);
|
||||
sb.Append(queryObj["SocketDesignation"]);
|
||||
return uuid;
|
||||
}
|
||||
|
||||
searcher = new ManagementObjectSearcher("root\\CIMV2",
|
||||
"SELECT * FROM Win32_BIOS");
|
||||
|
||||
foreach (ManagementObject queryObj in searcher.Get())
|
||||
var bytes = new byte[16];
|
||||
using (var rng = new RNGCryptoServiceProvider())
|
||||
{
|
||||
sb.Append(queryObj["Manufacturer"]);
|
||||
sb.Append(queryObj["Name"]);
|
||||
sb.Append(queryObj["Version"]);
|
||||
|
||||
rng.GetBytes(bytes);
|
||||
}
|
||||
|
||||
searcher = new ManagementObjectSearcher("root\\CIMV2",
|
||||
"SELECT * FROM Win32_BaseBoard");
|
||||
uuid = BitConverter.ToString(bytes).Replace("-", "");
|
||||
|
||||
foreach (ManagementObject queryObj in searcher.Get())
|
||||
{
|
||||
sb.Append(queryObj["Product"]);
|
||||
}
|
||||
Properties.Settings.Default.UUID = uuid;
|
||||
Properties.Settings.Default.Save();
|
||||
|
||||
var bytes = Encoding.ASCII.GetBytes(sb.ToString());
|
||||
SHA256Managed sha = new SHA256Managed();
|
||||
|
||||
byte[] hash = sha.ComputeHash(bytes);
|
||||
|
||||
return BitConverter.ToString(hash).Replace("-", "");
|
||||
return uuid;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
59
Splash.Designer.cs
generated
Normal file
@@ -0,0 +1,59 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class Splash
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Splash));
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// Splash
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
|
||||
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
|
||||
this.CausesValidation = false;
|
||||
this.ClientSize = new System.Drawing.Size(427, 250);
|
||||
this.ControlBox = false;
|
||||
this.DoubleBuffered = true;
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.Name = "Splash";
|
||||
this.ShowIcon = false;
|
||||
this.ShowInTaskbar = false;
|
||||
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "Splash";
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
19
Splash.cs
Normal file
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class Splash : Form
|
||||
{
|
||||
public Splash()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void UpdateBackgroundImage(Image newImage)
|
||||
{
|
||||
this.BackgroundImage = newImage;
|
||||
}
|
||||
}
|
||||
}
|
||||
7261
Splash.resx
Normal file
118
SpoofForm.Designer.cs
generated
@@ -1,118 +0,0 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class SpoofForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.PackageNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.RandomizeButton = new System.Windows.Forms.Button();
|
||||
this.progressBar1 = new System.Windows.Forms.ProgressBar();
|
||||
this.SpoofButton = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// PackageNameTextBox
|
||||
//
|
||||
this.PackageNameTextBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
|
||||
this.PackageNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.PackageNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.PackageNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.PackageNameTextBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.PackageNameTextBox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.PackageNameTextBox.Location = new System.Drawing.Point(13, 13);
|
||||
this.PackageNameTextBox.Name = "PackageNameTextBox";
|
||||
this.PackageNameTextBox.Size = new System.Drawing.Size(273, 24);
|
||||
this.PackageNameTextBox.TabIndex = 1;
|
||||
//
|
||||
// RandomizeButton
|
||||
//
|
||||
this.RandomizeButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.RandomizeButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RandomizeButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RandomizeButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RandomizeButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.RandomizeButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.RandomizeButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.RandomizeButton.Location = new System.Drawing.Point(12, 72);
|
||||
this.RandomizeButton.Name = "RandomizeButton";
|
||||
this.RandomizeButton.Size = new System.Drawing.Size(110, 42);
|
||||
this.RandomizeButton.TabIndex = 2;
|
||||
this.RandomizeButton.Text = "Randomize";
|
||||
this.RandomizeButton.UseVisualStyleBackColor = false;
|
||||
this.RandomizeButton.Click += new System.EventHandler(this.RandomizeButton_Click);
|
||||
//
|
||||
// progressBar1
|
||||
//
|
||||
this.progressBar1.Location = new System.Drawing.Point(13, 43);
|
||||
this.progressBar1.Name = "progressBar1";
|
||||
this.progressBar1.Size = new System.Drawing.Size(273, 23);
|
||||
this.progressBar1.TabIndex = 3;
|
||||
//
|
||||
// SpoofButton
|
||||
//
|
||||
this.SpoofButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.SpoofButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SpoofButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SpoofButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SpoofButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.SpoofButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.SpoofButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.SpoofButton.Location = new System.Drawing.Point(176, 72);
|
||||
this.SpoofButton.Name = "SpoofButton";
|
||||
this.SpoofButton.Size = new System.Drawing.Size(110, 42);
|
||||
this.SpoofButton.TabIndex = 4;
|
||||
this.SpoofButton.Text = "Spoof!";
|
||||
this.SpoofButton.UseVisualStyleBackColor = false;
|
||||
this.SpoofButton.Click += new System.EventHandler(this.SpoofButton_Click);
|
||||
//
|
||||
// SpoofForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.ClientSize = new System.Drawing.Size(300, 131);
|
||||
this.Controls.Add(this.SpoofButton);
|
||||
this.Controls.Add(this.progressBar1);
|
||||
this.Controls.Add(this.RandomizeButton);
|
||||
this.Controls.Add(this.PackageNameTextBox);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.MaximumSize = new System.Drawing.Size(316, 170);
|
||||
this.MinimumSize = new System.Drawing.Size(316, 170);
|
||||
this.Name = "SpoofForm";
|
||||
this.Text = "SpoofForm";
|
||||
this.Load += new System.EventHandler(this.SpoofForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
private System.Windows.Forms.TextBox PackageNameTextBox;
|
||||
private System.Windows.Forms.Button RandomizeButton;
|
||||
private System.Windows.Forms.ProgressBar progressBar1;
|
||||
private System.Windows.Forms.Button SpoofButton;
|
||||
}
|
||||
}
|
||||
74
SpoofForm.cs
@@ -1,74 +0,0 @@
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using Spoofer;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class SpoofForm : Form
|
||||
{
|
||||
public SpoofForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void SpoofButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (!spoofer.HasDependencies())
|
||||
{
|
||||
MessageBox.Show("You are missing the dependencies... Cannot spoof games");
|
||||
return;
|
||||
}
|
||||
string NewPackageName = PackageNameTextBox.Text;
|
||||
string path;
|
||||
|
||||
using (OpenFileDialog openFileDialog = new OpenFileDialog())
|
||||
{
|
||||
openFileDialog.Filter = "Android apps (*.apk)|*.apk";
|
||||
openFileDialog.FilterIndex = 2;
|
||||
openFileDialog.RestoreDirectory = true;
|
||||
|
||||
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
||||
path = openFileDialog.FileName;
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
progressBar1.Style = ProgressBarStyle.Marquee;
|
||||
|
||||
string output = "";
|
||||
//Spawn spoofer in a new thread so the ui isn't blocked
|
||||
Thread t1 = new Thread(() =>
|
||||
{
|
||||
spoofer.Init();
|
||||
output += spoofer.SpoofApk(path, NewPackageName);
|
||||
});
|
||||
t1.IsBackground = true;
|
||||
t1.Start();
|
||||
|
||||
while (t1.IsAlive)
|
||||
await Task.Delay(100);
|
||||
|
||||
|
||||
|
||||
progressBar1.Style = ProgressBarStyle.Continuous;
|
||||
|
||||
if (output.Contains("is not recognized as an internal or external command"))
|
||||
FlexibleMessageBox.Show(Sideloader.SpooferWarning);
|
||||
else
|
||||
FlexibleMessageBox.Show($"App spoofed from {spoofer.originalPackageName} to {NewPackageName}");
|
||||
}
|
||||
|
||||
private void SpoofForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
PackageNameTextBox.Text = Utilities.GeneralUtilities.RandomPackageName();
|
||||
}
|
||||
|
||||
private void RandomizeButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
PackageNameTextBox.Text = Utilities.GeneralUtilities.RandomPackageName();
|
||||
}
|
||||
}
|
||||
}
|
||||
120
SpoofForm.resx
@@ -1,120 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
235
ThemeForm.Designer.cs
generated
@@ -1,235 +0,0 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class themeForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.colorDialog1 = new System.Windows.Forms.ColorDialog();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.button4 = new System.Windows.Forms.Button();
|
||||
this.button5 = new System.Windows.Forms.Button();
|
||||
this.button7 = new System.Windows.Forms.Button();
|
||||
this.button8 = new System.Windows.Forms.Button();
|
||||
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
|
||||
this.button9 = new System.Windows.Forms.Button();
|
||||
this.button10 = new System.Windows.Forms.Button();
|
||||
this.fontDialog1 = new System.Windows.Forms.FontDialog();
|
||||
this.button3 = new System.Windows.Forms.Button();
|
||||
this.button11 = new System.Windows.Forms.Button();
|
||||
this.button12 = new System.Windows.Forms.Button();
|
||||
this.button13 = new System.Windows.Forms.Button();
|
||||
this.openThemeDialog = new System.Windows.Forms.OpenFileDialog();
|
||||
this.button2 = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// colorDialog1
|
||||
//
|
||||
this.colorDialog1.AnyColor = true;
|
||||
this.colorDialog1.FullOpen = true;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Location = new System.Drawing.Point(13, 12);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(128, 23);
|
||||
this.button1.TabIndex = 0;
|
||||
this.button1.Text = "Set backgorund color";
|
||||
this.button1.UseVisualStyleBackColor = true;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// button4
|
||||
//
|
||||
this.button4.Location = new System.Drawing.Point(13, 125);
|
||||
this.button4.Name = "button4";
|
||||
this.button4.Size = new System.Drawing.Size(128, 23);
|
||||
this.button4.TabIndex = 0;
|
||||
this.button4.Text = "Set button color";
|
||||
this.button4.UseVisualStyleBackColor = true;
|
||||
this.button4.Click += new System.EventHandler(this.button4_Click);
|
||||
//
|
||||
// button5
|
||||
//
|
||||
this.button5.Location = new System.Drawing.Point(13, 181);
|
||||
this.button5.Name = "button5";
|
||||
this.button5.Size = new System.Drawing.Size(128, 23);
|
||||
this.button5.TabIndex = 0;
|
||||
this.button5.Text = "Set combobox color";
|
||||
this.button5.UseVisualStyleBackColor = true;
|
||||
this.button5.Click += new System.EventHandler(this.button5_Click);
|
||||
//
|
||||
// button7
|
||||
//
|
||||
this.button7.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.button7.Location = new System.Drawing.Point(185, 11);
|
||||
this.button7.Name = "button7";
|
||||
this.button7.Size = new System.Drawing.Size(93, 52);
|
||||
this.button7.TabIndex = 1;
|
||||
this.button7.Text = "Save";
|
||||
this.button7.UseVisualStyleBackColor = true;
|
||||
this.button7.Click += new System.EventHandler(this.button7_Click);
|
||||
//
|
||||
// button8
|
||||
//
|
||||
this.button8.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.button8.Location = new System.Drawing.Point(185, 69);
|
||||
this.button8.Name = "button8";
|
||||
this.button8.Size = new System.Drawing.Size(93, 52);
|
||||
this.button8.TabIndex = 2;
|
||||
this.button8.Text = "Reset";
|
||||
this.button8.UseVisualStyleBackColor = true;
|
||||
this.button8.Click += new System.EventHandler(this.button8_Click);
|
||||
//
|
||||
// openFileDialog1
|
||||
//
|
||||
this.openFileDialog1.Filter = "Images|*.png;*.jpg;*.bmp;*.gif";
|
||||
//
|
||||
// button9
|
||||
//
|
||||
this.button9.Location = new System.Drawing.Point(13, 40);
|
||||
this.button9.Name = "button9";
|
||||
this.button9.Size = new System.Drawing.Size(128, 23);
|
||||
this.button9.TabIndex = 3;
|
||||
this.button9.Text = "Set background picture";
|
||||
this.button9.UseVisualStyleBackColor = true;
|
||||
this.button9.Click += new System.EventHandler(this.button9_Click);
|
||||
//
|
||||
// button10
|
||||
//
|
||||
this.button10.Location = new System.Drawing.Point(13, 97);
|
||||
this.button10.Name = "button10";
|
||||
this.button10.Size = new System.Drawing.Size(128, 23);
|
||||
this.button10.TabIndex = 4;
|
||||
this.button10.Text = "Set font style";
|
||||
this.button10.UseVisualStyleBackColor = true;
|
||||
this.button10.Click += new System.EventHandler(this.button10_Click);
|
||||
//
|
||||
// fontDialog1
|
||||
//
|
||||
this.fontDialog1.Color = System.Drawing.Color.White;
|
||||
this.fontDialog1.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
//
|
||||
// button3
|
||||
//
|
||||
this.button3.Location = new System.Drawing.Point(13, 69);
|
||||
this.button3.Name = "button3";
|
||||
this.button3.Size = new System.Drawing.Size(128, 23);
|
||||
this.button3.TabIndex = 5;
|
||||
this.button3.Text = "Set font color";
|
||||
this.button3.UseVisualStyleBackColor = true;
|
||||
this.button3.Click += new System.EventHandler(this.button3_Click);
|
||||
//
|
||||
// button11
|
||||
//
|
||||
this.button11.Location = new System.Drawing.Point(13, 153);
|
||||
this.button11.Name = "button11";
|
||||
this.button11.Size = new System.Drawing.Size(128, 23);
|
||||
this.button11.TabIndex = 6;
|
||||
this.button11.Text = "Set sub-button color";
|
||||
this.button11.UseVisualStyleBackColor = true;
|
||||
this.button11.Click += new System.EventHandler(this.button11_Click);
|
||||
//
|
||||
// button12
|
||||
//
|
||||
this.button12.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.button12.Location = new System.Drawing.Point(185, 127);
|
||||
this.button12.Name = "button12";
|
||||
this.button12.Size = new System.Drawing.Size(93, 52);
|
||||
this.button12.TabIndex = 7;
|
||||
this.button12.Text = "Export Theme";
|
||||
this.button12.UseVisualStyleBackColor = true;
|
||||
this.button12.Click += new System.EventHandler(this.button12_Click);
|
||||
//
|
||||
// button13
|
||||
//
|
||||
this.button13.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.button13.Location = new System.Drawing.Point(185, 185);
|
||||
this.button13.Name = "button13";
|
||||
this.button13.Size = new System.Drawing.Size(93, 52);
|
||||
this.button13.TabIndex = 8;
|
||||
this.button13.Text = "Import theme";
|
||||
this.button13.UseVisualStyleBackColor = true;
|
||||
this.button13.Click += new System.EventHandler(this.button13_Click);
|
||||
//
|
||||
// openThemeDialog
|
||||
//
|
||||
this.openThemeDialog.Filter = "Text Files|*.txt";
|
||||
//
|
||||
// button2
|
||||
//
|
||||
this.button2.Location = new System.Drawing.Point(13, 210);
|
||||
this.button2.Name = "button2";
|
||||
this.button2.Size = new System.Drawing.Size(128, 23);
|
||||
this.button2.TabIndex = 9;
|
||||
this.button2.Text = "Set textbox color";
|
||||
this.button2.UseVisualStyleBackColor = true;
|
||||
this.button2.Click += new System.EventHandler(this.button2_Click);
|
||||
//
|
||||
// themeForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.ClientSize = new System.Drawing.Size(290, 248);
|
||||
this.Controls.Add(this.button2);
|
||||
this.Controls.Add(this.button13);
|
||||
this.Controls.Add(this.button12);
|
||||
this.Controls.Add(this.button11);
|
||||
this.Controls.Add(this.button3);
|
||||
this.Controls.Add(this.button10);
|
||||
this.Controls.Add(this.button9);
|
||||
this.Controls.Add(this.button8);
|
||||
this.Controls.Add(this.button7);
|
||||
this.Controls.Add(this.button5);
|
||||
this.Controls.Add(this.button4);
|
||||
this.Controls.Add(this.button1);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.Name = "themeForm";
|
||||
this.Text = "Create Your Theme";
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ColorDialog colorDialog1;
|
||||
private System.Windows.Forms.Button button1;
|
||||
private System.Windows.Forms.Button button4;
|
||||
private System.Windows.Forms.Button button5;
|
||||
private System.Windows.Forms.Button button7;
|
||||
private System.Windows.Forms.Button button8;
|
||||
private System.Windows.Forms.OpenFileDialog openFileDialog1;
|
||||
private System.Windows.Forms.Button button9;
|
||||
private System.Windows.Forms.Button button10;
|
||||
private System.Windows.Forms.FontDialog fontDialog1;
|
||||
private System.Windows.Forms.Button button3;
|
||||
private System.Windows.Forms.Button button11;
|
||||
private System.Windows.Forms.Button button12;
|
||||
private System.Windows.Forms.Button button13;
|
||||
private System.Windows.Forms.OpenFileDialog openThemeDialog;
|
||||
private System.Windows.Forms.Button button2;
|
||||
}
|
||||
}
|
||||
171
ThemeForm.cs
@@ -1,171 +0,0 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using System.Collections.Specialized;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class themeForm : Form
|
||||
{
|
||||
public themeForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
//Code made by @Gotard#9164 from discord (id 352745203322585088)
|
||||
//Steam profile: https://steamcommunity.com/id/GotardPL/
|
||||
private void button4_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.ButtonColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.BackColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void button7_Click(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.Save();
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void button8_Click(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.BackColor = Color.FromArgb(45,45,45);
|
||||
Properties.Settings.Default.ComboBoxColor = Color.FromArgb(45, 45, 45);
|
||||
Properties.Settings.Default.TextBoxColor = Color.FromArgb(45,45,45);
|
||||
Properties.Settings.Default.ButtonColor = SystemColors.ActiveCaptionText;
|
||||
Properties.Settings.Default.SubButtonColor=Color.FromArgb(64, 64, 64);
|
||||
Properties.Settings.Default.BackPicturePath = "";
|
||||
Properties.Settings.Default.FontStyle = new Font("Microsoft Sans Serif", 11, FontStyle.Regular);
|
||||
Properties.Settings.Default.FontColor = Color.White;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void button5_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.ComboBoxColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void button9_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
String extension = Path.GetExtension(openFileDialog1.FileName);
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\pic" + extension))
|
||||
File.Delete(Environment.CurrentDirectory + "\\pic" + extension);
|
||||
File.Copy(openFileDialog1.FileName, Environment.CurrentDirectory + "\\pic" + extension);
|
||||
Properties.Settings.Default.BackPicturePath = Environment.CurrentDirectory + "\\pic" + extension ;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void button10_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (fontDialog1.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
Properties.Settings.Default.FontStyle = fontDialog1.Font;
|
||||
}
|
||||
}
|
||||
|
||||
private void button3_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.FontColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void button11_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.SubButtonColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void button12_Click(object sender, EventArgs e)
|
||||
{
|
||||
String BackColor = ColorTranslator.ToHtml(Properties.Settings.Default.BackColor);
|
||||
String TextBoxColor = ColorTranslator.ToHtml(Properties.Settings.Default.TextBoxColor);
|
||||
String ComboBoxColor = ColorTranslator.ToHtml(Properties.Settings.Default.ComboBoxColor);
|
||||
String ButtonColor = ColorTranslator.ToHtml(Properties.Settings.Default.ButtonColor);
|
||||
String SubButtonColor = ColorTranslator.ToHtml(Properties.Settings.Default.SubButtonColor);
|
||||
String FontColor = ColorTranslator.ToHtml(Properties.Settings.Default.FontColor);
|
||||
var cvt = new FontConverter();
|
||||
string FontStyle = cvt.ConvertToString(Properties.Settings.Default.FontStyle);
|
||||
int i;
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\theme.txt"))
|
||||
{
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\theme11.txt"))
|
||||
MessageBox.Show("You can't export more than 12 themes, sorry :(");
|
||||
else
|
||||
{
|
||||
for (i = 1; i <= 10; i++)
|
||||
{
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\theme" + i + ".txt"))
|
||||
continue;
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
File.WriteAllText(Environment.CurrentDirectory + "\\theme" + i + ".txt", "#SideloaderTheme# \n" + BackColor + "\n" + ButtonColor + "\n" + SubButtonColor + "\n"
|
||||
+ TextBoxColor + "\n" + ComboBoxColor + "\n" + FontColor + "\n" + FontStyle);
|
||||
MessageBox.Show("Theme exported as theme" + i + ".txt");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
File.WriteAllText(Environment.CurrentDirectory + "\\theme.txt", "#SideloaderTheme# \n" + BackColor + "\n" + ButtonColor + "\n" + SubButtonColor + "\n"
|
||||
+ TextBoxColor + "\n" + ComboBoxColor + "\n" + FontColor + "\n" + FontStyle);
|
||||
MessageBox.Show("Theme exported as theme.txt");
|
||||
}
|
||||
}
|
||||
|
||||
private void button13_Click(object sender, EventArgs e)
|
||||
{
|
||||
openThemeDialog.InitialDirectory = Environment.CurrentDirectory;
|
||||
if (openThemeDialog.ShowDialog() == DialogResult.OK) {
|
||||
using (StreamReader sr = new StreamReader(openThemeDialog.FileName))
|
||||
{
|
||||
StringCollection myCol = new StringCollection();
|
||||
myCol.AddRange(File.ReadAllLines(openThemeDialog.FileName));
|
||||
if (myCol.Contains("#SideloaderTheme# "))
|
||||
{
|
||||
String[] settings = new String[myCol.Count];
|
||||
myCol.CopyTo(settings, 0);
|
||||
|
||||
Color BackColor = ColorTranslator.FromHtml(settings[1]);
|
||||
Color ButtonColor = ColorTranslator.FromHtml(settings[2]);
|
||||
Color SubButtonColor = ColorTranslator.FromHtml(settings[3]);
|
||||
Color TextBoxColor = ColorTranslator.FromHtml(settings[4]);
|
||||
Color ComboBoxColor = ColorTranslator.FromHtml(settings[5]);
|
||||
Color FontColor = ColorTranslator.FromHtml(settings[6]);
|
||||
Properties.Settings.Default.BackColor = BackColor;
|
||||
Properties.Settings.Default.ButtonColor = ButtonColor;
|
||||
Properties.Settings.Default.SubButtonColor = SubButtonColor;
|
||||
Properties.Settings.Default.TextBoxColor = TextBoxColor;
|
||||
Properties.Settings.Default.ComboBoxColor = ComboBoxColor;
|
||||
Properties.Settings.Default.FontColor = FontColor;
|
||||
System.ComponentModel.TypeConverter converter =
|
||||
System.ComponentModel.TypeDescriptor.GetConverter(typeof(Font));
|
||||
var cvt = new FontConverter();
|
||||
Font f = cvt.ConvertFromString(settings[7]) as Font;
|
||||
Properties.Settings.Default.FontStyle = f;
|
||||
}
|
||||
else
|
||||
MessageBox.Show("The file you've selected is not a Rookie's Sideloader theme file!");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void button2_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.TextBoxColor = colorDialog1.Color;
|
||||
}
|
||||
}
|
||||
}
|
||||
132
ThemeForm.resx
@@ -1,132 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="colorDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>138, 17</value>
|
||||
</metadata>
|
||||
<metadata name="fontDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>278, 17</value>
|
||||
</metadata>
|
||||
<metadata name="openThemeDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>394, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
44
Transparenter.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public class Transparenter
|
||||
{
|
||||
public static void MakeTransparent(Control control, Graphics g)
|
||||
{
|
||||
Control parent = control.Parent;
|
||||
if (parent == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Rectangle bounds = control.Bounds;
|
||||
Control.ControlCollection siblings = parent.Controls;
|
||||
int index = siblings.IndexOf(control);
|
||||
Bitmap behind = null;
|
||||
for (int i = siblings.Count - 1; i > index; i--)
|
||||
{
|
||||
Control c = siblings[i];
|
||||
if (!c.Bounds.IntersectsWith(bounds))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (behind == null)
|
||||
{
|
||||
behind = new Bitmap(control.Parent.ClientSize.Width, control.Parent.ClientSize.Height);
|
||||
}
|
||||
|
||||
c.DrawToBitmap(behind, c.Bounds);
|
||||
}
|
||||
if (behind == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
g.DrawImage(behind, control.ClientRectangle, bounds, GraphicsUnit.Pixel);
|
||||
behind.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
184
UpdateForm.Designer.cs
generated
Normal file
@@ -0,0 +1,184 @@
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class UpdateForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateForm));
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.YesUpdate = new AndroidSideloader.RoundButton();
|
||||
this.panel3 = new System.Windows.Forms.Panel();
|
||||
this.UpdateTextBox = new System.Windows.Forms.RichTextBox();
|
||||
this.UpdateVerLabel = new System.Windows.Forms.Label();
|
||||
this.CurVerLabel = new System.Windows.Forms.Label();
|
||||
this.SkipUpdate = new System.Windows.Forms.Label();
|
||||
this.panel1.SuspendLayout();
|
||||
this.panel3.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
this.panel1.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.panel1.BackgroundImage = global::AndroidSideloader.Properties.Resources.pattern_cubes;
|
||||
this.panel1.Controls.Add(this.YesUpdate);
|
||||
this.panel1.Controls.Add(this.panel3);
|
||||
this.panel1.Controls.Add(this.UpdateVerLabel);
|
||||
this.panel1.Controls.Add(this.CurVerLabel);
|
||||
this.panel1.Controls.Add(this.SkipUpdate);
|
||||
this.panel1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.panel1.Location = new System.Drawing.Point(-6, -6);
|
||||
this.panel1.Name = "panel1";
|
||||
this.panel1.Size = new System.Drawing.Size(474, 305);
|
||||
this.panel1.TabIndex = 5;
|
||||
this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseDown);
|
||||
this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseMove);
|
||||
this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseUp);
|
||||
//
|
||||
// YesUpdate
|
||||
//
|
||||
this.YesUpdate.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.YesUpdate.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||
this.YesUpdate.BackColor = System.Drawing.Color.Transparent;
|
||||
this.YesUpdate.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.YesUpdate.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.YesUpdate.ForeColor = System.Drawing.Color.White;
|
||||
this.YesUpdate.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.YesUpdate.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.YesUpdate.Location = new System.Drawing.Point(339, 245);
|
||||
this.YesUpdate.Name = "YesUpdate";
|
||||
this.YesUpdate.Radius = 5;
|
||||
this.YesUpdate.Size = new System.Drawing.Size(111, 31);
|
||||
this.YesUpdate.Stroke = true;
|
||||
this.YesUpdate.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.YesUpdate.TabIndex = 2;
|
||||
this.YesUpdate.Text = "Update Now";
|
||||
this.YesUpdate.Transparency = false;
|
||||
this.YesUpdate.Click += new System.EventHandler(this.YesUpdate_Click);
|
||||
//
|
||||
// panel3
|
||||
//
|
||||
this.panel3.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.panel3.Controls.Add(this.UpdateTextBox);
|
||||
this.panel3.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.panel3.Location = new System.Drawing.Point(21, 19);
|
||||
this.panel3.Name = "panel3";
|
||||
this.panel3.Size = new System.Drawing.Size(432, 218);
|
||||
this.panel3.TabIndex = 0;
|
||||
//
|
||||
// UpdateTextBox
|
||||
//
|
||||
this.UpdateTextBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.ComboBoxColor;
|
||||
this.UpdateTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.UpdateTextBox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "ComboBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.UpdateTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.25F);
|
||||
this.UpdateTextBox.ForeColor = System.Drawing.Color.White;
|
||||
this.UpdateTextBox.Location = new System.Drawing.Point(12, 8);
|
||||
this.UpdateTextBox.Margin = new System.Windows.Forms.Padding(6);
|
||||
this.UpdateTextBox.Name = "UpdateTextBox";
|
||||
this.UpdateTextBox.ReadOnly = true;
|
||||
this.UpdateTextBox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
|
||||
this.UpdateTextBox.Size = new System.Drawing.Size(408, 200);
|
||||
this.UpdateTextBox.TabIndex = 1;
|
||||
this.UpdateTextBox.Text = "";
|
||||
this.UpdateTextBox.TextChanged += new System.EventHandler(this.UpdateTextBox_TextChanged);
|
||||
this.UpdateTextBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseDown);
|
||||
this.UpdateTextBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseMove);
|
||||
this.UpdateTextBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseUp);
|
||||
//
|
||||
// UpdateVerLabel
|
||||
//
|
||||
this.UpdateVerLabel.AutoSize = true;
|
||||
this.UpdateVerLabel.BackColor = System.Drawing.Color.Transparent;
|
||||
this.UpdateVerLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F);
|
||||
this.UpdateVerLabel.ForeColor = System.Drawing.SystemColors.Control;
|
||||
this.UpdateVerLabel.Location = new System.Drawing.Point(21, 261);
|
||||
this.UpdateVerLabel.Name = "UpdateVerLabel";
|
||||
this.UpdateVerLabel.Size = new System.Drawing.Size(94, 15);
|
||||
this.UpdateVerLabel.TabIndex = 3;
|
||||
this.UpdateVerLabel.Text = "Update Version:";
|
||||
//
|
||||
// CurVerLabel
|
||||
//
|
||||
this.CurVerLabel.AutoSize = true;
|
||||
this.CurVerLabel.BackColor = System.Drawing.Color.Transparent;
|
||||
this.CurVerLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F);
|
||||
this.CurVerLabel.ForeColor = System.Drawing.SystemColors.Control;
|
||||
this.CurVerLabel.Location = new System.Drawing.Point(21, 245);
|
||||
this.CurVerLabel.Name = "CurVerLabel";
|
||||
this.CurVerLabel.Size = new System.Drawing.Size(94, 15);
|
||||
this.CurVerLabel.TabIndex = 2;
|
||||
this.CurVerLabel.Text = "Current Version:";
|
||||
//
|
||||
// SkipUpdate
|
||||
//
|
||||
this.SkipUpdate.AutoSize = true;
|
||||
this.SkipUpdate.BackColor = System.Drawing.Color.Transparent;
|
||||
this.SkipUpdate.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.SkipUpdate.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
|
||||
this.SkipUpdate.ForeColor = System.Drawing.Color.Silver;
|
||||
this.SkipUpdate.Location = new System.Drawing.Point(374, 279);
|
||||
this.SkipUpdate.Name = "SkipUpdate";
|
||||
this.SkipUpdate.Size = new System.Drawing.Size(76, 13);
|
||||
this.SkipUpdate.TabIndex = 4;
|
||||
this.SkipUpdate.Text = "𝖲𝖪𝖨𝖯 𝖥𝖮𝖱 𝖭𝖮𝖶";
|
||||
this.SkipUpdate.Click += new System.EventHandler(this.SkipUpdate_Click);
|
||||
//
|
||||
// UpdateForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.AutoValidate = System.Windows.Forms.AutoValidate.EnablePreventFocusChange;
|
||||
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(29)))), ((int)(((byte)(29)))), ((int)(((byte)(29)))));
|
||||
this.ClientSize = new System.Drawing.Size(462, 291);
|
||||
this.ControlBox = false;
|
||||
this.Controls.Add(this.panel1);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "UpdateForm";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseDown);
|
||||
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseMove);
|
||||
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseUp);
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.panel1.PerformLayout();
|
||||
this.panel3.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label SkipUpdate;
|
||||
private System.Windows.Forms.Label CurVerLabel;
|
||||
private System.Windows.Forms.Label UpdateVerLabel;
|
||||
private System.Windows.Forms.Panel panel3;
|
||||
private System.Windows.Forms.RichTextBox UpdateTextBox;
|
||||
private System.Windows.Forms.Panel panel1;
|
||||
private RoundButton YesUpdate;
|
||||
}
|
||||
}
|
||||
59
UpdateForm.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class UpdateForm : Form
|
||||
{
|
||||
private bool mouseDown;
|
||||
private Point lastLocation;
|
||||
|
||||
public UpdateForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
CenterToScreen();
|
||||
CurVerLabel.Text += " " + Updater.LocalVersion;
|
||||
UpdateVerLabel.Text += " " + Updater.currentVersion;
|
||||
UpdateTextBox.Text = Updater.changelog;
|
||||
}
|
||||
|
||||
private void YesUpdate_Click(object sender, EventArgs e)
|
||||
{
|
||||
Updater.doUpdate();
|
||||
Close();
|
||||
}
|
||||
|
||||
private void SkipUpdate_Click(object sender, EventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void UpdateTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void UpdateForm_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
mouseDown = true;
|
||||
lastLocation = e.Location;
|
||||
}
|
||||
|
||||
private void UpdateForm_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (mouseDown)
|
||||
{
|
||||
Location = new Point(
|
||||
Location.X - lastLocation.X + e.X, Location.Y - lastLocation.Y + e.Y);
|
||||
|
||||
Update();
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateForm_MouseUp(object sender, MouseEventArgs e)
|
||||
{
|
||||
mouseDown = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
6969
UpdateForm.resx
Normal file
93
Updater.cs
@@ -1,72 +1,79 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
using System.Net.Http;
|
||||
using System.IO;
|
||||
using AndroidSideloader;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class Updater
|
||||
internal class Updater
|
||||
{
|
||||
public static string AppName { get; set; }
|
||||
public static string Repostory { get; set; }
|
||||
private static string RawGitHubUrl;
|
||||
private static string GitHubUrl;
|
||||
public static string Repository { get; set; }
|
||||
private static readonly string RawGitHubUrl = "https://raw.githubusercontent.com/VRPirates/rookie";
|
||||
private static readonly string GitHubUrl = "https://github.com/VRPirates/rookie";
|
||||
|
||||
static readonly public string LocalVersion = "2.7.1";
|
||||
public static readonly string LocalVersion = "2.30.0";
|
||||
public static string currentVersion = string.Empty;
|
||||
public static string changelog = string.Empty;
|
||||
|
||||
//Check if there is a new version of the sideloader
|
||||
private static bool IsUpdateAvailable()
|
||||
// Check if there is a new version of the sideloader
|
||||
private static async Task<bool> IsUpdateAvailableAsync()
|
||||
{
|
||||
HttpClient client = new HttpClient();
|
||||
try
|
||||
using (HttpClient client = new HttpClient())
|
||||
{
|
||||
currentVersion = client.GetStringAsync($"{RawGitHubUrl}/master/version").Result;
|
||||
changelog = client.GetStringAsync($"{RawGitHubUrl}/master/changelog.txt").Result;
|
||||
client.Dispose();
|
||||
try
|
||||
{
|
||||
currentVersion = await client.GetStringAsync($"{RawGitHubUrl}/master/version");
|
||||
changelog = await client.GetStringAsync($"{RawGitHubUrl}/master/changelog.txt");
|
||||
currentVersion = currentVersion.Trim();
|
||||
}
|
||||
catch (HttpRequestException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch { return false; }
|
||||
return LocalVersion != currentVersion;
|
||||
|
||||
return LocalVersion.Trim() != currentVersion;
|
||||
}
|
||||
|
||||
//Call this to ask the user if they want to update
|
||||
public static void Update()
|
||||
// Call this to ask the user if they want to update
|
||||
public static async Task Update()
|
||||
{
|
||||
RawGitHubUrl = $"https://raw.githubusercontent.com/nerdunit/androidsideloader";
|
||||
GitHubUrl = $"https://github.com/nerdunit/androidsideloader";
|
||||
if (IsUpdateAvailable())
|
||||
doUpdate();
|
||||
if (await IsUpdateAvailableAsync())
|
||||
{
|
||||
UpdateForm upForm = new UpdateForm();
|
||||
_ = upForm.ShowDialog();
|
||||
}
|
||||
}
|
||||
|
||||
//If the user wants to update
|
||||
private static void doUpdate()
|
||||
// If the user wants to update
|
||||
public static void doUpdate()
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show($"There is a new update you have version {LocalVersion}, do you want to update?\nCHANGELOG\n{changelog}", $"Version {currentVersion} is available", MessageBoxButtons.YesNo);
|
||||
if (dialogResult != DialogResult.Yes)
|
||||
return;
|
||||
|
||||
//Download new sideloader with version appended to file name so there is no chance of overwriting the current exe
|
||||
try
|
||||
{
|
||||
var fileClient = new WebClient();
|
||||
ServicePointManager.Expect100Continue = true;
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
|
||||
Logger.Log($"Downloading update from {RawGitHubUrl}/releases/download/v{currentVersion}/{AppName}.exe to {AppName} v{currentVersion}.exe");
|
||||
fileClient.DownloadFile($"{GitHubUrl}/releases/download/v{currentVersion}/{AppName}.exe", $"{AppName} v{currentVersion}.exe");
|
||||
fileClient.Dispose();
|
||||
ADB.RunAdbCommandToString("kill-server");
|
||||
|
||||
Logger.Log($"Starting {AppName} v{currentVersion}.exe");
|
||||
Process.Start($"{AppName} v{currentVersion}.exe");
|
||||
//Delete current version
|
||||
using (WebClient fileClient = new WebClient())
|
||||
{
|
||||
ServicePointManager.Expect100Continue = true;
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
|
||||
|
||||
Logger.Log($"Downloading update from {GitHubUrl}/releases/download/v{currentVersion}/{AppName}.exe to {AppName} v{currentVersion}.exe");
|
||||
fileClient.DownloadFile($"{GitHubUrl}/releases/download/v{currentVersion}/{AppName}.exe", $"{AppName} v{currentVersion}.exe");
|
||||
|
||||
Logger.Log($"Starting {AppName} v{currentVersion}.exe");
|
||||
Process.Start($"{AppName} v{currentVersion}.exe");
|
||||
}
|
||||
|
||||
// Delete current version
|
||||
AndroidSideloader.Utilities.GeneralUtilities.Melt();
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Handle specific exceptions that might occur during the update process
|
||||
Logger.Log($"Update failed: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
190
UsernameForm.Designer.cs
generated
@@ -1,92 +1,98 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class UsernameForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.textBox1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.textBox1.ForeColor = System.Drawing.Color.White;
|
||||
this.textBox1.Location = new System.Drawing.Point(13, 13);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Size = new System.Drawing.Size(418, 24);
|
||||
this.textBox1.TabIndex = 0;
|
||||
this.textBox1.Text = "Enter your username here";
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.button1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.button1.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.button1.Location = new System.Drawing.Point(13, 51);
|
||||
this.button1.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(418, 34);
|
||||
this.button1.TabIndex = 1;
|
||||
this.button1.Text = "Create User.Json";
|
||||
this.button1.UseVisualStyleBackColor = false;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// UsernameForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.ClientSize = new System.Drawing.Size(443, 100);
|
||||
this.Controls.Add(this.button1);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ForeColor = System.Drawing.Color.White;
|
||||
this.MaximumSize = new System.Drawing.Size(459, 139);
|
||||
this.MinimumSize = new System.Drawing.Size(459, 139);
|
||||
this.Name = "UsernameForm";
|
||||
this.ShowIcon = false;
|
||||
this.Text = "USER.JSON";
|
||||
this.Load += new System.EventHandler(this.usernameForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
private System.Windows.Forms.Button button1;
|
||||
}
|
||||
}
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class UsernameForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UsernameForm));
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.button1 = new AndroidSideloader.RoundButton();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.textBox1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.textBox1.ForeColor = System.Drawing.Color.White;
|
||||
this.textBox1.Location = new System.Drawing.Point(13, 13);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Size = new System.Drawing.Size(418, 24);
|
||||
this.textBox1.TabIndex = 0;
|
||||
this.textBox1.Text = "Enter your username here";
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(45)))));
|
||||
this.button1.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(45)))));
|
||||
this.button1.BackColor = System.Drawing.Color.Transparent;
|
||||
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
|
||||
this.button1.ForeColor = System.Drawing.Color.White;
|
||||
this.button1.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.button1.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
|
||||
this.button1.Location = new System.Drawing.Point(13, 51);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Radius = 5;
|
||||
this.button1.Size = new System.Drawing.Size(418, 34);
|
||||
this.button1.Stroke = true;
|
||||
this.button1.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
|
||||
this.button1.TabIndex = 2;
|
||||
this.button1.Text = "Create User.Json";
|
||||
this.button1.Transparency = false;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// UsernameForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.BackgroundImage = global::AndroidSideloader.Properties.Resources.pattern_cubes;
|
||||
this.ClientSize = new System.Drawing.Size(443, 100);
|
||||
this.Controls.Add(this.button1);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ForeColor = System.Drawing.Color.White;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.MaximumSize = new System.Drawing.Size(459, 139);
|
||||
this.MinimumSize = new System.Drawing.Size(459, 139);
|
||||
this.Name = "UsernameForm";
|
||||
this.ShowIcon = false;
|
||||
this.Text = "USER.JSON";
|
||||
this.Load += new System.EventHandler(this.usernameForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
private RoundButton button1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
@@ -14,7 +14,7 @@ namespace AndroidSideloader
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
string defaultText;
|
||||
private string defaultText;
|
||||
|
||||
private void usernameForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
@@ -26,7 +26,7 @@ namespace AndroidSideloader
|
||||
{
|
||||
if (textBox1.Text == defaultText || textBox1.Text.Length == 0)
|
||||
{
|
||||
MessageBox.Show("Please enter your username first");
|
||||
_ = MessageBox.Show("Please enter your username first");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -34,12 +34,16 @@ namespace AndroidSideloader
|
||||
{
|
||||
createUserJson(textBox1.Text);
|
||||
|
||||
});
|
||||
t1.IsBackground = true;
|
||||
})
|
||||
{
|
||||
IsBackground = true
|
||||
};
|
||||
t1.Start();
|
||||
|
||||
while (t1.IsAlive)
|
||||
{
|
||||
await Task.Delay(100);
|
||||
}
|
||||
|
||||
MainForm.notify("Done");
|
||||
|
||||
@@ -49,11 +53,11 @@ namespace AndroidSideloader
|
||||
|
||||
public static void createUserJson(string username)
|
||||
{
|
||||
ADB.RunAdbCommandToString($"shell settings put global username {username}");
|
||||
foreach (var jsonFileName in userJsons)
|
||||
_ = ADB.RunAdbCommandToString($"shell settings put global username \"{username}\"");
|
||||
foreach (string jsonFileName in userJsons)
|
||||
{
|
||||
createUserJsonByName(username, jsonFileName);
|
||||
ADB.RunAdbCommandToString("push \"" + Environment.CurrentDirectory + $"\\{jsonFileName}\" " + " /sdcard/");
|
||||
_ = ADB.RunAdbCommandToString("push \"" + Environment.CurrentDirectory + $"\\{jsonFileName}\" " + " /sdcard/");
|
||||
File.Delete(jsonFileName);
|
||||
}
|
||||
|
||||
|
||||
6849
UsernameForm.resx
@@ -1,18 +1,13 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
using System.Net.Http;
|
||||
using System.IO;
|
||||
using AndroidSideloader;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader.Utilities
|
||||
{
|
||||
|
||||
class GeneralUtilities
|
||||
internal class GeneralUtilities
|
||||
{
|
||||
public static long GetDirectorySize(string folderPath)
|
||||
{
|
||||
@@ -29,13 +24,15 @@ namespace AndroidSideloader.Utilities
|
||||
|
||||
public static void ExecuteCommand(string command)
|
||||
{
|
||||
var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
|
||||
processInfo.CreateNoWindow = true;
|
||||
processInfo.UseShellExecute = false;
|
||||
processInfo.RedirectStandardError = true;
|
||||
processInfo.RedirectStandardOutput = true;
|
||||
ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/c " + command)
|
||||
{
|
||||
CreateNoWindow = true,
|
||||
UseShellExecute = false,
|
||||
RedirectStandardError = true,
|
||||
RedirectStandardOutput = true
|
||||
};
|
||||
|
||||
var process = Process.Start(processInfo);
|
||||
Process process = Process.Start(processInfo);
|
||||
|
||||
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
|
||||
CommandOutput += e.Data;
|
||||
@@ -52,7 +49,7 @@ namespace AndroidSideloader.Utilities
|
||||
|
||||
public static void Melt()
|
||||
{
|
||||
Process.Start(new ProcessStartInfo()
|
||||
_ = Process.Start(new ProcessStartInfo()
|
||||
{
|
||||
Arguments = "/C choice /C Y /N /D Y /T 5 & Del \"" + Application.ExecutablePath + "\"",
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
@@ -61,7 +58,8 @@ namespace AndroidSideloader.Utilities
|
||||
});
|
||||
Environment.Exit(0);
|
||||
}
|
||||
static Random rand = new Random();
|
||||
|
||||
private static readonly Random rand = new Random();
|
||||
public static string randomString(int length)
|
||||
{
|
||||
string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
@@ -70,7 +68,7 @@ namespace AndroidSideloader.Utilities
|
||||
int randomInteger = rand.Next(0, valid.Length);
|
||||
while (0 < length--)
|
||||
{
|
||||
res.Append(valid[randomInteger]);
|
||||
_ = res.Append(valid[randomInteger]);
|
||||
randomInteger = rand.Next(0, valid.Length);
|
||||
}
|
||||
return res.ToString();
|
||||
@@ -78,7 +76,7 @@ namespace AndroidSideloader.Utilities
|
||||
|
||||
public static ProcessOutput startProcess(string process, string path, string command)
|
||||
{
|
||||
Logger.Log($"Ran process {process} with command {command} in path {path}");
|
||||
_ = Logger.Log($"Ran process {process} with command {command} in path {path}");
|
||||
Process cmd = new Process();
|
||||
cmd.StartInfo.FileName = "cmd.exe";
|
||||
cmd.StartInfo.RedirectStandardInput = true;
|
||||
@@ -87,38 +85,17 @@ namespace AndroidSideloader.Utilities
|
||||
cmd.StartInfo.WorkingDirectory = path;
|
||||
cmd.StartInfo.CreateNoWindow = true;
|
||||
cmd.StartInfo.UseShellExecute = false;
|
||||
cmd.Start();
|
||||
_ = cmd.Start();
|
||||
cmd.StandardInput.WriteLine(command);
|
||||
cmd.StandardInput.Flush();
|
||||
cmd.StandardInput.Close();
|
||||
cmd.WaitForExit();
|
||||
string error = cmd.StandardError.ReadToEnd();
|
||||
string output = cmd.StandardOutput.ReadToEnd();
|
||||
Logger.Log($"Output: {output}");
|
||||
Logger.Log($"Error: {error}");
|
||||
return new ProcessOutput(output,error);
|
||||
_ = Logger.Log($"Output: {output}");
|
||||
_ = Logger.Log($"Error: {error}", LogLevel.ERROR);
|
||||
return new ProcessOutput(output, error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class Zip
|
||||
{
|
||||
public static void ExtractFile(string sourceArchive, string destination)
|
||||
{
|
||||
if (!File.Exists(Environment.CurrentDirectory + "\\7z.exe"))
|
||||
{
|
||||
WebClient client = new WebClient();
|
||||
client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/7z.exe", "7z.exe");
|
||||
client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/7z.dll", "7z.dll");
|
||||
}
|
||||
ProcessStartInfo pro = new ProcessStartInfo();
|
||||
pro.WindowStyle = ProcessWindowStyle.Hidden;
|
||||
pro.FileName = "7z.exe";
|
||||
pro.Arguments = string.Format("x \"{0}\" -y -o\"{1}\"", sourceArchive, destination);
|
||||
Process x = Process.Start(pro);
|
||||
x.WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,26 +1,62 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class Logger
|
||||
{
|
||||
public string logfile = Properties.Settings.Default.CurrentLogPath;
|
||||
public static bool Log(string text, bool ret = true)
|
||||
{
|
||||
|
||||
string time = DateTime.Now.ToString("hh:mmtt(UTC): ");
|
||||
if (text.Length > 5)
|
||||
{
|
||||
|
||||
string newline = "\n";
|
||||
if (text.Length > 40 && text.Contains("\n"))
|
||||
newline += "\n\n";
|
||||
try {File.AppendAllText(Properties.Settings.Default.CurrentLogPath, time + text + newline); } catch { }
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public enum LogLevel
|
||||
{
|
||||
DEBUG,
|
||||
INFO,
|
||||
WARNING,
|
||||
ERROR,
|
||||
TRACE,
|
||||
FATAL
|
||||
}
|
||||
|
||||
public static class Logger
|
||||
{
|
||||
private static readonly object lockObject = new object();
|
||||
private static string logFilePath = Properties.Settings.Default.CurrentLogPath;
|
||||
|
||||
public static bool Log(string text, LogLevel logLevel = LogLevel.INFO, bool ret = true)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(text) || text.Length <= 5)
|
||||
return ret;
|
||||
|
||||
string time = DateTime.UtcNow.ToString("hh:mm:ss.fff tt (UTC): ");
|
||||
string newline = text.Length > 40 && text.Contains("\n") ? "\n\n" : "\n";
|
||||
string logEntry = time + "[" + logLevel.ToString().ToUpper() + "] [" + GetCallerInfo() + "] " + text + newline;
|
||||
|
||||
try
|
||||
{
|
||||
lock (lockObject)
|
||||
{
|
||||
File.AppendAllText(logFilePath, logEntry);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Handle the exception if necessary
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
private static string GetCallerInfo()
|
||||
{
|
||||
System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true);
|
||||
if (stackTrace.FrameCount >= 3)
|
||||
{
|
||||
var frame = stackTrace.GetFrame(2);
|
||||
var method = frame.GetMethod();
|
||||
string className = method.DeclaringType?.Name;
|
||||
string methodName = method.Name;
|
||||
string callerInfo = $"{className}.{methodName}";
|
||||
return callerInfo;
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
81
Utilities/Metrics.cs
Normal file
@@ -0,0 +1,81 @@
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace AndroidSideloader.Utilities
|
||||
{
|
||||
internal class Metrics
|
||||
{
|
||||
public static async void CountDownload(string packageName, string versionCode)
|
||||
{
|
||||
try
|
||||
{
|
||||
var apiUrl = "https://api.vrpirates.wiki/metrics/add";
|
||||
|
||||
var requestBody = new
|
||||
{
|
||||
packagename = packageName,
|
||||
versioncode = versionCode
|
||||
};
|
||||
var json = JsonConvert.SerializeObject(requestBody);
|
||||
string res = await Task.Run(() => sendToApi(apiUrl, json, "post"));
|
||||
_ = Logger.Log(res);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log($"Unable to log download: {ex.Message}", LogLevel.WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static async Task<string> sendToApi(string apiUrl, string requestBody = null, string type = "get")
|
||||
{
|
||||
string token = "cm9va2llOkN0UHlyTE9oUGoxWXg1cE9KdDNBSkswZ25n";
|
||||
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
var request = new HttpRequestMessage();
|
||||
|
||||
// Set the HTTP method
|
||||
request.Method = type.ToLower() == "post" ? HttpMethod.Post : HttpMethod.Get;
|
||||
|
||||
// For GET requests with parameters, append them to the URL
|
||||
if (request.Method == HttpMethod.Get && !string.IsNullOrEmpty(requestBody))
|
||||
{
|
||||
var uriBuilder = new UriBuilder(apiUrl);
|
||||
uriBuilder.Query = requestBody;
|
||||
request.RequestUri = uriBuilder.Uri;
|
||||
}
|
||||
else
|
||||
{
|
||||
request.RequestUri = new Uri(apiUrl);
|
||||
}
|
||||
|
||||
// For POST requests, set the content
|
||||
if (request.Method == HttpMethod.Post && !string.IsNullOrEmpty(requestBody))
|
||||
{
|
||||
request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
|
||||
}
|
||||
|
||||
// Add headers to the request
|
||||
request.Headers.Add("Authorization", token);
|
||||
request.Headers.Add("Origin", "rookie");
|
||||
|
||||
string responseContent = "";
|
||||
try
|
||||
{
|
||||
HttpResponseMessage response = await client.SendAsync(request);
|
||||
responseContent = await response.Content.ReadAsStringAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log($"Unable to get Metrics Data: {ex.Message}", LogLevel.WARNING);
|
||||
}
|
||||
|
||||
return responseContent;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Linq;
|
||||
|
||||
namespace AndroidSideloader.Utilities
|
||||
{
|
||||
class StringUtilities
|
||||
internal class StringUtilities
|
||||
{
|
||||
public static string RemoveEverythingAfterFirst(string s, string removeMe)
|
||||
{
|
||||
int index = s.IndexOf(removeMe);
|
||||
if (index > 0)
|
||||
{
|
||||
s = s.Substring(0, index);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -20,7 +19,10 @@ namespace AndroidSideloader.Utilities
|
||||
{
|
||||
int index = s.LastIndexOf(removeMe);
|
||||
if (index > 0)
|
||||
{
|
||||
s = s.Substring(0, index);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -28,7 +30,10 @@ namespace AndroidSideloader.Utilities
|
||||
{
|
||||
int index = s.IndexOf(removeMe);
|
||||
if (index > 0)
|
||||
{
|
||||
s = s.Substring(index);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -50,7 +55,10 @@ namespace AndroidSideloader.Utilities
|
||||
{
|
||||
int index = s.LastIndexOf(removeMe);
|
||||
if (index > 0)
|
||||
{
|
||||
s = s.Substring(index);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
16
Utilities/UpdateGameData.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
namespace AndroidSideloader.Utilities
|
||||
{
|
||||
internal class UpdateGameData
|
||||
{
|
||||
public UpdateGameData(string gameName, string packageName, ulong installedVersionInt)
|
||||
{
|
||||
GameName = gameName;
|
||||
Packagename = packageName;
|
||||
InstalledVersionInt = installedVersionInt;
|
||||
}
|
||||
public string GameName { get; set; }
|
||||
public string Packagename { get; set; }
|
||||
|
||||
public ulong InstalledVersionInt { get; set; }
|
||||
}
|
||||
}
|
||||
25
Utilities/UploadGame.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
namespace AndroidSideloader.Utilities
|
||||
{
|
||||
internal class UploadGame
|
||||
{
|
||||
public UploadGame(string Uploadcommand, string Pckgcommand, string Uploadgamename, ulong Uploadversion, bool isUpdate)
|
||||
{
|
||||
this.Pckgcommand = Pckgcommand;
|
||||
this.Uploadgamename = Uploadgamename;
|
||||
this.Uploadversion = Uploadversion;
|
||||
this.isUpdate = isUpdate;
|
||||
}
|
||||
public UploadGame()
|
||||
{
|
||||
|
||||
}
|
||||
public bool isUpdate { get; set; }
|
||||
|
||||
public string Pckgcommand { get; set; }
|
||||
|
||||
public string Uploadgamename { get; set; }
|
||||
|
||||
public ulong Uploadversion { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
133
Utilities/Zip.cs
Normal file
@@ -0,0 +1,133 @@
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader.Utilities
|
||||
{
|
||||
public class ExtractionException : Exception
|
||||
{
|
||||
public ExtractionException(string message) : base(message) { }
|
||||
}
|
||||
|
||||
internal class Zip
|
||||
{
|
||||
public static void ExtractFile(string sourceArchive, string destination)
|
||||
{
|
||||
string args = $"x \"{sourceArchive}\" -y -o\"{destination}\" -bsp1";
|
||||
DoExtract(args);
|
||||
}
|
||||
|
||||
public static void ExtractFile(string sourceArchive, string destination, string password)
|
||||
{
|
||||
string args = $"x \"{sourceArchive}\" -y -o\"{destination}\" -p\"{password}\" -bsp1";
|
||||
DoExtract(args);
|
||||
}
|
||||
|
||||
private static string extractionError = null;
|
||||
private static bool errorMessageShown = false;
|
||||
private static void DoExtract(string args)
|
||||
{
|
||||
if (!File.Exists(Path.Combine(Environment.CurrentDirectory, "7z.exe")) || !File.Exists(Path.Combine(Environment.CurrentDirectory, "7z.dll")))
|
||||
{
|
||||
_ = Logger.Log("Begin download 7-zip");
|
||||
WebClient client = new WebClient();
|
||||
string architecture = Environment.Is64BitOperatingSystem ? "64" : "";
|
||||
try
|
||||
{
|
||||
client.DownloadFile($"https://github.com/VRPirates/rookie/raw/master/7z{architecture}.exe", $"7z.exe");
|
||||
client.DownloadFile($"https://github.com/VRPirates/rookie/raw/master/7z{architecture}.dll", $"7z.dll");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_ = FlexibleMessageBox.Show($"You are unable to access the GitHub page with the Exception: {ex.Message}\nSome files may be missing (7z)");
|
||||
_ = FlexibleMessageBox.Show("7z was unable to be downloaded\nRookie will now close");
|
||||
Application.Exit();
|
||||
}
|
||||
_ = Logger.Log("Complete download 7-zip");
|
||||
}
|
||||
|
||||
ProcessStartInfo pro = new ProcessStartInfo
|
||||
{
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
FileName = "7z.exe",
|
||||
Arguments = args,
|
||||
CreateNoWindow = true,
|
||||
UseShellExecute = false,
|
||||
RedirectStandardInput = true,
|
||||
RedirectStandardError = true,
|
||||
RedirectStandardOutput = true
|
||||
};
|
||||
|
||||
_ = Logger.Log($"Extract: 7z {string.Join(" ", args.Split(' ').Where(a => !a.StartsWith("-p")))}");
|
||||
|
||||
using (Process x = new Process())
|
||||
{
|
||||
x.StartInfo = pro;
|
||||
|
||||
if (MainForm.isInDownloadExtract && x != null)
|
||||
{
|
||||
x.OutputDataReceived += (sender, e) =>
|
||||
{
|
||||
if (e.Data != null)
|
||||
{
|
||||
var match = Regex.Match(e.Data, @"(\d+)%");
|
||||
if (match.Success)
|
||||
{
|
||||
int progress = int.Parse(match.Groups[1].Value);
|
||||
MainForm mainForm = (MainForm)Application.OpenForms[0];
|
||||
if (mainForm != null)
|
||||
{
|
||||
mainForm.Invoke((Action)(() => mainForm.SetProgress(progress)));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
x.ErrorDataReceived += (sender, e) =>
|
||||
{
|
||||
if (e.Data != null)
|
||||
{
|
||||
var error = e.Data;
|
||||
if (error.Contains("There is not enough space on the disk") && !errorMessageShown)
|
||||
{
|
||||
errorMessageShown = true;
|
||||
Program.form.Invoke(new Action(() =>
|
||||
{
|
||||
_ = FlexibleMessageBox.Show(Program.form, $"Not enough space to extract archive.\r\nMake sure your {Path.GetPathRoot(Properties.Settings.Default.downloadDir)} drive has at least double the space of the game, then try again.",
|
||||
"NOT ENOUGH SPACE",
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error);
|
||||
return;
|
||||
}));
|
||||
}
|
||||
_ = Logger.Log(error, LogLevel.ERROR);
|
||||
extractionError = $"Extracting failed: {error}"; // Store the error message directly
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
x.Start();
|
||||
x.BeginOutputReadLine();
|
||||
x.BeginErrorReadLine();
|
||||
x.WaitForExit();
|
||||
errorMessageShown = false;
|
||||
|
||||
if (!string.IsNullOrEmpty(extractionError))
|
||||
{
|
||||
string errorMessage = extractionError;
|
||||
extractionError = null; // Reset the error message
|
||||
throw new ExtractionException(errorMessage);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +1,30 @@
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
RSL 2.30
|
||||
|
||||
RSL 2.7.1
|
||||
|
||||
= Fixed apk path for in-place reinstall. Should work correctly now.
|
||||
|
||||
HFP
|
||||
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEOGwkACgkQx/Rql1Vo
|
||||
czfPHw//eXtKkM1g/mjz43/BLTjhT1PTrwvolCmds+LzMTHT1EfDyouJBZ2XxnXQ
|
||||
NiZkk9SR3m/VmJSr0FO7p7F9Ab07xEUIv280C7Mbqyr0KEPiQTvrlnL/eX4sx/Px
|
||||
1pmDCuPUL42u2zo4famGxDvduoVToyPrIzzv3QYt8qJGEAYRG4gtn26SB38+JslU
|
||||
eU6hJkB2E7BNZXRtpiDM7rsejOtzsIROdLeIztSyIyTl/sY4Az9nfgRiJFyHsPsJ
|
||||
ILRRkquCzkXbzzdjS8AqPPIzt+JZdp+ZZS2H3gSeld4We8rkm5CzBef7pzeP6ZKZ
|
||||
WGYnw1Et9dtflSAmfDb6i4Rr5Y3mPLk2OzIeYebZ0fCGmyrpJ7QlRfYqJNJ7JMH9
|
||||
DOmsSNVUvFRR+b0FnT414uSg4Q79cYXWsJ/Wi28PIOQF0nQwtPIKly2x1kB4NE7P
|
||||
CItXy8VJ//q0/2ijHB3ZQIiMkj78TVePCAC6TQT4RnBgWS0HeItBKZJYCcyvhe72
|
||||
6H9qzOVsIKHgxnfbRON9tZOWxpxIdnbFsaE5TsiXp+80SsaHhxcxuAyjh0M0CaKu
|
||||
lh3z9FJmZW8CrxIA1G1sQePxqF3iObVhqJPqp8G7N6UC1wBnhJWmnBKTYm1iHs6P
|
||||
pj8ggpyFTT55UxGeRklLUyoSxSnqSE7Oj2zluLvBFHPi1KAMlEg=
|
||||
=HVQ5
|
||||
-----END PGP SIGNATURE-----
|
||||
- Feature: Added Download Metrics
|
||||
-- Upon downloading a game, Rookie will attempt to log the download count with our server
|
||||
-- No additional data is collected except for the Package Name and VersionCode of the Game being downloaded
|
||||
- Feature: Added Downloads column to Gamelist
|
||||
-- Downloads counts are updated nightly
|
||||
- Feature: Added "Send Command" button to ADB Commands prompt (Enter still works)
|
||||
- Feature: Small changes to how the Upload Mirror works
|
||||
-- Rookie can now verify game uploads are successful
|
||||
- Feature: Add Cleanup Install script
|
||||
- Feature: Added additional Splashes to indicate loading status
|
||||
- Feature: Added setting to supress Re-Download prompt
|
||||
- Feature: Added "Disable Checking for New Apps" argument (for Testers sanity)
|
||||
- Feature: Added Bandwidth Limiter to Settings
|
||||
- Fix: Fixes for using Sponsored Mirrors
|
||||
-- Eliminated downloading of vrp.download.config from the wiki
|
||||
-- Fixed issue where Rookie would check for the mirror before it was loaded in
|
||||
- Fix: Add quotes around all ADB path commands
|
||||
- Fix: Public Mirror label not displaying
|
||||
- Fix: Allow spaces when setting username
|
||||
- Fix: Prevent Rookie from constantly prompting for the Public Config
|
||||
- Fix: Fixed issue where the Game List doesn't copy/export properly
|
||||
- Fix: Fixed issue where dropping an entire folder doesn't read the install.txt
|
||||
- Chore: Remove random mirror picker (no longer used)
|
||||
- Chore: Changed unable to connect message
|
||||
- Chore: Remove Offline Mode popup
|
||||
- Chore: Remove unused dependencies
|
||||
- Chore: Rename random assets
|
||||
- Chore: Bump rclone to 1.67.0 (from 1.66.0)
|
||||
|
||||