Compare commits

...

12 Commits

Author SHA1 Message Date
William Swartwood
3e67b331ef Autoupload WITHOUT new game detection (for live release) 2021-08-19 02:23:43 -04:00
harryeffinpotter
26442e9516 Merge pull request #78 from konqiDAM/master
upload not listed games
2021-08-18 22:34:07 -04:00
konqi
3cd715afd9 upload not listed games 2021-08-19 04:23:33 +02:00
harryeffinpotter
0ecdaab240 Merge pull request #77 from konqiDAM/master
refactored codee to allow unlimited games upload in case user has multiple updated games
2021-08-18 19:07:15 -04:00
konqi
801ec1a874 fix or when checking null 2021-08-18 22:54:36 +02:00
konqi
ebf0f9372b refactored so upload uses a class and a list, now unlimited upload posible 2021-08-18 22:52:16 +02:00
konqi
06c534dc50 Merge branch 'master' of https://github.com/nerdunit/androidsideloader into nerdunit-master
# Conflicts:
#	MainForm.Designer.cs
2021-08-18 16:14:05 +02:00
Harry Fn Potter
04289885c2 Auto upload in progress 2021-08-18 10:05:18 -04:00
konqi
8e7b9490de Merge branch 'nerdunit:master' into master 2021-08-15 19:26:00 +02:00
konqi
cec1ff48fd added Enable Passthrough API 2021-08-15 19:21:34 +02:00
Harry Fn Potter
85fad7d3ad -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

RSL 2.8.1

= Fixed crash at startup related to Upload Date column.

HFP

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

iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEZPjAACgkQx/Rql1Vo
czdfUw/+PiQ03p3FFwuVIndiDHKvwcjcewDWASYiP2KJkDCsbaEj0U5+ntpu7mxo
ytIFuNZd47CwiYGFXi6IzEO1n9yj4LL3ONnVEogZgd3bP3Bb2b28KDdHtDX3IO5d
wWle/WMksKDywqRyjJnaP9dh+7YS0C/49H32cFokF8S69stPwPYh9LSaf4ctK0/f
y8pHN7tgOkmCR8NU6lOY9OLepBZlv+PcOAco0nIz1zHtwdRGz2vjwQqAa8NShfEy
E/rjBhM37YBULf7cOayt0FY/rDYvw6Bj8B9ht0Bn6dmWgJrhfAj01utREL8HcmPd
rNDXB7UxuR56OVy1f1gh1Fzb5f62xDydfELd/0dFYE0oDcdkHjaEkT5CnAukBmrO
y0ntjawsy40dVAwPwPSAPQ+qP9g7mDZdbjOfgP4JNFWwnxgYLlTASoUMis/hd5mg
FLaFAiMM3o72Gip+gjMl3AiuwyefKoCGfAPgNvRx0t8R3bdLfVJ0KIPpgvJ7ZuD8
n4LEHLPoldDmoshdxl/BiQyLhaEM3W3qkwANVic6/8eCqy/N23CM74L4xgUaQDoq
dvkS3PKuhLvcYh4HkZNhALj7Mavvs0x8/pIGx8bK8JCNOhKX7rGylF6erDFfZ8Ym
T2vN0PjVYS/pF//qKHPyV5yVc5piudCB895LBNIDcJK1b67nUUE=
=+e9J
-----END PGP SIGNATURE-----
2021-08-15 12:33:16 -04:00
Harry Fn Potter
028c44ba64 -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

RSL 2.8.1

= Fixed crash at startup related to Upload Date column.

HFP

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

iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEZPjAACgkQx/Rql1Vo
czdfUw/+PiQ03p3FFwuVIndiDHKvwcjcewDWASYiP2KJkDCsbaEj0U5+ntpu7mxo
ytIFuNZd47CwiYGFXi6IzEO1n9yj4LL3ONnVEogZgd3bP3Bb2b28KDdHtDX3IO5d
wWle/WMksKDywqRyjJnaP9dh+7YS0C/49H32cFokF8S69stPwPYh9LSaf4ctK0/f
y8pHN7tgOkmCR8NU6lOY9OLepBZlv+PcOAco0nIz1zHtwdRGz2vjwQqAa8NShfEy
E/rjBhM37YBULf7cOayt0FY/rDYvw6Bj8B9ht0Bn6dmWgJrhfAj01utREL8HcmPd
rNDXB7UxuR56OVy1f1gh1Fzb5f62xDydfELd/0dFYE0oDcdkHjaEkT5CnAukBmrO
y0ntjawsy40dVAwPwPSAPQ+qP9g7mDZdbjOfgP4JNFWwnxgYLlTASoUMis/hd5mg
FLaFAiMM3o72Gip+gjMl3AiuwyefKoCGfAPgNvRx0t8R3bdLfVJ0KIPpgvJ7ZuD8
n4LEHLPoldDmoshdxl/BiQyLhaEM3W3qkwANVic6/8eCqy/N23CM74L4xgUaQDoq
dvkS3PKuhLvcYh4HkZNhALj7Mavvs0x8/pIGx8bK8JCNOhKX7rGylF6erDFfZ8Ym
T2vN0PjVYS/pF//qKHPyV5yVc5piudCB895LBNIDcJK1b67nUUE=
=+e9J
-----END PGP SIGNATURE-----
2021-08-15 12:20:03 -04:00
17 changed files with 441 additions and 145 deletions

