Compare commits

...

15 Commits

Author SHA1 Message Date
harryeffinpotter
b5c66b50b9 adb changed to one universal dir 2021-08-29 21:21:03 -04:00
harryeffinpotter
ebfe5ace65 Updated 7z exe and dll 2021-08-29 21:17:16 -04:00
William Swartwood
c242dc6f6d -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

RSL 2.9.3

+ Added new background color for apps that are a newer
version than the version on the list. If you see this
darker background please agree to share when prompted
upon program launch or alternatively select the game
from top drop-down installed apps list and click Share
Selected App to help the community!

+ Added logic for file size column, clicking the column
header will now properly sort from biggest to smallest
or vice versa.

= Fixed issue where Rookie would ask for every single
app installed on user's device. It should now only ask
for apps not on Rookie and not on the Blacklist as
intended.

= Changed zip file naming for new game uploads to use
Release Name instead of package name.

HFP
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEpvs8ACgkQx/Rql1Vo
czc4kg//fgCG0ChVfIVl48I2dww4ZJmRI+sQm/S4Ry38M4NzM+SdKOQVnDFgZ68p
e/z2VqECc4wPlhqrxh+xHoMzlkfrz8LdpsU3cch6jo9uERpaWMj2X1E5jKFRc7iS
4/v6XvSBnp/ZSak3f7DUubNnsCcq6vDH4w1ugzv71AyW9STG7oUXQb+kNQNsQ1RO
WNJjO87RAlHivUuff7wRLlhVKLo21DvZ+MJRmMRzXH5tMxnEGxWeTOkAoWvsDjMa
1L6rmugC9K7X3Qqi09f1ZyUQG6F++fpoDf8u5QB96DegV+IZGjOsBcvL7wE9fdox
RxhFxZMsnQtO4kuo3c/iFg7ohxP+pQ5ayk0IzDRwdjfIYX+w+20LdkGpxsThxHvp
fWZBUCW0nwBFxBjxItXq8dIn7KHsDc3AkNcI2Ox+4eIUoKwuqzr0wCjPaB4dLLLZ
Ofa1tt25ugl7rSTI4doKEH1YmTlzdOuuSKaA2vIMH6L54gpy+h2DkdAQkSEl0PRJ
fApOwvUJqnat/Pipg2PTaJSiZd/lLoImWXdhOdlT2XA/9olD0oLGW/DmK+jjH2GK
Sxd+sLDHUDyujH263yemu1No7+3Zf+iyE+8LTikYj0mVG3SX8tfG/5cOXbQAp2pv
h9CmnbkKBVy8+RXMHKW8MJhsqCS2/wDIJSGYbxwAge3vSe70UWA=
=d6JO
-----END PGP SIGNATURE-----
2021-08-28 00:45:39 -04:00
konqi
bcfcc43956 sort by size 2021-08-28 04:10:57 +02:00
konqi
ab6507965b Now rookie fails if game list is empty. Also refactores some things to make it more eficient 2021-08-28 03:41:14 +02:00
William Swartwood
78b816c5e6 -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

RSL 2.9.2

+ Added option in settings menu
to automatically reinstall apps
when installs fail due to previous
version clashing with update.

NOTE: If your USB or wireless ADB
connection is extremely slow this
setting can cause larger APK installs
to fail in rare cases.

= Fixed auto reinstall for signature
mismatch when if ADB reports error
properly (thanks to ADB update),
this will lead to faster reinstalls
in general when there are issues.

= Fixed crash that would occur when
closing Rookie.

= Added check to see if AAPT was
sucessful in retrieving mew game
name from APK, if not RSL will just
call the name by its package name
instead.

HFP
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEotsUACgkQx/Rql1Vo
czc2/w/8DkMuVYLb31J0WyqeIdo/12t+TO0oIbmTvGl8Oi1LttnfH1a+PUBYYXFF
VTEcBoEgGde/Jk7+AblKhzce+uQIzwzU9KC7HL+Ab/1AAj3tdczx2vE4uKTPfMUe
k8XuZz0Qe37IOVUgnHugQCac8jjaDCFXzwoIwADnBg7mW/4Ha+LqxJr/+dsMUnz/
WsenolRWWKyhTj3RHIulZu82yEV9Gw+KfIUpO/XJR71xNdCq1IyrAfBRT8KqgI3F
2IuX/pIqMSMvG1N62rWUzxD67BM5NbpjxiDZKg3LmBo39avqowSGclT7gOP+eiGY
eSvvl+zoI08ofL+8Vonhu/mwnQNUcGFQqqpwAvDIcgE/zVDM9uTVAOTRkrjW0ge2
xEUhpdKZVJ/UzbwnUEyR7zeAkt+sVkEbAD9My7NdQ58eD52F20+yYTAWC6CU8dB4
8QJbJBEzd0Pm23H7iY5F5/7UnPy+rxzfyezrJCKV5u+D65Fn4n13VY33CDxBJW4y
kmcpWwal81mbGgwhWpxK6+xy1V2oWL9PLN9YIkfv+n5/KlqJjUfj3wqah+aUG5qI
X/5mqLAWnsQcM/F0bZXzt3dVszInPHH7jjSjoyKOKQwfVxYrh6uuonVhG7NfHfij
LGs8d6O8osorkiB+2Aiziw8A+9o8fWLmfjeDhFcGc5YTb3eMxz0=
=XRAG
-----END PGP SIGNATURE-----
2021-08-27 05:58:45 -04:00
William Swartwood
ec32535419 RSL 2.9.1
+ Added blacklist implementation to request games
found on User's device that are not currently on
Rookie.

+ Added CTRL + L shortcut to copy list of game names
seperated by new lines to clipboard.

+ Added ALT + L shortcut to copy list of game names to
a paragraph copied by commas to clipboard.

+ Rookie will now maintain games list position when it
is refreshed. (e.g.: After finishing install queue,
when pressing refresh all/updates list buttons)

= Fixed issue where Rookie won't load game list properly
after updating, users won't notice the issue fixed until
the next update after this update.

HFP
2021-08-26 07:06:01 -04:00
William Swartwood
c607d1a2fd aapt badging added to get actual release name for new games, duplicate code put in to ask for whitelist first cuz im dumb. 2021-08-25 02:57:08 -04:00
harryeffinpotter
81c1e61d8b Merge pull request #83 from konqiDAM/master
I haven't tried to get an empty list, if rclone fails maybe it gives a null pointer
2021-08-24 18:09:31 -04:00
konqi
1dc0e38865 . 2021-08-24 23:55:16 +02:00
konqi
19dcacfbbe ask every 24h for game list 2021-08-24 23:52:11 +02:00
konqi
10d8498f1b add whitelist and ask for games 2021-08-24 23:21:53 +02:00
konqi
d3620bf033 happy pmow noises 2021-08-24 22:20:46 +02:00
konqi
467041825c not read header 2021-08-24 22:03:31 +02:00
William Swartwood
fa380c75f7 RSL 2.9.0 2021-08-24 04:17:15 -04:00
22 changed files with 732 additions and 373 deletions

BIN
7z.dll

Binary file not shown.

BIN
7z.exe

Binary file not shown.

49
ADB.cs
View File

@@ -385,39 +385,34 @@ namespace AndroidSideloader
if (dialogResult2 == DialogResult.Yes)
ADB.WakeDevice();
}
if (out2.Contains($"INSTALL_FAILED_UPDATE_INCOMPATIBLE") || out2.Contains("INSTALL_FAILED_VERSION_DOWNGRADE") || out2.Contains("signatures do not match") || out2.Contains("failed to install"))
if (out2.Contains($"signatures do not match previously") || out2.Contains("INSTALL_FAILED_VERSION_DOWNGRADE") || out2.Contains("signatures do not match") || out2.Contains("failed to install"))
{
ret.Error = string.Empty;
ret.Output = string.Empty;
FlexibleMessageBox.Show($"In place upgrade for {packagename} failed. We will need to upgrade by uninstalling, and keeping savedata isn't guaranteed. Continue?", "UPGRADE FAILED!", MessageBoxButtons.OKCancel);
string date_str = DateTime.Today.ToString("yyyy.MM.dd");
string CurrBackups = Path.Combine(BackupFolder, date_str);
FlexibleMessageBox.Show($"Searching for save files...", "Searching!", MessageBoxButtons.OK);
if (Directory.Exists($"/sdcard/Android/data/{packagename}"))
{
FlexibleMessageBox.Show($"Trying to backup save to Documents\\Rookie Backups\\{date_str}(YYYY.MM.DD)\\{packagename}", "Save files found", MessageBoxButtons.OK);
Directory.CreateDirectory(CurrBackups);
ADB.RunAdbCommandToString($"pull \"/sdcard/Android/data/{packagename}\" \"{CurrBackups}\"");
}
else
{
DialogResult dialogResult = FlexibleMessageBox.Show($"No savedata found! Continue with the uninstall!", "None Found", MessageBoxButtons.OK);
if (dialogResult == DialogResult.Cancel)
{
return ret;
}
}
ADB.WakeDevice();
ret += ADB.RunAdbCommandToString("shell pm uninstall " + package);
ret += RunAdbCommandToString($"install -g -r \"{path}\"");
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)
return ret;
}
Program.form.ChangeTitle("Performing reinstall, please wait...");
ADB.RunAdbCommandToString("kill-server");
ADB.RunAdbCommandToString("devices");
ADB.RunAdbCommandToString($"pull /sdcard/Android/data/{MainForm.CurrPCKG} \"{Environment.CurrentDirectory}\"");
Program.form.ChangeTitle("Uinstalling game...");
Sideloader.UninstallGame(MainForm.CurrPCKG);
Program.form.ChangeTitle("Reinstalling Game");
ret += ADB.RunAdbCommandToString($"install -g \"{path}\"");
ADB.RunAdbCommandToString($"push \"{Environment.CurrentDirectory}\\{MainForm.CurrPCKG}\" /sdcard/Android/data/");
if (Directory.Exists($"{Environment.CurrentDirectory}\\{MainForm.CurrPCKG}"))
Directory.Delete($"{Environment.CurrentDirectory}\\{MainForm.CurrPCKG}", true);
Program.form.ChangeTitle(" \n\n");
return ret;
}
ret += RunAdbCommandToString($"install -g -r \"{path}\"");
}
string gamenameforQU = Sideloader.PackageNametoGameName(packagename);
if (Properties.Settings.Default.QUturnedon)

View File

@@ -269,6 +269,7 @@
<None Include="Resources\battery1.png" />
<None Include="Resources\ajax-loader.gif" />
<Content Include="Resources\bluekey.png" />
<None Include="Resources\gametoupload.png" />
<Content Include="Resources\redkey.png" />
<None Include="Resources\greenkey.png" />
<None Include="Resources\orangekey.png" />

