Compare commits

...

238 Commits

Author SHA1 Message Date
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
85 changed files with 53861 additions and 3604 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/

BIN
7z.dll

Binary file not shown.

BIN
7z.exe

Binary file not shown.

239
ADB.cs
View File

@@ -9,7 +9,7 @@ namespace AndroidSideloader
internal class ADB
{
private static readonly Process adb = new Process();
public static string adbFolderPath = "C:\\RSL\\platform-tools";
public static string adbFolderPath = $"{Path.GetPathRoot(Environment.SystemDirectory)}RSL\\platform-tools";
public static string adbFilePath = adbFolderPath + "\\adb.exe";
public static string DeviceID = "";
public static string package = "";
@@ -24,7 +24,6 @@ namespace AndroidSideloader
}
if (!command.Contains("dumpsys") && !command.Contains("shell pm list packages") && !command.Contains("KEYCODE_WAKEUP"))
{
string logcmd = command;
if (logcmd.Contains(Environment.CurrentDirectory))
@@ -34,66 +33,56 @@ namespace AndroidSideloader
_ = 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 = "";
using (Process adb = new Process())
{
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();
try
{
output = adb.StandardOutput.ReadToEnd();
error = adb.StandardError.ReadToEnd();
}
catch { }
if (command.Contains("connect"))
{
bool graceful = adb.WaitForExit(3000); //Wait 3 secs.
if (!graceful)
string output = "";
string error = "";
try
{
adb.Kill();
output = adb.StandardOutput.ReadToEnd();
error = adb.StandardError.ReadToEnd();
}
}
else
{
adb.WaitForExit();
}
catch { }
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)
if (command.Contains("connect"))
{
Properties.Settings.Default.adbdebugwarned = true;
Properties.Settings.Default.Save();
bool graceful = adb.WaitForExit(3000);
if (!graceful)
{
adb.Kill();
adb.WaitForExit();
}
}
else
{
ADB.WakeDevice();
}
}
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);
if (error.Contains("ADB_VENDOR_KEYS") && !Properties.Settings.Default.adbdebugwarned)
{
ADBDebugWarning();
}
if (error.Contains("not enough storage space"))
{
_ = FlexibleMessageBox.Show(Program.form, "There is not enough room on your device to install this package. Please clear AT LEAST 2x the amount of the app you are trying to install.");
}
if (!output.Contains("version") && !output.Contains("KEYCODE_WAKEUP") && !output.Contains("Filesystem") && !output.Contains("package:") && !output.Equals(null))
{
_ = Logger.Log(output);
}
_ = Logger.Log(error, LogLevel.ERROR);
return new ProcessOutput(output, error);
}
}
public static ProcessOutput RunAdbCommandToStringWOADB(string result, string path)
{
string command = result;
@@ -133,40 +122,24 @@ namespace AndroidSideloader
if (!graceful)
{
adb.Kill();
}
else
{
adb.WaitForExit();
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.Kill();
adb.WaitForExit();
}
}
if (error.Contains("ADB_VENDOR_KEYS") && Properties.Settings.Default.adbdebugwarned)
{
DialogResult dialogResult = FlexibleMessageBox.Show("Please check inside your headset for ADB DEBUGGING prompt, check box to \"Always allow from this computer.\" and hit OK.\nPlease note that even if you have done this\nbefore it will reset itself from time to time.\n\nPress CANCEL if you want to disable this prompt (FOR DEBUGGING ONLY, NOT RECOMMENDED).", "ADB Debugging not enabled.", MessageBoxButtons.OKCancel);
if (dialogResult == DialogResult.Cancel)
{
Properties.Settings.Default.adbdebugwarned = true;
Properties.Settings.Default.Save();
}
else
{
ADB.WakeDevice();
}
ADBDebugWarning();
}
_ = Logger.Log(output);
_ = Logger.Log(error);
_ = Logger.Log(error, LogLevel.ERROR);
return new ProcessOutput(output, error);
}
public static ProcessOutput RunCommandToString(string result, string path = "")
@@ -179,7 +152,7 @@ namespace AndroidSideloader
}
_ = Logger.Log($"Running command: {logcmd}");
adb.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
adb.StartInfo.FileName = $@"{Path.GetPathRoot(Environment.SystemDirectory)}\Windows\System32\cmd.exe";
adb.StartInfo.Arguments = command;
adb.StartInfo.RedirectStandardError = true;
adb.StartInfo.RedirectStandardInput = true;
@@ -208,35 +181,34 @@ namespace AndroidSideloader
if (!graceful)
{
adb.Kill();
adb.WaitForExit();
}
}
else
{
adb.WaitForExit();
}
if (error.Contains("ADB_VENDOR_KEYS") && Properties.Settings.Default.adbdebugwarned)
{
DialogResult dialogResult = FlexibleMessageBox.Show("Please check inside your headset for ADB DEBUGGING prompt, check box to \"Always allow from this computer.\" and hit OK.\nPlease note that even if you have done this\nbefore it will reset itself from time to time.\n\nPress CANCEL if you want to disable this prompt (FOR DEBUGGING ONLY, NOT RECOMMENDED).", "ADB Debugging not enabled.", MessageBoxButtons.OKCancel);
ADBDebugWarning();
}
_ = Logger.Log(output);
_ = Logger.Log(error, LogLevel.ERROR);
return new ProcessOutput(output, error);
}
public static void ADBDebugWarning()
{
Program.form.Invoke(() =>
{
DialogResult dialogResult = FlexibleMessageBox.Show(Program.form, "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);
return new ProcessOutput(output, error);
});
}
public static ProcessOutput UninstallPackage(string package)
{
WakeDevice();
ProcessOutput output = new ProcessOutput("", "");
output += RunAdbCommandToString($"shell pm uninstall {package}");
return output;
@@ -245,41 +217,22 @@ namespace AndroidSideloader
public static string GetAvailableSpace()
{
long totalSize = 0;
long usedSize = 0;
long freeSize = 0;
WakeDevice();
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"))
{
string[] 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 = long.Parse(curr) / 1000;
break;
case 2:
usedSize = long.Parse(curr) / 1000;
break;
case 3:
freeSize = long.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
}
}
}
@@ -288,21 +241,9 @@ namespace AndroidSideloader
}
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;
@@ -312,34 +253,37 @@ namespace AndroidSideloader
_ = Logger.Log(out2);
if (out2.Contains("offline") && !Properties.Settings.Default.nodevicemode)
{
DialogResult dialogResult2 = FlexibleMessageBox.Show("Device is offline. Press Yes to reconnect, or if you don't wish to connect and just want to download the game (requires unchecking \"Delete games after install\" from settings menu) then press No.", "Device offline.", MessageBoxButtons.YesNoCancel);
if (dialogResult2 == DialogResult.Yes)
{
ADB.WakeDevice();
}
DialogResult dialogResult2 = FlexibleMessageBox.Show(Program.form, "Device is offline. Press Yes to reconnect, or if you don't wish to connect and just want to download the game (requires unchecking \"Delete games after install\" from settings menu) then press No.", "Device offline.", MessageBoxButtons.YesNoCancel);
}
if (out2.Contains($"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)
{
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 (!Properties.Settings.Default.AutoReinstall)
{
return ret;
Program.form.Invoke((MethodInvoker)(() =>
{
DialogResult dialogResult1 = FlexibleMessageBox.Show(Program.form, "In place upgrade has failed. Rookie can attempt to backup your save data and reinstall the game automatically, however some games do not store their saves in an accessible location (less than 5%). Continue with reinstall?", "In place upgrade failed.", MessageBoxButtons.OKCancel);
if (dialogResult1 == DialogResult.Cancel)
cancelClicked = true;
}));
}
if (cancelClicked)
return ret;
}
Program.form.ChangeTitle("Performing reinstall, please wait...");
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...");
Program.form.changeTitle("Uninstalling game...");
_ = Sideloader.UninstallGame(MainForm.CurrPCKG);
Program.form.ChangeTitle("Reinstalling Game");
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}"))
@@ -347,7 +291,7 @@ namespace AndroidSideloader
Directory.Delete($"{Environment.CurrentDirectory}\\{MainForm.CurrPCKG}", true);
}
Program.form.ChangeTitle(" \n\n");
Program.form.changeTitle(" \n\n");
return ret;
}
}
@@ -359,7 +303,7 @@ namespace AndroidSideloader
string gameName = packagename;
packagename = Sideloader.gameNameToPackageName(gameName);
Program.form.ChangeTitle("Pushing Custom QU S3 Config.JSON.");
Program.form.changeTitle("Pushing Custom QU S3 Config.JSON.");
if (!Directory.Exists($"/sdcard/android/data/{packagename}"))
{
_ = RunAdbCommandToString($"shell mkdir /sdcard/android/data/{packagename}");
@@ -380,7 +324,6 @@ namespace AndroidSideloader
int y2 = r.Next(9999999);
long sum2 = (y2 * (long)1000000000) + 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;
@@ -393,14 +336,12 @@ namespace AndroidSideloader
}
Program.form.ChangeTitle("");
Program.form.changeTitle(string.Empty);
return ret;
}
public static ProcessOutput CopyOBB(string path)
{
WakeDevice();
string folder = Path.GetFileName(path);
return !folder.Contains("+") && !folder.Contains("_") && folder.Contains(".")
? RunAdbCommandToString($"push \"{path}\" \"/sdcard/Android/obb\"")

BIN
Ad.7z

Binary file not shown.

View File

@@ -49,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>
@@ -139,13 +139,24 @@
<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>
<Reference Include="Microsoft.Web.WebView2.Core, Version=1.0.1072.54, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Web.WebView2.1.0.1072.54\lib\net45\Microsoft.Web.WebView2.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.WebView2.WinForms, Version=1.0.1072.54, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Web.WebView2.1.0.1072.54\lib\net45\Microsoft.Web.WebView2.WinForms.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.WebView2.Wpf, Version=1.0.1072.54, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Web.WebView2.1.0.1072.54\lib\net45\Microsoft.Web.WebView2.Wpf.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>
<Reference Include="SergeUtils">
<HintPath>.\SergeUtils.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System">
<HintPath>..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.DirectoryServices" />
<Reference Include="System.Management" />
@@ -154,7 +165,9 @@
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Drawing">
<HintPath>..\..\..\..\..\..\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" />
@@ -219,13 +232,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="Updater.cs" />
<Compile Include="UsernameForm.cs">
<SubType>Form</SubType>
@@ -275,9 +281,6 @@
<DependentUpon>SettingsForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="SpoofForm.resx">
<DependentUpon>SpoofForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UsernameForm.resx">
<DependentUpon>UsernameForm.cs</DependentUpon>
<SubType>Designer</SubType>
@@ -336,6 +339,7 @@
</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.1072.54\build\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Microsoft.Web.WebView2.1.0.1072.54\build\Microsoft.Web.WebView2.targets'))" />
</Target>
<PropertyGroup>
<PreBuildEvent>
@@ -345,4 +349,5 @@
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<Import Project="packages\Microsoft.Web.WebView2.1.0.1072.54\build\Microsoft.Web.WebView2.targets" Condition="Exists('packages\Microsoft.Web.WebView2.1.0.1072.54\build\Microsoft.Web.WebView2.targets')" />
</Project>

View File

@@ -36,14 +36,11 @@
<value>Microsoft Sans Serif, 11.25pt</value>
</setting>
<setting name="BackPicturePath" serializeAs="String">
<value/>
<value />
</setting>
<setting name="SpoofGames" serializeAs="String">
<value>False</value>
</setting>
<setting name="BandwidthLimit" serializeAs="String">
<value/>
</setting>
<setting name="BigFontStyle" serializeAs="String">
<value>Microsoft Sans Serif, 14pt</value>
</setting>
@@ -51,19 +48,19 @@
<value>False</value>
</setting>
<setting name="IPAddress" serializeAs="String">
<value/>
<value />
</setting>
<setting name="InstalledApps" serializeAs="String">
<value/>
<value />
</setting>
<setting name="ADBPath" serializeAs="String">
<value/>
<value />
</setting>
<setting name="QUsett" serializeAs="String">
<value>False</value>
</setting>
<setting name="QuChecked" serializeAs="String">
<value/>
<value />
</setting>
<setting name="QUhz" serializeAs="String">
<value>0</value>
@@ -81,28 +78,28 @@
<value>Change Me</value>
</setting>
<setting name="QUString" serializeAs="String">
<value/>
<value />
</setting>
<setting name="MainDir" serializeAs="String">
<value/>
<value />
</setting>
<setting name="QUStringF" serializeAs="String">
<value/>
<value />
</setting>
<setting name="delsh" serializeAs="String">
<value>False</value>
</setting>
<setting name="CurrPckg" serializeAs="String">
<value/>
<value />
</setting>
<setting name="ADBFolder" serializeAs="String">
<value/>
<value />
</setting>
<setting name="WirelessADB" serializeAs="String">
<value>False</value>
</setting>
<setting name="CurrentGamename" serializeAs="String">
<value/>
<value />
</setting>
<setting name="PackageNameToCB" serializeAs="String">
<value>False</value>
@@ -114,16 +111,16 @@
<value>False</value>
</setting>
<setting name="CurrentLogPath" serializeAs="String">
<value/>
<value />
</setting>
<setting name="CurrentLogName" serializeAs="String">
<value/>
<value />
</setting>
<setting name="CurrentCrashPath" serializeAs="String">
<value/>
<value />
</setting>
<setting name="CurrentCrashName" serializeAs="String">
<value/>
<value />
</setting>
<setting name="QUturnedon" serializeAs="String">
<value>False</value>
@@ -138,28 +135,28 @@
<value>True</value>
</setting>
<setting name="GamesList" serializeAs="String">
<value/>
<value />
</setting>
<setting name="UploadedGameList" serializeAs="String">
<value>False</value>
</setting>
<setting name="GlobalUsername" serializeAs="String">
<value/>
<value />
</setting>
<setting name="lastTimeShared" serializeAs="String">
<value/>
<value />
</setting>
<setting name="AutoReinstall" serializeAs="String">
<value>False</value>
</setting>
<setting name="NonAppPackages" serializeAs="String">
<value/>
<value />
</setting>
<setting name="LastLaunch" serializeAs="String">
<value>04/20/1969 16:20:00</value>
</setting>
<setting name="SubmittedUpdates" serializeAs="String">
<value/>
<value />
</setting>
<setting name="ListUpped" serializeAs="String">
<value>False</value>
@@ -174,22 +171,43 @@
<value>White</value>
</setting>
<setting name="ComboBoxColor" serializeAs="String">
<value>50, 50, 50</value>
<value>25, 25, 25</value>
</setting>
<setting name="SubButtonColor" serializeAs="String">
<value>40, 40, 40</value>
<value>25, 25, 25</value>
</setting>
<setting name="TextBoxColor" serializeAs="String">
<value>29, 29, 29</value>
<value>25, 25, 25</value>
</setting>
<setting name="ButtonColor" serializeAs="String">
<value>50, 50, 50</value>
<value>Black</value>
</setting>
<setting name="BackColor" serializeAs="String">
<value>50, 50, 50</value>
<value>1, 1, 1</value>
</setting>
<setting name="AppPackages" serializeAs="String">
<value/>
<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>False</value>
</setting>
<setting name="virtualFilesystemCompatibility" serializeAs="String">
<value>False</value>
</setting>
</AndroidSideloader.Properties.Settings>
<AndroidADB.Sideloader.Properties.Settings>

View File

@@ -1,4 +1,117 @@
RSL 2.16
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

View File

@@ -22,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,20 +30,21 @@ 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();
@@ -112,13 +113,13 @@ namespace AndroidSideloader
this.panel1.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
this.panel1.BackgroundImage = global::AndroidSideloader.Properties.Resources.pattern_cubes_1_1_1_0_0_0_1__000000_212121;
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";
@@ -130,21 +131,56 @@ namespace AndroidSideloader
//
// 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;
@@ -233,22 +269,6 @@ namespace AndroidSideloader
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.Enabled = false;
this.DonateButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.DonateButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
this.DonateButton.ForeColor = System.Drawing.Color.White;
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);
@@ -259,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);
@@ -276,18 +297,18 @@ namespace AndroidSideloader
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

