summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java7
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java93
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/StartupHandler.java40
3 files changed, 89 insertions, 51 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..8d193e75ec 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
@@ -283,6 +283,8 @@ public final class NativeLibrary
*/
public static native String GetVersionString();
+ public static native String GetGitRevision();
+
/**
* Saves a screen capture of the game
*/
@@ -303,11 +305,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..7d41df25ac 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
@@ -9,6 +9,8 @@ package org.dolphinemu.dolphinemu.services;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import org.dolphinemu.dolphinemu.NativeLibrary;
@@ -59,7 +61,8 @@ public final class DirectoryInitializationService extends IntentService
}
else if (PermissionsHandler.hasWriteAccess(this))
{
- initDolphinDirectories();
+ initializeInternalStorage();
+ initializeExternalStorage();
directoryState = DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED;
sendBroadcastState(directoryState);
}
@@ -69,21 +72,55 @@ 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");
+
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
+ String revision = NativeLibrary.GetGitRevision();
+ if (!preferences.getString("sysDirectoryVersion", "").equals(revision))
+ {
+ // There is no extracted Sys directory, or there is a Sys directory from another
+ // version of Dolphin that might contain outdated files. Let's (re-)extract Sys.
+ deleteDirectoryRecursively(sysDirectory);
+ copyAssetFolder("Sys", sysDirectory, true);
+
+ SharedPreferences.Editor editor = preferences.edit();
+ editor.putString("sysDirectoryVersion", revision);
+ editor.apply();
+ }
+
+ // 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 +136,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 +157,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 +191,7 @@ public final class DirectoryInitializationService extends IntentService
out.write(buffer, 0, read);
}
}
+
+ private static native void CreateUserDirectories();
+ private static native void SetSysDirectory(String path);
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/StartupHandler.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/StartupHandler.java
index 398f569741..11cdf861c6 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/StartupHandler.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/StartupHandler.java
@@ -13,33 +13,31 @@ public final class StartupHandler
{
public static boolean HandleInit(FragmentActivity parent)
{
- NativeLibrary.SetUserDirectory(""); // Auto-Detect
+ String user_dir = "";
+ String start_file = "";
- if (PermissionsHandler.checkWritePermission(parent)) {
- DirectoryInitializationService.startService(parent);
+ Bundle extras = parent.getIntent().getExtras();
+ if (extras != null)
+ {
+ user_dir = extras.getString("UserDir");
+ start_file = extras.getString("AutoStartFile");
}
- Intent intent = parent.getIntent();
- Bundle extras = intent.getExtras();
+ NativeLibrary.SetUserDirectory(user_dir); // Uses default path if user_dir equals ""
- if (extras != null)
+ if (PermissionsHandler.checkWritePermission(parent))
+ DirectoryInitializationService.startService(parent);
+
+ if (!TextUtils.isEmpty(start_file))
{
- String user_dir = extras.getString("UserDir");
- String start_file = extras.getString("AutoStartFile");
-
- if (!TextUtils.isEmpty(user_dir))
- NativeLibrary.SetUserDirectory(user_dir);
-
- if (!TextUtils.isEmpty(start_file))
- {
- // Start the emulation activity, send the ISO passed in and finish the main activity
- Intent emulation_intent = new Intent(parent, EmulationActivity.class);
- emulation_intent.putExtra("SelectedGame", start_file);
- parent.startActivity(emulation_intent);
- parent.finish();
- return false;
- }
+ // Start the emulation activity, send the ISO passed in and finish the main activity
+ Intent emulation_intent = new Intent(parent, EmulationActivity.class);
+ emulation_intent.putExtra("SelectedGame", start_file);
+ parent.startActivity(emulation_intent);
+ parent.finish();
+ return false;
}
+
return false;
}
}