View File

@@ -167,6 +167,12 @@
<setting name="GlobalUsername" serializeAs="String">
<value />
</setting>
<setting name="lastTimeShared" serializeAs="String">
<value />
</setting>
<setting name="AutoReinstall" serializeAs="String">
<value>False</value>
</setting>
</AndroidSideloader.Properties.Settings>
<AndroidADB.Sideloader.Properties.Settings>
<setting name="checkForUpdates" serializeAs="String">

View File

@@ -1,6 +1,143 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
RSL 2.9.3
+ Added new background color for apps that are a newer
version than the version on the list. If you see this
darker background please agree to share when prompted
upon program launch or alternatively select the game
from top drop-down installed apps list and click Share
Selected App to help the community!
+ Added logic for file size column, clicking the column
header will now properly sort from biggest to smallest
or vice versa.
= Fixed issue where Rookie would ask for every single
app installed on user's device. It should now only ask
for apps not on Rookie and not on the Blacklist as
intended.
= Changed zip file naming for new game uploads to use
Release Name instead of package name.
HFP
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEpvs8ACgkQx/Rql1Vo
czc4kg//fgCG0ChVfIVl48I2dww4ZJmRI+sQm/S4Ry38M4NzM+SdKOQVnDFgZ68p
e/z2VqECc4wPlhqrxh+xHoMzlkfrz8LdpsU3cch6jo9uERpaWMj2X1E5jKFRc7iS
4/v6XvSBnp/ZSak3f7DUubNnsCcq6vDH4w1ugzv71AyW9STG7oUXQb+kNQNsQ1RO
WNJjO87RAlHivUuff7wRLlhVKLo21DvZ+MJRmMRzXH5tMxnEGxWeTOkAoWvsDjMa
1L6rmugC9K7X3Qqi09f1ZyUQG6F++fpoDf8u5QB96DegV+IZGjOsBcvL7wE9fdox
RxhFxZMsnQtO4kuo3c/iFg7ohxP+pQ5ayk0IzDRwdjfIYX+w+20LdkGpxsThxHvp
fWZBUCW0nwBFxBjxItXq8dIn7KHsDc3AkNcI2Ox+4eIUoKwuqzr0wCjPaB4dLLLZ
Ofa1tt25ugl7rSTI4doKEH1YmTlzdOuuSKaA2vIMH6L54gpy+h2DkdAQkSEl0PRJ
fApOwvUJqnat/Pipg2PTaJSiZd/lLoImWXdhOdlT2XA/9olD0oLGW/DmK+jjH2GK
Sxd+sLDHUDyujH263yemu1No7+3Zf+iyE+8LTikYj0mVG3SX8tfG/5cOXbQAp2pv
h9CmnbkKBVy8+RXMHKW8MJhsqCS2/wDIJSGYbxwAge3vSe70UWA=
=d6JO
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
RSL 2.9.2
+ Added option in settings menu
to automatically reinstall apps
when installs fail due to previous
version clashing with update.
NOTE: If your USB or wireless ADB
connection is extremely slow this
setting can cause larger APK installs
to fail in rare cases.
= Fixed auto reinstall for signature
mismatch when if ADB reports error
properly (thanks to ADB update),
this will lead to faster reinstalls
in general when there are issues.
= Fixed crash that would occur when
closing Rookie.
= Added check to see if AAPT was
sucessful in retrieving mew game
name from APK, if not RSL will just
call the name by its package name
instead.
HFP
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEotsUACgkQx/Rql1Vo
czc2/w/8DkMuVYLb31J0WyqeIdo/12t+TO0oIbmTvGl8Oi1LttnfH1a+PUBYYXFF
VTEcBoEgGde/Jk7+AblKhzce+uQIzwzU9KC7HL+Ab/1AAj3tdczx2vE4uKTPfMUe
k8XuZz0Qe37IOVUgnHugQCac8jjaDCFXzwoIwADnBg7mW/4Ha+LqxJr/+dsMUnz/
WsenolRWWKyhTj3RHIulZu82yEV9Gw+KfIUpO/XJR71xNdCq1IyrAfBRT8KqgI3F
2IuX/pIqMSMvG1N62rWUzxD67BM5NbpjxiDZKg3LmBo39avqowSGclT7gOP+eiGY
eSvvl+zoI08ofL+8Vonhu/mwnQNUcGFQqqpwAvDIcgE/zVDM9uTVAOTRkrjW0ge2
xEUhpdKZVJ/UzbwnUEyR7zeAkt+sVkEbAD9My7NdQ58eD52F20+yYTAWC6CU8dB4
8QJbJBEzd0Pm23H7iY5F5/7UnPy+rxzfyezrJCKV5u+D65Fn4n13VY33CDxBJW4y
kmcpWwal81mbGgwhWpxK6+xy1V2oWL9PLN9YIkfv+n5/KlqJjUfj3wqah+aUG5qI
X/5mqLAWnsQcM/F0bZXzt3dVszInPHH7jjSjoyKOKQwfVxYrh6uuonVhG7NfHfij
LGs8d6O8osorkiB+2Aiziw8A+9o8fWLmfjeDhFcGc5YTb3eMxz0=
=XRAG
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
RSL 2.9.1
+ Added blacklist implementation to request games
found on User's device that are not currently on
Rookie.
+ Added CTRL + L shortcut to copy list of game names
separated by new lines to clipboard.
+ Added ALT + L shortcut to copy list of game names to
a paragraph separated by commas to clipboard.
+ Rookie will now maintain games list position when it
is refreshed. (e.g.: After finishing install queue,
when pressing refresh all/updates list buttons)
= Fixed issue where Rookie won't load game list properly
after updating, users won't notice the issue fixed until
the next update after this update.
HFP
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEndGsACgkQx/Rql1Vo
czfQVQ//VjiJDJuId85cbm1gb5Rsek5aqbNv12kWUTULBy7cGgu43KeitnyaoryA
jXTe6wMVi4FXkcv71HzIf/ABfmInlBW045ZmWlujKXYt5g6zrN2GCYYM2+fnO91z
Umpqzz3xm+oF/U77704NuT4eqMFq/kBQ0QDGeJ34bxB22kQR1zw1Q3fFKZe+mmg4
h54op3835sJAdKH1bFsN7zvL+RpxahWwo+etJ5oNIUx+W/xHSi7G9maKPvTH/bmQ
5Fo1xGtad61BDVCIjJOfAafdlXUm4osmXcQcCZPyc6A+zx7/MMEHp4iCeIUUG08k
2Ekodjd01nxZCaPZJKQS6H9BedDNlDwFNSUBa6K/A1+g0KneIHXnZfpQf4q8TrY3
wkFyLOOJhDzFHdWDO4FuKz97eC9r9Y8iWRYHpzh8q/3A2bmeLx9+3d1FDns/fBhK
Au5PwmZYhwAGp3eXfL8YiYwqssJ0dy23b6O9Vvgloz/aY0adJYCXaKugFdV/oVHx
9s5W5LNI+AgkGOGdjZqtiFWO6ZeVfF4QqnFhx24G1qTk7euaIRzPPncMx0kn4KBl
E+UAj3uhmJccMQSFyBwGKCsEpWqiFkUzVcSCt0HlEmNfRTNg+eQbuzvKJCs1CyDN
Pty7ySgNk5/IKzTC18a0TSOS/IP2+8/Jhbpbmb8jd23UTSK33rI=
=8iDP
-----END PGP SIGNATURE-----
RSL 2.9.0
= Hotfix to remove errant entry from GamesList
that would crash the program.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
RSL 2.9

View File

@@ -50,6 +50,25 @@ public class ListViewColumnSorter : IComparer
// Cast the objects to be compared to ListViewItem objects
listviewX = (ListViewItem)x;
listviewY = (ListViewItem)y;
if (ColumnToSort == 5 ) {
try
{
int yNum = int.Parse(cleanNumber(listviewY.SubItems[ColumnToSort].Text));
int xNum = int.Parse(cleanNumber(listviewX.SubItems[ColumnToSort].Text));
if (xNum == yNum )
{
return 0;
}
else if(xNum > yNum && OrderOfSort == SortOrder.Ascending)
{
return -1;
}
else
{
return 1;
}
} catch { }
}
// Compare the two items
compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
@@ -102,4 +121,9 @@ public class ListViewColumnSorter : IComparer
}
}
private string cleanNumber(string number)
{
return number.Substring(0, number.LastIndexOf('.'));
}
}

124
MainForm.Designer.cs generated
View File