@@ -28,14 +28,14 @@ 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;
@@ -106,26 +106,17 @@ namespace AndroidSideloader
if (ifuploads)
{
MainForm.DoUpload();
MainForm.doUpload();
}
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;

File diff suppressed because it is too large Load Diff

1704
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,6 +117,15 @@
<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>219, 17</value>
</metadata>
<metadata name="etaLabel_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>178, 56</value>
</metadata>
<metadata name="EnterInstallBox_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>514, 95</value>
</metadata>
<metadata name="startsideloadbutton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
@@ -171,13 +180,4 @@
<metadata name="listApkButton_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>376, 17</value>
</metadata>
<metadata name="speedLabel_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>219, 17</value>
</metadata>
<metadata name="etaLabel_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>178, 56</value>
</metadata>
<metadata name="EnterInstallBox_Tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>514, 95</value>
</metadata>
</root>

2
NewApps.Designer.cs generated
View File

@@ -29,6 +29,7 @@ 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()));
@@ -133,6 +134,7 @@ namespace AndroidSideloader
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);

View File

@@ -53,7 +53,7 @@ namespace AndroidSideloader
Properties.Settings.Default.Save();
}
}
MainForm.newpackageupload();
MainForm.newPackageUpload();
Close();
}

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,7 @@ namespace AndroidSideloader
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(CrashHandler);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
@@ -26,11 +26,20 @@ namespace AndroidSideloader
}
public static MainForm form;
private static void MyHandler(object sender, UnhandledExceptionEventArgs args)
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}\nData: {e.Data}\nSource: {e.Source}\nTargetSite: {e.TargetSite}");
File.WriteAllText(Sideloader.CrashLogPath, $"Date/Time of crash: {date_time}\nMessage: {e.Message}\nInner Message: {innerExceptionMessage}\nData: {e.Data}\nSource: {e.Source}\nTargetSite: {e.TargetSite}\nStack Trace: \n{e.StackTrace}\n\n\nDebuglog: \n\n\n");
// If a debuglog exists we append it to the crashlog.
if (File.Exists(Properties.Settings.Default.CurrentLogPath))
{
File.AppendAllText(Sideloader.CrashLogPath, File.ReadAllText($"{Properties.Settings.Default.CurrentLogPath}"));
}
}
}
}

View File

