summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authorEder Bastos <bastos.eder@gmail.com>2015-05-14 22:48:22 -0400
committerEder Bastos <bastos.eder@gmail.com>2015-05-15 10:45:00 -0400
commitba591ea1eeda4d4a6645b45727e7790c48f51f23 (patch)
tree96d6e607a1145f97da73319e537d46e6a33c80a8 /Source/Android/app/src/main/java
parentbb7f8c67534ee4448d51a1f08cd428dd6a42f5ef (diff)
Android: Add Settings Activity to new UI.
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/GameGridActivity.java28
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/SettingsActivity.java41
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/SettingsFragment.java197
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SettingsSaveService.java30
4 files changed, 293 insertions, 3 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/GameGridActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/GameGridActivity.java
index 15bbb44fff..c0ba984023 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/GameGridActivity.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/GameGridActivity.java
@@ -10,6 +10,7 @@ import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toolbar;
@@ -89,8 +90,8 @@ public final class GameGridActivity extends Activity
* Callback from AddDirectoryActivity. Applies any changes necessary to the GameGridActivity.
*
* @param requestCode An int describing whether the Activity that is returning did so successfully.
- * @param resultCode An int describing what Activity is giving us this callback.
- * @param result The information the returning Activity is providing us.
+ * @param resultCode An int describing what Activity is giving us this callback.
+ * @param result The information the returning Activity is providing us.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent result)
@@ -126,7 +127,27 @@ public final class GameGridActivity extends Activity
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_game_grid, menu);
return true;
+ }
+
+ /**
+ * Called by the framework whenever any actionbar/toolbar icon is clicked.
+ *
+ * @param item The icon that was clicked on.
+ * @return True if the event was handled, false to bubble it up to the OS.
+ */
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item)
+ {
+ switch (item.getItemId())
+ {
+ case R.id.menu_settings:
+ // Launch the Settings Actvity.
+ Intent settings = new Intent(this, SettingsActivity.class);
+ startActivity(settings);
+ return true;
+ }
+ return false;
}
// TODO Replace all of this with a SQLite database
@@ -172,7 +193,8 @@ public final class GameGridActivity extends Activity
}
}
- } catch (Exception ignored)
+ }
+ catch (Exception ignored)
{
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/SettingsActivity.java
new file mode 100644
index 0000000000..fe1ddd14d4
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/SettingsActivity.java
@@ -0,0 +1,41 @@
+package org.dolphinemu.dolphinemu.activities;
+
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import org.dolphinemu.dolphinemu.fragments.SettingsFragment;
+import org.dolphinemu.dolphinemu.services.SettingsSaveService;
+
+public final class SettingsActivity extends Activity
+{
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ // Display the fragment as the main content.
+ getFragmentManager().beginTransaction()
+ .replace(android.R.id.content, new SettingsFragment(), "settings_fragment")
+ .commit();
+ }
+
+ /**
+ * If this is called, the user has left the settings screen (potentially through the
+ * home button) and will expect their changes to be persisted. So we kick off an
+ * IntentService which will do so on a background thread.
+ */
+ @Override
+ protected void onStop()
+ {
+ super.onStop();
+
+ Log.d("DolphinEmulator", "Settings activity stopping. Saving settings to INI...");
+
+ // Copy assets into appropriate locations.
+ Intent settingsSaver = new Intent(this, SettingsSaveService.class);
+ startService(settingsSaver);
+ }
+}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/SettingsFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/SettingsFragment.java
new file mode 100644
index 0000000000..8f77e4a72d
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/SettingsFragment.java
@@ -0,0 +1,197 @@
+package org.dolphinemu.dolphinemu.fragments;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Environment;
+import android.preference.ListPreference;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceManager;
+
+import org.dolphinemu.dolphinemu.R;
+import org.dolphinemu.dolphinemu.utils.EGLHelper;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.microedition.khronos.opengles.GL10;
+
+public final class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener
+{
+ private SharedPreferences mPreferences;
+ private ListPreference mVideoBackendPreference;
+
+ private final EGLHelper mEglHelper = new EGLHelper(EGLHelper.EGL_OPENGL_ES2_BIT);
+ private final String mVendor = mEglHelper.getGL().glGetString(GL10.GL_VENDOR);
+
+ private final String mVersion = mEglHelper.getGL().glGetString(GL10.GL_VERSION);
+
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ // Load the preferences from an XML resource
+ addPreferencesFromResource(R.xml.preferences);
+
+ // TODO Below here is effectively ported from the old VideoSettingsFragment. There is
+ // TODO probably a simpler way to do this, but potentially could require UI discussion/feedback.
+
+ // Setting valid video backends.
+ mVideoBackendPreference = (ListPreference) findPreference("gpuPref");
+ final boolean deviceSupportsGL = mEglHelper.supportsOpenGL();
+ final boolean deviceSupportsGLES3 = mEglHelper.supportsGLES3();
+
+ if (deviceSupportsGL)
+ {
+ mVideoBackendPreference.setEntries(R.array.videoBackendEntriesGL);
+ mVideoBackendPreference.setEntryValues(R.array.videoBackendValuesGL);
+ }
+ else if (deviceSupportsGLES3)
+ {
+ mVideoBackendPreference.setEntries(R.array.videoBackendEntriesGLES3);
+ mVideoBackendPreference.setEntryValues(R.array.videoBackendValuesGLES3);
+ }
+ else
+ {
+ mVideoBackendPreference.setEntries(R.array.videoBackendEntriesNoGLES3);
+ mVideoBackendPreference.setEntryValues(R.array.videoBackendValuesNoGLES3);
+ }
+
+ //
+ // Set available post processing shaders
+ //
+
+ List<CharSequence> shader_names = new ArrayList<CharSequence>();
+ List<CharSequence> shader_values = new ArrayList<CharSequence>();
+
+ // Disabled option
+ shader_names.add("Disabled");
+ shader_values.add("");
+
+ // TODO Since shaders are included with the APK, we know what they are at build-time. We should
+ // TODO be able to run this logic somehow at build-time and not rely on the device doing it.
+
+ File shaders_folder = new File(Environment.getExternalStorageDirectory() + File.separator + "dolphin-emu" + File.separator + "Shaders");
+ if (shaders_folder.exists())
+ {
+ File[] shaders = shaders_folder.listFiles();
+ for (File file : shaders)
+ {
+ if (file.isFile())
+ {
+ String filename = file.getName();
+ if (filename.endsWith(".glsl"))
+ {
+ // Strip the extension and put it in to the list
+ shader_names.add(filename.substring(0, filename.lastIndexOf('.')));
+ shader_values.add(filename.substring(0, filename.lastIndexOf('.')));
+ }
+ }
+ }
+ }
+
+ final ListPreference shader_preference = (ListPreference) findPreference("postProcessingShader");
+ shader_preference.setEntries(shader_names.toArray(new CharSequence[shader_names.size()]));
+ shader_preference.setEntryValues(shader_values.toArray(new CharSequence[shader_values.size()]));
+
+ //
+ // Disable all options if Software Rendering is used.
+ //
+ // Note that the numeric value in 'getPreference()'
+ // denotes the placement on the UI. So if more elements are
+ // added to the video settings, these may need to change.
+ //
+ mPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+
+ if (mVideoBackendPreference.getValue().equals("Software Renderer"))
+ {
+ findPreference("enhancements").setEnabled(false);
+ findPreference("hacks").setEnabled(false);
+ findPreference("showFPS").setEnabled(false);
+ }
+ else if (mVideoBackendPreference.getValue().equals("OGL"))
+ {
+ findPreference("enhancements").setEnabled(true);
+ findPreference("hacks").setEnabled(true);
+ findPreference("showFPS").setEnabled(true);
+
+ // Check if we support stereo
+ // If we support desktop GL then we must support at least OpenGL 3.2
+ // If we only support OpenGLES then we need both OpenGLES 3.1 and AEP
+ if ((mEglHelper.supportsOpenGL() && mEglHelper.GetVersion() >= 320) ||
+ (mEglHelper.supportsGLES3() && mEglHelper.GetVersion() >= 310 && mEglHelper.SupportsExtension("GL_ANDROID_extension_pack_es31a")))
+ findPreference("StereoscopyScreen").setEnabled(true);
+ else
+ findPreference("StereoscopyScreen").setEnabled(false);
+ }
+
+ // Also set a listener, so that if someone changes the video backend, it will disable
+ // the video settings, upon the user choosing "Software Rendering".
+ mPreferences.registerOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences preferences, String key)
+ {
+ if (key.equals("gpuPref"))
+ {
+ if (preferences.getString(key, "Software Renderer").equals("Software Renderer"))
+ {
+ findPreference("enhancements").setEnabled(false);
+ findPreference("hacks").setEnabled(false);
+ findPreference("showFPS").setEnabled(false);
+ }
+ else if (preferences.getString(key, "Software Renderer").equals("OGL"))
+ {
+ findPreference("enhancements").setEnabled(true);
+ findPreference("hacks").setEnabled(true);
+ findPreference("showFPS").setEnabled(true);
+
+ // Create an alert telling them that their phone sucks
+ if (mEglHelper.supportsGLES3()
+ && mVendor.equals("Qualcomm")
+ && getQualcommVersion() == 14.0f)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setTitle(R.string.device_compat_warning);
+ builder.setMessage(R.string.device_gles3compat_warning_msg);
+ builder.setPositiveButton(R.string.yes, null);
+ builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener()
+ {
+ public void onClick(DialogInterface dialog, int which)
+ {
+ // Get an editor.
+ SharedPreferences.Editor editor = mPreferences.edit();
+ editor.putString("gpuPref", "Software Renderer");
+ editor.apply();
+ mVideoBackendPreference.setValue("Software Renderer");
+ }
+ });
+ builder.show();
+ }
+ }
+ }
+ }
+
+ private float getQualcommVersion()
+ {
+ final int start = mVersion.indexOf("V@") + 2;
+ final StringBuilder versionBuilder = new StringBuilder();
+
+ for (int i = start; i < mVersion.length(); i++)
+ {
+ char c = mVersion.charAt(i);
+
+ // End of numeric portion of version string.
+ if (c == ' ')
+ break;
+
+ versionBuilder.append(c);
+ }
+
+ return Float.parseFloat(versionBuilder.toString());
+ }
+}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SettingsSaveService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SettingsSaveService.java
new file mode 100644
index 0000000000..3af7aef1d6
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SettingsSaveService.java
@@ -0,0 +1,30 @@
+package org.dolphinemu.dolphinemu.services;
+
+import android.app.IntentService;
+import android.content.Intent;
+import android.util.Log;
+
+import org.dolphinemu.dolphinemu.settings.UserPreferences;
+
+/**
+ * IntentServices, unlike regular services, inherently run on a background thread.
+ * This IntentService saves all the options the user set in the Java-based UI into
+ * INI files the native code can read.
+ */
+public final class SettingsSaveService extends IntentService
+{
+ private static final String TAG = "DolphinEmulator";
+
+ public SettingsSaveService()
+ {
+ super("SettingsSaveService");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent)
+ {
+ Log.v(TAG, "Saving settings to INI files...");
+ UserPreferences.SavePrefsToIni(this);
+ Log.v(TAG, "Save successful.");
+ }
+}