View File

@@ -211,6 +211,7 @@
<Compile Include="SelectFolder.cs" />
<Compile Include="Utilities\StringUtilities.cs" />
<Compile Include="Utilities\GeneralUtilities.cs" />
<Compile Include="Utilities\UploadGame.cs" />
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
<SubType>Designer</SubType>
@@ -265,6 +266,7 @@
<None Include="Resources\battery11.png" />
<None Include="Resources\battery.png" />
<None Include="Resources\battery1.png" />
<None Include="Resources\ajax-loader.gif" />
<Content Include="Resources\bluekey.png" />
<Content Include="Resources\redkey.png" />
<None Include="Resources\greenkey.png" />

View File

@@ -158,6 +158,9 @@
<setting name="BMBFchecked" serializeAs="String">
<value>True</value>
</setting>
<setting name="GamesList" serializeAs="String">
<value />
</setting>
</AndroidSideloader.Properties.Settings>
<AndroidADB.Sideloader.Properties.Settings>
<setting name="checkForUpdates" serializeAs="String">

View File

@@ -1,6 +1,77 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
RSL 2.8.2
+ Added automatic upload to Google shared drive
for clean game files donation.
+ Added uploading GIF for duration of upload.
+ Added warning messages when user attempts
to close Rookie while games are download, installing,
or uploading.
= Threaded clean file zipping and uploading
so user can continue to use Rookie while game
is uploading.
P.S. We are looking for volunteers for the next
beta which will automatically detect new games
installed on user's headset and suggest them for
donation. Message https://t.me/Harryeffinpotter or
https://t.me/pmowpmow on Telegram to join the beta
test!
HFP
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEd+IUACgkQx/Rql1Vo
czcyUw/+ImynsE4CXmv+LjuTH1by6L2AHZFZCQ0cgwq88OOwdir/WzPfNeqqv0e6
/QCRbRdvC6pASPgHryCkvFPFXUoLgQ+lXZY1GCBUzX0lIMqrenihQ5QUQb70LOxR
kVkivnxLJzBeQAXn+gkvPXMCIn3l0yVInsjtusVqVHtmsegcAQTwcrG7RXSsl0dr
2rkPOuvlcxMTWA4SlE16IhuLcq8L9GavpeWKoQiaoydhBGdzfAe1O4yy6UQs7Nas
9Xl3vy1mXnZIprTOtjH+zYXxcdcxb1ZAdvHdq19nqTf5iuCqO+A4TxSq4vRv6Dvt
XkJ0igXJsscpIQjJ812mZACJiJlP31yPdhZvKZXtUAQoR63iRPiEpY2gIKrd249Y
HIq0g+XaO0K8kjOAmrBxLpESEBEovhhcfvrepSh7NocsxRAAnxOJUdcbmekwRjpj
MCtMYThTYRXoR2aWxIbtaviUIecAGxuF8m+wWbxnWqJSEh4BanmQKjoh32G8geEE
PS4XMBcWQ0/MhKSibaWO0SQCjrHNtsmbVvu28rh/eD9ar4Z9tPxza43iqSepSEjK
Vlka7WxpkeqVCYnTpoLPv7I+XBBRojKlUp8aUz4MrOuuzNg08GyLFgKejU1aiw4I
7s3PjFj6e4SsRgAKHhKStjYzVTkhlbyWIguhyPdzpiNoMFEwMz8=
=EIFi
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
RSL 2.8.1
= Fixed crash at startup related to Upload Date column.
HFP
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEZPjAACgkQx/Rql1Vo
czdfUw/+PiQ03p3FFwuVIndiDHKvwcjcewDWASYiP2KJkDCsbaEj0U5+ntpu7mxo
ytIFuNZd47CwiYGFXi6IzEO1n9yj4LL3ONnVEogZgd3bP3Bb2b28KDdHtDX3IO5d
wWle/WMksKDywqRyjJnaP9dh+7YS0C/49H32cFokF8S69stPwPYh9LSaf4ctK0/f
y8pHN7tgOkmCR8NU6lOY9OLepBZlv+PcOAco0nIz1zHtwdRGz2vjwQqAa8NShfEy
E/rjBhM37YBULf7cOayt0FY/rDYvw6Bj8B9ht0Bn6dmWgJrhfAj01utREL8HcmPd
rNDXB7UxuR56OVy1f1gh1Fzb5f62xDydfELd/0dFYE0oDcdkHjaEkT5CnAukBmrO
y0ntjawsy40dVAwPwPSAPQ+qP9g7mDZdbjOfgP4JNFWwnxgYLlTASoUMis/hd5mg
FLaFAiMM3o72Gip+gjMl3AiuwyefKoCGfAPgNvRx0t8R3bdLfVJ0KIPpgvJ7ZuD8
n4LEHLPoldDmoshdxl/BiQyLhaEM3W3qkwANVic6/8eCqy/N23CM74L4xgUaQDoq
dvkS3PKuhLvcYh4HkZNhALj7Mavvs0x8/pIGx8bK8JCNOhKX7rGylF6erDFfZ8Ym
T2vN0PjVYS/pF//qKHPyV5yVc5piudCB895LBNIDcJK1b67nUUE=
=+e9J
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
RSL 2.8
+ Added modified date to games list columns.