@@ -12,7 +12,7 @@ namespace AndroidSideloader.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -143,18 +143,6 @@ namespace AndroidSideloader.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string BandwidthLimit {
get {
return ((string)(this["BandwidthLimit"]));
}
set {
this["BandwidthLimit"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Microsoft Sans Serif, 14pt")]
@@ -741,5 +729,89 @@ namespace AndroidSideloader.Properties {
this["AppPackages"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool TrailersOn {
get {
return ((bool)(this["TrailersOn"]));
}
set {
this["TrailersOn"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string downloadDir {
get {
return ((string)(this["downloadDir"]));
}
set {
this["downloadDir"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool customDownloadDir {
get {
return ((bool)(this["customDownloadDir"]));
}
set {
this["customDownloadDir"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool customBackupDir {
get {
return ((bool)(this["customBackupDir"]));
}
set {
this["customBackupDir"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string backupDir {
get {
return ((string)(this["backupDir"]));
}
set {
this["backupDir"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool singleThreadMode {
get {
return ((bool)(this["singleThreadMode"]));
}
set {
this["singleThreadMode"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool virtualFilesystemCompatibility {
get {
return ((bool)(this["virtualFilesystemCompatibility"]));
}
set {
this["virtualFilesystemCompatibility"] = value;
}
}
}
}

View File

@@ -32,9 +32,6 @@
<Setting Name="SpoofGames" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="BandwidthLimit" 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>
@@ -182,5 +179,26 @@
<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)">False</Value>
</Setting>
<Setting Name="virtualFilesystemCompatibility" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile>

5
QuestForm.Designer.cs generated
View File

@@ -32,6 +32,7 @@ namespace AndroidSideloader
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(QuestForm));
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
@@ -274,7 +275,6 @@ namespace AndroidSideloader
this.CPUComboBox.Size = new System.Drawing.Size(346, 26);
this.CPUComboBox.TabIndex = 2;
this.CPUComboBox.Text = "Select CPU level (0 for default)";
this.CPUComboBox.SelectedIndexChanged += new System.EventHandler(this.CPUComboBox_SelectedIndexChanged);
//
// GPUComboBox
//
@@ -296,7 +296,6 @@ namespace AndroidSideloader
this.GPUComboBox.Size = new System.Drawing.Size(346, 26);
this.GPUComboBox.TabIndex = 1;
this.GPUComboBox.Text = "Select GPU level (0 for default)";
this.GPUComboBox.SelectedIndexChanged += new System.EventHandler(this.GPUComboBox_SelectedIndexChanged);
//
// label7
//
@@ -526,7 +525,6 @@ namespace AndroidSideloader
this.RefreshRateComboBox.Size = new System.Drawing.Size(346, 26);
this.RefreshRateComboBox.TabIndex = 0;
this.RefreshRateComboBox.Text = "Select refresh rate";
this.RefreshRateComboBox.SelectedIndexChanged += new System.EventHandler(this.RefreshRateComboBox_SelectedIndexChanged);
//
// button1
//
@@ -742,6 +740,7 @@ namespace AndroidSideloader
this.Controls.Add(this.QURfrRt);
this.Controls.Add(this.RefreshRateComboBox);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximumSize = new System.Drawing.Size(386, 776);
this.MinimumSize = new System.Drawing.Size(386, 776);
this.Name = "QuestForm";

View File

@@ -24,7 +24,6 @@ namespace AndroidSideloader
//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}");
_ = ADB.RunAdbCommandToString($"shell settings put global 90hz_global {RefreshRateComboBox.SelectedIndex}");
_ = ADB.RunAdbCommandToString($"shell settings put global 90hzglobal {RefreshRateComboBox.SelectedIndex}");
@@ -33,7 +32,6 @@ namespace AndroidSideloader
if (TextureResTextBox.Text.Length > 0)
{
ADB.WakeDevice();
_ = 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}");
@@ -269,8 +267,7 @@ namespace AndroidSideloader
}
_ = MessageBox.Show("Please wait until you get the message that the transfer has finished.");
ADB.WakeDevice();
Program.form.ChangeTitle("Pulling files...");
Program.form.changeTitle("Pulling files...");
_ = ADB.RunAdbCommandToString($"pull \"/sdcard/Oculus/Screenshots\" \"{path}\\Quest ScreenShots\"");
if (delsh)
{
@@ -282,7 +279,7 @@ namespace AndroidSideloader
}
}
_ = MessageBox.Show("Transfer finished! ScreenShots can be found in a folder named Quest Screenshots on your desktop!");
Program.form.ChangeTitle("Done!");
Program.form.changeTitle("Done!");
}
private void questVids_Click(object sender, EventArgs e)
{
@@ -292,9 +289,8 @@ namespace AndroidSideloader
_ = 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...");
_ = 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 VideoShots\"");
if (delsh)
{
@@ -306,7 +302,7 @@ namespace AndroidSideloader
}
}
_ = MessageBox.Show("Transfer finished! VideoShots can be found in a folder named Quest VideoShots on your desktop!");
Program.form.ChangeTitle("Done!");
Program.form.changeTitle("Done!");
}
private void button3_Click(object sender, EventArgs e)
{
@@ -352,20 +348,5 @@ namespace AndroidSideloader
Properties.Settings.Default.GlobalUsername = GlobalUsername.Text;
Properties.Settings.Default.Save();
}
private void RefreshRateComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void CPUComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void GPUComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}

File diff suppressed because it is too large Load Diff

124
RCLONE.cs
View File

@@ -2,6 +2,7 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Management;
using System.Text;
using System.Windows.Forms;
@@ -9,16 +10,35 @@ namespace AndroidSideloader
{
internal class RCLONE
{
//Kill all rclone, using a static rclone variable doesn't work for some reason #tofix
// Kill RCLONE Processes that were started from Rookie by looking for child processes.
public static void killRclone()
{
foreach (Process process in Process.GetProcessesByName("rclone"))
var parentProcessId = Process.GetCurrentProcess().Id;
var processes = Process.GetProcessesByName("rclone");
foreach (var process in processes)
{
process.Kill();
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");
@@ -28,7 +48,7 @@ namespace AndroidSideloader
}
}
//Change if you want to use a config
// 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 = "";
@@ -36,32 +56,26 @@ namespace AndroidSideloader
private static readonly Process rclone = new Process();
//Run rclone command
public static ProcessOutput runRcloneCommand_DownloadConfig(string command, string BandwidthLimit = "")
// 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 (BandwidthLimit.Length > 0)
{
command += $" --bwlimit={BandwidthLimit}";
}
//set configpath if there is any
// set configpath if there is any
if (downloadConfigPath.Length > 0)
{
command += $" --config {downloadConfigPath}";
}
//set rclonepw
// set rclonepw
if (rclonepw.Length > 0)
{
command += " --ask-password=false";
@@ -87,12 +101,11 @@ namespace AndroidSideloader
rclone.StartInfo.RedirectStandardOutput = true;
rclone.StartInfo.WorkingDirectory = 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.StandardInput.WriteLine(command);
@@ -105,14 +118,14 @@ namespace AndroidSideloader
if (error.Contains("There is not enough space"))
{
_ = FlexibleMessageBox.Show($"There isn't enough disk space to download this game.\r\nPlease ensure you have at least 200MB more the game size available in {Environment.CurrentDirectory} and try again.",
_ = 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 {Environment.CurrentDirectory} and try again.",
"NOT ENOUGH SPACE",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return new ProcessOutput("Download failed.", "");
}
//if there is one of these errors, we switch the mirrors
// 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;
@@ -125,7 +138,7 @@ namespace AndroidSideloader
{
return new ProcessOutput("All mirrors are on quota or down...", "All mirrors are on quota or down...");
}
prcoutput = runRcloneCommand_DownloadConfig(originalCommand.Replace(oldRemote, MainForm.currentRemote), BandwidthLimit);
prcoutput = runRcloneCommand_DownloadConfig(originalCommand.Replace(oldRemote, MainForm.currentRemote));
}
else
{
@@ -137,7 +150,7 @@ namespace AndroidSideloader
{
if (!string.IsNullOrWhiteSpace(error))
{
_ = Logger.Log($"Rclone error: {error}\n");
_ = Logger.Log($"Rclone error: {error}\n", LogLevel.ERROR);
}
if (!string.IsNullOrWhiteSpace(output))
@@ -148,24 +161,13 @@ namespace AndroidSideloader
return prcoutput;
}
public static ProcessOutput runRcloneCommand_UploadConfig(string command, string BandwidthLimit = "")
public static ProcessOutput runRcloneCommand_UploadConfig(string command)
{
if (!MainForm.HasInternet || 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;
//set bandwidth limit
if (BandwidthLimit.Length > 0)
{
command += $" --bwlimit={BandwidthLimit}";
}
//set configpath if there is any
// set configpath if there is any
if (uploadConfigPath.Length > 0)
{
command += $" --config {uploadConfigPath}";
@@ -193,12 +195,11 @@ namespace AndroidSideloader
rclone.StartInfo.RedirectStandardOutput = true;
rclone.StartInfo.WorkingDirectory = 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.StandardInput.WriteLine(command);
@@ -209,10 +210,10 @@ namespace AndroidSideloader
string error = rclone.StandardError.ReadToEnd();
rclone.WaitForExit();
//if there is one of these errors, we switch the mirrors
// 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);
_ = Logger.Log(error, LogLevel.ERROR);
return new ProcessOutput("Upload Failed.", "Upload failed.");
}
else
@@ -225,7 +226,7 @@ namespace AndroidSideloader
{
if (!string.IsNullOrWhiteSpace(error))
{
_ = Logger.Log($"Rclone error: {error}\n");
_ = Logger.Log($"Rclone error: {error}\n", LogLevel.ERROR);
}
if (!string.IsNullOrWhiteSpace(output))
@@ -236,23 +237,17 @@ namespace AndroidSideloader
return prcoutput;
}
public static ProcessOutput runRcloneCommand_PublicConfig(string command, string BandwidthLimit = "")
public static ProcessOutput runRcloneCommand_PublicConfig(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;
//set bandwidth limit
if (BandwidthLimit.Length > 0)
{
command += $" --bwlimit={BandwidthLimit}";
}
string logcmd = Utilities.StringUtilities.RemoveEverythingBeforeFirst(command, "rclone.exe");
if (logcmd.Contains($"\"{Properties.Settings.Default.CurrentLogPath}\""))
{
@@ -268,7 +263,7 @@ namespace AndroidSideloader
//set http source & args
command += $" --http-url {MainForm.PublicConfigFile.BaseUri} {MainForm.PublicMirrorExtraArgs}";
rclone.StartInfo.FileName = Environment.CurrentDirectory + "\\rclone\\rclone.exe";
rclone.StartInfo.Arguments = command;
rclone.StartInfo.RedirectStandardInput = true;
@@ -276,13 +271,11 @@ namespace AndroidSideloader
rclone.StartInfo.RedirectStandardOutput = true;
rclone.StartInfo.WorkingDirectory = 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.StandardInput.WriteLine(command);
@@ -295,14 +288,19 @@ namespace AndroidSideloader
if (error.Contains("There is not enough space"))
{
_ = FlexibleMessageBox.Show($"There isn't enough disk space to download this game.\r\nPlease ensure you have at least 2x the game size available in {Environment.CurrentDirectory} and try again.",
_ = 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 {Environment.CurrentDirectory} and try again.",
"NOT ENOUGH SPACE",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return new ProcessOutput("Download failed.", "");
return new ProcessOutput("Download failed.", string.Empty);
}
if (error.Contains("400 Bad Request")
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")
@@ -310,7 +308,7 @@ namespace AndroidSideloader
|| error.Contains("directory not found")
|| error.Contains("Failed to"))
{
_ = Logger.Log(error);
_ = Logger.Log(error, LogLevel.ERROR);
return new ProcessOutput("Failed to fetch from public mirror.", "Failed to fetch from public mirror.");
}
else
@@ -323,7 +321,7 @@ namespace AndroidSideloader
{
if (!string.IsNullOrWhiteSpace(error))
{
_ = Logger.Log($"Rclone error: {error}\n");
_ = Logger.Log($"Rclone error: {error}\n", LogLevel.ERROR);
}
if (!string.IsNullOrWhiteSpace(output))

View File

@@ -1,8 +1,8 @@
# 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)
![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)
androidsideloader uses the GPL license, any forks of it must have their source code made public on the internet.
@@ -12,4 +12,4 @@ This app may be buggy and have problems.
### 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
https://www.virustotal.com/gui/file/46b6e24a03a6670dfbbde6e6f06caac05f2f9486115ef7bd77e0b568df7e5342/detection

353
SettingsForm.Designer.cs generated
View File

@@ -29,23 +29,30 @@ namespace AndroidSideloader
/// </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.txtBandwidth = new System.Windows.Forms.TextBox();
this.lblDownloadSpeedLimiter = new System.Windows.Forms.Label();
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.applyButton = new AndroidSideloader.RoundButton();
this.resetSettingsButton = new AndroidSideloader.RoundButton();
this.trailersOn = new System.Windows.Forms.CheckBox();
this.downloadDirectorySetter = new System.Windows.Forms.FolderBrowserDialog();
this.backupDirectorySetter = new System.Windows.Forms.FolderBrowserDialog();
this.singleThread = 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.btnOpenDebug = new AndroidSideloader.RoundButton();
this.lblMibs = new System.Windows.Forms.Label();
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.SuspendLayout();
//
// checkForUpdatesCheckBox
@@ -54,7 +61,7 @@ namespace AndroidSideloader
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(12, 12);
this.checkForUpdatesCheckBox.Location = new System.Drawing.Point(12, 67);
this.checkForUpdatesCheckBox.Name = "checkForUpdatesCheckBox";
this.checkForUpdatesCheckBox.Size = new System.Drawing.Size(148, 22);
this.checkForUpdatesCheckBox.TabIndex = 0;
@@ -68,7 +75,7 @@ namespace AndroidSideloader
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(12, 38);
this.enableMessageBoxesCheckBox.Location = new System.Drawing.Point(11, 123);
this.enableMessageBoxesCheckBox.Name = "enableMessageBoxesCheckBox";
this.enableMessageBoxesCheckBox.Size = new System.Drawing.Size(309, 22);
this.enableMessageBoxesCheckBox.TabIndex = 1;
@@ -82,7 +89,7 @@ namespace AndroidSideloader
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(12, 64);
this.deleteAfterInstallCheckBox.Location = new System.Drawing.Point(12, 40);
this.deleteAfterInstallCheckBox.Name = "deleteAfterInstallCheckBox";
this.deleteAfterInstallCheckBox.Size = new System.Drawing.Size(288, 22);
this.deleteAfterInstallCheckBox.TabIndex = 3;
@@ -96,7 +103,7 @@ namespace AndroidSideloader
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(12, 90);
this.updateConfigCheckBox.Location = new System.Drawing.Point(11, 95);
this.updateConfigCheckBox.Name = "updateConfigCheckBox";
this.updateConfigCheckBox.Size = new System.Drawing.Size(208, 22);
this.updateConfigCheckBox.TabIndex = 6;
@@ -110,7 +117,7 @@ namespace AndroidSideloader
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(12, 116);
this.userJsonOnGameInstall.Location = new System.Drawing.Point(11, 151);
this.userJsonOnGameInstall.Name = "userJsonOnGameInstall";
this.userJsonOnGameInstall.Size = new System.Drawing.Size(243, 22);
this.userJsonOnGameInstall.TabIndex = 9;
@@ -118,31 +125,6 @@ namespace AndroidSideloader
this.userJsonOnGameInstall.UseVisualStyleBackColor = false;
this.userJsonOnGameInstall.CheckedChanged += new System.EventHandler(this.userJsonOnGameInstall_CheckedChanged);
//
// txtBandwidth
//
this.txtBandwidth.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
this.txtBandwidth.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.txtBandwidth.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.txtBandwidth.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.txtBandwidth.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.txtBandwidth.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.txtBandwidth.Location = new System.Drawing.Point(49, 254);
this.txtBandwidth.Name = "txtBandwidth";
this.txtBandwidth.Size = new System.Drawing.Size(103, 24);
this.txtBandwidth.TabIndex = 11;
//
// lblDownloadSpeedLimiter
//
this.lblDownloadSpeedLimiter.AutoSize = true;
this.lblDownloadSpeedLimiter.BackColor = System.Drawing.Color.Transparent;
this.lblDownloadSpeedLimiter.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.lblDownloadSpeedLimiter.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.lblDownloadSpeedLimiter.Location = new System.Drawing.Point(87, 230);
this.lblDownloadSpeedLimiter.Name = "lblDownloadSpeedLimiter";
this.lblDownloadSpeedLimiter.Size = new System.Drawing.Size(169, 18);
this.lblDownloadSpeedLimiter.TabIndex = 12;
this.lblDownloadSpeedLimiter.Text = "Download Speed Limiter";
//
// crashlogID
//
this.crashlogID.AutoSize = true;
@@ -158,7 +140,7 @@ namespace AndroidSideloader
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(12, 168);
this.nodevicemodeBox.Location = new System.Drawing.Point(12, 12);
this.nodevicemodeBox.Name = "nodevicemodeBox";
this.nodevicemodeBox.Size = new System.Drawing.Size(181, 22);
this.nodevicemodeBox.TabIndex = 9;
@@ -172,7 +154,7 @@ namespace AndroidSideloader
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(12, 142);
this.bmbfBox.Location = new System.Drawing.Point(11, 179);
this.bmbfBox.Name = "bmbfBox";
this.bmbfBox.Size = new System.Drawing.Size(281, 22);
this.bmbfBox.TabIndex = 9;
@@ -186,7 +168,7 @@ namespace AndroidSideloader
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(12, 194);
this.AutoReinstBox.Location = new System.Drawing.Point(11, 207);
this.AutoReinstBox.Name = "AutoReinstBox";
this.AutoReinstBox.Size = new System.Drawing.Size(280, 22);
this.AutoReinstBox.TabIndex = 9;
@@ -195,50 +177,104 @@ namespace AndroidSideloader
this.AutoReinstBox.CheckedChanged += new System.EventHandler(this.AutoReinstBox_CheckedChanged);
this.AutoReinstBox.Click += new System.EventHandler(this.AutoReinstBox_Click);
//
// applyButton
// trailersOn
//
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(29, 301);
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);
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(11, 235);
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);
//
// resetSettingsButton
// downloadDirectorySetter
//
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(181, 301);
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);
this.downloadDirectorySetter.RootFolder = System.Environment.SpecialFolder.MyComputer;
//
// backupDirectorySetter
//
this.backupDirectorySetter.RootFolder = System.Environment.SpecialFolder.MyComputer;
//
// singleThread
//
this.singleThread.AutoSize = true;
this.singleThread.BackColor = System.Drawing.Color.Transparent;
this.singleThread.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.singleThread.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.singleThread.Location = new System.Drawing.Point(11, 263);
this.singleThread.Name = "singleThread";
this.singleThread.Size = new System.Drawing.Size(186, 22);
this.singleThread.TabIndex = 25;
this.singleThread.Text = "Enable Single-Threading";
this.singleThread.UseVisualStyleBackColor = false;
this.singleThread.CheckedChanged += new System.EventHandler(this.singleThread_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(27, 542);
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(27, 505);
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(26, 378);
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
//
@@ -250,7 +286,7 @@ namespace AndroidSideloader
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(29, 385);
this.btnResetDebug.Location = new System.Drawing.Point(26, 415);
this.btnResetDebug.Name = "btnResetDebug";
this.btnResetDebug.Radius = 5;
this.btnResetDebug.Size = new System.Drawing.Size(285, 31);
@@ -271,7 +307,7 @@ namespace AndroidSideloader
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(29, 422);
this.btnUploadDebug.Location = new System.Drawing.Point(26, 452);
this.btnUploadDebug.Name = "btnUploadDebug";
this.btnUploadDebug.Radius = 5;
this.btnUploadDebug.Size = new System.Drawing.Size(285, 31);
@@ -282,55 +318,127 @@ namespace AndroidSideloader
this.btnUploadDebug.Transparency = false;
this.btnUploadDebug.Click += new System.EventHandler(this.btnUploadDebug_click);
//
// btnOpenDebug
// resetSettingsButton
//
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(29, 348);
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);
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(179, 325);
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);
//
// lblMibs
// applyButton
//
this.lblMibs.AutoSize = true;
this.lblMibs.BackColor = System.Drawing.Color.Transparent;
this.lblMibs.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.lblMibs.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.lblMibs.Location = new System.Drawing.Point(159, 257);
this.lblMibs.Name = "lblMibs";
this.lblMibs.Size = new System.Drawing.Size(135, 18);
this.lblMibs.TabIndex = 22;
this.lblMibs.Text = "MiB/s (0 to disable)";
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(27, 325);
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(11, 291);
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(27, 616);
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(27, 579);
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);
//
// 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 = global::AndroidSideloader.Properties.Resources.pattern_cubes_1_1_1_0_0_0_1__000000_212121;
this.ClientSize = new System.Drawing.Size(342, 469);
this.Controls.Add(this.lblMibs);
this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
this.ClientSize = new System.Drawing.Size(339, 665);
this.Controls.Add(this.openBackupDirectory);
this.Controls.Add(this.openDownloadDirectory);
this.Controls.Add(this.virtualFilesystemCompatibilityCheckbox);
this.Controls.Add(this.singleThread);
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.lblDownloadSpeedLimiter);
this.Controls.Add(this.txtBandwidth);
this.Controls.Add(this.bmbfBox);
this.Controls.Add(this.AutoReinstBox);
this.Controls.Add(this.nodevicemodeBox);
@@ -342,6 +450,7 @@ namespace AndroidSideloader
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;
@@ -362,8 +471,6 @@ namespace AndroidSideloader
private System.Windows.Forms.CheckBox deleteAfterInstallCheckBox;
private System.Windows.Forms.CheckBox updateConfigCheckBox;
private System.Windows.Forms.CheckBox userJsonOnGameInstall;
private System.Windows.Forms.TextBox txtBandwidth;
private System.Windows.Forms.Label lblDownloadSpeedLimiter;
private System.Windows.Forms.Label crashlogID;
private System.Windows.Forms.CheckBox nodevicemodeBox;
private System.Windows.Forms.CheckBox bmbfBox;
@@ -373,6 +480,14 @@ namespace AndroidSideloader
private RoundButton btnResetDebug;
private RoundButton btnUploadDebug;
private RoundButton btnOpenDebug;
private System.Windows.Forms.Label lblMibs;
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 singleThread;
private System.Windows.Forms.CheckBox virtualFilesystemCompatibilityCheckbox;
private RoundButton openBackupDirectory;
private RoundButton openDownloadDirectory;
}
}

View File

@@ -31,12 +31,14 @@ namespace AndroidSideloader
nodevicemodeBox.Checked = Properties.Settings.Default.nodevicemode;
bmbfBox.Checked = Properties.Settings.Default.BMBFchecked;
AutoReinstBox.Checked = Properties.Settings.Default.AutoReinstall;
if (Properties.Settings.Default.BandwidthLimit.Length > 1)
trailersOn.Checked = Properties.Settings.Default.TrailersOn;
singleThread.Checked = Properties.Settings.Default.singleThreadMode;
virtualFilesystemCompatibilityCheckbox.Checked = Properties.Settings.Default.virtualFilesystemCompatibility;
if (nodevicemodeBox.Checked)
{
txtBandwidth.Text = Properties.Settings.Default.BandwidthLimit.Remove(Properties.Settings.Default.BandwidthLimit.Length - 1);
deleteAfterInstallCheckBox.Checked = false;
deleteAfterInstallCheckBox.Enabled = false;
}
}
private void intToolTips()
@@ -81,10 +83,8 @@ namespace AndroidSideloader
//Apply settings
private void applyButton_Click(object sender, EventArgs e)
{
Properties.Settings.Default.BandwidthLimit = txtBandwidth.Text.Length > 0 && txtBandwidth.Text != "0" ? $"{txtBandwidth.Text.Replace(" ", "")}M" : "";
Properties.Settings.Default.Save();
_ = FlexibleMessageBox.Show("Settings applied!");
this.Close();
}
private void checkForUpdatesCheckBox_CheckedChanged(object sender, EventArgs e)
@@ -100,6 +100,10 @@ namespace AndroidSideloader
private void resetSettingsButton_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Reset();
Properties.Settings.Default.customDownloadDir = false;
Properties.Settings.Default.customBackupDir = false;
MainForm.backupFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
Properties.Settings.Default.downloadDir = Environment.CurrentDirectory.ToString();
intSettings();
}
@@ -151,6 +155,18 @@ namespace AndroidSideloader
private void nodevicemodeBox_CheckedChanged(object sender, EventArgs e)
{
Properties.Settings.Default.nodevicemode = nodevicemodeBox.Checked;
if (!nodevicemodeBox.Checked)
{
deleteAfterInstallCheckBox.Checked = true;
Properties.Settings.Default.deleteAllAfterInstall = true;
deleteAfterInstallCheckBox.Enabled = true;
}
else
{
deleteAfterInstallCheckBox.Checked = false;
Properties.Settings.Default.deleteAllAfterInstall = false;
deleteAfterInstallCheckBox.Enabled = false;
}
Properties.Settings.Default.Save();
}
@@ -166,13 +182,19 @@ namespace AndroidSideloader
Properties.Settings.Default.Save();
}
private void trailersOn_CheckedChanged(object sender, EventArgs e)
{
Properties.Settings.Default.TrailersOn = trailersOn.Checked;
Properties.Settings.Default.Save();
}
private void AutoReinstBox_Click(object sender, EventArgs e)
{
if (AutoReinstBox.Checked)
{
DialogResult dialogResult = FlexibleMessageBox.Show("WARNING: This box enables automatic reinstall when installs fail,\ndue to some games not allowing " +
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 preform\nthe reinstall. " +
" 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)
@@ -190,6 +212,67 @@ namespace AndroidSideloader
_ = Process.Start($"{Environment.CurrentDirectory}\\debuglog.txt");
}
}
private void setDownloadDirectory_Click(object sender, EventArgs e)
{
if (downloadDirectorySetter.ShowDialog() == DialogResult.OK)
{
Properties.Settings.Default.customDownloadDir = true;
Properties.Settings.Default.downloadDir = downloadDirectorySetter.SelectedPath;
Properties.Settings.Default.Save();
}
}
private void setBackupDirectory_Click(object sender, EventArgs e)
{
if (backupDirectorySetter.ShowDialog() == DialogResult.OK)
{
Properties.Settings.Default.customBackupDir = true;
Properties.Settings.Default.backupDir = backupDirectorySetter.SelectedPath;
MainForm.backupFolder = Properties.Settings.Default.backupDir;
Properties.Settings.Default.Save();
}
}
private void singleThread_CheckedChanged(object sender, EventArgs e)
{
Properties.Settings.Default.singleThreadMode = singleThread.Checked;
Properties.Settings.Default.Save();
}
private void virtualFilesystemCompatibilityCheckbox_CheckedChanged(object sender, EventArgs e)
{
Properties.Settings.Default.virtualFilesystemCompatibility = virtualFilesystemCompatibilityCheckbox.Checked;
Properties.Settings.Default.Save();
}
private void openDownloadDirectory_Click(object sender, EventArgs e)
{
string pathToOpen = Properties.Settings.Default.customDownloadDir ? $"{Properties.Settings.Default.downloadDir}" : $"{Environment.CurrentDirectory}";
if (Directory.Exists(pathToOpen))
{
ProcessStartInfo p = new ProcessStartInfo
{
Arguments = pathToOpen,
FileName = "explorer.exe"
};
Process.Start(p);
}
}
private void openBackupDirectory_Click(object sender, EventArgs e)
{
string pathToOpen = Properties.Settings.Default.customBackupDir ? $"{Path.Combine((Properties.Settings.Default.backupDir), $"Rookie Backups")}" : $"{Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups")}";
if (Directory.Exists(pathToOpen))
{
ProcessStartInfo p = new ProcessStartInfo
{
Arguments = pathToOpen,
FileName = "explorer.exe"
};
Process.Start(p);
}
}
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,341 +1,373 @@
using JR.Utils.GUI.Forms;
using System;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace AndroidSideloader
{
internal class Sideloader
{
public static string TempFolder = Path.Combine(Environment.CurrentDirectory, "temp");
public static string CrashLogPath = "crashlog.txt";
public static 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 (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)
{
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();
string[] commands = File.ReadAllLines(path);
string currfolder = Path.GetDirectoryName(path);
string[] zipz = Directory.GetFiles(currfolder, "*.7z", SearchOption.AllDirectories);
foreach (string zip in zipz)
{
Utilities.Zip.ExtractFile($"{zip}", currfolder);
}
foreach (string cmd in commands)
{
if (cmd.StartsWith("adb"))
{
string replacement = "";
string pattern = "adb";
replacement = ADB.DeviceID.Length > 1
? $"{Properties.Settings.Default.ADBPath} -s {ADB.DeviceID}"
: $"{Properties.Settings.Default.ADBPath}";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(cmd, replacement);
Program.form.ChangeTitle($"Running {result}");
_ = Logger.Log($"Logging command: {result} from file: {path}");
output += ADB.RunAdbCommandToStringWOADB(result, path);
if (output.Error.Contains("mkdir"))
{
output.Error = "";
}
if (output.Output.Contains("reserved"))
{
output.Output = "";
}
}
}
output.Output += "Custom install successful!";
return output;
}
//Recursive sideload any apk fileD
public static ProcessOutput RecursiveOutput = new ProcessOutput();
public static void RecursiveSideload(string FolderPath)
{
try
{
foreach (string f in Directory.GetFiles(FolderPath))
{
if (Path.GetExtension(f) == ".apk")
{
RecursiveOutput += ADB.Sideload(f);
}
}
foreach (string d in Directory.GetDirectories(FolderPath))
{
RecursiveSideload(d);
}
}
catch (Exception ex) { _ = Logger.Log(ex.Message); }
}
//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...");
_ = 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}\"");
ProcessOutput 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();
_ = new ProcessOutput("", "");
string packageName = Sideloader.gameNameToPackageName(GameName);
ProcessOutput output = ADB.RunAdbCommandToString("shell pm path " + packageName);
string apkPath = output.Output; //Get apk
apkPath = apkPath.Remove(apkPath.Length - 1);
apkPath = apkPath.Remove(0, 8); //remove package:
apkPath = apkPath.Remove(apkPath.Length - 1);
if (File.Exists($"{Properties.Settings.Default.ADBFolder}\\base.apk"))
{
File.Delete($"{Properties.Settings.Default.ADBFolder}\\base.apk");
}
if (File.Exists($"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk"))
{
File.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk");
}
output += ADB.RunAdbCommandToString("pull " + apkPath); //pull apk
if (Directory.Exists($"{Properties.Settings.Default.MainDir}\\{packageName}"))
{
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}", true);
}
_ = Directory.CreateDirectory($"{Properties.Settings.Default.MainDir}\\{packageName}");
File.Move($"{Properties.Settings.Default.ADBFolder}\\base.apk", $"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk");
return output;
}
public static string gameNameToPackageName(string gameName)
{
foreach (string[] game in SideloaderRCLONE.games)
{
if (gameName.Equals(game[SideloaderRCLONE.GameNameIndex]))
{
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()
{
WebClient 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("Rookie Offline.cmd"))
{
client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/Rookie%20Offline.cmd", "Rookie Offline.cmd");
}
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 = Environment.Is64BitOperatingSystem
? "https://downloads.rclone.org/v1.55.1/rclone-v1.55.1-windows-amd64.zip"
: "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.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace AndroidSideloader
{
internal class Sideloader
{
public static string TempFolder = Path.Combine(Environment.CurrentDirectory, "temp");
public static string CrashLogPath = "crashlog.txt";
//push user.json to device (required for some devices like oculus quest)
public static void PushUserJsons()
{
foreach (string userJson in UsernameForm.userJsons)
{
UsernameForm.createUserJsonByName(Utilities.GeneralUtilities.randomString(16), userJson);
_ = ADB.RunAdbCommandToString("push \"" + Environment.CurrentDirectory + $"\\{userJson}\" " + " /sdcard/");
File.Delete(userJson);
}
}
//List of all installed package names from connected device
//public static List<string> InstalledPackageNames = new List<string>(); //Remove folder from device
public static ProcessOutput RemoveFolder(string path)
{
if (path == "/sdcard/Android/obb/" || path == "sdcard/Android/data/")
{
return null;
}
return ADB.RunAdbCommandToString($"shell rm -r {path}");
}
public static ProcessOutput RemoveFile(string path)
{
return ADB.RunAdbCommandToString($"shell rm -f {path}");
}
//For games that require manual install, like having another folder that isnt an obb
public static ProcessOutput RunADBCommandsFromFile(string path)
{
ProcessOutput output = new ProcessOutput();
string[] commands = File.ReadAllLines(path);
string currfolder = Path.GetDirectoryName(path);
string[] zipz = Directory.GetFiles(currfolder, "*.7z", SearchOption.AllDirectories);
foreach (string zip in zipz)
{
Utilities.Zip.ExtractFile($"{zip}", currfolder);
}
foreach (string cmd in commands)
{
if (cmd.StartsWith("adb"))
{
string replacement = "";
string pattern = "adb";
replacement = ADB.DeviceID.Length > 1
? $"{Properties.Settings.Default.ADBPath} -s {ADB.DeviceID}"
: $"{Properties.Settings.Default.ADBPath}";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(cmd, replacement);
Program.form.changeTitle($"Running {result}");
_ = Logger.Log($"Logging command: {result} from file: {path}");
output += ADB.RunAdbCommandToStringWOADB(result, path);
if (output.Error.Contains("mkdir"))
{
output.Error = "";
}
if (output.Output.Contains("reserved"))
{
output.Output = "";
}
}
}
output.Output += "Custom install successful!";
return output;
}
//Recursive sideload any apk fileD
public static ProcessOutput RecursiveOutput = new ProcessOutput();
public static void RecursiveSideload(string FolderPath)
{
try
{
foreach (string f in Directory.GetFiles(FolderPath))
{
if (Path.GetExtension(f) == ".apk")
{
RecursiveOutput += ADB.Sideload(f);
}
}
foreach (string d in Directory.GetDirectories(FolderPath))
{
RecursiveSideload(d);
}
}
catch (Exception ex) { _ = Logger.Log(ex.Message, LogLevel.ERROR); }
}
//Recursive copy any obb folder
public static void RecursiveCopyOBB(string FolderPath)
{
try
{
foreach (string f in Directory.GetFiles(FolderPath))
{
RecursiveOutput += ADB.CopyOBB(f);
}
foreach (string d in Directory.GetDirectories(FolderPath))
{
RecursiveCopyOBB(d);
}
}
catch (Exception ex) { _ = Logger.Log(ex.Message, LogLevel.ERROR); }
}
// Removes the game package and its OBB + Data Folders.
public static ProcessOutput UninstallGame(string packagename)
{
ProcessOutput output = ADB.UninstallPackage(packagename);
Program.form.changeTitle("");
_ = Sideloader.RemoveFolder("/sdcard/Android/obb/" + packagename);
_ = Sideloader.RemoveFolder("/sdcard/Android/data/" + packagename);
return output;
}
public static void BackupGame(string packagename)
{
if (!Properties.Settings.Default.customBackupDir)
{
MainForm.backupFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"Rookie Backups");
}
else
{
MainForm.backupFolder = Path.Combine((Properties.Settings.Default.backupDir), $"Rookie Backups");
}
if (!Directory.Exists(MainForm.backupFolder))
{
_ = Directory.CreateDirectory(MainForm.backupFolder);
}
Program.form.changeTitle($"Attempting to backup any savedata to {MainForm.backupFolder}\\Rookie Backups...");
_ = new ProcessOutput("", "");
string date_str = DateTime.Today.ToString("yyyy.MM.dd");
string CurrBackups = Path.Combine(MainForm.backupFolder, date_str);
if (!Directory.Exists(CurrBackups))
{
_ = Directory.CreateDirectory(CurrBackups);
}
_ = ADB.RunAdbCommandToString($"pull \"/sdcard/Android/data/{packagename}\" \"{CurrBackups}\"");
}
public static ProcessOutput DeleteFile(string GameName)
{
ProcessOutput output = new ProcessOutput("", "");
string packageName = Sideloader.gameNameToPackageName(GameName);
DialogResult dialogResult = FlexibleMessageBox.Show(Program.form, $"Are you sure you want to uninstall custom QU settings for {packageName}? this CANNOT be undone!", "WARNING!", MessageBoxButtons.YesNo);
if (dialogResult != DialogResult.Yes)
{
return output;
}
output = Sideloader.RemoveFile($"/sdcard/Android/data/{packageName}/private/Config.Json");
return output;
}
//Extracts apk from device, saves it by package name to sideloader folder
public static ProcessOutput getApk(string GameName)
{
_ = new ProcessOutput("", "");
string packageName = Sideloader.gameNameToPackageName(GameName);
ProcessOutput output = ADB.RunAdbCommandToString("shell pm path " + packageName);
string apkPath = output.Output; //Get apk
apkPath = apkPath.Remove(apkPath.Length - 1);
apkPath = apkPath.Remove(0, 8); //remove package:
apkPath = apkPath.Remove(apkPath.Length - 1);
if (File.Exists($"{Properties.Settings.Default.ADBFolder}\\base.apk"))
{
File.Delete($"{Properties.Settings.Default.ADBFolder}\\base.apk");
}
if (File.Exists($"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk"))
{
File.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk");
}
output += ADB.RunAdbCommandToString("pull " + apkPath); //pull apk
if (Directory.Exists($"{Properties.Settings.Default.MainDir}\\{packageName}"))
{
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}", true);
}
_ = Directory.CreateDirectory($"{Properties.Settings.Default.MainDir}\\{packageName}");
File.Move($"{Properties.Settings.Default.ADBFolder}\\base.apk", $"{Properties.Settings.Default.MainDir}\\{packageName}\\{packageName}.apk");
return output;
}
public static string gameNameToPackageName(string gameName)
{
foreach (string[] game in SideloaderRCLONE.games)
{
if (gameName.Equals(game[SideloaderRCLONE.GameNameIndex]) || gameName.Equals(game[SideloaderRCLONE.ReleaseNameIndex]))
return game[SideloaderRCLONE.PackageNameIndex];
}
return gameName;
}
public static string 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;
}
// Download required dependencies.
public static void downloadFiles()
{
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($"{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/adb2.zip", "_adb.7z");
Utilities.Zip.ExtractFile(Environment.CurrentDirectory + "\\_adb.7z", $"{Path.GetPathRoot(Environment.SystemDirectory)}RSL\\platform-tools");
File.Delete("_adb.7z");
_ = Logger.Log($"adb download successful");
}
if (!Directory.Exists(Environment.CurrentDirectory + "\\rclone"))
{
currentAccessedWebsite = "rclone";
_ = Logger.Log($"Missing rclone. Attempting to download from {currentAccessedWebsite}.org");
string url = Environment.Is64BitOperatingSystem
? "https://downloads.rclone.org/v1.62.2/rclone-v1.62.2-windows-amd64.zip"
: "https://downloads.rclone.org/v1.62.2/rclone-v1.62.2-windows-386.zip";
//Since sideloader is build for x86, it should work on both x86 and x64 so we download the according rclone version
_ = 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(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
}
}
_ = Logger.Log($"rclone download successful");
}
else
{
_ = Logger.Log($"Checking for Local rclone...");
string pathToRclone = Path.Combine(Environment.CurrentDirectory, "rclone", "rclone.exe");
if (File.Exists(pathToRclone))
{
var versionInfo = FileVersionInfo.GetVersionInfo(pathToRclone);
string version = versionInfo.ProductVersion;
Logger.Log($"Current RCLONE Version {version}");
if (!MainForm.noRcloneUpdating)
{
if (version != "1.62.2")
{
Logger.Log($"RCLONE Version does not match ({version})! Downloading required version (1.62.2)", LogLevel.WARNING);
File.Delete(pathToRclone);
currentAccessedWebsite = "rclone";
string architecture = Environment.Is64BitOperatingSystem ? "amd64" : "386";
string url = $"https://downloads.rclone.org/v1.62.2/rclone-v1.62.2-windows-{architecture}.zip";
client.DownloadFile(url, "rclone.zip");
Utilities.Zip.ExtractFile(Path.Combine(Environment.CurrentDirectory, "rclone.zip"), Environment.CurrentDirectory);
File.Delete("rclone.zip");
string rcloneDirectory = Path.Combine(Environment.CurrentDirectory, $"rclone-v1.62.2-windows-{architecture}");
File.Move(Path.Combine(rcloneDirectory, "rclone.exe"), pathToRclone);
Directory.Delete(rcloneDirectory, true);
}
}
}
}
}
catch (Exception ex)
{
if (currentAccessedWebsite == "github")
{
_ = FlexibleMessageBox.Show($"You are unable to access the raw.githubusercontent.com page with the Exception: {ex.Message}\nSome files may be missing (ADB, Offline Script, Launcher)");
_ = FlexibleMessageBox.Show("These required files were unable to be downloaded\nRookie will now close, please use Offline Mode for manual sideloading if needed");
Application.Exit();
}
if (currentAccessedWebsite == "rclone")
{
_ = FlexibleMessageBox.Show($"You are unable to access the rclone page with the Exception: {ex.Message}\nSome files may be missing (RCLONE)");
_ = FlexibleMessageBox.Show("Rclone was unable to be downloaded\nRookie will now close, please use Offline Mode for manual sideloading if needed");
Application.Exit();
}
}
}
}
}

View File

@@ -179,14 +179,14 @@ namespace AndroidSideloader
_ = Logger.Log($"Attempting to Update Download Config");
try
{
string configUrl = "https://wiki.vrpirates.club/downloads/vrp.download.config";
string configUrl = "https://vrpirates.wiki/downloads/vrp.download.config";
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"))
{
@@ -248,14 +248,14 @@ namespace AndroidSideloader
_ = Logger.Log($"Attempting to Update Upload Config");
try
{
string configUrl = "https://wiki.vrpirates.club/downloads/vrp.upload.config";
string configUrl = "https://vrpirates.wiki/downloads/vrp.upload.config";
HttpWebRequest getUrl = (HttpWebRequest)WebRequest.Create(configUrl);
using (StreamReader responseReader = new StreamReader(getUrl.GetResponse().GetResponseStream()))
{
string resultString = responseReader.ReadToEnd();
_ = Logger.Log($"Retrived updated config from: {configUrl}");
_ = Logger.Log($"Retrieved updated config from: {configUrl}");
File.WriteAllText(Environment.CurrentDirectory + "\\rclone\\vrp.upload.config", resultString);
@@ -264,7 +264,7 @@ namespace AndroidSideloader
}
catch (Exception e)
{
_ = Logger.Log($"Failed to update Upload config: {e.Message}");
_ = Logger.Log($"Failed to update Upload config: {e.Message}", LogLevel.ERROR);
}
}
@@ -277,14 +277,14 @@ namespace AndroidSideloader
_ = Logger.Log($"Attempting to Update Public Config");
try
{
string configUrl = "https://wiki.vrpirates.club/downloads/vrp-public.json";
string configUrl = "https://vrpirates.wiki/downloads/vrp-public.json";
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}");
File.WriteAllText(Environment.CurrentDirectory + "\\vrp-public.json", resultString);
@@ -293,7 +293,7 @@ namespace AndroidSideloader
}
catch (Exception e)
{
_ = Logger.Log($"Failed to update Public config: {e.Message}");
_ = Logger.Log($"Failed to update Public config: {e.Message}", LogLevel.ERROR);
}
}

1
Splash.Designer.cs generated
View File

@@ -42,6 +42,7 @@
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;

File diff suppressed because it is too large Load Diff

127
SpoofForm.Designer.cs generated
View File

@@ -1,127 +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.progressBar1 = new System.Windows.Forms.ProgressBar();
this.SpoofButton = new AndroidSideloader.RoundButton();
this.RandomizeButton = new AndroidSideloader.RoundButton();
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;
//
// 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.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
this.SpoofButton.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
this.SpoofButton.BackColor = System.Drawing.Color.Transparent;
this.SpoofButton.DialogResult = System.Windows.Forms.DialogResult.OK;
this.SpoofButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
this.SpoofButton.ForeColor = System.Drawing.Color.White;
this.SpoofButton.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
this.SpoofButton.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
this.SpoofButton.Location = new System.Drawing.Point(176, 72);
this.SpoofButton.Name = "SpoofButton";
this.SpoofButton.Radius = 5;
this.SpoofButton.Size = new System.Drawing.Size(110, 42);
this.SpoofButton.Stroke = true;
this.SpoofButton.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
this.SpoofButton.TabIndex = 5;
this.SpoofButton.Text = "Spoof!";
this.SpoofButton.Transparency = false;
this.SpoofButton.Click += new System.EventHandler(this.SpoofButton_Click);
//
// RandomizeButton
//
this.RandomizeButton.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
this.RandomizeButton.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
this.RandomizeButton.BackColor = System.Drawing.Color.Transparent;
this.RandomizeButton.DialogResult = System.Windows.Forms.DialogResult.OK;
this.RandomizeButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
this.RandomizeButton.ForeColor = System.Drawing.Color.White;
this.RandomizeButton.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
this.RandomizeButton.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
this.RandomizeButton.Location = new System.Drawing.Point(12, 72);
this.RandomizeButton.Name = "RandomizeButton";
this.RandomizeButton.Radius = 5;
this.RandomizeButton.Size = new System.Drawing.Size(110, 42);
this.RandomizeButton.Stroke = true;
this.RandomizeButton.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
this.RandomizeButton.TabIndex = 6;
this.RandomizeButton.Text = "Randomize";
this.RandomizeButton.Transparency = false;
this.RandomizeButton.Click += new System.EventHandler(this.RandomizeButton_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.BackgroundImage = global::AndroidSideloader.Properties.Resources.pattern_cubes_1_1_1_0_0_0_1__000000_212121;
this.ClientSize = new System.Drawing.Size(300, 131);
this.Controls.Add(this.RandomizeButton);
this.Controls.Add(this.SpoofButton);
this.Controls.Add(this.progressBar1);
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.ProgressBar progressBar1;
private RoundButton SpoofButton;
private RoundButton RandomizeButton;
}
}

View File

@@ -1,79 +0,0 @@
using JR.Utils.GUI.Forms;
using Spoofer;
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
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);
})
{
IsBackground = true
};
t1.Start();
while (t1.IsAlive)
{
await Task.Delay(100);
}
progressBar1.Style = ProgressBarStyle.Continuous;
_ = output.Contains("is not recognized as an internal or external command")
? FlexibleMessageBox.Show(Sideloader.SpooferWarning)
: 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>

46
UpdateForm.Designer.cs generated
View File

@@ -29,13 +29,14 @@ namespace AndroidSideloader
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateForm));
this.panel1 = new System.Windows.Forms.Panel();
this.YesUpdate = new AndroidSideloader.RoundButton();
this.panel3 = new System.Windows.Forms.Panel();
this.UpdateTextBox = new System.Windows.Forms.RichTextBox();
this.UpdateVerLabel = new System.Windows.Forms.Label();
this.CurVerLabel = new System.Windows.Forms.Label();
this.SkipUpdate = new System.Windows.Forms.Label();
this.YesUpdate = new AndroidSideloader.RoundButton();
this.panel1.SuspendLayout();
this.panel3.SuspendLayout();
this.SuspendLayout();
@@ -58,6 +59,27 @@ namespace AndroidSideloader
this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseMove);
this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.UpdateForm_MouseUp);
//
// YesUpdate
//
this.YesUpdate.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
this.YesUpdate.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
this.YesUpdate.BackColor = System.Drawing.Color.Transparent;
this.YesUpdate.DialogResult = System.Windows.Forms.DialogResult.OK;
this.YesUpdate.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
this.YesUpdate.ForeColor = System.Drawing.Color.White;
this.YesUpdate.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
this.YesUpdate.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
this.YesUpdate.Location = new System.Drawing.Point(339, 245);
this.YesUpdate.Name = "YesUpdate";
this.YesUpdate.Radius = 5;
this.YesUpdate.Size = new System.Drawing.Size(111, 31);
this.YesUpdate.Stroke = true;
this.YesUpdate.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
this.YesUpdate.TabIndex = 2;
this.YesUpdate.Text = "Update Now";
this.YesUpdate.Transparency = false;
this.YesUpdate.Click += new System.EventHandler(this.YesUpdate_Click);
//
// panel3
//
this.panel3.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
@@ -126,27 +148,6 @@ namespace AndroidSideloader
this.SkipUpdate.Text = "𝖲𝖪𝖨𝖯 𝖥𝖮𝖱 𝖭𝖮𝖶";
this.SkipUpdate.Click += new System.EventHandler(this.SkipUpdate_Click);
//
// YesUpdate
//
this.YesUpdate.Active1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
this.YesUpdate.Active2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
this.YesUpdate.BackColor = System.Drawing.Color.Transparent;
this.YesUpdate.DialogResult = System.Windows.Forms.DialogResult.OK;
this.YesUpdate.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F);
this.YesUpdate.ForeColor = System.Drawing.Color.White;
this.YesUpdate.Inactive1 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
this.YesUpdate.Inactive2 = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25)))));
this.YesUpdate.Location = new System.Drawing.Point(339, 245);
this.YesUpdate.Name = "YesUpdate";
this.YesUpdate.Radius = 5;
this.YesUpdate.Size = new System.Drawing.Size(111, 31);
this.YesUpdate.Stroke = true;
this.YesUpdate.StrokeColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(74)))), ((int)(((byte)(74)))));
this.YesUpdate.TabIndex = 2;
this.YesUpdate.Text = "Update Now";
this.YesUpdate.Transparency = false;
this.YesUpdate.Click += new System.EventHandler(this.YesUpdate_Click);
//
// UpdateForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -157,6 +158,7 @@ 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);

