Compare commits

...

471 Commits

Author SHA1 Message Date
Fenopy
c079f87fc6 Merge pull request #161 from VRPirates/beta/RSL-2.31.2
version bump
2024-12-09 10:30:41 -06:00
fenopy
288da1736e version bump 2024-12-09 10:30:04 -06:00
Fenopy
1160c24ad2 Merge pull request #156 from VRPirates/beta/RSL-2.31.1
Beta/rsl 2.31.1
2024-12-06 19:35:26 -06:00
fenopy
b2c8dd7d10 chore: linting 2024-12-06 18:33:04 -06:00
fenopy
59674fe781 fix: adult content filtering 2024-12-06 18:32:54 -06:00
fenopy
4b3b9b0558 version bump 2024-12-06 18:32:09 -06:00
Fenopy
866f8821a5 Merge pull request #155 from VRPirates/beta/RSL-2.31
fix: column sort for new popularity ratings
2024-12-06 13:26:07 -06:00
fenopy
2b4ec9af38 fix: column sort for new popularity ratings 2024-12-06 13:25:31 -06:00
Fenopy
6527a7ce31 Merge pull request #154 from VRPirates/beta/RSL-2.31
Beta/rsl 2.31
2024-12-06 13:13:48 -06:00
fenopy
aa9babfb18 chore: bump rclone to 1.68.2 2024-12-06 13:11:29 -06:00
fenopy
6e9b8a19f5 version bump 2024-12-06 12:49:30 -06:00
fenopy
62515ef59c fix: change "downloads" to "popularity" 2024-12-06 12:46:12 -06:00
fenopy
1d3830e0b2 fix: case insensitive packagename checks 2024-12-06 12:42:48 -06:00
fenopy
b62307310c fix: wrap trailer fetching in catch 2024-11-14 09:22:00 -06:00
fenopy
6b2841cd0c fix: change adult filter for new format 2024-11-14 08:35:19 -06:00
fenopy
a5b0e60acc chore: bump rclone to 1.68.1 2024-11-10 10:50:44 -06:00
fenopy
c084cf9bfb fix: always create log 2024-11-10 08:28:01 -06:00
fenopy
005918aec0 feat: preserve vrp.download.config on rclone update 2024-11-10 08:26:16 -06:00
fenopy
5eaf7d5498 fix: adult content filter 2024-11-10 08:23:35 -06:00
fenopy
b3ca9bcd66 Merge branch 'beta/RSL-2.31' of https://github.com/VRPirates/rookie into beta/RSL-2.31 2024-11-09 21:22:33 -06:00
fenopy
9aed677d3a chore: add build.cmd 2024-11-09 21:21:50 -06:00
Chax
1b66beb957 Fix OBB pushing on drag and drop. 2024-11-10 04:14:43 +01:00
fenopy
0e092df064 fix: update cleanupinstall to use userprofile instead of username 2024-11-09 21:07:24 -06:00
Chax
d80dc1c465 Add safeguard to prevent deletion of current directory 2024-11-05 00:19:56 +01:00
Chax
eed21ff56f Add intricate logging and trycatch block to initListView when checking for unrecognized app 2024-10-21 21:37:14 +02:00
fenopy
1471b6bb0b Merge remote-tracking branch 'origin/beta/RSL-2.30.1' into beta/RSL-2.31 2024-10-11 13:47:22 -05:00
Chax
f85d43d701 Revert putting the check in ShowPrcOutput and instead check in downloadInstallGameButton_Click & refreshGamesListAsync 2024-10-07 19:46:44 +02:00
Chax
73f0a840e9 Do not show ShowPrcOutput messages when settings.EnableMessageBoxes is disabled 2024-10-07 19:35:32 +02:00
Chax
a09e469491 Remove redundant SettingsManager calls & add HideAdultContent checkbox 2024-10-06 18:11:54 +02:00
Chax
1db593c634 Initiate SettingsManager in Logger.cs and Zip.cs & Save() when creating Instance 2024-10-05 18:34:30 +02:00
Chax
eb88d746c1 Switch away from using inbuilt settings and use a json 2024-10-05 17:09:12 +02:00
fenopy
f7b5c94136 fix: wrap adb in try to prevent crash 2024-10-04 08:44:15 -05:00
fenopy
58aa1be7c5 chore: update readme 2024-10-02 06:33:12 -05:00
Chax
426d99e519 Fix sorting in all numeric columns.
This closes #124
2024-09-23 20:47:16 +02:00
Fenopy
8dec5d906a Merge pull request #137 from VRPirates/beta/RSL-2.30
Beta/rsl 2.30
2024-09-17 10:12:05 -05:00
fenopy
ae02b5c135 chore: update readme with latest VT-Scan 2024-09-17 10:11:00 -05:00
fenopy
fe94119627 fix: set dialog parent 2024-09-17 09:59:22 -05:00
Fenopy
ee13bd08cb Merge pull request #134 from VRPirates/beta/RSL-2.30-readme
chore: update readme
2024-09-12 08:47:39 -05:00
fenopy
6a464ad3e7 chore: update readme 2024-09-12 08:45:50 -05:00
fenopy
f0d2a42ee3 fix: update pub config toggles prompt on/off 2024-09-10 12:08:44 -05:00
fenopy
b18ce51e4c fix: fix downloading rclone when folder exists but exe does not 2024-09-10 08:14:43 -05:00
fenopy
535b3826f8 fix: change device unauthorized prompt 2024-09-05 10:28:50 -05:00
fenopy
f1a884e200 chore: change to dl-args 2024-08-29 15:25:20 -05:00
fenopy
072e2246a8 fix: avoid 0 bwlimit 2024-08-29 13:49:17 -05:00
fenopy
2c3ecf654a feat: disable-app-check also prevents new-app dono box 2024-08-28 15:10:08 -05:00
fenopy
8699136d6d chore: update changelog for 2.30 2024-08-28 14:57:40 -05:00
Fenopy
35803b7014 Merge pull request #130 from VRPirates/fix/DragAndDroppingCustomInstall
Fix Rookie not running custom install.txts when drag and dropping who…
2024-08-28 14:47:33 -05:00
fenopy
af358f8f99 Merge branch 'beta/RSL-2.30' of https://github.com/VRPirates/rookie into beta/RSL-2.30 2024-08-28 14:46:41 -05:00
Fenopy
138183798c Merge pull request #129 from VRPirates/fix/CopyGameList
Change copying the gamelist to grab the items of the listview directly.
2024-08-28 14:46:21 -05:00
fenopy
8b3066cf99 Merge branch 'feat/BandwidthLimiter' into beta/RSL-2.30 2024-08-28 14:42:44 -05:00
fenopy
91e21f59af chore: label buttons 2024-08-28 13:16:31 -05:00
Chax
85144e339f Allow spaces in username 2024-08-28 19:55:27 +02:00
Chax
dbd9b145ea Merge 2024-08-28 19:51:49 +02:00
fenopy
287181622d fix: lock adb command size 2024-08-28 12:48:39 -05:00
Chax
7f76bba866 Adjust window size to account for downloads column 2024-08-28 19:48:32 +02:00
fenopy
4b791fe86b chore: version bump 2024-08-28 12:30:32 -05:00
fenopy
e17a582ae7 fix: add inplace to sponsored downloads 2024-08-28 12:29:13 -05:00
fenopy
a271088e9a chore: remove reused code 2024-08-28 12:29:02 -05:00
fenopy
712d686559 fix: issues switching to sponsored mirror 2024-08-28 12:28:51 -05:00
fenopy
481dd1b3e2 fix: change splash during get deps 2024-08-28 11:23:17 -05:00
fenopy
bd435094b6 chore: bump rclone to 1.67.0 2024-08-28 11:09:13 -05:00
fenopy
16fa08d952 fix: actually use getdeps 2024-08-28 11:08:56 -05:00
fenopy
aa89953bf5 chore: rename assets from random names; add offline splash 2024-08-28 09:57:33 -05:00
fenopy
06cba22ad8 chore: fix error message language 2024-08-28 09:20:16 -05:00
fenopy
5923ce5ebc chore: fix wording 2024-08-28 07:32:31 -05:00
fenopy
01eac1aec6 fix: changes for new upload dir 2024-08-28 07:32:23 -05:00
fenopy
46189dcd43 chore: metric change 2024-07-19 10:11:05 -05:00
fenopy
1d9f304735 feat: add Send Command button to adb form 2024-07-17 15:17:19 -05:00
fenopy
362b74e6a5 feat: add downloads column 2024-07-16 11:42:50 -05:00
Chax
ee68e3f01b Add a bandwidth limiter 2024-07-16 18:39:29 +02:00
Chax
09e2de0390 Fix Rookie not running custom install.txts when drag and dropping whole folders. 2024-07-16 17:38:11 +02:00
fenopy
12c9972b24 feat: download metrics 2024-07-16 10:30:32 -05:00
Chax
df32f93095 Change copying the gamelist to grab the items of the listview directly. 2024-07-16 16:44:21 +02:00
fenopy
70d95b353e feat: added disable-app-check for testers sanity 2024-07-12 13:43:43 -05:00
fenopy
13eba3b3a6 fix: settings form updates 2024-07-11 08:55:44 -05:00
fenopy
1afdc9e7e3 feat: supress prompt to re-download 2024-07-11 08:55:35 -05:00
fenopy
38a113b5fb chore: add cleanupinstall to build 2024-06-27 06:58:38 -05:00
fenopy
25f478e265 fix: init ordering 2024-06-27 06:58:23 -05:00
fenopy
6a25662566 fix: change deps downloads, add splashes 2024-06-20 12:32:28 -05:00
fenopy
55af990071 fix: remove unused deps 2024-06-20 12:32:04 -05:00
fenopy
927a4bbaa4 fix: changes to splash init, add splashes 2024-06-20 12:30:22 -05:00
fenopy
a101c621ec chore: remove msg to start offline-mode 2024-06-20 12:27:10 -05:00
fenopy
e25338e817 fix: change unable to connect msg 2024-06-20 12:26:46 -05:00
fenopy
ecb1751cf5 feat: add cleanup-install dl 2024-06-20 11:59:09 -05:00
fenopy
aa54047d44 feat: add cleanup-install cmd 2024-06-20 11:57:25 -05:00
Fenopy
e02f82ee31 Merge pull request #117 from frxctura/fix/PublicMirrorNotAppearing
Fix Public Mirror not displaying on lblMirror control
2024-06-20 10:46:34 -05:00
Fenopy
e8ff31d8d9 Merge pull request #118 from frxctura/fix/AskForJSON
Fix Rookie prompting for .json every launch w/out it
2024-06-20 10:46:14 -05:00
Chax
072805dd8f Fix Rookie prompting for .json every launch w/out it 2024-06-20 13:43:29 +02:00
Fenopy
5626e0f5bc Merge pull request #116 from hellidox/patch-2
Wrap username variable in quotes
2024-06-20 06:04:36 -05:00
Maxine
9fee7dc787 Update README.md 2024-06-15 23:34:39 +02:00
hellidox
f86d97a96f allow spaces in username (the second)
this does work actually i just tested it
2024-06-15 16:33:17 -05:00
fenopy
6b0e8efadc fix: remove random int on initMirrors 2024-06-05 16:54:50 -05:00
Chax
7dba65c2cc Fix Public Mirror not displaying on lblMirror control 2024-06-05 23:18:39 +02:00
fenopy
497c670a98 fix: quotes around some command paths 2024-06-03 08:37:49 -05:00
Fenopy
d77790c6fa Merge pull request #108 from VRPirates/beta/RSL-2.29.2
chore: changelog update
2024-05-22 06:47:18 -05:00
fenopy
2c8311a0ff chore: changelog update 2024-05-22 06:46:38 -05:00
Fenopy
7bf5a8eaec Merge pull request #107 from VRPirates/beta/RSL-2.29.2
Beta/rsl 2.29.2
2024-05-22 06:45:46 -05:00
fenopy
bdffbc0757 chore: update credits 2024-05-22 06:40:17 -05:00
fenopy
c085eaa0a3 fix: initilization order 2024-05-22 06:40:11 -05:00
fenopy
5580e0b29e Merge branch 'beta/RSL-2.29.2' of https://github.com/VRPirates/rookie into beta/RSL-2.29.2 2024-05-22 06:11:00 -05:00
fenopy
3b174c6b4b chore: version bump 2024-05-22 06:10:58 -05:00
Fenopy
d5acdde3c4 Merge pull request #106 from VRPirates/master
Merge pull request #105 from VRPirates/beta/RSL-2.29.1
2024-05-22 06:09:41 -05:00
fenopy
a1afa2ddee fix: fix uploads on new rclone 2024-05-22 06:08:17 -05:00
Fenopy
66d2c04834 Merge pull request #105 from VRPirates/beta/RSL-2.29.1
Beta/rsl 2.29.1
2024-05-20 12:57:49 -05:00
fenopy
81559b6a8f version bump 2024-05-20 12:57:33 -05:00
fenopy
3d8c06e726 fix: initial gui name 2024-05-20 11:54:48 -05:00
fenopy
32d30df8a3 chore: bump package deps 2024-05-20 11:54:40 -05:00
fenopy
1b0746df6d fix: initilization error 2024-05-20 11:54:01 -05:00
Fenopy
a0b9a43e15 Merge pull request #104 from VRPirates/beta/RSL-2.29
Beta/rsl 2.29
2024-05-20 11:34:00 -05:00
fenopy
58f770cb6d chore: version bump 2024-05-20 11:27:03 -05:00
Fenopy
0db624c3c6 Merge pull request #96 from Chax1/QoL/AdditionalTroubleshooting
additional troubleshooting
2024-05-20 11:24:09 -05:00
fenopy
79718d6ade feat: better progress bar and download tracking 2024-05-09 16:29:43 -05:00
fenopy
2bcad00193 chore: bump rclone to 1.66.0 2024-05-09 16:26:36 -05:00
fenopy
b22893eb54 fix: change uuid calc 2024-04-05 06:24:40 -05:00
Fenopy
9a8a97dbac Merge pull request #95 from Chax1/gitdepdencies
Add dependencies
2024-04-04 08:36:05 -05:00
Chax
9d1f05eab4 Put the rclone dependencies into a folder 2024-04-04 15:34:50 +02:00
Chax
cb74756752 Add a fallback for rclone 2024-04-04 15:32:08 +02:00
Maxine
2ea00d12f3 Merge branch 'VRPirates:master' into gitdepdencies 2024-04-04 15:23:16 +02:00
Fenopy
b59a816a8b Merge pull request #94 from VRPirates/beta/RSL-2.28
rsl 2.28 release
2024-04-04 08:11:40 -05:00
fenopy
9363b2e26c chore: default to singlethread; change app setting dir 2024-04-01 16:11:44 -05:00
fenopy
0932602bbb version bump 2024-04-01 06:59:43 -05:00
Maxine
85ad2c0097 Add files via upload 2024-03-11 18:29:15 +01:00
fenopy
19916388f2 fix: wording updates 2024-03-04 12:51:36 -06:00
fenopy
d604107b7f Merge branch 'beta/RSL-2.28' of https://github.com/VRPirates/rookie into beta/RSL-2.28 2024-03-04 07:31:14 -06:00
fenopy
f329965b3b fix: default to single-threading 2024-03-04 07:31:12 -06:00
Chax
c4e8c9048d Rookie will ask if the user wants to create the public config file if necessary 2024-03-01 14:32:26 +01:00
Fenopy
da8e1d1183 Merge pull request #91 from Chax1/beta/RSL-2.28
Update README
2024-02-29 09:41:38 -06:00
Maxine
b1bf8462da Update README.md 2024-02-29 15:01:25 +01:00
Maxine
665a288af5 Update README.md 2024-02-29 15:00:00 +01:00
Fenopy
ec3e0ccf6d Merge pull request #90 from Chax1/beta/RSL-2.28
Fixes
2024-02-29 06:09:18 -06:00
Chax
ea8e16c418 Check if devices list is empty before trying to access to ensure Index was out of range exception doesn't occur. 2024-02-29 00:43:01 +01:00
Chax
0b8ca66692 Disable searchbar until fully loaded to prevent race condition 2024-02-29 00:20:26 +01:00
Chax
921b8340f0 Fix crashlogs being just called "UUID" 2024-02-29 00:06:35 +01:00
fenopy
873be55e78 fix: floating ui; ab-restore messages 2024-02-28 17:01:05 -06:00
Fenopy
772fa9a4df Merge pull request #89 from VRPirates/beta/RSL-2.28-dep
chore: update dependencies
2024-02-28 16:31:45 -06:00
fenopy
121d9e2c58 chore: update dependencies 2024-02-28 16:31:12 -06:00
fenopy
bca3488748 chore: clean up old dependencies 2024-02-28 16:28:56 -06:00
fenopy
0af6a30347 chore: update dependencies [code] 2024-02-28 16:28:36 -06:00
fenopy
d38d775cc9 chore: update dependencies 2024-02-28 16:27:25 -06:00
fenopy
5fc1151e90 chore: remove unused files 2024-02-28 15:36:22 -06:00
fenopy
737a61a3e9 chore: formatting 2024-02-28 15:32:05 -06:00
fenopy
4c8caec6bc feat: enable restoring of gamedata or ab files 2024-02-28 15:22:12 -06:00
fenopy
9cccc9f0cc chore: add public mirror json by default 2024-02-28 11:56:40 -06:00
fenopy
7cfee896b1 Merge branch 'beta/RSL-2.28' of https://github.com/VRPirates/rookie into beta/RSL-2.28 2024-02-28 11:54:41 -06:00
fenopy
1dddf5c41a feat: form redesign; add osupdate toggle; add adb backup 2024-02-28 11:54:38 -06:00
fenopy
dc75776d3f chore: readme update 2024-02-28 11:53:56 -06:00
Fenopy
018c30b73f Merge pull request #85 from Chax1/fix/UpdateSettingsAfterUpdate
Upgrade settings after application update
2024-02-28 11:53:44 -06:00
Fenopy
0d8f776e8d Merge pull request #88 from VRPirates/master
merge master to latest beta branch
2024-02-28 11:53:25 -06:00
fenopy
df0a8b10d1 fix: allow adb commands with or without prefix 2024-02-28 11:51:21 -06:00
Chax
aeaec5465b Upgrade settings after application update 2024-02-10 14:51:01 +01:00
Fenopy
8f15d65c5b Merge pull request #82 from Chax1/fix/7zCrash
Fix 7z Crash by not using x.ExitCode anymore
2024-02-07 13:43:31 -06:00
Chax
7e19403aa9 Fix 7z Crash by not using x.ExitCode anymore 2024-02-07 20:19:52 +01:00
Fenopy
bd18acc6a1 Merge pull request #81 from Chax1/master
Version Bump + Donation Fix
2024-02-06 11:28:37 -06:00
Chax
7046458db6 Version Bump + Donation Fix 2024-02-06 18:26:15 +01:00
fenopy
beab57218c codename add 2024-02-06 07:35:07 -06:00
fenopy
46cd27c012 fix: codenames 2024-02-06 06:01:37 -06:00
Fenopy
18123b2755 Merge pull request #80 from VRPirates/beta/RSL-2.27
version bump
2024-02-02 06:44:46 -06:00
fenopy
bbda0f33bd version bump 2024-02-02 06:42:13 -06:00
Fenopy
1edd364a33 Merge pull request #79 from VRPirates/beta/RSL-2.27
Fix: correct codenames url
2024-02-02 06:38:48 -06:00
fenopy
89d6acb623 Fix: correct codenames url 2024-02-02 06:37:40 -06:00
Fenopy
ff2f648379 Merge pull request #78 from VRPirates/beta/RSL-2.27
Beta/rsl 2.27
2024-02-01 16:05:46 -06:00
fenopy
0d9cf1cd91 fix: add exit on 7z error 2024-02-01 16:02:14 -06:00
Fenopy
40505f7628 Merge pull request #77 from Chax1/fix/No7z
Throw error message if unable to get 7z
2024-02-01 15:59:25 -06:00
Chax
3dee5372f2 Throw error message if unable to get 7z 2024-02-01 22:58:19 +01:00
Fenopy
6ee5b1014b Merge pull request #76 from Chax1/chore/ChangelogBump
Ver bump
2024-02-01 15:47:32 -06:00
Fenopy
189ba62385 Merge pull request #75 from Chax1/QoL/ProtonIsFree
Mention that ProtonVPN is free.
2024-02-01 15:47:05 -06:00
Chax
b09e7ff2bc Ver bump 2024-01-25 20:21:30 +01:00
Chax
31492a0af3 Mention that ProtonVPN is free. 2024-01-25 19:49:02 +01:00
fenopy
f3d81252f0 chore: prettier 2024-01-08 15:47:27 -06:00
fenopy
e795b85ab8 chore: clean up path concats; thx @Krutonium 2024-01-08 15:43:25 -06:00
fenopy
3c4e4677d4 fix: lol 2024-01-08 15:11:19 -06:00
fenopy
9f584da9ab feat: change main config location; add fallback 2024-01-08 15:03:02 -06:00
fenopy
a440848584 Merge branch 'beta/RSL-2.27' of https://github.com/VRPirates/rookie into beta/RSL-2.27 2024-01-08 08:34:37 -06:00
Fenopy
2301aa6425 Merge pull request #72 from Chax1/fix/ZipThrow
Fix throwing an exception in Zip.cs
2024-01-08 08:34:42 -06:00
Fenopy
263f2bf4c1 Merge pull request #71 from Chax1/feature/SearchRelease
Improve search to also be able to search release names
2024-01-08 08:34:17 -06:00
fenopy
59d0c9a7ce fix: handle errors downloading codenames file 2024-01-08 08:33:46 -06:00
Chax
19432a6362 Fix throwing an exception in Zip.cs 2024-01-05 18:47:17 +01:00
Chax
97ec1cd385 Improve search to also be able to search release names 2024-01-03 14:38:24 +01:00
fenopy
162d60bbdc fix: codename filtering 2023-12-29 07:20:33 -06:00
Fenopy
3bcdc7871d Merge pull request #65 from Chax1/fix/7zipArchitectureCheck
Check for architecture when downloading 7z files
2023-12-14 15:49:45 -06:00
Fenopy
1f845a3682 Merge pull request #66 from Chax1/fix/AsyncSyncRead
Fix mixing async and sync read
2023-12-14 15:49:03 -06:00
Fenopy
a0a97a9451 Merge pull request #67 from Chax1/fix/CrossThreadCrash
Fix crash when downloading without enough space
2023-12-14 15:48:45 -06:00
Fenopy
c6261687b3 Merge pull request #68 from Chax1/feature/AddCodenameToUpload
Add codename to upload
2023-12-14 15:48:30 -06:00
Chax
6deb311ecc Update to include filtering 2023-12-14 16:14:25 +01:00
Chax
0c6c8d5546 Add codename to upload
Changes
2023-12-14 08:40:23 +01:00
Chax
4e391c0e56 Fix crash when downloading without enough space 2023-12-12 11:56:28 +01:00
Chax
9788aa494a Check for architecture when download 7z files 2023-12-12 11:39:43 +01:00
Chax
4f0cc7ab71 Fix mixing async and sync read 2023-12-09 21:35:49 +01:00
Fenopy
0bf9a00af2 Merge pull request #62 from VRPirates/beta/RSL-2.26
beta/rsl 2.26
2023-12-08 09:37:33 -06:00
Fenopy
fa9baced7a Merge pull request #52 from Chax1/beta/RSL-2.26
chore: version bump
2023-12-06 14:31:46 -06:00
Fenopy
1f51f41954 Merge pull request #61 from Chax1/feature/ShowExtractionProgress
Change labels on extraction
2023-12-06 14:29:27 -06:00
fenopy
bc8599315e fix: correct tooltips for new leftnav 2023-12-06 14:28:29 -06:00
Chax
1c49a33651 Change labels on extraction 2023-12-06 21:26:24 +01:00
Maxine
13ab8a74d6 Update changelog.txt 2023-12-06 21:10:24 +01:00
Maxine
51155f105c Update changelog.txt 2023-12-06 21:10:03 +01:00
Fenopy
af46aa7c78 Merge pull request #60 from Chax1/feature/ShowExtractionProgress
Show extraction progress.
2023-12-06 14:08:26 -06:00
fenopy
a7d46753aa Merge branch 'beta/RSL-2.26' of https://github.com/VRPirates/rookie into beta/RSL-2.26 2023-12-06 14:07:56 -06:00
Fenopy
161f257985 Merge pull request #59 from Chax1/fix/NoDeviceModeOutput
Fix no device mode output
2023-12-06 14:07:30 -06:00
fenopy
223de0ba4a chore: remove qu settings 2023-12-06 14:06:37 -06:00
Maxine
2fa9c34e98 Update changelog.txt 2023-12-06 20:52:30 +01:00
Chax
5d5011e409 Show extraction progress. 2023-12-06 20:46:15 +01:00
Maxine
fd4357bdad Update changelog.txt 2023-12-06 20:29:05 +01:00
Chax
1a073f9661 Fix no device mode output 2023-12-06 20:12:25 +01:00
fenopy
e73c204d1c feat: sideloading toggle button 2023-12-06 12:55:23 -06:00
fenopy
80cb0b46bc feat: add open DLs and run adb commands to leftnav 2023-12-06 12:30:31 -06:00
fenopy
680a5f256a feat: remove dumb enter-key toggle for install 2023-12-06 12:28:00 -06:00
fenopy
2b02d04219 fix: counting of installed games 2023-12-06 11:08:51 -06:00
fenopy
7a61d73e65 fix: gui freeze on launch 2023-12-06 11:08:37 -06:00
Fenopy
972116ee96 Merge pull request #58 from Chax1/fix/WebViewNukingItself
Fix crash due to WebView21 not existing
2023-12-06 11:01:56 -06:00
Chax
d780607363 Fix crash due to WebView21 not existing 2023-11-30 22:26:39 +01:00
Fenopy
236004aef9 Merge pull request #56 from Chax1/feature/NumberedUpdateStates
feature/numbered update states
2023-11-30 08:21:11 -06:00
Chax
07bc133096 update changelog.txt 2023-11-24 06:00:20 +01:00
Chax
50427ef2d3 Add count to update state labels. 2023-11-24 05:48:13 +01:00
Chax
63eef42ca0 chore: version bump 2023-11-23 16:40:45 +01:00
Fenopy
8723b195df Merge pull request #50 from Chax1/fix/AdditionalQuest3Support
Fix CopyOBB for Quest 3
2023-11-22 18:52:52 -06:00
Fenopy
ae86b47268 Merge pull request #51 from Chax1/fix/CrashOnIPStore
Fix crash when trying to write to read-only StoredIP.txt
2023-11-22 18:52:20 -06:00
Chax
9901a0d770 Update MainForm.cs 2023-11-22 23:43:35 +01:00
Chax
da48607154 Fix CopyOBB for Quest 3 2023-11-22 23:38:19 +01:00
Fenopy
35f3a80eb1 Merge pull request #47 from Chax1/fix/WebViewKill
Fix crash due to unkilled WebView2 instances.
2023-11-22 16:13:39 -06:00
Fenopy
0da1bf7a3b Merge pull request #48 from Chax1/fix/MessageBoxParents
Add missing parents to messageboxes
2023-11-22 16:13:20 -06:00
Fenopy
c027fca339 Merge pull request #49 from Chax1/QoL/MoreApparantError
Make message more friendly.
2023-11-22 16:13:01 -06:00
Chax
5ac98f5ef8 Make message more friendly. 2023-11-22 22:34:01 +01:00
Chax
3cb0cca801 Add missing parents to messageboxes 2023-11-18 15:00:01 +01:00
Chax
b4fd4c76a0 Fix crash due to unkilled WebView2 instances. 2023-11-16 21:18:47 +01:00
fenopy
ecf19115c6 chore: readme update 2023-11-07 15:41:33 -06:00
Fenopy
d475936bbb Merge pull request #43 from VRPirates/beta/RSL-2.25
Beta/rsl 2.25.1
2023-11-04 15:23:19 -05:00
Fenopy
c404d69b54 Merge pull request #42 from Chax1/beta/RSL-2.25
Fix Device not authorized prompt showing up after authorization.
2023-11-04 15:22:54 -05:00
Chax
6edc9cf7e9 Change not authorized message to be more clear on what to do
Some additional info
2023-11-04 16:23:01 +01:00
Chax
71d89284f1 Chore: Bump Version. 2023-11-04 16:02:29 +01:00
Chax
39473ba15c - Fix: Device not authorized prompt showing up after authorization. 2023-11-04 16:02:06 +01:00
Fenopy
3f3fa3dc11 Merge pull request #39 from VRPirates/beta/RSL-2.25
Beta/rsl 2.25
2023-11-03 12:54:10 -05:00
fenopy
3f06099d38 chore: version bump 2023-11-03 12:46:14 -05:00
Fenopy
450cf282aa Merge pull request #35 from Chax1/fix/UnauthFreeze
fix: fix unauthorized bug
2023-11-02 14:12:09 -05:00
fenopy
804c452f6d chore: update wiki url 2023-11-02 10:00:29 -05:00
Chax
c576f62d28 Fix the unauthorized bug, hopefully. 2023-10-31 09:35:12 +01:00
Fenopy
73651723dd Merge pull request #29 from VRPirates/beta/RSL-2.24
RSL 2.24
2023-10-13 18:22:18 -05:00
fenopy
82cc713372 version bump 2023-10-13 18:21:35 -05:00
Fenopy
6d0788268d Merge pull request #28 from Chax1/fix/searchbar
Fix searchbar not being anchored properly
2023-10-13 11:11:39 -05:00
Chax
c183cb6d7a Fix searchbar not being anchored properly 2023-10-13 16:55:06 +02:00
Fenopy
3b83db0177 Merge pull request #27 from Chax1/fix/Quest3Support
Quest 3 stuff
2023-10-12 14:12:16 -05:00
Chax
03f4dcb687 Fix Quest 3 stuff 2023-10-12 21:02:24 +02:00
Chax
9415daba07 Fix Rookie pushing OBB several times.
add installTxtPath
2023-10-12 21:02:21 +02:00
Chax
553571027d Revert changeTitlebarToDevice() changes
Change this too.
2023-10-12 21:02:16 +02:00
Fenopy
273ddda076 Merge pull request #25 from Chax1/fix/CrashOnBackup
Fix crash when trying to backup
2023-10-09 08:35:25 -05:00
Chax
3c8f08a380 Fix crash when trying to backup 2023-10-09 15:19:44 +02:00
Fenopy
b5ac8175dc Merge pull request #24 from Chax1/QoL/CloseOnApply
Close Settings Form when applying changes
2023-10-09 08:02:59 -05:00
Fenopy
d765a9b6eb Merge pull request #23 from Chax1/feature/DirectoryButtons
Add Open Directory Buttons
2023-10-09 08:02:49 -05:00
Chax
409afd8eac Add Open Directory Buttons
Remove console writelines
2023-10-09 14:50:35 +02:00
Chax
d7640d4c5d Close Settings Form when applying changes 2023-10-09 14:45:31 +02:00
fenopy
3828da4864 chore: reorder startup tasks 2023-10-06 07:55:34 -05:00
fenopy
a45f7db85c chore: additional logging to startup 2023-10-06 07:54:44 -05:00
Fenopy
df6a9e9286 Merge pull request #19 from Chax1/feature/ImproveSearch
fix: improve search functionality
2023-09-18 08:28:52 -05:00
Fenopy
c516f80dc1 Merge pull request #17 from Chax1/fix/OutputMessage
Handle remote write failed
2023-09-18 08:27:47 -05:00
Fenopy
0ef2f296f5 Merge pull request #16 from Chax1/QoL/CodeCleanup
Move startup tasks into seperate methods for cleaner code.
2023-09-18 08:27:35 -05:00
Chax
48597983e2 Remove the sorting to top as its not needed. 2023-09-15 15:21:22 +02:00
Chax
a6a4a057fe Improve search drastically. 2023-09-15 11:56:44 +02:00
Fenopy
c7cfc07c9b Merge pull request #12 from VRPirates/beta/RSL-2.23
rsl 2.23
2023-09-06 12:13:45 -05:00
fenopy
51ad390584 chore: version bump 2023-09-06 12:12:11 -05:00
Chax
b4c7795d25 Handle remote write failed 2023-09-01 16:10:39 +02:00
Fenopy
78ef2a0355 Merge pull request #11 from Chax1/fix/UploadCrash
Fix upload crash
2023-08-31 06:14:13 -05:00
Chax
4530424dec fix crash when trying to delete non existant directory and make sure the files exist before attempting to delete them too 2023-08-31 12:37:03 +02:00
Fenopy
3543314ff0 Merge pull request #10 from Chax1/fix/Fullscreen
Fullscreen Fix
2023-08-30 11:32:07 -05:00
fenopy
4ade18bd31 fix: only donate newest versions 2023-08-30 11:18:59 -05:00
Chax
951a899705 Move startup tasks into seperate methods for cleaner code. 2023-08-13 19:27:44 +02:00
Chax
6d678a2e6e Enable maximize button 2023-08-11 19:26:31 +02:00
Chax
8b912e68ee Fix controls not having proper anchor 2023-08-11 19:25:28 +02:00
Fenopy
8059834e91 Merge pull request #8 from VRPirates/beta/RSL-2.22
merge 2.22 changes to master
2023-08-04 07:16:14 -05:00
fenopy
4349603f51 fix: fix double-escape on \\RSL paths 2023-08-04 07:15:34 -05:00
fenopy
160f254e57 chore: update to 2.22 2023-08-04 07:15:29 -05:00
Fenopy
45497396d1 Merge pull request #6 from VRPirates/beta/RSL-2.21
Merge pull request #5 from VRPirates/master
2023-08-04 06:19:11 -05:00
Fenopy
d041ea6b6a Merge pull request #5 from VRPirates/master
beta2.21-master-merge
2023-08-04 06:18:05 -05:00
Fenopy
a2e601ced0 Merge pull request #3 from Chax1/remove/WakeDevice
Remove ADB.WakeDevice due to it being nonfunctional.
2023-08-04 06:15:08 -05:00
Fenopy
35277ca729 Merge pull request #4 from Chax1/fix/changeTitlebarCrash
Make changeTitlebarToDevice less prone to crashes and more robust.
2023-08-04 06:14:38 -05:00
Chax
f3ffe5d037 Make changeTitlebarToDevice less prone to crashes and more robust. 2023-07-28 22:49:49 +02:00
Chax
38866547ec Resolve syntax issue 2023-07-25 20:16:55 +02:00
Fenopy
f4cd9b3b9f Merge pull request #2 from Chax1/fix/NoDeviceModeOutput
Fix No Device Mode output.
2023-07-25 12:53:13 -05:00
Fenopy
e687c3f2ba Merge pull request #1 from Chax1/fix/TrailerControls
Fix trailer controls
2023-07-25 12:53:05 -05:00
Chax
97cbfdea4e Remove ADB.WakeDevice due to redundancy. 2023-07-20 11:57:00 +02:00
Chax
af97e8aef1 Fix No Device Mode having the wrong output message with repeats 2023-07-20 11:44:52 +02:00
Chax
2094ecb0ba Fix trailer controls 2023-07-19 02:14:37 +02:00
fenopy
928436eda3 chore: switch to new git home 2023-07-18 15:16:04 -05:00
fenopy
5b1a7de921 Merge branch 'beta/RSL-2.21' 2023-07-18 14:58:12 -05:00
fenopy
e679f2a1b2 chore: changelog update 2023-07-18 14:57:36 -05:00
Fenopy
9113b376b9 Merge pull request #174 from Chax1/fix/CrashFixes
Fix crash occuring on failed extractions.
2023-07-18 14:51:49 -05:00
Chax
9169ec9b81 Fix crash occuring on failed extractions. 2023-07-14 13:05:19 +02:00
fenopy
41605aabb7 Merge branch 'beta/RSL-2.21' of https://github.com/nerdunit/androidsideloader into beta/RSL-2.21 2023-07-08 14:58:55 -05:00
fenopy
fe56be4ea1 Merge branch 'Chax1-release/RSL-2.21' into beta/RSL-2.21 2023-07-08 14:58:25 -05:00
fenopy
e916ef9b45 Merge branch 'release/RSL-2.21' of https://github.com/Chax1/androidsideloader into Chax1-release/RSL-2.21 2023-07-08 14:57:36 -05:00
Chax
aa51f380b5 Fix downloads 2023-07-08 20:20:04 +02:00
Chax
a9883261da Fix merge conflict 2023-07-08 19:59:30 +02:00
Chax
314a06d43f Attempt to fix merge conflict. 2023-07-08 19:56:03 +02:00
Chax
0992636fa3 Remove additional PCVR Fixes 2023-07-08 19:43:44 +02:00
Chax
184b7c9cbb Remove PCVR 2023-07-08 19:36:18 +02:00
Fenopy
47fd128509 Merge pull request #170 from Chax1/release/RSL-2.21
Fix download mode bugs.
2023-07-07 08:06:14 -05:00
Chax
5f88c09b1c Fix Download Mode Bugs 2023-07-07 14:55:18 +02:00
Fenopy
525c99c0ae Merge branch 'beta/RSL-2.21' of https://github.com/nerdunit/androidsideloader into beta/RSL-2.21 2023-07-06 15:44:29 -05:00
Fenopy
46bcdf0adf chore: update about dialog 2023-07-06 15:31:25 -05:00
Fenopy
4b2a0d7e4e Merge pull request #169 from Chax1/release/RSL-2.21
Fix crash due to Trailers in PCVR Mode
2023-07-06 15:21:02 -05:00
Chax
53f2508941 Fix crash due to Trailers in PCVR Mode 2023-07-06 22:15:51 +02:00
Fenopy
cb0ddaf084 Merge pull request #168 from Chax1/release/RSL-2.21
Update to 2.21
2023-07-06 14:54:25 -05:00
Chax
3dd9b2c694 Update 7z to function on 32 Bit 2023-07-06 21:33:58 +02:00
Chax
8516b14d4a Update to 2.21 2023-07-06 21:27:08 +02:00
Fenopy
cdc8f43a66 Merge pull request #167 from Chax1/beta/RSL-2.21
pr of doom; 2.21 changes
2023-07-06 13:41:53 -05:00
Chax
ce5cf80f96 Change all C:/ paths to {Path.GetPathRoot(Environment.SystemDirectory)}
This commit closes #161 as it's now redundant.
2023-07-05 19:40:05 +02:00
Chax
c7522ccf10 Change to Download w/ instead of Install w/ 2023-06-27 20:45:53 +02:00
Chax
f817cb7be5 Adjust making webView clickable again once disclaimer disappears. 2023-06-27 20:36:37 +02:00
Chax
f22acb4bd6 Hide Quest Mode elements in PCVR Mode 2023-06-27 20:19:57 +02:00
Chax
26d894e02c Add debouncing to search and make it way less clunky. 2023-06-27 20:13:53 +02:00
Chax
32f37cd98a Update PCVR 2023-06-27 19:33:33 +02:00
Chax
66bd13d5d5 Add PCVR 2023-06-27 18:13:15 +02:00
Chax
31e294ae4f Add innerException to CrashLog 2023-06-26 12:29:42 +02:00
Chax
3b771408ae Remove spoofer out of project file 2023-06-25 17:31:02 +02:00
Chax
e55f19c7e5 Update Sideloader Launcher to check for Rookie and tell the user if it doesn't exist 2023-06-25 17:30:36 +02:00
Chax
e24f6ee0e4 Remove bloat methods 2023-06-24 03:23:53 +02:00
Chax
d1e92391d4 Add lime-green color to various states after downloading 2023-06-22 13:48:30 +02:00
Chax
c24829f6a4 Update comments & add comments 2023-06-21 17:42:06 +02:00
Chax
7f9ddb4875 Improve readability on debuglog deletion code 2023-06-21 17:04:24 +02:00
Chax
c644e3e675 Do not delete games files on obbMismatch 2023-06-21 15:37:11 +02:00
Chax
a9864c7fb5 Fix spelling mistake 2023-06-20 17:55:20 +02:00
Chax
2d57e47d55 Remove redundant == true checks.
Signed-off-by: Chax <chaxprivate@gmail.com>
2023-06-20 17:40:49 +02:00
Chax
377e5a6751 Remove redundant changes from Logger.cs rewrite, we may be able to use these in the near future however.
Signed-off-by: Chax <chaxprivate@gmail.com>
2023-06-20 17:39:52 +02:00
Chax
c17cc3f601 Further adjust names to fit naming convention 2023-06-20 17:26:25 +02:00
Chax
8bfd84fa16 Change ShowError_QuotaExceeded() to be more up to date 2023-06-20 16:57:14 +02:00
Chax
629d4c3ee9 Adjust DonorsListView.cs to also take renamed bool 2023-06-20 16:26:03 +02:00
Chax
50284d0eb6 Adjust names to use our naming convention 2023-06-20 16:19:46 +02:00
Chax
6a848513b1 Fix variable name 2023-06-20 15:51:29 +02:00
Chax
5b5d3abd2b Change to string.Empty 2023-06-20 15:33:43 +02:00
Chax
c06d606164 Improve logging system 2023-06-19 01:05:04 +02:00
Chax
6b6fb66a7d Rewrite updater 2023-06-18 21:07:17 +02:00
Chax
80a85f3858 Add --no-rclone-updating flag 2023-06-18 15:52:31 +02:00
Chax
ee5222165c Add a setting to disable file preallocating, this will allow virtual filesystems to be compatible.
This commit fixes #163
2023-06-16 14:43:47 +02:00
Chax
73367c9698 Rewrite entire OBB Comparison. 2023-06-15 18:36:59 +02:00
Chax
ce370d4575 Create a new process for every ADB command, this could prevent Rookie from trying to access exited or inproperly started processes. 2023-06-15 14:27:41 +02:00
Chax
374685eeae Fix webview blocking the freeDisclaimer click. 2023-06-09 20:41:00 +02:00
Chax
3453ca1c5b Add a more apparent message to no device mode output. 2023-06-09 00:25:50 +02:00
Chax
650913f1e8 Remove unecessary spoofer warning. 2023-06-06 08:00:33 +02:00
Chax
07683d2342 Add icons to all forms 2023-05-31 05:52:36 +02:00
Chax
519ec07af8 Change MyHandler to CrashHandler 2023-05-31 05:38:08 +02:00
Chax
d356b68c33 Replace "" with String.Empty 2023-05-31 05:36:31 +02:00
Chax
69f3509c17 Remove uselesss spoofer init out of the MainForm.cs 2023-05-31 05:17:37 +02:00
Chax
23d68ac9cc Remove spoofer, we don't use this anymore. 2023-05-31 05:06:00 +02:00
Chax
d4219bdd3f Optimize ItemChecked code 2023-05-31 05:00:53 +02:00
Chax
ff396081e1 Switch to round buttons in the DonorListView. 2023-05-31 05:00:17 +02:00
Chax
b65df31ff9 Optimize Donors.cs 2023-05-31 04:50:47 +02:00
Chax
c88c2c58a5 Add check for "Only one use of each socket address"
This mainly occurs when there is already an rclone connection towards our servers and will provide the user with steps on how to fix it if there is this issue.
2023-05-31 04:41:01 +02:00
Chax
1d72df573a Add logging to killRclone() catch block 2023-05-31 04:40:01 +02:00
Chax
0f6001b312 Put error we repeat 3 times into a singular method to remove bloated code. 2023-05-30 06:37:04 +02:00
Chax
f9f33336db Fix spelling mistakes. 2023-05-30 06:34:59 +02:00
Chax
8ba8322836 Optimize name conversions. 2023-05-30 06:14:12 +02:00
Chax
1142a67f88 Optimize GetAvailableSpace() 2023-05-30 05:40:44 +02:00
Chax
95eb1d545e Clean up messy code. 2023-05-30 05:25:42 +02:00
Chax
f234bae2a3 Make that stacktrace log slightly more cleaner 2023-05-30 05:20:16 +02:00
Chax
5ea6a48ee1 Remove redundant code 2023-05-30 00:13:18 +02:00
Chax
e6ac747f5d Improve catchblock for OBB Comparison to avoid freezes. 2023-05-29 04:01:58 +02:00
Chax
11e637bcb7 Change search to filter gamelist instead of finding the nearest name 2023-05-28 19:26:11 +02:00
Chax
89935e4f80 Add "click" mouse on filter hover. 2023-05-28 19:26:11 +02:00
Chax
f1f9ec47be Add operator. 2023-05-28 19:26:11 +02:00
Chax
ca69e44f99 Prevent deleting the entire obb/data folders 2023-05-28 19:26:11 +02:00
Chax
820f5d1bb5 Add stack trace to crashlog. 2023-05-28 19:26:11 +02:00
Chax
ee9ed6386d Remove addition operator to remove unecessary repetition. 2023-05-28 19:26:11 +02:00
Fenopy
a97ca0b240 Merge pull request #158 from Chax1/master
Update changelog.txt
2023-05-25 15:06:21 -05:00
Chax
b5dc15cb9a Update changelog.txt 2023-05-25 21:53:41 +02:00
Fenopy
75a41fb028 Merge pull request #157 from nerdunit/beta/RSL-2.20
Release/RSL-2.20
2023-05-25 14:35:13 -05:00
Chax
7cf1baec25 Fix crashing on filtering. 2023-05-24 16:14:18 -05:00
Chax
0763917adf Remove refreshing the gamelist when adding to queue and only refresh it once queue is empty after downloads, also wont refresh if in nodevicemode 2023-05-23 15:27:57 -05:00
Fenopy
2344d7ce51 chore: bump versions 2023-05-23 14:59:42 -05:00
Fenopy
f8724bae66 Merge pull request #156 from Chax1/fix/QualityOfLife
Quality of Life Changes
2023-05-23 12:13:55 -05:00
Chax
b705c56948 Move extraction into a thread to avoid UI Freezes. 2023-05-23 19:09:50 +02:00
Chax
60b9fe5809 Use better code for getting thumbnail paths 2023-05-23 19:09:50 +02:00
Chax
32ea38867a Check for parent process when killing off rclone to avoid killing off unrelated rclone processes. 2023-05-23 19:09:50 +02:00
Chax
dd1044ee3d Optimize Progressbar Code 2023-05-23 19:09:50 +02:00
Chax
7f4e828567 Optimize trailer code slightly 2023-05-23 19:09:50 +02:00
Chax
64ec55ba54 Cleaner code for dropdowns 2023-05-23 19:09:50 +02:00
Chax
39fa784540 Remove redundant standardinput.writeline and flush, we already give ADB the command in " adb.StartInfo.Arguments = command;" 2023-05-23 19:09:49 +02:00
Chax
4a20f2fd89 Check for filter clicks before attempting to reload gamelist. 2023-05-23 19:09:49 +02:00
Chax
1a860399d9 Invoke MessageBox to avoid crashes during debugging. 2023-05-23 19:09:49 +02:00
Chax
502b259b8c Add newlines to "All tasks finished." 2023-05-23 19:09:49 +02:00
Fenopy
c010fda0db fix: storage display for v50 or below 2023-05-19 10:14:16 -05:00
Fenopy
743b9d1d54 Merge pull request #152 from Chax1/beta/RSL-2.20
fix storage display for Android 12; fix to rclone update; added loglevels;
2023-05-17 13:29:04 -05:00
Chax
7506282950 Re-add check for singular queue when removing active download. 2023-05-17 20:10:23 +02:00
Chax
2346accccc Add loglevels to exceptions etc. 2023-05-17 16:49:01 +02:00
Chax
dd69b75c7f Fix storage display 2023-05-17 16:43:49 +02:00
Chax
a71ebaedc3 Add loglevel to logger and change DateTime to UtcNow 2023-05-17 16:23:03 +02:00
Chax
1c85b91f32 Update RCLONE if version doesn't match required. 2023-05-17 16:22:14 +02:00
Fenopy
b130644c47 fix: 1 retry for non-pub configs 2023-05-16 07:26:53 -05:00
Fenopy
0febf9ef0d Merge pull request #151 from Chax1/beta/RSL-2.20
Download newer rclone
2023-05-16 07:25:35 -05:00
Chax
c1e9a5dcfc Download newer rclone 2023-05-16 14:01:25 +02:00
Fenopy
3ddba35295 Merge branch 'beta/RSL-2.20' of https://github.com/nerdunit/androidsideloader into beta/RSL-2.20 2023-05-16 06:49:25 -05:00
Fenopy
2aede4a341 Merge pull request #150 from Chax1/fix/Checkbox
Fix the checkbox inside of Settings
2023-05-16 06:45:14 -05:00
Fenopy
19d6e25f06 Merge pull request #149 from Chax1/fix/Crash
fix/Crash
2023-05-16 06:44:55 -05:00
Fenopy
0b5d3bfddd Merge pull request #148 from Chax1/fix/Queue
fix/Queue
2023-05-16 06:44:44 -05:00
Fenopy
823c2607d9 fix: settings dialog display adjustments 2023-05-16 06:16:13 -05:00
Fenopy
d8bbac3096 Merge pull request #140 from Chax1/fix/CheckInternet
Removal of HasInternet due to redundancy
2023-05-16 06:08:28 -05:00
Fenopy
8af2b7dd66 Merge pull request #144 from Chax1/beta/RSL-2.20
Give users the ability to enter an IP manually to connect via ADB over WiFi
2023-05-16 06:07:06 -05:00
Chax
d480f13024 Add a check for devices for install.txts 2023-05-04 15:05:33 +02:00
Chax
40a02cc8e0 Cleanup code 2023-05-03 20:45:28 +02:00
Chax
505c145794 Cleanup code. 2023-05-03 20:42:19 +02:00
Chax
79648f2e07 Possibly fix the crash upon trying to remove current game in queue when it does not exist in the queue anymore. 2023-05-03 14:09:43 +02:00
Chax
02b03328d1 Fix "Serving remote control" catch, which causes Rookie to not extract games on first download apparently. 2023-04-29 15:57:18 +02:00
Chax
34046ecb4b Fix the checkbox inside of Settings 2023-04-19 02:13:11 +02:00
Chax
6ecba949c2 Delete old OBB folders after download to make sure that no space gets wasted on the quest. 2023-04-18 23:25:19 +02:00
Chax
3edadfa475 Give users the ability to enter an IP manually to connect via ADB over WiFi, also add border to ADB Box. 2023-04-17 20:24:06 +02:00
Chax
99aab8bc2e Merge branch 'beta/RSL-2.20' of https://github.com/nerdunit/androidsideloader into beta/RSL-2.20 2023-04-17 19:19:02 +02:00
Chax
0c52656a5e Fix displaying storage with a connected device, the MainForm.nodeviceonstart was interrupting displaying storage, should only check for when a device is connected, which it does above this method. 2023-04-12 09:53:22 -05:00
Chax
1e0be54c43 Fix displaying storage with a connected device, the MainForm.nodeviceonstart was interrupting displaying storage, should only check for when a device is connected, which it does above this method. 2023-04-01 23:07:41 +02:00
Chax
bf91c1f9f3 Possibly fix one crash, add single threaded mode for downloads to help compatibility wise, and 2023-03-28 03:56:11 +02:00
Chax
3314228b9c Remove redundant Internet Check for Rookie, Rookie already checks for the internet by attempting to download dependencies on start, which will fail if no internet exists and therefore not let Rookie launch. 2023-03-25 17:48:26 +01:00
Fenopy
8c26242af7 chg: changelog update 2023-03-24 13:25:05 -05:00
Fenopy
a75bd355cf feat: allow donation-uploads while in offline-mode 2023-03-23 16:18:46 -05:00
Chax
ea19b936cb Added a check for devices before attempting to get available space of devices to hopefully avoid crashes 2023-03-20 11:33:35 -05:00
Chax
3dbd5cee3a Remove bandwidth limit, rearrange settings, make nodevicemode disable delete after download and install 2023-03-20 11:02:06 -05:00
Chax
07c312fa33 fix obb still pushing with nodevicemode 2023-03-20 11:01:57 -05:00
Chax
8d15dcb5c9 Properly handle the error now. 2023-03-20 11:01:09 -05:00
Fenopy
fd9d2bfccc Version Bump: 2.19 2023-03-08 10:30:56 -06:00
Chax
3497270b26 Hopefully fix crash on filtering. 2023-03-08 09:53:30 -06:00
Chax
1f505e1a28 Fix pictureBox 2023-03-08 09:33:38 -06:00
Fenopy
96758aba7e fix: labels when filtering gamelist 2023-03-08 09:32:59 -06:00
Fenopy
b538244b6f Merge remote-tracking branch 'chax/development/fixing' into beta/RSL-2.19 2023-03-08 08:45:17 -06:00
Chax
04e7e54556 custom backup directory, wee. 2023-01-19 22:15:30 +01:00
Chax
372002dfa5 Add Filtering to all game types (top right) 2023-01-13 15:07:52 +01:00
Chax
401b21b715 Revert "Filter update available."
This reverts commit d73f84dbb4.
2023-01-13 14:40:10 +01:00
Chax
e09d1fec5d Revert "Remove all of the uneccessary code and make it switch back more than once lol."
This reverts commit c060038e50.
2023-01-13 14:37:30 +01:00
Chax
2e8ab3bd43 Change messagebox to show raw.githubusercontent.com instead of just GitHub 2023-01-12 16:36:04 -06:00
Chax
c060038e50 Remove all of the uneccessary code and make it switch back more than once lol. 2023-01-10 16:04:35 +01:00
Chax
d73f84dbb4 Filter update available. 2023-01-10 15:53:23 +01:00
Chax
3e69119df2 Prevent issues with extracting due to Environment.CurrentDirectory not being useable inside of Application Settings, Rookie will now check if a boolean is set to true or false (by default it is false), when it is false it will set the downloadDir to its currentDirectory, otherwise it will use a set custom one. 2023-01-06 09:16:04 -06:00
Chax
a9e11e3734 Download runtimes 2023-01-05 13:41:11 -06:00
Fenopy
ca742146d9 gitignore cleanup 2023-01-05 12:33:28 -06:00
Fenopy
de47ab6ad3 Remove Packages folder 2023-01-05 11:50:01 -06:00
Fenopy
9cff4a32b2 Checks for Device States before sideloading and pushing 2023-01-05 10:57:24 -06:00
Chax
1744ef86bf Hopefully fixes the "Set Download Directory" 2023-01-05 09:56:13 -06:00
Fenopy
46b3bafeb7 Merge remote-tracking branch 'origin/master' into beta/RSL-2.19 2023-01-05 08:52:20 -06:00
Chax
76b372f822 Comparing OBBs with no Device should not cause an exception anymore. 2023-01-05 08:50:06 -06:00
Chax
782485edd0 Make the settings reset button ressent the downloadDir as Default.Reset didnt seem to do so. 2023-01-05 08:46:58 -06:00
Fenopy
84f444ab55 Revert "Make the settings reset button ressent the downloadDir as Default.Reset didnt seem to do so."
This reverts commit c44b4adf60.
2023-01-05 06:24:30 -06:00
Fenopy
83283d6bda Merge branch 'release/RSL-2.18' of https://github.com/nerdunit/androidsideloader into release/RSL-2.18 2023-01-05 06:23:20 -06:00
Fenopy
4cd3769115 ROLLBACK- Make the settings reset button ressent the downloadDir as Default.Reset didnt seem to do so. 2023-01-05 06:23:00 -06:00
Chax
c44b4adf60 Make the settings reset button ressent the downloadDir as Default.Reset didnt seem to do so. 2023-01-05 06:21:24 -06:00
Chax
fa59f45184 Comparing OBBs with no Device should not cause an exception anymore. 2023-01-05 06:21:16 -06:00
Fenopy
79323dfe58 bump versions 2023-01-04 15:53:57 -06:00
Chax
2bfb402c25 Hide Webview if Trailers arent enabled. 2023-01-04 15:44:47 -06:00
Fenopy
13e1866820 Properly exit out of Rookie when needed files were unable to be downloaded and catched. 2023-01-04 14:41:34 -06:00
Fenopy
1462aaa30e Properly exit out of Rookie when needed files were unable to be downloaded and catched. 2023-01-04 09:32:55 -06:00
Chax
5fbe50b2f9 added Custom Download Directories 2023-01-04 09:12:24 -06:00
Fenopy
d747596ce1 Merge remote-tracking branch 'chax/Trailers' into beta/RSL-2.19 2023-01-04 09:08:06 -06:00
Fenopy
696fff3f5d change comparison operator 2023-01-04 09:07:42 -06:00
Chax
87108d5640 Change TaskResult to just a normal return. 2023-01-04 09:07:27 -06:00
Fenopy
8bc0b1cbaf change comparison operator 2023-01-04 09:07:05 -06:00
Chax
b6110ad703 Change TaskResult to just a normal return. 2023-01-04 09:06:03 -06:00
Chax
f48d2ef40d Seperate backing up game with uninstall game and create seperate method, ask the user if they want to backup and only backup if they actually say yes. 2023-01-04 09:04:54 -06:00
Fenopy
3e4bfe22d8 bump ADB 2023-01-04 08:39:51 -06:00
Fenopy
199e2cbaec Properly catch exceptions when you cant access a webpage 2023-01-04 08:38:52 -06:00
Fenopy
24f9f961b9 Nouns.txt Removal for building the debuglog.txt 2023-01-04 08:36:54 -06:00
Fenopy
e9b3f52f0e Fix Rookie crashing when pulling game to desktop while Rookie is on another drive than C 2023-01-04 08:35:44 -06:00
Chax
acf0649150 Fix- Compare OBBs 2023-01-04 08:35:11 -06:00
Chax
df2e35d683 This should hopefully fix the fullscreen mode not just like, revealing a little of the mainform. 2022-12-24 06:29:44 +01:00
Chax
19074465a0 Merge branch 'Trailers' of https://github.com/Chax1/androidsideloader into Trailers 2022-12-24 02:26:15 +01:00
Chax
7d8e143963 Ultimate Fixes, this now deletes the webview enviroment folder on startup if one exists to keep space low, the cache gets deleted on every new selection of a game and the enviroment creation only happens once due to a bool having to be set. 2022-12-24 02:25:55 +01:00
Chax
48c004794c this is not supposed to be here. 2022-12-24 01:19:48 +01:00
Chax
b011b3e7a2 more fixing 2022-12-24 01:19:09 +01:00
Chax
43daff617a Clear cache as soon as new game is listed. 2022-12-24 01:15:24 +01:00
Chax
ef6a1dc5a4 Trailers, kill me. 2022-12-23 22:27:12 +01:00
Fenopy
8c5b2d623b added parent to dialogs 2022-12-20 08:27:36 -06:00
SytheZN
d3a2c4012c Release/RSL-2.17 (#128)
* fix: pull to desktop not resetting work status.

resolves #104

* Create Text File with upload size for verification

* bump version

* better public config handling

* code cleanup

Co-authored-by: Fenopy <Fenopie@Gmail.com>
2022-12-05 23:42:59 +02:00
SytheZN
67a9089952 Merge branch 'release/RSL-2.16' 2022-11-05 03:41:06 +02:00
pmow
22ecbee791 Merge pull request #124 from SytheZN/master
RSL 2.15
2022-10-28 08:33:40 -10:00
Chax
e07ffa54ee RSL 2.15
- Massive UI Changes:
- Rounded buttons
- Added version Number at Bottom Left
- Changed fonts to some extend
- Added background pattern to category buttons and MainForm background
- Added an animation when opening/closing category
- Overall darker theme
- New splash

~Chax
2022-10-23 21:07:43 +02:00
pmow
be560875da Merge pull request #123 from SytheZN/master
RSL 2.14
2022-10-11 11:51:47 -10:00
SytheZN
fdf7e409bf RSL 2.14 2022-10-11 23:42:34 +02:00
pmow
d9255bf02d Merge pull request #122 from SytheZN/master
Add public-config
2022-10-03 21:34:51 -10:00
SytheZN
40b88a2d4c RSL 2.13
- Added new config mode for use with http mirror
- Removed previous http mirror workarounds
- Added Offline Mode launcher to package fetch.
- Add splash screen on startup
2022-10-01 12:59:12 +02:00
146 changed files with 61705 additions and 50848 deletions

21
.gitignore vendored
View File

@@ -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/

View File

@@ -1,7 +0,0 @@
{
"ExpandedNodes": [
""
],
"SelectedNode": "\\Sideloader.cs",
"PreviewInSolutionExplorer": false
}

Binary file not shown.

BIN
7z.dll

Binary file not shown.

BIN
7z.exe

Binary file not shown.

BIN
7z64.dll Normal file

Binary file not shown.

BIN
7z64.exe Normal file

Binary file not shown.

425
ADB.cs
View File

@@ -1,100 +1,103 @@
using System;
using AndroidSideloader.Utilities;
using JR.Utils.GUI.Forms;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
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\\platform-tools";
public static string adbFilePath = adbFolderPath + "\\adb.exe";
private static readonly SettingsManager settings = SettingsManager.Instance;
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)
{
Properties.Settings.Default.ADBFolder = adbFolderPath;
Properties.Settings.Default.ADBPath = adbFilePath;
Properties.Settings.Default.Save();
// Replacing "adb" from command if the user added it
command = command.Replace("adb", "");
settings.ADBFolder = adbFolderPath;
settings.ADBPath = adbFilePath;
settings.Save();
if (DeviceID.Length > 1)
{
command = $" -s {DeviceID} {command}";
}
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") && !settings.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;
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;
@@ -103,7 +106,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();
@@ -124,34 +127,24 @@ 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();
}
Logger.Log(output);
Logger.Log(error);
if (error.Contains("ADB_VENDOR_KEYS") && settings.AdbDebugWarned)
{
ADBDebugWarning();
}
_ = Logger.Log(output);
_ = Logger.Log(error, LogLevel.ERROR);
return new ProcessOutput(output, error);
}
public static ProcessOutput RunCommandToString(string result, string path = "")
@@ -159,62 +152,86 @@ namespace AndroidSideloader
string command = result;
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";
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 = Path.GetDirectoryName(path);
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);
if (!graceful)
using (var adb = new Process())
{
adb.Kill();
adb.StartInfo.FileName = $@"{Path.GetPathRoot(Environment.SystemDirectory)}\Windows\System32\cmd.exe";
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 = Path.GetDirectoryName(path);
adb.Start();
adb.StandardInput.WriteLine(command);
adb.StandardInput.Flush();
adb.StandardInput.Close();
string output = adb.StandardOutput.ReadToEnd();
string error = adb.StandardError.ReadToEnd();
if (command.Contains("connect"))
{
bool graceful = adb.WaitForExit(3000);
if (!graceful)
{
adb.Kill();
adb.WaitForExit();
}
}
else
{
adb.WaitForExit();
}
if (error.Contains("ADB_VENDOR_KEYS") && settings.AdbDebugWarned)
{
ADBDebugWarning();
}
if (error.Contains("Asset path") && error.Contains("is neither a directory nor file"))
{
Logger.Log("Asset path error detected. The specified path might not exist or be accessible.", LogLevel.WARNING);
// You might want to handle this specific error differently
}
Logger.Log(output);
Logger.Log(error, LogLevel.ERROR);
return new ProcessOutput(output, error);
}
}
else
adb.WaitForExit();
if (error.Contains("ADB_VENDOR_KEYS") && Properties.Settings.Default.adbdebugwarned)
catch (Exception ex)
{
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();
Logger.Log($"Error in RunCommandToString: {ex.Message}", LogLevel.ERROR);
return new ProcessOutput("", $"Exception occurred: {ex.Message}");
}
Logger.Log(output);
Logger.Log(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)
{
// settings.adbdebugwarned = true;
settings.Save();
}
});
}
public static ProcessOutput UninstallPackage(string package)
{
WakeDevice();
ProcessOutput output = new ProcessOutput("", "");
output += RunAdbCommandToString($"shell pm uninstall {package}");
return output;
@@ -223,155 +240,99 @@ 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 bool wirelessadbON;
public static void WakeDevice()
{
RunAdbCommandToString("shell input keyevent KEYCODE_WAKEUP");
if (!String.IsNullOrEmpty(Properties.Settings.Default.IPAddress) && !Properties.Settings.Default.Wired)
RunAdbCommandToString(Properties.Settings.Default.IPAddress);
}
public static ProcessOutput Sideload(string path, string packagename = "")
{
WakeDevice();
ProcessOutput ret = new ProcessOutput();
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);
if (out2.Contains("offline") && !Properties.Settings.Default.nodevicemode)
_ = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
_ = Logger.Log(out2);
if (out2.Contains("offline") && !settings.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($"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;
ADB.WakeDevice();
if (!Properties.Settings.Default.AutoReinstall)
if (!settings.AutoReinstall)
{
DialogResult dialogResult1 = FlexibleMessageBox.Show("In place upgrade has failed. Rookie can attempt to backup your save data and\nreinstall the game automatically, however " +
"some games do not store their saves\nin an accessible location(less than 5%). Continue with reinstall?", "In place upgrade failed.", MessageBoxButtons.OKCancel);
if (dialogResult1 == DialogResult.Cancel)
bool cancelClicked = false;
if (!settings.AutoReinstall)
{
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;
}
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");
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/");
string directoryToDelete = Path.Combine(Environment.CurrentDirectory, MainForm.CurrPCKG);
if (Directory.Exists(directoryToDelete))
{
if (directoryToDelete != Environment.CurrentDirectory)
{
Directory.Delete(directoryToDelete, true);
}
}
Program.form.changeTitle(" \n\n");
return ret;
}
}
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");
}
}
}