33
MainForm.Designer.cs generated
View File

@@ -41,6 +41,8 @@
this.copyBulkObbButton = new System.Windows.Forms.Button();
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();
@@ -92,6 +94,7 @@
this.pictureBox2 = new System.Windows.Forms.PictureBox();
this.gamesPictureBox = 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();
@@ -239,7 +242,7 @@
this.getApkButton.Padding = new System.Windows.Forms.Padding(23, 0, 0, 0);
this.getApkButton.Size = new System.Drawing.Size(218, 28);
this.getApkButton.TabIndex = 2;
this.getApkButton.Text = "Extract App to Desktop";
this.getApkButton.Text = "Upload Selected App";
this.getApkButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.getApkButton.UseVisualStyleBackColor = false;
this.getApkButton.Click += new System.EventHandler(this.getApkButton_Click);
@@ -343,6 +346,8 @@
//
this.panel1.AutoScroll = true;
this.panel1.BackColor = global::AndroidSideloader.Properties.Settings.Default.ButtonColor;
this.panel1.Controls.Add(this.ULLabel);
this.panel1.Controls.Add(this.ULGif);
this.panel1.Controls.Add(this.BatteryLbl);
this.panel1.Controls.Add(this.pictureBox5);
this.panel1.Controls.Add(this.downloadingLabel);
@@ -366,6 +371,29 @@
this.panel1.Size = new System.Drawing.Size(218, 721);
this.panel1.TabIndex = 73;
//
// ULLabel
//
this.ULLabel.AutoSize = true;
this.ULLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ULLabel.ForeColor = System.Drawing.Color.Snow;
this.ULLabel.Location = new System.Drawing.Point(154, 683);
this.ULLabel.Name = "ULLabel";
this.ULLabel.Size = new System.Drawing.Size(64, 13);
this.ULLabel.TabIndex = 87;
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;
@@ -1260,6 +1288,7 @@
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);
@@ -1338,6 +1367,8 @@
private System.Windows.Forms.Label BatteryLbl;
private System.Windows.Forms.PictureBox pictureBox5;
public System.Windows.Forms.ComboBox remotesList;
private System.Windows.Forms.PictureBox ULGif;
private System.Windows.Forms.Label ULLabel;
}
}

View File