File diff suppressed because it is too large Load Diff

View File

@@ -1,67 +1,79 @@
using System.Diagnostics;
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace AndroidSideloader
{
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";
public static readonly string LocalVersion = "2.17";
public static readonly string LocalVersion = "2.25.1";
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");
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");
fileClient.Dispose();
_ = Logger.Log($"Starting {AppName} v{currentVersion}.exe");
_ = Process.Start($"{AppName} v{currentVersion}.exe");
//Delete current version
ADB.RunAdbCommandToString("kill-server");
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}");
}
}
}
}
}

View File

@@ -28,6 +28,7 @@
/// </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();
@@ -77,6 +78,7 @@
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";

File diff suppressed because it is too large Load Diff

View File

@@ -93,7 +93,7 @@ namespace AndroidSideloader.Utilities
string error = cmd.StandardError.ReadToEnd();
string output = cmd.StandardOutput.ReadToEnd();
_ = Logger.Log($"Output: {output}");
_ = Logger.Log($"Error: {error}");
_ = Logger.Log($"Error: {error}", LogLevel.ERROR);
return new ProcessOutput(output, error);
}

View File

@@ -1,28 +1,62 @@
using System;
using System.IO;
using System.Text;
namespace AndroidSideloader
{
internal class Logger
public enum LogLevel
{
public string logfile = Properties.Settings.Default.CurrentLogPath;
public static bool Log(string text, bool ret = true)
DEBUG,
INFO,
WARNING,
ERROR,
TRACE,
FATAL
}
public static class Logger
{
private static readonly object lockObject = new object();
private static string logFilePath = Properties.Settings.Default.CurrentLogPath;
public static bool Log(string text, LogLevel logLevel = LogLevel.INFO, bool ret = true)
{
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 { }
if (string.IsNullOrWhiteSpace(text) || text.Length <= 5)
return ret;
string time = DateTime.UtcNow.ToString("hh:mm:ss.fff tt (UTC): ");
string newline = text.Length > 40 && text.Contains("\n") ? "\n\n" : "\n";
string logEntry = time + "[" + logLevel.ToString().ToUpper() + "] [" + GetCallerInfo() + "] " + text + newline;
try
{
lock (lockObject)
{
File.AppendAllText(logFilePath, logEntry);
}
}
catch
{
// Handle the exception if necessary
}
return ret;
}
private static string GetCallerInfo()
{
System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true);
if (stackTrace.FrameCount >= 3)
{
var frame = stackTrace.GetFrame(2);
var method = frame.GetMethod();
string className = method.DeclaringType?.Name;
string methodName = method.Name;
string callerInfo = $"{className}.{methodName}";
return callerInfo;
}
return string.Empty;
}
}
}