@@ -42,9 +42,7 @@
this.downloadInstallGameButton = new System.Windows.Forms.Button();
this.panel1 = new System.Windows.Forms.Panel();
this.ULLabel = new System.Windows.Forms.Label();
this.ULGif = new System.Windows.Forms.PictureBox();
this.BatteryLbl = new System.Windows.Forms.Label();
this.pictureBox5 = new System.Windows.Forms.PictureBox();
this.downloadingLabel = new System.Windows.Forms.Label();
this.aboutBtn = new System.Windows.Forms.Button();
this.settingsButton = new System.Windows.Forms.Button();
@@ -89,21 +87,28 @@
this.ADBcommandbox = new System.Windows.Forms.TextBox();
this.label11 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.pictureBox7 = new System.Windows.Forms.PictureBox();
this.label10 = new System.Windows.Forms.Label();
this.pictureBox6 = new System.Windows.Forms.PictureBox();
this.pictureBox4 = new System.Windows.Forms.PictureBox();
this.pictureBox3 = new System.Windows.Forms.PictureBox();
this.pictureBox2 = new System.Windows.Forms.PictureBox();
this.gamesPictureBox = new System.Windows.Forms.PictureBox();
this.ULGif = new System.Windows.Forms.PictureBox();
this.pictureBox5 = new System.Windows.Forms.PictureBox();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ULGif)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit();
this.otherContainer.SuspendLayout();
this.backupContainer.SuspendLayout();
this.sideloadContainer.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.gamesPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ULGif)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit();
this.SuspendLayout();
//
// m_combo
@@ -119,7 +124,7 @@
this.m_combo.Name = "m_combo";
this.m_combo.Size = new System.Drawing.Size(353, 26);
this.m_combo.TabIndex = 0;
this.m_combo.Text = "Select an app to uninstall or extract...";
this.m_combo.Text = "Select an Installed App to Uninstall or Share...";
//
// startsideloadbutton
//
@@ -383,17 +388,6 @@
this.ULLabel.Text = "Uploading";
this.ULLabel.Visible = false;
//
// ULGif
//
this.ULGif.Enabled = false;
this.ULGif.Image = global::AndroidSideloader.Properties.Resources.ajax_loader;
this.ULGif.Location = new System.Drawing.Point(178, 699);
this.ULGif.Name = "ULGif";
this.ULGif.Size = new System.Drawing.Size(34, 17);
this.ULGif.TabIndex = 86;
this.ULGif.TabStop = false;
this.ULGif.Visible = false;
//
// BatteryLbl
//
this.BatteryLbl.AutoSize = true;
@@ -407,17 +401,6 @@
this.BatteryLbl.TabIndex = 84;
this.BatteryLbl.Text = "N/A%";
//
// pictureBox5
//
this.pictureBox5.BackColor = System.Drawing.Color.Transparent;
this.pictureBox5.Image = global::AndroidSideloader.Properties.Resources.battery11;
this.pictureBox5.Location = new System.Drawing.Point(155, 576);
this.pictureBox5.Margin = new System.Windows.Forms.Padding(2);
this.pictureBox5.Name = "pictureBox5";
this.pictureBox5.Size = new System.Drawing.Size(55, 29);
this.pictureBox5.TabIndex = 85;
this.pictureBox5.TabStop = false;
//
// downloadingLabel
//
this.downloadingLabel.AutoSize = true;
@@ -1089,7 +1072,7 @@
this.label6.AutoSize = true;
this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold);
this.label6.ForeColor = System.Drawing.SystemColors.ControlLightLight;
this.label6.Location = new System.Drawing.Point(828, 12);
this.label6.Location = new System.Drawing.Point(828, 9);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(145, 17);
this.label6.TabIndex = 90;
@@ -1102,7 +1085,7 @@
this.label7.AutoSize = true;
this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold);
this.label7.ForeColor = System.Drawing.SystemColors.ControlLightLight;
this.label7.Location = new System.Drawing.Point(828, 41);
this.label7.Location = new System.Drawing.Point(828, 29);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(98, 17);
this.label7.TabIndex = 90;
@@ -1193,13 +1176,54 @@
this.label9.TextAlign = System.Drawing.ContentAlignment.TopCenter;
this.label9.Visible = false;
//
// pictureBox7
//
this.pictureBox7.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox7.BackColor = System.Drawing.Color.Transparent;
this.pictureBox7.DataBindings.Add(new System.Windows.Forms.Binding("ImageLocation", global::AndroidSideloader.Properties.Settings.Default, "BackPicturePath", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.pictureBox7.ErrorImage = null;
this.pictureBox7.ImageLocation = global::AndroidSideloader.Properties.Settings.Default.BackPicturePath;
this.pictureBox7.InitialImage = null;
this.pictureBox7.Location = new System.Drawing.Point(217, 18);
this.pictureBox7.Name = "pictureBox7";
this.pictureBox7.Size = new System.Drawing.Size(764, 718);
this.pictureBox7.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox7.TabIndex = 74;
this.pictureBox7.TabStop = false;
this.pictureBox7.Click += new System.EventHandler(this.pictureBox1_Click);
//
// label10
//
this.label10.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label10.AutoSize = true;
this.label10.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold);
this.label10.ForeColor = System.Drawing.SystemColors.ControlLightLight;
this.label10.Location = new System.Drawing.Point(828, 49);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(135, 17);
this.label10.TabIndex = 90;
this.label10.Text = "= Newer than List";
this.label10.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// pictureBox6
//
this.pictureBox6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox6.Image = global::AndroidSideloader.Properties.Resources.gametoupload;
this.pictureBox6.Location = new System.Drawing.Point(803, 49);
this.pictureBox6.Name = "pictureBox6";
this.pictureBox6.Size = new System.Drawing.Size(19, 17);
this.pictureBox6.TabIndex = 92;
this.pictureBox6.TabStop = false;
//
// pictureBox4
//
this.pictureBox4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox4.Image = global::AndroidSideloader.Properties.Resources.greenkey;
this.pictureBox4.Location = new System.Drawing.Point(803, 39);
this.pictureBox4.Location = new System.Drawing.Point(803, 29);
this.pictureBox4.Name = "pictureBox4";
this.pictureBox4.Size = new System.Drawing.Size(21, 20);
this.pictureBox4.Size = new System.Drawing.Size(19, 17);
this.pictureBox4.TabIndex = 92;
this.pictureBox4.TabStop = false;
//
@@ -1207,9 +1231,9 @@
//
this.pictureBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox3.Image = global::AndroidSideloader.Properties.Resources.orangekey;
this.pictureBox3.Location = new System.Drawing.Point(803, 10);
this.pictureBox3.Location = new System.Drawing.Point(803, 9);
this.pictureBox3.Name = "pictureBox3";
this.pictureBox3.Size = new System.Drawing.Size(21, 20);
this.pictureBox3.Size = new System.Drawing.Size(19, 17);
this.pictureBox3.TabIndex = 92;
this.pictureBox3.TabStop = false;
//
@@ -1235,6 +1259,28 @@
this.gamesPictureBox.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop);
this.gamesPictureBox.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
//
// ULGif
//
this.ULGif.Enabled = false;
this.ULGif.Image = global::AndroidSideloader.Properties.Resources.ajax_loader;
this.ULGif.Location = new System.Drawing.Point(178, 699);
this.ULGif.Name = "ULGif";
this.ULGif.Size = new System.Drawing.Size(34, 17);
this.ULGif.TabIndex = 86;
this.ULGif.TabStop = false;
this.ULGif.Visible = false;
//
// pictureBox5
//
this.pictureBox5.BackColor = System.Drawing.Color.Transparent;
this.pictureBox5.Image = global::AndroidSideloader.Properties.Resources.battery11;
this.pictureBox5.Location = new System.Drawing.Point(155, 576);
this.pictureBox5.Margin = new System.Windows.Forms.Padding(2);
this.pictureBox5.Name = "pictureBox5";
this.pictureBox5.Size = new System.Drawing.Size(55, 29);
this.pictureBox5.TabIndex = 85;
this.pictureBox5.TabStop = false;
//
// MainForm
//
this.AllowDrop = true;
@@ -1245,9 +1291,11 @@
this.Controls.Add(this.label4);
this.Controls.Add(this.EnterInstallBox);
this.Controls.Add(this.ProgressText);
this.Controls.Add(this.pictureBox6);
this.Controls.Add(this.pictureBox4);
this.Controls.Add(this.pictureBox3);
this.Controls.Add(this.pictureBox2);
this.Controls.Add(this.label10);
this.Controls.Add(this.label7);
this.Controls.Add(this.label6);
this.Controls.Add(this.label8);
@@ -1274,6 +1322,7 @@
this.Controls.Add(this.label2);
this.Controls.Add(this.gamesListView);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.pictureBox7);
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.MaximizeBox = false;
this.Name = "MainForm";
@@ -1288,16 +1337,18 @@
this.DragLeave += new System.EventHandler(this.Form1_DragLeave);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.ULGif)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit();
this.otherContainer.ResumeLayout(false);
this.backupContainer.ResumeLayout(false);
this.sideloadContainer.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.gamesPictureBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ULGif)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -1369,6 +1420,9 @@
public System.Windows.Forms.ComboBox remotesList;
private System.Windows.Forms.PictureBox ULGif;
private System.Windows.Forms.Label ULLabel;
private System.Windows.Forms.PictureBox pictureBox6;
private System.Windows.Forms.PictureBox pictureBox7;
private System.Windows.Forms.Label label10;
}
}

View File

