Skip to content
Permalink
Browse files
Merge pull request #6306 from mahdihijazi/fix_hardcoded_path2
Android: Don't hard code the user dircetory path to /sdcard/dolphin-emu
  • Loading branch information
degasus committed Jan 26, 2018
2 parents 8d16a40 + ae8b469 commit 5ba18f6
Show file tree
Hide file tree
Showing 8 changed files with 110 additions and 27 deletions.
@@ -15,8 +15,6 @@ public void onCreate()
{
super.onCreate();

NativeLibrary.SetUserDirectory(""); // Empty string means use the default path

if (PermissionsHandler.hasWriteAccess(getApplicationContext()))
DirectoryInitializationService.startService(getApplicationContext());

@@ -158,13 +158,22 @@ private void setupDolphinDirectoriesThenStartEmulation() {
DirectoryInitializationService.BROADCAST_ACTION);

directoryStateReceiver =
new DirectoryStateReceiver(directoryInitializationState -> {
if (directoryInitializationState == DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED) {
new DirectoryStateReceiver(directoryInitializationState ->
{
if (directoryInitializationState == DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED)
{
mEmulationState.run(activity.isActivityRecreated());
} else if (directoryInitializationState == DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED) {
}
else if (directoryInitializationState == DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED)
{
Toast.makeText(getContext(), R.string.write_permission_needed, Toast.LENGTH_SHORT)
.show();
}
else if (directoryInitializationState == DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE)
{
Toast.makeText(getContext(), R.string.external_storage_not_mounted, Toast.LENGTH_SHORT)
.show();
}
});

// Registers the DirectoryStateReceiver and its intent filters
@@ -10,6 +10,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;

@@ -22,6 +23,8 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicBoolean;


/**
* A service that spawns its own thread in order to copy several binary and shader files
@@ -32,12 +35,15 @@ public final class DirectoryInitializationService extends IntentService
public static final String BROADCAST_ACTION = "org.dolphinemu.dolphinemu.BROADCAST";

public static final String EXTRA_STATE = "directoryState";
private static DirectoryInitializationState directoryState = null;
private static volatile DirectoryInitializationState directoryState = null;
private static String userPath;
private static AtomicBoolean isDolphinDirectoryInitializationRunning = new AtomicBoolean(false);

public enum DirectoryInitializationState
{
DOLPHIN_DIRECTORIES_INITIALIZED,
EXTERNAL_STORAGE_PERMISSION_NEEDED
EXTERNAL_STORAGE_PERMISSION_NEEDED,
CANT_FIND_EXTERNAL_STORAGE
}

public DirectoryInitializationService()
@@ -55,21 +61,50 @@ public static void startService(Context context)
@Override
protected void onHandleIntent(Intent intent)
{
if (directoryState == DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED)
{
sendBroadcastState(DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED);
}
else if (PermissionsHandler.hasWriteAccess(this))
isDolphinDirectoryInitializationRunning.set(true);

if (directoryState != DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED)
{
initializeInternalStorage();
initializeExternalStorage();
directoryState = DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED;
sendBroadcastState(directoryState);
if (PermissionsHandler.hasWriteAccess(this))
{
if (setDolphinUserDirectory())
{
initializeInternalStorage();
initializeExternalStorage();

directoryState = DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED;
}
else
{
directoryState = DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE;
}
}
else
{
directoryState = DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED;
}
}
else

isDolphinDirectoryInitializationRunning.set(false);
sendBroadcastState(directoryState);
}

private boolean setDolphinUserDirectory()
{
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
{
sendBroadcastState(DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED);
File externalPath = Environment.getExternalStorageDirectory();
if (externalPath != null)
{
userPath = externalPath.getAbsolutePath() + "/dolphin-emu";
Log.debug("[DirectoryInitializationService] User Dir: " + userPath);
NativeLibrary.SetUserDirectory(userPath);
return true;
}

}

return false;
}

private void initializeInternalStorage()
@@ -128,6 +163,20 @@ public static boolean areDolphinDirectoriesReady()
return directoryState == DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED;
}

public static String getUserDirectory()
{
if (directoryState == null)
{
throw new IllegalStateException("DirectoryInitializationService has to run at least once!");
}
else if (isDolphinDirectoryInitializationRunning.get())
{
throw new IllegalStateException("DirectoryInitializationService has to finish running first!");
}
return userPath;

}

private void sendBroadcastState(DirectoryInitializationState state)
{
Intent localIntent =
@@ -176,6 +176,13 @@ public void showPermissionNeededHint()
.show();
}

@Override
public void showExternalStorageNotMountedHint()
{
Toast.makeText(this, R.string.external_storage_not_mounted, Toast.LENGTH_SHORT)
.show();
}

@Override
public HashMap<String, SettingSection> getSettings(int file)
{
@@ -6,6 +6,7 @@
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.model.settings.SettingSection;
import org.dolphinemu.dolphinemu.services.DirectoryInitializationService;
import org.dolphinemu.dolphinemu.services.DirectoryInitializationService.DirectoryInitializationState;
import org.dolphinemu.dolphinemu.utils.DirectoryStateReceiver;
import org.dolphinemu.dolphinemu.utils.Log;
import org.dolphinemu.dolphinemu.utils.SettingsFile;
@@ -40,9 +41,6 @@ public void onCreate(Bundle savedInstanceState, String menuTag)
{
if (savedInstanceState == null)
{
mSettings.add(SettingsFile.SETTINGS_DOLPHIN, SettingsFile.readFile(SettingsFile.FILE_NAME_DOLPHIN, mView));
mSettings.add(SettingsFile.SETTINGS_GFX, SettingsFile.readFile(SettingsFile.FILE_NAME_GFX, mView));
mSettings.add(SettingsFile.SETTINGS_WIIMOTE, SettingsFile.readFile(SettingsFile.FILE_NAME_WIIMOTE, mView));
this.menuTag = menuTag;
}
else
@@ -58,6 +56,13 @@ public void onStart()

void loadSettingsUI()
{
if (mSettings.isEmpty())
{
mSettings.add(SettingsFile.SETTINGS_DOLPHIN, SettingsFile.readFile(SettingsFile.FILE_NAME_DOLPHIN, mView));
mSettings.add(SettingsFile.SETTINGS_GFX, SettingsFile.readFile(SettingsFile.FILE_NAME_GFX, mView));
mSettings.add(SettingsFile.SETTINGS_WIIMOTE, SettingsFile.readFile(SettingsFile.FILE_NAME_WIIMOTE, mView));
}

mView.showSettingsFragment(menuTag, false);
mView.onSettingsFileLoaded(mSettings);
}
@@ -72,14 +77,23 @@ private void prepareDolphinDirectoriesIfNeeded()
DirectoryInitializationService.BROADCAST_ACTION);

directoryStateReceiver =
new DirectoryStateReceiver(directoryInitializationState -> {
if (directoryInitializationState == DirectoryInitializationService.DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED) {
new DirectoryStateReceiver(directoryInitializationState ->
{
if (directoryInitializationState == DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED)
{
mView.hideLoading();
loadSettingsUI();
} else if (directoryInitializationState == DirectoryInitializationService.DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED) {
}
else if (directoryInitializationState == DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED)
{
mView.showPermissionNeededHint();
mView.hideLoading();
}
else if (directoryInitializationState == DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE)
{
mView.showExternalStorageNotMountedHint();
mView.hideLoading();
}
});

mView.startDirectoryInitializationService(directoryStateReceiver, statusIntentFilter);
@@ -118,6 +118,11 @@
*/
void showPermissionNeededHint();

/**
* Show a hint to the user that the app needs the external storage to be mounted
*/
void showExternalStorageNotMountedHint();

/**
* Start the DirectoryInitializationService and listen for the result.
*
@@ -1,6 +1,5 @@
package org.dolphinemu.dolphinemu.utils;

import android.os.Environment;
import android.support.annotation.NonNull;

import org.dolphinemu.dolphinemu.model.settings.BooleanSetting;
@@ -9,6 +8,7 @@
import org.dolphinemu.dolphinemu.model.settings.Setting;
import org.dolphinemu.dolphinemu.model.settings.SettingSection;
import org.dolphinemu.dolphinemu.model.settings.StringSetting;
import org.dolphinemu.dolphinemu.services.DirectoryInitializationService;
import org.dolphinemu.dolphinemu.ui.settings.SettingsActivityView;

import java.io.BufferedReader;
@@ -393,8 +393,7 @@ public static void saveFile(final String fileName, final HashMap<String, Setting
@NonNull
private static File getSettingsFile(String fileName)
{
String storagePath = Environment.getExternalStorageDirectory().getAbsolutePath();
return new File(storagePath + "/dolphin-emu/Config/" + fileName + ".ini");
return new File(DirectoryInitializationService.getUserDirectory() + "/Config/" + fileName + ".ini");
}

private static SettingSection sectionFromLine(String line)
@@ -251,4 +251,6 @@
<string name="load_settings">Loading Settings...</string>

<string name="emulation_change_disc">Change Disc</string>

<string name="external_storage_not_mounted">The external storage needs to be available in order to use Dolphin</string>
</resources>

0 comments on commit 5ba18f6

Please sign in to comment.