BIN
Ad.7z

Binary file not shown.

View File

@@ -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>
@@ -30,6 +30,7 @@
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<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,6 +181,9 @@
</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">
@@ -169,12 +193,23 @@
<DependentUpon>DonorsListView.cs</DependentUpon>
</Compile>
<Compile Include="FlexibleMessageBox.cs" />
<Compile Include="RoundedRectangleF.cs" />
<Compile Include="Settings.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>
@@ -205,19 +240,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>
@@ -228,13 +250,19 @@
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SelectFolder.cs" />
<Compile Include="Utilities\SettingsManager.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>
@@ -263,16 +291,11 @@
<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" />
@@ -285,6 +308,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>
@@ -294,16 +323,14 @@
<Content Include="changelog.txt" />
<Content Include="icon.ico" />
<Content Include="ChangelogHistory.txt" />
<None Include="Resources\UpdatesKey.png" />
<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" />
<None Include="Resources\ajax-loader.gif" />
<Content Include="Resources\bluekey.png" />
<None Include="Resources\gametoupload.png" />
<Content Include="Resources\redkey.png" />
<None Include="Resources\greenkey.png" />
<None Include="Resources\orangekey.png" />
<None Include="Resources\SearchGlass.PNG" />
</ItemGroup>
<ItemGroup>
@@ -320,13 +347,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>
@@ -336,4 +364,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>