@@ -36,7 +36,6 @@ namespace AndroidSideloader
public static string currremotesimple = "";
#else
public bool keyheld;
public bool keyheld2;
public static string CurrAPK;
public static string CurrPCKG;
public static bool debugMode = false;
@@ -87,7 +86,7 @@ namespace AndroidSideloader
t.Tick += new EventHandler(timer_Tick);
t.Start();
System.Windows.Forms.Timer t2 = new System.Windows.Forms.Timer();
t2.Interval = 30; // 30ms
t2.Interval = 300; // 30ms
t2.Tick += new EventHandler(timer_Tick2);
t2.Start();
@@ -228,6 +227,8 @@ namespace AndroidSideloader
ChangeTitle("Initializing Mirrors");
initMirrors(true);
ChangeTitle("Checking if config is updated and updating config");
SideloaderRCLONE.updateConfig(currentRemote);
ChangeTitle("Initializing Games");
SideloaderRCLONE.initGames(currentRemote);
//ChangeTitle("Syncing Game Photos");
@@ -237,6 +238,10 @@ namespace AndroidSideloader
});
t1.SetApartmentState(ApartmentState.STA);
t1.IsBackground = true;
if (HasInternet)
t1.Start();
while (t1.IsAlive)
await Task.Delay(100);
Thread t2 = new Thread(() =>
{
SideloaderRCLONE.UpdateGameNotes(currentRemote);
@@ -260,37 +265,29 @@ namespace AndroidSideloader
t4.IsBackground = true;
if (HasInternet)
{
t1.Start();
t2.Start();
t3.Start();
t4.Start();
}
while (t1.IsAlive || t2.IsAlive || t3.IsAlive || t4.IsAlive)
await Task.Delay(100);
while (t2.IsAlive)
await Task.Delay(100);
while (t3.IsAlive)
await Task.Delay(100);
while (t4.IsAlive)
await Task.Delay(100);
ChangeTitle("Loaded");
progressBar.Style = ProgressBarStyle.Marquee;
Thread configThread = new Thread(() =>
{
ChangeTitle("Checking if config is updated and updating config");
SideloaderRCLONE.updateConfig(currentRemote);
ChangeTitle("");
});
configThread.IsBackground = true;
configThread.Start();
while (configThread.IsAlive)
await Task.Delay(100);
ChangeTitle("Populating update list, please wait...");
ChangeTitle("Populating update list, please wait...\n\n");
listappsbtn();
initListView();
showAvailableSpace();
intToolTips();
ChangeTitle("");
ChangeTitle(" \n\n");
downloadInstallGameButton.Enabled = true;
progressBar.Style = ProgressBarStyle.Continuous;
isLoading = false;
initListView();
}
@@ -779,7 +776,7 @@ namespace AndroidSideloader
ChangeTitle("Extracting APK....");
Directory.CreateDirectory($"{Properties.Settings.Default.MainDir}\\{packageName}");
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\{packageName}\\HWID.txt", HWID);
Thread t1 = new Thread(() =>
{
output = Sideloader.getApk(GameName);
@@ -799,6 +796,9 @@ namespace AndroidSideloader
while (t2.IsAlive)
await Task.Delay(100);
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\{packageName}\\HWID.txt", HWID);
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\{packageName}\\uploadMethod.txt", "manual");
ChangeTitle("Zipping extracted application...");
string cmd = $"7z a \"{GameName} v{VersionInt}.zip\" .\\{packageName}\\*";
string path = $"{Properties.Settings.Default.MainDir}\\7z.exe";
@@ -821,21 +821,21 @@ namespace AndroidSideloader
{
string currentlyuploading = GameName;
ChangeTitle("Uploading to shared drive, you can continue to use Rookie while it uploads in the background.");
string Uploadoutput = RCLONE.runRcloneCommand($"copy \"{Properties.Settings.Default.MainDir}\\{GameName} v{VersionInt}.zip\" RSL-debuglogs:CleanGames").Output;
string Uploadoutput = RCLONE.runRcloneCommand($"copy \"{Properties.Settings.Default.MainDir}\\{GameName} v{VersionInt}.zip\" RSL-gameuploads:").Output;
File.Delete($"{Properties.Settings.Default.MainDir}\\{GameName} v{VersionInt}.zip");
FlexibleMessageBox.Show($"Upload of {currentlyuploading} is complete! Thank you for your contribution!");
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}", true);
});
t3.IsBackground = true;
t3.Start();
isuploading = true;
while (t3.IsAlive)
{
isuploading = true;
await Task.Delay(100);
}
ChangeTitle("");
ChangeTitle(" \n\n");
isuploading = false;
ULGif.Visible = false;
ULLabel.Visible = false;
@@ -846,32 +846,28 @@ namespace AndroidSideloader
private async void uninstallAppButton_Click(object sender, EventArgs e)
{
string packagename;
ADB.WakeDevice();
if (m_combo.SelectedIndex == -1)
{
FlexibleMessageBox.Show("Please select an app first");
return;
}
string date_str = DateTime.Today.ToString("yyyy.MM.dd");
string CurrBackups = Path.Combine(BackupFolder, date_str);
string GameName = m_combo.SelectedItem.ToString();
string packagename = Sideloader.gameNameToPackageName(GameName);
FlexibleMessageBox.Show($"If savedata is found it will be saved to Documents\\Rookie Backups\\{date_str}(YYYY.MM.DD)\\{packagename}", "Attempting Backup...", MessageBoxButtons.OK);
Directory.CreateDirectory(CurrBackups);
ADB.RunAdbCommandToString($"pull \"/sdcard/Android/data/{packagename}\" \"{CurrBackups}\"");
DialogResult dialogResult = FlexibleMessageBox.Show($"Please check to see if we automatically found savedata in Documents\\Rookie Backups.\nIf there are no new files there is recommended that you do a full backup via Backup Gamedata before continuing.\nNOTE: Some games do not allow backup of savedata.\nContinue with the uninstall?", "Continue with Uninstall?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.No)
DialogResult dialogresult = FlexibleMessageBox.Show($"Are you sure you want to unintsall {GameName}? Rookie will attempt to automatically backup any saves to Documents\\Rookie Backups\\(TodaysDate)", "Proceed with uninstall?", MessageBoxButtons.YesNo);
if (dialogresult == DialogResult.No)
{
return;
}
if (!GameName.Contains("."))
packagename = Sideloader.gameNameToPackageName(GameName);
else
packagename = GameName;
ProcessOutput output = new ProcessOutput("", "");
progressBar.Style = ProgressBarStyle.Marquee;
Thread t1 = new Thread(() =>
{
output += Sideloader.UninstallGame(GameName);
output += Sideloader.UninstallGame(packagename);
});
t1.Start();
t1.IsBackground = true;
@@ -998,7 +994,8 @@ namespace AndroidSideloader
output.Error = "";
if (output.Error.Contains("reserved"))
output.Output = "";
ChangeTitle("");
ChangeTitle(" \n\n");
}
}
string[] files = Directory.GetFiles(data);
@@ -1011,7 +1008,7 @@ namespace AndroidSideloader
string pathname = Path.GetDirectoryName(data);
string filename = file2.Replace($"{pathname}\\", "");
string cmd = $"\"{Properties.Settings.Default.MainDir}\\adb\\aapt.exe\" dump badging \"{data}\" | findstr -i \"package: name\"";
string cmd = $"\"{Properties.Settings.Default.MainDir}\\adb\\aapt.exe\" dump badging \"{file2}\" | findstr -i \"package: name\"";
string cmdout = ADB.RunCommandToString(cmd, file2).Output;
cmdout = Utilities.StringUtilities.RemoveEverythingBeforeFirst(cmdout, "=");
cmdout = Utilities.StringUtilities.RemoveEverythingAfterFirst(cmdout, " ");
@@ -1026,7 +1023,6 @@ namespace AndroidSideloader
Program.form.ChangeTitle($"Sideloading apk...");
Thread t2 = new Thread(() =>
{
output += ADB.Sideload(file2);
});
@@ -1110,8 +1106,7 @@ namespace AndroidSideloader
while (t1.IsAlive)
await Task.Delay(100);
ChangeTitle("");
ChangeTitle(" \n\n");
}
}
@@ -1147,8 +1142,7 @@ namespace AndroidSideloader
timer.Stop();
ChangeTitle("");
ChangeTitle(" \n\n");
}
}
//If obb is dragged and dropped alone onto Rookie, Rookie will recreate its obb folder automatically with this code.
@@ -1175,7 +1169,7 @@ namespace AndroidSideloader
await Task.Delay(100);
Directory.Delete(foldername, true);
ChangeTitle("");
ChangeTitle(" \n\n");
}
// BMBF Zip extraction then push to BMBF song folder on Quest.
else if (extension == ".zip" && Properties.Settings.Default.BMBFchecked)
@@ -1217,7 +1211,8 @@ namespace AndroidSideloader
while (t1.IsAlive)
await Task.Delay(100);
ChangeTitle("");
ChangeTitle(" \n\n");
}
}
}
@@ -1245,15 +1240,21 @@ namespace AndroidSideloader
{
DragDropLbl.Visible = false;
DragDropLbl.Text = "";
ChangeTitle("");
ChangeTitle(" \n\n");
}
List<String> newGamesList = new List<string>();
List<String> newGamesToUploadList = new List<string>();
private List<UploadGame> gamesToUpload = new List<UploadGame>();
private List<UpdateGameData> gamesToAskForUpdate = new List<UpdateGameData>();
public static bool loaded = false;
public static string rookienamelist;
public static string rookienamelist2;
private bool errorOnList;
private async void initListView()
{
gamesListView.Items.Clear();
gamesListView.Columns.Clear();
rookienamelist = "";
loaded = false;
foreach (string column in SideloaderRCLONE.gameProperties)
{
gamesListView.Columns.Add(column, 150);
@@ -1267,37 +1268,47 @@ namespace AndroidSideloader
char[] delims = new[] { '\r', '\n' };
string[] packageList = result.Split(delims, StringSplitOptions.RemoveEmptyEntries);
string[] blacklist = new string[] { };
string[] whitelist = new string[] { };
if (File.Exists($"{Properties.Settings.Default.MainDir}\\nouns\\blacklist.txt"))
{
blacklist = File.ReadAllLines($"{Properties.Settings.Default.MainDir}\\nouns\\blacklist.txt");
}
if (File.Exists($"{Properties.Settings.Default.MainDir}\\nouns\\whitelist.txt"))
{
whitelist = File.ReadAllLines($"{Properties.Settings.Default.MainDir}\\nouns\\whitelist.txt");
}
List<ListViewItem> GameList = new List<ListViewItem>();
List<String> rookieList = new List<String>();
foreach (string[] game in SideloaderRCLONE.games)
{
rookieList.Add(game[SideloaderRCLONE.PackageNameIndex]);
}
List<String> installGames = packageList.ToList();
List<String> blacklistItems = blacklist.ToList();
newGamesList = installGames.Except(rookieList).Except(blacklistItems).ToList();
List<String> installedGames = packageList.ToList();
List<String> blacklistItems = blacklist.ToList();
List<String> whitelistItems = whitelist.ToList();
errorOnList = false;
//This is for black list, but temporarly will be whitelist
//this list has games that we are actually going to upload
newGamesToUploadList = whitelistItems.Intersect(installedGames).ToList();
foreach (string[] release in SideloaderRCLONE.games)
{
ListViewItem Game = new ListViewItem(release);
if (gamesListView.Columns.Count > 0)
if (!rookienamelist.Contains(release[SideloaderRCLONE.GameNameIndex].ToString()))
{
gamesListView.Columns[1].Width = 265;
gamesListView.Columns[5].Width = 59;
gamesListView.Columns[2].Width = 100;
gamesListView.Columns[3].Width = 50;
gamesListView.Columns[4].Width = 100;
gamesListView.Columns[5].Text = "Size (MB)";
rookienamelist += release[SideloaderRCLONE.GameNameIndex].ToString() + "\n";
rookienamelist2 += release[SideloaderRCLONE.GameNameIndex].ToString() + ", ";
}
ListViewItem Game = new ListViewItem(release);
foreach (string packagename in packageList)
{
rookieList.Add(release[SideloaderRCLONE.PackageNameIndex].ToString());
if (string.Equals(release[SideloaderRCLONE.PackageNameIndex], packagename))
{
if (Properties.Settings.Default.QblindOn)
{
Game.BackColor = Color.FromArgb(0, 112, 138);
@@ -1329,6 +1340,8 @@ namespace AndroidSideloader
bool dontget = false;
if (blacklist.Contains(packagename))
dontget = true;
if (!dontget)
Game.BackColor = Color.FromArgb(20, 20, 20);
string RlsName = Sideloader.PackageNametoGameName(packagename);
string GameName = Sideloader.gameNameToSimpleName(RlsName);
@@ -1350,88 +1363,188 @@ namespace AndroidSideloader
}
GameList.Add(Game);
}
updatesnotified = true;
newGamesList = installedGames.Except(rookieList).Except(blacklistItems).ToList();
if (blacklistItems.Count == 0 || rookieList.Count == 0)
{
//This means either the user does not have headset connected or the blacklist
//did not load, so we are just going to skip everything
errorOnList = true;
FlexibleMessageBox.Show($"Rookie seems to have failed to load all resources. Please try restarting Rookie a few times.\nIf error still persists please disable any VPN or firewalls (rookie uses direct download so a VPN is not needed)\nIf this error still persists try a system reboot, reinstalling the program, and lastly posting the problem on telegram.", "Error loading blacklist or game list!");
}
int topItemIndex = 0;
try
{
if (gamesListView.Items.Count > 1)
topItemIndex = gamesListView.TopItem.Index;
}
catch (Exception ex)
{ }
if (gamesListView.Columns.Count > 0)
{
gamesListView.Columns[1].Width = 265;
gamesListView.Columns[5].Width = 59;
gamesListView.Columns[2].Width = 100;
gamesListView.Columns[3].Width = 45;
gamesListView.Columns[4].Width = 105;
gamesListView.Columns[5].Text = "Size (MB)";
}
ListViewItem[] arr = GameList.ToArray();
gamesListView.BeginUpdate();
gamesListView.Items.Clear();
gamesListView.Items.AddRange(arr);
gamesListView.EndUpdate();
//This is for games that we already have on rookie and user has an update
foreach (UpdateGameData gameData in gamesToAskForUpdate)
try
{
if (!updatesnotified)
if (topItemIndex != 0)
gamesListView.TopItem = gamesListView.Items[topItemIndex];
}
catch (Exception ex)
{ }
if (!errorOnList)
{
//This is for games that we already have on rookie and user has an update
foreach (UpdateGameData gameData in gamesToAskForUpdate)
{
DialogResult dialogResult = FlexibleMessageBox.Show($"You have a newer version of:\n\n{gameData.GameName}\n\nRSL can AUTOMATICALLY UPLOAD the clean files to a shared drive in the background,\nthis is the only way to keep the apps up to date for everyone.\n\nNOTE: Rookie will only extract the APK/OBB which contain NO personal information whatsoever.", "CONTRIBUTE CLEAN FILES?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
if (!updatesnotified)
{
await extractAndPrepareGameToUploadAsync(gameData.GameName, gameData.Packagename, gameData.InstalledVersionInt);
DialogResult dialogResult = FlexibleMessageBox.Show($"You have a newer version of:\n\n{gameData.GameName}\n\nRSL can AUTOMATICALLY UPLOAD the clean files to a shared drive in the background,\nthis is the only way to keep the apps up to date for everyone.\n\nNOTE: Rookie will only extract the APK/OBB which contain NO personal information whatsoever.", "CONTRIBUTE CLEAN FILES?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
await extractAndPrepareGameToUploadAsync(gameData.GameName, gameData.Packagename, gameData.InstalledVersionInt);
}
}
}
}
//This is for games that are not blacklisted and we dont have on rookie
/*foreach (string newGamesToUpload in newGamesList)
{
string RlsName = Sideloader.PackageNametoGameName(newGamesToUpload);
string GameName = Sideloader.gameNameToSimpleName(RlsName);
Logger.Log(newGamesToUpload);
if (!updatesnotified)
//This is for WhiteListed Games, they will be asked for first, if we don't get many bogus prompts we can remove this entire duplicate section.
foreach (string newGamesToUpload in newGamesToUploadList)
{
DialogResult dialogResult = FlexibleMessageBox.Show($"You have a new game:\n\n{GameName}\n\nRSL can AUTOMATICALLY UPLOAD the clean files to a shared drive in the background,\nthis is the only way to keep the apps up to date for everyone.\n\nNOTE: Rookie will only extract the APK/OBB which contain NO personal information whatsoever.", "CONTRIBUTE CLEAN FILES?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
string RlsName = Sideloader.PackageNametoGameName(newGamesToUpload);
//start of code to get official Release Name from APK by first extracting APK then running AAPT on it.
string apppath = ADB.RunAdbCommandToString($"shell pm path {newGamesToUpload}").Output;
apppath = Utilities.StringUtilities.RemoveEverythingBeforeFirst(apppath, "/");
apppath = Utilities.StringUtilities.RemoveEverythingAfterFirst(apppath, "\r\n");
if (File.Exists($"C:\\RSL\\2.8.2\\ADB\\base.apk"))
File.Delete($"C:\\RSL\\2.8.2\\ADB\\base.apk");
ADB.RunAdbCommandToString($"pull \"{apppath}\"");
string cmd = $"\"{Properties.Settings.Default.MainDir}\\adb\\aapt.exe\" dump badging \"C:\\RSL\\2.8.2\\ADB\\base.apk\" | findstr -i \"application-label\"";
string workingpath = $"{Properties.Settings.Default.MainDir}\\adb\\aapt.exe";
string ReleaseName = ADB.RunCommandToString(cmd, workingpath).Output;
ReleaseName = Utilities.StringUtilities.RemoveEverythingBeforeFirst(ReleaseName, "'");
ReleaseName = Utilities.StringUtilities.RemoveEverythingAfterFirst(ReleaseName, "\r\n");
ReleaseName = ReleaseName.Replace("'", "");
File.Delete($"C:\\RSL\\2.8.2\\ADB\\base.apk");
//end
string GameName = Sideloader.gameNameToSimpleName(RlsName);
Logger.Log(newGamesToUpload);
if (!updatesnotified)
{
string InstalledVersionCode;
InstalledVersionCode = ADB.RunAdbCommandToString($"shell \"dumpsys package {newGamesToUpload} | grep versionCode -F\"").Output;
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingBeforeFirst(InstalledVersionCode, "versionCode=");
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingAfterFirst(InstalledVersionCode, " ");
ulong installedVersionInt = UInt64.Parse(Utilities.StringUtilities.KeepOnlyNumbers(InstalledVersionCode));
await uploadGameAsync(GameName, newGamesToUpload, installedVersionInt);
DialogResult dialogResult = FlexibleMessageBox.Show($"You have an in demand game:\n\n{ReleaseName}\n\nRSL can AUTOMATICALLY UPLOAD the clean files to a shared drive in the background,\nthis is the only way to keep the apps up to date for everyone.\n\nNOTE: Rookie will only extract the APK/OBB which contain NO personal information whatsoever.", "CONTRIBUTE CLEAN FILES?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
string InstalledVersionCode;
InstalledVersionCode = ADB.RunAdbCommandToString($"shell \"dumpsys package {newGamesToUpload} | grep versionCode -F\"").Output;
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingBeforeFirst(InstalledVersionCode, "versionCode=");
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingAfterFirst(InstalledVersionCode, " ");
ulong installedVersionInt = UInt64.Parse(Utilities.StringUtilities.KeepOnlyNumbers(InstalledVersionCode));
await extractAndPrepareGameToUploadAsync(GameName, newGamesToUpload, installedVersionInt);
}
else
{
}
}
}
}
newGamesList.Clear();*/
if (!isworking && gamesToUpload.Count > 0)
{
ChangeTitle("Uploading to shared drive, you can continue to use Rookie while it uploads in the background.");
ULGif.Visible = true;
ULLabel.Visible = true;
ULGif.Enabled = true;
isworking = true;
foreach (UploadGame game in gamesToUpload)
//This is for games that are not blacklisted and we dont have on rookie
foreach (string newGamesToUpload in newGamesList)
{
Thread t3 = new Thread(() =>
string RlsName = Sideloader.PackageNametoGameName(newGamesToUpload);
//start of code to get official Release Name from APK by first extracting APK then running AAPT on it.
string apppath = ADB.RunAdbCommandToString($"shell pm path {newGamesToUpload}").Output;
apppath = Utilities.StringUtilities.RemoveEverythingBeforeFirst(apppath, "/");
apppath = Utilities.StringUtilities.RemoveEverythingAfterFirst(apppath, "\r\n");
if (File.Exists($"C:\\RSL\\2.8.2\\ADB\\base.apk"))
File.Delete($"C:\\RSL\\2.8.2\\ADB\\base.apk");
ADB.RunAdbCommandToString($"pull \"{apppath}\"");
string cmd = $"\"{Properties.Settings.Default.MainDir}\\adb\\aapt.exe\" dump badging \"C:\\RSL\\2.8.2\\ADB\\base.apk\" | findstr -i \"application-label\"";
string workingpath = $"{Properties.Settings.Default.MainDir}\\adb\\aapt.exe";
string ReleaseName = ADB.RunCommandToString(cmd, workingpath).Output;
ReleaseName = Utilities.StringUtilities.RemoveEverythingBeforeFirst(ReleaseName, "'");
ReleaseName = Utilities.StringUtilities.RemoveEverythingAfterFirst(ReleaseName, "\r\n");
ReleaseName = ReleaseName.Replace("'", "");
File.Delete($"C:\\RSL\\2.8.2\\ADB\\base.apk");
if (ReleaseName.Contains("Microsoft Windows"))
ReleaseName = RlsName;
//end
string GameName = Sideloader.gameNameToSimpleName(RlsName);
Logger.Log(newGamesToUpload);
if (!updatesnotified)
{
string packagename = Sideloader.gameNameToPackageName(game.Uploadgamename);
if (File.Exists($"{Properties.Settings.Default.MainDir}\\{game.Uploadgamename} v{game.Uploadversion}.zip"))
DialogResult dialogResult = FlexibleMessageBox.Show($"You have a new game:\n\n{ReleaseName}\n\nRSL can AUTOMATICALLY UPLOAD the clean files to a shared drive in the background,\nthis is the only way to keep the apps up to date for everyone.\n\nNOTE: Rookie will only extract the APK/OBB which contain NO personal information whatsoever.", "CONTRIBUTE CLEAN FILES?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
string InstalledVersionCode;
InstalledVersionCode = ADB.RunAdbCommandToString($"shell \"dumpsys package {newGamesToUpload} | grep versionCode -F\"").Output;
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingBeforeFirst(InstalledVersionCode, "versionCode=");
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingAfterFirst(InstalledVersionCode, " ");
ulong installedVersionInt = UInt64.Parse(Utilities.StringUtilities.KeepOnlyNumbers(InstalledVersionCode));
await extractAndPrepareGameToUploadAsync(ReleaseName, newGamesToUpload, installedVersionInt);
}
}
}
updatesnotified = true;
if (!isworking && gamesToUpload.Count > 0)
{
ChangeTitle("Uploading to shared drive, you can continue to use Rookie while it uploads in the background.");
ULGif.Visible = true;
ULLabel.Visible = true;
ULGif.Enabled = true;
isworking = true;
foreach (UploadGame game in gamesToUpload)
{
Thread t3 = new Thread(() =>
{
string packagename = Sideloader.gameNameToPackageName(game.Uploadgamename);
if (File.Exists($"{Properties.Settings.Default.MainDir}\\{game.Uploadgamename} v{game.Uploadversion}.zip"))
File.Delete($"{Properties.Settings.Default.MainDir}\\{game.Uploadgamename} v{game.Uploadversion}.zip");
string path = $"{Properties.Settings.Default.MainDir}\\7z.exe";
string cmd = $"7z a \"{Properties.Settings.Default.MainDir}\\{game.Uploadgamename} v{game.Uploadversion}.zip\" .\\{game.Pckgcommand}\\*";
ChangeTitle("Zipping extracted application...");
ADB.RunCommandToString(cmd, path);
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{game.Pckgcommand}", true);
ChangeTitle("Uploading to drive, you may continue to use Rookie while it uploads.");
RCLONE.runRcloneCommand(game.Uploadcommand);
File.Delete($"{Properties.Settings.Default.MainDir}\\{game.Uploadgamename} v{game.Uploadversion}.zip");
string path = $"{Properties.Settings.Default.MainDir}\\7z.exe";
string cmd = $"7z a \"{Properties.Settings.Default.MainDir}\\{game.Uploadgamename} v{game.Uploadversion}.zip\" .\\{game.Pckgcommand}\\*";
ChangeTitle("Zipping extracted application...");
ADB.RunCommandToString(cmd, path);
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{game.Pckgcommand}", true);
ChangeTitle("Uploading to drive, you may continue to use Rookie while it uploads.");
RCLONE.runRcloneCommand(game.Uploadcommand);
File.Delete($"{Properties.Settings.Default.MainDir}\\{game.Uploadgamename} v{game.Uploadversion}.zip");
});
t3.IsBackground = true;
t3.Start();
while (t3.IsAlive)
{
isuploading = true;
await Task.Delay(100);
});
t3.IsBackground = true;
t3.Start();
while (t3.IsAlive)
{
isuploading = true;
await Task.Delay(100);
}
}
gamesToUpload.Clear();
isworking = false;
isuploading = false;
ULGif.Visible = false;
ULLabel.Visible = false;
ULGif.Enabled = false;
ChangeTitle(" \n\n");
}
gamesToUpload.Clear();
isworking = false;
isuploading = false;
ULGif.Visible = false;
ULLabel.Visible = false;
ULGif.Enabled = false;
ChangeTitle("");
}
loaded = true;
}
private async Task extractAndPrepareGameToUploadAsync(string GameName, string packagename, ulong installedVersionInt)
@@ -1439,7 +1552,7 @@ namespace AndroidSideloader
progressBar.Style = ProgressBarStyle.Marquee;
Thread t1 = new Thread(() =>
{
Sideloader.getApk(GameName);
Sideloader.getApk(packagename);
});
t1.IsBackground = true;
t1.Start();
@@ -1461,11 +1574,12 @@ namespace AndroidSideloader
progressBar.Style = ProgressBarStyle.Continuous;
UploadGame game = new UploadGame();
game.Pckgcommand = packagename;
game.Uploadcommand = $"copy \"{Properties.Settings.Default.MainDir}\\{GameName} v{installedVersionInt}.zip\" RSL-debuglogs:CleanGames";
game.Uploadcommand = $"copy \"{Properties.Settings.Default.MainDir}\\{GameName} v{installedVersionInt}.zip\" RSL-gameuploads:";
game.Uploadversion = installedVersionInt;
game.Uploadgamename = GameName;
gamesToUpload.Add(game);
ChangeTitle("");
ChangeTitle(" \n\n");
}
private void initMirrors(bool random)
{
@@ -1609,14 +1723,15 @@ without him none of this would be possible
SideloaderRCLONE.initGames(currentRemote);
listappsbtn();
});
t1.IsBackground = true;
t1.IsBackground = false;
t1.Start();
while (t1.IsAlive)
await Task.Delay(100);
initListView();
progressBar.Style = ProgressBarStyle.Continuous;
isLoading = false;
ChangeTitle("");
ChangeTitle(" \n\n");
}
private static readonly HttpClient client = new HttpClient();
@@ -1866,7 +1981,8 @@ without him none of this would be possible
Thread installtxtThread = new Thread(() =>
{
output += Sideloader.RunADBCommandsFromFile(file);
ChangeTitle("");
ChangeTitle(" \n\n");
});
installtxtThread.Start();
@@ -1926,22 +2042,21 @@ without him none of this would be possible
gamesQueueList.RemoveAt(0);
gamesQueListBox.DataSource = null;
gamesQueListBox.DataSource = gamesQueueList;
showAvailableSpace();
ChangeTitle("");
}
}
progressBar.Style = ProgressBarStyle.Continuous;
etaLabel.Text = "ETA: Finished Queue";
speedLabel.Text = "DLS: Finished Queue";
ProgressText.Text = "";
await CheckForDevice();
ChangeTitlebarToDevice();
gamesAreDownloading = false;
ShowPrcOutput(output);
isinstalling = false;
ChangeTitle("Refreshing games list, please wait... \n");
showAvailableSpace();
listappsbtn();
initListView();
ChangeTitle(" \n\n");
}
}
@@ -1958,44 +2073,50 @@ without him none of this would be possible
}
if (isinstalled)
{
DialogResult dialogResult = FlexibleMessageBox.Show("In place upgrade has failed.\n\nThis means the app must be uninstalled first before updating.\nRookie can attempt to do this while retaining your savedata.\nWhile the vast majority of games can be backed up there are some exceptions\n(we don't know which apps can't be backed up as there is no list online)\n\nDo you want Rookie to uninstall and reinstall the app automatically?", "In place upgrade failed", MessageBoxButtons.OKCancel);
if (dialogResult == DialogResult.OK)
if (!Properties.Settings.Default.AutoReinstall)
{
ChangeTitle("Performing reinstall, please wait...");
ADB.RunAdbCommandToString("kill-server");
ADB.RunAdbCommandToString("devices");
ADB.RunAdbCommandToString($"pull /sdcard/Android/data/{CurrPCKG} \"{Environment.CurrentDirectory}\"");
ADB.RunAdbCommandToString($"shell pm uninstall {CurrPCKG}");
output += ADB.RunAdbCommandToString($"install -g \"{CurrAPK}\"");
ADB.RunAdbCommandToString($"push \"{Environment.CurrentDirectory}\\{CurrPCKG}\" /sdcard/Android/data/");
timerticked = false;
if (Directory.Exists($"{Environment.CurrentDirectory}\\{CurrPCKG}"))
Directory.Delete($"{Environment.CurrentDirectory}\\{CurrPCKG}", true);
ChangeTitle("");
return;
}
else
{
DialogResult dialogResult2 = FlexibleMessageBox.Show("Would you like to cancel the install? Press NO to keep waiting.", "Cancel install?", MessageBoxButtons.YesNo);
if (dialogResult2 == DialogResult.Yes)
DialogResult dialogResult = FlexibleMessageBox.Show("In place upgrade has failed.\n\nThis means the app must be uninstalled first before updating.\nRookie can attempt to do this while retaining your savedata.\nWhile the vast majority of games can be backed up there are some exceptions\n(we don't know which apps can't be backed up as there is no list online)\n\nDo you want Rookie to uninstall and reinstall the app automatically?", "In place upgrade failed", MessageBoxButtons.OKCancel);
if (dialogResult == DialogResult.Cancel)
{
ChangeTitle("Stopping Install...");
ADB.RunAdbCommandToString("kill-server");
ADB.RunAdbCommandToString("devices");
}
else
{
timerticked = false;
return;
}
}
ChangeTitle("Performing reinstall, please wait...");
ADB.RunAdbCommandToString("kill-server");
ADB.RunAdbCommandToString("devices");
ADB.RunAdbCommandToString($"pull /sdcard/Android/data/{CurrPCKG} \"{Environment.CurrentDirectory}\"");
Sideloader.UninstallGame(CurrPCKG);
ChangeTitle("Reinstalling Game");
output += ADB.RunAdbCommandToString($"install -g \"{CurrAPK}\"");
ADB.RunAdbCommandToString($"push \"{Environment.CurrentDirectory}\\{CurrPCKG}\" /sdcard/Android/data/");
timerticked = false;
if (Directory.Exists($"{Environment.CurrentDirectory}\\{CurrPCKG}"))
Directory.Delete($"{Environment.CurrentDirectory}\\{CurrPCKG}", true);
ChangeTitle(" \n\n");
return;
}
else
{
DialogResult dialogResult2 = FlexibleMessageBox.Show("This install is taking an usual amount of time, you can keep waiting or cancel the install.\n" +
"Would you like to cancel the installation?", "Cancel install?", MessageBoxButtons.YesNo);
if (dialogResult2 == DialogResult.Yes)
{
ChangeTitle("Stopping Install...");
ADB.RunAdbCommandToString("kill-server");
ADB.RunAdbCommandToString("devices");
}
else
{
timerticked = false;
return;
}
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (isinstalling)
@@ -2023,36 +2144,13 @@ without him none of this would be possible
ADB.RunAdbCommandToString("kill-server");
}
}
else if (newGamesList.Count > 0 && !Properties.Settings.Default.UploadedGameList)
{
var res = FlexibleMessageBox.Show(this, "For August 2021, we'd like to grab a list of the apps installed to make updates work better.\nDo that now?", "Upload game list?",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
if (res == DialogResult.Yes)
{
string fileName = "gamesList" + DateTime.Now.ToFileTime() + ".txt";
System.IO.File.WriteAllLines(fileName, newGamesList);
RCLONE.runRcloneCommand($"copy " + Environment.CurrentDirectory + "\\" + fileName + " RSL-debuglogs:InstalledGamesList");
FlexibleMessageBox.Show("Upload done! Thank for your colaboration!");
File.Delete(fileName);
Properties.Settings.Default.UploadedGameList = true;
Properties.Settings.Default.Save();
RCLONE.killRclone();
ADB.RunAdbCommandToString("kill-server");
return;
}
else
{
RCLONE.killRclone();
ADB.RunAdbCommandToString("kill-server");
}
}
else
{
RCLONE.killRclone();
ADB.RunAdbCommandToString("kill-server");
}
}
}
private void ADBWirelessDisable_Click(object sender, EventArgs e)
{
DialogResult dialogResult = FlexibleMessageBox.Show("Are you sure you want to delete your saved Quest IP address/command?", "Remove saved IP address?", MessageBoxButtons.YesNo);
@@ -2080,9 +2178,7 @@ without him none of this would be possible
Program.form.ChangeTitlebarToDevice();
FlexibleMessageBox.Show("Relaunch Rookie to complete the process and switch back to USB adb.");
}
}
private void EnablePassthroughAPI_Click(object sender, EventArgs e)
{
ADB.WakeDevice();
@@ -2106,7 +2202,6 @@ without him none of this would be possible
{
ShowSubMenu(otherContainer);
}
private void gamesQueListBox_MouseClick(object sender, MouseEventArgs e)
{
if (gamesQueListBox.SelectedIndex != -1 && gamesQueListBox.SelectedIndex != 0)
@@ -2116,18 +2211,15 @@ without him none of this would be possible
gamesQueListBox.DataSource = gamesQueueList;
}
}
private void devicesComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
ADB.WakeDevice();
showAvailableSpace();
}
private void remotesList_SelectedIndexChanged(object sender, EventArgs e)
{
remotesList.Invoke(() => { currentRemote = "VRP-mirror" + remotesList.SelectedItem.ToString(); });
}
private void QuestOptionsButton_Click(object sender, EventArgs e)
{
QuestForm Form = new QuestForm();
@@ -2169,7 +2261,6 @@ without him none of this would be possible
lvwColumnSorter.Order = SortOrder.Ascending;
}
}
// Perform the sort with these new sort options.
this.gamesListView.Sort();
}
@@ -2178,7 +2269,6 @@ without him none of this would be possible
{
if (e.KeyChar == (char)Keys.Enter)
{
if (searchTextBox.Visible)
{
if (Properties.Settings.Default.EnterKeyInstall)
@@ -2187,7 +2277,6 @@ without him none of this would be possible
downloadInstallGameButton_Click(sender, e);
}
}
searchTextBox.Visible = false;
label2.Visible = false;
label3.Visible = false;
@@ -2195,11 +2284,9 @@ without him none of this would be possible
if (ADBcommandbox.Visible)
{
ChangeTitle($"Entered command: ADB {ADBcommandbox.Text}");
ADB.RunAdbCommandToString(ADBcommandbox.Text);
ChangeTitle("");
ChangeTitle(" \n\n");
}
ADBcommandbox.Visible = false;
label9.Visible = false;
@@ -2217,14 +2304,12 @@ without him none of this would be possible
label9.Visible = false;
label11.Visible = false;
label2.Visible = false;
}
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.F))
{
//show search
searchTextBox.Clear();
searchTextBox.Visible = true;
@@ -2233,6 +2318,24 @@ without him none of this would be possible
label4.Visible = true;
searchTextBox.Focus();
}
if (keyData == (Keys.Control | Keys.L))
{
if (loaded)
{
Clipboard.SetText(rookienamelist);
MessageBox.Show("Entire game list copied as a line by line list to clipboard!\nPress CTRL+V to paste it anywhere!");
}
}
if (keyData == (Keys.Alt | Keys.L))
{
if (loaded)
{
Clipboard.SetText(rookienamelist2);
MessageBox.Show("Entire game list copied as a paragraph to clipboard!\nPress CTRL+V to paste it anywhere!");
}
}
if (keyData == (Keys.Control | Keys.H))
{
string HWID = SideloaderUtilities.UUID();
@@ -2247,7 +2350,6 @@ without him none of this would be possible
label11.Visible = true;
label2.Visible = true;
ADBcommandbox.Focus();
}
if (keyData == (Keys.F2))
{
@@ -2258,8 +2360,6 @@ without him none of this would be possible
label4.Visible = true;
searchTextBox.Focus();
}
if (keyData == (Keys.Control | Keys.F4))
try
{
@@ -2297,17 +2397,13 @@ without him none of this would be possible
listappsbtn();
initListView();
}
bool dialogisup = false;
if (keyData == (Keys.F1) && !dialogisup)
{
dialogisup = true;
FlexibleMessageBox.Show("Shortcuts:\nF1 -------- Shortcuts List\nF2 --OR-- CTRL+F: QuickSearch\nF3 -------- Quest Options\nF4 -------- Rookie Settings\nF5 -------- Refresh Gameslist\nF11 ------ Copy CrashLog to Desktop\nF12 ------ Copy Debuglog to Desktop\n\nCTRL+R - Run custom ADB command.\nCTRL+P - Copy packagename to clipboard on game select.\nCTRL + F4 - Instantly relaunch Rookie's Sideloader.");
FlexibleMessageBox.Show("Shortcuts:\nF1 -------- Shortcuts List\nF2 --OR-- CTRL+F: QuickSearch\nF3 -------- Quest Options\nF4 -------- Rookie Settings\nF5 -------- Refresh Gameslist\n\nCTRL+R - Run custom ADB command.\nCTRL+L - Copy entire list of Game Names to clipboard seperated by new lines.\nALT+L - Copy entire list of Game Names to clipboard seperated by commas(in a paragraph).CTRL+P - Copy packagename to clipboard on game select.\nCTRL + F4 - Instantly relaunch Rookie's Sideloader.");
dialogisup = false;
}
if (keyData == (Keys.Control | Keys.P))
{
DialogResult dialogResult = FlexibleMessageBox.Show("Do you wish to copy Package Name of games selected from list to clipboard?", "Copy package to clipboard?", MessageBoxButtons.YesNo);
@@ -2321,13 +2417,7 @@ without him none of this would be possible
Properties.Settings.Default.PackageNameToCB = false;
Properties.Settings.Default.Save();
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
@@ -2375,11 +2465,11 @@ without him none of this would be possible
return;
string CurrentPackageName = gamesListView.SelectedItems[gamesListView.SelectedItems.Count - 1].SubItems[SideloaderRCLONE.PackageNameIndex].Text;
string CurrentReleaseName = gamesListView.SelectedItems[gamesListView.SelectedItems.Count - 1].SubItems[SideloaderRCLONE.ReleaseNameIndex].Text;
if (!keyheld2)
if (!keyheld)
{
if (Properties.Settings.Default.PackageNameToCB)
Clipboard.SetText(CurrentPackageName);
keyheld2 = true;
keyheld = true;
}
string ImagePath = "";
@@ -2389,16 +2479,12 @@ without him none of this would be possible
ImagePath = $"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.png";
if (gamesPictureBox.BackgroundImage != null)
gamesPictureBox.BackgroundImage.Dispose();
if (File.Exists(ImagePath) && !keyheld)
if (File.Exists(ImagePath))
{
gamesPictureBox.BackgroundImage = Image.FromFile(ImagePath);
}
else
gamesPictureBox.BackgroundImage = new Bitmap(367, 214);
keyheld = true;
string NotePath = $"{SideloaderRCLONE.NotesFolder}\\{CurrentReleaseName}.txt";
if (File.Exists(NotePath))

View File

@@ -110,6 +110,16 @@ namespace AndroidSideloader.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap gametoupload {
get {
object obj = ResourceManager.GetObject("gametoupload", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View File

@@ -118,23 +118,26 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="SearchGlass" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\SearchGlass.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="orangekey" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\orangekey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="greenkey" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\greenkey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="battery1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\battery11.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="battery" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\battery.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="battery11" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\battery1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="SearchGlass" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\SearchGlass.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="ajax-loader" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ajax-loader.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="battery1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\battery11.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="bluekey" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\bluekey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -142,7 +145,7 @@
<data name="redkey" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\redkey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ajax-loader" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ajax-loader.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="gametoupload" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\gametoupload.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -646,5 +646,28 @@ namespace AndroidSideloader.Properties {
this["GlobalUsername"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global::System.DateTime lastTimeShared {
get {
return ((global::System.DateTime)(this["lastTimeShared"]));
}
set {
this["lastTimeShared"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool AutoReinstall {
get {
return ((bool)(this["AutoReinstall"]));
}
set {
this["AutoReinstall"] = value;
}
}
}
}

View File

@@ -158,5 +158,11 @@
<Setting Name="GlobalUsername" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="lastTimeShared" Type="System.DateTime" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="AutoReinstall" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile>

BIN
Resources/gametoupload.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 B

View File

@@ -48,6 +48,7 @@
this.CblindBox = new System.Windows.Forms.CheckBox();
this.nodevicemodeBox = new System.Windows.Forms.CheckBox();
this.bmbfBox = new System.Windows.Forms.CheckBox();
this.AutoReinstBox = new System.Windows.Forms.CheckBox();
this.SuspendLayout();
//
// checkForUpdatesCheckBox
@@ -72,7 +73,7 @@
this.applyButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.applyButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.applyButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.applyButton.Location = new System.Drawing.Point(67, 280);
this.applyButton.Location = new System.Drawing.Point(67, 328);
this.applyButton.Name = "applyButton";
this.applyButton.Size = new System.Drawing.Size(101, 31);
this.applyButton.TabIndex = 5;
@@ -102,7 +103,7 @@
this.resetSettingsButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.resetSettingsButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.resetSettingsButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.resetSettingsButton.Location = new System.Drawing.Point(174, 280);
this.resetSettingsButton.Location = new System.Drawing.Point(174, 328);
this.resetSettingsButton.Name = "resetSettingsButton";
this.resetSettingsButton.Size = new System.Drawing.Size(101, 31);
this.resetSettingsButton.TabIndex = 4;
@@ -157,7 +158,7 @@
this.BandwithTextbox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.BandwithTextbox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.BandwithTextbox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.BandwithTextbox.Location = new System.Drawing.Point(52, 248);
this.BandwithTextbox.Location = new System.Drawing.Point(52, 296);
this.BandwithTextbox.Name = "BandwithTextbox";
this.BandwithTextbox.Size = new System.Drawing.Size(177, 24);
this.BandwithTextbox.TabIndex = 11;
@@ -167,7 +168,7 @@
this.label1.AutoSize = true;
this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.label1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.label1.Location = new System.Drawing.Point(40, 225);
this.label1.Location = new System.Drawing.Point(40, 273);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(245, 18);
this.label1.TabIndex = 12;
@@ -188,7 +189,7 @@
"K",
"M",
"G"});
this.BandwithComboBox.Location = new System.Drawing.Point(235, 248);
this.BandwithComboBox.Location = new System.Drawing.Point(235, 296);
this.BandwithComboBox.Name = "BandwithComboBox";
this.BandwithComboBox.Size = new System.Drawing.Size(55, 26);
this.BandwithComboBox.TabIndex = 13;
@@ -202,7 +203,7 @@
this.DebugLogCopy.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.DebugLogCopy.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.DebugLogCopy.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.DebugLogCopy.Location = new System.Drawing.Point(29, 325);
this.DebugLogCopy.Location = new System.Drawing.Point(29, 373);
this.DebugLogCopy.Name = "DebugLogCopy";
this.DebugLogCopy.Size = new System.Drawing.Size(285, 31);
this.DebugLogCopy.TabIndex = 5;
@@ -213,7 +214,7 @@
// crashlogID
//
this.crashlogID.AutoSize = true;
this.crashlogID.Location = new System.Drawing.Point(13, 441);
this.crashlogID.Location = new System.Drawing.Point(13, 489);
this.crashlogID.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.crashlogID.Name = "crashlogID";
this.crashlogID.Size = new System.Drawing.Size(0, 13);
@@ -228,7 +229,7 @@
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.button1.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.button1.Location = new System.Drawing.Point(29, 360);
this.button1.Location = new System.Drawing.Point(29, 408);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(285, 31);
this.button1.TabIndex = 5;
@@ -239,7 +240,7 @@
// debuglogID
//
this.debuglogID.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F);
this.debuglogID.Location = new System.Drawing.Point(29, 436);
this.debuglogID.Location = new System.Drawing.Point(29, 484);
this.debuglogID.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.debuglogID.Name = "debuglogID";
this.debuglogID.Size = new System.Drawing.Size(285, 48);
@@ -254,7 +255,7 @@
this.DebugID.Cursor = System.Windows.Forms.Cursors.Default;
this.DebugID.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold);
this.DebugID.ForeColor = System.Drawing.SystemColors.ControlLightLight;
this.DebugID.Location = new System.Drawing.Point(29, 407);
this.DebugID.Location = new System.Drawing.Point(29, 455);
this.DebugID.Margin = new System.Windows.Forms.Padding(2);
this.DebugID.Name = "DebugID";
this.DebugID.ReadOnly = true;
@@ -267,7 +268,7 @@
// label2
//
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F);
this.label2.Location = new System.Drawing.Point(29, 507);
this.label2.Location = new System.Drawing.Point(29, 555);
this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(284, 86);
@@ -284,7 +285,7 @@
this.textBox1.Cursor = System.Windows.Forms.Cursors.Default;
this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold);
this.textBox1.ForeColor = System.Drawing.SystemColors.ControlLightLight;
this.textBox1.Location = new System.Drawing.Point(29, 490);
this.textBox1.Location = new System.Drawing.Point(29, 538);
this.textBox1.Margin = new System.Windows.Forms.Padding(2);
this.textBox1.Name = "textBox1";
this.textBox1.ReadOnly = true;
@@ -334,12 +335,26 @@
this.bmbfBox.UseVisualStyleBackColor = true;
this.bmbfBox.CheckedChanged += new System.EventHandler(this.bmbfBox_CheckedChanged);
//
// AutoReinstBox
//
this.AutoReinstBox.AutoSize = true;
this.AutoReinstBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.AutoReinstBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
this.AutoReinstBox.Location = new System.Drawing.Point(12, 222);
this.AutoReinstBox.Name = "AutoReinstBox";
this.AutoReinstBox.Size = new System.Drawing.Size(280, 22);
this.AutoReinstBox.TabIndex = 9;
this.AutoReinstBox.Text = "Enable auto reinstall upon install failure";
this.AutoReinstBox.UseVisualStyleBackColor = true;
this.AutoReinstBox.CheckedChanged += new System.EventHandler(this.AutoReinstBox_CheckedChanged);
this.AutoReinstBox.Click += new System.EventHandler(this.AutoReinstBox_Click);
//
// SettingsForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
this.ClientSize = new System.Drawing.Size(342, 606);
this.ClientSize = new System.Drawing.Size(342, 634);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.DebugID);
this.Controls.Add(this.crashlogID);
@@ -349,6 +364,7 @@
this.Controls.Add(this.label1);
this.Controls.Add(this.BandwithTextbox);
this.Controls.Add(this.bmbfBox);
this.Controls.Add(this.AutoReinstBox);
this.Controls.Add(this.nodevicemodeBox);
this.Controls.Add(this.CblindBox);
this.Controls.Add(this.userJsonOnGameInstall);
@@ -398,5 +414,6 @@
private System.Windows.Forms.CheckBox CblindBox;
private System.Windows.Forms.CheckBox nodevicemodeBox;
private System.Windows.Forms.CheckBox bmbfBox;
private System.Windows.Forms.CheckBox AutoReinstBox;
}
}

