summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authormahdihijazi <mahdi.hijaz@hotmail.com>2018-01-08 18:06:10 +0100
committermahdihijazi <mahdi.hijaz@hotmail.com>2018-01-24 12:15:59 +0100
commitae8b469b80cd2da1cb83d5b77a801ba1d074dcd2 (patch)
treeb7657b49439304e0149bc50750c498d9b2ccd991 /Source/Android/app/src/main/java
parent9a166dca572d7220c345df030921bbd466381c91 (diff)
Android: Don't hard code the user dircetory path to /sdcard/dolphin-emu
Android is allowed to pick any path for the external storage media and that's why we should always use Environment.getExternalStorageDirectory() to get the external storage path
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/DolphinApplication.java2
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.java15
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java75
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java7
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java26
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java5
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java5
7 files changed, 108 insertions, 27 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/DolphinApplication.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/DolphinApplication.java
index 6c2e3be39d..ee051a68a7 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/DolphinApplication.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/DolphinApplication.java
@@ -15,8 +15,6 @@ public class DolphinApplication extends Application
{
super.onCreate();
- NativeLibrary.SetUserDirectory(""); // Empty string means use the default path
-
if (PermissionsHandler.hasWriteAccess(getApplicationContext()))
DirectoryInitializationService.startService(getApplicationContext());
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.java
index 6b039e185f..39eb383ae7 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.java
@@ -158,13 +158,22 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C
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
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 7d41df25ac..d23b478065 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
@@ -10,6 +10,7 @@ import android.app.IntentService;
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.FileOutputStream;
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 final class DirectoryInitializationService extends IntentService
@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 final class DirectoryInitializationService extends IntentService
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 =
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java
index cd942eb091..9ea6828b67 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java
@@ -162,6 +162,13 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
}
@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)
{
return mPresenter.getSettings(file);
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java
index 20cf5bcc78..ca25ea5d2b 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java
@@ -6,6 +6,7 @@ import android.os.Bundle;
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 final class SettingsActivityPresenter
{
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 final class SettingsActivityPresenter
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 @@ public final class SettingsActivityPresenter
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);
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java
index 686338eaee..d7649a729d 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java
@@ -119,6 +119,11 @@ public interface SettingsActivityView
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.
*
* @param receiver the broadcast receiver for the DirectoryInitializationService
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java
index a57b116e2a..385b65476f 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java
@@ -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.IntSetting;
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 final class SettingsFile
@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)