View File

@@ -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>

View File

@@ -1,255 +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="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="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>True</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>40, 40, 40</value>
</setting>
<setting name="SubButtonColor" serializeAs="String">
<value>40, 40, 40</value>
</setting>
<setting name="TextBoxColor" serializeAs="String">
<value>29, 29, 29</value>
</setting>
<setting name="ButtonColor" serializeAs="String">
<value>50, 50, 50</value>
</setting>
<setting name="BackColor" serializeAs="String">
<value>50, 50, 50</value>
</setting>
<setting name="AppPackages" serializeAs="String">
<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>

View File

@@ -1,4 +1,257 @@
RSL 2.12
RSL 2.30
- 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)
RSL 2.29
- Feature: Prompt to keep temporary files and allow resuming of downloads
- Feature: Fixed progress bar jump-back
- Feature: Added part tracking during download
- Fix: Change UUID calculation. No longer uses system details (caused virus flags)
- Fix: Added rclone fallback download
- Fix: Additional connect/startup troubleshooting steps
- Chore: Bump rclone to 1.66.0
RSL 2.29.1
- Fix: Correct initilization sequence to prevent crashes
- Chore: bump package dependencies
- Chore: Fix initial GUI name
RSL 2.29.2
- Fix: Fix for failed uploads using new rclone version
- Fix: Changes to initilization order to prevent crashes and display splash
RSL 2.28
- Feature: Added ADB-Backup Support. Now supports creation and restoration of .AB backups
- Feature: Added OS-Updates toggle to ADB-Command window (Click to toggle on/off)
- Feature: Allow ADB Commands with or without prefix
- Fix: Left-Navigation UI Reorganization
- Fix: 7zip crash, empty device list crash
- Fix: Update settings after version update
- Fix: Crashlog naming
- Fix: Disable searchbar until Rookie is fully loaded
- Chore: Add public mirror as a default to Git-downloads
- Chore: Readme Updates
- Chore: Code Cleanup / Beautification
- Chore: Change from _adb dependency files to dependencies.7z file
- Chore: Remove unused files
- Chore: Default to Single-Thread Mode
RSL 2.27.2
- Feature: Searchbar can now also search release names
- Feature: Rookie will now download 64 bit 7zip binaries for faster extractions (when possible)
- Fix: 7zip error handler
- Fix: Crash when downloading without enough space
- Fix: Rookie will no longer deny game donations.
- Chore: Cleanup code
RSL 2.26
- Feature: Top right update labels will now show the amount of games per state
- Feature: Open Download Dir and Run ADB Commands added to left sidebar
- Feature: Toggle sideloading button
- Feature: Show progress of extraction
- Fix: Crash when failing to write to the StoredIP.txt
- Fix: Drag and drop + Copy OBB for Quest 3 users
- Fix: Properly kill off WebView2 instances
- Fix: Added parents to dialogs
- Fix: GUI freezing on launch
- Fix: No Device Mode output
- Chore: Make missing space message more user-friendly
- Chore: Remove QU Settings
RSL 2.25.1
- Fix: Device not authorized prompt showing up after authorization.
RSL 2.25
- Fix: Fix to unauthorized device bug
- Chore: Update Wiki URL
RSL 2.24
- Feature: Added "Open Download" and "Open Backup" Directory buttons to Settings Menu
- Fix: OBB Pushes for Quest 3 Devices
- Fix: Crash when attempting to backup
- Fix: Searchbar Anchoring when resizing
- Fix: Remove instances where OBBs are pushed multiple times
- Fix: Additional Logging and Startup Optimizations
RSL 2.23
- Fix: Rookie should now only prompt for newer versions of all games
- Fix: Crash when attempting to delete invalid directories or files
- Feature: Enable Maximize Button
RSL 2.22
- Fix: Crash on failed extractions.
- Fix: Trailers controls not functioning properly.
- Fix: No Device Mode having the wrong output message.
- Chore: Remove ADB.WakeDevice() due to being non-functional.
- Chore: Make changeTitlebarToDevice less prone to crashes and more robust.
RSL 2.21
- Feature: Search now shows all results found
- Feature: Add --no-rclone-updating launch flag
- Feature: Add lime-green color to various after download jobs
- Feature: Update Sideloader Launcher to check for Rookie
- Feature: Add the ability to download into virtual filesystems (Settings)
- Feature: Add stacktrace & innerexception to crashlog
- Feature: Add CallerInfo to debuglog
- Feature: Rookie will now tell the user when there's a running RCLONE Job
- Fix: Rookie will no longer repeat "All tasks finished." in No Device Mode
- Fix: Rookie should no longer delete the entire OBB/Data folder when uninstalling a game
- Fix: Rookie should no longer freeze on the OBB Comparison
- Fix: The free disclaimer on launch is no longer broken
- Fix: Use new process for every ADB command
- Fix: Do not delete game files on an OBB Mismatch anymore
- Fix: Change all hardcoded C:/ paths to dynamically grab the system drive for further compatability
- Fix: Rookie should now function on 32 Bit again
- Fix: Fix crash on failed extraction
- Chore: Update quota message to be up to date
- Chore: Code rewrites for logging system, obb comparison, updater
- Chore: Several redundant code removals
- Chore: Change Install w/ Enter Key to Download w/ Enter Key
- Chore: Several code cleanups & optimizations
~ Chax
RSL 2.20
- Feature: Added manual IP on Wireless ADB
- Feature: Rookie will now delete old OBB Folders before pushing new obb folders
- Feature: Add Single-Thread mode in settings (For users with download issues using multiple threads)
- Fix: Device Storage display
- Fix: Games that come with install.txt will now check for a device to avoid freezes
- Fix: "No Device Mode" checkbox can't have "Delete after Download and Install" enabled at the same time anymore
- Fix: Removing Queue Items should no longer ever crash Rookie
- Fix: Rookie will no longer reload the gamelist if you have filtered it
- Fix: Check if the rclone we are killing is ours
- Fix: Put zip extraction into a thread to avoid freezing the UI
- Fix: Filters should no longer cause crashes.
- Chore: Update RCLONE to 1.62.2
- Chore: Cleaning up the code for the Trailers, progress bar, dropdown categories, redundant internet checks, and other code cleanup
- Chore: Other UI and message box display cleanup
- Chore: Optimize the code for getting the thumbnail paths
- Chore: Log Levels added to Debuglog
- Thank you to Chax for the new features and fixes!
~ fenopy
RSL 2.19
- Feature: Added streaming Game Trailers (enable in Settings)
- Feature: Added custom Download Directories
- Feature: Added custom Backup Directories
- Feature: Added Game Filtering (click on the Colored-Labels in the Top-Right)
- Feature: When uninstalling games, Rookie will now ask if you want to back up save data
- Feature: "No Device Mode" now automatically disables "Delete after Download and Install"
- Feature: Offline Mode now has the ability to donate new games/updates
- Fix: OBBs will no longer be attempted to push in "No Device Mode"
- Fix: Comparing OBB sizes will no longer error during "No Device Mode"
- Fix: Comparing OBB Sizes will no longer state "Input string was not in a correct format", it will now properly tell the user what is wrong
- Fix: The GitHub Error when starting up will now show the actual URL it tries to access
- Fix: Added a check to make Rookie not attempt to get available space when no devices are connected
- Removed Bandwidth Limit settings
- Thank you to Chax for the new features!
- Thank you to JP for the Trailers framework!
~ fenopy
RSL 2.18
- Moving Rookie onto a different Directory than C: will not break Pull App To Desktop anymore
- Rookie should now tell the user why it couldnt get the Rclone/ADB etc. Files
- Dialogs will should now no longer hide behind Rookie.
- ADB was updated to the latest version.
~ Chax & fenopy
RSL 2.17
- Various bugfixes
~SytheZN
~fenopy
RSL 2.16
- Fix misleading error message when not enough disk space
- Fix downloads silently failing in some cases
- Fix failure to detect failed extraction when archive corrupt
- Fix UI issues when resizing main form
- Various code cleanups
~SytheZN
~fenopy
RSL 2.15
- Massive UI Changes:
- Rounded buttons
- Added version Number at Bottom Left
- Changed fonts to some extend
- Added background pattern to category buttons and MainForm background
- Added an animation when opening/closing category
- Overall darker theme
- New splash
~Chax
RSL 2.14
- Added upload config for easier config management
- Improved upload logic to handle failures better
~SytheZN
- Much better theme
~fenopy
RSL 2.13
- Added new config mode for use with http mirror
- Removed previous http mirror workarounds
- Added Offline Mode launcher to package fetch.
- Add splash screen on startup
~SytheZN
RSL 2.12
- updated auto-update source
- update status text