View File

@@ -35,6 +35,7 @@ namespace AndroidSideloader
userJsonOnGameInstall.Checked = Properties.Settings.Default.userJsonOnGameInstall;
nodevicemodeBox.Checked = Properties.Settings.Default.nodevicemode;
bmbfBox.Checked = Properties.Settings.Default.BMBFchecked;
AutoReinstBox.Checked = Properties.Settings.Default.AutoReinstall;
if (Properties.Settings.Default.BandwithLimit.Length > 1)
{
@@ -223,6 +224,27 @@ namespace AndroidSideloader
Properties.Settings.Default.BMBFchecked = bmbfBox.Checked;
Properties.Settings.Default.Save();
}
private void AutoReinstBox_CheckedChanged(object sender, EventArgs e)
{
Properties.Settings.Default.AutoReinstall = AutoReinstBox.Checked;
Properties.Settings.Default.Save();
}
private void AutoReinstBox_Click(object sender, EventArgs e)
{
if (AutoReinstBox.Checked)
{
DialogResult dialogResult = FlexibleMessageBox.Show("WARNING: This box enables automatic reinstall when installs fail,\ndue to some games not allowing " +
"access to their save data (less than 5%) this\noption can lead to losing your progress." +
" However with this option\nchecked when installs fail you won't have to agree to a prompt to preform\nthe reinstall. " +
"(ideal when installing from a queue).\n\nNOTE: If your usb/wireless adb connection is extremely slow this option can\ncause larger" +
"apk file installations to fail. Enable anyway?", "WARNING", MessageBoxButtons.OKCancel);
if (dialogResult == DialogResult.Cancel)
AutoReinstBox.Checked = false;
}
}
}
}