View File

@@ -28,8 +28,8 @@ namespace AndroidSideloader.Utilities
{
_ = Logger.Log("Begin download 7-zip");
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");
client.DownloadFile("https://github.com/VRPirates/rookie/raw/master/7z.exe", "7z.exe");
client.DownloadFile("https://github.com/VRPirates/rookie/raw/master/7z.dll", "7z.dll");
_ = Logger.Log("Complete download 7-zip");
}
ProcessStartInfo pro = new ProcessStartInfo
@@ -54,17 +54,15 @@ namespace AndroidSideloader.Utilities
if (error.Contains("There is not enough space on the disk"))
{
_ = FlexibleMessageBox.Show($"Not enough space to extract archive.\r\nCheck free space in {Environment.CurrentDirectory} and try again.",
_ = FlexibleMessageBox.Show(Program.form, $"Not enough space to extract archive.\r\nCheck free space in {Environment.CurrentDirectory} and try again.",
"NOT ENOUGH SPACE",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
_ = Logger.Log(x.StandardOutput.ReadToEnd());
_ = Logger.Log(error);
_ = Logger.Log(error, LogLevel.ERROR);
throw new ApplicationException($"Extracting failed, status code {x.ExitCode}");
}
}
}
}

View File

@@ -1,6 +1,3 @@
RSL 2.17
RSL 2.25.1
- Various bugfixes
~SytheZN
~fenopy
- Fix: Device not authorized prompt showing up after authorization.