26
CleanupInstall.cmd Normal file
View 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=%userprofile%\AppData\Local\Rookie.WTF\"
echo Deleting contents of %folderPath%...
for /D %%i in ("%folderPath%\*") do (
rd /s /q "%%i"
)
del /q "%folderPath%\*.*"
set "folderPath=%userprofile%\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

View File

@@ -2,128 +2,102 @@
using System.Windows.Forms;
/// <summary>
/// This class is an implementation of the 'IComparer' interface.
/// A custom comparer for sorting ListView columns, implementing the 'IComparer' interface.
/// </summary>
public class ListViewColumnSorter : IComparer
{
/// <summary>
/// Specifies the column to be sorted
/// Case-insensitive comparer object used for comparing strings.
/// </summary>
private int ColumnToSort;
private readonly CaseInsensitiveComparer ObjectCompare;
/// <summary>
/// Specifies the order in which to sort (i.e. 'Ascending').
/// </summary>
private SortOrder OrderOfSort;
/// <summary>
/// Case insensitive comparer object
/// </summary>
private CaseInsensitiveComparer ObjectCompare;
/// <summary>
/// Class constructor. Initializes various elements
/// Initializes a new instance of the ListViewColumnSorter class and sets default sorting parameters.
/// </summary>
public ListViewColumnSorter()
{
// Initialize the column to '0'
ColumnToSort = 0;
// Default column index for sorting
SortColumn = 0;
// Initialize the sort order to 'none'
OrderOfSort = SortOrder.Ascending;
// Default sorting order
Order = SortOrder.Ascending;
// Initialize the CaseInsensitiveComparer object
// Initialize the case-insensitive comparer
ObjectCompare = new CaseInsensitiveComparer();
}
/// <summary>
/// This method is inherited from the IComparer interface. It compares the two objects passed using a case insensitive comparison.
/// Compares two ListViewItem objects based on the specified column index and sorting order.
/// </summary>
/// <param name="x">First object to be compared</param>
/// <param name="y">Second object to be compared</param>
/// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
/// <param name="x">First ListViewItem object to compare.</param>
/// <param name="y">Second ListViewItem object to compare.</param>
/// <returns>
/// A signed integer indicating the relative values of x and y:
/// "0" if equal, a negative number if x is less than y, and a positive number if x is greater than y.
/// </returns>
public int Compare(object x, object y)
{
int compareResult;
ListViewItem listviewX, listviewY;
ListViewItem listviewX = (ListViewItem)x;
ListViewItem listviewY = (ListViewItem)y;
// Cast the objects to be compared to ListViewItem objects
listviewX = (ListViewItem)x;
listviewY = (ListViewItem)y;
if (ColumnToSort == 5 ) {
// Determine if the column requires numeric comparison
if (SortColumn == 3 || SortColumn == 5) // Numeric columns: VersionCodeIndex, VersionNameIndex
{
try
{
int yNum = int.Parse(cleanNumber(listviewY.SubItems[ColumnToSort].Text));
int xNum = int.Parse(cleanNumber(listviewX.SubItems[ColumnToSort].Text));
if (xNum == yNum )
{
return 0;
}
else if(xNum > yNum && OrderOfSort == SortOrder.Ascending)
{
return -1;
}
else
{
return 1;
}
} catch { }
}
// Parse and compare numeric values directly
int xNum = ParseNumber(listviewX.SubItems[SortColumn].Text);
int yNum = ParseNumber(listviewY.SubItems[SortColumn].Text);
// Compare the two items
compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
// Calculate correct return value based on object comparison
if (OrderOfSort == SortOrder.Ascending)
{
// Ascending sort is selected, return normal result of compare operation
return compareResult;
}
else if (OrderOfSort == SortOrder.Descending)
{
// Descending sort is selected, return negative result of compare operation
return (-compareResult);
// Compare numerically
compareResult = xNum.CompareTo(yNum);
}
catch
{
// Fallback to string comparison if parsing fails
compareResult = ObjectCompare.Compare(listviewX.SubItems[SortColumn].Text, listviewY.SubItems[SortColumn].Text);
}
}
else
{
// Return '0' to indicate they are equal
return 0;
// Default to string comparison for non-numeric columns
compareResult = ObjectCompare.Compare(listviewX.SubItems[SortColumn].Text, listviewY.SubItems[SortColumn].Text);
}
// Determine the return value based on the specified sort order
if (Order == SortOrder.Ascending)
{
return compareResult;
}
else if (Order == SortOrder.Descending)
{
return -compareResult;
}
else
{
return 0; // Indicate equality
}
}
/// <summary>
/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
/// Parses a numeric value from a string for accurate numeric comparison.
/// </summary>
public int SortColumn
/// <param name="text">The string representation of the number.</param>
/// <returns>The parsed integer value; returns 0 if parsing fails.</returns>
private int ParseNumber(string text)
{
set
{
ColumnToSort = value;
}
get
{
return ColumnToSort;
}
// Directly attempt to parse the string as an integer
return int.TryParse(text, out int result) ? result : 0;
}
/// <summary>
/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
/// Gets or sets the index of the column to be sorted (default is '0').
/// </summary>
public SortOrder Order
{
set
{
OrderOfSort = value;
}
get
{
return OrderOfSort;
}
}
public int SortColumn { get; set; }
private string cleanNumber(string number)
{
return number.Substring(0);
}
}
/// <summary>
/// Gets or sets the order of sorting (Ascending or Descending).
/// </summary>
public SortOrder Order { get; set; }
}