@@ -1,4 +1,5 @@
using JR.Utils.GUI.Forms;
using AndroidSideloader.Utilities;
using JR.Utils.GUI.Forms;
using Newtonsoft.Json;
using SergeUtils;
using Spoofer;
@@ -259,7 +260,7 @@ namespace AndroidSideloader
ChangeTitle("Initializing Games");
SideloaderRCLONE.initGames(currentRemote);
t.Stop();
SideloaderRCLONE.UpdateNouns(currentRemote);
//SideloaderRCLONE.UpdateNouns(currentRemote);
if (!Directory.Exists(SideloaderRCLONE.ThumbnailsFolder) || !Directory.Exists(SideloaderRCLONE.NotesFolder))
{
FlexibleMessageBox.Show("It seems you are missing the thumbnails and/or notes database, the first start of the sideloader takes a bit more time, so dont worry if it looks stuck!");
@@ -267,7 +268,6 @@ namespace AndroidSideloader
ChangeTitle("Syncing Game Photos");
SideloaderRCLONE.UpdateGamePhotos(currentRemote);
ChangeTitle("Updating list of needed clean apps...");
SideloaderRCLONE.UpdateNouns(currentRemote);
ChangeTitle("Checking for Updates on server...");
SideloaderRCLONE.UpdateGameNotes(currentRemote);
ChangeTitle("Loaded");
@@ -741,15 +741,12 @@ namespace AndroidSideloader
{
line[i] = line[i].Remove(0, 8);
line[i] = line[i].Remove(line[i].Length - 1);
if (!Sideloader.InstalledPackages.ContainsKey(line[i]))
Sideloader.InstalledPackages.Add(line[i], "");
foreach (var game in SideloaderRCLONE.games)
if (line[i].Length > 0 && game[3].Contains(line[i]))
line[i] = game[0];
}
}
File.WriteAllText("installedPackages.json", JsonConvert.SerializeObject(Sideloader.InstalledPackages));
Array.Sort(line);
@@ -761,6 +758,7 @@ namespace AndroidSideloader
m_combo.Invoke(() => { m_combo.MatchingMethod = StringMatchingMethod.NoWildcards; });
}
public static bool isuploading = false;
public static bool isworking = false;
private async void getApkButton_Click(object sender, EventArgs e)
{
@@ -814,23 +812,46 @@ namespace AndroidSideloader
while (t2.IsAlive)
await Task.Delay(100);
ChangeTitle("Zipping extracted application...");
string cmd = $"7z a {packageName}v{VersionInt}.zip .\\{packageName}\\*";
string cmd = $"7z a \"{GameName} v{VersionInt}.zip\" .\\{packageName}\\*";
string path = $"{Properties.Settings.Default.MainDir}\\7z.exe";
Thread t3 = new Thread(() =>
progressBar.Style = ProgressBarStyle.Continuous;
Thread t4 = new Thread(() =>
{
ADB.RunCommandToString(cmd, path);
});
t4.IsBackground = true;
t4.Start();
while (t4.IsAlive)
await Task.Delay(100);
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 = false;
isuploading = true;
Thread t3 = new Thread(() =>
{
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;
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();
while (t3.IsAlive)
{
isuploading = true;
await Task.Delay(100);
File.Move($"{Properties.Settings.Default.MainDir}\\{packageName}v{VersionInt}.zip", $"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\\{GameName} v{VersionInt}.zip");
FlexibleMessageBox.Show($"The app has been zipped and placed on your desktop as\n\n{GameName} v{VersionInt}.zip\n\nPlease upload this file to a free file hosting service like\n https://1fichier.com or https://mega.nz and share the link with a moderator.");
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}", true);
progressBar.Style = ProgressBarStyle.Continuous;
}
ChangeTitle("");
isworking = false;
isuploading = false;
ULGif.Visible = false;
ULLabel.Visible = false;
ULGif.Enabled = false;
}
else MessageBox.Show("You must wait until each app is finished extracting to start another.");
}
@@ -1121,31 +1142,48 @@ namespace AndroidSideloader
DragDropLbl.Text = "";
ChangeTitle("");
}
List<String> newGamesList = new List<string>();
private List<UploadGame> gamesToUpload = new List<UploadGame>();
private async void initListView()
{
gamesListView.Items.Clear();
gamesListView.Columns.Clear();
if (!File.Exists("installedPackages.json"))
{
File.Create("installedPackages.json");
if (File.Exists("instlledPackages.json"))
Sideloader.InstalledPackages = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText("installedPackages.json"));
}
foreach (string column in SideloaderRCLONE.gameProperties)
{
gamesListView.Columns.Add(column, 150);
}
string lines = Properties.Settings.Default.InstalledApps;
string pattern = "package:";
string replacement = "";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(lines, replacement);
char[] delims = new[] { '\r', '\n' };
string[] packageList = result.Split(delims, StringSplitOptions.RemoveEmptyEntries);
string[] blacklist = new string[] { };
if (File.Exists($"{Environment.CurrentDirectory}\\nouns\\blacklist.txt"))
{
blacklist = File.ReadAllLines($"{Environment.CurrentDirectory}\\nouns\\blacklist.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).ToList();
newGamesList = newGamesList.Except(blacklistItems).ToList();
foreach (string[] release in SideloaderRCLONE.games)
{
ListViewItem Game = new ListViewItem(release);
string lines = Properties.Settings.Default.InstalledApps;
string pattern = "package:";
string replacement = "";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(lines, replacement);
char[] delims = new[] { '\r', '\n' };
string[] strings = result.Split(delims, StringSplitOptions.RemoveEmptyEntries);
//MessageBox.Show(result);
if (gamesListView.Columns.Count > 0)
{
gamesListView.Columns[5].Width = 0;
@@ -1155,28 +1193,22 @@ namespace AndroidSideloader
gamesListView.Columns[6].Width = 98;
gamesListView.Columns[1].Width = 280;
}
foreach (string packagename in strings)
foreach (string packagename in packageList)
{
if (string.Equals(release[SideloaderRCLONE.PackageNameIndex], packagename))
{
if (Properties.Settings.Default.QblindOn)
{
Game.BackColor = Color.FromArgb(0, 112, 138);
}
else
Game.BackColor = Color.Green;
{
Game.BackColor = Color.Green;
}
string InstalledVersionCode;
if (Sideloader.InstalledPackages.ContainsKey(packagename) && Sideloader.InstalledPackages[packagename] != "")
{
InstalledVersionCode = Sideloader.InstalledPackages[packagename];
}
else
{
InstalledVersionCode = ADB.RunAdbCommandToString($"shell \"dumpsys package {packagename} | grep versionCode -F\"").Output;
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingBeforeFirst(InstalledVersionCode, "versionCode=");
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingAfterFirst(InstalledVersionCode, " ");
Sideloader.InstalledPackages[packagename] = InstalledVersionCode;
}
InstalledVersionCode = ADB.RunAdbCommandToString($"shell \"dumpsys package {packagename} | grep versionCode -F\"").Output;
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingBeforeFirst(InstalledVersionCode, "versionCode=");
InstalledVersionCode = Utilities.StringUtilities.RemoveEverythingAfterFirst(InstalledVersionCode, " ");
try
{
ulong installedVersionInt = UInt64.Parse(Utilities.StringUtilities.KeepOnlyNumbers(InstalledVersionCode));
@@ -1195,67 +1227,15 @@ namespace AndroidSideloader
{
string RlsName = Sideloader.PackageNametoGameName(packagename);
string GameName = Sideloader.gameNameToSimpleName(RlsName);
if (File.Exists($"{Environment.CurrentDirectory}\\nouns\\blacklist.txt"))
if (!GameName.Contains("Beat Saber") && !dontget && !updatesnotified && !isworking && cloudVersionInt > 0)
{
string[] blacklist = File.ReadAllLines($"{Environment.CurrentDirectory}\\nouns\\blacklist.txt");
foreach (string blacklistpckg in blacklist)
{
if (packagename.Contains(blacklistpckg))
{
dontget = true;
}
}
}
if (!GameName.Contains("Beat Saber") && !dontget && !updatesnotified && cloudVersionInt > 0)
{
DialogResult dialogResult = FlexibleMessageBox.Show($"It seems you have a newer version of:\n\n{GameName}\n\nAll apps on Rookie are from donors, please share the updated files with us.\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.", "Share clean files?", MessageBoxButtons.YesNo);
DialogResult dialogResult = FlexibleMessageBox.Show($"You have a newer version of:\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)
{
Thread t1 = new Thread(() =>
{
Sideloader.getApk(GameName);
});
t1.IsBackground = true;
t1.Start();
while (t1.IsAlive)
await Task.Delay(1000);
ChangeTitle("Extracting obb if it exists....");
Thread t2 = new Thread(() =>
{
ADB.RunAdbCommandToString($"pull \"/sdcard/Android/obb/{packagename}\" \"{Properties.Settings.Default.MainDir}\\{packagename}\"");
});
t2.IsBackground = true;
t2.Start();
while (t2.IsAlive)
await Task.Delay(1000);
ChangeTitle("Zipping extracted application...");
string cmd = $"7z a {packagename}v{installedVersionInt}.zip .\\{packagename}\\*";
string path = $"{Properties.Settings.Default.MainDir}\\7z.exe";
Thread t3 = new Thread(() =>
{
string HWID = SideloaderUtilities.UUID();
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\{packagename}\\HWID.txt", HWID);
ADB.RunCommandToString(cmd, path);
if (File.Exists($"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\\{GameName} v{installedVersionInt}.zip"))
File.Delete($"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\\{GameName} v{installedVersionInt}.zip");
File.Move($"{Properties.Settings.Default.MainDir}\\{packagename}v{installedVersionInt}.zip", $"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\\{GameName} v{installedVersionInt}.zip");
FlexibleMessageBox.Show($"The app has been zipped and placed on your desktop as\n\n{GameName} v{installedVersionInt}.zip\n\nPlease upload this file to a free file hosting service like\n https://1fichier.com or https://mega.nz \nThen share the link to the moderators listed in the\npinned message on Telegram.");
Directory.Delete($"{Properties.Settings.Default.MainDir}\\{packagename}", true);
});
t3.IsBackground = true;
t3.Start();
while (t3.IsAlive)
await Task.Delay(100);
progressBar.Style = ProgressBarStyle.Continuous;
ChangeTitle("");
await uploadGameAsync(GameName, packagename, installedVersionInt);
}
}
}
}
}
catch (Exception ex)
@@ -1267,19 +1247,113 @@ namespace AndroidSideloader
}
}
}
File.WriteAllText("installedPackages.json", JsonConvert.SerializeObject(Sideloader.InstalledPackages));
GameList.Add(Game);
}
ListViewItem[] arr = GameList.ToArray();
gamesListView.BeginUpdate();
gamesListView.Items.AddRange(arr);
gamesListView.EndUpdate();
// foreach (string newGamesToUpload in newGamesList)
// {
// string RlsName = Sideloader.PackageNametoGameName(newGamesToUpload);
// string GameName = Sideloader.gameNameToSimpleName(RlsName);
//Logger.Log(newGamesToUpload);
// if (!updatesnotified)
//{
// 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 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);
// }
//}
// }
newGamesList.Clear();
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 \"{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);
FlexibleMessageBox.Show($"Upload of {game.Uploadgamename} is complete! Thank you for your contribution!");
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);
}
}
gamesToUpload.Clear();
isworking = false;
isuploading = false;
ULGif.Visible = false;
ULLabel.Visible = false;
ULGif.Enabled = false;
ChangeTitle("");
}
}
private async Task uploadGameAsync(string GameName, string packagename, ulong installedVersionInt)
{
progressBar.Style = ProgressBarStyle.Marquee;
Thread t1 = new Thread(() =>
{
Sideloader.getApk(GameName);
});
t1.IsBackground = true;
t1.Start();
while (t1.IsAlive)
await Task.Delay(1000);
ChangeTitle("Extracting obb if it exists....");
Thread t2 = new Thread(() =>
{
ADB.RunAdbCommandToString($"pull \"/sdcard/Android/obb/{packagename}\" \"{Properties.Settings.Default.MainDir}\\{packagename}\"");
});
t2.IsBackground = true;
t2.Start();
while (t2.IsAlive)
await Task.Delay(1000);
string HWID = SideloaderUtilities.UUID();
File.WriteAllText($"{Properties.Settings.Default.MainDir}\\{packagename}\\HWID.txt", HWID);
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.Uploadversion = installedVersionInt;
game.Uploadgamename = GameName;
gamesToUpload.Add(game);
ChangeTitle("");
}
private void initMirrors(bool random)
{
int index = 0;
@@ -1466,11 +1540,12 @@ without him none of this would be possible
if (remotesList.Items.Count > remotesList.SelectedIndex && !reset)
{
remotesList.SelectedIndex++;
SideloaderRCLONE.initGames(currentRemote);
steps++;
}
});
}
public bool isinstalling = false;
private async void downloadInstallGameButton_Click(object sender, EventArgs e)
{
{
@@ -1532,6 +1607,7 @@ without him none of this would be possible
ChangeTitle("");
return;
}
isinstalling = true;
//Add games to the queue
for (int i = 0; i < gamesToDownload.Length; i++)
gamesQueueList.Add(gamesToDownload[i]);
@@ -1660,7 +1736,7 @@ without him none of this would be possible
progressBar.Style = ProgressBarStyle.Continuous;
ChangeTitle("Installing game apk " + gameName, false);
etaLabel.Text = "ETA: Wait for install...";
speedLabel.Text = "DLS: Done downloading";
speedLabel.Text = "DLS: Finished";
if (File.Exists(Environment.CurrentDirectory + "\\" + gameName + "\\install.txt"))
isinstalltxt = true;
if (File.Exists(Environment.CurrentDirectory + "\\" + gameName + "\\Install.txt"))
@@ -1704,6 +1780,7 @@ without him none of this would be possible
Program.form.ChangeTitle($"Sideloading apk...");
output += ADB.Sideload(file, packagename);
});
apkThread.IsBackground = true;
apkThread.Start();
while (apkThread.IsAlive)
await Task.Delay(100);
@@ -1726,7 +1803,9 @@ without him none of this would be possible
while (obbThread.IsAlive)
await Task.Delay(100);
}
}
ChangeTitle($"Installation of {gameName} completed....");
}
if (Properties.Settings.Default.deleteAllAfterInstall)
{
@@ -1750,6 +1829,7 @@ without him none of this would be possible
ChangeTitlebarToDevice();
gamesAreDownloading = false;
ShowPrcOutput(output);
isinstalling = false;
listappsbtn();
initListView();
}
@@ -1813,8 +1893,36 @@ without him none of this would be possible
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
RCLONE.killRclone();
ADB.RunAdbCommandToString("kill-server");
if (isinstalling)
{
var res1 = FlexibleMessageBox.Show(this, "There are downloads and/or installations in progress,\nif you exit now you'll have to start the entire process over again.\nAre you sure you want to exit?", "Still downloading/installing.",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
if (res1 != DialogResult.Yes)
{
e.Cancel = true;
return;
}
}
else if (isuploading)
{
var res = FlexibleMessageBox.Show(this, "There is an upload still in progress, if you exit now\nyou'll have to start the entire process over again.\nAre you sure you want to exit?", "Still uploading.",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
if (res != DialogResult.Yes)
{
e.Cancel = true;
return;
}
else
{
RCLONE.killRclone();
ADB.RunAdbCommandToString("kill-server");
}
}
else
{
RCLONE.killRclone();
ADB.RunAdbCommandToString("kill-server");
}
}
private void ADBWirelessDisable_Click(object sender, EventArgs e)
@@ -1847,6 +1955,14 @@ without him none of this would be possible
}
private void EnablePassthroughAPI_Click(object sender, EventArgs e)
{
ADB.WakeDevice();
ADB.RunAdbCommandToString("shell setprop debug.oculus.experimentalEnabled 1");
FlexibleMessageBox.Show("Passthrough API enabled.");
}
private async void killRcloneButton_Click(object sender, EventArgs e)
{
if (isLoading)

View File

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

View File

@@ -130,6 +130,9 @@
<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>
@@ -139,7 +142,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="battery11" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\battery1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="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>
</root>

View File

@@ -610,5 +610,17 @@ namespace AndroidSideloader.Properties {
this["BMBFchecked"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string GamesList {
get {
return ((string)(this["GamesList"]));
}
set {
this["GamesList"] = value;
}
}
}
}

View File

@@ -149,5 +149,8 @@
<Setting Name="BMBFchecked" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="GamesList" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

View File

@@ -38,9 +38,6 @@ namespace AndroidSideloader
{
if (!MainForm.HasInternet) return new ProcessOutput("", "No internet");
//Set the password for rclone configs
Environment.SetEnvironmentVariable("RCLONE_CRYPT_REMOTE", rclonepw);
Environment.SetEnvironmentVariable("RCLONE_CONFIG_PASS", rclonepw);
ProcessOutput prcoutput = new ProcessOutput();
//Rclone output is unicode, else it will show garbage instead of unicode characters
rclone.StartInfo.StandardOutputEncoding = Encoding.UTF8;
@@ -90,7 +87,7 @@ namespace AndroidSideloader
rclone.WaitForExit();
//if there is one of these errors, we switch the mirrors
if (error.Contains("cannot fetch token") || error.Contains("authError") || (error.Contains("quota") || error.Contains("exceeded") || error.Contains("directory not found")))
if (error.Contains("400 Bad Request") || error.Contains("cannot fetch token") || error.Contains("authError") || error.Contains("quota") || error.Contains("exceeded") || error.Contains("directory not found") || error.Contains("couldn't list"))
{
string oldRemote = MainForm.currentRemote;
try
@@ -111,8 +108,10 @@ namespace AndroidSideloader
if (!output.Contains("Game Name;Release Name;") && !output.Contains("package:"))
Logger.Log($"Rclone error: {error}\nRclone Output: {output}");
if (error.Contains("There is not enough space"))
{
FlexibleMessageBox.Show("There isn't enough space on your PC to properly install this game. Please have at least 2x the size of the game you are trying to download/install available on the drive where Rookie is installed.", "NOT ENOUGH SPACE");
return prcoutput;
}
return prcoutput;
}
}

BIN
Resources/ajax-loader.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

View File

@@ -35,10 +35,7 @@ And all of them added to PATH, without ANY of them, the spoofer won't work!";
}
//List of all installed package names from connected device
public static Dictionary<string, string> InstalledPackages = new Dictionary<string, string>(); //Packagename and Version
//public static List<string> InstalledPackageNames = new List<string>();
//Remove folder from device
//public static List<string> InstalledPackageNames = new List<string>(); //Remove folder from device
public static ProcessOutput RemoveFolder(string path)
{
ADB.WakeDevice();

View File

@@ -83,23 +83,32 @@ namespace AndroidSideloader
public static void initGames(string remote)
{
if (remote.Contains("08"))
Program.form.SwitchMirrors();
gameProperties.Clear();
games.Clear();
string tempGameList = RCLONE.runRcloneCommand($"cat \"{remote}:{RcloneGamesFolder}/GameList.txt\"").Output;
if (MainForm.debugMode)
{
File.WriteAllText("GamesList.txt", tempGameList);
}
string gamePropertiesLine = Utilities.StringUtilities.RemoveEverythingAfterFirst(tempGameList, "\n");
foreach (string gameProperty in gamePropertiesLine.Split(';'))
{
gameProperties.Add(gameProperty);
}
gameProperties.Add("Upload Date");
gameProperties.Add("Last Updated");
tempGameList = Utilities.StringUtilities.RemoveEverythingBeforeFirst(tempGameList, "\n");
List<rcloneFolder> gameFolders = JsonConvert.DeserializeObject<List<rcloneFolder>>(RCLONE.runRcloneCommand($"lsjson \"{remote}:{RcloneGamesFolder}\"").Output);
if (gameFolders == null || gameFolders.Count < 1)
{
Program.form.SwitchMirrors();
gameFolders = JsonConvert.DeserializeObject<List<rcloneFolder>>(RCLONE.runRcloneCommand($"lsjson \"{remote}:{RcloneGamesFolder}\"").Output);
}
foreach (string game in tempGameList.Split('\n'))
@@ -109,14 +118,18 @@ namespace AndroidSideloader
string[] splitGame = game.Split(';');
//gameFolder.find();
var gameFolder = gameFolders.Find((predicate) => predicate.Path == splitGame[1]);
//splitGame[6] = gameFolder.ModTime;
Array.Resize(ref splitGame, splitGame.Length + 1);
string gametime = Utilities.StringUtilities.RemoveEverythingAfterLast(gameFolder.ModTime, ":");
gametime = gametime.Replace("T", " ");
splitGame[splitGame.Length - 1] = gametime;
games.Add(splitGame);
var gameSynced = gameFolders.Exists((predicate) => predicate.Path == splitGame[1]);
if (gameSynced)
{
var gameFolder = gameFolders.Find((predicate) => predicate.Path == splitGame[1]);
//splitGame[6] = gameFolder.ModTime;
string gametime = Utilities.StringUtilities.RemoveEverythingAfterLast(gameFolder.ModTime, ":");
gametime = gametime.Replace("T", " ");
splitGame[splitGame.Length - 1] = gametime;
games.Add(splitGame);
}
}
}

