diff options
| author | JosJuice <josjuice@gmail.com> | 2017-09-09 11:27:24 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2017-12-26 09:53:32 +0100 |
| commit | b3b7aef09a99eb10ce73a9a625654c69c74cf7bc (patch) | |
| tree | 2d21d85a99e205872e62fbfe146110d027506c02 /Source/Android/app/src/main/java | |
| parent | d1c1793a342c61c2e04ca19136fa2ecf50d34898 (diff) | |
Android: Extract Sys to a different folder than the User folder
Diffstat (limited to 'Source/Android/app/src/main/java')
2 files changed, 58 insertions, 30 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index b2d4ed8d39..a11a4ad154 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -303,11 +303,6 @@ public final class NativeLibrary public static native void LoadState(int slot); /** - * Creates the initial folder structure in /sdcard/dolphin-emu/ - */ - public static native void CreateUserFolders(); - - /** * Sets the current working user directory * If not set, it auto-detects a location */ diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java index 8f4a8a6bca..f6362ff9cc 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java @@ -59,7 +59,8 @@ public final class DirectoryInitializationService extends IntentService } else if (PermissionsHandler.hasWriteAccess(this)) { - initDolphinDirectories(); + initializeInternalStorage(); + initializeExternalStorage(); directoryState = DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED; sendBroadcastState(directoryState); } @@ -69,21 +70,47 @@ public final class DirectoryInitializationService extends IntentService } } - private void initDolphinDirectories() + private void initializeInternalStorage() { - String BaseDir = NativeLibrary.GetUserDirectory(); - String ConfigDir = BaseDir + File.separator + "Config"; - - // Copy assets if needed - NativeLibrary.CreateUserFolders(); - copyAssetFolder("GC", BaseDir + File.separator + "GC", false); - copyAssetFolder("Shaders", BaseDir + File.separator + "Shaders", false); - copyAssetFolder("Wii", BaseDir + File.separator + "Wii", false); - - // Always copy over the GCPad config in case of change or corruption. - // Not a user configurable file. - copyAsset("GCPadNew.ini", ConfigDir + File.separator + "GCPadNew.ini", true); - copyAsset("WiimoteNew.ini", ConfigDir + File.separator + "WiimoteNew.ini", false); + File sysDirectory = new File(getFilesDir(), "Sys"); + + // Delete the existing extracted Sys directory in case it's from a different version of Dolphin. + deleteDirectoryRecursively(sysDirectory); + + // Extract the Sys directory to app-local internal storage. + copyAssetFolder("Sys", sysDirectory, true); + + // Let the native code know where the Sys directory is. + SetSysDirectory(sysDirectory.getPath()); + } + + private void initializeExternalStorage() + { + // Create User directory structure and copy some NAND files from the extracted Sys directory. + CreateUserDirectories(); + + // GCPadNew.ini and WiimoteNew.ini must contain specific values in order for controller + // input to work as intended (they aren't user configurable), so we overwrite them just + // in case the user has tried to modify them manually. + // + // ...Except WiimoteNew.ini contains the user configurable settings for Wii Remote + // extensions in addition to all of its lines that aren't user configurable, so since we + // don't want to lose the selected extensions, we don't overwrite that file if it exists. + // + // TODO: Redo the Android controller system so that we don't have to extract these INIs. + String configDirectory = NativeLibrary.GetUserDirectory() + File.separator + "Config"; + copyAsset("GCPadNew.ini", new File(configDirectory, "GCPadNew.ini"), true); + copyAsset("WiimoteNew.ini", new File(configDirectory,"WiimoteNew.ini"), false); + } + + private static void deleteDirectoryRecursively(File file) + { + if (file.isDirectory()) + { + for (File child : file.listFiles()) + deleteDirectoryRecursively(child); + } + file.delete(); } public static boolean areDolphinDirectoriesReady() @@ -99,19 +126,16 @@ public final class DirectoryInitializationService extends IntentService LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent); } - private void copyAsset(String asset, String output, Boolean overwrite) + private void copyAsset(String asset, File output, Boolean overwrite) { Log.verbose("[DirectoryInitializationService] Copying File " + asset + " to " + output); - InputStream in; - OutputStream out; try { - File file = new File(output); - if (!file.exists() || overwrite) + if (!output.exists() || overwrite) { - in = getAssets().open(asset); - out = new FileOutputStream(output); + InputStream in = getAssets().open(asset); + OutputStream out = new FileOutputStream(output); copyFile(in, out); in.close(); out.close(); @@ -123,16 +147,22 @@ public final class DirectoryInitializationService extends IntentService } } - private void copyAssetFolder(String assetFolder, String outputFolder, Boolean overwrite) + private void copyAssetFolder(String assetFolder, File outputFolder, Boolean overwrite) { Log.verbose("[DirectoryInitializationService] Copying Folder " + assetFolder + " to " + outputFolder); try { + boolean createdFolder = false; for (String file : getAssets().list(assetFolder)) { - copyAssetFolder(assetFolder + File.separator + file, outputFolder + File.separator + file, overwrite); - copyAsset(assetFolder + File.separator + file, outputFolder + File.separator + file, overwrite); + if (!createdFolder) + { + outputFolder.mkdir(); + createdFolder = true; + } + copyAssetFolder(assetFolder + File.separator + file, new File(outputFolder, file), overwrite); + copyAsset(assetFolder + File.separator + file, new File(outputFolder, file), overwrite); } } catch (IOException e) @@ -151,4 +181,7 @@ public final class DirectoryInitializationService extends IntentService out.write(buffer, 0, read); } } + + private static native void CreateUserDirectories(); + private static native void SetSysDirectory(String path); } |