View File

@@ -1,22 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace AndroidSideloader
{
class Donors
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
*/
/* 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>();
@@ -26,38 +22,33 @@ namespace AndroidSideloader
{
donorGameProperties.Clear();
donorGames.Clear();
if (!MainForm.DonorApps.Equals(""))
if (!string.IsNullOrEmpty(MainForm.donorApps))
{
string[] gameListSplited = MainForm.DonorApps.Split(new[] { '\n' });
string[] gameListSplited = MainForm.donorApps.Split('\n');
foreach (string game in gameListSplited)
{
if (game.Length > 1)
{
string[] splitGame = game.Split(';');
donorGames.Add(splitGame);
donorGames.Add(game.Split(';'));
}
}
}
}
public static void initNewApps()
{
newApps.Clear();
if (!DonorsListViewForm.newAppsForList.Equals(""))
if (!string.IsNullOrEmpty(DonorsListViewForm.newAppsForList))
{
string[] newListSplited = DonorsListViewForm.newAppsForList.Split(new[] { '\n' });
string[] newListSplited = DonorsListViewForm.newAppsForList.Split('\n');
foreach (string game in newListSplited)
{
if (game.Length > 1)
{
string[] splitGame = game.Split(';');
newApps.Add(splitGame);
newApps.Add(game.Split(';'));
}
}
}
}
}
}

View File

@@ -30,27 +30,28 @@ namespace AndroidSideloader
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 System.Windows.Forms.Button();
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.DonateButton = new System.Windows.Forms.Button();
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;
@@ -83,41 +84,42 @@ namespace AndroidSideloader
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.Controls.Add(this.DonateButton);
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";
@@ -126,26 +128,61 @@ namespace AndroidSideloader
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.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
//
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.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.SkipButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
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.TabIndex = 1;
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.UseVisualStyleBackColor = true;
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));
@@ -153,9 +190,9 @@ namespace AndroidSideloader
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);
@@ -169,9 +206,9 @@ namespace AndroidSideloader
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);
@@ -185,9 +222,9 @@ namespace AndroidSideloader
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);
@@ -201,9 +238,9 @@ namespace AndroidSideloader
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)));
@@ -216,9 +253,9 @@ namespace AndroidSideloader
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)));
@@ -231,27 +268,9 @@ namespace AndroidSideloader
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);
//
// DonateButton
//
this.DonateButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
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.Enabled = false;
this.DonateButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.DonateButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.DonateButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.DonateButton.Location = new System.Drawing.Point(130, 277);
this.DonateButton.Name = "DonateButton";
this.DonateButton.Size = new System.Drawing.Size(311, 36);
this.DonateButton.TabIndex = 1;
this.DonateButton.Text = "Automatically share selected apps";
this.DonateButton.UseVisualStyleBackColor = true;
this.DonateButton.Click += new System.EventHandler(this.DonateButton_Click);
//
//
// DonorsListViewForm
//
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Gainsboro;
@@ -260,6 +279,7 @@ namespace AndroidSideloader
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);
@@ -270,25 +290,25 @@ namespace AndroidSideloader
this.panel1.PerformLayout();
this.panel2.ResumeLayout(false);
this.ResumeLayout(false);
this.Activate();
}
#endregion
private System.Windows.Forms.ListView DonorsListView;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button DonateButton;
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.Button SkipButton;
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;
}
}
}

View File

@@ -1,18 +1,6 @@
using AndroidSideloader.Utilities;
using JR.Utils.GUI.Forms;
using Newtonsoft.Json;
using SergeUtils;
using System;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.NetworkInformation;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AndroidSideloader
@@ -40,25 +28,33 @@ namespace AndroidSideloader
DonorsListView.EndUpdate();
}
public static string DonorsLocal = MainForm.DonorApps;
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;
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);
}
}
}
@@ -81,50 +77,46 @@ namespace AndroidSideloader
}
if (uncheckednewapps)
{
NewApps NewAppForm = new NewApps();
NewAppForm.ShowDialog();
this.Hide();
_ = NewAppForm.ShowDialog();
Hide();
}
else
this.Hide();
int count = 0;
count = DonorsListView.CheckedItems.Count;
string[] gamesToUpload;
gamesToUpload = new string[count];
{
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);
{
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();
MainForm.doUpload();
}
this.Close();
}
Close();
}
private void DonorsListView_ItemChecked(object sender, ItemCheckedEventArgs e)
{
if (DonorsListView.CheckedItems.Count == 0)
{
SkipButton.Enabled = true;
DonateButton.Enabled = false;
}
else
{
DonateButton.Enabled = true;
SkipButton.Enabled = false;
}
SkipButton.Enabled = DonorsListView.CheckedItems.Count == 0;
DonateButton.Enabled = !SkipButton.Enabled;
}
private void SkipButton_Click(object sender, EventArgs e)
{
bool uncheckednewapps = false;
@@ -142,9 +134,9 @@ namespace AndroidSideloader
if (uncheckednewapps)
{
NewApps NewAppForm = new NewApps();
NewAppForm.ShowDialog();
_ = NewAppForm.ShowDialog();
}
this.Close();
Close();
}
private void DonorsListViewForm_MouseDown(object sender, MouseEventArgs e)
@@ -157,9 +149,9 @@ namespace AndroidSideloader
{
if (mouseDown)
{
this.Location = new Point(
(this.Location.X - lastLocation.X) + e.X, (this.Location.Y - lastLocation.Y) + e.Y);
this.Update();
Location = new Point(
Location.X - lastLocation.X + e.X, Location.Y - lastLocation.Y + e.Y);
Update();
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3168
MainForm.Designer.cs generated

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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
View 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));
}
}
}

78
NewApps.Designer.cs generated
View File

@@ -29,17 +29,18 @@ namespace AndroidSideloader
/// </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.NewAppsButton = new System.Windows.Forms.Button();
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;
@@ -63,38 +64,18 @@ namespace AndroidSideloader
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;
//
// NewAppsButton
//
this.NewAppsButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
this.NewAppsButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.NewAppsButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.NewAppsButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.NewAppsButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.NewAppsButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.NewAppsButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.NewAppsButton.Location = new System.Drawing.Point(12, 212);
this.NewAppsButton.Name = "NewAppsButton";
this.NewAppsButton.Size = new System.Drawing.Size(288, 29);
this.NewAppsButton.TabIndex = 2;
this.NewAppsButton.Text = "Accept";
this.NewAppsButton.UseVisualStyleBackColor = true;
this.NewAppsButton.Click += new System.EventHandler(this.DonateButton_Click);
this.NewAppsButton.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label2_MouseDown);
this.NewAppsButton.MouseMove += new System.Windows.Forms.MouseEventHandler(this.label2_MouseMove);
this.NewAppsButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label2_MouseUp);
//
//
// 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));
@@ -102,9 +83,9 @@ namespace AndroidSideloader
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);
@@ -118,19 +99,42 @@ namespace AndroidSideloader
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.label2);
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);
@@ -140,16 +144,16 @@ namespace AndroidSideloader
this.panel2.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
this.Activate();
}
#endregion
private System.Windows.Forms.ListView NewAppsListView;
private System.Windows.Forms.ColumnHeader GameNameIndex;
private System.Windows.Forms.Button NewAppsButton;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ColumnHeader PackageNameIndex;
private RoundButton NewAppsButton;
}
}
}

View File

@@ -1,11 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AndroidSideloader
@@ -30,10 +25,10 @@ namespace AndroidSideloader
{
if (mouseDown)
{
this.Location = new Point(
(this.Location.X - lastLocation.X) + e.X, (this.Location.Y - lastLocation.Y) + e.Y);
Location = new Point(
Location.X - lastLocation.X + e.X, Location.Y - lastLocation.Y + e.Y);
this.Update();
Update();
}
}
@@ -58,8 +53,8 @@ namespace AndroidSideloader
Properties.Settings.Default.Save();
}
}
MainForm.newpackageupload();
this.Close();
MainForm.newPackageUpload();
Close();
}
private void NewApps_Load(object sender, EventArgs e)
@@ -71,7 +66,9 @@ namespace AndroidSideloader
{
ListViewItem NGame = new ListViewItem(release);
if (!NewAppList.Contains(NGame))
NewAppList.Add(NGame);
{
NewAppList.Add(NGame);
}
}
ListViewItem[] arr = NewAppList.ToArray();
NewAppsListView.BeginUpdate();

File diff suppressed because it is too large Load Diff

View File

@@ -1,35 +1,46 @@
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 AndroidSideloader.Utilities;
using System;
using System.IO;
using System.Security.Permissions;
using System.Windows.Forms;
namespace AndroidSideloader
{
internal static class Program
{
private static readonly SettingsManager settings = SettingsManager.Instance;
/// <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);
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(settings.CurrentLogPath))
{
File.AppendAllText(Sideloader.CrashLogPath, File.ReadAllText($"{settings.CurrentLogPath}"));
}
}
}
}

View File

@@ -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("")]

View File

@@ -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 {
@@ -83,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));
}
}
@@ -93,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));
}
}
@@ -103,49 +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 gametoupload {
get {
object obj = ResourceManager.GetObject("gametoupload", 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));
}
}
@@ -163,9 +123,39 @@ namespace AndroidSideloader.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap UpdatesKey {
public static System.Drawing.Bitmap splashimage {
get {
object obj = ResourceManager.GetObject("UpdatesKey", resourceCulture);
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));
}
}

View File

@@ -118,37 +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="gametoupload" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\gametoupload.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="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>
<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="UpdatesKey" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\UpdatesKey.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>

File diff suppressed because it is too large Load Diff

View File

@@ -32,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>
@@ -50,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>
@@ -98,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>
@@ -116,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)">True</Value>
</Setting>
<Setting Name="adbdebugwarned" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
@@ -168,22 +129,58 @@
<Value Profile="(Default)">White</Value>
</Setting>
<Setting Name="ComboBoxColor" Type="System.Drawing.Color" Scope="User">
<Value Profile="(Default)">40, 40, 40</Value>
<Value Profile="(Default)">25, 25, 25</Value>
</Setting>
<Setting Name="SubButtonColor" Type="System.Drawing.Color" Scope="User">
<Value Profile="(Default)">40, 40, 40</Value>
<Value Profile="(Default)">25, 25, 25</Value>
</Setting>
<Setting Name="TextBoxColor" Type="System.Drawing.Color" Scope="User">
<Value Profile="(Default)">29, 29, 29</Value>
<Value Profile="(Default)">25, 25, 25</Value>
</Setting>
<Setting Name="ButtonColor" Type="System.Drawing.Color" Scope="User">
<Value Profile="(Default)">50, 50, 50</Value>
<Value Profile="(Default)">Black</Value>
</Setting>
<Setting Name="BackColor" Type="System.Drawing.Color" Scope="User">
<Value Profile="(Default)">50, 50, 50</Value>
<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>

1181
QuestForm.Designer.cs generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,16 @@
using System;
using System.Collections.Generic;
using AndroidSideloader.Utilities;
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
namespace AndroidSideloader
{
public partial class QuestForm : Form
{
private static readonly SettingsManager settings = SettingsManager.Instance;
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,119 +18,58 @@ 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();
int result;
Int32.TryParse(TextureResTextBox.Text, out 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!");
}
}
public static void setLength(Int32 value)
public static void setLength(int value)
{
result = new string[value];
}
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)
@@ -142,218 +79,111 @@ 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;
Properties.Settings.Default.Save();
settings.Delsh = true;
settings.Save();
}
if (!DeleteShots.Checked)
{
Properties.Settings.Default.delsh = false;
Properties.Settings.Default.Save();
settings.Delsh = false;
settings.Save();
}
}
private void QuestForm_Load(object sender, EventArgs e)
{
if (Properties.Settings.Default.delsh)
DeleteShots.Checked = true;
else
DeleteShots.Checked = false;
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;
}
GlobalUsername.Text = Properties.Settings.Default.GlobalUsername;
DeleteShots.Checked = settings.Delsh;
GlobalUsername.Text = settings.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");
File.Delete($"{Properties.Settings.Default.MainDir}\\Config.Json");
_ = MessageBox.Show("Ok, Deleted your custom settings file.\nIf you would like to re-enable return here and apply settings again");
File.Delete($"{settings.MainDir}\\Config.Json");
}
private void questPics_Click(object sender, EventArgs e)
{
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)
{
if (GlobalUsername.Text.Contains(" "))
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (!Directory.Exists($"{path}\\Quest Recordings"))
{
MessageBox.Show("Usernames with a space are not permitted.", "Detected a space in username!");
_ = Directory.CreateDirectory($"{path}\\Quest Recordings");
}
else
_ = 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)
{
ADB.RunAdbCommandToString($"shell settings put global username {GlobalUsername.Text}");
MessageBox.Show($"Username set as {GlobalUsername.Text}", "Success");
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)
{
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)");
}
private void GlobalUsername_TextChanged(object sender, EventArgs e)
{
if (GlobalUsername.TextLength > 0)
button3.Enabled = true;
else
button3.Enabled = false;
Properties.Settings.Default.GlobalUsername = GlobalUsername.Text;
Properties.Settings.Default.Save();
btnApplyUsername.Enabled = GlobalUsername.TextLength > 0;
settings.GlobalUsername = GlobalUsername.Text;
settings.Save();
}
}
}

File diff suppressed because it is too large Load Diff

306
RCLONE.cs
View File

@@ -1,22 +1,46 @@
using System;
using System.Diagnostics;
using System.Text;
using System.IO;
using System.Windows.Forms;
using AndroidSideloader.Utilities;
using JR.Utils.GUI.Forms;
using System;
using System.Diagnostics;
using System.IO;
using System.Management;
using System.Text;
using System.Windows.Forms;
namespace AndroidSideloader
{
class RCLONE
internal class RCLONE
{
//Kill all rclone, using a static rclone variable doesn't work for some reason #tofix
private static readonly SettingsManager settings = SettingsManager.Instance;
// 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,60 +50,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 = "")
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.HasInternet || MainForm.isOffline)
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 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";
string logcmd = Utilities.StringUtilities.RemoveEverythingBeforeFirst(command, "rclone.exe");
if (logcmd.Contains($"\"{settings.CurrentLogPath}\""))
{
logcmd = logcmd.Replace($"\"{settings.CurrentLogPath}\"", $"\"{settings.CurrentLogName}\"");
}
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();
@@ -88,20 +120,32 @@ namespace AndroidSideloader
string error = rclone.StandardError.ReadToEnd();
rclone.WaitForExit();
//if there is one of these errors, we switch the mirrors
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 {settings.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
{
@@ -113,21 +157,191 @@ namespace AndroidSideloader
{
if (!string.IsNullOrWhiteSpace(error))
{
Logger.Log($"Rclone error: {error}\n");
_ = Logger.Log($"Rclone error: {error}\n", LogLevel.ERROR);
}
if (!string.IsNullOrWhiteSpace(output))
{
Logger.Log($"Rclone Output: {output}");
_ = Logger.Log($"Rclone Output: {output}");
}
}
if (output.Contains("There is not enough space"))
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)
{
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");
command += $" --config {uploadConfigPath}";
}
string logcmd = Utilities.StringUtilities.RemoveEverythingBeforeFirst(command, "rclone.exe");
if (logcmd.Contains($"\"{settings.CurrentLogPath}\""))
{
logcmd = logcmd.Replace($"\"{settings.CurrentLogPath}\"", $"\"{settings.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($"\"{settings.CurrentLogPath}\""))
{
logcmd = logcmd.Replace($"\"{settings.CurrentLogPath}\"", $"\"{settings.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 {settings.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;
}
}
}

View File

@@ -1,15 +1,33 @@
# androidsideloader
![GitHub last commit](https://img.shields.io/github/last-commit/nerdunit/androidsideloader)
![GitHub release (latest by date)](https://img.shields.io/github/v/release/nerdunit/androidsideloader)
[![Downloads](https://img.shields.io/github/downloads/nerdunit/androidsideloader/total.svg)](https://github.com/nerdunit/androidsideloader/releases)
![Issues](https://img.shields.io/github/issues/nerdunit/androidsideloader)
# AndroidSideloader
androidsideloader uses the GPL license, any forks of it must have their source code made public on the internet.
![GitHub last commit](https://img.shields.io/github/last-commit/VRPirates/rookie)
![GitHub release (latest by date)](https://img.shields.io/github/v/release/VRPirates/rookie)
[![Downloads](https://img.shields.io/github/downloads/VRPirates/rookie/total.svg)](https://github.com/VRPirates/rookie/releases)
![Issues](https://img.shields.io/github/issues/VRPirates/rookie)
## !IMPORTANT!
## Disclaimer
This application might get flagged as malware by some antivirus software; however, both the Sideloader and the Sideloader Launcher are open source.
This app may be buggy and have problems.
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.
### This app might get detected as malware, however both the sideloader and the sideloader launcher are open source. And obviously, it isn't.
See:
https://www.virustotal.com/gui/file/977105693610cf360fc29339b918e224180ba393ba05a64b6255af3845cbf376/relations
## 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 827 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

BIN
Resources/pattern_cubes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

BIN
Resources/splashimage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

10
Rookie Offline.cmd Normal file
View 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
View 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
View 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; }
}
}

View File

@@ -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; }
}
}

28
Settings.cs Normal file
View File

@@ -0,0 +1,28 @@
namespace AndroidSideloader.Properties {
// This class allows you to handle specific events on the settings class:
// The SettingChanging event is raised before a setting's value is changed.
// The PropertyChanged event is raised after a setting's value is changed.
// The SettingsLoaded event is raised after the setting values are loaded.
// The SettingsSaving event is raised before the setting values are saved.
internal sealed partial class Settings {
public Settings() {
// // To add event handlers for saving and changing settings, uncomment the lines below:
//
// this.SettingChanging += this.SettingChangingEventHandler;
//
// this.SettingsSaving += this.SettingsSavingEventHandler;
//
}
private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
// Add code to handle the SettingChangingEvent event here.
}
private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
// Add code to handle the SettingsSaving event here.
}
}
}

991
SettingsForm.Designer.cs generated
View File

@@ -1,419 +1,572 @@
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.AutoReinstBox = 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(165, 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, 328);
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(347, 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, 328);
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(327, 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(235, 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(275, 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, 296);
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, 273);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(281, 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, 296);
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, 373);
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, 489);
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, 408);
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, 484);
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, 455);
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, 555);
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, 538);
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(204, 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(202, 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(316, 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);
//
// AutoReinstBox
//
this.AutoReinstBox.AutoSize = true;
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(12, 222);
this.AutoReinstBox.Name = "AutoReinstBox";
this.AutoReinstBox.Size = new System.Drawing.Size(322, 22);
this.AutoReinstBox.TabIndex = 9;
this.AutoReinstBox.Text = "Enable auto reinstall upon install failure";
this.AutoReinstBox.UseVisualStyleBackColor = true;
this.AutoReinstBox.CheckedChanged += new System.EventHandler(this.AutoReinstBox_CheckedChanged);
this.AutoReinstBox.Click += new System.EventHandler(this.AutoReinstBox_Click);
//
// 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, 634);
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.AutoReinstBox);
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.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();
this.Activate();
}
#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;
private System.Windows.Forms.CheckBox AutoReinstBox;
}
}

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.hideAdultContentCheckBox = new System.Windows.Forms.CheckBox();
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(26, 628);
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(26, 591);
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(25, 464);
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(25, 501);
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(25, 538);
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(178, 411);
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(26, 411);
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(26, 702);
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(26, 665);
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(8, 370);
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(129, 368);
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(181, 370);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(43, 18);
this.label1.TabIndex = 32;
this.label1.Text = "MB/s";
//
// hideAdultContentCheckBox
//
this.hideAdultContentCheckBox.AutoSize = true;
this.hideAdultContentCheckBox.BackColor = System.Drawing.Color.Transparent;
this.hideAdultContentCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.hideAdultContentCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.hideAdultContentCheckBox.Location = new System.Drawing.Point(13, 336);
this.hideAdultContentCheckBox.Name = "hideAdultContentCheckBox";
this.hideAdultContentCheckBox.Size = new System.Drawing.Size(149, 22);
this.hideAdultContentCheckBox.TabIndex = 33;
this.hideAdultContentCheckBox.Text = "Hide Adult Content";
this.hideAdultContentCheckBox.UseVisualStyleBackColor = true;
this.hideAdultContentCheckBox.CheckedChanged += new System.EventHandler(this.hideAdultContentCheckBox_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.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
this.ClientSize = new System.Drawing.Size(339, 746);
this.Controls.Add(this.hideAdultContentCheckBox);
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;
private System.Windows.Forms.CheckBox hideAdultContentCheckBox;
}
}

View File

@@ -1,250 +1,321 @@
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;
AutoReinstBox.Checked = Properties.Settings.Default.AutoReinstall;
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}\" VRP-debuglogs:DebugLogs");
Clipboard.SetText(DebugID.Text);
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 = 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 AutoReinstBox_Click(object sender, EventArgs e)
{
if (AutoReinstBox.Checked)
{
DialogResult dialogResult = FlexibleMessageBox.Show("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 preform\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;
}
}
}
}
using AndroidSideloader.Utilities;
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
{
private static readonly SettingsManager _settings = SettingsManager.Instance;
public SettingsForm()
{
InitializeComponent();
}
private void SettingsForm_Load(object sender, EventArgs e)
{
CenterToParent();
initSettings();
initToolTips();
}
private void initSettings()
{
checkForUpdatesCheckBox.Checked = _settings.CheckForUpdates;
enableMessageBoxesCheckBox.Checked = _settings.EnableMessageBoxes;
deleteAfterInstallCheckBox.Checked = _settings.DeleteAllAfterInstall;
updateConfigCheckBox.Checked = _settings.AutoUpdateConfig;
userJsonOnGameInstall.Checked = _settings.UserJsonOnGameInstall;
nodevicemodeBox.Checked = _settings.NodeviceMode;
bmbfBox.Checked = _settings.BMBFChecked;
AutoReinstBox.Checked = _settings.AutoReinstall;
trailersOn.Checked = _settings.TrailersOn;
chkSingleThread.Checked = _settings.SingleThreadMode;
virtualFilesystemCompatibilityCheckbox.Checked = _settings.VirtualFilesystemCompatibility;
hideAdultContentCheckBox.Checked = _settings.HideAdultContent;
bandwidthLimitTextBox.Text = _settings.BandwidthLimit.ToString();
if (nodevicemodeBox.Checked)
{
deleteAfterInstallCheckBox.Checked = false;
deleteAfterInstallCheckBox.Enabled = false;
}
chkUseDownloadedFiles.Checked = _settings.UseDownloadedFiles;
}
private void initToolTips()
{
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($"{_settings.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($"{_settings.CurrentLogPath}"))
{
File.Delete($"{_settings.CurrentLogPath}");
}
if (File.Exists($"{Environment.CurrentDirectory}\\debuglog.txt"))
{
File.Delete($"{Environment.CurrentDirectory}\\debuglog.txt");
}
}
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))
{
_settings.BandwidthLimit = bandwidthLimit;
_settings.Save();
this.Close();
}
else
{
MessageBox.Show("Please enter a valid number for the bandwidth limit.");
}
}
private void checkForUpdatesCheckBox_CheckedChanged(object sender, EventArgs e)
{
_settings.CheckForUpdates = checkForUpdatesCheckBox.Checked;
_settings.Save();
}
private void chkUseDownloadedFiles_CheckedChanged(object sender, EventArgs e)
{
_settings.UseDownloadedFiles = chkUseDownloadedFiles.Checked;
_settings.Save();
}
private void enableMessageBoxesCheckBox_CheckedChanged(object sender, EventArgs e)
{
_settings.EnableMessageBoxes = enableMessageBoxesCheckBox.Checked;
_settings.Save();
}
private void resetSettingsButton_Click(object sender, EventArgs e)
{
// Reset the specific properties
_settings.CustomDownloadDir = false;
_settings.CustomBackupDir = false;
// Set backup folder and download directory
MainForm.backupFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Rookie Backups");
_settings.DownloadDir = Environment.CurrentDirectory;
_settings.CreatePubMirrorFile = true;
// Optionally, call initSettings if it needs to initialize anything based on these settings
initSettings();
// Save the updated settings
_settings.Save();
}
private void deleteAfterInstallCheckBox_CheckedChanged(object sender, EventArgs e)
{
_settings.DeleteAllAfterInstall = deleteAfterInstallCheckBox.Checked;
_settings.Save();
}
private void updateConfigCheckBox_CheckedChanged(object sender, EventArgs e)
{
_settings.AutoUpdateConfig = updateConfigCheckBox.Checked;
if (_settings.AutoUpdateConfig)
{
_settings.CreatePubMirrorFile = true;
}
_settings.Save();
}
private void userJsonOnGameInstall_CheckedChanged(object sender, EventArgs e)
{
_settings.UserJsonOnGameInstall = userJsonOnGameInstall.Checked;
_settings.Save();
}
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)
{
_settings.NodeviceMode = nodevicemodeBox.Checked;
if (!nodevicemodeBox.Checked)
{
deleteAfterInstallCheckBox.Checked = true;
_settings.DeleteAllAfterInstall = true;
deleteAfterInstallCheckBox.Enabled = true;
}
else
{
deleteAfterInstallCheckBox.Checked = false;
_settings.DeleteAllAfterInstall = false;
deleteAfterInstallCheckBox.Enabled = false;
}
_settings.Save();
}
private void bmbfBox_CheckedChanged(object sender, EventArgs e)
{
_settings.BMBFChecked = bmbfBox.Checked;
_settings.Save();
}
private void AutoReinstBox_CheckedChanged(object sender, EventArgs e)
{
_settings.AutoReinstall = AutoReinstBox.Checked;
_settings.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 trailersOn_CheckedChanged(object sender, EventArgs e)
{
_settings.TrailersOn = trailersOn.Checked;
_settings.Save();
}
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)
{
_settings.CustomDownloadDir = true;
_settings.DownloadDir = downloadDirectorySetter.SelectedPath;
_settings.Save();
}
}
private void setBackupDirectory_Click(object sender, EventArgs e)
{
if (backupDirectorySetter.ShowDialog() == DialogResult.OK)
{
_settings.CustomBackupDir = true;
_settings.BackupDir = backupDirectorySetter.SelectedPath;
MainForm.backupFolder = _settings.BackupDir;
_settings.Save();
}
}
private void chkSingleThread_CheckedChanged(object sender, EventArgs e)
{
_settings.SingleThreadMode = chkSingleThread.Checked;
_settings.Save();
}
private void virtualFilesystemCompatibilityCheckbox_CheckedChanged(object sender, EventArgs e)
{
_settings.VirtualFilesystemCompatibility = virtualFilesystemCompatibilityCheckbox.Checked;
_settings.Save();
}
private void openDownloadDirectory_Click(object sender, EventArgs e)
{
string pathToOpen = _settings.CustomDownloadDir ? _settings.DownloadDir : Environment.CurrentDirectory;
MainForm.OpenDirectory(pathToOpen);
}
private void openBackupDirectory_Click(object sender, EventArgs e)
{
string pathToOpen = _settings.CustomBackupDir
? Path.Combine(_settings.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;
}
}
private void hideAdultContentCheckBox_CheckedChanged(object sender, EventArgs e)
{
_settings.HideAdultContent = hideAdultContentCheckBox.Checked;
_settings.Save();
}
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,298 +1,297 @@
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 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);
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";
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); }
}
public static string BackupFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
//uninstalls an app
public static ProcessOutput UninstallGame(string packagename)
{
ADB.WakeDevice();
Program.form.ChangeTitle("Attempting to backup any savedata to Documents\\Rookie Backups...");
ProcessOutput output = new ProcessOutput("", "");
string date_str = DateTime.Today.ToString("yyyy.MM.dd");
string CurrBackups = Path.Combine(BackupFolder, date_str);
if (!Directory.Exists(CurrBackups))
Directory.CreateDirectory(CurrBackups);
ADB.RunAdbCommandToString($"pull \"/sdcard/Android/data/{packagename}\" \"{CurrBackups}\"");
output = ADB.UninstallPackage(packagename);
Program.form.ChangeTitle("");
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.Equals(game[SideloaderRCLONE.GameNameIndex]))
return game[SideloaderRCLONE.PackageNameIndex];
if (gameName.Equals(game[SideloaderRCLONE.ReleaseNameIndex]))
return game[SideloaderRCLONE.PackageNameIndex];
}
return gameName;
}
public static string PackageNametoGameName(string gameName)
{
foreach (string[] game in SideloaderRCLONE.games)
{
if (gameName.Equals(game[SideloaderRCLONE.PackageNameIndex]))
return game[SideloaderRCLONE.ReleaseNameIndex];
}
return gameName;
}
public static string gameNameToSimpleName(string gameName)
{
foreach (string[] game in SideloaderRCLONE.games)
{
if (gameName.Equals(game[SideloaderRCLONE.GameNameIndex]))
return game[SideloaderRCLONE.GameNameIndex];
if (gameName.Equals(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 (!File.Exists("C:\\RSL\\platform-tools\\aug2021.txt") || !File.Exists("C:\\RSL\\platform-tools\\adb.exe")) //if adb is not updated, download and auto extract
{
if (Directory.Exists($"C:\\RSL\\2.8.2"))
Directory.Delete("C:\\RSL\\2.8.2", true);
if (Directory.Exists($"{Properties.Settings.Default.MainDir}\\adb"))
Directory.Delete($"{Properties.Settings.Default.MainDir}\\adb", true);
if (!Directory.Exists("C:\\RSL\\platform-tools"))
Directory.CreateDirectory("C:\\RSL\\platform-tools");
client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/adb2.zip", "Ad.7z");
Utilities.Zip.ExtractFile(Environment.CurrentDirectory + "\\Ad.7z", "C:\\RSL\\platform-tools");
File.Delete("Ad.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;
using AndroidSideloader.Utilities;
namespace AndroidSideloader
{
internal class Sideloader
{
private static readonly SettingsManager settings = SettingsManager.Instance;
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
? $"{settings.ADBPath} -s {ADB.DeviceID}"
: $"{settings.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 (!settings.CustomBackupDir)
{
MainForm.backupFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
}
else
{
MainForm.backupFolder = Path.Combine((settings.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($"{settings.ADBFolder}\\base.apk"))
{
File.Delete($"{settings.ADBFolder}\\base.apk");
}
if (File.Exists($"{settings.MainDir}\\{packageName}\\{packageName}.apk"))
{
File.Delete($"{settings.MainDir}\\{packageName}\\{packageName}.apk");
}
output += ADB.RunAdbCommandToString("pull " + apkPath); //pull apk
if (Directory.Exists($"{settings.MainDir}\\{packageName}"))
{
Directory.Delete($"{settings.MainDir}\\{packageName}", true);
}
_ = Directory.CreateDirectory($"{settings.MainDir}\\{packageName}");
File.Move($"{settings.ADBFolder}\\base.apk", $"{settings.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;
}
}
}

View File

@@ -0,0 +1,246 @@
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.68.2";
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)
{
// Preserve vrp.download.config if it exists
string configPath = Path.Combine(dirRclone, "vrp.download.config");
string tempConfigPath = Path.Combine(Environment.CurrentDirectory, "vrp.download.config.bak");
bool hasConfig = false;
if (File.Exists(configPath))
{
_ = Logger.Log("Preserving vrp.download.config before update");
File.Copy(configPath, tempConfigPath, true);
hasConfig = 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);
// Restore vrp.download.config if it was backed up
if (hasConfig && File.Exists(tempConfigPath))
{
_ = Logger.Log("Restoring vrp.download.config after update");
File.Move(tempConfigPath, configPath);
}
_ = Logger.Log($"rclone download successful");
}
return true;
}
catch (Exception ex)
{
_ = Logger.Log($"Unable to download rclone: {ex}", LogLevel.ERROR);
return false;
}
}
}
}

View File

@@ -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
{

View File

@@ -1,22 +1,23 @@
using System;
using AndroidSideloader.Utilities;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Net;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
namespace AndroidSideloader
{
class rcloneFolder
internal class rcloneFolder
{
public string Path { get; set; }
public string Name { get; set; }
public string Size { get; set; }
public string ModTime { get; set; }
}
class SideloaderRCLONE
internal class SideloaderRCLONE
{
public static List<string> RemotesList = new List<string>();
@@ -30,6 +31,7 @@ namespace AndroidSideloader
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
@@ -41,43 +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)
{
Logger.Log($"Updating Nouns");
RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/nouns\" \"{Nouns}\" --http-no-head --transfers 2 --multi-thread-streams 1");
_ = Logger.Log($"Updating Nouns");
_ = RCLONE.runRcloneCommand_DownloadConfig($"sync \"{remote}:{RcloneGamesFolder}/.meta/nouns\" \"{Nouns}\"");
}
public static void UpdateGamePhotos(string remote)
{
Logger.Log($"Updating Thumbnails");
RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/thumbnails\" \"{ThumbnailsFolder}\" --http-no-head --transfers 2 --multi-thread-streams 1");
_ = 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($"sync \"{remote}:{RcloneGamesFolder}/.meta/notes\" \"{NotesFolder}\" --http-no-head --transfers 2 --multi-thread-streams 1");
_ = Logger.Log($"Updating Game Notes");
_ = RCLONE.runRcloneCommand_DownloadConfig($"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");
_ = 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);
}
}
@@ -86,11 +148,11 @@ namespace AndroidSideloader
public static void initGames(string remote)
{
Logger.Log($"Initializing Games List");
_ = Logger.Log($"Initializing Games List");
gameProperties.Clear();
games.Clear();
string tempGameList = RCLONE.runRcloneCommand($"cat \"{remote}:{RcloneGamesFolder}/VRP-GameList.txt\"").Output;
string tempGameList = RCLONE.runRcloneCommand_DownloadConfig($"cat \"{remote}:{RcloneGamesFolder}/VRP-GameList.txt\"").Output;
if (MainForm.debugMode)
{
File.WriteAllText("VRP-GamesList.txt", tempGameList);
@@ -108,68 +170,116 @@ namespace AndroidSideloader
}
}
}
}
public static void updateConfig(string remote)
public static void updateDownloadConfig()
{
Logger.Log($"Attempting to Update Config");
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
_ = Logger.Log($"Attempting to Update Download Config");
string downloadConfigFilename = "vrp.download.config";
try
{
string configUrl = "https://wiki.vrpirates.club/downloads/vrp.download.config";
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($"Retrived updated config from: {configUrl}");
_ = Logger.Log($"Retrieved updated config from: {configUrl}");
if (File.Exists(Environment.CurrentDirectory + "\\rclone\\vrp.download.config_new"))
File.Delete(Environment.CurrentDirectory + "\\rclone\\vrp.download.config_new");
File.Create(Environment.CurrentDirectory + "\\rclone\\vrp.download.config_new").Close();
File.WriteAllText(Environment.CurrentDirectory + "\\rclone\\vrp.download.config_new", resultString);
if (File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new")))
{
File.Delete(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new"));
}
if (!File.Exists(Environment.CurrentDirectory + "\\rclone\\hash.txt"))
File.Create(Environment.CurrentDirectory + "\\rclone\\hash.txt").Close();
File.Create(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new")).Close();
File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new"), resultString);
string newConfig = CalculateMD5(Environment.CurrentDirectory + "\\rclone\\vrp.download.config_new");
string oldConfig = File.ReadAllText(Environment.CurrentDirectory + "\\rclone\\hash.txt");
if (!File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", "hash.txt")))
{
File.Create(Path.Combine(Environment.CurrentDirectory, "rclone", "hash.txt")).Close();
}
if (!File.Exists(Environment.CurrentDirectory + "\\rclone\\vrp.download.config"))
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}");
_ = 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.");
_ = Logger.Log($"Updated Config Hash is different than the current Config. Updating Configuration File.");
if (File.Exists(Environment.CurrentDirectory + "\\rclone\\vrp.download.config"))
File.Delete(Environment.CurrentDirectory + "\\rclone\\vrp.download.config");
File.Move(Environment.CurrentDirectory + "\\rclone\\vrp.download.config_new", Environment.CurrentDirectory + "\\rclone\\vrp.download.config");
if (File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}")))
{
File.Delete(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}"));
}
File.WriteAllText(Environment.CurrentDirectory + "\\rclone\\hash.txt", string.Empty);
File.WriteAllText(Environment.CurrentDirectory + "\\rclone\\hash.txt", newConfig);
} else
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.");
_ = Logger.Log($"Updated Config Hash matches last download. Not updating.");
if (File.Exists(Environment.CurrentDirectory + "\\rclone\\vrp.download.config_new"))
File.Delete(Environment.CurrentDirectory + "\\rclone\\vrp.download.config_new");
if (File.Exists(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}_new")))
{
File.Delete(Path.Combine(Environment.CurrentDirectory, "rclone", $"{downloadConfigFilename}g_new"));
}
}
}
}
catch { }
}
static string CalculateMD5(string filename)
public static void updateUploadConfig()
{
using (var md5 = MD5.Create())
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
_ = Logger.Log($"Attempting to Update Upload Config");
try
{
using (var stream = File.OpenRead(filename))
string configUrl = "https://vrpirates.wiki/downloads/vrp.upload.config";
HttpWebRequest getUrl = (HttpWebRequest)WebRequest.Create(configUrl);
using (StreamReader responseReader = new StreamReader(getUrl.GetResponse().GetResponseStream()))
{
var hash = md5.ComputeHash(stream);
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();
}
}

View File

@@ -1,4 +1,5 @@
using System;
using AndroidSideloader.Utilities;
using System;
using System.IO;
using System.Management;
using System.Security.Cryptography;
@@ -6,57 +7,45 @@ using System.Text;
namespace AndroidSideloader
{
class SideloaderUtilities
internal class SideloaderUtilities
{
private static readonly SettingsManager settings = SettingsManager.Instance;
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 = settings.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"]);
}
settings.UUID = uuid;
settings.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
View 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
View 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

File diff suppressed because it is too large Load Diff

118
SpoofForm.Designer.cs generated
View File

@@ -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;
}
}

View File

@@ -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();
}
}
}

View File

@@ -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
View File

@@ -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;
}
}

View File

@@ -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;
}
}
}

View File

@@ -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
View 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();
}
}
}

172
UpdateForm.Designer.cs generated
View File

@@ -29,83 +29,69 @@ namespace AndroidSideloader
/// </summary>
private void InitializeComponent()
{
this.SkipUpdate = new System.Windows.Forms.Label();
this.CurVerLabel = new System.Windows.Forms.Label();
this.YesUpdate = new System.Windows.Forms.Button();
this.UpdateVerLabel = new System.Windows.Forms.Label();
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.panel1 = new System.Windows.Forms.Panel();
this.panel3.SuspendLayout();
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();
//
// SkipUpdate
//
this.SkipUpdate.AutoSize = true;
this.SkipUpdate.BackColor = System.Drawing.Color.Transparent;
this.SkipUpdate.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
this.SkipUpdate.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100)))));
this.SkipUpdate.Location = new System.Drawing.Point(386, 279);
this.SkipUpdate.Name = "SkipUpdate";
this.SkipUpdate.Size = new System.Drawing.Size(64, 13);
this.SkipUpdate.TabIndex = 4;
this.SkipUpdate.Text = "skip for now";
this.SkipUpdate.Click += new System.EventHandler(this.SkipUpdate_Click);
//
// 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:";
//
//
// 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.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
this.YesUpdate.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.YesUpdate.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.YesUpdate.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.YesUpdate.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.YesUpdate.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.YesUpdate.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
//
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.TabIndex = 0;
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.UseVisualStyleBackColor = false;
this.YesUpdate.Transparency = false;
this.YesUpdate.Click += new System.EventHandler(this.YesUpdate_Click);
//
// 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:";
//
//
// panel3
//
//
this.panel3.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
this.panel3.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
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));
@@ -123,26 +109,47 @@ namespace AndroidSideloader
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);
//
// panel1
//
this.panel1.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
this.panel1.Controls.Add(this.panel3);
this.panel1.Controls.Add(this.UpdateVerLabel);
this.panel1.Controls.Add(this.YesUpdate);
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);
//
//
// 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;
@@ -151,26 +158,27 @@ namespace AndroidSideloader
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.panel3.ResumeLayout(false);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.panel3.ResumeLayout(false);
this.ResumeLayout(false);
this.Activate();
}
#endregion
private System.Windows.Forms.Label SkipUpdate;
private System.Windows.Forms.Label CurVerLabel;
private System.Windows.Forms.Button YesUpdate;
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;
}
}
}

View File

@@ -1,11 +1,5 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AndroidSideloader
@@ -18,7 +12,7 @@ namespace AndroidSideloader
public UpdateForm()
{
InitializeComponent();
this.CenterToScreen();
CenterToScreen();
CurVerLabel.Text += " " + Updater.LocalVersion;
UpdateVerLabel.Text += " " + Updater.currentVersion;
UpdateTextBox.Text = Updater.changelog;
@@ -27,12 +21,12 @@ namespace AndroidSideloader
private void YesUpdate_Click(object sender, EventArgs e)
{
Updater.doUpdate();
this.Close();
Close();
}
private void SkipUpdate_Click(object sender, EventArgs e)
{
this.Close();
Close();
}
private void UpdateTextBox_TextChanged(object sender, EventArgs e)
@@ -50,10 +44,10 @@ namespace AndroidSideloader
{
if (mouseDown)
{
this.Location = new Point(
(this.Location.X - lastLocation.X) + e.X, (this.Location.Y - lastLocation.Y) + e.Y);
Location = new Point(
Location.X - lastLocation.X + e.X, Location.Y - lastLocation.Y + e.Y);
this.Update();
Update();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,73 +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.12";
public static readonly string LocalVersion = "2.31.2";
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();
currentVersion = currentVersion.Trim();
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.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())
if (await IsUpdateAvailableAsync())
{
UpdateForm upForm = new UpdateForm();
upForm.ShowDialog(); ;
_ = upForm.ShowDialog();
}
}
//If the user wants to update
// If the user wants to update
public static void doUpdate()
{
try
{
ADB.RunAdbCommandToString("kill-server");
var 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");
fileClient.Dispose();
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
View File

@@ -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;
}
}

View File

@@ -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);
}

File diff suppressed because it is too large Load Diff

View File

@@ -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") || !File.Exists(Environment.CurrentDirectory + "\\7z.dll"))
{
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();
}
}
}

View File

@@ -1,26 +1,109 @@
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 AndroidSideloader.Utilities;
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 SettingsManager settings = SettingsManager.Instance;
private static readonly object lockObject = new object();
private static string logFilePath = settings.CurrentLogPath;
public static void Initialize()
{
try
{
// Set default log path if not already set
if (string.IsNullOrEmpty(logFilePath))
{
logFilePath = Path.Combine(Environment.CurrentDirectory, "debuglog.txt");
}
// Create directory if it doesn't exist
string logDirectory = Path.GetDirectoryName(logFilePath);
if (!string.IsNullOrEmpty(logDirectory) && !Directory.Exists(logDirectory))
{
Directory.CreateDirectory(logDirectory);
}
// Create log file if it doesn't exist
if (!File.Exists(logFilePath))
{
using (FileStream fs = File.Create(logFilePath))
{
// Create empty file
}
}
// Update settings with log path
settings.CurrentLogPath = logFilePath;
settings.Save();
// Initial log entry
Log($"Logger initialized at: {DateTime.Now:hh:mmtt(UTC)}", LogLevel.INFO);
}
catch (Exception ex)
{
Console.WriteLine($"Error initializing logger: {ex.Message}");
}
}
public static bool Log(string text, LogLevel logLevel = LogLevel.INFO, bool ret = true)
{
if (string.IsNullOrWhiteSpace(text) || text.Length <= 5)
return ret;
// Initialize logger if not already initialized
if (string.IsNullOrEmpty(logFilePath))
{
Initialize();
}
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 (Exception ex)
{
Console.WriteLine($"Error writing to log: {ex.Message}");
}
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
View 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;
}
}
}
}

View File

@@ -0,0 +1,267 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
namespace AndroidSideloader.Utilities
{
public class SettingsManager : IDisposable
{
private static readonly Lazy<SettingsManager> _instance = new Lazy<SettingsManager>(() => new SettingsManager());
private static readonly string settingsFilePath = Path.Combine(
AppDomain.CurrentDomain.BaseDirectory,
"settings.json");
// Custom converters for special types
public class FontConverter : JsonConverter<Font>
{
public override Font ReadJson(JsonReader reader, Type objectType, Font existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var jo = JObject.Load(reader);
string fontFamily = jo["FontFamily"]?.Value<string>() ?? "Microsoft Sans Serif";
float fontSize = jo["Size"]?.Value<float>() ?? 11.25f;
return new Font(fontFamily, fontSize);
}
public override void WriteJson(JsonWriter writer, Font value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("FontFamily");
writer.WriteValue(value.FontFamily.Name);
writer.WritePropertyName("Size");
writer.WriteValue(value.Size);
writer.WriteEndObject();
}
}
public class ColorConverter : JsonConverter<Color>
{
public override Color ReadJson(JsonReader reader, Type objectType, Color existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var jo = JObject.Load(reader);
int a = jo["A"]?.Value<int>() ?? 255;
int r = jo["R"]?.Value<int>() ?? 0;
int g = jo["G"]?.Value<int>() ?? 0;
int b = jo["B"]?.Value<int>() ?? 0;
return Color.FromArgb(a, r, g, b);
}
public override void WriteJson(JsonWriter writer, Color value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("A");
writer.WriteValue(value.A);
writer.WritePropertyName("R");
writer.WriteValue(value.R);
writer.WritePropertyName("G");
writer.WriteValue(value.G);
writer.WritePropertyName("B");
writer.WriteValue(value.B);
writer.WriteEndObject();
}
}
[JsonConverter(typeof(FontConverter))]
public Font FontStyle { get; set; } = new Font("Microsoft Sans Serif", 11.25f);
[JsonConverter(typeof(FontConverter))]
public Font BigFontStyle { get; set; } = new Font("Microsoft Sans Serif", 14f);
[JsonConverter(typeof(ColorConverter))]
public Color FontColor { get; set; } = Color.White;
[JsonConverter(typeof(ColorConverter))]
public Color ComboBoxColor { get; set; } = Color.FromArgb(25, 25, 25);
[JsonConverter(typeof(ColorConverter))]
public Color SubButtonColor { get; set; } = Color.FromArgb(25, 25, 25);
[JsonConverter(typeof(ColorConverter))]
public Color TextBoxColor { get; set; } = Color.FromArgb(25, 25, 25);
[JsonConverter(typeof(ColorConverter))]
public Color ButtonColor { get; set; } = Color.Black;
[JsonConverter(typeof(ColorConverter))]
public Color BackColor { get; set; } = Color.FromArgb(1, 1, 1);
public bool CheckForUpdates { get; set; } = true;
public bool EnableMessageBoxes { get; set; } = true;
public bool FirstRun { get; set; } = true;
public bool DeleteAllAfterInstall { get; set; } = true;
public bool AutoUpdateConfig { get; set; } = true;
public bool UserJsonOnGameInstall { get; set; } = false;
public bool CallUpgrade { get; set; } = true;
public string BackPicturePath { get; set; } = string.Empty;
public bool SpoofGames { get; set; } = false;
public bool ResignAPKs { get; set; } = false;
public string IPAddress { get; set; } = string.Empty;
public string InstalledApps { get; set; } = string.Empty;
public string ADBPath { get; set; } = string.Empty;
public string MainDir { get; set; } = string.Empty;
public bool Delsh { get; set; } = false;
public string CurrPckg { get; set; } = string.Empty;
public string ADBFolder { get; set; } = string.Empty;
public bool WirelessADB { get; set; } = false;
public string CurrentGamename { get; set; } = string.Empty;
public bool PackageNameToCB { get; set; } = false;
public bool DownUpHeld { get; set; } = false;
public string CurrentLogPath { get; set; } = string.Empty;
public string CurrentLogName { get; set; } = string.Empty;
public string CurrentCrashPath { get; set; } = string.Empty;
public string CurrentCrashName { get; set; } = string.Empty;
public bool AdbDebugWarned { get; set; } = false;
public bool NodeviceMode { get; set; } = false;
public bool BMBFChecked { get; set; } = true;
public string GamesList { get; set; } = string.Empty;
public bool UploadedGameList { get; set; } = false;
public string GlobalUsername { get; set; } = string.Empty;
public DateTime LastTimeShared { get; set; } = new DateTime(1969, 4, 20, 16, 20, 0);
public bool AutoReinstall { get; set; } = false;
public string NonAppPackages { get; set; } = string.Empty;
public DateTime LastLaunch { get; set; } = new DateTime(1969, 4, 20, 16, 20, 0);
public string SubmittedUpdates { get; set; } = string.Empty;
public bool ListUpped { get; set; } = false;
public DateTime LastLaunch2 { get; set; } = new DateTime(1969, 4, 20, 16, 20, 0);
public bool Wired { get; set; } = false;
public string AppPackages { get; set; } = string.Empty;
public bool TrailersOn { get; set; } = false;
public string DownloadDir { get; set; } = string.Empty;
public bool CustomDownloadDir { get; set; } = false;
public bool CustomBackupDir { get; set; } = false;
public string BackupDir { get; set; } = string.Empty;
public bool SingleThreadMode { get; set; } = true;
public bool VirtualFilesystemCompatibility { get; set; } = false;
public bool UpdateSettings { get; set; } = true;
public string UUID { get; set; } = Guid.NewGuid().ToString();
public bool CreatePubMirrorFile { get; set; } = true;
public bool UseDownloadedFiles { get; set; } = false;
public float BandwidthLimit { get; set; } = 0f;
public bool HideAdultContent { get; set; } = false;
private SettingsManager()
{
Load();
Save();
}
public static SettingsManager Instance => _instance.Value;
public void Save()
{
try
{
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
var json = JsonConvert.SerializeObject(this, settings);
File.WriteAllText(settingsFilePath, json);
}
catch (Exception ex)
{
Console.WriteLine($"Error saving settings: {ex.Message}");
}
}
private void Load()
{
Debug.WriteLine("Loading settings...");
if (!File.Exists(settingsFilePath))
{
CreateDefaultSettings();
return;
}
try
{
var json = File.ReadAllText(settingsFilePath);
var settings = new JsonSerializerSettings
{
Error = (sender, args) =>
{
Debug.WriteLine($"Error deserializing setting: {args.ErrorContext.Error.Message}");
args.ErrorContext.Handled = true;
}
};
JsonConvert.PopulateObject(json, this, settings);
}
catch (Exception ex)
{
Debug.WriteLine($"Error loading settings: {ex.Message}");
CreateDefaultSettings();
}
}
private void CreateDefaultSettings()
{
FontStyle = new Font("Microsoft Sans Serif", 11.25f);
BigFontStyle = new Font("Microsoft Sans Serif", 14f);
FontColor = Color.White;
ComboBoxColor = Color.FromArgb(25, 25, 25);
SubButtonColor = Color.FromArgb(25, 25, 25);
TextBoxColor = Color.FromArgb(25, 25, 25);
ButtonColor = Color.Black;
BackColor = Color.FromArgb(1, 1, 1);
CheckForUpdates = true;
EnableMessageBoxes = true;
FirstRun = true;
DeleteAllAfterInstall = true;
AutoUpdateConfig = true;
UserJsonOnGameInstall = false;
CallUpgrade = true;
BackPicturePath = string.Empty;
SpoofGames = false;
ResignAPKs = false;
IPAddress = string.Empty;
InstalledApps = string.Empty;
ADBPath = string.Empty;
MainDir = string.Empty;
Delsh = false;
CurrPckg = string.Empty;
ADBFolder = string.Empty;
WirelessADB = false;
CurrentGamename = string.Empty;
PackageNameToCB = false;
DownUpHeld = false;
CurrentLogPath = string.Empty;
CurrentLogName = string.Empty;
CurrentCrashPath = string.Empty;
CurrentCrashName = string.Empty;
AdbDebugWarned = false;
NodeviceMode = false;
BMBFChecked = true;
GamesList = string.Empty;
UploadedGameList = false;
GlobalUsername = string.Empty;
LastTimeShared = new DateTime(1969, 4, 20, 16, 20, 0);
AutoReinstall = false;
NonAppPackages = string.Empty;
LastLaunch = new DateTime(1969, 4, 20, 16, 20, 0);
SubmittedUpdates = string.Empty;
ListUpped = false;
LastLaunch2 = new DateTime(1969, 4, 20, 16, 20, 0);
Wired = false;
AppPackages = string.Empty;
TrailersOn = false;
DownloadDir = string.Empty;
CustomDownloadDir = false;
CustomBackupDir = false;
BackupDir = string.Empty;
SingleThreadMode = true;
VirtualFilesystemCompatibility = false;
UpdateSettings = true;
UUID = Guid.NewGuid().ToString();
CreatePubMirrorFile = true;
UseDownloadedFiles = false;
BandwidthLimit = 0f;
HideAdultContent = false;
Save();
Debug.WriteLine("Default settings created.");
}
public void Dispose()
{
FontStyle?.Dispose();
BigFontStyle?.Dispose();
}
}
}

View File

@@ -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;
}
}

View File

@@ -1,18 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AndroidSideloader.Utilities
namespace AndroidSideloader.Utilities
{
class UpdateGameData
internal class UpdateGameData
{
public UpdateGameData(String gameName, String packageName, ulong installedVersionInt)
public UpdateGameData(string gameName, string packageName, ulong installedVersionInt)
{
this.GameName = gameName;
this.Packagename = packageName;
this.InstalledVersionInt = installedVersionInt;
GameName = gameName;
Packagename = packageName;
InstalledVersionInt = installedVersionInt;
}
public string GameName { get; set; }
public string Packagename { get; set; }

View File

@@ -1,16 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AndroidSideloader.Utilities
namespace AndroidSideloader.Utilities
{
class UploadGame
internal class UploadGame
{
public UploadGame(string Uploadcommand, string Pckgcommand, string Uploadgamename, ulong Uploadversion, bool isUpdate)
{
this.Uploadcommand = Uploadcommand;
this.Pckgcommand = Pckgcommand;
this.Uploadgamename = Uploadgamename;
this.Uploadversion = Uploadversion;
@@ -18,14 +11,12 @@ namespace AndroidSideloader.Utilities
}
public UploadGame()
{
}
public bool isUpdate { get; set; }
public string Uploadcommand { get; set; }
public string Pckgcommand { get; set; }
public string Uploadgamename { get; set; }
public ulong Uploadversion { get; set; }

134
Utilities/Zip.cs Normal file
View File

@@ -0,0 +1,134 @@
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
{
private static readonly SettingsManager settings = SettingsManager.Instance;
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(settings.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);
}
}
}
}
}

BIN
aapt.exe

Binary file not shown.

BIN
adb.7z

Binary file not shown.

BIN
adb2.zip

Binary file not shown.

Binary file not shown.

22
build.cmd Normal file
View File

@@ -0,0 +1,22 @@
@echo off
REM Default to Release if no argument is provided
SET CONFIG=Release
IF NOT "%1"=="" (
IF /I "%1"=="debug" SET CONFIG=Debug
)
REM Windows Batch script version
REM Attempts to find MSBuild from common Visual Studio 2022 installation paths
IF EXIST "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" (
SET MSBUILD="C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"
) ELSE IF EXIST "C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe" (
SET MSBUILD="C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe"
) ELSE IF EXIST "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe" (
SET MSBUILD="C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe"
) ELSE (
echo MSBuild not found! Please check your Visual Studio installation.
exit /b 1
)
echo Building in %CONFIG% configuration...
%MSBUILD% AndroidSideloader.sln /t:AndroidSideloader /p:Configuration=%CONFIG%

View File

@@ -1,11 +1,19 @@
RSL 2.12
RSL 2.31
- fixed issue with configuration always updating
- fixed github version vs app version comparison
- fixed github download url
- restored "auto update config" checkbox
- fixed tooltips; added additional tooltips to all menu items
- gui fixes and updates to game donation menu
- additional logging and on-screen notifications
- Feature: Preserve download.config during rclone update
- Feature: Added toggle to hide Adult Content
- Fix: Changed settings configuration to settings.json
- Fix: Always create debuglog on first-launch
- Fix: Fixed numeric sorting
- Fix: Wrap ADB commands to prevent crash
- Fix: Update CleanupInstall to use UserProfile instead of Username
- Fix: Fix to OBB pushing when Dragging and Dropping
- Fix: Do not show ShowPrcOutput messages when "Enable Message Boxes" is disabled
- Fix: Add safeguard to prevent deletion of current directory
- Fix: Case insensitive package matching
- Chore: Add build batch
- Chore: Bump rclone to 1.68.2 (from 1.67.0)
~fenopy
RSL 2.31.1
- Fix: Filtering when Adult Content is shown

6
codenames Normal file
View File

@@ -0,0 +1,6 @@
monterey
hollywood
seacliff
eureka
panther
quest

Some files were not shown because too many files have changed in this diff Show More