View File

@@ -126,17 +126,22 @@ And all of them added to PATH, without ANY of them, the spoofer won't work!";
}
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 GameName)
public static ProcessOutput UninstallGame(string packagename)
{
ADB.WakeDevice();
Program.form.ChangeTitle("Attempting to backup any savedata to Documents\\Rookie Backups...");
ProcessOutput output = new ProcessOutput("", "");
string packageName = Sideloader.gameNameToPackageName(GameName);
output = ADB.UninstallPackage(packageName);
//remove both data and obb if there is any
Sideloader.RemoveFolder("/sdcard/Android/obb/" + packageName);
Sideloader.RemoveFolder("/sdcard/Android/data/" + packageName);
string date_str = DateTime.Today.ToString("yyyy.MM.dd");
string CurrBackups = Path.Combine(BackupFolder, date_str);
if (!Directory.Exists(CurrBackups))
Directory.CreateDirectory(CurrBackups);
ADB.RunAdbCommandToString($"pull \"/sdcard/Android/data/{packagename}\" \"{CurrBackups}\"");
output = ADB.UninstallPackage(packagename);
Program.form.ChangeTitle("");
Sideloader.RemoveFolder("/sdcard/Android/obb/" + packagename);
Sideloader.RemoveFolder("/sdcard/Android/data/" + packagename);
return output;
}

