From 629654b99bae7ca9e162a3ba8ea855b2eccebda4 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 2 Sep 2019 21:27:13 -0400 Subject: [PATCH 1/2] modloader updated to load more than one mod --- BeatOn/Resources/raw/libmodloader.so | Bin 26288 -> 26336 bytes BeatOn/Resources/raw/libmodloader64.so | Bin 18456 -> 18456 bytes beatsaber-hook | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/BeatOn/Resources/raw/libmodloader.so b/BeatOn/Resources/raw/libmodloader.so index 6b688cc8699ecfc1e0a2f03a7a60d1525eb4612d..f9127887daf315618c6b7aa30efb8424271ad09d 100644 GIT binary patch delta 11816 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 diff --git a/BeatOn/Resources/raw/libmodloader64.so b/BeatOn/Resources/raw/libmodloader64.so index 0f20bb632a0d4b21e9be237bd21c81d0bc342c43..7be64a72ef661cef6cbd2f1b93ad4eafc91ce775 100644 GIT binary patch delta 4965 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 delta 7765 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 diff --git a/beatsaber-hook b/beatsaber-hook index 7dc424c..5708fd5 160000 --- a/beatsaber-hook +++ b/beatsaber-hook @@ -1 +1 @@ -Subproject commit 7dc424cd71bcf7f3f10755f0222cda79017a7dcf +Subproject commit 5708fd5d131959526910f1dcfad46deb883ebcea From 2c1372bf6f23ca77d401a01a9762e80d5f260877 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 7 Sep 2019 19:41:40 -0400 Subject: [PATCH 2/2] Several tweaks for beatmapper tools and upgrade process for fixed modloader. --- BeatOn/BeatSaberModder.cs | 139 +++++++++++++++--- BeatOn/Core/BeatOnCore.cs | 28 +++- BeatOn/Core/RequestHandlers/PostFileUpload.cs | 19 ++- .../Core/RequestHandlers/PostPackageAction.cs | 2 +- BeatOn/ImportManager.cs | 20 +-- BeatOn/Properties/AndroidManifest.xml | 2 +- BeatOn/Properties/AssemblyInfo.cs | 4 +- QuestomAssets | 2 +- 8 files changed, 179 insertions(+), 37 deletions(-) diff --git a/BeatOn/BeatSaberModder.cs b/BeatOn/BeatSaberModder.cs index 677df50..678dd4f 100644 --- a/BeatOn/BeatSaberModder.cs +++ b/BeatOn/BeatSaberModder.cs @@ -23,6 +23,7 @@ public class BeatSaberModder public const string LIBMODLOADER_TARGET_FILE = "lib/armeabi-v7a/libmodloader.so"; public const string LIBMODLOADER64_TARGET_FILE = "lib/arm64-v8a/libmodloader.so"; public const string MOD_TAG_FILE = "beaton.modded"; + public const string MODLOADERV2_TAG_FILE = "beaton.modloader2.modded"; public const string BS_PLAYER_DATA_FILE = "/sdcard/Android/data/com.beatgames.beatsaber/files/PlayerData.dat"; public event EventHandler StatusUpdated; @@ -71,7 +72,7 @@ public bool IsTempApkModded Log.LogErr("IsTempApkModded was called, but the TempApk does not exist!"); throw new ModException("IsTempApkModded was called, but the TempApk does not exist!"); } - return CheckApkHasModTagFile(TempApk); + return CheckApkHasAllTagFiles(TempApk); } } @@ -94,6 +95,31 @@ public void CheckCleanupTempApk() } } + private bool IsInstalledBeatSaberOriginal + { + get + { +#if EMULATOR + return true; +#endif + string bsApk = FindBeatSaberApk(); + if (bsApk == null) + { + Log.LogErr($"Tried to call {nameof(IsInstalledBeatSaberModded)} when beat saber isn't installed."); + throw new ModException("Beat saber is not installed, cannot check if it is modded."); + } + try + { + return !(CheckApkHasModloaderTagFile(bsApk) || CheckApkHasModTagFile(bsApk)); + } + catch (Exception ex) + { + Log.LogErr($"Exception in {nameof(IsInstalledBeatSaberModded)} when trying to check if it is modded.", ex); + throw new ModException("Error checking if installed beat saber is modded.", ex); + } + } + } + public bool IsInstalledBeatSaberModded { get @@ -109,7 +135,7 @@ public bool IsInstalledBeatSaberModded } try { - return CheckApkHasModTagFile(bsApk); + return CheckApkHasAllTagFiles(bsApk); } catch (Exception ex) { @@ -136,7 +162,7 @@ public bool CheckIsTempApkReadyForInstall() { if (TempApk == null) return false; - return CheckApkHasModTagFile(TempApk); + return CheckApkHasAllTagFiles(TempApk); } catch (Exception ex) { @@ -334,7 +360,7 @@ public void BackupOriginalApk() throw new ModException("Beat Saber does not seem to be installed, could not find its APK."); } UpdateStatus("Verifying the installed APK isn't modded..."); - if (IsInstalledBeatSaberModded) + if (!IsInstalledBeatSaberOriginal) { UpdateStatus("Installed beatsaber IS modded!"); if (File.Exists(Constants.BEATSABER_APK_BACKUP_FILE)) @@ -382,17 +408,22 @@ public void ApplyModToTempApk() bool modFailed = false; //keep track of any temp files that may have been used so we can clean them up List tempFiles = new List(); + bool isPartialUpgrade = false; try { - //// delete the assets relocation if it already exists in case the mod has been installed before - if (Directory.Exists(Constants.ASSETS_RELOC_PATH)) - Directory.Delete(Constants.ASSETS_RELOC_PATH, true); + isPartialUpgrade = CheckApkHasModTagFile(TempApk) && !CheckApkHasModloaderTagFile(TempApk) && Directory.Exists(Constants.ASSETS_RELOC_PATH); + + if (!isPartialUpgrade) + { + //// delete the assets relocation if it already exists in case the mod has been installed before + if (Directory.Exists(Constants.ASSETS_RELOC_PATH)) + Directory.Delete(Constants.ASSETS_RELOC_PATH, true); - //// copy asset files from APK to /sdcard/wherever - ExtractAssetsFromApkToExternalStorage(TempApk, new List() { + //// copy asset files from APK to /sdcard/wherever + ExtractAssetsFromApkToExternalStorage(TempApk, new List() { "Managed", "boot.config" }); - + } bool is64bit = IsApk64Bit(TempApk); //// copy libassetredirect.so to the mods folder @@ -401,18 +432,25 @@ public void ApplyModToTempApk() //from this point on, the APK has been modified and isn't definitively recoverable if something goes wrong tempApkModified = true; - //// modify classes.dex and inject the loadlibrary call for libmodloader.so - InjectModLoaderToApk(TempApk, tempFiles); + if (!isPartialUpgrade) + { + //// modify classes.dex and inject the loadlibrary call for libmodloader.so + InjectModLoaderToApk(TempApk, tempFiles); + } //// add libmodloader.so to the apk AddModLoaderToApk(TempApk); - //// fix the manifest - AddManifestModToApk(TempApk); - - //// add a 1 byte file to the APK so we know it's been modded to make verifying it later easier - AddTagFileToApk(TempApk); + if (!isPartialUpgrade) + { + //// fix the manifest + AddManifestModToApk(TempApk); + //// add a 1 byte file to the APK so we know it's been modded to make verifying it later easier + AddTagFileToApk(TempApk); + } + AddModLoaderTagFileToApk(TempApk); + //// re-sign the APK UpdateStatus("Re-signing the modded APK (this takes a minute)..."); SignApk(TempApk); @@ -595,6 +633,28 @@ public void CleanupTempApk() } + private bool CheckApkHasAllTagFiles(string apkFilename) + { + bool hasModTag = false; + bool hasModloaderTag = false; + using (var apk = new ZipFileProvider(apkFilename, FileCacheMode.None, true, QuestomAssets.Utils.FileUtils.GetTempDirectory())) + { + if (apk.FileExists(MOD_TAG_FILE)) + { + hasModTag = true; + } + if (apk.FileExists(MODLOADERV2_TAG_FILE)) + { + hasModloaderTag = true; + } + if (hasModTag && hasModloaderTag) + { + return true; + } + } + return (hasModTag && hasModloaderTag); + } + private bool CheckApkHasModTagFile(string apkFilename) { using (var apk = new ZipFileProvider(apkFilename, FileCacheMode.None, true, QuestomAssets.Utils.FileUtils.GetTempDirectory())) @@ -605,6 +665,17 @@ private bool CheckApkHasModTagFile(string apkFilename) return false; } + private bool CheckApkHasModloaderTagFile(string apkFilename) + { + using (var apk = new ZipFileProvider(apkFilename, FileCacheMode.None, true, QuestomAssets.Utils.FileUtils.GetTempDirectory())) + { + if (apk.FileExists(MODLOADERV2_TAG_FILE)) + return true; + } + return false; + + } + private void UpdateStatus(string message) { StatusUpdated?.Invoke(this, message); @@ -1002,13 +1073,31 @@ private void AddModLoaderToApk(string apkFilename) { if (apk.DirectoryExists(LIBMODLOADER_TARGET_FILE.GetDirectoryFwdSlash())) { + if (apk.FileExists(LIBMODLOADER_TARGET_FILE)) + { + apk.Delete(LIBMODLOADER_TARGET_FILE); + apk.Save(); + } apk.QueueWriteStream(LIBMODLOADER_TARGET_FILE, resStream, true, true); } if (apk.DirectoryExists(LIBMODLOADER64_TARGET_FILE.GetDirectoryFwdSlash())) { + if (apk.FileExists(LIBMODLOADER64_TARGET_FILE)) + { + apk.Delete(LIBMODLOADER64_TARGET_FILE); + apk.Save(); + } apk.QueueWriteStream(LIBMODLOADER64_TARGET_FILE, resStream64, true, true); } - apk.Save(); + try + { + apk.Save(); + } catch (IOException) + { + GC.Collect(); + System.Threading.Thread.Sleep(1000); + apk.Save(); + } } } } @@ -1083,5 +1172,19 @@ private void AddTagFileToApk(string apkFilename) } } + private void AddModLoaderTagFileToApk(string apkFilename) + { + using (var apk = new ZipFileProvider(apkFilename, FileCacheMode.None, false, QuestomAssets.Utils.FileUtils.GetTempDirectory())) + { + if (apk.FileExists(MODLOADERV2_TAG_FILE)) + { + Log.LogMsg("APK file already had the modloader v2 tag file."); + return; + } + apk.Write(MODLOADERV2_TAG_FILE, new byte[1], true, false); + apk.Save(); + } + } + } } \ No newline at end of file diff --git a/BeatOn/Core/BeatOnCore.cs b/BeatOn/Core/BeatOnCore.cs index 7787777..204f16c 100644 --- a/BeatOn/Core/BeatOnCore.cs +++ b/BeatOn/Core/BeatOnCore.cs @@ -77,18 +77,22 @@ private bool CheckReimportSongs() return false; } - private void KillBeatSaber() + private void KillBackgroundProcess(string packageName) { try { ActivityManager am = (ActivityManager)_context.GetSystemService(Context.ActivityService); - am.KillBackgroundProcesses("com.beatgames.beatsaber"); + am.KillBackgroundProcesses(packageName); } catch (Exception ex) { Log.LogErr("Exception trying to kill background process for beatsaber.", ex); } } + private void KillBeatSaber() + { + KillBackgroundProcess("com.beatgames.beatsaber"); + } public void Start() { @@ -486,7 +490,25 @@ private void OpManager_OpStatusChanged(object sender, QuestomAssets.AssetOps.Ass private void SendPackageStop(string packageName) { - //doesn't work + try + { + Intent intent = new Intent("com.oculus.vrshell.intent.action.LAUNCH"); + intent.SetPackage("com.oculus.vrshell"); + intent.PutExtra("intent_data", Android.Net.Uri.Parse("systemux://home")); + intent.PutExtra("blackscreen", false); + //var intent = new Intent("com.oculus.system_activity"); + //intent.SetPackage(packageName); + + //intent.PutExtra("intent_pkg", "com.oculus.vrshell"); + //intent.PutExtra("intent_cmd", "{\"Command\":\"exitToHome\", \"PlatformUIVersion\":3, \"ToPackage\":\"" + packageName + "\"}"); + //_context.SendBroadcast(intent); + //intent.PutExtra("intent_cmd", "{\"Command\":\"returnToLauncher\", \"PlatformUIVersion\":3, \"ToPackage\":\"" + packageName + "\"}"); + _context.SendBroadcast(intent); + Task.Delay(3000).ContinueWith(t => { KillBackgroundProcess(packageName); }); + } catch (Exception e) + { + Log.LogErr("Exception trying to send package exittohome messages", e); + } } private void _SongDownloadManager_StatusChanged(object sender, DownloadStatusChangeArgs e) diff --git a/BeatOn/Core/RequestHandlers/PostFileUpload.cs b/BeatOn/Core/RequestHandlers/PostFileUpload.cs index 3b90c4d..60140b1 100644 --- a/BeatOn/Core/RequestHandlers/PostFileUpload.cs +++ b/BeatOn/Core/RequestHandlers/PostFileUpload.cs @@ -75,6 +75,23 @@ public void HandleRequest(HttpListenerContext context) resp.BadRequest("Didn't get any useable files."); return; } + + bool forceOverwrite = false; + if (!string.IsNullOrWhiteSpace(req.Url.Query)) + { + foreach (string kvp in req.Url.Query.TrimStart('?').Split("&")) + { + var split = kvp.Split('='); + if (split.Count() < 1) + continue; + if (split[0].ToLower() == "overwrite") + { + forceOverwrite = true; + break; + } + } + } + foreach (var file in files.Keys.ToList()) { var s = files[file]; @@ -100,7 +117,7 @@ public void HandleRequest(HttpListenerContext context) { provider.Dispose(); ms.Dispose(); - }); + }, overwriteIfExists: forceOverwrite); } catch { diff --git a/BeatOn/Core/RequestHandlers/PostPackageAction.cs b/BeatOn/Core/RequestHandlers/PostPackageAction.cs index aefae5a..9b2443e 100644 --- a/BeatOn/Core/RequestHandlers/PostPackageAction.cs +++ b/BeatOn/Core/RequestHandlers/PostPackageAction.cs @@ -53,7 +53,7 @@ public void HandleRequest(HttpListenerContext context) if (split[0].ToLower() == "package") { package= Java.Net.URLDecoder.Decode(split[1]); - break; + } else if (split[0].ToLower() == "action") { action = Java.Net.URLDecoder.Decode(split[1]); diff --git a/BeatOn/ImportManager.cs b/BeatOn/ImportManager.cs index 2da1a58..383bff6 100644 --- a/BeatOn/ImportManager.cs +++ b/BeatOn/ImportManager.cs @@ -254,7 +254,7 @@ public void ImportFile(string filename, string mimeType, byte[] fileData) /// The file provider containing the data at its root /// A completion callback for when the operations have all completed. Will not be called if there's an exception during initial processing, but will be called if a background operation fails /// Optionally the playlist to add the song to, if the download is a song - public void ImportFromFileProvider(IFileProvider provider, Action completionCallback, string targetPlaylistID = null, bool suppressToast = false) + public void ImportFromFileProvider(IFileProvider provider, Action completionCallback, string targetPlaylistID = null, bool suppressToast = false, bool overwriteIfExists = false) { try { @@ -275,7 +275,7 @@ public void ImportFromFileProvider(IFileProvider provider, Action completionCall if (targetPlaylistID != null) playlist = _getConfig().Config.Playlists.FirstOrDefault(x => x.PlaylistID == targetPlaylistID); - ImportSongFile(provider, completionCallback, playlist, suppressToast); + ImportSongFile(provider, completionCallback, playlist, suppressToast, overwriteIfExists); break; case DownloadType.Playlist: ImportPlaylistFilesFromProvider(provider); @@ -323,14 +323,14 @@ private void ImportPlaylistFilesFromProvider(IFileProvider provider) //todo: show a toast here? } - private AssetOp ImportSongFile(IFileProvider provider, Action completionCallback, BeatSaberPlaylist addToPlaylist = null, bool suppressToast = false) + private AssetOp ImportSongFile(IFileProvider provider, Action completionCallback, BeatSaberPlaylist addToPlaylist = null, bool suppressToast = false, bool overwriteIfExists = false) { try { - var songPath = ExtractSongGetPath(provider); + var songPath = ExtractSongGetPath(provider, overwriteIfExists); var songID = songPath.GetFilenameFwdSlash(); var playlist = addToPlaylist??GetOrCreateDefaultPlaylist(); - return QueueAddSongToPlaylistOp(songID, songPath, playlist, completionCallback, suppressToast); + return QueueAddSongToPlaylistOp(songID, songPath, playlist, completionCallback, suppressToast, overwriteIfExists); } catch (ImportException) { @@ -363,7 +363,7 @@ private void ImportModFile(IFileProvider provider) /// /// Extracts a song from a provider and returns the path RELATIVE TO THE BEATONDATAROOT /// - private string ExtractSongGetPath(IFileProvider provider) + private string ExtractSongGetPath(IFileProvider provider, bool overwriteIfExists) { try { @@ -376,7 +376,7 @@ private string ExtractSongGetPath(IFileProvider provider) //checking this first to maintain compability with song IDs that are just and are not _ - var targetOutputDir = _qaeConfig.SongsPath.CombineFwdSlash(targetSongID); - if (_qaeConfig.RootFileProvider.FileExists(targetOutputDir.CombineFwdSlash("info.dat"))) + if (!overwriteIfExists && _qaeConfig.RootFileProvider.FileExists(targetOutputDir.CombineFwdSlash("info.dat"))) { Log.LogMsg($"ImportManager skipping extract because {targetOutputDir} already exists and has an info.dat."); return targetOutputDir; @@ -410,7 +410,7 @@ private string ExtractSongGetPath(IFileProvider provider) targetOutputDir = _qaeConfig.SongsPath.CombineFwdSlash(targetSongID); - if (_qaeConfig.RootFileProvider.FileExists(targetOutputDir.CombineFwdSlash("info.dat"))) + if (!overwriteIfExists && _qaeConfig.RootFileProvider.FileExists(targetOutputDir.CombineFwdSlash("info.dat"))) { Log.LogMsg($"ImportManager skipping extract because {targetOutputDir} already exists and has an info.dat."); return targetOutputDir; @@ -546,7 +546,7 @@ private void ExtractAndInstallMod(IFileProvider provider) /// The song ID to use for the imported song /// The path, RELATIVE TO THE BEATONDATA ROOT, of where the custom song exists /// The playlist to add the song to - private AssetOp QueueAddSongToPlaylistOp(string songID, string songPath, BeatSaberPlaylist playlist, Action completionCallback = null, bool suppressToast = false) + private AssetOp QueueAddSongToPlaylistOp(string songID, string songPath, BeatSaberPlaylist playlist, Action completionCallback = null, bool suppressToast = false, bool overwriteIfExists = false) { var qae = _getEngine(); var bsSong = new BeatSaberSong() @@ -554,7 +554,7 @@ private AssetOp QueueAddSongToPlaylistOp(string songID, string songPath, BeatSab SongID = songID, //ref: was Path.GetFileName(toInst.DownloadPath), CustomSongPath = songPath //ref: was toInst.DownloadPath }; - var addOp = new AddNewSongToPlaylistOp(bsSong, playlist.PlaylistID); + var addOp = new AddNewSongToPlaylistOp(bsSong, playlist.PlaylistID, overwriteIfExists); addOp.OpFinished += (s, op) => { diff --git a/BeatOn/Properties/AndroidManifest.xml b/BeatOn/Properties/AndroidManifest.xml index 38cceeb..f1e38c4 100644 --- a/BeatOn/Properties/AndroidManifest.xml +++ b/BeatOn/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@  - + diff --git a/BeatOn/Properties/AssemblyInfo.cs b/BeatOn/Properties/AssemblyInfo.cs index e92da5e..8ec77d5 100644 --- a/BeatOn/Properties/AssemblyInfo.cs +++ b/BeatOn/Properties/AssemblyInfo.cs @@ -26,5 +26,5 @@ // 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("0.1.3.3")] -[assembly: AssemblyFileVersion("0.1.3.3")] +[assembly: AssemblyVersion("0.1.3.5")] +[assembly: AssemblyFileVersion("0.1.3.5")] diff --git a/QuestomAssets b/QuestomAssets index 7cac99e..51682c4 160000 --- a/QuestomAssets +++ b/QuestomAssets @@ -1 +1 @@ -Subproject commit 7cac99e2a94dc0c373c6ea55a27ad10bbbf53598 +Subproject commit 51682c46809253383f4844d08b7401b65e188b4f