From d02505b1729a8412125e714dad6e44612ea0a068 Mon Sep 17 00:00:00 2001
From: Harry Fn Potter <73411256+harryeffinpotter@users.noreply.github.com>
Date: Fri, 6 Aug 2021 14:41:09 -0400
Subject: [PATCH] -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256
RSL 2.7
+ Added BMBF drag and drop option for Quest users
in SETTINGS menu.If users drag and drop BMBF song
zip files onto rookie either one by one, an entire
folder, or many zips at once Rookie will automatically
extract the files to a folder then push the folder
to your device then delete the extraction folder.
+ Added automatic timeout during APK install that
will ask user if they'd like Rookie to automatically
uninstall and reinstall the app. Rookie will check
for save data and copy it to a folder temporarily
then put it back after reinstall.
= Cleaned up startup tasks so booting Rookie should
be faster.
= Added automatic deletion of previous crashlog to
decrease clutter in Rookie directory.
= Added automatic installed app refresh after drag
and drop.
HFP
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmENfVMACgkQx/Rql1Vo
czcxaw//bTVxR5gt1F4c+gDT80dVfJa1Js3h5vSjGgCHjQdmsU6eaU5BQGoUorkw
6ewYF48jt84xDNj/VirkeqHV95mvsj9sksi+mxvELnAa0NdRVYj0DCqZWB/mNDfx
lYZGp2SwiGK3a6KfMpPcbi2IEWqc9ZWpdazIDy6l3oGSBAYaoVqfjl+CJQQpomIJ
x7f67Ei633dyhu8+0612LVu+tZ4ibN2pAAu1Dd5+uvlODUiYLPadhZkLwk+CYC6p
ifs/1qB/fsXJS6YJyPCmuZCbYN//jLCD9ECQ5cqZbTTU82Ub2lDE+TcdO/CsxSxU
pueIxZ+7C5TceiNzsDfKfeCWu65hZlBW1xKReDtLPFzZdZuyXYTI0v00kvapwJIO
C9Eq2qxZvdnp05tw8nY1V4Ae5Jl6oLN0BwWSZv50NhQ4Dpmbl8pemk1r5iZsRhGA
MWQCytBCaX/3EpJda8ifGJxj3kOno2ewbwXdZEMN7QqWt1scN9HxNXFWEJwO29HV
pT6ra3T0OrOBLmCQGt4w71HGFK2t+c7aPq0yI/sayguB9zjR/GpTyekg7nHXZh9g
c+WD5umN2xA0LuLjvvePKhhKTBT6ebmQJh1CRNIRtA150ULbnTAIpZJTDZyhcLXi
IUfWyWPA4G3GsRUqGWf97O2G2bIbbIzLeg3uEdxF7T9LOigYgpU=
=Rwj0
-----END PGP SIGNATURE-----
---
ADB.cs | 3 +-
App.config | 13 +-
ChangelogHistory.txt | 41 +++++
MainForm.Designer.cs | 4 +-
MainForm.cs | 255 ++++++++++++++++++++++----------
Properties/Settings.Designer.cs | 9 +-
Properties/Settings.settings | 2 +-
SettingsForm.Designer.cs | 42 ++++--
SettingsForm.cs | 7 +
Updater.cs | 2 +-
changelog.txt | 146 ++++--------------
version | 2 +-
12 files changed, 298 insertions(+), 228 deletions(-)
diff --git a/ADB.cs b/ADB.cs
index 364db120..7f714daa 100644
--- a/ADB.cs
+++ b/ADB.cs
@@ -168,7 +168,7 @@ public static ProcessOutput RunCommandToString(string result, string path = "")
if (logcmd.Contains(Environment.CurrentDirectory))
logcmd = logcmd.Replace($"{Environment.CurrentDirectory}", $"CurrentDirectory");
Logger.Log($"Running command: {logcmd}");
- adb.StartInfo.FileName = "cmd.exe";
+ adb.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
adb.StartInfo.Arguments = command;
adb.StartInfo.RedirectStandardError = true;
adb.StartInfo.RedirectStandardInput = true;
@@ -377,7 +377,6 @@ public static ProcessOutput Sideload(string path = "", string packagename = "")
WakeDevice();
ProcessOutput ret = new ProcessOutput();
- Program.form.ChangeTitle($"Sideloading {Path.GetFileName(path)}");
ret += RunAdbCommandToString($"install -g -r \"{path}\"");
string out2 = ret.Output + ret.Error;
if (out2.Contains("failed"))
diff --git a/App.config b/App.config
index 346a4b03..6096e153 100644
--- a/App.config
+++ b/App.config
@@ -5,9 +5,6 @@
-
-
-
@@ -158,6 +155,9 @@
False
+
+ False
+
@@ -216,11 +216,4 @@
-
-
-
- False
-
-
-
\ No newline at end of file
diff --git a/ChangelogHistory.txt b/ChangelogHistory.txt
index 9182304c..d16877be 100644
--- a/ChangelogHistory.txt
+++ b/ChangelogHistory.txt
@@ -1,6 +1,47 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
+RSL 2.6
+
++ Added No Device mode for those who wish to download games
+overnight without interruption.
++ Added automatic config update at launch.
++ Added a unique HWID generator that will generate a unique
+number based on your PC's components and then encrypt it
+with SHA256. This is so donors can be anonymously identified
+for the purpose of future benefits/recognition. Once.the HWID
+is generated RSL then creates a text file named HWID to put
+with the clean files in the zip. Users can see their unique
+HWID at any time by pressing CTRL+H in Rookie. Your unique HWID
+will always be the same.
+= Added version code to any zip files created during clean files
+prep.
+= Added boolean to check if user has been asked to send clean
+files, if they have it won't appear again for some time.
+= Fixed OBB installation for Install+Download.
+
+HFP
+
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEJuZYACgkQx/Rql1Vo
+cze1yg//Yyw+tRfA3hLxLQejXhj/LyFsGOoTCyqTVQDuUtxZxyMAFUN3SCd5sC3h
+byVpcoDMaBMGoOgE3FnpEvObd3SHVaB3xqw902saHPAhzuujv4Ru25ou+xRDU8c6
++xXPQ3O4ocgHwlFP+nCVx3eXai8Dz/2OUc6JC2PfpjU/xj3B6cs/ExSrxoHqyCJL
+g5lntpE0dFQboe6gu7uEQn2Qal1Gsn2+MqCqQZh1dBIpF/gEPD8/q40St/lN7cdY
+jm1lVxW3By7muxlh9wcRYsxQk78cb49+Vsa+EcxS6GK0m8Hibp8nS7RoHFMBtC1i
+hgIZW5lt1cCj5WlwI3/t+vLR4Ia/eh7Vi0EiyVGhiOIQvCR2+PpkWWrVDe3zoXUX
+n68zFZlL2yoaCXg5AWPp3KiQff3uxlBD58fzNZRtKzjFPNmcYR6x7PcHfai76+JD
+aE36aC8Q3aMCaIaH+gH+eAhl+mzyX1Vhdl9NLLHLUXZwBnSA9drMHJsVMh6SOQiC
+VMiv1vMXJllKq/7W7EGr1fWFGuPJk6FFjT1g+3+2d71yVKyPL+99JQg7UJzp112w
+7ZUAD6Wt8lpW66I2zpcOBPwpoAlxg2uJy2Nc38axfrBpHsscNrYIXFMHEprLG+Xk
+PqnfDHPtP1sUxe2uiZTQj3JjlEnb4ES/xBdvSPacc53+fBPs0yM=
+=BAUp
+-----END PGP SIGNATURE-----
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA256
+
RSL 2.5.1
+ Added PARTIAL SEARCH compatibility to Quick Search. Quick
diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs
index 43af7411..893b674c 100644
--- a/MainForm.Designer.cs
+++ b/MainForm.Designer.cs
@@ -856,9 +856,9 @@ private void InitializeComponent()
this.gamesListView.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.gamesListView.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
this.gamesListView.HideSelection = false;
- this.gamesListView.Location = new System.Drawing.Point(224, 72);
+ this.gamesListView.Location = new System.Drawing.Point(224, 71);
this.gamesListView.Name = "gamesListView";
- this.gamesListView.Size = new System.Drawing.Size(746, 359);
+ this.gamesListView.Size = new System.Drawing.Size(746, 360);
this.gamesListView.TabIndex = 6;
this.gamesListView.UseCompatibleStateImageBehavior = false;
this.gamesListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView1_ColumnClick);
diff --git a/MainForm.cs b/MainForm.cs
index cc544ca0..6ea64f18 100644
--- a/MainForm.cs
+++ b/MainForm.cs
@@ -30,6 +30,8 @@ public partial class MainForm : Form
#else
public bool keyheld;
public bool keyheld2;
+ public static string CurrAPK;
+ public static string CurrPCKG;
public static bool debugMode = false;
public bool DeviceConnected = false;
#endif
@@ -77,10 +79,7 @@ public MainForm()
t2.Interval = 30; // 30ms
t2.Tick += new EventHandler(timer_Tick2);
t2.Start();
- System.Windows.Forms.Timer t3 = new System.Windows.Forms.Timer();
- t3.Interval = 350; // 1 second before clipboard copy is allowed
- t3.Tick += new EventHandler(timer_Tick3);
- t3.Start();
+
lvwColumnSorter = new ListViewColumnSorter();
this.gamesListView.ListViewItemSorter = lvwColumnSorter;
if (searchTextBox.Visible)
@@ -189,6 +188,8 @@ private async void Form1_Load(object sender, EventArgs e)
catch { }
if (File.Exists("crashlog.txt"))
{
+ if (File.Exists(Properties.Settings.Default.CurrentCrashPath))
+ File.Delete(Properties.Settings.Default.CurrentCrashPath);
DialogResult dialogResult = FlexibleMessageBox.Show($"Sideloader crashed during your last use.\nPress OK if you'd like to send us your crash log.\n\n NOTE: THIS CAN TAKE UP TO 30 SECONDS.", "Crash Detected", MessageBoxButtons.OKCancel);
if (dialogResult == DialogResult.OK)
{
@@ -232,18 +233,10 @@ private async void Form1_Shown(object sender, EventArgs e)
Thread.Sleep(10000);
freeDisclaimer.Invoke(() => { freeDisclaimer.Dispose(); });
}).Start();
- initMirrors(true);
- if (updatedConfig == false && Properties.Settings.Default.autoUpdateConfig == true) //check for config only once per program open and if setting enabled
- {
- updatedConfig = true;
- ChangeTitle("Checking if config is updated and updating config");
- progressBar.Style = ProgressBarStyle.Marquee;
- await Task.Run(() => SideloaderRCLONE.updateConfig(currentRemote));
- progressBar.Style = ProgressBarStyle.Continuous;
- }
+
+ progressBar.Style = ProgressBarStyle.Continuous;
Thread t1 = new Thread(() =>
{
-
if (!debugMode && Properties.Settings.Default.checkForUpdates)
{
Updater.AppName = "AndroidSideloader";
@@ -251,53 +244,51 @@ private async void Form1_Shown(object sender, EventArgs e)
Updater.Update();
}
progressBar.Invoke(() => { progressBar.Style = ProgressBarStyle.Marquee; });
+
ChangeTitle("Initializing Mirrors");
initMirrors(true);
-
ChangeTitle("Initializing Games");
- if (!Directory.Exists(SideloaderRCLONE.Nouns))
- SideloaderRCLONE.UpdateNouns(currentRemote);
+ SideloaderRCLONE.UpdateNouns(currentRemote);
SideloaderRCLONE.initGames(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!");
}
ChangeTitle("Syncing Game Photos");
SideloaderRCLONE.UpdateGamePhotos(currentRemote);
-
- if (Directory.Exists(SideloaderRCLONE.Nouns))
- {
- ChangeTitle("Updating list of needed clean apps...");
- SideloaderRCLONE.UpdateNouns(currentRemote);
- }
-
-
+ ChangeTitle("Updating list of needed clean apps...");
+ SideloaderRCLONE.UpdateNouns(currentRemote);
ChangeTitle("Checking for Updates on server...");
SideloaderRCLONE.UpdateGameNotes(currentRemote);
- listappsbtn();
+ ChangeTitle("Loaded");
});
t1.SetApartmentState(ApartmentState.STA);
- t1.IsBackground = false;
+ t1.IsBackground = true;
if (HasInternet)
t1.Start();
-
- showAvailableSpace();
-
- intToolTips();
-
while (t1.IsAlive)
await Task.Delay(100);
+ 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 (t1.IsAlive)
+ await Task.Delay(100);
+ ChangeTitle("Populating update list, please wait...");
+ listappsbtn();
initListView();
- ChangeTitle("Loaded");
+ showAvailableSpace();
+ intToolTips();
+ ChangeTitle("");
downloadInstallGameButton.Enabled = true;
-
progressBar.Style = ProgressBarStyle.Continuous;
isLoading = false;
-
-
-
}
@@ -338,14 +329,9 @@ void timer_Tick(object sender, EventArgs e)
void timer_Tick2(object sender, EventArgs e)
{
-
keyheld = false;
}
- void timer_Tick3(object sender, EventArgs e)
- {
- keyheld2 = false;
- }
public async void ChangeTitle(string txt, bool reset = true)
{
try
@@ -366,7 +352,8 @@ public async void ChangeTitle(string txt, bool reset = true)
if (!ProgressText.IsDisposed)
ProgressText.Text = oldTitle;
});
- } catch
+ }
+ catch
{
}
@@ -374,7 +361,6 @@ public async void ChangeTitle(string txt, bool reset = true)
-
private void ShowSubMenu(Panel subMenu)
{
if (subMenu.Visible == false)
@@ -728,6 +714,7 @@ public void listappsbtn()
m_combo.Invoke(() => { m_combo.Items.Clear(); });
var line = listapps().Split('\n');
+
string forsettings = String.Join("", line);
Properties.Settings.Default.InstalledApps = forsettings;
Properties.Settings.Default.Save();
@@ -811,7 +798,7 @@ private async void getApkButton_Click(object sender, EventArgs e)
while (t2.IsAlive)
await Task.Delay(100);
ChangeTitle("Zipping extracted application...");
- string cmd = $"7z a \"{packageName} v{VersionInt}.zip\" \"{packageName}\\*\"";
+ string cmd = $"7z a {packageName}v{VersionInt}.zip .\\{packageName}\\*";
string path = $"{Properties.Settings.Default.MainDir}\\7z.exe";
Thread t3 = new Thread(() =>
{
@@ -822,7 +809,7 @@ private async void getApkButton_Click(object sender, EventArgs e)
while (t3.IsAlive)
await Task.Delay(100);
- File.Move($"{Properties.Settings.Default.MainDir}\\{packageName} v{VersionInt}.zip", $"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\\{GameName} v{VersionInt}.zip");
+ 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;
@@ -935,10 +922,12 @@ private async void copyBulkObbButton_Click(object sender, EventArgs e)
private async void Form1_DragDrop(object sender, DragEventArgs e)
{
+ DragDropLbl.Visible = false;
ProcessOutput output = new ProcessOutput("", "");
ADB.WakeDevice();
ADB.DeviceID = GetDeviceID();
progressBar.Style = ProgressBarStyle.Marquee;
+
Thread t1 = new Thread(() =>
{
@@ -951,8 +940,9 @@ private async void Form1_DragDrop(object sender, DragEventArgs e)
string path = $"{dir}\\Install.txt";
if (Directory.Exists(data))
{
+ Program.form.ChangeTitle($"Copying {data} to device...");
output += ADB.CopyOBB(data);
- Program.form.ChangeTitle("");
+ Program.form.ChangeTitle($"");
string extension = Path.GetExtension(data);
if (extension == ".apk")
{
@@ -967,6 +957,7 @@ private async void Form1_DragDrop(object sender, DragEventArgs e)
else
ChangeTitle("Sideloading custom install.txt automatically.");
output += Sideloader.RunADBCommandsFromFile(path);
+ Logger.Log($"Sideloading {path}");
if (output.Error.Contains("mkdir"))
output.Error = "";
if (output.Error.Contains("reserved"))
@@ -978,15 +969,31 @@ private async void Form1_DragDrop(object sender, DragEventArgs e)
foreach (string file2 in files)
{
if (File.Exists(file2))
+ {
if (file2.EndsWith(".apk"))
{
+ ChangeTitle($"Installing apk... (If this hangs, uninstall app first then install again)");
output += ADB.Sideload(file2);
}
+
+ if (file2.EndsWith(".zip") && Properties.Settings.Default.BMBFchecked)
+ {
+ string datazip = file2;
+ string zippath = Path.GetDirectoryName(data);
+ datazip = datazip.Replace(zippath, "");
+ datazip = Utilities.StringUtilities.RemoveEverythingAfterFirst(datazip, ".");
+ datazip = datazip.Replace(".", "");
+ string command2 = $"\"{Properties.Settings.Default.MainDir}\\7z.exe\" e \"{file2}\" -o\"{zippath}\\{datazip}\\\"";
+ ADB.RunCommandToString(command2, file2);
+ output += ADB.RunAdbCommandToString($"push \"{zippath}\\{datazip}\" /sdcard/ModData/com.beatgames.beatsaber/Mods/SongLoader/CustomLevels/");
+ Directory.Delete($"{zippath}\\{datazip}", true);
+ }
+ }
}
string[] folders = Directory.GetDirectories(data);
foreach (string folder in folders)
{
-
+ Program.form.ChangeTitle($"Copying {folder} to device...");
output += ADB.CopyOBB(folder);
Program.form.ChangeTitle("");
Properties.Settings.Default.CurrPckg = dir;
@@ -1016,11 +1023,14 @@ private async void Form1_DragDrop(object sender, DragEventArgs e)
else
{
- ChangeTitle($"Installing {Path.GetFileName(data)}...");
+ ChangeTitle($"Installing apk... (If this hangs, uninstall app first then install again)");
output += ADB.Sideload(data);
+
+
ChangeTitle("");
}
}
+ //If obb is dragged and dropped alone onto Rookie, Rookie will recreate its obb folder automatically with this code.
else if (extension == ".obb")
{
string filename = Path.GetFileName(data);
@@ -1035,7 +1045,21 @@ private async void Form1_DragDrop(object sender, DragEventArgs e)
Directory.Delete(foldername, true);
ChangeTitle("");
}
-
+ // BMBF Zip extraction then push to BMBF song folder on Quest.
+ else if (extension == ".zip" && Properties.Settings.Default.BMBFchecked)
+ {
+ string datazip = data;
+ string zippath = Path.GetDirectoryName(data);
+ datazip = datazip.Replace(zippath, "");
+ datazip = Utilities.StringUtilities.RemoveEverythingAfterFirst(datazip, ".");
+ datazip = datazip.Replace(".", "");
+
+ string command = $"\"{Properties.Settings.Default.MainDir}\\7z.exe\" e \"{data}\" -o\"{zippath}\\{datazip}\\\"";
+
+ ADB.RunCommandToString(command, data);
+ output += ADB.RunAdbCommandToString($"push \"{zippath}\\{datazip}\" /sdcard/ModData/com.beatgames.beatsaber/Mods/SongLoader/CustomLevels/");
+ Directory.Delete($"{zippath}\\{datazip}", true);
+ }
else if (extension == ".txt")
{
ChangeTitle("Sideloading custom install.txt automatically.");
@@ -1058,6 +1082,9 @@ private async void Form1_DragDrop(object sender, DragEventArgs e)
DragDropLbl.Visible = false;
ShowPrcOutput(output);
+ listappsbtn();
+ initListView();
+
}
private void Form1_DragEnter(object sender, DragEventArgs e)
@@ -1165,7 +1192,7 @@ private async void initListView()
t1.Start();
while (t1.IsAlive)
- await Task.Delay(100);
+ await Task.Delay(1000);
ChangeTitle("Extracting obb if it exists....");
Thread t2 = new Thread(() =>
{
@@ -1175,9 +1202,9 @@ private async void initListView()
t2.Start();
while (t2.IsAlive)
- await Task.Delay(100);
+ await Task.Delay(1000);
ChangeTitle("Zipping extracted application...");
- string cmd = $"7z a \"{packagename} v{installedVersionInt}.zip\" \"{packagename}\\*\"";
+ string cmd = $"7z a {packagename}v{installedVersionInt}.zip .\\{packagename}\\*";
string path = $"{Properties.Settings.Default.MainDir}\\7z.exe";
Thread t3 = new Thread(() =>
@@ -1187,8 +1214,7 @@ private async void initListView()
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");
+ 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);
});
@@ -1355,7 +1381,7 @@ private async void ADBWirelessEnable_Click(object sender, EventArgs e)
private async void listApkButton_Click(object sender, EventArgs e)
{
ADB.WakeDevice();
-
+ ChangeTitle("Refreshing connected devices, installed apps and update list...");
if (isLoading)
return;
isLoading = true;
@@ -1377,6 +1403,7 @@ private async void listApkButton_Click(object sender, EventArgs e)
initListView();
progressBar.Style = ProgressBarStyle.Continuous;
isLoading = false;
+ ChangeTitle("");
}
private static readonly HttpClient client = new HttpClient();
@@ -1386,7 +1413,7 @@ private async void listApkButton_Click(object sender, EventArgs e)
private bool gamesAreDownloading = false;
private List gamesQueueList = new List();
private int quotaTries = 0;
-
+ public static bool timerticked = false;
public void SwitchMirrors()
{
quotaTries++;
@@ -1411,7 +1438,7 @@ private async void downloadInstallGameButton_Click(object sender, EventArgs e)
{
progressBar.Style = ProgressBarStyle.Marquee;
if (gamesListView.SelectedItems.Count == 0) return;
-
+
string namebox = gamesListView.SelectedItems[0].ToString();
string nameboxtranslated = Sideloader.gameNameToSimpleName(namebox);
ChangeTitle($"Checking filesize of {nameboxtranslated}...");
@@ -1636,25 +1663,30 @@ private async void downloadInstallGameButton_Click(object sender, EventArgs e)
{
if (extension == ".apk")
{
+ CurrAPK = file;
+ CurrPCKG = packagename;
+ System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
+ t.Interval = 60000; // 60 seconds to fail
+ t.Tick += new EventHandler(timer_Tick4);
+ t.Start();
Thread apkThread = new Thread(() =>
{
+ Program.form.ChangeTitle($"Sideloading apk...");
output += ADB.Sideload(file, packagename);
});
-
apkThread.Start();
while (apkThread.IsAlive)
await Task.Delay(100);
+ t.Stop();
}
Debug.WriteLine(wrDelimiter);
- ChangeTitle("Installing game obb " + gameName, false);
if (Directory.Exists($"{Environment.CurrentDirectory}\\{gameName}\\{packagename}"))
{
Thread obbThread = new Thread(() =>
{
ChangeTitle($"Copying {packagename} obb to device...");
-
output += ADB.RunAdbCommandToString($"push \"{Environment.CurrentDirectory}\\{gameName}\\{packagename}\" \"/sdcard/Android/obb\"");
Program.form.ChangeTitle("");
});
@@ -1693,6 +1725,68 @@ private async void downloadInstallGameButton_Click(object sender, EventArgs e)
}
}
+ private async void timer_Tick4(object sender, EventArgs e)
+ {
+ ProcessOutput output = new ProcessOutput("", "");
+ if (!timerticked)
+ {
+ timerticked = true;
+ string[] blacklist = File.ReadAllLines($"{Environment.CurrentDirectory}\\installedPackages.json");
+ bool isinstalled = false;
+ foreach (string blacklistpckg in blacklist)
+ {
+ if (blacklistpckg.Contains(CurrPCKG))
+ {
+ isinstalled = true;
+ }
+ }
+ 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)
+ {
+ Thread reinstallThread = new Thread(() =>
+ {
+ ChangeTitle("Preforming 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.Sideload(CurrAPK);
+ ADB.RunAdbCommandToString($"push \"{Environment.CurrentDirectory}\\{CurrPCKG}\" /sdcard/Android/data/");
+ listappsbtn();
+ initListView();
+
+ });
+ reinstallThread.IsBackground = true;
+ reinstallThread.Start();
+ while (reinstallThread.IsAlive)
+ await Task.Delay(100);
+ timerticked = false;
+ if (Directory.Exists($"{Environment.CurrentDirectory}\\{CurrPCKG}"))
+ Directory.Delete($"{Environment.CurrentDirectory}\\{CurrPCKG}", true);
+ ChangeTitle("");
+ }
+
+ 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)
+ {
+ ChangeTitle("Stopping Install...");
+ ADB.RunAdbCommandToString("kill-server");
+ ADB.RunAdbCommandToString("devices");
+ }
+ else
+ {
+ return;
+ }
+ }
+ }
+ }
+ }
+
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
RCLONE.killRclone();
@@ -2043,26 +2137,25 @@ public void gamesListView_SelectedIndexChanged(object sender, EventArgs e)
Clipboard.SetText(CurrentPackageName);
keyheld2 = true;
}
- if (!keyheld)
- {
- string ImagePath = "";
- if (File.Exists($"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.jpg"))
- ImagePath = $"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.jpg";
- else if (File.Exists($"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.png"))
- ImagePath = $"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.png";
- if (gamesPictureBox.BackgroundImage != null)
- gamesPictureBox.BackgroundImage.Dispose();
- if (File.Exists(ImagePath) && !keyheld)
- {
- gamesPictureBox.BackgroundImage = Image.FromFile(ImagePath);
-
- }
- else
- gamesPictureBox.BackgroundImage = new Bitmap(367, 214);
- keyheld = true;
-
+
+ string ImagePath = "";
+ if (File.Exists($"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.jpg"))
+ ImagePath = $"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.jpg";
+ else if (File.Exists($"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.png"))
+ ImagePath = $"{SideloaderRCLONE.ThumbnailsFolder}\\{CurrentPackageName}.png";
+ if (gamesPictureBox.BackgroundImage != null)
+ gamesPictureBox.BackgroundImage.Dispose();
+ if (File.Exists(ImagePath) && !keyheld)
+ {
+ gamesPictureBox.BackgroundImage = Image.FromFile(ImagePath);
+
}
-
+ else
+ gamesPictureBox.BackgroundImage = new Bitmap(367, 214);
+ keyheld = true;
+
+
+
string NotePath = $"{SideloaderRCLONE.NotesFolder}\\{CurrentReleaseName}.txt";
if (File.Exists(NotePath))
notesRichTextBox.Text = File.ReadAllText(NotePath);
diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs
index 0f55d880..0677f4de 100644
--- a/Properties/Settings.Designer.cs
+++ b/Properties/Settings.Designer.cs
@@ -599,12 +599,15 @@ public bool nodevicemode {
}
}
- [global::System.Configuration.ApplicationScopedSettingAttribute()]
+ [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
- public bool UsingBMBF {
+ public bool BMBFchecked {
get {
- return ((bool)(this["UsingBMBF"]));
+ return ((bool)(this["BMBFchecked"]));
+ }
+ set {
+ this["BMBFchecked"] = value;
}
}
}
diff --git a/Properties/Settings.settings b/Properties/Settings.settings
index b2dd6127..c40950a0 100644
--- a/Properties/Settings.settings
+++ b/Properties/Settings.settings
@@ -146,7 +146,7 @@
False
-
+
False
diff --git a/SettingsForm.Designer.cs b/SettingsForm.Designer.cs
index 1a1fc713..98e8f0e9 100644
--- a/SettingsForm.Designer.cs
+++ b/SettingsForm.Designer.cs
@@ -47,6 +47,7 @@ private void InitializeComponent()
this.textBox1 = new System.Windows.Forms.TextBox();
this.CblindBox = new System.Windows.Forms.CheckBox();
this.nodevicemodeBox = new System.Windows.Forms.CheckBox();
+ this.bmbfBox = new System.Windows.Forms.CheckBox();
this.SuspendLayout();
//
// checkForUpdatesCheckBox
@@ -71,7 +72,7 @@ private void InitializeComponent()
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, 265);
+ this.applyButton.Location = new System.Drawing.Point(67, 280);
this.applyButton.Name = "applyButton";
this.applyButton.Size = new System.Drawing.Size(101, 31);
this.applyButton.TabIndex = 5;
@@ -101,7 +102,7 @@ private void InitializeComponent()
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, 265);
+ this.resetSettingsButton.Location = new System.Drawing.Point(174, 280);
this.resetSettingsButton.Name = "resetSettingsButton";
this.resetSettingsButton.Size = new System.Drawing.Size(101, 31);
this.resetSettingsButton.TabIndex = 4;
@@ -156,7 +157,7 @@ private void InitializeComponent()
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, 233);
+ this.BandwithTextbox.Location = new System.Drawing.Point(52, 248);
this.BandwithTextbox.Name = "BandwithTextbox";
this.BandwithTextbox.Size = new System.Drawing.Size(177, 24);
this.BandwithTextbox.TabIndex = 11;
@@ -166,7 +167,7 @@ private void InitializeComponent()
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, 210);
+ this.label1.Location = new System.Drawing.Point(40, 225);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(245, 18);
this.label1.TabIndex = 12;
@@ -187,7 +188,7 @@ private void InitializeComponent()
"K",
"M",
"G"});
- this.BandwithComboBox.Location = new System.Drawing.Point(235, 233);
+ this.BandwithComboBox.Location = new System.Drawing.Point(235, 248);
this.BandwithComboBox.Name = "BandwithComboBox";
this.BandwithComboBox.Size = new System.Drawing.Size(55, 26);
this.BandwithComboBox.TabIndex = 13;
@@ -201,7 +202,7 @@ private void InitializeComponent()
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, 310);
+ this.DebugLogCopy.Location = new System.Drawing.Point(29, 325);
this.DebugLogCopy.Name = "DebugLogCopy";
this.DebugLogCopy.Size = new System.Drawing.Size(285, 31);
this.DebugLogCopy.TabIndex = 5;
@@ -227,7 +228,7 @@ private void InitializeComponent()
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, 345);
+ this.button1.Location = new System.Drawing.Point(29, 360);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(285, 31);
this.button1.TabIndex = 5;
@@ -238,7 +239,7 @@ private void InitializeComponent()
// debuglogID
//
this.debuglogID.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F);
- this.debuglogID.Location = new System.Drawing.Point(29, 421);
+ this.debuglogID.Location = new System.Drawing.Point(29, 436);
this.debuglogID.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.debuglogID.Name = "debuglogID";
this.debuglogID.Size = new System.Drawing.Size(285, 48);
@@ -253,7 +254,7 @@ private void InitializeComponent()
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, 392);
+ this.DebugID.Location = new System.Drawing.Point(29, 407);
this.DebugID.Margin = new System.Windows.Forms.Padding(2);
this.DebugID.Name = "DebugID";
this.DebugID.ReadOnly = true;
@@ -266,7 +267,7 @@ private void InitializeComponent()
// label2
//
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F);
- this.label2.Location = new System.Drawing.Point(29, 492);
+ this.label2.Location = new System.Drawing.Point(29, 507);
this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(284, 86);
@@ -283,7 +284,7 @@ private void InitializeComponent()
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, 475);
+ this.textBox1.Location = new System.Drawing.Point(29, 490);
this.textBox1.Margin = new System.Windows.Forms.Padding(2);
this.textBox1.Name = "textBox1";
this.textBox1.ReadOnly = true;
@@ -312,7 +313,7 @@ private void InitializeComponent()
this.nodevicemodeBox.AutoSize = true;
this.nodevicemodeBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.nodevicemodeBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
- this.nodevicemodeBox.Location = new System.Drawing.Point(12, 172);
+ this.nodevicemodeBox.Location = new System.Drawing.Point(12, 196);
this.nodevicemodeBox.Name = "nodevicemodeBox";
this.nodevicemodeBox.Size = new System.Drawing.Size(181, 22);
this.nodevicemodeBox.TabIndex = 9;
@@ -320,12 +321,25 @@ private void InitializeComponent()
this.nodevicemodeBox.UseVisualStyleBackColor = true;
this.nodevicemodeBox.CheckedChanged += new System.EventHandler(this.nodevicemodeBox_CheckedChanged);
//
+ // bmbfBox
+ //
+ this.bmbfBox.AutoSize = true;
+ this.bmbfBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
+ this.bmbfBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
+ this.bmbfBox.Location = new System.Drawing.Point(12, 170);
+ this.bmbfBox.Name = "bmbfBox";
+ this.bmbfBox.Size = new System.Drawing.Size(281, 22);
+ this.bmbfBox.TabIndex = 9;
+ this.bmbfBox.Text = "Enable BMBF song zips drag and drop";
+ this.bmbfBox.UseVisualStyleBackColor = true;
+ this.bmbfBox.CheckedChanged += new System.EventHandler(this.bmbfBox_CheckedChanged);
+ //
// SettingsForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
- this.ClientSize = new System.Drawing.Size(342, 569);
+ this.ClientSize = new System.Drawing.Size(342, 606);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.DebugID);
this.Controls.Add(this.crashlogID);
@@ -334,6 +348,7 @@ private void InitializeComponent()
this.Controls.Add(this.BandwithComboBox);
this.Controls.Add(this.label1);
this.Controls.Add(this.BandwithTextbox);
+ this.Controls.Add(this.bmbfBox);
this.Controls.Add(this.nodevicemodeBox);
this.Controls.Add(this.CblindBox);
this.Controls.Add(this.userJsonOnGameInstall);
@@ -382,5 +397,6 @@ private void InitializeComponent()
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.CheckBox CblindBox;
private System.Windows.Forms.CheckBox nodevicemodeBox;
+ private System.Windows.Forms.CheckBox bmbfBox;
}
}
\ No newline at end of file
diff --git a/SettingsForm.cs b/SettingsForm.cs
index 5ec376df..d60493f0 100644
--- a/SettingsForm.cs
+++ b/SettingsForm.cs
@@ -34,6 +34,7 @@ private void intSettings()
updateConfigCheckBox.Checked = Properties.Settings.Default.autoUpdateConfig;
userJsonOnGameInstall.Checked = Properties.Settings.Default.userJsonOnGameInstall;
nodevicemodeBox.Checked = Properties.Settings.Default.nodevicemode;
+ bmbfBox.Checked = Properties.Settings.Default.BMBFchecked;
if (Properties.Settings.Default.BandwithLimit.Length > 1)
{
@@ -216,6 +217,12 @@ private void nodevicemodeBox_CheckedChanged(object sender, EventArgs e)
Properties.Settings.Default.nodevicemode = nodevicemodeBox.Checked;
Properties.Settings.Default.Save();
}
+
+ private void bmbfBox_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.BMBFchecked = nodevicemodeBox.Checked;
+ Properties.Settings.Default.Save();
+ }
}
}
diff --git a/Updater.cs b/Updater.cs
index 81adf0f9..01bb9c93 100644
--- a/Updater.cs
+++ b/Updater.cs
@@ -17,7 +17,7 @@ class Updater
private static string RawGitHubUrl;
private static string GitHubUrl;
- static readonly public string LocalVersion = "2.6";
+ static readonly public string LocalVersion = "2.7";
public static string currentVersion = string.Empty;
public static string changelog = string.Empty;
diff --git a/changelog.txt b/changelog.txt
index 7c10f01e..13331214 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,124 +1,42 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
-RSL 2.6
-+ Added No Device mode for those who wish to download games
-overnight without interruption.
-+ Added automatic config update at launch.
-+ Added a unique HWID generator that will generate a unique
-number based on your PC's components and then encrypt it
-with SHA256. This is so donors can be anonymously identified
-for the purpose of future benefits/recognition. Once.the HWID
-is generated RSL then creates a text file named HWID to put
-with the clean files in the zip. Users can see their unique
-HWID at any time by pressing CTRL+H in Rookie. Your unique HWID
-will always be the same.
-= Added version code to any zip files created during clean files
-prep.
-= Added boolean to check if user has been asked to send clean
-files, if they have it won't appear again for some time.
-= Fixed OBB installation for Install+Download.
+RSL 2.7
+
++ Added BMBF drag and drop option for Quest users
+in SETTINGS menu.If users drag and drop BMBF song
+zip files onto rookie either one by one, an entire
+folder, or many zips at once Rookie will automatically
+extract the files to a folder then push the folder
+to your device then delete the extraction folder.
++ Added automatic timeout during APK install that
+will ask user if they'd like Rookie to automatically
+uninstall and reinstall the app. Rookie will check
+for save data and copy it to a folder temporarily
+then put it back after reinstall.
+= Cleaned up startup tasks so booting Rookie should
+be faster.
+= Added automatic deletion of previous crashlog to
+decrease clutter in Rookie directory.
+= Added automatic installed app refresh after drag
+and drop.
HFP
-----BEGIN PGP SIGNATURE-----
-iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEJuZYACgkQx/Rql1Vo
-cze1yg//Yyw+tRfA3hLxLQejXhj/LyFsGOoTCyqTVQDuUtxZxyMAFUN3SCd5sC3h
-byVpcoDMaBMGoOgE3FnpEvObd3SHVaB3xqw902saHPAhzuujv4Ru25ou+xRDU8c6
-+xXPQ3O4ocgHwlFP+nCVx3eXai8Dz/2OUc6JC2PfpjU/xj3B6cs/ExSrxoHqyCJL
-g5lntpE0dFQboe6gu7uEQn2Qal1Gsn2+MqCqQZh1dBIpF/gEPD8/q40St/lN7cdY
-jm1lVxW3By7muxlh9wcRYsxQk78cb49+Vsa+EcxS6GK0m8Hibp8nS7RoHFMBtC1i
-hgIZW5lt1cCj5WlwI3/t+vLR4Ia/eh7Vi0EiyVGhiOIQvCR2+PpkWWrVDe3zoXUX
-n68zFZlL2yoaCXg5AWPp3KiQff3uxlBD58fzNZRtKzjFPNmcYR6x7PcHfai76+JD
-aE36aC8Q3aMCaIaH+gH+eAhl+mzyX1Vhdl9NLLHLUXZwBnSA9drMHJsVMh6SOQiC
-VMiv1vMXJllKq/7W7EGr1fWFGuPJk6FFjT1g+3+2d71yVKyPL+99JQg7UJzp112w
-7ZUAD6Wt8lpW66I2zpcOBPwpoAlxg2uJy2Nc38axfrBpHsscNrYIXFMHEprLG+Xk
-PqnfDHPtP1sUxe2uiZTQj3JjlEnb4ES/xBdvSPacc53+fBPs0yM=
-=BAUp
+iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmENfVMACgkQx/Rql1Vo
+czcxaw//bTVxR5gt1F4c+gDT80dVfJa1Js3h5vSjGgCHjQdmsU6eaU5BQGoUorkw
+6ewYF48jt84xDNj/VirkeqHV95mvsj9sksi+mxvELnAa0NdRVYj0DCqZWB/mNDfx
+lYZGp2SwiGK3a6KfMpPcbi2IEWqc9ZWpdazIDy6l3oGSBAYaoVqfjl+CJQQpomIJ
+x7f67Ei633dyhu8+0612LVu+tZ4ibN2pAAu1Dd5+uvlODUiYLPadhZkLwk+CYC6p
+ifs/1qB/fsXJS6YJyPCmuZCbYN//jLCD9ECQ5cqZbTTU82Ub2lDE+TcdO/CsxSxU
+pueIxZ+7C5TceiNzsDfKfeCWu65hZlBW1xKReDtLPFzZdZuyXYTI0v00kvapwJIO
+C9Eq2qxZvdnp05tw8nY1V4Ae5Jl6oLN0BwWSZv50NhQ4Dpmbl8pemk1r5iZsRhGA
+MWQCytBCaX/3EpJda8ifGJxj3kOno2ewbwXdZEMN7QqWt1scN9HxNXFWEJwO29HV
+pT6ra3T0OrOBLmCQGt4w71HGFK2t+c7aPq0yI/sayguB9zjR/GpTyekg7nHXZh9g
+c+WD5umN2xA0LuLjvvePKhhKTBT6ebmQJh1CRNIRtA150ULbnTAIpZJTDZyhcLXi
+IUfWyWPA4G3GsRUqGWf97O2G2bIbbIzLeg3uEdxF7T9LOigYgpU=
+=Rwj0
-----END PGP SIGNATURE-----
-
-
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA256
-
-RSL 2.5.1
-
-+ Added PARTIAL SEARCH compatibility to Quick Search. Quick
-Search now works if users type one word or one part of a word
-that matches a release. For example if an app was named
-"Supercool Awesome Application", typing "Application",
-"Awesome", or even "Cool" would work as it works with parts of
-words as well.
-
-NOTE:As a reminder you can open Quick Search with F2, CTRL+F
-or by cllicking on the Quick Search magnifying glass icon.
-
-+ Added a blocklist for apps that can't be updated for various
-reasons. This will prevent users from being asked to send apps
-that cannot be used.
-+ Added .png support for gameslist thumbnails.
-+ Added tip under Notes section at launch to remind users they
-can press F1 to view all of the program shortcuts added in a
-prior update.
-= Some minor syntax updates.
-
-HFP
-
------BEGIN PGP SIGNATURE-----
-
-iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEGqr8ACgkQx/Rql1Vo
-czftJA//ePxg5+fuAoYNfl2D8yKpzhkvQldkdZia1GJiHBb4CJBwdhMDpDeNhKzO
-ziJ5yBNLqx6wWSbHV70PF4fagASA81FeLbJxdJX4gFgtX9MpzoR2ppK+Gy1UYVGw
-ij1fjQIIIHXyAVDgaS4DcRQrgxtc6R2G3iey3EBaxtaWDh2cR3sWdR6QMcZSJ/0S
-/QLXROCCCIHc1mTsf37b2qQVQ/v2Yk/UAGSV6/VdN78QE7Z8dPqCLZvM+10mfXTE
-AOJ6WkZBVA7HkpRgEGVtTLor+kwDROshkq+eM7yMREFv6GwHtd5H0hHGhRr/FoVW
-E99TfabD9Rd5P7tvcYm2c6Diu7yz2ai7l7N6G77wr+lOfsmIniHeUYEWsPOcZHQH
-P+0Xvx84cHj6Dd2+zfCWcI/jPamfgzgxrBS/pSXJ5ktdrCiJRnqeU9FhJxhGF002
-7+iIZTumhAU4ab8LhSzkMg+hwhzTrhmgbeZE1jdwLiLQ3vyYszEB5zflubt86pLq
-WXVvupQKtCGek1B3ETvU2YzNaQe6vVjqrh0sHkwgYgwfhLg9+gc+c3Rtq6ighqfc
-KNDocmVcNOJMNkre/DOTmVU6ULg22pXlj0PgWkxph/vt1SegMbPMVGUJD0ncIqL8
-eQbzNOltkzALWel4S2Itvv/JgoDU1YDupJmZNh66ihKBuIdcT0k=
-=wU75
------END PGP SIGNATURE-----
-
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA256
-
-
-RSL 2.5
-
-+ Upgraded Extract APK from device to Extract APP to Desktop.
-RSL will now automatically extract the APK file, then extract
-the obb if there is any for the selected app, then it will
-compress both into a zip file and place it on the desktop so
-users can share their apps without issue.
-+ Added automatic detection of apps that are more updated than
-the database user is connecting to, and if they are a pop up
-will ask if user wants to share the app.
-= Fixed issue where copying a folder containing an obb folder
-via drag and drop would cause the containing folder to be copied
-to the obb folder as well.
-= Changelog.txt now only contains the 3 most recent updates
-including the most current, the older changelogs can be found
-in the ChangelogHistory text file.
-
-HFP
-
------BEGIN PGP SIGNATURE-----
-
-iQIzBAEBCAAdFiEEKjgtlwMyrpVu4TGfx/Rql1VoczcFAmEFcMEACgkQx/Rql1Vo
-czdoWA//cbngmK/it4fy6Hy/5JMGubJvCb0Ar+KY0UCO5FR60Q+ADCrkhPDEaWif
-xnM+h4CLqyHUD0NipUxsjZ4j25VRMA20eTy3jiLKSZKq6P6KD+oRv0Tx3vTEs61U
-wJdQsWK81cC9+BnhCBDuWpDJ/nCqO9ZJBYdKX0+KuYTVZwaaZSfMXD1dgQsrCQCq
-zU5kgrsl+LDUJknnpfda521pbACgHlZ/Cb3bztqgnSviF38jFuYsJe7hJVjsINYz
-j6HtmT+vn3Rxhk6uRTtUNhM1YVvuKzsZtUNvqd7cjT3FJXWuuoP8mgdauSahVnpQ
-jMLu/dMLx0PkRXox/D8/69tDA1dxNZozXvws0OQfmNlzLfLGPZdVSWVjfU+P0feA
-hMZiVICyAAJPnzfNAfVq2yDpU5wJbAhj3qG+Lj9Ox4dpmn7AUrjoUCFZxhZIZJi1
-KKKz+7Q9ZDkcFODCUzZAdrI0MP7MNrsfPl8jxSCLYFe6LUIOfTAakBkxOY9x02lF
-x08jfbpAsJHU3Wm8bruk+nkB+65J5kqsLkJk2n4yrkW3QtIo9xul/z9vgZKo75S6
-LkPCpNo2w5gtx7+8Jv65Z/BlueUVmVWUHhQ2gHRkXenkg3McEZpqwKInqQSZkHpZ
-USckVtW+iteVVR0yf+hFPRGp+Shz6/GIn9YnwVQCT2DK+ih9zD4=
-=0bPq
------END PGP SIGNATURE-----
\ No newline at end of file
diff --git a/version b/version
index c20c8ac5..e6b7b623 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-2.6
\ No newline at end of file
+2.7
\ No newline at end of file