View File

@@ -90,46 +90,25 @@ namespace AndroidSideloader
{
File.WriteAllText("VRP-GamesList.txt", tempGameList);
}
string gamePropertiesLine = Utilities.StringUtilities.RemoveEverythingAfterFirst(tempGameList, "\n");
foreach (string gameProperty in gamePropertiesLine.Split(';'))
if (!tempGameList.Equals(""))
{
gameProperties.Add(gameProperty);
}
string[] gameListSplited = tempGameList.Split(new[] { '\n' }, 2);
foreach (string game in tempGameList.Split('\n'))
{
if (game.Length > 1)
foreach (string gameProperty in gameListSplited[0].Split(';'))
{
string[] splitGame = game.Split(';');
games.Add(splitGame);
//gameFolder.find();
gameProperties.Add(gameProperty);
}
foreach (string game in gameListSplited[1].Split('\n'))
{
if (game.Length > 1)
{
string[] splitGame = game.Split(';');
games.Add(splitGame);
}
}
}
//Output
//Console.WriteLine("Headers:");
//foreach (string s in gameProperties)
//{
// Console.WriteLine($"gameProperty: {s}");
//}
foreach (string[] s in games)
{
//string output = "";
//for (int i = 0; i < gameProperties.Count; i++)
// output += s[i] + " ";
}
}
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously

View File

@@ -17,7 +17,7 @@ namespace AndroidSideloader
private static string RawGitHubUrl;
private static string GitHubUrl;
static readonly public string LocalVersion = "2.9";
static readonly public string LocalVersion = "2.9.3";
public static string currentVersion = string.Empty;
public static string changelog = string.Empty;
@@ -54,13 +54,14 @@ namespace AndroidSideloader
//Download new sideloader with version appended to file name so there is no chance of overwriting the current exe
try
{
RCLONE.killRclone();
ADB.RunAdbCommandToString("kill-server");
var fileClient = new WebClient();
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Logger.Log($"Downloading update from {RawGitHubUrl}/releases/download/v{currentVersion}/{AppName}.exe to {AppName} v{currentVersion}.exe");
fileClient.DownloadFile($"{GitHubUrl}/releases/download/v{currentVersion}/{AppName}.exe", $"{AppName} v{currentVersion}.exe");
fileClient.Dispose();
Logger.Log($"Starting {AppName} v{currentVersion}.exe");
Process.Start($"{AppName} v{currentVersion}.exe");
//Delete current version

BIN
adb.7z

Binary file not shown.

View File

@@ -1,32 +1,22 @@
RSL 2.9
RSL 2.9.3
+ Updated ADB zip on repo and added a verification
text file to ensure all users are on newest ADB,
this should fix most obb issues. Upon first launch
after this update Rookie will automatically obtain
the latest ADB via this zip (7MB).
+ Added new background color for apps that are a newer
version than the version on the list. If you see this
darker background please agree to share when prompted
upon program launch or alternatively select the game
from top drop-down installed apps list and click Share
Selected App to help the community!
+ Added AAPT to repo along with a timer + logic to
detect packagename for automatic reinstall when drag
and dropped installs fail.
+ Added logic for file size column, clicking the column
header will now properly sort from biggest to smallest
or vice versa.
+ Implemented Size(MB) column to see app size prior
to clicking Download and Install.
= Fixed issue where Rookie would ask for every single
app installed on user's device. It should now only ask
for apps not on Rookie and not on the Blacklist as
intended.
= Cleaned up automatic reinstall on apk installation
failure for Download and Install, it should work for
most users now.
= Changed zip file naming for new game uploads to use
Release Name instead of package name.
= Adjusted code for mirror switching, should fix failure
to load gameslist whatsoever on dead mirrors.
= Fixed issue where after installing a game RSL would
ask user to donate same clean files again. RSL will now
only ask once per program load, as intended.
- Removed filesize confirmation dialog when clicking
download and install.
- Removed columns that were useless to users.
HFP
HFP

View File

@@ -1 +1 @@
2.9
2.9.3