diff options
| author | Eder Bastos <bastos.eder@gmail.com> | 2015-05-14 22:48:22 -0400 |
|---|---|---|
| committer | Eder Bastos <bastos.eder@gmail.com> | 2015-05-15 10:45:00 -0400 |
| commit | ba591ea1eeda4d4a6645b45727e7790c48f51f23 (patch) | |
| tree | 96d6e607a1145f97da73319e537d46e6a33c80a8 /Source/Android/app/src/main/java | |
| parent | bb7f8c67534ee4448d51a1f08cd428dd6a42f5ef (diff) | |
Android: Add Settings Activity to new UI.
Diffstat (limited to 'Source/Android/app/src/main/java')
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."); + } +} |
