Compare commits
131 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4bb3b9758 | ||
|
|
4e3020181e | ||
|
|
a8181b7052 | ||
|
|
b9af1909d4 | ||
|
|
f2fdc7f5f4 | ||
|
|
ce38e1374e | ||
|
|
5db29e0215 | ||
|
|
8b0d724253 | ||
|
|
9ca02c9e4f | ||
|
|
9bc80c73b4 | ||
|
|
6b3cc0385f | ||
|
|
86fb982224 | ||
|
|
69ffff1111 | ||
|
|
b53f8209d5 | ||
|
|
5d602bd62b | ||
|
|
1c8167c736 | ||
|
|
6730667fd7 | ||
|
|
5febd93757 | ||
|
|
e6b32ccd00 | ||
|
|
4cba1bfdce | ||
|
|
07b64816cb | ||
|
|
cbfa67d08a | ||
|
|
2a76577b5e | ||
|
|
ca707c44cb | ||
|
|
ccdb5d2062 | ||
|
|
cefb969004 | ||
|
|
ff8046d3a4 | ||
|
|
15fda32f19 | ||
|
|
e6505c75a8 | ||
|
|
a8daba4325 | ||
|
|
d07a739746 | ||
|
|
8cb5a1036d | ||
|
|
022f906c4d | ||
|
|
ec76448477 | ||
|
|
ef72be31e3 | ||
|
|
2734a9bf61 | ||
|
|
a3dfa21899 | ||
|
|
eac379757c | ||
|
|
f66cd4ba66 | ||
|
|
1ddfd8de2e | ||
|
|
78a67b41d8 | ||
|
|
8c69c68d23 | ||
|
|
f7a44380f3 | ||
|
|
bcc57865a0 | ||
|
|
c56fe7af39 | ||
|
|
8feb830c6a | ||
|
|
577a14133d | ||
|
|
fcad1ce636 | ||
|
|
3fae800f7e | ||
|
|
4a541335d0 | ||
|
|
c6f8985bc0 | ||
|
|
1c0b95014c | ||
|
|
4ac29040f8 | ||
|
|
0a612c7da1 | ||
|
|
33ba798b41 | ||
|
|
57525e1afa | ||
|
|
191044d88b | ||
|
|
ec5395b0df | ||
|
|
2505cd6923 | ||
|
|
872ceb17ce | ||
|
|
494f3dec69 | ||
|
|
ab870f984d | ||
|
|
c4327c3de9 | ||
|
|
34c3c1b9ab | ||
|
|
698c49bc0e | ||
|
|
298fbe8a00 | ||
|
|
7143bf63c6 | ||
|
|
c905acaa6a | ||
|
|
de1cfd511a | ||
|
|
af7bbc3407 | ||
|
|
e9805f8c17 | ||
|
|
a8106a87b2 | ||
|
|
3eb88329b6 | ||
|
|
2f6e196ea3 | ||
|
|
aa8185abea | ||
|
|
683c3b87b5 | ||
|
|
49f7bc9470 | ||
|
|
ceb2e5954e | ||
|
|
6eba1c46bf | ||
|
|
781ffbbc90 | ||
|
|
6690099982 | ||
|
|
6726de7d26 | ||
|
|
401c9c22dd | ||
|
|
6e6341e11f | ||
|
|
cc09e41622 | ||
|
|
059d195f21 | ||
|
|
cf334f00cd | ||
|
|
f0af68b228 | ||
|
|
92a1da1939 | ||
|
|
bfce0e54ec | ||
|
|
66c4ad7377 | ||
|
|
897ea3b1df | ||
|
|
53f7855009 | ||
|
|
722dfefeb7 | ||
|
|
b86e21080b | ||
|
|
8621fa7008 | ||
|
|
f60ff2ef96 | ||
|
|
a86dba2e52 | ||
|
|
bd0ec85135 | ||
|
|
2723dac64f | ||
|
|
df32d593f2 | ||
|
|
050697c2b3 | ||
|
|
72efbc12ac | ||
|
|
fe44a8f501 | ||
|
|
9cd02f1860 | ||
|
|
12c1ba0c93 | ||
|
|
ebbf0ae066 | ||
|
|
09a98a4262 | ||
|
|
e8c0e313cc | ||
|
|
7047089f0d | ||
|
|
d7ddeff532 | ||
|
|
7b8f806be6 | ||
|
|
cd58002295 | ||
|
|
31120a8735 | ||
|
|
b2d4dca283 | ||
|
|
4a121e1e83 | ||
|
|
a785127de3 | ||
|
|
fd8bb084f8 | ||
|
|
ca69955211 | ||
|
|
6ed41a5443 | ||
|
|
6dddadb5e6 | ||
|
|
3b5fc52e31 | ||
|
|
2152f08bc3 | ||
|
|
e6d2c9604a | ||
|
|
235b378f9f | ||
|
|
39339c2583 | ||
|
|
72e0d4fba4 | ||
|
|
efc1b3b773 | ||
|
|
4dbc236b31 | ||
|
|
730c88316e | ||
|
|
3641a8ec1d |
30
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
30
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
name: Bug report 🐞
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug
|
||||
---
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Environment (please complete the following information):**
|
||||
- Debuglog.txt file from the sideloader folder
|
||||
- adb.log file from %USERNAME%\AppData\Local\Temp
|
||||
- log.txt from the sideloader\rclone
|
||||
- OS [e.g. Windows 10 build 1833]
|
||||
- Version [e.g. 1.15]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
name: Feature Request 💡
|
||||
about: Suggest a new idea for the project.
|
||||
labels: enhancement
|
||||
---
|
||||
## Summary
|
||||
Brief explanation of the feature.
|
||||
### Basic example
|
||||
If the proposal involves a new or changed API, include a basic code example. Omit this section if it's not applicable.
|
||||
### Motivation
|
||||
Why are we doing this? What use cases does it support? What is the expected outcome?
|
||||
131
ADB.cs
Normal file
131
ADB.cs
Normal file
@@ -0,0 +1,131 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class ADB
|
||||
{
|
||||
static Process adb = new Process();
|
||||
public static string adbFolderPath = Environment.CurrentDirectory + "\\adb";
|
||||
public static string adbFilePath = adbFolderPath + "\\adb.exe";
|
||||
public static bool IsRunningCommand = false;
|
||||
public static string RunAdbCommandToString(string command)
|
||||
{
|
||||
|
||||
IsRunningCommand = true;
|
||||
|
||||
if (DeviceID.Length > 1)
|
||||
command = $" -s {DeviceID} {command}";
|
||||
|
||||
Logger.Log($"Running command {command}");
|
||||
adb.StartInfo.FileName = adbFilePath;
|
||||
adb.StartInfo.Arguments = command;
|
||||
adb.StartInfo.RedirectStandardError = true;
|
||||
adb.StartInfo.RedirectStandardInput = true;
|
||||
adb.StartInfo.RedirectStandardOutput = true;
|
||||
adb.StartInfo.CreateNoWindow = true;
|
||||
adb.StartInfo.UseShellExecute = false;
|
||||
adb.StartInfo.WorkingDirectory = adbFolderPath;
|
||||
|
||||
//adb.OutputDataReceived += ADB_OutputDataReceived;
|
||||
adb.ErrorDataReceived += ADB_ErrorDataReceived;
|
||||
|
||||
adb.Start();
|
||||
adb.StandardInput.WriteLine(command);
|
||||
adb.StandardInput.Flush();
|
||||
adb.StandardInput.Close();
|
||||
|
||||
var output = adb.StandardOutput.ReadToEnd();
|
||||
error = adb.StandardError.ReadToEnd();
|
||||
|
||||
adb.WaitForExit();
|
||||
IsRunningCommand = false;
|
||||
Logger.Log(output);
|
||||
return output;
|
||||
}
|
||||
|
||||
public static string UninstallPackage(string package)
|
||||
{
|
||||
string output = string.Empty;
|
||||
output += RunAdbCommandToString($"shell pm uninstall -k --user 0 {package}");
|
||||
output += RunAdbCommandToString($"shell pm uninstall {package}");
|
||||
return output;
|
||||
}
|
||||
|
||||
public static string error = "";
|
||||
|
||||
static void ADB_ErrorDataReceived(object sender, DataReceivedEventArgs e)
|
||||
{
|
||||
Logger.Log($"ADB ERROR: {e.Data}");
|
||||
}
|
||||
|
||||
public static string DeviceID = "";
|
||||
|
||||
public static string GetAvailableSpace()
|
||||
{
|
||||
long totalSize = 0;
|
||||
|
||||
long usedSize = 0;
|
||||
|
||||
long freeSize = 0;
|
||||
|
||||
var output = RunAdbCommandToString("shell df").Split('\n');
|
||||
|
||||
foreach (string currLine in output)
|
||||
{
|
||||
if (currLine.StartsWith("/data/media"))
|
||||
{
|
||||
var foo = currLine.Split(' ');
|
||||
int i = 0;
|
||||
foreach (string curr in foo)
|
||||
{
|
||||
if (curr.Length > 1)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
totalSize = Int64.Parse(curr) / 1000;
|
||||
break;
|
||||
case 2:
|
||||
usedSize = Int64.Parse(curr) / 1000;
|
||||
break;
|
||||
case 3:
|
||||
freeSize = Int64.Parse(curr) / 1000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $"Total space: {String.Format("{0:0.00}", (double)totalSize / 1000)}GB\n Used space: {String.Format("{0:0.00}", (double)usedSize / 1000)}GB\n Free space: {String.Format("{0:0.00}", (double)freeSize / 1000)}GB";
|
||||
}
|
||||
|
||||
public static string Sideload(string path)
|
||||
{
|
||||
return RunAdbCommandToString($"install -g -r \"{path}\"");
|
||||
}
|
||||
|
||||
public static string CopyOBB(string path)
|
||||
{
|
||||
bool ok = false;
|
||||
foreach (string file in Directory.GetFiles(path))
|
||||
{
|
||||
if (Path.GetExtension(file) == ".obb")
|
||||
{
|
||||
ok = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ok)
|
||||
return RunAdbCommandToString($"push \"{path}\" /sdcard/Android/obb");
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,27 @@
|
||||
<Deterministic>true</Deterministic>
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<UseShortFileNames>True</UseShortFileNames>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<IntermediateOutputPath>C:\Sideloader</IntermediateOutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
@@ -27,22 +48,108 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>
|
||||
</ApplicationIcon>
|
||||
<ApplicationIcon>icon.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject>AndroidSideloader.Program</StartupObject>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'x86|AnyCPU'">
|
||||
<OutputPath>bin\x86\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'x86|x64'">
|
||||
<OutputPath>bin\x64\x86\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'x86|x86'">
|
||||
<OutputPath>bin\x86\x86\</OutputPath>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignAssembly>false</SignAssembly>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<AssemblyOriginatorKeyFile>AndroidSideloader_TemporaryKey.pfx</AssemblyOriginatorKeyFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<DelaySign>false</DelaySign>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignManifests>false</SignManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestCertificateThumbprint>2596B6735D27EAE6BD754AC8A5249B9EAE39122F</ManifestCertificateThumbprint>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestKeyFile>AndroidSideloader_TemporaryKey.pfx</ManifestKeyFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Costura, Version=4.1.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Costura.Fody.4.1.0\lib\net40\Costura.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MetroFramework, Version=1.2.0.3, Culture=neutral, PublicKeyToken=5f91a84759bf584a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\MetroFramework.RunTime.1.2.0.3\lib\net40-Client\MetroFramework.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MetroFramework.Design, Version=1.2.0.3, Culture=neutral, PublicKeyToken=5f91a84759bf584a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\MetroFramework.Design.1.2.0.3\lib\net40\MetroFramework.Design.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="MetroFramework.Fonts, Version=1.2.0.3, Culture=neutral, PublicKeyToken=5f91a84759bf584a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\MetroFramework.Fonts.1.2.0.3\lib\net40\MetroFramework.Fonts.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SergeUtils">
|
||||
<HintPath>.\SergeUtils.dll</HintPath>
|
||||
</Reference>
|
||||
@@ -60,45 +167,99 @@
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="customAdbCommandForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="customAdbCommandForm.Designer.cs">
|
||||
<DependentUpon>customAdbCommandForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ADB.cs" />
|
||||
<Compile Include="FlexibleMessageBox.cs" />
|
||||
<Compile Include="Form1.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Form1.Designer.cs">
|
||||
<DependentUpon>Form1.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="usernameForm.cs">
|
||||
<Compile Include="ImageForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="usernameForm.Designer.cs">
|
||||
<DependentUpon>usernameForm.cs</DependentUpon>
|
||||
<Compile Include="ImageForm.Designer.cs">
|
||||
<DependentUpon>ImageForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Logger.cs" />
|
||||
<Compile Include="QuestForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="QuestForm.Designer.cs">
|
||||
<DependentUpon>QuestForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="RCLONE.cs" />
|
||||
<Compile Include="SettingsForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="SettingsForm.Designer.cs">
|
||||
<DependentUpon>SettingsForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Sideloader.cs" />
|
||||
<Compile Include="spoofer.cs" />
|
||||
<Compile Include="SpoofForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="SpoofForm.Designer.cs">
|
||||
<DependentUpon>SpoofForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ThemeForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ThemeForm.Designer.cs">
|
||||
<DependentUpon>ThemeForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="UsernameForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="UsernameForm.Designer.cs">
|
||||
<DependentUpon>UsernameForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="SelectFolder.cs" />
|
||||
<EmbeddedResource Include="customAdbCommandForm.resx">
|
||||
<DependentUpon>customAdbCommandForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Utilities.cs" />
|
||||
<EmbeddedResource Include="Form1.resx">
|
||||
<DependentUpon>Form1.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="ImageForm.resx">
|
||||
<DependentUpon>ImageForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="usernameForm.resx">
|
||||
<DependentUpon>usernameForm.cs</DependentUpon>
|
||||
<EmbeddedResource Include="QuestForm.resx">
|
||||
<DependentUpon>QuestForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="SettingsForm.resx">
|
||||
<DependentUpon>SettingsForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="SpoofForm.resx">
|
||||
<DependentUpon>SpoofForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="ThemeForm.resx">
|
||||
<DependentUpon>ThemeForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="UsernameForm.resx">
|
||||
<DependentUpon>UsernameForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<None Include=".editorconfig" />
|
||||
<None Include="AndroidSideloader_TemporaryKey.pfx" />
|
||||
<None Include="keypair.snk">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
@@ -109,13 +270,31 @@
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<None Include="public.snk">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="changelog.txt" />
|
||||
<Content Include="icon.ico" />
|
||||
<Content Include="MetroFramework.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.5.2">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4.5.2 %28x86 and x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="packages\Fody.6.0.0\build\Fody.targets" Condition="Exists('packages\Fody.6.0.0\build\Fody.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
@@ -125,4 +304,12 @@
|
||||
<Error Condition="!Exists('packages\Fody.6.0.0\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.0.0\build\Fody.targets'))" />
|
||||
<Error Condition="!Exists('packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.4.1.0\build\Costura.Fody.props'))" />
|
||||
</Target>
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>
|
||||
</PreBuildEvent>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
14
AndroidSideloader.csproj.user
Normal file
14
AndroidSideloader.csproj.user
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectView>ShowAllFiles</ProjectView>
|
||||
<PublishUrlHistory>publish\</PublishUrlHistory>
|
||||
<InstallUrlHistory />
|
||||
<SupportUrlHistory />
|
||||
<UpdateUrlHistory />
|
||||
<BootstrapperUrlHistory />
|
||||
<ErrorReportUrlHistory />
|
||||
<FallbackCulture>en-US</FallbackCulture>
|
||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -5,16 +5,42 @@ VisualStudioVersion = 16.0.30011.22
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AndroidSideloader", "AndroidSideloader.csproj", "{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9E3C926E-5E5F-4F97-AC52-060B14DDB055}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
.editorconfig = .editorconfig
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
x86|Any CPU = x86|Any CPU
|
||||
x86|x64 = x86|x64
|
||||
x86|x86 = x86|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Debug|x64.Build.0 = Debug|x64
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Debug|x86.Build.0 = Debug|x86
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Release|x64.ActiveCfg = Release|x64
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Release|x64.Build.0 = Release|x64
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Release|x86.ActiveCfg = Release|x86
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.Release|x86.Build.0 = Release|x86
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.x86|Any CPU.ActiveCfg = x86|Any CPU
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.x86|Any CPU.Build.0 = x86|Any CPU
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.x86|x64.ActiveCfg = x86|x64
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.x86|x64.Build.0 = x86|x64
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.x86|x86.ActiveCfg = x86|x86
|
||||
{CC8BE9F0-CE07-406A-A378-81D9CFE4CC1D}.x86|x86.Build.0 = x86|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
120
App.config
120
App.config
@@ -1,6 +1,126 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="AndroidSideloader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
<section name="AndroidADB.Sideloader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
|
||||
</startup>
|
||||
<userSettings>
|
||||
<AndroidSideloader.Properties.Settings>
|
||||
<setting name="checkForUpdates" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="enableMessageBoxes" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="logRclone" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="firstRun" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="deleteAllAfterInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="autoUpdateConfig" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="userJsonOnGameInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="CallUpgrade" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="BackColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="ButtonColor" serializeAs="String">
|
||||
<value>ActiveCaptionText</value>
|
||||
</setting>
|
||||
<setting name="SubButtonColor" serializeAs="String">
|
||||
<value>64, 64, 64</value>
|
||||
</setting>
|
||||
<setting name="TextBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="ComboBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="FontColor" serializeAs="String">
|
||||
<value>White</value>
|
||||
</setting>
|
||||
<setting name="FontStyle" serializeAs="String">
|
||||
<value>Microsoft Sans Serif, 11.25pt</value>
|
||||
</setting>
|
||||
<setting name="BackPicturePath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="SpoofGames" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="BandwithLimit" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
</AndroidSideloader.Properties.Settings>
|
||||
<AndroidADB.Sideloader.Properties.Settings>
|
||||
<setting name="checkForUpdates" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="enableMessageBoxes" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="logRclone" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="firstRun" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="deleteAllAfterInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="autoUpdateConfig" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="userJsonOnGameInstall" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="CallUpgrade" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="BackColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="PanelColor" serializeAs="String">
|
||||
<value>ActiveCaptionText</value>
|
||||
</setting>
|
||||
<setting name="ButtonColor" serializeAs="String">
|
||||
<value>ActiveCaptionText</value>
|
||||
</setting>
|
||||
<setting name="SubButtonColor" serializeAs="String">
|
||||
<value>64, 64, 64</value>
|
||||
</setting>
|
||||
<setting name="TextBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="ComboBoxColor" serializeAs="String">
|
||||
<value>45, 45, 45</value>
|
||||
</setting>
|
||||
<setting name="FontColor" serializeAs="String">
|
||||
<value>White</value>
|
||||
</setting>
|
||||
<setting name="FontStyle" serializeAs="String">
|
||||
<value>Microsoft Sans Serif, 11.25pt</value>
|
||||
</setting>
|
||||
<setting name="BackPicturePath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="SpoofGames" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</AndroidADB.Sideloader.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
862
FlexibleMessageBox.cs
Normal file
862
FlexibleMessageBox.cs
Normal file
@@ -0,0 +1,862 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace JR.Utils.GUI.Forms
|
||||
{
|
||||
/* FlexibleMessageBox – A flexible replacement for the .NET MessageBox
|
||||
*
|
||||
* Author: Jörg Reichert (public@jreichert.de)
|
||||
* Contributors: Thanks to: David Hall, Roink
|
||||
* Version: 1.3
|
||||
* Published at: http://www.codeproject.com/Articles/601900/FlexibleMessageBox
|
||||
*
|
||||
************************************************************************************************************
|
||||
* Features:
|
||||
* - It can be simply used instead of MessageBox since all important static "Show"-Functions are supported
|
||||
* - It is small, only one source file, which could be added easily to each solution
|
||||
* - It can be resized and the content is correctly word-wrapped
|
||||
* - It tries to auto-size the width to show the longest text row
|
||||
* - It never exceeds the current desktop working area
|
||||
* - It displays a vertical scrollbar when needed
|
||||
* - It does support hyperlinks in text
|
||||
*
|
||||
* Because the interface is identical to MessageBox, you can add this single source file to your project
|
||||
* and use the FlexibleMessageBox almost everywhere you use a standard MessageBox.
|
||||
* The goal was NOT to produce as many features as possible but to provide a simple replacement to fit my
|
||||
* own needs. Feel free to add additional features on your own, but please left my credits in this class.
|
||||
*
|
||||
************************************************************************************************************
|
||||
* Usage examples:
|
||||
*
|
||||
* FlexibleMessageBox.Show("Just a text");
|
||||
*
|
||||
* FlexibleMessageBox.Show("A text",
|
||||
* "A caption");
|
||||
*
|
||||
* FlexibleMessageBox.Show("Some text with a link: www.google.com",
|
||||
* "Some caption",
|
||||
* MessageBoxButtons.AbortRetryIgnore,
|
||||
* MessageBoxIcon.Information,
|
||||
* MessageBoxDefaultButton.Button2);
|
||||
*
|
||||
* var dialogResult = FlexibleMessageBox.Show("Do you know the answer to life the universe and everything?",
|
||||
* "One short question",
|
||||
* MessageBoxButtons.YesNo);
|
||||
*
|
||||
************************************************************************************************************
|
||||
* THE SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS", WITHOUT WARRANTY
|
||||
* OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF THIS
|
||||
* SOFTWARE.
|
||||
*
|
||||
************************************************************************************************************
|
||||
* History:
|
||||
* Version 1.3 - 19.Dezember 2014
|
||||
* - Added refactoring function GetButtonText()
|
||||
* - Used CurrentUICulture instead of InstalledUICulture
|
||||
* - Added more button localizations. Supported languages are now: ENGLISH, GERMAN, SPANISH, ITALIAN
|
||||
* - Added standard MessageBox handling for "copy to clipboard" with <Ctrl> + <C> and <Ctrl> + <Insert>
|
||||
* - Tab handling is now corrected (only tabbing over the visible buttons)
|
||||
* - Added standard MessageBox handling for ALT-Keyboard shortcuts
|
||||
* - SetDialogSizes: Refactored completely: Corrected sizing and added caption driven sizing
|
||||
*
|
||||
* Version 1.2 - 10.August 2013
|
||||
* - Do not ShowInTaskbar anymore (original MessageBox is also hidden in taskbar)
|
||||
* - Added handling for Escape-Button
|
||||
* - Adapted top right close button (red X) to behave like MessageBox (but hidden instead of deactivated)
|
||||
*
|
||||
* Version 1.1 - 14.June 2013
|
||||
* - Some Refactoring
|
||||
* - Added internal form class
|
||||
* - Added missing code comments, etc.
|
||||
*
|
||||
* Version 1.0 - 15.April 2013
|
||||
* - Initial Version
|
||||
*/
|
||||
public class FlexibleMessageBox
|
||||
{
|
||||
#region Public statics
|
||||
|
||||
/// <summary>
|
||||
/// Defines the maximum width for all FlexibleMessageBox instances in percent of the working area.
|
||||
///
|
||||
/// Allowed values are 0.2 - 1.0 where:
|
||||
/// 0.2 means: The FlexibleMessageBox can be at most half as wide as the working area.
|
||||
/// 1.0 means: The FlexibleMessageBox can be as wide as the working area.
|
||||
///
|
||||
/// Default is: 70% of the working area width.
|
||||
/// </summary>
|
||||
public static double MAX_WIDTH_FACTOR = 0.7;
|
||||
|
||||
/// <summary>
|
||||
/// Defines the maximum height for all FlexibleMessageBox instances in percent of the working area.
|
||||
///
|
||||
/// Allowed values are 0.2 - 1.0 where:
|
||||
/// 0.2 means: The FlexibleMessageBox can be at most half as high as the working area.
|
||||
/// 1.0 means: The FlexibleMessageBox can be as high as the working area.
|
||||
///
|
||||
/// Default is: 90% of the working area height.
|
||||
/// </summary>
|
||||
public static double MAX_HEIGHT_FACTOR = 0.9;
|
||||
|
||||
/// <summary>
|
||||
/// Defines the font for all FlexibleMessageBox instances.
|
||||
///
|
||||
/// Default is: SystemFonts.MessageBoxFont
|
||||
/// </summary>
|
||||
public static Font FONT = SystemFonts.MessageBoxFont;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public show functions
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(string text)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="owner">The owner.</param>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(IWin32Window owner, string text)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(owner, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(string text, string caption)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(null, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="owner">The owner.</param>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(IWin32Window owner, string text, string caption)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(owner, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <param name="buttons">The buttons.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(string text, string caption, MessageBoxButtons buttons)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(null, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="owner">The owner.</param>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <param name="buttons">The buttons.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(owner, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <param name="buttons">The buttons.</param>
|
||||
/// <param name="icon">The icon.</param>
|
||||
/// <returns></returns>
|
||||
public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(null, text, caption, buttons, icon, MessageBoxDefaultButton.Button1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="owner">The owner.</param>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <param name="buttons">The buttons.</param>
|
||||
/// <param name="icon">The icon.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(owner, text, caption, buttons, icon, MessageBoxDefaultButton.Button1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <param name="buttons">The buttons.</param>
|
||||
/// <param name="icon">The icon.</param>
|
||||
/// <param name="defaultButton">The default button.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(null, text, caption, buttons, icon, defaultButton);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="owner">The owner.</param>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <param name="buttons">The buttons.</param>
|
||||
/// <param name="icon">The icon.</param>
|
||||
/// <param name="defaultButton">The default button.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
|
||||
{
|
||||
return FlexibleMessageBoxForm.Show(owner, text, caption, buttons, icon, defaultButton);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Internal form class
|
||||
|
||||
/// <summary>
|
||||
/// The form to show the customized message box.
|
||||
/// It is defined as an internal class to keep the public interface of the FlexibleMessageBox clean.
|
||||
/// </summary>
|
||||
class FlexibleMessageBoxForm : Form
|
||||
{
|
||||
#region Form-Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Erforderliche Designervariable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Verwendete Ressourcen bereinigen.
|
||||
/// </summary>
|
||||
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Erforderliche Methode für die Designerunterstützung.
|
||||
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.richTextBoxMessage = new System.Windows.Forms.RichTextBox();
|
||||
this.FlexibleMessageBoxFormBindingSource = new System.Windows.Forms.BindingSource(this.components);
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.pictureBoxForIcon = new System.Windows.Forms.PictureBox();
|
||||
this.button2 = new System.Windows.Forms.Button();
|
||||
this.button3 = new System.Windows.Forms.Button();
|
||||
((System.ComponentModel.ISupportInitialize)(this.FlexibleMessageBoxFormBindingSource)).BeginInit();
|
||||
this.panel1.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxForIcon)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.button1.AutoSize = true;
|
||||
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.button1.Location = new System.Drawing.Point(11, 67);
|
||||
this.button1.MinimumSize = new System.Drawing.Size(0, 24);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(75, 24);
|
||||
this.button1.TabIndex = 2;
|
||||
this.button1.Text = "OK";
|
||||
this.button1.UseVisualStyleBackColor = true;
|
||||
this.button1.Visible = false;
|
||||
//
|
||||
// richTextBoxMessage
|
||||
//
|
||||
this.richTextBoxMessage.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.richTextBoxMessage.BackColor = System.Drawing.Color.White;
|
||||
this.richTextBoxMessage.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.richTextBoxMessage.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.FlexibleMessageBoxFormBindingSource, "MessageText", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.richTextBoxMessage.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.richTextBoxMessage.Location = new System.Drawing.Point(50, 26);
|
||||
this.richTextBoxMessage.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.richTextBoxMessage.Name = "richTextBoxMessage";
|
||||
this.richTextBoxMessage.ReadOnly = true;
|
||||
this.richTextBoxMessage.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
|
||||
this.richTextBoxMessage.Size = new System.Drawing.Size(200, 20);
|
||||
this.richTextBoxMessage.TabIndex = 0;
|
||||
this.richTextBoxMessage.TabStop = false;
|
||||
this.richTextBoxMessage.Text = "<Message>";
|
||||
this.richTextBoxMessage.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxMessage_LinkClicked);
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
this.panel1.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.panel1.BackColor = System.Drawing.Color.White;
|
||||
this.panel1.Controls.Add(this.pictureBoxForIcon);
|
||||
this.panel1.Controls.Add(this.richTextBoxMessage);
|
||||
this.panel1.Location = new System.Drawing.Point(-3, -4);
|
||||
this.panel1.Name = "panel1";
|
||||
this.panel1.Size = new System.Drawing.Size(268, 59);
|
||||
this.panel1.TabIndex = 1;
|
||||
//
|
||||
// pictureBoxForIcon
|
||||
//
|
||||
this.pictureBoxForIcon.BackColor = System.Drawing.Color.Transparent;
|
||||
this.pictureBoxForIcon.Location = new System.Drawing.Point(15, 19);
|
||||
this.pictureBoxForIcon.Name = "pictureBoxForIcon";
|
||||
this.pictureBoxForIcon.Size = new System.Drawing.Size(32, 32);
|
||||
this.pictureBoxForIcon.TabIndex = 8;
|
||||
this.pictureBoxForIcon.TabStop = false;
|
||||
//
|
||||
// button2
|
||||
//
|
||||
this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.button2.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.button2.Location = new System.Drawing.Point(92, 67);
|
||||
this.button2.MinimumSize = new System.Drawing.Size(0, 24);
|
||||
this.button2.Name = "button2";
|
||||
this.button2.Size = new System.Drawing.Size(75, 24);
|
||||
this.button2.TabIndex = 3;
|
||||
this.button2.Text = "OK";
|
||||
this.button2.UseVisualStyleBackColor = true;
|
||||
this.button2.Visible = false;
|
||||
//
|
||||
// button3
|
||||
//
|
||||
this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.button3.AutoSize = true;
|
||||
this.button3.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.button3.Location = new System.Drawing.Point(173, 67);
|
||||
this.button3.MinimumSize = new System.Drawing.Size(0, 24);
|
||||
this.button3.Name = "button3";
|
||||
this.button3.Size = new System.Drawing.Size(75, 24);
|
||||
this.button3.TabIndex = 0;
|
||||
this.button3.Text = "OK";
|
||||
this.button3.UseVisualStyleBackColor = true;
|
||||
this.button3.Visible = false;
|
||||
//
|
||||
// FlexibleMessageBoxForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(260, 102);
|
||||
this.Controls.Add(this.button3);
|
||||
this.Controls.Add(this.button2);
|
||||
this.Controls.Add(this.panel1);
|
||||
this.Controls.Add(this.button1);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.FlexibleMessageBoxFormBindingSource, "CaptionText", true));
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.MinimumSize = new System.Drawing.Size(276, 140);
|
||||
this.Name = "FlexibleMessageBoxForm";
|
||||
this.ShowIcon = false;
|
||||
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Text = "<Caption>";
|
||||
this.Shown += new System.EventHandler(this.FlexibleMessageBoxForm_Shown);
|
||||
((System.ComponentModel.ISupportInitialize)(this.FlexibleMessageBoxFormBindingSource)).EndInit();
|
||||
this.panel1.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxForIcon)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
}
|
||||
|
||||
private System.Windows.Forms.Button button1;
|
||||
private System.Windows.Forms.BindingSource FlexibleMessageBoxFormBindingSource;
|
||||
private System.Windows.Forms.RichTextBox richTextBoxMessage;
|
||||
private System.Windows.Forms.Panel panel1;
|
||||
private System.Windows.Forms.PictureBox pictureBoxForIcon;
|
||||
private System.Windows.Forms.Button button2;
|
||||
private System.Windows.Forms.Button button3;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private constants
|
||||
|
||||
//These separators are used for the "copy to clipboard" standard operation, triggered by Ctrl + C (behavior and clipboard format is like in a standard MessageBox)
|
||||
private static readonly String STANDARD_MESSAGEBOX_SEPARATOR_LINES = "---------------------------\n";
|
||||
private static readonly String STANDARD_MESSAGEBOX_SEPARATOR_SPACES = " ";
|
||||
|
||||
//These are the possible buttons (in a standard MessageBox)
|
||||
private enum ButtonID { OK = 0, CANCEL, YES, NO, ABORT, RETRY, IGNORE };
|
||||
|
||||
//These are the buttons texts for different languages.
|
||||
//If you want to add a new language, add it here and in the GetButtonText-Function
|
||||
private enum TwoLetterISOLanguageID { en, de, es, it };
|
||||
private static readonly String[] BUTTON_TEXTS_ENGLISH_EN = { "OK", "Cancel", "&Yes", "&No", "&Abort", "&Retry", "&Ignore" }; //Note: This is also the fallback language
|
||||
private static readonly String[] BUTTON_TEXTS_GERMAN_DE = { "OK", "Abbrechen", "&Ja", "&Nein", "&Abbrechen", "&Wiederholen", "&Ignorieren" };
|
||||
private static readonly String[] BUTTON_TEXTS_SPANISH_ES = { "Aceptar", "Cancelar", "&Sí", "&No", "&Abortar", "&Reintentar", "&Ignorar" };
|
||||
private static readonly String[] BUTTON_TEXTS_ITALIAN_IT = { "OK", "Annulla", "&Sì", "&No", "&Interrompi", "&Riprova", "&Ignora" };
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private members
|
||||
|
||||
private MessageBoxDefaultButton defaultButton;
|
||||
private int visibleButtonsCount;
|
||||
private TwoLetterISOLanguageID languageID = TwoLetterISOLanguageID.en;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private constructor
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FlexibleMessageBoxForm"/> class.
|
||||
/// </summary>
|
||||
private FlexibleMessageBoxForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
//Try to evaluate the language. If this fails, the fallback language English will be used
|
||||
Enum.TryParse<TwoLetterISOLanguageID>(CultureInfo.CurrentUICulture.TwoLetterISOLanguageName, out this.languageID);
|
||||
|
||||
this.KeyPreview = true;
|
||||
this.KeyUp += FlexibleMessageBoxForm_KeyUp;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private helper functions
|
||||
|
||||
/// <summary>
|
||||
/// Gets the string rows.
|
||||
/// </summary>
|
||||
/// <param name="message">The message.</param>
|
||||
/// <returns>The string rows as 1-dimensional array</returns>
|
||||
private static string[] GetStringRows(string message)
|
||||
{
|
||||
if (string.IsNullOrEmpty(message)) return null;
|
||||
|
||||
var messageRows = message.Split(new char[] { '\n' }, StringSplitOptions.None);
|
||||
return messageRows;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the button text for the CurrentUICulture language.
|
||||
/// Note: The fallback language is English
|
||||
/// </summary>
|
||||
/// <param name="buttonID">The ID of the button.</param>
|
||||
/// <returns>The button text</returns>
|
||||
private string GetButtonText(ButtonID buttonID)
|
||||
{
|
||||
var buttonTextArrayIndex = Convert.ToInt32(buttonID);
|
||||
|
||||
switch (this.languageID)
|
||||
{
|
||||
case TwoLetterISOLanguageID.de: return BUTTON_TEXTS_GERMAN_DE[buttonTextArrayIndex];
|
||||
case TwoLetterISOLanguageID.es: return BUTTON_TEXTS_SPANISH_ES[buttonTextArrayIndex];
|
||||
case TwoLetterISOLanguageID.it: return BUTTON_TEXTS_ITALIAN_IT[buttonTextArrayIndex];
|
||||
|
||||
default: return BUTTON_TEXTS_ENGLISH_EN[buttonTextArrayIndex];
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ensure the given working area factor in the range of 0.2 - 1.0 where:
|
||||
///
|
||||
/// 0.2 means: 20 percent of the working area height or width.
|
||||
/// 1.0 means: 100 percent of the working area height or width.
|
||||
/// </summary>
|
||||
/// <param name="workingAreaFactor">The given working area factor.</param>
|
||||
/// <returns>The corrected given working area factor.</returns>
|
||||
private static double GetCorrectedWorkingAreaFactor(double workingAreaFactor)
|
||||
{
|
||||
const double MIN_FACTOR = 0.2;
|
||||
const double MAX_FACTOR = 1.0;
|
||||
|
||||
if (workingAreaFactor < MIN_FACTOR) return MIN_FACTOR;
|
||||
if (workingAreaFactor > MAX_FACTOR) return MAX_FACTOR;
|
||||
|
||||
return workingAreaFactor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the dialogs start position when given.
|
||||
/// Otherwise center the dialog on the current screen.
|
||||
/// </summary>
|
||||
/// <param name="flexibleMessageBoxForm">The FlexibleMessageBox dialog.</param>
|
||||
/// <param name="owner">The owner.</param>
|
||||
private static void SetDialogStartPosition(FlexibleMessageBoxForm flexibleMessageBoxForm, IWin32Window owner)
|
||||
{
|
||||
//If no owner given: Center on current screen
|
||||
if (owner == null)
|
||||
{
|
||||
var screen = Screen.FromPoint(Cursor.Position);
|
||||
flexibleMessageBoxForm.StartPosition = FormStartPosition.Manual;
|
||||
flexibleMessageBoxForm.Left = screen.Bounds.Left + screen.Bounds.Width / 2 - flexibleMessageBoxForm.Width / 2;
|
||||
flexibleMessageBoxForm.Top = screen.Bounds.Top + screen.Bounds.Height / 2 - flexibleMessageBoxForm.Height / 2;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate the dialogs start size (Try to auto-size width to show longest text row).
|
||||
/// Also set the maximum dialog size.
|
||||
/// </summary>
|
||||
/// <param name="flexibleMessageBoxForm">The FlexibleMessageBox dialog.</param>
|
||||
/// <param name="text">The text (the longest text row is used to calculate the dialog width).</param>
|
||||
/// <param name="text">The caption (this can also affect the dialog width).</param>
|
||||
private static void SetDialogSizes(FlexibleMessageBoxForm flexibleMessageBoxForm, string text, string caption)
|
||||
{
|
||||
//First set the bounds for the maximum dialog size
|
||||
flexibleMessageBoxForm.MaximumSize = new Size(Convert.ToInt32(SystemInformation.WorkingArea.Width * FlexibleMessageBoxForm.GetCorrectedWorkingAreaFactor(MAX_WIDTH_FACTOR)),
|
||||
Convert.ToInt32(SystemInformation.WorkingArea.Height * FlexibleMessageBoxForm.GetCorrectedWorkingAreaFactor(MAX_HEIGHT_FACTOR)));
|
||||
|
||||
//Get rows. Exit if there are no rows to render...
|
||||
var stringRows = GetStringRows(text);
|
||||
if (stringRows == null) return;
|
||||
|
||||
//Calculate whole text height
|
||||
var textHeight = TextRenderer.MeasureText(text, FONT).Height;
|
||||
|
||||
//Calculate width for longest text line
|
||||
const int SCROLLBAR_WIDTH_OFFSET = 15;
|
||||
var longestTextRowWidth = stringRows.Max(textForRow => TextRenderer.MeasureText(textForRow, FONT).Width);
|
||||
var captionWidth = TextRenderer.MeasureText(caption, SystemFonts.CaptionFont).Width;
|
||||
var textWidth = Math.Max(longestTextRowWidth + SCROLLBAR_WIDTH_OFFSET, captionWidth);
|
||||
|
||||
//Calculate margins
|
||||
var marginWidth = flexibleMessageBoxForm.Width - flexibleMessageBoxForm.richTextBoxMessage.Width;
|
||||
var marginHeight = flexibleMessageBoxForm.Height - flexibleMessageBoxForm.richTextBoxMessage.Height;
|
||||
|
||||
//Set calculated dialog size (if the calculated values exceed the maximums, they were cut by windows forms automatically)
|
||||
flexibleMessageBoxForm.Size = new Size(textWidth + marginWidth,
|
||||
textHeight + marginHeight);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the dialogs icon.
|
||||
/// When no icon is used: Correct placement and width of rich text box.
|
||||
/// </summary>
|
||||
/// <param name="flexibleMessageBoxForm">The FlexibleMessageBox dialog.</param>
|
||||
/// <param name="icon">The MessageBoxIcon.</param>
|
||||
private static void SetDialogIcon(FlexibleMessageBoxForm flexibleMessageBoxForm, MessageBoxIcon icon)
|
||||
{
|
||||
switch (icon)
|
||||
{
|
||||
case MessageBoxIcon.Information:
|
||||
flexibleMessageBoxForm.pictureBoxForIcon.Image = SystemIcons.Information.ToBitmap();
|
||||
break;
|
||||
case MessageBoxIcon.Warning:
|
||||
flexibleMessageBoxForm.pictureBoxForIcon.Image = SystemIcons.Warning.ToBitmap();
|
||||
break;
|
||||
case MessageBoxIcon.Error:
|
||||
flexibleMessageBoxForm.pictureBoxForIcon.Image = SystemIcons.Error.ToBitmap();
|
||||
break;
|
||||
case MessageBoxIcon.Question:
|
||||
flexibleMessageBoxForm.pictureBoxForIcon.Image = SystemIcons.Question.ToBitmap();
|
||||
break;
|
||||
default:
|
||||
//When no icon is used: Correct placement and width of rich text box.
|
||||
flexibleMessageBoxForm.pictureBoxForIcon.Visible = false;
|
||||
flexibleMessageBoxForm.richTextBoxMessage.Left -= flexibleMessageBoxForm.pictureBoxForIcon.Width;
|
||||
flexibleMessageBoxForm.richTextBoxMessage.Width += flexibleMessageBoxForm.pictureBoxForIcon.Width;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set dialog buttons visibilities and texts.
|
||||
/// Also set a default button.
|
||||
/// </summary>
|
||||
/// <param name="flexibleMessageBoxForm">The FlexibleMessageBox dialog.</param>
|
||||
/// <param name="buttons">The buttons.</param>
|
||||
/// <param name="defaultButton">The default button.</param>
|
||||
private static void SetDialogButtons(FlexibleMessageBoxForm flexibleMessageBoxForm, MessageBoxButtons buttons, MessageBoxDefaultButton defaultButton)
|
||||
{
|
||||
//Set the buttons visibilities and texts
|
||||
switch (buttons)
|
||||
{
|
||||
case MessageBoxButtons.AbortRetryIgnore:
|
||||
flexibleMessageBoxForm.visibleButtonsCount = 3;
|
||||
|
||||
flexibleMessageBoxForm.button1.Visible = true;
|
||||
flexibleMessageBoxForm.button1.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.ABORT);
|
||||
flexibleMessageBoxForm.button1.DialogResult = DialogResult.Abort;
|
||||
|
||||
flexibleMessageBoxForm.button2.Visible = true;
|
||||
flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.RETRY);
|
||||
flexibleMessageBoxForm.button2.DialogResult = DialogResult.Retry;
|
||||
|
||||
flexibleMessageBoxForm.button3.Visible = true;
|
||||
flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.IGNORE);
|
||||
flexibleMessageBoxForm.button3.DialogResult = DialogResult.Ignore;
|
||||
|
||||
flexibleMessageBoxForm.ControlBox = false;
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.OKCancel:
|
||||
flexibleMessageBoxForm.visibleButtonsCount = 2;
|
||||
|
||||
flexibleMessageBoxForm.button2.Visible = true;
|
||||
flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.OK);
|
||||
flexibleMessageBoxForm.button2.DialogResult = DialogResult.OK;
|
||||
|
||||
flexibleMessageBoxForm.button3.Visible = true;
|
||||
flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.CANCEL);
|
||||
flexibleMessageBoxForm.button3.DialogResult = DialogResult.Cancel;
|
||||
|
||||
flexibleMessageBoxForm.CancelButton = flexibleMessageBoxForm.button3;
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.RetryCancel:
|
||||
flexibleMessageBoxForm.visibleButtonsCount = 2;
|
||||
|
||||
flexibleMessageBoxForm.button2.Visible = true;
|
||||
flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.RETRY);
|
||||
flexibleMessageBoxForm.button2.DialogResult = DialogResult.Retry;
|
||||
|
||||
flexibleMessageBoxForm.button3.Visible = true;
|
||||
flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.CANCEL);
|
||||
flexibleMessageBoxForm.button3.DialogResult = DialogResult.Cancel;
|
||||
|
||||
flexibleMessageBoxForm.CancelButton = flexibleMessageBoxForm.button3;
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.YesNo:
|
||||
flexibleMessageBoxForm.visibleButtonsCount = 2;
|
||||
|
||||
flexibleMessageBoxForm.button2.Visible = true;
|
||||
flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.YES);
|
||||
flexibleMessageBoxForm.button2.DialogResult = DialogResult.Yes;
|
||||
|
||||
flexibleMessageBoxForm.button3.Visible = true;
|
||||
flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.NO);
|
||||
flexibleMessageBoxForm.button3.DialogResult = DialogResult.No;
|
||||
|
||||
flexibleMessageBoxForm.ControlBox = false;
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.YesNoCancel:
|
||||
flexibleMessageBoxForm.visibleButtonsCount = 3;
|
||||
|
||||
flexibleMessageBoxForm.button1.Visible = true;
|
||||
flexibleMessageBoxForm.button1.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.YES);
|
||||
flexibleMessageBoxForm.button1.DialogResult = DialogResult.Yes;
|
||||
|
||||
flexibleMessageBoxForm.button2.Visible = true;
|
||||
flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.NO);
|
||||
flexibleMessageBoxForm.button2.DialogResult = DialogResult.No;
|
||||
|
||||
flexibleMessageBoxForm.button3.Visible = true;
|
||||
flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.CANCEL);
|
||||
flexibleMessageBoxForm.button3.DialogResult = DialogResult.Cancel;
|
||||
|
||||
flexibleMessageBoxForm.CancelButton = flexibleMessageBoxForm.button3;
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.OK:
|
||||
default:
|
||||
flexibleMessageBoxForm.visibleButtonsCount = 1;
|
||||
flexibleMessageBoxForm.button3.Visible = true;
|
||||
flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.OK);
|
||||
flexibleMessageBoxForm.button3.DialogResult = DialogResult.OK;
|
||||
|
||||
flexibleMessageBoxForm.CancelButton = flexibleMessageBoxForm.button3;
|
||||
break;
|
||||
}
|
||||
|
||||
//Set default button (used in FlexibleMessageBoxForm_Shown)
|
||||
flexibleMessageBoxForm.defaultButton = defaultButton;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private event handlers
|
||||
|
||||
/// <summary>
|
||||
/// Handles the Shown event of the FlexibleMessageBoxForm control.
|
||||
/// </summary>
|
||||
/// <param name="sender">The source of the event.</param>
|
||||
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
|
||||
private void FlexibleMessageBoxForm_Shown(object sender, EventArgs e)
|
||||
{
|
||||
int buttonIndexToFocus = 1;
|
||||
Button buttonToFocus;
|
||||
|
||||
//Set the default button...
|
||||
switch (this.defaultButton)
|
||||
{
|
||||
case MessageBoxDefaultButton.Button1:
|
||||
default:
|
||||
buttonIndexToFocus = 1;
|
||||
break;
|
||||
case MessageBoxDefaultButton.Button2:
|
||||
buttonIndexToFocus = 2;
|
||||
break;
|
||||
case MessageBoxDefaultButton.Button3:
|
||||
buttonIndexToFocus = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
if (buttonIndexToFocus > this.visibleButtonsCount) buttonIndexToFocus = this.visibleButtonsCount;
|
||||
|
||||
if (buttonIndexToFocus == 3)
|
||||
{
|
||||
buttonToFocus = this.button3;
|
||||
}
|
||||
else if (buttonIndexToFocus == 2)
|
||||
{
|
||||
buttonToFocus = this.button2;
|
||||
}
|
||||
else
|
||||
{
|
||||
buttonToFocus = this.button1;
|
||||
}
|
||||
|
||||
buttonToFocus.Focus();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles the LinkClicked event of the richTextBoxMessage control.
|
||||
/// </summary>
|
||||
/// <param name="sender">The source of the event.</param>
|
||||
/// <param name="e">The <see cref="System.Windows.Forms.LinkClickedEventArgs"/> instance containing the event data.</param>
|
||||
private void richTextBoxMessage_LinkClicked(object sender, LinkClickedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
Cursor.Current = Cursors.WaitCursor;
|
||||
Process.Start(e.LinkText);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Let the caller of FlexibleMessageBoxForm decide what to do with this exception...
|
||||
throw;
|
||||
}
|
||||
finally
|
||||
{
|
||||
Cursor.Current = Cursors.Default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles the KeyUp event of the richTextBoxMessage control.
|
||||
/// </summary>
|
||||
/// <param name="sender">The source of the event.</param>
|
||||
/// <param name="e">The <see cref="System.Windows.Forms.KeyEventArgs"/> instance containing the event data.</param>
|
||||
void FlexibleMessageBoxForm_KeyUp(object sender, KeyEventArgs e)
|
||||
{
|
||||
//Handle standard key strikes for clipboard copy: "Ctrl + C" and "Ctrl + Insert"
|
||||
if (e.Control && (e.KeyCode == Keys.C || e.KeyCode == Keys.Insert))
|
||||
{
|
||||
var buttonsTextLine = (this.button1.Visible ? this.button1.Text + STANDARD_MESSAGEBOX_SEPARATOR_SPACES : string.Empty)
|
||||
+ (this.button2.Visible ? this.button2.Text + STANDARD_MESSAGEBOX_SEPARATOR_SPACES : string.Empty)
|
||||
+ (this.button3.Visible ? this.button3.Text + STANDARD_MESSAGEBOX_SEPARATOR_SPACES : string.Empty);
|
||||
|
||||
//Build same clipboard text like the standard .Net MessageBox
|
||||
var textForClipboard = STANDARD_MESSAGEBOX_SEPARATOR_LINES
|
||||
+ this.Text + Environment.NewLine
|
||||
+ STANDARD_MESSAGEBOX_SEPARATOR_LINES
|
||||
+ this.richTextBoxMessage.Text + Environment.NewLine
|
||||
+ STANDARD_MESSAGEBOX_SEPARATOR_LINES
|
||||
+ buttonsTextLine.Replace("&", string.Empty) + Environment.NewLine
|
||||
+ STANDARD_MESSAGEBOX_SEPARATOR_LINES;
|
||||
|
||||
//Set text in clipboard
|
||||
Clipboard.SetText(textForClipboard);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties (only used for binding)
|
||||
|
||||
/// <summary>
|
||||
/// The text that is been used for the heading.
|
||||
/// </summary>
|
||||
public string CaptionText { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The text that is been used in the FlexibleMessageBoxForm.
|
||||
/// </summary>
|
||||
public string MessageText { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public show function
|
||||
|
||||
/// <summary>
|
||||
/// Shows the specified message box.
|
||||
/// </summary>
|
||||
/// <param name="owner">The owner.</param>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <param name="caption">The caption.</param>
|
||||
/// <param name="buttons">The buttons.</param>
|
||||
/// <param name="icon">The icon.</param>
|
||||
/// <param name="defaultButton">The default button.</param>
|
||||
/// <returns>The dialog result.</returns>
|
||||
public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
|
||||
{
|
||||
//Create a new instance of the FlexibleMessageBox form
|
||||
var flexibleMessageBoxForm = new FlexibleMessageBoxForm();
|
||||
flexibleMessageBoxForm.ShowInTaskbar = false;
|
||||
|
||||
//Bind the caption and the message text
|
||||
flexibleMessageBoxForm.CaptionText = caption;
|
||||
flexibleMessageBoxForm.MessageText = text;
|
||||
flexibleMessageBoxForm.FlexibleMessageBoxFormBindingSource.DataSource = flexibleMessageBoxForm;
|
||||
|
||||
//Set the buttons visibilities and texts. Also set a default button.
|
||||
SetDialogButtons(flexibleMessageBoxForm, buttons, defaultButton);
|
||||
|
||||
//Set the dialogs icon. When no icon is used: Correct placement and width of rich text box.
|
||||
SetDialogIcon(flexibleMessageBoxForm, icon);
|
||||
|
||||
//Set the font for all controls
|
||||
flexibleMessageBoxForm.Font = FONT;
|
||||
flexibleMessageBoxForm.richTextBoxMessage.Font = FONT;
|
||||
|
||||
//Calculate the dialogs start size (Try to auto-size width to show longest text row). Also set the maximum dialog size.
|
||||
SetDialogSizes(flexibleMessageBoxForm, text, caption);
|
||||
|
||||
//Set the dialogs start position when given. Otherwise center the dialog on the current screen.
|
||||
SetDialogStartPosition(flexibleMessageBoxForm, owner);
|
||||
|
||||
//Show the dialog
|
||||
return flexibleMessageBoxForm.ShowDialog(owner);
|
||||
}
|
||||
|
||||
#endregion
|
||||
} //class FlexibleMessageBoxForm
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
924
Form1.Designer.cs
generated
924
Form1.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
1788
Form1.resx
1788
Form1.resx
File diff suppressed because it is too large
Load Diff
68
ImageForm.Designer.cs
generated
Normal file
68
ImageForm.Designer.cs
generated
Normal file
@@ -0,0 +1,68 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class ImageForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.pictureBox1 = new System.Windows.Forms.PictureBox();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// pictureBox1
|
||||
//
|
||||
this.pictureBox1.Location = new System.Drawing.Point(10, 11);
|
||||
this.pictureBox1.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.pictureBox1.Name = "pictureBox1";
|
||||
this.pictureBox1.Size = new System.Drawing.Size(581, 345);
|
||||
this.pictureBox1.TabIndex = 0;
|
||||
this.pictureBox1.TabStop = false;
|
||||
//
|
||||
// ImageForm
|
||||
//
|
||||
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(600, 366);
|
||||
this.Controls.Add(this.pictureBox1);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.Name = "ImageForm";
|
||||
this.ShowIcon = false;
|
||||
this.Text = "ImageForm";
|
||||
this.TopMost = true;
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ImageForm_FormClosing);
|
||||
this.Shown += new System.EventHandler(this.ImageForm_Shown);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.PictureBox pictureBox1;
|
||||
}
|
||||
}
|
||||
34
ImageForm.cs
Normal file
34
ImageForm.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class ImageForm : Form
|
||||
{
|
||||
public ImageForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void ImageForm_Shown(object sender, EventArgs e)
|
||||
{
|
||||
//this.CenterToScreen();
|
||||
this.WindowState = FormWindowState.Maximized;
|
||||
this.MinimumSize = this.Size;
|
||||
this.MaximumSize = this.Size;
|
||||
|
||||
pictureBox1.Size = this.Size;
|
||||
|
||||
pictureBox1.Image = new Bitmap(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\warning.png");
|
||||
pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
|
||||
|
||||
}
|
||||
|
||||
private void ImageForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
Form1 obj = (Form1)Application.OpenForms["Form1"];
|
||||
obj.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
18
Logger.cs
Normal file
18
Logger.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using System.IO;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class Logger
|
||||
{
|
||||
public static string logfile = "debuglog.txt";
|
||||
|
||||
public static bool Log(string text, bool ret = true)
|
||||
{
|
||||
string newline = "\n";
|
||||
if (text.Length > 40 && text.Contains("\n"))
|
||||
newline += "\n\n";
|
||||
try { File.AppendAllText(logfile, text + newline); } catch { }
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
25
MetroFramework.txt
Normal file
25
MetroFramework.txt
Normal file
@@ -0,0 +1,25 @@
|
||||
MetroFramework - Modern UI for WinForms
|
||||
|
||||
Copyright (c) 2013 Jens Thiel, http://thielj.github.io/MetroFramework
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
Portions of this software are:
|
||||
|
||||
Copyright (c) 2011 Sven Walter, http://github.com/viperneo
|
||||
@@ -1,7 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
|
||||
@@ -5,10 +5,11 @@ using System.Runtime.InteropServices;
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
//[assembly: AssemblyKeyFileAttribute("keypair.snk")]
|
||||
[assembly: AssemblyTitle("AndroidSideloader")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyDescription("Rookie's Sideloader")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyCompany("Rookie.WTF")]
|
||||
[assembly: AssemblyProduct("AndroidSideloader")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2020")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
@@ -32,5 +33,5 @@ using System.Runtime.InteropServices;
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: AssemblyVersion("1.13.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.13.0.0")]
|
||||
|
||||
44
Properties/Resources.Designer.cs
generated
44
Properties/Resources.Designer.cs
generated
@@ -8,10 +8,10 @@
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace AndroidSideloader.Properties
|
||||
{
|
||||
|
||||
|
||||
namespace AndroidSideloader.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
@@ -19,51 +19,43 @@ namespace AndroidSideloader.Properties
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources
|
||||
{
|
||||
|
||||
public class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources()
|
||||
{
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager
|
||||
{
|
||||
get
|
||||
{
|
||||
if ((resourceMan == null))
|
||||
{
|
||||
public static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AndroidSideloader.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture
|
||||
{
|
||||
get
|
||||
{
|
||||
public static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set
|
||||
{
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
@@ -60,6 +60,7 @@
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
@@ -68,9 +69,10 @@
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
@@ -85,9 +87,10 @@
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
@@ -109,9 +112,9 @@
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
238
Properties/Settings.Designer.cs
generated
238
Properties/Settings.Designer.cs
generated
@@ -8,23 +8,235 @@
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace AndroidSideloader.Properties
|
||||
{
|
||||
|
||||
|
||||
namespace AndroidSideloader.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
||||
{
|
||||
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.7.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool checkForUpdates {
|
||||
get {
|
||||
return ((bool)(this["checkForUpdates"]));
|
||||
}
|
||||
set {
|
||||
this["checkForUpdates"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool enableMessageBoxes {
|
||||
get {
|
||||
return ((bool)(this["enableMessageBoxes"]));
|
||||
}
|
||||
set {
|
||||
this["enableMessageBoxes"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool logRclone {
|
||||
get {
|
||||
return ((bool)(this["logRclone"]));
|
||||
}
|
||||
set {
|
||||
this["logRclone"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool firstRun {
|
||||
get {
|
||||
return ((bool)(this["firstRun"]));
|
||||
}
|
||||
set {
|
||||
this["firstRun"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool deleteAllAfterInstall {
|
||||
get {
|
||||
return ((bool)(this["deleteAllAfterInstall"]));
|
||||
}
|
||||
set {
|
||||
this["deleteAllAfterInstall"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool autoUpdateConfig {
|
||||
get {
|
||||
return ((bool)(this["autoUpdateConfig"]));
|
||||
}
|
||||
set {
|
||||
this["autoUpdateConfig"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool userJsonOnGameInstall {
|
||||
get {
|
||||
return ((bool)(this["userJsonOnGameInstall"]));
|
||||
}
|
||||
set {
|
||||
this["userJsonOnGameInstall"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool CallUpgrade {
|
||||
get {
|
||||
return ((bool)(this["CallUpgrade"]));
|
||||
}
|
||||
set {
|
||||
this["CallUpgrade"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("45, 45, 45")]
|
||||
public global::System.Drawing.Color BackColor {
|
||||
get {
|
||||
return ((global::System.Drawing.Color)(this["BackColor"]));
|
||||
}
|
||||
set {
|
||||
this["BackColor"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("ActiveCaptionText")]
|
||||
public global::System.Drawing.Color ButtonColor {
|
||||
get {
|
||||
return ((global::System.Drawing.Color)(this["ButtonColor"]));
|
||||
}
|
||||
set {
|
||||
this["ButtonColor"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("64, 64, 64")]
|
||||
public global::System.Drawing.Color SubButtonColor {
|
||||
get {
|
||||
return ((global::System.Drawing.Color)(this["SubButtonColor"]));
|
||||
}
|
||||
set {
|
||||
this["SubButtonColor"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("45, 45, 45")]
|
||||
public global::System.Drawing.Color TextBoxColor {
|
||||
get {
|
||||
return ((global::System.Drawing.Color)(this["TextBoxColor"]));
|
||||
}
|
||||
set {
|
||||
this["TextBoxColor"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("45, 45, 45")]
|
||||
public global::System.Drawing.Color ComboBoxColor {
|
||||
get {
|
||||
return ((global::System.Drawing.Color)(this["ComboBoxColor"]));
|
||||
}
|
||||
set {
|
||||
this["ComboBoxColor"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("White")]
|
||||
public global::System.Drawing.Color FontColor {
|
||||
get {
|
||||
return ((global::System.Drawing.Color)(this["FontColor"]));
|
||||
}
|
||||
set {
|
||||
this["FontColor"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("Microsoft Sans Serif, 11.25pt")]
|
||||
public global::System.Drawing.Font FontStyle {
|
||||
get {
|
||||
return ((global::System.Drawing.Font)(this["FontStyle"]));
|
||||
}
|
||||
set {
|
||||
this["FontStyle"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string BackPicturePath {
|
||||
get {
|
||||
return ((string)(this["BackPicturePath"]));
|
||||
}
|
||||
set {
|
||||
this["BackPicturePath"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool SpoofGames {
|
||||
get {
|
||||
return ((bool)(this["SpoofGames"]));
|
||||
}
|
||||
set {
|
||||
this["SpoofGames"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string BandwithLimit {
|
||||
get {
|
||||
return ((string)(this["BandwithLimit"]));
|
||||
}
|
||||
set {
|
||||
this["BandwithLimit"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,60 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AndroidSideloader.Properties" GeneratedClassName="Settings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="checkForUpdates" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="enableMessageBoxes" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="logRclone" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="firstRun" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="deleteAllAfterInstall" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="autoUpdateConfig" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="userJsonOnGameInstall" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="CallUpgrade" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="BackColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">45, 45, 45</Value>
|
||||
</Setting>
|
||||
<Setting Name="ButtonColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">ActiveCaptionText</Value>
|
||||
</Setting>
|
||||
<Setting Name="SubButtonColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">64, 64, 64</Value>
|
||||
</Setting>
|
||||
<Setting Name="TextBoxColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">45, 45, 45</Value>
|
||||
</Setting>
|
||||
<Setting Name="ComboBoxColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">45, 45, 45</Value>
|
||||
</Setting>
|
||||
<Setting Name="FontColor" Type="System.Drawing.Color" Scope="User">
|
||||
<Value Profile="(Default)">White</Value>
|
||||
</Setting>
|
||||
<Setting Name="FontStyle" Type="System.Drawing.Font" Scope="User">
|
||||
<Value Profile="(Default)">Microsoft Sans Serif, 11.25pt</Value>
|
||||
</Setting>
|
||||
<Setting Name="BackPicturePath" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="SpoofGames" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="BandwithLimit" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
127
QuestForm.Designer.cs
generated
Normal file
127
QuestForm.Designer.cs
generated
Normal file
@@ -0,0 +1,127 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class QuestForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.RefreshRateComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.TextureResTextBox = new System.Windows.Forms.TextBox();
|
||||
this.ResolutionLabel = new System.Windows.Forms.Label();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// RefreshRateComboBox
|
||||
//
|
||||
this.RefreshRateComboBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.ComboBoxColor;
|
||||
this.RefreshRateComboBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RefreshRateComboBox.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RefreshRateComboBox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "ComboBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RefreshRateComboBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.RefreshRateComboBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.RefreshRateComboBox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.RefreshRateComboBox.FormattingEnabled = true;
|
||||
this.RefreshRateComboBox.Items.AddRange(new object[] {
|
||||
"72",
|
||||
"90"});
|
||||
this.RefreshRateComboBox.Location = new System.Drawing.Point(12, 12);
|
||||
this.RefreshRateComboBox.Name = "RefreshRateComboBox";
|
||||
this.RefreshRateComboBox.Size = new System.Drawing.Size(345, 26);
|
||||
this.RefreshRateComboBox.TabIndex = 0;
|
||||
this.RefreshRateComboBox.Text = "Select refresh rate";
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.button1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.button1.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.button1.Location = new System.Drawing.Point(12, 73);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(87, 34);
|
||||
this.button1.TabIndex = 1;
|
||||
this.button1.Text = "Apply";
|
||||
this.button1.UseVisualStyleBackColor = false;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// TextureResTextBox
|
||||
//
|
||||
this.TextureResTextBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
|
||||
this.TextureResTextBox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.TextureResTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.TextureResTextBox.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.TextureResTextBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.TextureResTextBox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.TextureResTextBox.Location = new System.Drawing.Point(12, 43);
|
||||
this.TextureResTextBox.Name = "TextureResTextBox";
|
||||
this.TextureResTextBox.Size = new System.Drawing.Size(120, 24);
|
||||
this.TextureResTextBox.TabIndex = 2;
|
||||
this.TextureResTextBox.Text = "0";
|
||||
//
|
||||
// ResolutionLabel
|
||||
//
|
||||
this.ResolutionLabel.AutoSize = true;
|
||||
this.ResolutionLabel.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ResolutionLabel.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ResolutionLabel.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.ResolutionLabel.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.ResolutionLabel.Location = new System.Drawing.Point(135, 43);
|
||||
this.ResolutionLabel.Name = "ResolutionLabel";
|
||||
this.ResolutionLabel.Size = new System.Drawing.Size(222, 18);
|
||||
this.ResolutionLabel.TabIndex = 3;
|
||||
this.ResolutionLabel.Text = "Resolution per eye (0 for default)";
|
||||
//
|
||||
// QuestForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(45)))));
|
||||
this.ClientSize = new System.Drawing.Size(371, 119);
|
||||
this.Controls.Add(this.ResolutionLabel);
|
||||
this.Controls.Add(this.TextureResTextBox);
|
||||
this.Controls.Add(this.button1);
|
||||
this.Controls.Add(this.RefreshRateComboBox);
|
||||
this.MaximumSize = new System.Drawing.Size(387, 158);
|
||||
this.MinimumSize = new System.Drawing.Size(387, 158);
|
||||
this.Name = "QuestForm";
|
||||
this.ShowIcon = false;
|
||||
this.Text = "QuestForm";
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ComboBox RefreshRateComboBox;
|
||||
private System.Windows.Forms.Button button1;
|
||||
private System.Windows.Forms.TextBox TextureResTextBox;
|
||||
private System.Windows.Forms.Label ResolutionLabel;
|
||||
}
|
||||
}
|
||||
33
QuestForm.cs
Normal file
33
QuestForm.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class QuestForm : Form
|
||||
{
|
||||
public QuestForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (RefreshRateComboBox.SelectedIndex != -1)
|
||||
{
|
||||
ADB.RunAdbCommandToString($"shell setprop debug.oculus.refreshRate {RefreshRateComboBox.SelectedItem.ToString()}");
|
||||
ADB.RunAdbCommandToString($"shell settings put global 90hz_global {RefreshRateComboBox.SelectedIndex}");
|
||||
ADB.RunAdbCommandToString($"shell settings put global 90hzglobal {RefreshRateComboBox.SelectedIndex}");
|
||||
}
|
||||
|
||||
if (TextureResTextBox.Text.Length>0)
|
||||
{
|
||||
Int32.TryParse(TextureResTextBox.Text, out int result);
|
||||
ADB.RunAdbCommandToString($"shell settings put global texture_size_Global {TextureResTextBox.Text}");
|
||||
ADB.RunAdbCommandToString($"shell settings put global texture_size_Global {TextureResTextBox.Text}");
|
||||
ADB.RunAdbCommandToString($"shell setprop debug.oculus.textureWidth {TextureResTextBox.Text}");
|
||||
ADB.RunAdbCommandToString($"shell setprop debug.oculus.textureHeight {TextureResTextBox.Text}");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
66
RCLONE.cs
Normal file
66
RCLONE.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Text;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class RCLONE
|
||||
{
|
||||
public static void killRclone()
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("rclone"))
|
||||
process.Kill();
|
||||
}
|
||||
|
||||
public static string rclonepw = "0aE0$D61#avO";
|
||||
|
||||
private static Process rclone = new Process();
|
||||
|
||||
public static string rcloneError = "";
|
||||
|
||||
public static string runRcloneCommand(string command, bool log = true, string bandwithLimit = "")
|
||||
{
|
||||
Environment.SetEnvironmentVariable("RCLONE_CRYPT_REMOTE", rclonepw);
|
||||
Environment.SetEnvironmentVariable("RCLONE_CONFIG_PASS", rclonepw);
|
||||
|
||||
rclone.StartInfo.StandardOutputEncoding = Encoding.UTF8;
|
||||
|
||||
if (bandwithLimit.Length>0)
|
||||
{
|
||||
command += $" --bwlimit={bandwithLimit}";
|
||||
}
|
||||
|
||||
if (rclonepw.Length > 0)
|
||||
command += " --ask-password=false";
|
||||
if (log && Properties.Settings.Default.logRclone)
|
||||
command += " --log-file=log.txt --log-level DEBUG";
|
||||
|
||||
Logger.Log($"Running Rclone command: {command}");
|
||||
|
||||
rclone.StartInfo.FileName = Environment.CurrentDirectory + "\\rclone\\rclone.exe";
|
||||
rclone.StartInfo.Arguments = command;
|
||||
rclone.StartInfo.RedirectStandardInput = true;
|
||||
rclone.StartInfo.RedirectStandardError = true;
|
||||
rclone.StartInfo.RedirectStandardOutput = true;
|
||||
rclone.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\rclone";
|
||||
rclone.StartInfo.CreateNoWindow = true;
|
||||
if (Form1.debugMode == true)
|
||||
rclone.StartInfo.CreateNoWindow = false;
|
||||
rclone.StartInfo.UseShellExecute = false;
|
||||
rclone.Start();
|
||||
|
||||
rclone.StandardInput.WriteLine(command);
|
||||
rclone.StandardInput.Flush();
|
||||
rclone.StandardInput.Close();
|
||||
|
||||
|
||||
var output = rclone.StandardOutput.ReadToEnd();
|
||||
string error = rclone.StandardError.ReadToEnd();
|
||||
rclone.WaitForExit();
|
||||
Logger.Log($"Rclone error: {error} {error.Length}\nRclone Output: {output}");
|
||||
if (error.Length > 77)
|
||||
Form1.processError = rcloneError;
|
||||
return output;
|
||||
}
|
||||
}
|
||||
}
|
||||
72
README.md
72
README.md
@@ -1,62 +1,16 @@
|
||||
# androidsideloader
|
||||
|
||||
Changelog
|
||||
The icon of the app contains an icon made by icon8.com
|
||||
|
||||
0.9
|
||||
+ Added the buggy progress bar back, uses different "logic"
|
||||
+ Added an icon (Increased the exe size by like 300% just with that)
|
||||
+ Added sideload folder button
|
||||
+ Added Creat user.json button and form
|
||||
+ Changed Message Boxes to notifications
|
||||
|
||||
0.8.5
|
||||
+ Added auto update download
|
||||
= Fixed a bug where if you didn't have the adb folder it would crash
|
||||
|
||||
0.8
|
||||
+ Every command now shows progress on title bar
|
||||
+ Automatically run Adb Devices and List Apps on form startup
|
||||
+ You can now search the App List Combo Box
|
||||
= Cleaned some code
|
||||
|
||||
0.7
|
||||
= Fixed UI Freezes
|
||||
+ Added Uninstall APK Button
|
||||
+ Added Launch package Button
|
||||
- Removed loading bar
|
||||
|
||||
0.6
|
||||
+ Added List Apk Perms button
|
||||
+ Added Change Permissions button
|
||||
+ Added dinamically added checkbox for permisssions
|
||||
= The software now downloads adb from master instead of v0.3 release
|
||||
|
||||
0.5
|
||||
- Removed Flash Firmware
|
||||
= Redesigned UI
|
||||
= Reworked RunAdbCommand function (now it will be possible to do stuff I wasnt able to do before)
|
||||
= Replaced Ui Buttons, still needs work
|
||||
+ Added List apk button
|
||||
+ Added List apk combo box
|
||||
+ Added get apk function
|
||||
= Cleaned a bit of code
|
||||
|
||||
0.4
|
||||
+ Added auto download of adb archive
|
||||
+ Added auto extraction of adb archive
|
||||
|
||||
0.3
|
||||
+ Added new form, you can run custom adb commands now
|
||||
+ Added recover and backup app data
|
||||
- Removed Select APK and Select OBB Buttons
|
||||
- Removed tooltips from removed buttons
|
||||
+ Sideload APK and Copy Obb buttons now also make you select the file/folder
|
||||
+ Improved firmware button
|
||||
|
||||
0.2
|
||||
+ Added Flash Firmware button
|
||||
+ Added few tooltips
|
||||
+ Renamed buttons
|
||||
|
||||
0.1
|
||||
+ Initial Release
|
||||
Special thanks:
|
||||
- Thanks to pmow for all of his work, including rclone, wonka and other projects
|
||||
- Thanks to flow for being friendly and helping every one, also congrats on being the discord server owner now! :D
|
||||
- Thanks to the data team, they know who they are ;)
|
||||
- Thanks to badcoder5000 for helping me redesign the ui
|
||||
- Thanks to gotard for the theme changer
|
||||
- Thanks to Verb8em for drawing the new icon
|
||||
- Thanks to 7zip team for 7zip :)
|
||||
- Thanks to rclone team for rclone :D
|
||||
- Thanks to https://stackoverflow.com/users/57611/erike for the folder browser dialog code
|
||||
- Thanks to Serge Weinstock for developing SergeUtils, which is used to search the combo box
|
||||
- Thanks to Mike Gold https://www.c-sharpcorner.com/members/mike-gold2 for the scrollable message box
|
||||
|
||||
261
SettingsForm.Designer.cs
generated
Normal file
261
SettingsForm.Designer.cs
generated
Normal file
@@ -0,0 +1,261 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class SettingsForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.checkForUpdatesCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.applyButton = new System.Windows.Forms.Button();
|
||||
this.enableMessageBoxesCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.resetSettingsButton = new System.Windows.Forms.Button();
|
||||
this.deleteAfterInstallCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.updateConfigCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.debugRcloneCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.userJsonOnGameInstall = new System.Windows.Forms.CheckBox();
|
||||
this.spoofGamesCheckbox = new System.Windows.Forms.CheckBox();
|
||||
this.BandwithTextbox = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.BandwithComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// checkForUpdatesCheckBox
|
||||
//
|
||||
this.checkForUpdatesCheckBox.AutoSize = true;
|
||||
this.checkForUpdatesCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkForUpdatesCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.checkForUpdatesCheckBox.Location = new System.Drawing.Point(13, 13);
|
||||
this.checkForUpdatesCheckBox.Name = "checkForUpdatesCheckBox";
|
||||
this.checkForUpdatesCheckBox.Size = new System.Drawing.Size(148, 22);
|
||||
this.checkForUpdatesCheckBox.TabIndex = 0;
|
||||
this.checkForUpdatesCheckBox.Text = "Check for updates";
|
||||
this.checkForUpdatesCheckBox.UseVisualStyleBackColor = true;
|
||||
this.checkForUpdatesCheckBox.CheckedChanged += new System.EventHandler(this.checkForUpdatesCheckBox_CheckedChanged);
|
||||
//
|
||||
// applyButton
|
||||
//
|
||||
this.applyButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.applyButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.applyButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.applyButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.applyButton.Location = new System.Drawing.Point(13, 231);
|
||||
this.applyButton.Name = "applyButton";
|
||||
this.applyButton.Size = new System.Drawing.Size(101, 31);
|
||||
this.applyButton.TabIndex = 5;
|
||||
this.applyButton.Text = "Apply";
|
||||
this.applyButton.UseVisualStyleBackColor = false;
|
||||
this.applyButton.Click += new System.EventHandler(this.applyButton_Click);
|
||||
//
|
||||
// enableMessageBoxesCheckBox
|
||||
//
|
||||
this.enableMessageBoxesCheckBox.AutoSize = true;
|
||||
this.enableMessageBoxesCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.enableMessageBoxesCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.enableMessageBoxesCheckBox.Location = new System.Drawing.Point(13, 36);
|
||||
this.enableMessageBoxesCheckBox.Name = "enableMessageBoxesCheckBox";
|
||||
this.enableMessageBoxesCheckBox.Size = new System.Drawing.Size(309, 22);
|
||||
this.enableMessageBoxesCheckBox.TabIndex = 1;
|
||||
this.enableMessageBoxesCheckBox.Text = "Enable Message Boxes on task completed";
|
||||
this.enableMessageBoxesCheckBox.UseVisualStyleBackColor = true;
|
||||
this.enableMessageBoxesCheckBox.CheckedChanged += new System.EventHandler(this.enableMessageBoxesCheckBox_CheckedChanged);
|
||||
//
|
||||
// resetSettingsButton
|
||||
//
|
||||
this.resetSettingsButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.resetSettingsButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.resetSettingsButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.resetSettingsButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.resetSettingsButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.resetSettingsButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.resetSettingsButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.resetSettingsButton.Location = new System.Drawing.Point(120, 231);
|
||||
this.resetSettingsButton.Name = "resetSettingsButton";
|
||||
this.resetSettingsButton.Size = new System.Drawing.Size(101, 31);
|
||||
this.resetSettingsButton.TabIndex = 4;
|
||||
this.resetSettingsButton.Text = "Reset Settings";
|
||||
this.resetSettingsButton.UseVisualStyleBackColor = false;
|
||||
this.resetSettingsButton.Click += new System.EventHandler(this.resetSettingsButton_Click);
|
||||
//
|
||||
// deleteAfterInstallCheckBox
|
||||
//
|
||||
this.deleteAfterInstallCheckBox.AutoSize = true;
|
||||
this.deleteAfterInstallCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.deleteAfterInstallCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.deleteAfterInstallCheckBox.Location = new System.Drawing.Point(13, 59);
|
||||
this.deleteAfterInstallCheckBox.Name = "deleteAfterInstallCheckBox";
|
||||
this.deleteAfterInstallCheckBox.Size = new System.Drawing.Size(288, 22);
|
||||
this.deleteAfterInstallCheckBox.TabIndex = 3;
|
||||
this.deleteAfterInstallCheckBox.Text = "Delete games after download and install";
|
||||
this.deleteAfterInstallCheckBox.UseVisualStyleBackColor = true;
|
||||
this.deleteAfterInstallCheckBox.CheckedChanged += new System.EventHandler(this.deleteAfterInstallCheckBox_CheckedChanged);
|
||||
//
|
||||
// updateConfigCheckBox
|
||||
//
|
||||
this.updateConfigCheckBox.AutoSize = true;
|
||||
this.updateConfigCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.updateConfigCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.updateConfigCheckBox.Location = new System.Drawing.Point(13, 83);
|
||||
this.updateConfigCheckBox.Name = "updateConfigCheckBox";
|
||||
this.updateConfigCheckBox.Size = new System.Drawing.Size(208, 22);
|
||||
this.updateConfigCheckBox.TabIndex = 6;
|
||||
this.updateConfigCheckBox.Text = "Update config automatically";
|
||||
this.updateConfigCheckBox.UseVisualStyleBackColor = true;
|
||||
this.updateConfigCheckBox.CheckedChanged += new System.EventHandler(this.updateConfigCheckBox_CheckedChanged);
|
||||
//
|
||||
// debugRcloneCheckBox
|
||||
//
|
||||
this.debugRcloneCheckBox.AutoSize = true;
|
||||
this.debugRcloneCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.debugRcloneCheckBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.debugRcloneCheckBox.Location = new System.Drawing.Point(13, 106);
|
||||
this.debugRcloneCheckBox.Name = "debugRcloneCheckBox";
|
||||
this.debugRcloneCheckBox.Size = new System.Drawing.Size(121, 22);
|
||||
this.debugRcloneCheckBox.TabIndex = 8;
|
||||
this.debugRcloneCheckBox.Text = "Debug Rclone";
|
||||
this.debugRcloneCheckBox.UseVisualStyleBackColor = true;
|
||||
this.debugRcloneCheckBox.CheckedChanged += new System.EventHandler(this.debugRcloneCheckBox_CheckedChanged);
|
||||
//
|
||||
// userJsonOnGameInstall
|
||||
//
|
||||
this.userJsonOnGameInstall.AutoSize = true;
|
||||
this.userJsonOnGameInstall.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.userJsonOnGameInstall.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.userJsonOnGameInstall.Location = new System.Drawing.Point(13, 130);
|
||||
this.userJsonOnGameInstall.Name = "userJsonOnGameInstall";
|
||||
this.userJsonOnGameInstall.Size = new System.Drawing.Size(243, 22);
|
||||
this.userJsonOnGameInstall.TabIndex = 9;
|
||||
this.userJsonOnGameInstall.Text = "Push random user.json on install";
|
||||
this.userJsonOnGameInstall.UseVisualStyleBackColor = true;
|
||||
this.userJsonOnGameInstall.CheckedChanged += new System.EventHandler(this.userJsonOnGameInstall_CheckedChanged);
|
||||
//
|
||||
// spoofGamesCheckbox
|
||||
//
|
||||
this.spoofGamesCheckbox.AutoSize = true;
|
||||
this.spoofGamesCheckbox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.spoofGamesCheckbox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.spoofGamesCheckbox.Location = new System.Drawing.Point(13, 153);
|
||||
this.spoofGamesCheckbox.Name = "spoofGamesCheckbox";
|
||||
this.spoofGamesCheckbox.Size = new System.Drawing.Size(253, 22);
|
||||
this.spoofGamesCheckbox.TabIndex = 10;
|
||||
this.spoofGamesCheckbox.Text = "Spoof games installed from rclone";
|
||||
this.spoofGamesCheckbox.UseVisualStyleBackColor = true;
|
||||
this.spoofGamesCheckbox.CheckedChanged += new System.EventHandler(this.spoofGamesCheckbox_CheckedChanged);
|
||||
//
|
||||
// BandwithTextbox
|
||||
//
|
||||
this.BandwithTextbox.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
|
||||
this.BandwithTextbox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithTextbox.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithTextbox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithTextbox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.BandwithTextbox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.BandwithTextbox.Location = new System.Drawing.Point(13, 201);
|
||||
this.BandwithTextbox.Name = "BandwithTextbox";
|
||||
this.BandwithTextbox.Size = new System.Drawing.Size(177, 24);
|
||||
this.BandwithTextbox.TabIndex = 11;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.label1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.label1.Location = new System.Drawing.Point(12, 178);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(230, 18);
|
||||
this.label1.TabIndex = 12;
|
||||
this.label1.Text = "Rclone bandwith limit, 0 to disable";
|
||||
//
|
||||
// BandwithComboBox
|
||||
//
|
||||
this.BandwithComboBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.ComboBoxColor;
|
||||
this.BandwithComboBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithComboBox.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithComboBox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "ComboBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.BandwithComboBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.BandwithComboBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.BandwithComboBox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.BandwithComboBox.FormattingEnabled = true;
|
||||
this.BandwithComboBox.Items.AddRange(new object[] {
|
||||
"B",
|
||||
"K",
|
||||
"M",
|
||||
"G"});
|
||||
this.BandwithComboBox.Location = new System.Drawing.Point(196, 199);
|
||||
this.BandwithComboBox.Name = "BandwithComboBox";
|
||||
this.BandwithComboBox.Size = new System.Drawing.Size(55, 26);
|
||||
this.BandwithComboBox.TabIndex = 13;
|
||||
//
|
||||
// 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(341, 274);
|
||||
this.Controls.Add(this.BandwithComboBox);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.BandwithTextbox);
|
||||
this.Controls.Add(this.spoofGamesCheckbox);
|
||||
this.Controls.Add(this.userJsonOnGameInstall);
|
||||
this.Controls.Add(this.debugRcloneCheckBox);
|
||||
this.Controls.Add(this.updateConfigCheckBox);
|
||||
this.Controls.Add(this.deleteAfterInstallCheckBox);
|
||||
this.Controls.Add(this.enableMessageBoxesCheckBox);
|
||||
this.Controls.Add(this.applyButton);
|
||||
this.Controls.Add(this.checkForUpdatesCheckBox);
|
||||
this.Controls.Add(this.resetSettingsButton);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ForeColor = System.Drawing.Color.White;
|
||||
this.MaximumSize = new System.Drawing.Size(357, 313);
|
||||
this.MinimumSize = new System.Drawing.Size(357, 313);
|
||||
this.Name = "SettingsForm";
|
||||
this.ShowIcon = false;
|
||||
this.Text = "Settings";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SettingsForm_FormClosing);
|
||||
this.Load += new System.EventHandler(this.SettingsForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.CheckBox checkForUpdatesCheckBox;
|
||||
private System.Windows.Forms.Button applyButton;
|
||||
private System.Windows.Forms.CheckBox enableMessageBoxesCheckBox;
|
||||
private System.Windows.Forms.Button resetSettingsButton;
|
||||
private System.Windows.Forms.CheckBox deleteAfterInstallCheckBox;
|
||||
private System.Windows.Forms.CheckBox updateConfigCheckBox;
|
||||
private System.Windows.Forms.CheckBox debugRcloneCheckBox;
|
||||
private System.Windows.Forms.CheckBox userJsonOnGameInstall;
|
||||
private System.Windows.Forms.CheckBox spoofGamesCheckbox;
|
||||
private System.Windows.Forms.TextBox BandwithTextbox;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.ComboBox BandwithComboBox;
|
||||
}
|
||||
}
|
||||
112
SettingsForm.cs
Normal file
112
SettingsForm.cs
Normal file
@@ -0,0 +1,112 @@
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class SettingsForm : Form
|
||||
{
|
||||
public SettingsForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void SettingsForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
this.CenterToParent();
|
||||
|
||||
intSettings();
|
||||
|
||||
intToolTips();
|
||||
}
|
||||
|
||||
private void intSettings()
|
||||
{
|
||||
checkForUpdatesCheckBox.Checked = Properties.Settings.Default.checkForUpdates;
|
||||
enableMessageBoxesCheckBox.Checked = Properties.Settings.Default.enableMessageBoxes;
|
||||
deleteAfterInstallCheckBox.Checked = Properties.Settings.Default.deleteAllAfterInstall;
|
||||
updateConfigCheckBox.Checked = Properties.Settings.Default.autoUpdateConfig;
|
||||
debugRcloneCheckBox.Checked = Properties.Settings.Default.logRclone;
|
||||
userJsonOnGameInstall.Checked = Properties.Settings.Default.userJsonOnGameInstall;
|
||||
spoofGamesCheckbox.Checked = Properties.Settings.Default.SpoofGames;
|
||||
if (Properties.Settings.Default.BandwithLimit.Length>1)
|
||||
{
|
||||
BandwithTextbox.Text = Properties.Settings.Default.BandwithLimit.Remove(Properties.Settings.Default.BandwithLimit.Length - 1);
|
||||
BandwithComboBox.Text = Properties.Settings.Default.BandwithLimit[Properties.Settings.Default.BandwithLimit.Length-1].ToString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void intToolTips()
|
||||
{
|
||||
ToolTip checkForUpdatesToolTip = new ToolTip();
|
||||
checkForUpdatesToolTip.SetToolTip(this.checkForUpdatesCheckBox, "If this is checked, the software will check for available updates");
|
||||
ToolTip enableMessageBoxesToolTip = new ToolTip();
|
||||
enableMessageBoxesToolTip.SetToolTip(this.enableMessageBoxesCheckBox, "If this is checked, the software will display message boxes after every completed task");
|
||||
ToolTip deleteAfterInstallToolTip = new ToolTip();
|
||||
deleteAfterInstallToolTip.SetToolTip(this.deleteAfterInstallCheckBox, "If this is checked, the software will delete all game files after downloading and installing a game from a remote server");
|
||||
}
|
||||
|
||||
private void applyButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (BandwithTextbox.Text.Length > 0 && BandwithTextbox.Text != "0")
|
||||
if (BandwithComboBox.SelectedIndex == -1)
|
||||
{
|
||||
FlexibleMessageBox.Show("You need to select something from the combobox");
|
||||
return;
|
||||
}
|
||||
else
|
||||
Properties.Settings.Default.BandwithLimit = $"{BandwithTextbox.Text.Replace(" ", "")}{BandwithComboBox.Text}";
|
||||
else
|
||||
Properties.Settings.Default.BandwithLimit = "";
|
||||
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void SettingsForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void checkForUpdatesCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.checkForUpdates = checkForUpdatesCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void enableMessageBoxesCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.enableMessageBoxes = enableMessageBoxesCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void resetSettingsButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.Reset();
|
||||
intSettings();
|
||||
}
|
||||
|
||||
private void deleteAfterInstallCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.deleteAllAfterInstall = deleteAfterInstallCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void updateConfigCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.autoUpdateConfig = updateConfigCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void debugRcloneCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.logRclone = debugRcloneCheckBox.Checked;
|
||||
}
|
||||
|
||||
private void userJsonOnGameInstall_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.userJsonOnGameInstall = userJsonOnGameInstall.Checked;
|
||||
}
|
||||
|
||||
private void spoofGamesCheckbox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.SpoofGames = spoofGamesCheckbox.Checked;
|
||||
}
|
||||
}
|
||||
}
|
||||
120
SettingsForm.resx
Normal file
120
SettingsForm.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
BIN
Sideloader Launcher.exe
Normal file
BIN
Sideloader Launcher.exe
Normal file
Binary file not shown.
75
Sideloader.cs
Normal file
75
Sideloader.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Spoofer;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
class Sideloader
|
||||
{
|
||||
|
||||
public static void PushUserJsons()
|
||||
{
|
||||
foreach (var userJson in UsernameForm.userJsons)
|
||||
{
|
||||
UsernameForm.createUserJsonByName(Utilities.randomString(16), userJson);
|
||||
ADB.RunAdbCommandToString("push \"" + Environment.CurrentDirectory + $"\\{userJson}\" " + " /sdcard/");
|
||||
File.Delete(userJson);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
|
||||
public static async Task updateConfig(string remote)
|
||||
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
|
||||
{
|
||||
string localHash = "";
|
||||
try { localHash = File.ReadAllText(Environment.CurrentDirectory + "\\rclone\\hash.txt"); } catch { } //file may not exist
|
||||
|
||||
string hash = RCLONE.runRcloneCommand($"md5sum --config .\\a \"{remote}:Quest Homebrew/Sideloading Methods/1. Rookie Sideloader - VRP Edition/a\"");
|
||||
try { hash = hash.Substring(0, hash.LastIndexOf(" ")); } catch { return; } //remove stuff after hash
|
||||
|
||||
Debug.WriteLine("The local file hash is " + localHash + " and the current a file hash is " + hash);
|
||||
|
||||
if (!string.Equals(localHash, hash))
|
||||
{
|
||||
RCLONE.runRcloneCommand(string.Format($"copy \"{remote}:Quest Homebrew/Sideloading Methods/1. Rookie Sideloader - VRP Edition/a\" \"{Environment.CurrentDirectory}\" --config .\\a"));
|
||||
RCLONE.killRclone();
|
||||
File.Copy(Environment.CurrentDirectory + "\\a", Environment.CurrentDirectory + "\\rclone\\a", true);
|
||||
File.WriteAllText(Environment.CurrentDirectory + "\\rclone\\hash.txt", hash);
|
||||
}
|
||||
}
|
||||
|
||||
public static string RunADBCommandsFromFile(string path, string RunFromPath)
|
||||
{
|
||||
string output = string.Empty;
|
||||
var commands = File.ReadAllLines(path);
|
||||
foreach (string cmd in commands)
|
||||
{
|
||||
if (cmd.StartsWith("adb"))
|
||||
{
|
||||
var regex = new Regex(Regex.Escape("adb"));
|
||||
var command = regex.Replace(cmd, $"\"{ADB.adbFilePath}\"", 1);
|
||||
|
||||
Logger.Log($"Logging command: {command} from file: {path}");
|
||||
output += Utilities.startProcess("cmd.exe", RunFromPath, command);
|
||||
}
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
public static string RunCommandsFromFile(string path, string RunFromPath)
|
||||
{
|
||||
string output = string.Empty;
|
||||
var commands = File.ReadAllLines(path);
|
||||
foreach (string command in commands)
|
||||
{
|
||||
Logger.Log($"Logging command: {command} from file: {path}");
|
||||
output += Utilities.startProcess("cmd.exe", RunFromPath, command);
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
118
SpoofForm.Designer.cs
generated
Normal file
118
SpoofForm.Designer.cs
generated
Normal file
@@ -0,0 +1,118 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class SpoofForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.PackageNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.RandomizeButton = new System.Windows.Forms.Button();
|
||||
this.progressBar1 = new System.Windows.Forms.ProgressBar();
|
||||
this.SpoofButton = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// PackageNameTextBox
|
||||
//
|
||||
this.PackageNameTextBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
|
||||
this.PackageNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.PackageNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.PackageNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.PackageNameTextBox.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.PackageNameTextBox.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.PackageNameTextBox.Location = new System.Drawing.Point(13, 13);
|
||||
this.PackageNameTextBox.Name = "PackageNameTextBox";
|
||||
this.PackageNameTextBox.Size = new System.Drawing.Size(273, 24);
|
||||
this.PackageNameTextBox.TabIndex = 1;
|
||||
//
|
||||
// RandomizeButton
|
||||
//
|
||||
this.RandomizeButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.RandomizeButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RandomizeButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RandomizeButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.RandomizeButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.RandomizeButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.RandomizeButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.RandomizeButton.Location = new System.Drawing.Point(12, 72);
|
||||
this.RandomizeButton.Name = "RandomizeButton";
|
||||
this.RandomizeButton.Size = new System.Drawing.Size(110, 42);
|
||||
this.RandomizeButton.TabIndex = 2;
|
||||
this.RandomizeButton.Text = "Randomize";
|
||||
this.RandomizeButton.UseVisualStyleBackColor = false;
|
||||
this.RandomizeButton.Click += new System.EventHandler(this.RandomizeButton_Click);
|
||||
//
|
||||
// progressBar1
|
||||
//
|
||||
this.progressBar1.Location = new System.Drawing.Point(13, 43);
|
||||
this.progressBar1.Name = "progressBar1";
|
||||
this.progressBar1.Size = new System.Drawing.Size(273, 23);
|
||||
this.progressBar1.TabIndex = 3;
|
||||
//
|
||||
// SpoofButton
|
||||
//
|
||||
this.SpoofButton.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.SpoofButton.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SpoofButton.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SpoofButton.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.SpoofButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.SpoofButton.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.SpoofButton.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.SpoofButton.Location = new System.Drawing.Point(176, 72);
|
||||
this.SpoofButton.Name = "SpoofButton";
|
||||
this.SpoofButton.Size = new System.Drawing.Size(110, 42);
|
||||
this.SpoofButton.TabIndex = 4;
|
||||
this.SpoofButton.Text = "Spoof!";
|
||||
this.SpoofButton.UseVisualStyleBackColor = false;
|
||||
this.SpoofButton.Click += new System.EventHandler(this.SpoofButton_Click);
|
||||
//
|
||||
// SpoofForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.ClientSize = new System.Drawing.Size(300, 131);
|
||||
this.Controls.Add(this.SpoofButton);
|
||||
this.Controls.Add(this.progressBar1);
|
||||
this.Controls.Add(this.RandomizeButton);
|
||||
this.Controls.Add(this.PackageNameTextBox);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.MaximumSize = new System.Drawing.Size(316, 170);
|
||||
this.MinimumSize = new System.Drawing.Size(316, 170);
|
||||
this.Name = "SpoofForm";
|
||||
this.Text = "SpoofForm";
|
||||
this.Load += new System.EventHandler(this.SpoofForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
private System.Windows.Forms.TextBox PackageNameTextBox;
|
||||
private System.Windows.Forms.Button RandomizeButton;
|
||||
private System.Windows.Forms.ProgressBar progressBar1;
|
||||
private System.Windows.Forms.Button SpoofButton;
|
||||
}
|
||||
}
|
||||
61
SpoofForm.cs
Normal file
61
SpoofForm.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using Spoofer;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class SpoofForm : Form
|
||||
{
|
||||
public SpoofForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void SpoofButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
string NewPackageName = PackageNameTextBox.Text;
|
||||
string path;
|
||||
using (OpenFileDialog openFileDialog = new OpenFileDialog())
|
||||
{
|
||||
openFileDialog.Filter = "Android apps (*.apk)|*.apk";
|
||||
openFileDialog.FilterIndex = 2;
|
||||
openFileDialog.RestoreDirectory = true;
|
||||
|
||||
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
||||
path = openFileDialog.FileName;
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
progressBar1.Style = ProgressBarStyle.Marquee;
|
||||
|
||||
Thread t1 = new Thread(() =>
|
||||
{
|
||||
spoofer.Init();
|
||||
spoofer.SpoofApk(path, NewPackageName);
|
||||
});
|
||||
t1.IsBackground = true;
|
||||
t1.Start();
|
||||
|
||||
while (t1.IsAlive)
|
||||
await Task.Delay(100);
|
||||
|
||||
progressBar1.Style = ProgressBarStyle.Continuous;
|
||||
|
||||
FlexibleMessageBox.Show($"App spoofed from {spoofer.originalPackageName} to {NewPackageName}");
|
||||
}
|
||||
|
||||
private void SpoofForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
PackageNameTextBox.Text = Utilities.RandomPackageName();
|
||||
}
|
||||
|
||||
private void RandomizeButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
PackageNameTextBox.Text = Utilities.RandomPackageName();
|
||||
}
|
||||
}
|
||||
}
|
||||
120
SpoofForm.resx
Normal file
120
SpoofForm.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
236
ThemeForm.Designer.cs
generated
Normal file
236
ThemeForm.Designer.cs
generated
Normal file
@@ -0,0 +1,236 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class themeForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.colorDialog1 = new System.Windows.Forms.ColorDialog();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.button4 = new System.Windows.Forms.Button();
|
||||
this.button5 = new System.Windows.Forms.Button();
|
||||
this.button7 = new System.Windows.Forms.Button();
|
||||
this.button8 = new System.Windows.Forms.Button();
|
||||
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
|
||||
this.button9 = new System.Windows.Forms.Button();
|
||||
this.button10 = new System.Windows.Forms.Button();
|
||||
this.fontDialog1 = new System.Windows.Forms.FontDialog();
|
||||
this.button3 = new System.Windows.Forms.Button();
|
||||
this.button11 = new System.Windows.Forms.Button();
|
||||
this.button12 = new System.Windows.Forms.Button();
|
||||
this.button13 = new System.Windows.Forms.Button();
|
||||
this.openThemeDialog = new System.Windows.Forms.OpenFileDialog();
|
||||
this.button2 = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// colorDialog1
|
||||
//
|
||||
this.colorDialog1.AnyColor = true;
|
||||
this.colorDialog1.FullOpen = true;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Location = new System.Drawing.Point(13, 12);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(128, 23);
|
||||
this.button1.TabIndex = 0;
|
||||
this.button1.Text = "Set backgorund color";
|
||||
this.button1.UseVisualStyleBackColor = true;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// button4
|
||||
//
|
||||
this.button4.Location = new System.Drawing.Point(13, 125);
|
||||
this.button4.Name = "button4";
|
||||
this.button4.Size = new System.Drawing.Size(128, 23);
|
||||
this.button4.TabIndex = 0;
|
||||
this.button4.Text = "Set button color";
|
||||
this.button4.UseVisualStyleBackColor = true;
|
||||
this.button4.Click += new System.EventHandler(this.button4_Click);
|
||||
//
|
||||
// button5
|
||||
//
|
||||
this.button5.Location = new System.Drawing.Point(13, 181);
|
||||
this.button5.Name = "button5";
|
||||
this.button5.Size = new System.Drawing.Size(128, 23);
|
||||
this.button5.TabIndex = 0;
|
||||
this.button5.Text = "Set combobox color";
|
||||
this.button5.UseVisualStyleBackColor = true;
|
||||
this.button5.Click += new System.EventHandler(this.button5_Click);
|
||||
//
|
||||
// button7
|
||||
//
|
||||
this.button7.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.button7.Location = new System.Drawing.Point(185, 11);
|
||||
this.button7.Name = "button7";
|
||||
this.button7.Size = new System.Drawing.Size(93, 52);
|
||||
this.button7.TabIndex = 1;
|
||||
this.button7.Text = "Save";
|
||||
this.button7.UseVisualStyleBackColor = true;
|
||||
this.button7.Click += new System.EventHandler(this.button7_Click);
|
||||
//
|
||||
// button8
|
||||
//
|
||||
this.button8.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.button8.Location = new System.Drawing.Point(185, 69);
|
||||
this.button8.Name = "button8";
|
||||
this.button8.Size = new System.Drawing.Size(93, 52);
|
||||
this.button8.TabIndex = 2;
|
||||
this.button8.Text = "Reset";
|
||||
this.button8.UseVisualStyleBackColor = true;
|
||||
this.button8.Click += new System.EventHandler(this.button8_Click);
|
||||
//
|
||||
// openFileDialog1
|
||||
//
|
||||
this.openFileDialog1.Filter = "Images|*.png;*.jpg;*.bmp;*.gif";
|
||||
//
|
||||
// button9
|
||||
//
|
||||
this.button9.Location = new System.Drawing.Point(13, 40);
|
||||
this.button9.Name = "button9";
|
||||
this.button9.Size = new System.Drawing.Size(128, 23);
|
||||
this.button9.TabIndex = 3;
|
||||
this.button9.Text = "Set background picture";
|
||||
this.button9.UseVisualStyleBackColor = true;
|
||||
this.button9.Click += new System.EventHandler(this.button9_Click);
|
||||
//
|
||||
// button10
|
||||
//
|
||||
this.button10.Location = new System.Drawing.Point(13, 97);
|
||||
this.button10.Name = "button10";
|
||||
this.button10.Size = new System.Drawing.Size(128, 23);
|
||||
this.button10.TabIndex = 4;
|
||||
this.button10.Text = "Set font style";
|
||||
this.button10.UseVisualStyleBackColor = true;
|
||||
this.button10.Click += new System.EventHandler(this.button10_Click);
|
||||
//
|
||||
// fontDialog1
|
||||
//
|
||||
this.fontDialog1.Color = System.Drawing.Color.White;
|
||||
this.fontDialog1.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
//
|
||||
// button3
|
||||
//
|
||||
this.button3.Location = new System.Drawing.Point(13, 69);
|
||||
this.button3.Name = "button3";
|
||||
this.button3.Size = new System.Drawing.Size(128, 23);
|
||||
this.button3.TabIndex = 5;
|
||||
this.button3.Text = "Set font color";
|
||||
this.button3.UseVisualStyleBackColor = true;
|
||||
this.button3.Click += new System.EventHandler(this.button3_Click);
|
||||
//
|
||||
// button11
|
||||
//
|
||||
this.button11.Location = new System.Drawing.Point(13, 153);
|
||||
this.button11.Name = "button11";
|
||||
this.button11.Size = new System.Drawing.Size(128, 23);
|
||||
this.button11.TabIndex = 6;
|
||||
this.button11.Text = "Set sub-button color";
|
||||
this.button11.UseVisualStyleBackColor = true;
|
||||
this.button11.Click += new System.EventHandler(this.button11_Click);
|
||||
//
|
||||
// button12
|
||||
//
|
||||
this.button12.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.button12.Location = new System.Drawing.Point(185, 127);
|
||||
this.button12.Name = "button12";
|
||||
this.button12.Size = new System.Drawing.Size(93, 52);
|
||||
this.button12.TabIndex = 7;
|
||||
this.button12.Text = "Export Theme";
|
||||
this.button12.UseVisualStyleBackColor = true;
|
||||
this.button12.Click += new System.EventHandler(this.button12_Click);
|
||||
//
|
||||
// button13
|
||||
//
|
||||
this.button13.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.button13.Location = new System.Drawing.Point(185, 185);
|
||||
this.button13.Name = "button13";
|
||||
this.button13.Size = new System.Drawing.Size(93, 52);
|
||||
this.button13.TabIndex = 8;
|
||||
this.button13.Text = "Import theme";
|
||||
this.button13.UseVisualStyleBackColor = true;
|
||||
this.button13.Click += new System.EventHandler(this.button13_Click);
|
||||
//
|
||||
// openThemeDialog
|
||||
//
|
||||
this.openThemeDialog.Filter = "Text Files|*.txt";
|
||||
//
|
||||
// button2
|
||||
//
|
||||
this.button2.Location = new System.Drawing.Point(13, 210);
|
||||
this.button2.Name = "button2";
|
||||
this.button2.Size = new System.Drawing.Size(128, 23);
|
||||
this.button2.TabIndex = 9;
|
||||
this.button2.Text = "Set textbox color";
|
||||
this.button2.UseVisualStyleBackColor = true;
|
||||
this.button2.Click += new System.EventHandler(this.button2_Click);
|
||||
//
|
||||
// themeForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.ClientSize = new System.Drawing.Size(290, 248);
|
||||
this.Controls.Add(this.button2);
|
||||
this.Controls.Add(this.button13);
|
||||
this.Controls.Add(this.button12);
|
||||
this.Controls.Add(this.button11);
|
||||
this.Controls.Add(this.button3);
|
||||
this.Controls.Add(this.button10);
|
||||
this.Controls.Add(this.button9);
|
||||
this.Controls.Add(this.button8);
|
||||
this.Controls.Add(this.button7);
|
||||
this.Controls.Add(this.button5);
|
||||
this.Controls.Add(this.button4);
|
||||
this.Controls.Add(this.button1);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.Name = "themeForm";
|
||||
this.Text = "Create Your Theme";
|
||||
this.Load += new System.EventHandler(this.themeForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ColorDialog colorDialog1;
|
||||
private System.Windows.Forms.Button button1;
|
||||
private System.Windows.Forms.Button button4;
|
||||
private System.Windows.Forms.Button button5;
|
||||
private System.Windows.Forms.Button button7;
|
||||
private System.Windows.Forms.Button button8;
|
||||
private System.Windows.Forms.OpenFileDialog openFileDialog1;
|
||||
private System.Windows.Forms.Button button9;
|
||||
private System.Windows.Forms.Button button10;
|
||||
private System.Windows.Forms.FontDialog fontDialog1;
|
||||
private System.Windows.Forms.Button button3;
|
||||
private System.Windows.Forms.Button button11;
|
||||
private System.Windows.Forms.Button button12;
|
||||
private System.Windows.Forms.Button button13;
|
||||
private System.Windows.Forms.OpenFileDialog openThemeDialog;
|
||||
private System.Windows.Forms.Button button2;
|
||||
}
|
||||
}
|
||||
182
ThemeForm.cs
Normal file
182
ThemeForm.cs
Normal file
@@ -0,0 +1,182 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using System.Collections.Specialized;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class themeForm : Form
|
||||
{
|
||||
|
||||
public themeForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void button4_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.ButtonColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.BackColor = colorDialog1.Color;
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void button7_Click(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.Save();
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void button8_Click(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.BackColor = Color.FromArgb(45,45,45);
|
||||
Properties.Settings.Default.ComboBoxColor = Color.FromArgb(45, 45, 45);
|
||||
Properties.Settings.Default.TextBoxColor = Color.FromArgb(45,45,45);
|
||||
Properties.Settings.Default.ButtonColor = SystemColors.ActiveCaptionText;
|
||||
Properties.Settings.Default.SubButtonColor=Color.FromArgb(64, 64, 64);
|
||||
Properties.Settings.Default.BackPicturePath = "";
|
||||
Properties.Settings.Default.FontStyle = new Font("Microsoft Sans Serif", 11, FontStyle.Regular);
|
||||
Properties.Settings.Default.FontColor = Color.White;
|
||||
Properties.Settings.Default.Save();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void button5_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.ComboBoxColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void button9_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
String extension = Path.GetExtension(openFileDialog1.FileName);
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\pic" + extension))
|
||||
File.Delete(Environment.CurrentDirectory + "\\pic" + extension);
|
||||
File.Copy(openFileDialog1.FileName, Environment.CurrentDirectory + "\\pic" + extension);
|
||||
Properties.Settings.Default.BackPicturePath = Environment.CurrentDirectory + "\\pic" + extension ;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void button10_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (fontDialog1.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
Properties.Settings.Default.FontStyle = fontDialog1.Font;
|
||||
}
|
||||
}
|
||||
|
||||
private void button3_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.FontColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void button11_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.SubButtonColor = colorDialog1.Color;
|
||||
}
|
||||
|
||||
private void themeForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void button12_Click(object sender, EventArgs e)
|
||||
{
|
||||
String BackColor = ColorTranslator.ToHtml(Properties.Settings.Default.BackColor);
|
||||
String TextBoxColor = ColorTranslator.ToHtml(Properties.Settings.Default.TextBoxColor);
|
||||
String ComboBoxColor = ColorTranslator.ToHtml(Properties.Settings.Default.ComboBoxColor);
|
||||
String ButtonColor = ColorTranslator.ToHtml(Properties.Settings.Default.ButtonColor);
|
||||
String SubButtonColor = ColorTranslator.ToHtml(Properties.Settings.Default.SubButtonColor);
|
||||
String FontColor = ColorTranslator.ToHtml(Properties.Settings.Default.FontColor);
|
||||
var cvt = new FontConverter();
|
||||
string FontStyle = cvt.ConvertToString(Properties.Settings.Default.FontStyle);
|
||||
int i;
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\theme.txt"))
|
||||
{
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\theme11.txt"))
|
||||
MessageBox.Show("You can't export more than 12 themes, sorry :(");
|
||||
else
|
||||
{
|
||||
for (i = 1; i <= 10; i++)
|
||||
{
|
||||
if (File.Exists(Environment.CurrentDirectory + "\\theme" + i + ".txt"))
|
||||
continue;
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
File.WriteAllText(Environment.CurrentDirectory + "\\theme" + i + ".txt", "#SideloaderTheme# \n" + BackColor + "\n" + ButtonColor + "\n" + SubButtonColor + "\n"
|
||||
+ TextBoxColor + "\n" + ComboBoxColor + "\n" + FontColor + "\n" + FontStyle);
|
||||
MessageBox.Show("Theme exported as theme" + i + ".txt");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
File.WriteAllText(Environment.CurrentDirectory + "\\theme.txt", "#SideloaderTheme# \n" + BackColor + "\n" + ButtonColor + "\n" + SubButtonColor + "\n"
|
||||
+ TextBoxColor + "\n" + ComboBoxColor + "\n" + FontColor + "\n" + FontStyle);
|
||||
MessageBox.Show("Theme exported as theme.txt");
|
||||
}
|
||||
}
|
||||
|
||||
private void button13_Click(object sender, EventArgs e)
|
||||
{
|
||||
openThemeDialog.InitialDirectory = Environment.CurrentDirectory;
|
||||
if (openThemeDialog.ShowDialog() == DialogResult.OK) {
|
||||
using (StreamReader sr = new StreamReader(openThemeDialog.FileName))
|
||||
{
|
||||
StringCollection myCol = new StringCollection();
|
||||
myCol.AddRange(File.ReadAllLines(openThemeDialog.FileName));
|
||||
if (myCol.Contains("#SideloaderTheme# "))
|
||||
{
|
||||
String[] settings = new String[myCol.Count];
|
||||
myCol.CopyTo(settings, 0);
|
||||
|
||||
Color BackColor = ColorTranslator.FromHtml(settings[1]);
|
||||
Color ButtonColor = ColorTranslator.FromHtml(settings[2]);
|
||||
Color SubButtonColor = ColorTranslator.FromHtml(settings[3]);
|
||||
Color TextBoxColor = ColorTranslator.FromHtml(settings[4]);
|
||||
Color ComboBoxColor = ColorTranslator.FromHtml(settings[5]);
|
||||
Color FontColor = ColorTranslator.FromHtml(settings[6]);
|
||||
Properties.Settings.Default.BackColor = BackColor;
|
||||
Properties.Settings.Default.ButtonColor = ButtonColor;
|
||||
Properties.Settings.Default.SubButtonColor = SubButtonColor;
|
||||
Properties.Settings.Default.TextBoxColor = TextBoxColor;
|
||||
Properties.Settings.Default.ComboBoxColor = ComboBoxColor;
|
||||
Properties.Settings.Default.FontColor = FontColor;
|
||||
System.ComponentModel.TypeConverter converter =
|
||||
System.ComponentModel.TypeDescriptor.GetConverter(typeof(Font));
|
||||
var cvt = new FontConverter();
|
||||
Font f = cvt.ConvertFromString(settings[7]) as Font;
|
||||
Properties.Settings.Default.FontStyle = f;
|
||||
}
|
||||
else
|
||||
MessageBox.Show("The file you've selected is not a Rookie Sideloader theme file!");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void button2_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (colorDialog1.ShowDialog() == DialogResult.OK)
|
||||
Properties.Settings.Default.TextBoxColor = colorDialog1.Color;
|
||||
}
|
||||
}
|
||||
}
|
||||
132
ThemeForm.resx
Normal file
132
ThemeForm.resx
Normal file
@@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="colorDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>138, 17</value>
|
||||
</metadata>
|
||||
<metadata name="fontDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>278, 17</value>
|
||||
</metadata>
|
||||
<metadata name="openThemeDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>394, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
92
UsernameForm.Designer.cs
generated
Normal file
92
UsernameForm.Designer.cs
generated
Normal file
@@ -0,0 +1,92 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class UsernameForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor;
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "TextBoxColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.textBox1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.textBox1.ForeColor = System.Drawing.Color.White;
|
||||
this.textBox1.Location = new System.Drawing.Point(13, 13);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Size = new System.Drawing.Size(418, 24);
|
||||
this.textBox1.TabIndex = 0;
|
||||
this.textBox1.Text = "Enter your username here";
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.BackColor = global::AndroidSideloader.Properties.Settings.Default.SubButtonColor;
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("Font", global::AndroidSideloader.Properties.Settings.Default, "FontStyle", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "SubButtonColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.button1.Font = global::AndroidSideloader.Properties.Settings.Default.FontStyle;
|
||||
this.button1.ForeColor = global::AndroidSideloader.Properties.Settings.Default.FontColor;
|
||||
this.button1.Location = new System.Drawing.Point(13, 51);
|
||||
this.button1.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(418, 34);
|
||||
this.button1.TabIndex = 1;
|
||||
this.button1.Text = "Create User.Json";
|
||||
this.button1.UseVisualStyleBackColor = false;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// UsernameForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor;
|
||||
this.ClientSize = new System.Drawing.Size(443, 100);
|
||||
this.Controls.Add(this.button1);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.DataBindings.Add(new System.Windows.Forms.Binding("BackColor", global::AndroidSideloader.Properties.Settings.Default, "BackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ForeColor = System.Drawing.Color.White;
|
||||
this.MaximumSize = new System.Drawing.Size(459, 139);
|
||||
this.MinimumSize = new System.Drawing.Size(459, 139);
|
||||
this.Name = "UsernameForm";
|
||||
this.ShowIcon = false;
|
||||
this.Text = "USER.JSON";
|
||||
this.Load += new System.EventHandler(this.usernameForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
private System.Windows.Forms.Button button1;
|
||||
}
|
||||
}
|
||||
83
UsernameForm.cs
Normal file
83
UsernameForm.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class UsernameForm : Form
|
||||
{
|
||||
public UsernameForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
string defaultText;
|
||||
|
||||
private void usernameForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
defaultText = textBox1.Text;
|
||||
}
|
||||
|
||||
|
||||
private async void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (textBox1.Text == defaultText || textBox1.Text.Length == 0)
|
||||
{
|
||||
MessageBox.Show("Please enter your username first");
|
||||
return;
|
||||
}
|
||||
|
||||
Thread t1 = new Thread(() =>
|
||||
{
|
||||
createUserJson(textBox1.Text);
|
||||
|
||||
});
|
||||
t1.IsBackground = true;
|
||||
t1.Start();
|
||||
|
||||
while (t1.IsAlive)
|
||||
await Task.Delay(100);
|
||||
|
||||
Form1.notify("Done");
|
||||
|
||||
}
|
||||
|
||||
public static List<string> userJsons = new List<string>(new string[] { "user.json", "vrmoo.cn.json", "qq1091481055.json", "dollarvr.com.json" });
|
||||
|
||||
public static void createUserJson(string username)
|
||||
{
|
||||
ADB.RunAdbCommandToString($"shell settings put global username {username}");
|
||||
foreach (var jsonFileName in userJsons)
|
||||
{
|
||||
createUserJsonByName(username, jsonFileName);
|
||||
ADB.RunAdbCommandToString("push \"" + Environment.CurrentDirectory + $"\\{jsonFileName}\" " + " /sdcard/");
|
||||
File.Delete(jsonFileName);
|
||||
}
|
||||
|
||||
}
|
||||
public static void createUserJsonByName(string username, string jsonName)
|
||||
{
|
||||
switch (jsonName)
|
||||
{
|
||||
case "user.json":
|
||||
File.WriteAllText("user.json", "{\"username\":\"" + username + "\"}");
|
||||
break;
|
||||
case "vrmoo.cn.json":
|
||||
File.WriteAllText("vrmoo.cn.json", "{\"username\":\"" + username + "\"}");
|
||||
break;
|
||||
case "qq1091481055.json":
|
||||
File.WriteAllText("qq1091481055.json", "{\n \"username\":\"" + username + "\"\n }");
|
||||
break;
|
||||
case "dollarvr.com.json":
|
||||
File.WriteAllText("dollarvr.com.json", "{\n \"username\":\"" + username + "\"\n }");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
120
UsernameForm.resx
Normal file
120
UsernameForm.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
170
Utilities.cs
Normal file
170
Utilities.cs
Normal file
@@ -0,0 +1,170 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using JR.Utils.GUI.Forms;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
using System.Net.Http;
|
||||
using System.IO;
|
||||
using AndroidSideloader;
|
||||
|
||||
namespace Spoofer
|
||||
{
|
||||
class Utilities
|
||||
{
|
||||
public static string RandomPackageName()
|
||||
{
|
||||
return $"com.{Utilities.randomString(rand.Next(3, 8))}.{Utilities.randomString(rand.Next(3, 8))}";
|
||||
}
|
||||
|
||||
public static string CommandOutput = "";
|
||||
public static string CommandError = "";
|
||||
|
||||
public static void ExecuteCommand(string command)
|
||||
{
|
||||
var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
|
||||
processInfo.CreateNoWindow = true;
|
||||
processInfo.UseShellExecute = false;
|
||||
processInfo.RedirectStandardError = true;
|
||||
processInfo.RedirectStandardOutput = true;
|
||||
|
||||
var process = Process.Start(processInfo);
|
||||
|
||||
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
|
||||
CommandOutput += e.Data;
|
||||
process.BeginOutputReadLine();
|
||||
|
||||
process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
|
||||
CommandError += e.Data;
|
||||
process.BeginErrorReadLine();
|
||||
|
||||
process.WaitForExit();
|
||||
|
||||
Console.WriteLine("ExitCode: {0}", process.ExitCode);
|
||||
process.Close();
|
||||
}
|
||||
|
||||
public static void Melt()
|
||||
{
|
||||
Process.Start(new ProcessStartInfo()
|
||||
{
|
||||
Arguments = "/C choice /C Y /N /D Y /T 5 & Del \"" + Application.ExecutablePath + "\"",
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
CreateNoWindow = true,
|
||||
FileName = "cmd.exe"
|
||||
});
|
||||
}
|
||||
static Random rand = new Random();
|
||||
public static string randomString(int length)
|
||||
{
|
||||
string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
StringBuilder res = new StringBuilder();
|
||||
|
||||
int randomInteger = rand.Next(0, valid.Length);
|
||||
while (0 < length--)
|
||||
{
|
||||
res.Append(valid[randomInteger]);
|
||||
randomInteger = rand.Next(0, valid.Length);
|
||||
}
|
||||
return res.ToString();
|
||||
}
|
||||
public static string processError = string.Empty;
|
||||
public static string startProcess(string process, string path, string command)
|
||||
{
|
||||
Logger.Log($"Ran process {process} with command {command} in path {path}");
|
||||
Process cmd = new Process();
|
||||
cmd.StartInfo.FileName = "cmd.exe";
|
||||
cmd.StartInfo.RedirectStandardInput = true;
|
||||
cmd.StartInfo.RedirectStandardOutput = true;
|
||||
cmd.StartInfo.RedirectStandardError = true;
|
||||
cmd.StartInfo.WorkingDirectory = path;
|
||||
cmd.StartInfo.CreateNoWindow = true;
|
||||
cmd.StartInfo.UseShellExecute = false;
|
||||
cmd.Start();
|
||||
cmd.StandardInput.WriteLine(command);
|
||||
cmd.StandardInput.Flush();
|
||||
cmd.StandardInput.Close();
|
||||
cmd.WaitForExit();
|
||||
string error = cmd.StandardError.ReadToEnd();
|
||||
if (error.Length > 1)
|
||||
processError = error;
|
||||
var output = cmd.StandardOutput.ReadToEnd();
|
||||
Logger.Log($"Output: {output}");
|
||||
Logger.Log($"Error: {error}");
|
||||
return output;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class Zip
|
||||
{
|
||||
public static void ExtractFile(string sourceArchive, string destination)
|
||||
{
|
||||
if (!File.Exists(Environment.CurrentDirectory + "\\7z.exe"))
|
||||
{
|
||||
WebClient client = new WebClient();
|
||||
client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/7z.exe", "7z.exe");
|
||||
client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/7z.dll", "7z.dll");
|
||||
}
|
||||
ProcessStartInfo pro = new ProcessStartInfo();
|
||||
pro.WindowStyle = ProcessWindowStyle.Hidden;
|
||||
pro.FileName = "7z.exe";
|
||||
pro.Arguments = string.Format("x \"{0}\" -y -o\"{1}\"", sourceArchive, destination);
|
||||
Process x = Process.Start(pro);
|
||||
x.WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
class Updater
|
||||
{
|
||||
|
||||
public static string AppName { get; set; }
|
||||
public static string RawGitHubUrl { get; set; } //https://raw.githubusercontent.com/nerdunit/androidsideloader
|
||||
public static string GitHubUrl { get; set; }
|
||||
static readonly public string LocalVersion = "1.17";
|
||||
public static string currentVersion = string.Empty;
|
||||
public static string changelog = string.Empty;
|
||||
|
||||
private static bool IsUpdateAvailable()
|
||||
{
|
||||
HttpClient client = new HttpClient();
|
||||
try
|
||||
{
|
||||
currentVersion = client.GetStringAsync($"{RawGitHubUrl}/master/version").Result;
|
||||
currentVersion = currentVersion.Remove(currentVersion.Length - 1);
|
||||
changelog = client.GetStringAsync($"{RawGitHubUrl}/master/changelog.txt").Result;
|
||||
}
|
||||
catch { return false; }
|
||||
return LocalVersion != currentVersion;
|
||||
}
|
||||
public static void Update()
|
||||
{
|
||||
if (IsUpdateAvailable())
|
||||
doUpdate();
|
||||
}
|
||||
private static void doUpdate()
|
||||
{
|
||||
DialogResult dialogResult = FlexibleMessageBox.Show($"There is a new update you have version {LocalVersion}, do you want to update?\nCHANGELOG\n{changelog}", $"Version {currentVersion} is available", MessageBoxButtons.YesNo);
|
||||
if (dialogResult != DialogResult.Yes)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
using (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");
|
||||
}
|
||||
|
||||
Utilities.Melt();
|
||||
Logger.Log("Starting {AppName} v{currentVersion}.exe");
|
||||
Process.Start($"{AppName} v{currentVersion}.exe");
|
||||
}
|
||||
catch { }
|
||||
|
||||
Environment.Exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
486
changelog.txt
Normal file
486
changelog.txt
Normal file
@@ -0,0 +1,486 @@
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
v1.17
|
||||
Please manually update to this version, as it fixes automatic updates that were broken since 1.15
|
||||
|
||||
Changes
|
||||
+ Better game installation => no need for manual installation of games anymore
|
||||
+ Added theme changer back and updated it
|
||||
= Fixed updates
|
||||
= Updated quest options
|
||||
|
||||
Date 11/14/2020
|
||||
|
||||
VT: https://bit.ly/3lwztcn
|
||||
|
||||
MD5 Checksum: CC7BF16A3D687C21208E9E986D720CAE
|
||||
SHA-1 Checksum: CE0C71B4097068E84FA6FC65F4AFE69CBC79AA29
|
||||
SHA-256 Checksum: D9393C28376DDE1D0582BCF939D1414879EDE6772CE82F83F54C0EA0F239B2F0
|
||||
SHA-512 Checksum: 326C7A0177E9B8BCFA10CB3B8FAEA025F9C45C599DE5D46CA06DFEE427351F3AE88371C5A0827DEADF7D3F459052C421A145AA5581FE3C4BD2EFAD33BCFFC37B
|
||||
You can always get my public key from rookie.wtf/pgp.txt
|
||||
You can verify the signed message using kleopatra for windows or dark.fail/pgp
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEG9eYw4mQVDjvGf4lvrtJUNxETxMFAl+wFCUACgkQvrtJUNxE
|
||||
TxO0ThAAw6po24zaYQFa+aGrgQNuWYWRxirCkLekEgmy8XVL6Q0rgMeLeq2MrCBP
|
||||
wi2eBMFlLNOXy1TXOhled89NRBiBeST2Hl4TVv0Qdavd9cSeuGD/rh/PsyxnxY2Y
|
||||
RWCPeXiYOf0mN1zVylLas+2vk9o/lrNieJir1nMEvyVbUJs8lTDcBdo2vVFwHK9N
|
||||
nStFPxjqRb8R6smTIsltIh4+juQQMX0GyCcEMUkb5aO6BP34Mpsoaf+9bxV/elJm
|
||||
UXnFSh5pjzHhkYGKVePtoHev8aFOzLeqIrfyWRJl+7gBMgYIautaxAIE+Zsy3Sai
|
||||
wxUk9HJeAYwEPhYcIJKGAy+fmeX/TePQjUqLu1Pp+sJ8orstSiMjwXr84UtvyUWZ
|
||||
+gSTgsQJ1QNUlhp+eJ0D6CchkAwliUXgnpIzwyn1Jj54X3ecHNjMbc5SettlXcBG
|
||||
qgy5bUx8+v4H4gHmqTyZQNv1bsvIiQlcwPPUtpSzSXrzJPfZjrqPZzUWB8/Vltqc
|
||||
JIR8FxEqi7+mW6AqrhUjE74N/fFibJTEuv6RALwZIAfMYEuSeFlZlDJYZ9v3H4/X
|
||||
2jd+wEksbq6uYUl2l3X/7TpMWX29paj18cLD8oTSLK/RvzLXe0hhUcvuHrMxi+14
|
||||
Q+V7uZYGge4Z5PANGPhd2tSkvw4CyA25OQ868QXjqciSLTfK2SU=
|
||||
=Yu78
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
v1.16
|
||||
|
||||
Changes
|
||||
+ Speed Limiter for rclone
|
||||
= Random packagenames more random now
|
||||
= Bugfixes
|
||||
|
||||
Date 11/12/2020
|
||||
|
||||
VT: https://bit.ly/2K4Y5Lv
|
||||
|
||||
MD5 Checksum: 29978E435BF02865CE61EF6279FB42ED
|
||||
SHA-1 Checksum: 2E47CFDE7549D088A102F021657E9CD6859EAC47
|
||||
SHA-256 Checksum: 50057AC0DA315C492C9C45B5801AE99E65B812F5BC18E23622CCAF5FBC48760A
|
||||
SHA-512 Checksum: E485ADB6088C1F7DC34B65B57A9077E876D3D576D48CCED1FCA691A113CA5F6D0F8A0D31C6C848B6719FF18B7D4C5F829B9DAA8789EA6087F8B1D41005F87A48
|
||||
|
||||
You can always get my public key from rookie.wtf/pgp.txt
|
||||
You can verify the signed message using kleopatra for windows or dark.fail/pgp
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEG9eYw4mQVDjvGf4lvrtJUNxETxMFAl+tHY0ACgkQvrtJUNxE
|
||||
TxOpjRAAmjaIfvIP+HvfTMGKOEGoVRDIBqEyi8tzq8hn5Z3OadBVLkWT23WblQBw
|
||||
Ur6BN1fuhH5B8ToGoqX/C1lrgXsvHNDB8frGUWnO1G1KJAQEGwKPRdKyK7YPlrYm
|
||||
kK74CYuM8w7qjkhX3f50ECZ4Kj1WsE92mIHjfB1xLSGzN0o7Tr1EvFFDnuXrJ0I0
|
||||
vEbeto0Qo19ORcoP7KFPgGuYmMYJQ2MuwYmWDWAdm4iL1Y9vEKZ4TsHG+KmYPdo8
|
||||
19YoZj8PsgYxCBy9B+UZfkJnfF7gYKmiAsgnQviDc4BvZccfAVjmWcKkzJueDkvr
|
||||
GgFmbaFE48svC2NU8Qd2gq6gIX0JrnKACZqopqgorl1817Z7Rsdh2iVwTMOvxbe7
|
||||
a4kAtDN90KwuRlnwoxeCBdESDSrANbiNi1yaDZc5hr/xOxUsa1JKhk7/8mcdHj78
|
||||
QoCRoji60Cq8XYeRNDXI32TkZd7ql9c64AjGH1uSySIPXfehOa+m5S53Jo2dRh5p
|
||||
iI1LGHjTk7EDekIVRh/cPC+hohfUAKYbUcXp15cx0HndW5+galYIH/RAjF0L+Q1U
|
||||
THz36HpKvLSsgkVkeVjPNJn9Ow6xgyByLTkHrS9D7Kj78FrKiAKr08+aI3+WCpdq
|
||||
1G9HcH5VzDeZ7/jfVQPhsAn3dPxlTt6ReYzbeFkrO1UHFcTdl58=
|
||||
=KyH4
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
v1.15HF1
|
||||
|
||||
Changes
|
||||
= Bugfixes
|
||||
|
||||
Date 11/06/2020
|
||||
|
||||
VT: https://bit.ly/2GDYWRU
|
||||
|
||||
MD5 Checksum: F0D51FEC94F8D266390E61E89E6A2EE0
|
||||
SHA-1 Checksum: 4FB43CFA6021B8360A23858169FAF15468B68EDF
|
||||
SHA-256 Checksum: CBE414D9A283871099057EE5D8E56AF408996AE9C996C31F92C4DAE16D48B024
|
||||
SHA-512 Checksum: F16A6B29ECABBB16D25B7F7FC52CB15AE4930B2B17ABAC791BF1F331270F40B047094FDEAF1EF834E72E26AA3A6762AF8BE13EBCB735EB1C1009F884E338D9DE
|
||||
|
||||
You can always get my public key from rookie.wtf/pgp.txt
|
||||
You can verify the signed message using kleopatra for windows or dark.fail/pgp
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEG9eYw4mQVDjvGf4lvrtJUNxETxMFAl+lfEkACgkQvrtJUNxE
|
||||
TxMDDxAAg+90vrCn0PllPEezzX3AJpy7NFWhFjUlDOLzNFMPa/QdAfF6H5vhEGay
|
||||
bhX2BDHKSIV86bLkyGPkGHuf3etpXvZsNAmPuDoZpZ4owd1O09DOvAHIJx8F1Eia
|
||||
Jc9Zovz6lKLAeIbK9ZdChKwTG3hYLIkx3rMgtvnJkZfzUKbhdU9MP0rVEzDPkSfe
|
||||
ay2CGA9xLBUhPcItUTxhANzrDpRXMGHqbi+Wrscp+KmvnjHzN3Haq2A9rsasXM5Z
|
||||
RSG8ccLZiI496tJQquTvPXYcnWQQudzcf3yiicztein0xcISEat0FFIVao7TtnS4
|
||||
cgitvGNtfXXauAxyzjZ7PdgrVuoAE/v4m25pzaTRy7TOfW1uTz2/6lr6tZa38+p9
|
||||
Bs36KcoK64FcPWjfR7zvvmCUWT/aHlRC9FwMvBHB81WRRk6xGaKl8G2QxfKY/ATl
|
||||
DNlgYXfXLzipam74XfPHiyK4Sc55WLDQxZfZfD6tqTo4u8qoDESvcEz+pbGe4Wp8
|
||||
awY4FVeSP1jVQzHgWf+oMTiHm5Gb3qMLUhZ/AHidUWFLhzXmAA4YXxIHKidRjCYT
|
||||
42Kzs1sjT2A5ll2V7jz4pqoRlsvRAxNZ5KgAZ2R01zo7gS1nGqjyoGq3tLWHbfJk
|
||||
/kD4QlOwcv06Jvp8aHcPxpccB7KHZGoRT2PB6IQE9Gt72pmAU9c=
|
||||
=f7yh
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
v1.15
|
||||
|
||||
Changes
|
||||
+ Added a spoofer
|
||||
+ Added option to auto spoof games with random package name
|
||||
+ Added new username support for quest 2
|
||||
= Updated drag and drop sideloading
|
||||
= Fixed storage label
|
||||
- Removed troubleshoot form and theme form
|
||||
|
||||
Date 11/04/2020
|
||||
|
||||
VT: https://bit.ly/3kYCQsb
|
||||
|
||||
MD5 Checksum: 39BAB4CEE3D0E387E770BA35F4488C2F
|
||||
SHA-1 Checksum: C6F311411408BCF5A55034E7A926EA385819F348
|
||||
SHA-256 Checksum: 64640374EF39DD9CFC4A613A49888E3194994AA934C5E952174A2FCF533E2D19
|
||||
SHA-512 Checksum: 22769280B732821539100BFA77C67141F271DB401DB3AFB28EF285E352659F9F45A90C8ABE1C0B829770C5AE580CA76A9208505888443C22EE82AAAE7035C6F7
|
||||
|
||||
You can always get my public key from rookie.wtf/pgp.txt
|
||||
You can verify the signed message using kleopatra for windows or dark.fail/pgp
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEG9eYw4mQVDjvGf4lvrtJUNxETxMFAl+jJScACgkQvrtJUNxE
|
||||
TxMTag//f570tZ4zxL1x1rdajdoYzPD6oaGIabRVPrqVogsFPuVF1Q3AOzr+nzQN
|
||||
Tiq7yRPmByu/dtBGby2mqL1acQ/9TLYDtmnOAxQJqj4h0KhYlnzdCfqJJbTghtZX
|
||||
cy44ZqgPW47P608+zC/NfePNt7Fq1rFKN3Bpo/ISoyi5/IVGqGq1Ix/D0SlhiM5X
|
||||
5VkiY+w5S0rXuAyQ4g6/03AiI9fdNVkREhUh/tYvb7IkxaN9IDlltHByeuvekMjZ
|
||||
KU+mwZ9habfthB31hp+bAXz82tbIzB4LJ1P8MNadIT8ZXG19zHEY/KlaDp2NjniV
|
||||
h+V9AnxPHlcZk63yVPOywxpZcv81LflMgs9XItX+zKH7ibniBEu8jxc/2uAjrDF/
|
||||
JuvnOUKTuH7S2iIzHhKLYZYHiOu8sIuwGC96Ep172PGCAkVVR6CtfNPMmVZRllsY
|
||||
JG3Pxdrw526SAy3Vqixbbm79Fs1o77resqGM2zl6L7Sr6sH3VnDxabVXxALgo1pH
|
||||
+LSu5rCLIIsCP1a4MAyy6UgO/+ZLrC1QazR4yY7SRQHAIM48XG4d6CznFCOjczhW
|
||||
VvYL6gZD7X4xlNBqNMtih8JDHIQ1y7n1f075oCxfWwt02kXhDL/cn8+UZ17IS6EZ
|
||||
zr/SLm1464/htCZgsUZgQrov6CpHX/xNqAubowkAVOdDREbwh2w=
|
||||
=QKlt
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
v1.14SU1
|
||||
|
||||
Changes
|
||||
+ Quota errors now will try to redownload the game from another mirror
|
||||
= Only showing mirror remotes for apps
|
||||
// Will fix device storage when I get my quest 2 and can debug adb
|
||||
|
||||
Date 10/18/2020
|
||||
|
||||
VT: https://bit.ly/3kcG62A
|
||||
|
||||
MD5 Checksum: 2A30E5F3DB785DC8104A2AA55A83CF53
|
||||
SHA-1 Checksum: 8376E5971FC4F60995A1125DD9344E52135DB4F7
|
||||
SHA-256 Checksum: FD5C74067BA00561A540DE5A4F49FA63B99C9520435A51487F997AEC569E9659
|
||||
SHA-512 Checksum: 6188D6306CA2A3F25DE08E19D1F20046774F7AA30BD745ED24FC7E53126DF3950211B599E3D774F540A6C1DEC177A895FAE70FB564B6AE96F5F10ABDCB9021C1
|
||||
|
||||
You can always get my public key from rookie.wtf/pgp.txt
|
||||
You can verify the signed message using kleopatra for windows or dark.fail/pgp
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEG9eYw4mQVDjvGf4lvrtJUNxETxMFAl+MCbMACgkQvrtJUNxE
|
||||
TxNMVxAAlIkoTuGTDwXRBFNanulPiYmus9UazHoVFxtG2BELk1/JLPm7dwT29FiZ
|
||||
oacUhhxLAEfDm169FoPNFCH/6q74xqjACkm8FjwCoas53DekguIvrhJKA3SiBUtZ
|
||||
m7+hrT3WWGxXoE3+avSFmdBWWvKVA9pNR/DHprHSoinDUvgSfwBHrWD8PtuSIlwU
|
||||
/jNpzyDnmBfdT4LROq93hcfFXM+POLWs5f3rXFdT+zTZexxlRiG5h7yMmsYdwdov
|
||||
4jMUSzrBpRXbmmHwDi4KLzsdOJ/5okJgRdPTZm/L1rAoJT0F7QVi2shvkoN7SIH/
|
||||
Fg+k0ZrNOnlpdAJwLmJD4PkQmxv5zpGSh8w7nbQJ41HgBtTQTh3OCpRRamPzAmfo
|
||||
A2n/NsYpR8J8u7kGzT1MUnUn2RL+igutSrnQl8R6yR8jFjaTt+F90pBXZ1nnY6mS
|
||||
8YE9mBBK3365cYVqQzOW1TUSCSzQqwTbfKDHkKrzHQWrpQ8VNMLcJBLZwU8di+4p
|
||||
u8lt1uT5MRZ+9I80YBXhwzBKkiNYOt5vHpGgt0Ib4WDS7rt/7UnzEAfl8P3VEEfX
|
||||
6w1HctI2zAVWYutBMv6HL3v23cO+UT8H6Wdgxq36mlMSNiqjLIntfIRrySUOy7JV
|
||||
D6LE34gzpDGsBIzrpW/Hlz4wGTi6nnY0Ke6DkA1H0UOoDN9ItI4=
|
||||
=ARa/
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
v1.14
|
||||
|
||||
Changes
|
||||
+ Added the ability to change remotes (mirrors)
|
||||
+ Rclone errors are now reported properly
|
||||
= Fixed some bugs
|
||||
// Will fix device storage when I get my quest 2 and can debug adb
|
||||
|
||||
Date 10/17/2020
|
||||
|
||||
VT: https://bit.ly/3j8kCm8
|
||||
|
||||
MD5 Checksum: B862B807462CE35CC930C2B1118D5692
|
||||
SHA-1 Checksum: F52C8630C89CAEDB2E90A857E494DE00B137712D
|
||||
SHA-256 Checksum: 3DDFA2B4CCFC0E9F6F86E8A74E6D3511B9C643F4C4AF19D3878B8704FA360558
|
||||
SHA-512 Checksum: 16A022D8A4D235D7C537D9F01FE7C5F964A67A3A8CD68B3DC17AF08D94837DAC6CE0C20557D029DC169E5616B36C2A4C36B1647CE0DF930C7694F3FEC3430E70
|
||||
|
||||
You can always get my public key from rookie.wtf/pgp.txt
|
||||
You can verify the signed message using kleopatra for windows or dark.fail/pgp
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEG9eYw4mQVDjvGf4lvrtJUNxETxMFAl+KrhQACgkQvrtJUNxE
|
||||
TxP9MRAAjZbYWkbZPK+QMqzNqsgEARs6buzrwc24dth6QEod9Fgmdg5wdinZdG8X
|
||||
MK467pd9u0JqM3u8DeKSUD0GEzJZStNKsbHfjvNAF3m8toaXLncWy7MYNN9loAra
|
||||
17MvUBBwB1QgsXtQ3EXT1cBbS3YkQPg5E+ayvY9ZgyiOpDK6fs1tA24NZUWc53kY
|
||||
TIl5IL3mZNfJck8Xc/QkZJmkBOA89oDToLOjNmZRXXEHNT/eTS6pEkMZonWQjGqF
|
||||
D2dEfQTOuIAD93JzwcP5wVJFh7z6o65/7tfguDqBsTgoRWODaY+kQJDAxoWN9w/n
|
||||
nagXg/y30EmE1mWQFUYa1n0V65OzT5+J8VF53DCHkgaejYLfi0lhy8TlWQZpmzen
|
||||
WJOsP1Oj3ZZ9sErO8waajDBzDZ3kU9NvAOeOblE491w0713MYZYs5BVgoyHi24xO
|
||||
obcp1gpLi326fkPqajgIFpDHJ014OnaXmoY9ynW9rlZJ4rwJ7WytRDzcpfyk9LV1
|
||||
G1tlcCS4c/RmuVfZi4Jh0guvOOIpJSqdG4KUtvd548sslTMdHytt+YugbKqcBAto
|
||||
nWroKcsmg0swAm7YgYmQXqcpM17JC21eUgm3Bc4ZZSDtP4g3Pm7vRO1+hwUNYBE9
|
||||
QeEMXYDPRsTxdpuEFsbmS/EfnndvJvl9BL92Zt4+T4ruL+II50s=
|
||||
=r+0B
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
New version v1.13 Released
|
||||
|
||||
Changes
|
||||
+ Pgp messages will be available now for every update, so you can verify updates easily
|
||||
= Fixed some bugs like the rclone suicide
|
||||
- Removed china detection
|
||||
|
||||
Date 9/10/2020
|
||||
|
||||
MD5 Checksum: 3834485C5AF611523460E639969284F3
|
||||
SHA-1 Checksum: DAF556D34F80FDE6A6A3D8F338381030B2B19E44
|
||||
SHA-256 Checksum: 063FABA6A76A98AB862BBBF6F3348F176F66FD4932075E761A5FCAA85785EE4B
|
||||
SHA-512 Checksum: CC743BD95826664535239BB665934E88A25CC948B95E4A3E8B34379C1E8DEB8FED05EAD87428F4B85D5841ED9101F38E4E3DAFB0EAF3CD2F2E4314B62356104D
|
||||
|
||||
You can always get my public key from rookie.wtf/pgp.txt
|
||||
You can verify the signed message using kleopatra for windows or dark.fail/pgp
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEG9eYw4mQVDjvGf4lvrtJUNxETxMFAl9aBpMACgkQvrtJUNxE
|
||||
TxOJcA/+LEzXQtyBhZ0oj22PEk0yMLQYOBLYDB96jf39IqLQAzrIUL339jRcRKMv
|
||||
yhFWXpvND1wrQl3/LNtFpBSkSnvqUXtxHWg6US+Ov3nnrEvYiwK8D9f1eC5Mt3Wy
|
||||
4HZIyTh9HcrLsfbnP2kDlLOaMQSIH4rChezF79xZMcx7kRmQ0/hyXlmGAPyWs8t8
|
||||
5aLxk5YUcfq1Pu+ncqeX+ihYVzQHi2eXaOAIR1rSCEXfHEg9tkRzWcma8tY29gQv
|
||||
IgGwxF/YnAPOdBtzuakaT88a1MsP+tAcWxmsyvTQHrv1m0h3QPU1DxMFUfAlBjLM
|
||||
5tHgTTjkXedRpR+Kga5CDuK7L5p1zVMRDINcUOf9MXV2fRurZ+OIHefAd+zbrd0n
|
||||
vHi1D1sFzb/lT5LCa/vrfO9crRnLdK1EI/5HNeSj9iIdD2jEMbjSjo9yv7LA2MHi
|
||||
4wnvguRpK5YUGqGc2yyCRxtyKAgXXxLBFNb5K453vdLtDukZIkhLuQVchsk4PutZ
|
||||
1uIg7/ZmAIPxlEHaLckaV7QEFbq9h2hFWOsSjWAATyvnkp4nxyvAavW4zNQCbd3V
|
||||
XJhimZkE+3SNAuZGw10nikVz7DFMlI0dyL+jmwIuODcFMZZwkEtBr3J/Ad9V1k+G
|
||||
DFKYJpBgATHdRTwt7/zZwJCBq0ONheA/6+6VYj8x8Q5rqbiDDdc=
|
||||
=xp7X
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
|
||||
MUST UPDATE 1.12
|
||||
READ THIS -> https://pastebin.com/raw/K7eJe3F9
|
||||
|
||||
1.11HF1
|
||||
= Fixed some crashes that occured when a unauthorized device was used with the sideloader
|
||||
|
||||
1.11
|
||||
+ Added support for multiple devices
|
||||
|
||||
1.10SU1
|
||||
+ Settings should now persist through updates
|
||||
- Removed download button and hwid stuff
|
||||
|
||||
1.10
|
||||
+ Added back the game size messagebox
|
||||
+ Added support for unicode in adb
|
||||
= Fixed restore gamedata
|
||||
= Clicking the first game won't remove it since it causes problems
|
||||
= Changed the sideloader icon
|
||||
|
||||
1.9SU2
|
||||
+ Clicking a game on the listbox will now remove it from the list
|
||||
|
||||
1.9SU1
|
||||
- Removed some code I forgot to remove when debugging
|
||||
|
||||
1.9
|
||||
+ Added a queue for downloading games
|
||||
+ Added a setting for disabling user.json push
|
||||
|
||||
1.8SU2
|
||||
= Install game now won't throw an exception when a game isn't selected
|
||||
|
||||
1.8SU1
|
||||
+ Added debug logs for rclone
|
||||
|
||||
1.8
|
||||
+ Disk info updates every command that changes disk space
|
||||
= Rclone now logs commands and output
|
||||
= Changed backup button
|
||||
|
||||
1.7.5
|
||||
+ Made sideloader even faster when opening
|
||||
+ Added some chiptune music and the setting to stop it
|
||||
= Fixed donator button broken in 1.7
|
||||
|
||||
1.7
|
||||
+ Removed some freezes
|
||||
+ Sideloader kills rclone on start and on close if it's open so you dont waste bandwith
|
||||
+ Updating rclone config now does a hash check first
|
||||
+ Refresh storage after game install and on game uninstall
|
||||
|
||||
1.6
|
||||
+ Disk space label and check
|
||||
+ Checks game size before download
|
||||
= Download and install game button outputs adb log now
|
||||
- Launch package name button and textbox
|
||||
|
||||
1.5
|
||||
+ Added ETA, based on CURRENT DOWNLOAD SPEED NOT DELTA OF IT
|
||||
+ Added DLS label instead of showing it in the toolbar
|
||||
+ Added more indication of what the software is doing, in the toolbar
|
||||
+ Added some tooltips
|
||||
|
||||
1.4
|
||||
+ Donators can now change the speed of the donate button color change (even disable)
|
||||
+ Auto update for the rclone config
|
||||
+ Theme export and import buttons (by gotard)
|
||||
|
||||
1.3
|
||||
+ Added progress bar logic for game downloading with rclone
|
||||
+ Uninstalling apps now asks the user if it should also remove game data
|
||||
= Sorted installed apps combobox
|
||||
= Fixed uninstalling apps by package names lol nobody knew was broken
|
||||
|
||||
1.2
|
||||
+ Added unicode support for rclone
|
||||
+ Added some delay on game installation
|
||||
= Fixed stuff
|
||||
|
||||
1.1
|
||||
+ Added Themes
|
||||
+ Added dollarvr user.json
|
||||
+ Added user.json transfer on game download
|
||||
+ Added user.json transfer on first run
|
||||
= Fixed tab indexes
|
||||
= Now both drop downs can be visible at the same time
|
||||
|
||||
1.0HF1
|
||||
= Fixed a problem when deleting an app
|
||||
|
||||
1.0
|
||||
+ Added games auto download
|
||||
+ Added auto troubleshoot
|
||||
+ Every app installed will have all perms granted
|
||||
+ Displays apps for games instead of package names if you have rclone set up
|
||||
+ Uninstall app now will also delete its obb folder
|
||||
//For auto download you need an rclone config and rclone to be set up correctly, VRP:Quest Games
|
||||
|
||||
0.15HF1
|
||||
+ Added list apps button back
|
||||
= Fixed Uninstall apk and get apk
|
||||
|
||||
0.15
|
||||
= MASSIVE UI REDESIGN
|
||||
+ Added toggle for tor/clearnet
|
||||
+ Added download games through tor but still waiting for someone to help me host the files
|
||||
+ Added download with progress
|
||||
= Changed adb sideload command to allow downgrades too
|
||||
- Removed perms stuff, was too buggy
|
||||
|
||||
0.14HF1
|
||||
+ Added donate button
|
||||
= Fixed ui order
|
||||
- Removed warning from bulk obb sideload button
|
||||
|
||||
0.14
|
||||
+ Check file hash button
|
||||
+ Added first run check (will maybe be used to create user.json files)
|
||||
+ Added drag and drop for apk and obb files
|
||||
+ Progress bar now works for every adb command
|
||||
= Moved buttons
|
||||
- Instructions button
|
||||
- Removed run custom adb command button and form
|
||||
|
||||
0.13
|
||||
+ Added vrmoo.cn.json
|
||||
+ Added bulk obb copy
|
||||
= Message Box now top most
|
||||
|
||||
0.12
|
||||
+ Added settings form
|
||||
+ Added progress bar (again)
|
||||
+ Added a new user.json
|
||||
= Fixed crash on some systems (PerformanceCounter)
|
||||
= Fixed crash because of file name inconsistency
|
||||
- Removed performance counters because they made the software not work for some people
|
||||
|
||||
0.11
|
||||
+ Changed normal message boxes to flexible ones
|
||||
+ Added changelog to update message
|
||||
= Improved update message
|
||||
- Removed progressbar
|
||||
|
||||
0.10
|
||||
+ Added few tooltips
|
||||
+ Sideload folder now works for all apks (recursive search)
|
||||
= Obb copy and Sideload progress bar problems should be fixed
|
||||
= Fixed user.json not working if the any of folder had spaces
|
||||
= Switched back to Message Boxes
|
||||
|
||||
0.9
|
||||
+ Added the buggy progress bar back, uses different "logic"
|
||||
+ Added an icon (Increased the exe size by like 300% just with that)
|
||||
+ Added sideload folder button
|
||||
+ Added Creat user.json button and form
|
||||
+ Changed Message Boxes to notifications
|
||||
|
||||
0.8.5
|
||||
+ Added auto update download
|
||||
= Fixed a bug where if you didn't have the adb folder it would crash
|
||||
|
||||
0.8
|
||||
+ Every command now shows progress on title bar
|
||||
+ Automatically run Adb Devices and List Apps on form startup
|
||||
+ You can now search the App List Combo Box
|
||||
= Cleaned some code
|
||||
|
||||
0.7
|
||||
= Fixed UI Freezes
|
||||
+ Added Uninstall APK Button
|
||||
+ Added Launch package Button
|
||||
- Removed loading bar
|
||||
|
||||
0.6
|
||||
+ Added List Apk Perms button
|
||||
+ Added Change Permissions button
|
||||
+ Added dinamically added checkbox for permisssions
|
||||
= The software now downloads adb from master instead of v0.3 release
|
||||
|
||||
0.5
|
||||
- Removed Flash Firmware
|
||||
= Redesigned UI
|
||||
= Reworked RunAdbCommand function (now it will be possible to do stuff I wasnt able to do before)
|
||||
= Replaced Ui Buttons, still needs work
|
||||
+ Added List apk button
|
||||
+ Added List apk combo box
|
||||
+ Added get apk function
|
||||
= Cleaned a bit of code
|
||||
|
||||
0.4
|
||||
+ Added auto download of adb archive
|
||||
+ Added auto extraction of adb archive
|
||||
|
||||
0.3
|
||||
+ Added new form, you can run custom adb commands now
|
||||
+ Added recover and backup app data
|
||||
- Removed Select APK and Select OBB Buttons
|
||||
- Removed tooltips from removed buttons
|
||||
+ Sideload APK and Copy Obb buttons now also make you select the file/folder
|
||||
+ Improved firmware button
|
||||
|
||||
0.2
|
||||
+ Added Flash Firmware button
|
||||
+ Added few tooltips
|
||||
+ Renamed buttons
|
||||
|
||||
0.1
|
||||
+ Initial Release
|
||||
|
||||
HF - Hot Fix
|
||||
SU - Small Update
|
||||
85
customAdbCommandForm.Designer.cs
generated
85
customAdbCommandForm.Designer.cs
generated
@@ -1,85 +0,0 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class customAdbCommandForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
|
||||
this.runcustomadbcmdbutton = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.Location = new System.Drawing.Point(13, 13);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Size = new System.Drawing.Size(775, 20);
|
||||
this.textBox1.TabIndex = 0;
|
||||
this.textBox1.Text = "Enter your command here";
|
||||
//
|
||||
// richTextBox1
|
||||
//
|
||||
this.richTextBox1.Location = new System.Drawing.Point(13, 39);
|
||||
this.richTextBox1.Name = "richTextBox1";
|
||||
this.richTextBox1.Size = new System.Drawing.Size(775, 365);
|
||||
this.richTextBox1.TabIndex = 1;
|
||||
this.richTextBox1.Text = "";
|
||||
this.richTextBox1.TextChanged += new System.EventHandler(this.richTextBox1_TextChanged);
|
||||
//
|
||||
// runcustomadbcmdbutton
|
||||
//
|
||||
this.runcustomadbcmdbutton.Location = new System.Drawing.Point(13, 410);
|
||||
this.runcustomadbcmdbutton.Name = "runcustomadbcmdbutton";
|
||||
this.runcustomadbcmdbutton.Size = new System.Drawing.Size(93, 28);
|
||||
this.runcustomadbcmdbutton.TabIndex = 2;
|
||||
this.runcustomadbcmdbutton.Text = "Run";
|
||||
this.runcustomadbcmdbutton.UseVisualStyleBackColor = true;
|
||||
this.runcustomadbcmdbutton.Click += new System.EventHandler(this.runcustomadbcmdbutton_Click);
|
||||
//
|
||||
// customAdbCommandForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(800, 450);
|
||||
this.Controls.Add(this.runcustomadbcmdbutton);
|
||||
this.Controls.Add(this.richTextBox1);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.Name = "customAdbCommandForm";
|
||||
this.Text = "customAdbCommandForm";
|
||||
this.Load += new System.EventHandler(this.customAdbCommandForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
private System.Windows.Forms.RichTextBox richTextBox1;
|
||||
private System.Windows.Forms.Button runcustomadbcmdbutton;
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
using System.Net.Http;
|
||||
using System.Reflection;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class customAdbCommandForm : Form
|
||||
{
|
||||
public customAdbCommandForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
string output;
|
||||
|
||||
private void runcustomadbcmdbutton_Click(object sender, EventArgs e)
|
||||
{
|
||||
var command = textBox1.Text;
|
||||
if (command.StartsWith("adb "))
|
||||
command = command.Remove(0, 4);
|
||||
runAdbCommand(command);
|
||||
}
|
||||
|
||||
public void runAdbCommand(string command)
|
||||
{
|
||||
Process cmd = new Process();
|
||||
cmd.StartInfo.FileName = Environment.CurrentDirectory + "\\adb\\adb.exe";
|
||||
cmd.StartInfo.Arguments = command;
|
||||
cmd.StartInfo.RedirectStandardInput = true;
|
||||
cmd.StartInfo.RedirectStandardOutput = true;
|
||||
cmd.StartInfo.CreateNoWindow = true;
|
||||
cmd.StartInfo.UseShellExecute = false;
|
||||
cmd.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\adb\\";
|
||||
cmd.Start();
|
||||
cmd.StandardInput.WriteLine(command);
|
||||
cmd.StandardInput.Flush();
|
||||
cmd.StandardInput.Close();
|
||||
output = cmd.StandardOutput.ReadToEnd();
|
||||
cmd.WaitForExit();
|
||||
|
||||
StreamWriter sw = File.AppendText("debugC.log");
|
||||
sw.Write("Action name = " + command + '\n');
|
||||
sw.Write(output);
|
||||
sw.Write("\n--------------------------------------------------------------------\n");
|
||||
sw.Flush();
|
||||
sw.Close();
|
||||
|
||||
richTextBox1.Text = output;
|
||||
}
|
||||
|
||||
private void customAdbCommandForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void richTextBox1_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
63
documentation.txt
Normal file
63
documentation.txt
Normal file
@@ -0,0 +1,63 @@
|
||||
Main Form
|
||||
=========
|
||||
- Adb Devices Button
|
||||
Notifies the user every device returned by adb
|
||||
Changes Form1 Titlebar to "Rookie Sideloader | Device Connected with ID | {DEVICEID}"
|
||||
- Sideload Drop Button
|
||||
Shows/Hides the rest of sideload buttons
|
||||
- Copy Obb Button
|
||||
Opens a new folder select dialog where the user selects an folder, that folder will be copied to Android/Obb
|
||||
- Copy Bulk Obb Button
|
||||
Opens a new folder select dialog where the user selects an folder, that folder will be searched and every obb folder will be copied to Android/Obb
|
||||
- Get Apk Button
|
||||
After the user selects an package from m_combo (first combobox) the apk will be pulled to the current directory
|
||||
- Uninstall App Button
|
||||
After the user selects an package from m_combo (first combobox) and he accepts the warning given, the apk selected will be uninstalled from the device
|
||||
- Sideload Folder Button
|
||||
Opens a new folder select dialog where the user selects an folder, that folder will be searched and every apk from it will be sideloaded
|
||||
- Sideload Apk Button
|
||||
Opens a new file select dialog where the user selects a file, that file will be sideloaded
|
||||
- Refresh Apk List Button
|
||||
Refreshes the apks/packages listed in m_combo
|
||||
- Backup Drop Button
|
||||
Shows/Hides the rest of backup buttons
|
||||
- Backup Gamedata Button
|
||||
Saves every folder from Android/data to a folder in the current directory
|
||||
- Restore Gamedata Button
|
||||
Pushes every folder form current dirctory/data to Android/data
|
||||
- User.Json button
|
||||
Opens a new UsernameForm
|
||||
- Sideload Apk Button
|
||||
Opens a new file select dialog where the user selects a file, that file's sha256 hash will be copied to clipboard and the user will be notified
|
||||
- Troublshoot Button
|
||||
Opens a new TroubleshootForm
|
||||
- Settings Button
|
||||
Opens a new SettingsForm
|
||||
- About Button
|
||||
Shows the credits
|
||||
- Donate Button
|
||||
Sets clipboard text to rookie's steam inventory trade link and sends the user a message
|
||||
Settings Form
|
||||
=============
|
||||
- Check for Updates checkbox
|
||||
If enabled the software checks for updates every startup (default:enabled)
|
||||
- Enable Message Boxes on task completed checkbox
|
||||
If enabled the software will notify the user on every completed task via a Flexible MessageBox (default:enabled)
|
||||
- Copy message to clipboard checkbox
|
||||
If enabled the software copy every message called by the notify function to clipboard (default:disabled)
|
||||
- Delete games after download and install checkbox
|
||||
If enabled the software will delete every file downloaded by the Download and Install Game Button
|
||||
- Json TextBox
|
||||
Here should be the link to custom games json
|
||||
- Reset Settings Button
|
||||
Restores settings to default values, you still need to press apply
|
||||
- Apply Button
|
||||
Applies settings
|
||||
Troubleshoot Form
|
||||
=================
|
||||
- Ask the software button
|
||||
Depending on the input from the textbox, the software might respond with a good answer, still WIP
|
||||
User.Json Form
|
||||
==============
|
||||
- Creat User.Json
|
||||
Creates all 3 user.json (at the moment) with the username from the textbox then pushes them to the root folder on the quest
|
||||
12
donators.txt
Normal file
12
donators.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
CC0E0834BFEBFBFF000906E9;5000;ROOKIE.LOL
|
||||
184204E0178BFBFF00870F10;0;Flow
|
||||
E5148390BFEBFBFF000906EA;250;Gotard
|
||||
5ECC5497178BFBFF00870F10;1024;Saidis21
|
||||
B0374BE2BFEBFBFF00040651;0;ecirbaf
|
||||
926C60A8178BFBFF00800F82;250;ThePhantomPickaxe
|
||||
2A8C5999BFEBFBFF0001067A;0;karl
|
||||
80ACB80FBFEBFBFF000206C2;4096;JJ-4
|
||||
9AA172C9BFEBFBFF000906ED;1024;Clayton Bigsby
|
||||
645C9EADBFEBFBFF000906EA;5000;Heracide
|
||||
1C51D0CD178BFBFF00870F10;0;Mr.Tibby
|
||||
287B5C6CBFEBFBFF000906EA;0;videobeer
|
||||
@@ -2,4 +2,9 @@
|
||||
<packages>
|
||||
<package id="Costura.Fody" version="4.1.0" targetFramework="net452" />
|
||||
<package id="Fody" version="6.0.0" targetFramework="net452" developmentDependency="true" />
|
||||
<package id="MetroFramework" version="1.2.0.3" targetFramework="net452" />
|
||||
<package id="MetroFramework.Design" version="1.2.0.3" targetFramework="net452" />
|
||||
<package id="MetroFramework.Fonts" version="1.2.0.3" targetFramework="net452" />
|
||||
<package id="MetroFramework.RunTime" version="1.2.0.3" targetFramework="net452" />
|
||||
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net452" />
|
||||
</packages>
|
||||
25
packages/MetroFramework.1.2.0.3/Content/MetroFramework.txt
vendored
Normal file
25
packages/MetroFramework.1.2.0.3/Content/MetroFramework.txt
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
MetroFramework - Modern UI for WinForms
|
||||
|
||||
Copyright (c) 2013 Jens Thiel, http://thielj.github.io/MetroFramework
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
Portions of this software are:
|
||||
|
||||
Copyright (c) 2011 Sven Walter, http://github.com/viperneo
|
||||
BIN
packages/MetroFramework.1.2.0.3/MetroFramework.1.2.0.3.nupkg
vendored
Normal file
BIN
packages/MetroFramework.1.2.0.3/MetroFramework.1.2.0.3.nupkg
vendored
Normal file
Binary file not shown.
10
packages/MetroFramework.1.2.0.3/README.TXT
vendored
Normal file
10
packages/MetroFramework.1.2.0.3/README.TXT
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
|
||||
NOTE:
|
||||
|
||||
To make use of designers, you must reference both MetroFramework.dll and MetroFramework.Design.dll
|
||||
from your project. I recommend to change the properties for the Design dll to "Copy local: false"
|
||||
as you do not need to redistribute it. This also helps to make your application independent of
|
||||
System.Design.dll and compatible with the .NET client profile, a subset of the full .NET framework.
|
||||
|
||||
Project Site: http://thielj.github.io/MetroFramework
|
||||
BIN
packages/MetroFramework.Design.1.2.0.3/MetroFramework.Design.1.2.0.3.nupkg
vendored
Normal file
BIN
packages/MetroFramework.Design.1.2.0.3/MetroFramework.Design.1.2.0.3.nupkg
vendored
Normal file
Binary file not shown.
10
packages/MetroFramework.Design.1.2.0.3/README.TXT
vendored
Normal file
10
packages/MetroFramework.Design.1.2.0.3/README.TXT
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
|
||||
NOTE:
|
||||
|
||||
To make use of designers, you must reference both MetroFramework.dll and MetroFramework.Design.dll
|
||||
from your project. I recommend to change the properties for the Design dll to "Copy local: false"
|
||||
as you do not need to redistribute it. This also helps to make your application independent of
|
||||
System.Design.dll and compatible with the .NET client profile, a subset of the full .NET framework.
|
||||
|
||||
Project Site: http://thielj.github.io/MetroFramework
|
||||
9
packages/MetroFramework.Design.1.2.0.3/Tools/install.ps1
vendored
Normal file
9
packages/MetroFramework.Design.1.2.0.3/Tools/install.ps1
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
param($installPath, $toolsPath, $package, $project)
|
||||
|
||||
foreach ($reference in $project.Object.References)
|
||||
{
|
||||
if($reference.Name -eq "MetroFramework.Design")
|
||||
{
|
||||
$reference.CopyLocal = $false;
|
||||
}
|
||||
}
|
||||
BIN
packages/MetroFramework.Design.1.2.0.3/lib/net40/MetroFramework.Design.dll
vendored
Normal file
BIN
packages/MetroFramework.Design.1.2.0.3/lib/net40/MetroFramework.Design.dll
vendored
Normal file
Binary file not shown.
BIN
packages/MetroFramework.Fonts.1.2.0.3/MetroFramework.Fonts.1.2.0.3.nupkg
vendored
Normal file
BIN
packages/MetroFramework.Fonts.1.2.0.3/MetroFramework.Fonts.1.2.0.3.nupkg
vendored
Normal file
Binary file not shown.
10
packages/MetroFramework.Fonts.1.2.0.3/README.TXT
vendored
Normal file
10
packages/MetroFramework.Fonts.1.2.0.3/README.TXT
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
|
||||
NOTE:
|
||||
|
||||
To make use of designers, you must reference both MetroFramework.dll and MetroFramework.Design.dll
|
||||
from your project. I recommend to change the properties for the Design dll to "Copy local: false"
|
||||
as you do not need to redistribute it. This also helps to make your application independent of
|
||||
System.Design.dll and compatible with the .NET client profile, a subset of the full .NET framework.
|
||||
|
||||
Project Site: http://thielj.github.io/MetroFramework
|
||||
BIN
packages/MetroFramework.Fonts.1.2.0.3/lib/net40/MetroFramework.Fonts.dll
vendored
Normal file
BIN
packages/MetroFramework.Fonts.1.2.0.3/lib/net40/MetroFramework.Fonts.dll
vendored
Normal file
Binary file not shown.
BIN
packages/MetroFramework.RunTime.1.2.0.3/MetroFramework.RunTime.1.2.0.3.nupkg
vendored
Normal file
BIN
packages/MetroFramework.RunTime.1.2.0.3/MetroFramework.RunTime.1.2.0.3.nupkg
vendored
Normal file
Binary file not shown.
10
packages/MetroFramework.RunTime.1.2.0.3/README.TXT
vendored
Normal file
10
packages/MetroFramework.RunTime.1.2.0.3/README.TXT
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
|
||||
NOTE:
|
||||
|
||||
To make use of designers, you must reference both MetroFramework.dll and MetroFramework.Design.dll
|
||||
from your project. I recommend to change the properties for the Design dll to "Copy local: false"
|
||||
as you do not need to redistribute it. This also helps to make your application independent of
|
||||
System.Design.dll and compatible with the .NET client profile, a subset of the full .NET framework.
|
||||
|
||||
Project Site: http://thielj.github.io/MetroFramework
|
||||
BIN
packages/MetroFramework.RunTime.1.2.0.3/lib/net40-Client/MetroFramework.dll
vendored
Normal file
BIN
packages/MetroFramework.RunTime.1.2.0.3/lib/net40-Client/MetroFramework.dll
vendored
Normal file
Binary file not shown.
20
packages/Newtonsoft.Json.12.0.3/LICENSE.md
vendored
Normal file
20
packages/Newtonsoft.Json.12.0.3/LICENSE.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2007 James Newton-King
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
BIN
packages/Newtonsoft.Json.12.0.3/Newtonsoft.Json.12.0.3.nupkg
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/Newtonsoft.Json.12.0.3.nupkg
vendored
Normal file
Binary file not shown.
BIN
packages/Newtonsoft.Json.12.0.3/lib/net20/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/net20/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
10298
packages/Newtonsoft.Json.12.0.3/lib/net20/Newtonsoft.Json.xml
vendored
Normal file
10298
packages/Newtonsoft.Json.12.0.3/lib/net20/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/net35/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/net35/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
9446
packages/Newtonsoft.Json.12.0.3/lib/net35/Newtonsoft.Json.xml
vendored
Normal file
9446
packages/Newtonsoft.Json.12.0.3/lib/net35/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/net40/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/net40/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
9646
packages/Newtonsoft.Json.12.0.3/lib/net40/Newtonsoft.Json.xml
vendored
Normal file
9646
packages/Newtonsoft.Json.12.0.3/lib/net40/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/net45/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/net45/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
11262
packages/Newtonsoft.Json.12.0.3/lib/net45/Newtonsoft.Json.xml
vendored
Normal file
11262
packages/Newtonsoft.Json.12.0.3/lib/net45/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.0/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.0/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
10950
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.0/Newtonsoft.Json.xml
vendored
Normal file
10950
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.0/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.3/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.3/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
11072
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.3/Newtonsoft.Json.xml
vendored
Normal file
11072
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.3/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/netstandard2.0/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/netstandard2.0/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
11237
packages/Newtonsoft.Json.12.0.3/lib/netstandard2.0/Newtonsoft.Json.xml
vendored
Normal file
11237
packages/Newtonsoft.Json.12.0.3/lib/netstandard2.0/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
9010
packages/Newtonsoft.Json.12.0.3/lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml
vendored
Normal file
9010
packages/Newtonsoft.Json.12.0.3/lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
10950
packages/Newtonsoft.Json.12.0.3/lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml
vendored
Normal file
10950
packages/Newtonsoft.Json.12.0.3/lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/packageIcon.png
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/packageIcon.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.7 KiB |
194
spoofer.cs
Normal file
194
spoofer.cs
Normal file
@@ -0,0 +1,194 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Diagnostics;
|
||||
using AndroidSideloader;
|
||||
|
||||
namespace Spoofer
|
||||
{
|
||||
class spoofer
|
||||
{
|
||||
public static string alias = string.Empty;
|
||||
public static string password = string.Empty;
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
if (File.Exists("keystore.key") == false || File.Exists("details.txt") == false)
|
||||
{
|
||||
Console.WriteLine("There is no key to sign the apk, making one now...");
|
||||
alias = Utilities.randomString(8);
|
||||
password = Utilities.randomString(16);
|
||||
|
||||
Process cmd = new Process();
|
||||
cmd.StartInfo.FileName = "cmd.exe";
|
||||
cmd.StartInfo.RedirectStandardInput = true;
|
||||
cmd.StartInfo.RedirectStandardOutput = true;
|
||||
cmd.StartInfo.RedirectStandardError = true;
|
||||
cmd.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
|
||||
cmd.StartInfo.CreateNoWindow = true;
|
||||
cmd.StartInfo.UseShellExecute = false;
|
||||
cmd.Start();
|
||||
cmd.StandardInput.WriteLine($"keytool -genkeypair -alias {alias} -keyalg RSA -keysize 2048 -keystore keystore.key");
|
||||
cmd.StandardInput.WriteLine(password);
|
||||
cmd.StandardInput.WriteLine(password);
|
||||
var rand = new Random();
|
||||
for (int i = 0; i < 6; i++)
|
||||
cmd.StandardInput.WriteLine(Utilities.randomString(rand.Next(2,6)));
|
||||
cmd.StandardInput.WriteLine("yes");
|
||||
cmd.StandardInput.Flush();
|
||||
cmd.StandardInput.Close();
|
||||
cmd.WaitForExit();
|
||||
string keyerror = cmd.StandardError.ReadToEnd();
|
||||
string keyoutput = cmd.StandardOutput.ReadToEnd();
|
||||
File.WriteAllText("debug.txt", $"Output: {keyoutput} Error: {keyerror}");
|
||||
File.WriteAllText("details.txt", $"{alias};{password}");
|
||||
Console.WriteLine("Key generated");
|
||||
}
|
||||
else
|
||||
{
|
||||
var temp = File.ReadAllText("details.txt").Split(';');
|
||||
alias = temp[0];
|
||||
password = temp[1];
|
||||
}
|
||||
}
|
||||
|
||||
public static string folderPath = string.Empty;
|
||||
|
||||
public static string decompiledPath = string.Empty;
|
||||
public static string newPackageName = string.Empty;
|
||||
public static string originalPackageName = string.Empty;
|
||||
|
||||
public static string spoofedApkPath = string.Empty;
|
||||
|
||||
public static void SpoofApk(string apkPath, string newPackageName, string obbPath = "")
|
||||
{
|
||||
//Rename
|
||||
string oldGameName = Path.GetFileName(apkPath);
|
||||
folderPath = apkPath.Replace(Path.GetFileName(apkPath), "");
|
||||
File.Move(apkPath, $"{folderPath}spoofme.apk");
|
||||
apkPath = $"{folderPath}spoofme.apk";
|
||||
decompiledPath = apkPath.Replace(".apk","");
|
||||
//newPackageName = $"com.{Utilities.randomString(rand.Next(3, 8))}.{Utilities.randomString(rand.Next(3, 8))}";
|
||||
originalPackageName = PackageName(apkPath);
|
||||
Logger.Log($"Your app will be spoofed as {newPackageName}");
|
||||
Logger.Log($"Folderpath: {folderPath} decompiledPaht: {decompiledPath} ");
|
||||
if (obbPath.Length > 1)
|
||||
{
|
||||
RenameObb(obbPath,newPackageName,originalPackageName);
|
||||
}
|
||||
|
||||
Console.WriteLine("Extracting apk...");
|
||||
DecompileApk(apkPath);
|
||||
|
||||
Console.WriteLine("Spoofing apk...");
|
||||
//Rename APK Packagename
|
||||
string foo = File.ReadAllText($"{decompiledPath}\\AndroidManifest.xml").Replace(originalPackageName, newPackageName);
|
||||
File.WriteAllText($"{decompiledPath}\\AndroidManifest.xml", foo);
|
||||
foreach (string file in Directory.EnumerateFiles(decompiledPath, "*.*", SearchOption.AllDirectories))
|
||||
{
|
||||
if (Path.GetFileName(file) == "BuildConfig.smali")
|
||||
{
|
||||
foo = File.ReadAllText(file).Replace(originalPackageName, newPackageName);
|
||||
File.WriteAllText(file, foo);
|
||||
}
|
||||
}
|
||||
//BMBF
|
||||
//if (File.Exists("bmbf.txt"))
|
||||
//{
|
||||
// string bspckgname = File.ReadAllText("bmbf.txt");
|
||||
// foreach (string file in Directory.EnumerateFiles(decompiledPath, "*.js", SearchOption.AllDirectories))
|
||||
// {
|
||||
// foo = File.ReadAllText(file).Replace("com.beatgames.beatsaber", bspckgname);
|
||||
// File.WriteAllText(file, foo);
|
||||
// }
|
||||
//}
|
||||
Console.WriteLine("APK Spoofed");
|
||||
|
||||
|
||||
Console.WriteLine("Rebuilding the APK...");
|
||||
spoofedApkPath = $"{Path.GetFileName(apkPath).Replace(".apk", "")}_Spoofed as {newPackageName}.apk";
|
||||
|
||||
string output = Utilities.startProcess("cmd.exe", folderPath, $"apktool b \"{Path.GetFileName(apkPath).Replace(".apk", "")}\" -o \"{spoofedApkPath}\"");
|
||||
Logger.Log($"apktool b \"{Path.GetFileName(apkPath).Replace(".apk", "")}\" -o \"{spoofedApkPath}\": {output}");
|
||||
Console.WriteLine("APK Rebuilt");
|
||||
|
||||
//Sign the new apk
|
||||
Console.WriteLine("Signing the APK...");
|
||||
if (File.Exists(folderPath + "keystore.key") == false)
|
||||
File.Copy("keystore.key", $"{folderPath}keystore.key");
|
||||
SignApk(apkPath,newPackageName);
|
||||
|
||||
File.Move($"{folderPath}\\{spoofedApkPath}", $"{folderPath}\\{oldGameName}_ Spoofed as {newPackageName}.apk");
|
||||
File.Move(apkPath, $"{apkPath.Replace(Path.GetFileName(apkPath), "")}\\{oldGameName}.apk");
|
||||
|
||||
Console.WriteLine("APK Signed");
|
||||
|
||||
//Delete the copy of the key and the decompiled apk folder
|
||||
Console.WriteLine("Deleting residual files...");
|
||||
if (string.Equals(folderPath, Environment.CurrentDirectory + "\\") == false)
|
||||
File.Delete($"{folderPath}keystore.key");
|
||||
Directory.Delete(decompiledPath, true);
|
||||
Console.WriteLine("Residual files deleted");
|
||||
}
|
||||
|
||||
public static void SignApk(string path, string packageName)
|
||||
{
|
||||
Process cmdSign = new Process();
|
||||
cmdSign.StartInfo.FileName = "cmd.exe";
|
||||
cmdSign.StartInfo.RedirectStandardInput = true;
|
||||
cmdSign.StartInfo.WorkingDirectory = folderPath;
|
||||
cmdSign.StartInfo.CreateNoWindow = true;
|
||||
cmdSign.StartInfo.UseShellExecute = false;
|
||||
cmdSign.Start();
|
||||
cmdSign.StandardInput.WriteLine($"jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore keystore.key \"{spoofedApkPath}\" {alias}");
|
||||
cmdSign.StandardInput.WriteLine(password);
|
||||
cmdSign.StandardInput.Flush();
|
||||
cmdSign.StandardInput.Close();
|
||||
cmdSign.WaitForExit();
|
||||
File.AppendAllText("debug.txt", $"jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore keystore.key \"{spoofedApkPath}\" {alias}");
|
||||
}
|
||||
|
||||
public static void DecompileApk(string path)
|
||||
{
|
||||
string output = Utilities.startProcess("cmd.exe", folderPath, $"apktool d -f \"{path}\"");
|
||||
|
||||
Console.WriteLine(output);
|
||||
File.AppendAllText("debug.txt", $"apktool d \"{path}\": {output}");
|
||||
//If error
|
||||
if (Utilities.processError.Length > 1)
|
||||
Console.WriteLine($"ERROR: {Utilities.processError}");
|
||||
}
|
||||
|
||||
//Renames obb to new obb according to packagename
|
||||
public static void RenameObb(string obbPath, string newPackageName, string originalPackageName)
|
||||
{
|
||||
Directory.Move(obbPath, obbPath.Replace(originalPackageName, newPackageName));
|
||||
obbPath = obbPath.Replace(originalPackageName, newPackageName);
|
||||
foreach (string file in Directory.GetFiles(obbPath))
|
||||
{
|
||||
if (Path.GetExtension(file) == ".obb")
|
||||
{
|
||||
File.Move(file, file.Replace(originalPackageName, newPackageName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static string PackageName(string path)
|
||||
{
|
||||
Console.WriteLine($"aapt dump badging \"{path}\"");
|
||||
|
||||
string originalPackageName = Utilities.startProcess("cmd.exe", path.Replace(Path.GetFileName(path), string.Empty), $"aapt dump badging \"{path}\" | findstr -i \"package: name\"");
|
||||
File.AppendAllText("debug.txt", $"originalPackageName: {originalPackageName}");
|
||||
try
|
||||
{
|
||||
originalPackageName = originalPackageName.Substring(originalPackageName.IndexOf("package: name='") + 15);
|
||||
originalPackageName = originalPackageName.Substring(0, originalPackageName.IndexOf("'"));
|
||||
}
|
||||
catch
|
||||
{
|
||||
return "PackageName ERROR";
|
||||
}
|
||||
Console.WriteLine($"Packagename is {originalPackageName}");
|
||||
return originalPackageName;
|
||||
}
|
||||
}
|
||||
}
|
||||
75
usernameForm.Designer.cs
generated
75
usernameForm.Designer.cs
generated
@@ -1,75 +0,0 @@
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
partial class usernameForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.Location = new System.Drawing.Point(13, 13);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Size = new System.Drawing.Size(400, 20);
|
||||
this.textBox1.TabIndex = 0;
|
||||
this.textBox1.Text = "Enter your username here";
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Location = new System.Drawing.Point(13, 39);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(400, 23);
|
||||
this.button1.TabIndex = 1;
|
||||
this.button1.Text = "Create User.Json";
|
||||
this.button1.UseVisualStyleBackColor = true;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// usernameForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(425, 74);
|
||||
this.Controls.Add(this.button1);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.MaximumSize = new System.Drawing.Size(441, 113);
|
||||
this.MinimumSize = new System.Drawing.Size(441, 113);
|
||||
this.Name = "usernameForm";
|
||||
this.Text = "USER.JSON";
|
||||
this.Load += new System.EventHandler(this.usernameForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
private System.Windows.Forms.Button button1;
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
using System.IO;
|
||||
|
||||
namespace AndroidSideloader
|
||||
{
|
||||
public partial class usernameForm : Form
|
||||
{
|
||||
public usernameForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
string defaultText;
|
||||
|
||||
private void usernameForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
defaultText = textBox1.Text;
|
||||
}
|
||||
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (textBox1.Text==defaultText || textBox1.Text.Length==0)
|
||||
{
|
||||
MessageBox.Show("Please enter your username first");
|
||||
return;
|
||||
}
|
||||
|
||||
File.WriteAllText("user.json", "{\"username\":\"" + textBox1.Text + "\"}");
|
||||
|
||||
string command = "push " + Environment.CurrentDirectory + "\\user.json " + " /sdcard/";
|
||||
|
||||
|
||||
Process cmd = new Process();
|
||||
cmd.StartInfo.FileName = Environment.CurrentDirectory + "\\adb\\adb.exe";
|
||||
cmd.StartInfo.Arguments = command;
|
||||
cmd.StartInfo.RedirectStandardInput = true;
|
||||
cmd.StartInfo.RedirectStandardOutput = true;
|
||||
cmd.StartInfo.CreateNoWindow = true;
|
||||
cmd.StartInfo.UseShellExecute = false;
|
||||
cmd.StartInfo.WorkingDirectory = Form1.adbPath;
|
||||
cmd.Start();
|
||||
cmd.StandardInput.WriteLine(command);
|
||||
cmd.StandardInput.Flush();
|
||||
cmd.StandardInput.Close();
|
||||
string allText = cmd.StandardOutput.ReadToEnd();
|
||||
cmd.WaitForExit();
|
||||
|
||||
File.Delete("user.json");
|
||||
|
||||
StreamWriter sw = File.AppendText(Form1.debugPath);
|
||||
sw.Write("Action name = " + command + '\n');
|
||||
sw.Write(allText);
|
||||
sw.Write("\n--------------------------------------------------------------------\n");
|
||||
sw.Flush();
|
||||
sw.Close();
|
||||
|
||||
|
||||
Form1.notify(allText);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user