View File

@@ -2,5 +2,6 @@
<packages>
<package id="Costura.Fody" version="4.1.0" targetFramework="net452" />
<package id="Fody" version="6.0.0" targetFramework="net452" developmentDependency="true" />
<package id="Microsoft.Web.WebView2" version="1.0.1072.54" targetFramework="net452" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net452" />
</packages>

Binary file not shown.

View File

@@ -1,5 +0,0 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<WeaverFiles Include="$(MsBuildThisFileDirectory)..\weaver\$(MSBuildThisFileName).dll" />
</ItemGroup>
</Project>

Binary file not shown.

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:all>
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
<xs:annotation>
<xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all>
<xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
<xs:annotation>
<xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
<xs:annotation>
<xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCompression" type="xs:boolean">
<xs:annotation>
<xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCleanup" type="xs:boolean">
<xs:annotation>
<xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="LoadAtModuleInit" type="xs:boolean">
<xs:annotation>
<xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
<xs:annotation>
<xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="ExcludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged64Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="PreloadOrder" type="xs:string">
<xs:annotation>
<xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>

Binary file not shown.

Binary file not shown.

View File

@@ -1,110 +0,0 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectWeaverXml Condition="$(ProjectWeaverXml) == ''">$(ProjectDir)FodyWeavers.xml</ProjectWeaverXml>
<FodyPath Condition="$(FodyPath) == ''">$(MSBuildThisFileDirectory)..\</FodyPath>
<FodyAssemblyDirectory Condition="$(MSBuildRuntimeType) == 'Core'">$(FodyPath)netstandardtask</FodyAssemblyDirectory>
<FodyAssemblyDirectory Condition="$(MSBuildRuntimeType) != 'Core'">$(FodyPath)netclassictask</FodyAssemblyDirectory>
<FodyAssembly Condition="$(FodyAssembly) == ''">$(FodyAssemblyDirectory)\Fody.dll</FodyAssembly>
<DefaultItemExcludes>$(DefaultItemExcludes);FodyWeavers.xsd</DefaultItemExcludes>
<FodyGenerateXsd Condition="$(FodyGenerateXsd) == ''">true</FodyGenerateXsd>
<MsBuildMajorVersion>15</MsBuildMajorVersion>
<MsBuildMajorVersion Condition="'$(MSBuildVersion)' != ''">$([System.Version]::Parse($(MSBuildVersion)).Major)</MsBuildMajorVersion>
</PropertyGroup>
<ItemGroup Condition="Exists($(ProjectWeaverXml))">
<UpToDateCheckInput Include="$(ProjectWeaverXml)" />
<CustomAdditionalCompileInputs Include="$(ProjectWeaverXml)" />
</ItemGroup>
<!-- Support for NCrunch -->
<ItemGroup Condition="'$(NCrunch)' == '1' and '$(TargetFramework)' == '' and '$(TargetFrameworks)' == ''">
<None Include="$(FodyAssemblyDirectory)\*.*" />
<None Include="@(WeaverFiles)" />
</ItemGroup>
<UsingTask TaskName="Fody.WeavingTask" AssemblyFile="$(FodyAssembly)" />
<UsingTask TaskName="Fody.UpdateReferenceCopyLocalTask" AssemblyFile="$(FodyAssembly)" />
<UsingTask TaskName="Fody.VerifyTask" AssemblyFile="$(FodyAssembly)" />
<Target
Name="FodyTarget"
AfterTargets="AfterCompile"
Condition="Exists(@(IntermediateAssembly)) And $(DesignTimeBuild) != true And $(DisableFody) != true"
DependsOnTargets="$(FodyDependsOnTargets)"
Inputs="@(IntermediateAssembly);$(ProjectWeaverXml)"
Outputs="$(IntermediateOutputPath)$(MSBuildProjectFile).Fody.CopyLocal.cache">
<Error Condition="($(MsBuildMajorVersion) &lt; 16)"
Text="Fody is only supported on MSBuild 16 and above. Current version: $(MsBuildMajorVersion)." />
<Fody.WeavingTask
AssemblyFile="@(IntermediateAssembly)"
IntermediateDirectory="$(ProjectDir)$(IntermediateOutputPath)"
KeyOriginatorFile="$(KeyOriginatorFile)"
AssemblyOriginatorKeyFile="$(AssemblyOriginatorKeyFile)"
ProjectDirectory="$(MSBuildProjectDirectory)"
ProjectFile="$(MSBuildProjectFullPath)"
SolutionDirectory="$(SolutionDir)"
References="@(ReferencePath)"
SignAssembly="$(SignAssembly)"
ReferenceCopyLocalFiles="@(ReferenceCopyLocalPaths)"
DefineConstants="$(DefineConstants)"
DebugType="$(DebugType)"
DocumentationFile="@(DocFileItem->'%(FullPath)')"
WeaverFiles="@(WeaverFiles)"
NCrunchOriginalSolutionDirectory="$(NCrunchOriginalSolutionDir)"
IntermediateCopyLocalFilesCache="$(IntermediateOutputPath)$(MSBuildProjectFile).Fody.CopyLocal.cache"
GenerateXsd="$(FodyGenerateXsd)"
>
<Output
TaskParameter="ExecutedWeavers"
PropertyName="FodyExecutedWeavers" />
</Fody.WeavingTask>
<ItemGroup>
<FileWrites Include="$(IntermediateOutputPath)$(MSBuildProjectFile).Fody.CopyLocal.cache" />
</ItemGroup>
</Target>
<Target
Name="FodyUpdateCopyLocalFilesTarget"
AfterTargets="FodyTarget"
>
<Fody.UpdateReferenceCopyLocalTask
ReferenceCopyLocalFiles="@(ReferenceCopyLocalPaths)"
IntermediateCopyLocalFilesCache="$(IntermediateOutputPath)$(MSBuildProjectFile).Fody.CopyLocal.cache"
>
<Output
TaskParameter="UpdatedReferenceCopyLocalFiles"
ItemName="FodyUpdatedReferenceCopyLocalPaths" />
</Fody.UpdateReferenceCopyLocalTask>
<ItemGroup>
<ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" />
<ReferenceCopyLocalPaths Include="@(FodyUpdatedReferenceCopyLocalPaths)" />
</ItemGroup>
</Target>
<Target
Name="FodyVerifyTarget"
AfterTargets="AfterBuild"
Condition="'$(NCrunch)' != '1' And $(FodyExecutedWeavers) != '' And $(DisableFody) != true"
DependsOnTargets="$(FodyVerifyDependsOnTargets)">
<Fody.VerifyTask
ProjectDirectory="$(MSBuildProjectDirectory)"
TargetPath="$(TargetPath)"
SolutionDirectory="$(SolutionDir)"
DefineConstants="$(DefineConstants)"
NCrunchOriginalSolutionDirectory="$(NCrunchOriginalSolutionDir)"
/>
</Target>
</Project>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,20 +0,0 @@
The MIT License (MIT)
Copyright (c) 2007 James Newton-King
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -1,247 +0,0 @@
using AndroidSideloader;
using AndroidSideloader.Utilities;
using System;
using System.Diagnostics;
using System.IO;
namespace Spoofer
{
internal class spoofer
{
public static string alias = string.Empty;
public static string password = string.Empty;
public static void Init()
{
//If there is no keystore or details (user and pw for keystore) generate them!
if ((File.Exists("keystore.key") == false || File.Exists("details.txt") == false) && HasDependencies())
{
Random rand = new Random();
alias = GeneralUtilities.randomString(8);
password = GeneralUtilities.randomString(16);
string subject = $"CN = {GeneralUtilities.randomString(rand.Next(2, 6))}, OU = {GeneralUtilities.randomString(rand.Next(2, 6))}, O = {GeneralUtilities.randomString(rand.Next(2, 6))}, L = {GeneralUtilities.randomString(rand.Next(2, 6))}, ST = {GeneralUtilities.randomString(rand.Next(2, 6))}, C = {GeneralUtilities.randomString(rand.Next(2, 6))}";
Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
_ = cmd.Start();
cmd.StandardInput.WriteLine($"keytool -genkeypair -alias {alias} -keyalg RSA -keysize 2048 -keystore keystore.key -keypass {password} -storepass {password} -dname \"{subject}\"");
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
string keyerror = cmd.StandardError.ReadToEnd();
string keyoutput = cmd.StandardOutput.ReadToEnd();
_ = Logger.Log($"Output: {keyoutput} Error: {keyerror}");
File.WriteAllText("details.txt", $"{alias};{password}");
}
else
{
string[] temp = File.ReadAllText("details.txt").Split(';');
alias = temp[0];
password = temp[1];
}
}
public static string folderPath = string.Empty;
public static string decompiledPath = string.Empty;
public static string newPackageName = string.Empty;
public static string originalPackageName = string.Empty;
public static string spoofedApkPath = string.Empty;
//public static ProcessOutput ResignAPK(string apkPath)
//{
// string output = "";
// string oldGameName = Path.GetFileName(apkPath);
// folderPath = apkPath.Replace(Path.GetFileName(apkPath), "");
// File.Move(apkPath, $"{folderPath}temp.apk");
// apkPath = $"{folderPath}temp.apk";
// decompiledPath = apkPath.Replace(".apk", "");
// string packagename = PackageName(apkPath);
//}
public static ProcessOutput SpoofApk(string apkPath, string newPackageName, string obbPath = "", string spoofedFileName = "spoofed.apk")
{
//Rename
ProcessOutput output = new ProcessOutput("", "");
_ = Path.GetFileName(apkPath);
folderPath = apkPath.Replace(Path.GetFileName(apkPath), "");
File.Move(apkPath, $"{folderPath}temp.apk");
apkPath = $"{folderPath}temp.apk";
decompiledPath = apkPath.Replace(".apk", "");
//newPackageName = $"com.{Utilities.randomString(rand.Next(3, 8))}.{Utilities.randomString(rand.Next(3, 8))}";
originalPackageName = PackageName(apkPath);
_ = Logger.Log($"Your app will be spoofed as {newPackageName}");
_ = Logger.Log($"Folderpath: {folderPath} decompiledPaht: {decompiledPath} ");
if (obbPath.Length > 1)
{
RenameObb(obbPath, newPackageName, originalPackageName);
}
output += DecompileApk(apkPath);
//Rename APK Packagename
string foo = File.ReadAllText($"{decompiledPath}\\AndroidManifest.xml").Replace(originalPackageName, newPackageName);
File.WriteAllText($"{decompiledPath}\\AndroidManifest.xml", foo);
foreach (string file in Directory.EnumerateFiles(decompiledPath, "*.*", SearchOption.AllDirectories))
{
if (Path.GetFileName(file) == "BuildConfig.smali")
{
foo = File.ReadAllText(file).Replace(originalPackageName, newPackageName);
File.WriteAllText(file, foo);
}
}
//spoofedApkPath = $"{Path.GetFileName(apkPath).Replace(".apk", "")}_Spoofed as {newPackageName}.apk";
spoofedApkPath = Path.GetDirectoryName(apkPath) + "\\" + spoofedFileName;
string apkDecompiledPath = Path.GetFileName(apkPath).Replace(".apk", "");
output += GeneralUtilities.startProcess("cmd.exe", folderPath, $"apktool b \"{apkDecompiledPath}\" -o \"{spoofedApkPath}\"");
//Sign the new apk
if (File.Exists(folderPath + "keystore.key") == false)
{
File.Copy("keystore.key", $"{folderPath}keystore.key");
}
output += SignApk(spoofedApkPath);
//Delete the copy of the key and the decompiled apk folder
if (string.Equals(folderPath, Environment.CurrentDirectory + "\\") == false)
{
File.Delete($"{folderPath}keystore.key");
}
Directory.Delete(decompiledPath, true);
File.Delete(apkPath);
return output;
}
public static ProcessOutput SignApk(string path)
{
//Logger.Log($"jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore keystore.key \"{path}\" {alias}");
Process cmdSign = new Process();
cmdSign.StartInfo.FileName = "cmd.exe";
cmdSign.StartInfo.RedirectStandardInput = true;
cmdSign.StartInfo.WorkingDirectory = folderPath;
cmdSign.StartInfo.CreateNoWindow = true;
cmdSign.StartInfo.UseShellExecute = false;
cmdSign.StartInfo.RedirectStandardOutput = true; //
cmdSign.StartInfo.RedirectStandardError = true; //
_ = cmdSign.Start();
cmdSign.StandardInput.WriteLine($"jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore keystore.key \"{path}\" {alias}");
cmdSign.StandardInput.WriteLine(password);
cmdSign.StandardInput.Flush();
cmdSign.StandardInput.Close();
cmdSign.StandardOutput.Close();
cmdSign.WaitForExit();
//For some reason it hangs when also reading output...
//string output = cmdSign.StandardOutput.ReadToEnd();
//string error = cmdSign.StandardError.ReadToEnd();
//Logger.Log("Jarsign Output " + output);
//Logger.Log("Error: " + error);
//return new ProcessOutput(output, error);
return new ProcessOutput("", "");
}
public static ProcessOutput DecompileApk(string path)
{
ProcessOutput output = GeneralUtilities.startProcess("cmd.exe", folderPath, $"apktool d -f \"{path}\"");
return output;
}
public static bool HasDependencies()
{
return ExistsOnPath("jarsigner") && ExistsOnPath("apktool") && ExistsOnPath("aapt");
}
public static bool ExistsOnPath(string exeName)
{
try
{
using (Process p = new Process())
{
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "where";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = exeName;
_ = p.Start();
p.WaitForExit();
return p.ExitCode == 0;
}
}
catch
{
throw new Exception("'where' command is not on path");
}
}
public static string GetFullPath(string exeName)
{
try
{
using (Process p = new Process())
{
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "where";
p.StartInfo.Arguments = exeName;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
_ = p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
if (p.ExitCode != 0)
{
return null;
}
// just return first match
return output.Substring(0, output.IndexOf(Environment.NewLine));
}
}
catch
{
throw new Exception("'where' command is not on path");
}
}
//Renames obb to new obb according to packagename
public static void RenameObb(string obbPath, string newPackageName, string originalPackageName)
{
Directory.Move(obbPath, obbPath.Replace(originalPackageName, newPackageName));
obbPath = obbPath.Replace(originalPackageName, newPackageName);
foreach (string file in Directory.GetFiles(obbPath))
{
if (Path.GetExtension(file) == ".obb")
{
File.Move(file, file.Replace(originalPackageName, newPackageName));
}
}
}
public static string PackageName(string path)
{
_ = Logger.Log($"aapt dump badging \"{path}\"");
string originalPackageName = GeneralUtilities.startProcess("cmd.exe", path.Replace(Path.GetFileName(path), string.Empty), $"aapt dump badging \"{path}\" | findstr -i \"package: name\"").Output;
_ = Logger.Log($"originalPackageName: {originalPackageName}");
try
{
originalPackageName = originalPackageName.Substring(originalPackageName.IndexOf("package: name='") + 15);
originalPackageName = originalPackageName.Substring(0, originalPackageName.IndexOf("'"));
}
catch
{
return "PackageName ERROR";
}
return originalPackageName;
}
}
}

View File

@@ -1 +1 @@
2.17
2.25.1