View File

@@ -17,7 +17,7 @@ namespace AndroidSideloader
private static string RawGitHubUrl;
private static string GitHubUrl;
static readonly public string LocalVersion = "2.8";
static readonly public string LocalVersion = "2.8.2";
public static string currentVersion = string.Empty;
public static string changelog = string.Empty;

36
Utilities/UploadGame.cs Normal file
View File

@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AndroidSideloader.Utilities
{
class UploadGame
{
private string uploadcommand;
public string Uploadcommand
{
get => uploadcommand;
set => uploadcommand = value;
}
private string pckgcommand;
public string Pckgcommand
{
get => pckgcommand;
set => pckgcommand = value;
}
private string uploadgamename;
public string Uploadgamename
{
get => uploadgamename;
set => uploadgamename = value;
}
private ulong uploadversion;
public ulong Uploadversion
{
get => uploadversion;
set => uploadversion = value;
}
}
}

View File

@@ -1,26 +1,26 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
RSL 2.8.2
+ Added automatic upload to Google shared drive
for clean game files donation.
+ Added uploading GIF for duration of upload.
+ Added warning messages when user attempts
to close Rookie while games are download, installing,
or uploading.
= Threaded clean file zipping and uploading
so user can continue to use Rookie while game
is uploading.
RSL 2.8
P.S. We are looking for volunteers for the next
beta which will automatically detect new games
installed on user's headset and suggest them for
donation. Message https://t.me/Harryeffinpotter or
https://t.me/pmowpmow on Telegram to join the beta
test!
+ Added "Upload Date" to games list columns.
= Drag and drop install will now show current APK name.
HFP
HFP
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEYj1sACgkQx/Rql1Vo
czfO+A/+MGfS+NCkcBwYuxLOkkaojyDetDqHSVZ+onuPW3QL2IRuc4CUxNFLi9br
8mqLz/EHD5F4++Hmc1limdF+r4Xxwdz9E00u1sbJbR+QhXes4vzxGNkOJlxC1PNW
L8mEfMQLwoSyo8d4aKYJY1LsUmYaIQP81ae5MKt/4l3i2RivrCcfJvDaEBi6DJ1H
EjFlFWaPpIjNDm0m1klzcrG0RRVHXtR1xw3IKcMhPeT7VSDYuc2ySXVwVSiHAOXr
OPaDSNvNwnIGceM5HOqyQYHq+T0t/3z5bcndAq1EaLJ5W/1f8QcjRlowmMXO4uWs
a7YIsgB96i4Riy1xmINf0z2sxvFNIUwCHvTNe/kD/ppN+RFfozM3KJyGwaMxpkRw
LcG5FYwGYJZu9QhL36lokERUwsuzBb3ZVABv77oFJ/nPaS4C6CE8g5x08nXiCfqf
Lo+RbI+jPX12nLrlKXdleG/xcMAdGUaIxglfpqxi/EG9w5kzUaMXMtybdNj1/p7q
UrHgO/V2No/fsrgu28EEguIyDwk78JFHCpebrZH1/RC9ALQiN6I7eq5W1k1S9Buf
HGgYk4U2Igm2Ud2oPsqV3dtTPbxqZtM3KCP4cvbaNzoqagvPTHuLQ8LXoPj1XWAd
RfC8bi2Rulyx7Yv8uolyRqQVgHvUaPm4nIYHFpw59UTujMMkkZ0=
=kLxd
-----END PGP SIGNATURE-----
P.S MOVED PGP SIGNATURE TO CHANGELOGHISTORY.TXT @
https://github.com/nerdunit/androidsideloader

View File

@@ -1 +1 @@
2.8
2.8.2