diff --git a/Source/Android/app/build.gradle b/Source/Android/app/build.gradle index 150125a7ab..8f7134c290 100644 --- a/Source/Android/app/build.gradle +++ b/Source/Android/app/build.gradle @@ -12,7 +12,7 @@ android { defaultConfig { applicationId "org.dolphinemu.dolphinemu" - minSdkVersion 18 + minSdkVersion 21 targetSdkVersion 21 // TODO This should be set to the Buildbot build number for release builds, and be "1" for debug builds. diff --git a/Source/Android/app/src/main/AndroidManifest.xml b/Source/Android/app/src/main/AndroidManifest.xml index 31a673c51d..3c87d9fd41 100644 --- a/Source/Android/app/src/main/AndroidManifest.xml +++ b/Source/Android/app/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ @@ -48,39 +48,10 @@ android:theme="@style/DolphinSettingsGamecube" android:label="@string/grid_menu_settings"/> - - - - - - - - - - - - - - - - diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutActivity.java deleted file mode 100644 index 8e8b0a3269..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutActivity.java +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.utils.EGLHelper; - -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; -import android.os.Bundle; -import android.support.v13.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; - - -/** - * Activity for the about menu, which displays info - * related to the CPU and GPU. Along with misc other info. - */ -public final class AboutActivity extends Activity -{ - private final EGLHelper eglHelper = new EGLHelper(EGLHelper.EGL_OPENGL_ES2_BIT); - - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // Set the view pager - setContentView(R.layout.viewpager); - - // Initialize the viewpager. - final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); - viewPager.setAdapter(new ViewPagerAdapter(getFragmentManager())); - } - - @Override - public void onDestroy() - { - super.onDestroy(); - - eglHelper.closeHelper(); - } - - /** - * {@link FragmentPagerAdapter} subclass responsible for handling - * the individual {@link Fragment}s within the {@link ViewPager}. - */ - private final class ViewPagerAdapter extends FragmentPagerAdapter - { - private final String[] pageTitles = { - getString(R.string.general), - getString(R.string.cpu), - getString(R.string.gles_two), - getString(R.string.gles_three), - getString(R.string.desktop_gl), - }; - - public ViewPagerAdapter(FragmentManager fm) - { - super(fm); - } - - @Override - public Fragment getItem(int position) - { - if (position == 0) - { - return new DolphinInfoFragment(); - } - else if (position == 1) - { - return new CPUInfoFragment(); // CPU - } - else if (position == 2) // GLES 2 - { - return new GLES2InfoFragment(); - } - else if (position == 3) // GLES 3 or OpenGL (depending on circumstances) - { - if (eglHelper.supportsGLES3()) - return new GLES3InfoFragment(); - else - return new GLInfoFragment(); // GLES3 not supported, but OpenGL is. - } - else if (position == 4) // OpenGL fragment - { - return new GLInfoFragment(); - } - - // This should never happen. - return null; - } - - @Override - public int getCount() - { - if (eglHelper.supportsGLES3() && eglHelper.supportsOpenGL()) - { - return 5; - } - else if (!eglHelper.supportsGLES3() && !eglHelper.supportsOpenGL()) - { - return 3; - } - else // Either regular OpenGL or GLES3 isn't supported - { - return 4; - } - } - - @Override - public CharSequence getPageTitle(int position) - { - return pageTitles[position]; - } - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutFragmentItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutFragmentItem.java deleted file mode 100644 index b7bae216ae..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutFragmentItem.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -/** - * Represents an item within an info fragment in the About menu. - */ -final class AboutFragmentItem -{ - private final String title; - private final String subtitle; - - /** - * Constructor - * - * @param title The title of this item. - * @param subtitle The subtitle for this item. - */ - public AboutFragmentItem(String title, String subtitle) - { - this.title = title; - this.subtitle = subtitle; - } - - /** - * Gets the title of this item. - * - * @return the title of this item. - */ - public String getTitle() - { - return title; - } - - /** - * Gets the subtitle of this item. - * - * @return the subtitle of this item. - */ - public String getSubTitle() - { - return subtitle; - } -} \ No newline at end of file diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutInfoFragmentAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutInfoFragmentAdapter.java deleted file mode 100644 index 926c4cdb88..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/AboutInfoFragmentAdapter.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -import java.util.List; - -import org.dolphinemu.dolphinemu.R; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.TextView; - -/** - * {@link ArrayAdapter} subclass specifically for the - * information fragments within the about menu. - */ -final class AboutInfoFragmentAdapter extends ArrayAdapter -{ - private final int id; - private final List items; - - public AboutInfoFragmentAdapter(Context ctx, int id, List items) - { - super(ctx, id, items); - - this.id = id; - this.items = items; - } - - @Override - public AboutFragmentItem getItem(int index) - { - return items.get(index); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) - { - if (convertView == null) - { - LayoutInflater vi = LayoutInflater.from(getContext()); - convertView = vi.inflate(id, parent, false); - } - - final AboutFragmentItem item = items.get(position); - if (item != null) - { - TextView title = (TextView) convertView.findViewById(R.id.AboutItemTitle); - TextView subtitle = (TextView) convertView.findViewById(R.id.AboutItemSubTitle); - - if (title != null) - title.setText(item.getTitle()); - - if (subtitle != null) - subtitle.setText(item.getSubTitle()); - } - - return convertView; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/CPUInfoFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/CPUInfoFragment.java deleted file mode 100644 index 01d4d763a6..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/CPUInfoFragment.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -import java.util.ArrayList; -import java.util.List; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.utils.CPUHelper; - -import android.app.ListFragment; -import android.os.Build; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; - -/** - * {@link ListFragment class that is responsible - * for displaying information related to the CPU. - */ -public final class CPUInfoFragment extends ListFragment -{ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); - List items = new ArrayList(); - - CPUHelper cpuHelper = new CPUHelper(getActivity()); - - items.add(new AboutFragmentItem(getString(R.string.cpu_info), cpuHelper.getProcessorInfo())); - items.add(new AboutFragmentItem(getString(R.string.cpu_type), cpuHelper.getProcessorType())); - items.add(new AboutFragmentItem(getString(R.string.cpu_abi_one), Build.CPU_ABI)); - items.add(new AboutFragmentItem(getString(R.string.cpu_abi_two), Build.CPU_ABI2)); - items.add(new AboutFragmentItem(getString(R.string.num_cores), Integer.toString(cpuHelper.getNumCores()))); - items.add(new AboutFragmentItem(getString(R.string.cpu_features), cpuHelper.getFeatures())); - items.add(new AboutFragmentItem(getString(R.string.cpu_hardware), Build.HARDWARE)); - if (CPUHelper.isARM()) - items.add(new AboutFragmentItem(getString(R.string.cpu_implementer), cpuHelper.getImplementer())); - - AboutInfoFragmentAdapter adapter = new AboutInfoFragmentAdapter(getActivity(), R.layout.about_layout, items); - rootView.setAdapter(adapter); - - return rootView; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/DolphinInfoFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/DolphinInfoFragment.java deleted file mode 100644 index 3b632514cb..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/DolphinInfoFragment.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -import android.app.ListFragment; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; - -import java.util.ArrayList; -import java.util.List; - -import org.dolphinemu.dolphinemu.NativeLibrary; -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.utils.EGLHelper; - -/** - * Represents the about screen. - */ -public final class DolphinInfoFragment extends ListFragment -{ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); - EGLHelper eglHelper = new EGLHelper(EGLHelper.EGL_OPENGL_ES2_BIT); - - final String yes = getString(R.string.yes); - final String no = getString(R.string.no); - - List Input = new ArrayList(); - Input.add(new AboutFragmentItem(getString(R.string.build_revision), NativeLibrary.GetVersionString())); - Input.add(new AboutFragmentItem(getString(R.string.supports_gles3), eglHelper.supportsGLES3() ? yes : no)); - Input.add(new AboutFragmentItem(getString(R.string.supports_neon), NativeLibrary.SupportsNEON() ? yes : no)); - - AboutInfoFragmentAdapter adapter = new AboutInfoFragmentAdapter(getActivity(), R.layout.about_layout, Input); - rootView.setAdapter(adapter); - rootView.setEnabled(false); // Makes the list view non-clickable. - - return rootView; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLES2InfoFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLES2InfoFragment.java deleted file mode 100644 index b06e3937b8..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLES2InfoFragment.java +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -import android.app.ListFragment; -import android.opengl.GLES20; -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.about.Limit.Type; -import org.dolphinemu.dolphinemu.utils.EGLHelper; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link ListFragment} responsible for displaying - * information relating to OpenGL ES 2. - */ -public final class GLES2InfoFragment extends ListFragment -{ - private final Limit[] Limits = { - new Limit("Vendor", GLES20.GL_VENDOR, Type.STRING), - new Limit("Version", GLES20.GL_VERSION, Type.STRING), - new Limit("Renderer", GLES20.GL_RENDERER, Type.STRING), - new Limit("GLSL version", GLES20.GL_SHADING_LANGUAGE_VERSION, Type.STRING), - // GLES 2.0 Limits - new Limit("Aliased Point Size", GLES20.GL_ALIASED_POINT_SIZE_RANGE, Type.INTEGER_RANGE), - new Limit("Aliased Line Width ", GLES20.GL_ALIASED_LINE_WIDTH_RANGE, Type.INTEGER_RANGE), - new Limit("Max Texture Size", GLES20.GL_MAX_TEXTURE_SIZE, Type.INTEGER), - new Limit("Viewport Dimensions", GLES20.GL_MAX_VIEWPORT_DIMS, Type.INTEGER_RANGE), - new Limit("Subpixel Bits", GLES20.GL_SUBPIXEL_BITS, Type.INTEGER), - new Limit("Max Vertex Attributes", GLES20.GL_MAX_VERTEX_ATTRIBS, Type.INTEGER), - new Limit("Max Vertex Uniform Vectors", GLES20.GL_MAX_VERTEX_UNIFORM_VECTORS, Type.INTEGER), - new Limit("Max Varying Vectors", GLES20.GL_MAX_VARYING_VECTORS, Type.INTEGER), - new Limit("Max Combined Texture Units", GLES20.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, Type.INTEGER), - new Limit("Max Vertex Texture Units", GLES20.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, Type.INTEGER), - new Limit("Max Texture Units", GLES20.GL_MAX_TEXTURE_IMAGE_UNITS, Type.INTEGER), - new Limit("Max Fragment Uniform Vectors", GLES20.GL_MAX_FRAGMENT_UNIFORM_VECTORS, Type.INTEGER), - new Limit("Max Cubemap Texture Size", GLES20.GL_MAX_CUBE_MAP_TEXTURE_SIZE, Type.INTEGER), - new Limit("Shader Binary Formats", GLES20.GL_NUM_SHADER_BINARY_FORMATS, Type.INTEGER), - new Limit("Max Framebuffer Size", GLES20.GL_MAX_RENDERBUFFER_SIZE, Type.INTEGER), - }; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - final EGLHelper eglHelper = new EGLHelper(EGLHelper.EGL_OPENGL_ES2_BIT); - - ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); - List Input = new ArrayList(); - - for (Limit limit : Limits) - { - Log.i("GLES2InfoFragment", "Getting enum " + limit.name); - Input.add(new AboutFragmentItem(limit.name, limit.GetValue(eglHelper))); - } - - // Get extensions manually - String[] extensions = eglHelper.glGetString(GLES20.GL_EXTENSIONS).split(" "); - StringBuilder extensionsBuilder = new StringBuilder(); - for (String extension : extensions) - { - extensionsBuilder.append(extension).append('\n'); - } - Input.add(new AboutFragmentItem("OpenGL ES 2.0 Extensions", extensionsBuilder.toString())); - - AboutInfoFragmentAdapter adapter = new AboutInfoFragmentAdapter(getActivity(), R.layout.about_layout, Input); - rootView.setAdapter(adapter); - - return rootView; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLES3InfoFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLES3InfoFragment.java deleted file mode 100644 index f49e9a8e52..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLES3InfoFragment.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -import android.app.ListFragment; -import android.opengl.GLES30; -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.about.Limit.Type; -import org.dolphinemu.dolphinemu.utils.EGLHelper; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link ListFragment} responsible for displaying - * information relating to OpenGL ES 3. - */ -public final class GLES3InfoFragment extends ListFragment -{ - private final Limit[] Limits = { - new Limit("Vendor", GLES30.GL_VENDOR, Type.STRING), - new Limit("Version", GLES30.GL_VERSION, Type.STRING), - new Limit("Renderer", GLES30.GL_RENDERER, Type.STRING), - new Limit("GLSL version", GLES30.GL_SHADING_LANGUAGE_VERSION, Type.STRING), - // GLES 2.0 Limits - new Limit("Aliased Point Size", GLES30.GL_ALIASED_POINT_SIZE_RANGE, Type.INTEGER_RANGE), - new Limit("Aliased Line Width ", GLES30.GL_ALIASED_LINE_WIDTH_RANGE, Type.INTEGER_RANGE), - new Limit("Max Texture Size", GLES30.GL_MAX_TEXTURE_SIZE, Type.INTEGER), - new Limit("Viewport Dimensions", GLES30.GL_MAX_VIEWPORT_DIMS, Type.INTEGER_RANGE), - new Limit("Subpixel Bits", GLES30.GL_SUBPIXEL_BITS, Type.INTEGER), - new Limit("Max Vertex Attributes", GLES30.GL_MAX_VERTEX_ATTRIBS, Type.INTEGER), - new Limit("Max Vertex Uniform Vectors", GLES30.GL_MAX_VERTEX_UNIFORM_VECTORS, Type.INTEGER), - new Limit("Max Varying Vectors", GLES30.GL_MAX_VARYING_VECTORS, Type.INTEGER), - new Limit("Max Combined Texture Units", GLES30.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, Type.INTEGER), - new Limit("Max Vertex Texture Units", GLES30.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, Type.INTEGER), - new Limit("Max Texture Units", GLES30.GL_MAX_TEXTURE_IMAGE_UNITS, Type.INTEGER), - new Limit("Max Fragment Uniform Vectors", GLES30.GL_MAX_FRAGMENT_UNIFORM_VECTORS, Type.INTEGER), - new Limit("Max Cubemap Texture Size", GLES30.GL_MAX_CUBE_MAP_TEXTURE_SIZE, Type.INTEGER), - new Limit("Shader Binary Formats", GLES30.GL_NUM_SHADER_BINARY_FORMATS, Type.INTEGER), - new Limit("Max Framebuffer Size", GLES30.GL_MAX_RENDERBUFFER_SIZE, Type.INTEGER), - // GLES 3.0 limits - new Limit("Max 3D Texture size", GLES30.GL_MAX_3D_TEXTURE_SIZE, Type.INTEGER), - new Limit("Max Element Vertices", GLES30.GL_MAX_ELEMENTS_VERTICES, Type.INTEGER), - new Limit("Max Element Indices", GLES30.GL_MAX_ELEMENTS_INDICES, Type.INTEGER), - new Limit("Max Draw Buffers", GLES30.GL_MAX_DRAW_BUFFERS, Type.INTEGER), - new Limit("Max Fragment Uniform Components", GLES30.GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, Type.INTEGER), - new Limit("Max Vertex Uniform Components", GLES30.GL_MAX_VERTEX_UNIFORM_COMPONENTS, Type.INTEGER), - new Limit("Number of Extensions", GLES30.GL_NUM_EXTENSIONS, Type.INTEGER), - new Limit("Max Array Texture Layers", GLES30.GL_MAX_ARRAY_TEXTURE_LAYERS, Type.INTEGER), - new Limit("Min Program Texel Offset", GLES30.GL_MIN_PROGRAM_TEXEL_OFFSET, Type.INTEGER), - new Limit("Max Program Texel Offset", GLES30.GL_MAX_PROGRAM_TEXEL_OFFSET, Type.INTEGER), - new Limit("Max Varying Components", GLES30.GL_MAX_VARYING_COMPONENTS, Type.INTEGER), - new Limit("Max TF Varying Length", GLES30.GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, Type.INTEGER), - new Limit("Max TF Separate Components", GLES30.GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, Type.INTEGER), - new Limit("Max TF Interleaved Components", GLES30.GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, Type.INTEGER), - new Limit("Max TF Separate Attributes", GLES30.GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, Type.INTEGER), - new Limit("Max Color Attachments", GLES30.GL_MAX_COLOR_ATTACHMENTS, Type.INTEGER), - new Limit("Max Samples", GLES30.GL_MAX_SAMPLES, Type.INTEGER), - new Limit("Max Vertex UBOs", GLES30.GL_MAX_VERTEX_UNIFORM_BLOCKS, Type.INTEGER), - new Limit("Max Fragment UBOs", GLES30.GL_MAX_FRAGMENT_UNIFORM_BLOCKS, Type.INTEGER), - new Limit("Max Combined UBOs", GLES30.GL_MAX_COMBINED_UNIFORM_BLOCKS, Type.INTEGER), - new Limit("Max Uniform Buffer Bindings", GLES30.GL_MAX_UNIFORM_BUFFER_BINDINGS, Type.INTEGER), - new Limit("Max UBO Size", GLES30.GL_MAX_UNIFORM_BLOCK_SIZE, Type.INTEGER), - new Limit("Max Combined Vertex Uniform Components", GLES30.GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, Type.INTEGER), - new Limit("Max Combined Fragment Uniform Components", GLES30.GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, Type.INTEGER), - new Limit("UBO Alignment", GLES30.GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, Type.INTEGER), - new Limit("Max Vertex Output Components", GLES30.GL_MAX_VERTEX_OUTPUT_COMPONENTS, Type.INTEGER), - new Limit("Max Fragment Input Components", GLES30.GL_MAX_FRAGMENT_INPUT_COMPONENTS, Type.INTEGER), - new Limit("Max Server Wait Timeout", GLES30.GL_MAX_SERVER_WAIT_TIMEOUT, Type.INTEGER), - new Limit("Program Binary Formats", GLES30.GL_NUM_PROGRAM_BINARY_FORMATS, Type.INTEGER), - new Limit("Max Element Index", GLES30.GL_MAX_ELEMENT_INDEX, Type.INTEGER), - new Limit("Sample Counts", GLES30.GL_NUM_SAMPLE_COUNTS, Type.INTEGER), - }; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - final EGLHelper eglHelper = new EGLHelper(EGLHelper.EGL_OPENGL_ES3_BIT_KHR); - - ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); - List Input = new ArrayList(); - - for (Limit limit : Limits) - { - Log.i("GLES3InfoFragment", "Getting enum " + limit.name); - Input.add(new AboutFragmentItem(limit.name, limit.GetValue(eglHelper))); - } - - // Get extensions manually - int numExtensions = eglHelper.glGetInteger(GLES30.GL_NUM_EXTENSIONS); - StringBuilder extensionsBuilder = new StringBuilder(); - for (int i = 0; i < numExtensions; i++) - { - extensionsBuilder.append(eglHelper.glGetStringi(GLES30.GL_EXTENSIONS, i)).append('\n'); - } - Input.add(new AboutFragmentItem("OpenGL ES 3.0 Extensions", extensionsBuilder.toString())); - - AboutInfoFragmentAdapter adapter = new AboutInfoFragmentAdapter(getActivity(), R.layout.about_layout, Input); - rootView.setAdapter(adapter); - - return rootView; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLInfoFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLInfoFragment.java deleted file mode 100644 index 44f300ba8f..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/GLInfoFragment.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -import android.app.ListFragment; -import android.opengl.GLES20; -import android.opengl.GLES30; -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.about.Limit.Type; -import org.dolphinemu.dolphinemu.utils.EGLHelper; - -import java.util.ArrayList; -import java.util.List; - -import javax.microedition.khronos.opengles.GL10; - -/** - * {@link ListFragment} responsible for displaying - * information relating to OpenGL. - */ -public final class GLInfoFragment extends ListFragment -{ - private final Limit[] Limits = { - new Limit("Vendor", GL10.GL_VENDOR, Type.STRING), - new Limit("Version", GL10.GL_VERSION, Type.STRING), - new Limit("Renderer", GL10.GL_RENDERER, Type.STRING), - new Limit("GLSL version", GLES20.GL_SHADING_LANGUAGE_VERSION, Type.STRING), - }; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - final EGLHelper eglHelper = new EGLHelper(EGLHelper.EGL_OPENGL_BIT); - - ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); - List Input = new ArrayList(); - - for (Limit limit : Limits) - { - Log.i("GLInfoFragment", "Getting enum " + limit.name); - Input.add(new AboutFragmentItem(limit.name, limit.GetValue(eglHelper))); - } - - // Get extensions manually - int numExtensions = eglHelper.glGetInteger(GLES30.GL_NUM_EXTENSIONS); - StringBuilder extensionsBuilder = new StringBuilder(); - for (int i = 0; i < numExtensions; i++) - { - extensionsBuilder.append(eglHelper.glGetStringi(GL10.GL_EXTENSIONS, i)).append('\n'); - } - Input.add(new AboutFragmentItem("OpenGL Extensions", extensionsBuilder.toString())); - - AboutInfoFragmentAdapter adapter = new AboutInfoFragmentAdapter(getActivity(), R.layout.about_layout, Input); - rootView.setAdapter(adapter); - - return rootView; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/Limit.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/Limit.java deleted file mode 100644 index 973a13273e..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/about/Limit.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright 2014 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.about; - -import org.dolphinemu.dolphinemu.utils.EGLHelper; - -final class Limit -{ - /** - * Possible types a Limit can be. - */ - enum Type - { - /** Generic string */ - STRING, - /** Integer constant */ - INTEGER, - /** Range of integers */ - INTEGER_RANGE, - } - - /** Name of this limit */ - public final String name; - /** The GL constant that represents this limit.*/ - public final int glEnum; - /** The {@link Type} of this limit. */ - public final Type type; - - /** - * Constructor - * - * @param name Name of the limit. - * @param glEnum The GL constant that represents this limit. - * @param type The {@link Type} of this limit. - */ - public Limit(String name, int glEnum, Type type) - { - this.name = name; - this.glEnum = glEnum; - this.type = type; - } - - /** - * Retrieves the information represented by this limit. - * - * @param context {@link EGLHelper} context to retrieve the limit with. - * - * @return the information represented by this limit. - */ - public String GetValue(EGLHelper context) - { - if (type == Type.INTEGER) - { - return Integer.toString(context.glGetInteger(glEnum)); - } - else if (type == Type.INTEGER_RANGE) - { - int[] data = new int[2]; - context.getGL().glGetIntegerv(glEnum, data, 0); - - return String.format("[%d, %d]", data[0], data[1]); - } - - // If neither of the above type, assume it's a string. - return context.glGetString(glEnum); - } -} \ No newline at end of file diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index aee84a4b31..14ca650dd4 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -18,7 +18,7 @@ import android.view.View; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.fragments.EmulationFragment; -import org.dolphinemu.dolphinemu.settings.input.InputConfigFragment; +import org.dolphinemu.dolphinemu.utils.InputConfigFragment; import java.util.List; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/MotionAlertDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java similarity index 95% rename from Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/MotionAlertDialog.java rename to Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java index 58d3a933a1..4f9b7de0a3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/MotionAlertDialog.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java @@ -1,9 +1,4 @@ -package org.dolphinemu.dolphinemu.settings.input; - -import java.util.ArrayList; -import java.util.List; - -import org.dolphinemu.dolphinemu.NativeLibrary; +package org.dolphinemu.dolphinemu.dialogs; import android.app.AlertDialog; import android.content.Context; @@ -13,11 +8,17 @@ import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; +import org.dolphinemu.dolphinemu.NativeLibrary; +import org.dolphinemu.dolphinemu.utils.InputConfigFragment; + +import java.util.ArrayList; +import java.util.List; + /** * {@link AlertDialog} derivative that listens for * motion events from controllers and joysticks. */ -final class MotionAlertDialog extends AlertDialog +public final class MotionAlertDialog extends AlertDialog { // The selected input preference private final Preference inputPref; @@ -27,7 +28,7 @@ final class MotionAlertDialog extends AlertDialog /** * Constructor - * + * * @param ctx The current {@link Context}. * @param inputPref The Preference to show this dialog for. */ @@ -57,7 +58,7 @@ final class MotionAlertDialog extends AlertDialog return false; } } - + // Method that will be called within dispatchGenericMotionEvent // that handles joystick/controller movements. @@ -115,7 +116,7 @@ final class MotionAlertDialog extends AlertDialog return super.dispatchKeyEvent(event); } - + @Override public boolean dispatchGenericMotionEvent(MotionEvent event) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java deleted file mode 100644 index ba49c59e4c..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java +++ /dev/null @@ -1,316 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.emulation; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.view.InputDevice; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.Window; -import android.view.WindowManager.LayoutParams; - -import org.dolphinemu.dolphinemu.NativeLibrary; -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.settings.input.InputConfigFragment; - -import java.util.List; - -/** - * This is the activity where all of the emulation handling happens. - * This activity is responsible for displaying the SurfaceView that we render to. - */ -public final class EmulationActivity extends Activity -{ - private boolean Running; - private boolean IsActionBarHidden = false; - private SharedPreferences sharedPrefs; - - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); - - // Request window features for the emulation view. - getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); - getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN); - getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); - - // Set the transparency for the action bar. - ColorDrawable actionBarBackground = new ColorDrawable(Color.parseColor("#303030")); - actionBarBackground.setAlpha(175); - getActionBar().setBackgroundDrawable(actionBarBackground); - - // Get the intent passed from the GameList when the game - // was selected. This is so the path of the game can be retrieved - // and set on the native side of the code so the emulator can actually - // load the game. - Intent gameToEmulate = getIntent(); - NativeLibrary.SetFilename(gameToEmulate.getStringExtra("SelectedGame")); - Running = true; - - // Set the emulation window. - setContentView(R.layout.emulation_view); - - // If the input overlay was previously disabled, then don't show it. - if (!sharedPrefs.getBoolean("showInputOverlay", true)) - { - findViewById(R.id.emulationControlOverlay).setVisibility(View.INVISIBLE); - } - - // Hide the action bar by default so it doesn't get in the way. - getActionBar().hide(); - IsActionBarHidden = true; - } - - @Override - public void onStop() - { - super.onStop(); - - if (Running) - NativeLibrary.StopEmulation(); - } - - @Override - public void onPause() - { - super.onPause(); - - if (Running) - NativeLibrary.PauseEmulation(); - } - - @Override - public void onResume() - { - super.onResume(); - - if (Running) - NativeLibrary.UnPauseEmulation(); - } - - @Override - public void onDestroy() - { - super.onDestroy(); - - if (Running) - { - NativeLibrary.StopEmulation(); - Running = false; - } - } - - @Override - public void onBackPressed() - { - // The back button in the emulation - // window is the toggle for the action bar. - if (IsActionBarHidden) - { - IsActionBarHidden = false; - getActionBar().show(); - } - else - { - IsActionBarHidden = true; - getActionBar().hide(); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) - { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.emuwindow_overlay, menu); - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) - { - // Determine which string the "Enable Input Overlay" menu item should have - // depending on its visibility at the time of preparing the options menu. - if (!sharedPrefs.getBoolean("showInputOverlay", true)) - { - menu.findItem(R.id.enableInputOverlay).setTitle(R.string.enable_input_overlay); - } - else - { - menu.findItem(R.id.enableInputOverlay).setTitle(R.string.disable_input_overlay); - } - - return true; - } - - @Override - public boolean onMenuItemSelected(int itemId, MenuItem item) - { - switch(item.getItemId()) - { - // Enable/Disable input overlay. - case R.id.enableInputOverlay: - { - View overlay = findViewById(R.id.emulationControlOverlay); - - // Show the overlay - if (item.getTitle().equals(getString(R.string.enable_input_overlay))) - { - overlay.setVisibility(View.VISIBLE); - item.setTitle(R.string.disable_input_overlay); - sharedPrefs.edit().putBoolean("showInputOverlay", true).apply(); - } - else // Hide the overlay - { - overlay.setVisibility(View.INVISIBLE); - item.setTitle(R.string.enable_input_overlay); - sharedPrefs.edit().putBoolean("showInputOverlay", false).apply(); - } - - return true; - } - - // Screenshot capturing - case R.id.takeScreenshot: - NativeLibrary.SaveScreenShot(); - return true; - - // Save state slots - case R.id.saveSlot1: - NativeLibrary.SaveState(0); - return true; - - case R.id.saveSlot2: - NativeLibrary.SaveState(1); - return true; - - case R.id.saveSlot3: - NativeLibrary.SaveState(2); - return true; - - case R.id.saveSlot4: - NativeLibrary.SaveState(3); - return true; - - case R.id.saveSlot5: - NativeLibrary.SaveState(4); - return true; - - // Load state slots - case R.id.loadSlot1: - NativeLibrary.LoadState(0); - return true; - - case R.id.loadSlot2: - NativeLibrary.LoadState(1); - return true; - - case R.id.loadSlot3: - NativeLibrary.LoadState(2); - return true; - - case R.id.loadSlot4: - NativeLibrary.LoadState(3); - return true; - - case R.id.loadSlot5: - NativeLibrary.LoadState(4); - return true; - - case R.id.exitEmulation: - { - // Create a confirmation method for quitting the current emulation instance. - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.overlay_exit_emulation); - builder.setMessage(R.string.overlay_exit_emulation_confirm); - builder.setNegativeButton(R.string.no, null); - builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) - { - onDestroy(); - } - }); - builder.show(); - return true; - } - - default: - return super.onMenuItemSelected(itemId, item); - } - } - - // Gets button presses - @Override - public boolean dispatchKeyEvent(KeyEvent event) - { - int action = 0; - - if (Running) - { - switch (event.getAction()) - { - case KeyEvent.ACTION_DOWN: - // Handling the case where the back button is pressed. - if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) - { - onBackPressed(); - return true; - } - - // Normal key events. - action = NativeLibrary.ButtonState.PRESSED; - break; - case KeyEvent.ACTION_UP: - action = NativeLibrary.ButtonState.RELEASED; - break; - default: - return false; - } - InputDevice input = event.getDevice(); - boolean handled = NativeLibrary.onGamePadEvent(InputConfigFragment.getInputDesc(input), event.getKeyCode(), action); - return handled; - } - return false; - } - - @Override - public boolean dispatchGenericMotionEvent(MotionEvent event) - { - if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0) || !Running) - { - return super.dispatchGenericMotionEvent(event); - } - - // Don't attempt to do anything if we are disconnecting a device. - if (event.getActionMasked() == MotionEvent.ACTION_CANCEL) - return true; - - InputDevice input = event.getDevice(); - List motions = input.getMotionRanges(); - - for (InputDevice.MotionRange range : motions) - { - NativeLibrary.onGamePadMoveEvent(InputConfigFragment.getInputDesc(input), range.getAxis(), event.getAxisValue(range.getAxis())); - } - - return true; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/NativeGLSurfaceView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/NativeGLSurfaceView.java deleted file mode 100644 index b867e8fc3e..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/NativeGLSurfaceView.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.emulation; - -import org.dolphinemu.dolphinemu.NativeLibrary; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.SurfaceHolder; -import android.view.SurfaceView; - -/** - * The {@link SurfaceView} that rendering is performed on. - */ -public final class NativeGLSurfaceView extends SurfaceView -{ - private static Thread myRun; - private static boolean Running = false; - private static boolean Created = false; - - /** - * Constructor. - * - * @param context The current {@link Context}. - * @param attribs An AttributeSet for retrieving data from XML files. - */ - public NativeGLSurfaceView(Context context, AttributeSet attribs) - { - super(context, attribs); - - if (!Created) - { - myRun = new Thread() - { - @Override - public void run() { - - NativeLibrary.Run(getHolder().getSurface()); - Created = false; - Running = false; - } - }; - - getHolder().addCallback(new SurfaceHolder.Callback() - { - public void surfaceCreated(SurfaceHolder holder) - { - // TODO Auto-generated method stub - if (!Running) - { - myRun.start(); - Running = true; - } - } - - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) - { - // TODO Auto-generated method stub - } - - public void surfaceDestroyed(SurfaceHolder holder) - { - // TODO Auto-generated method stub - } - }); - - Created = true; - } - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowser.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowser.java deleted file mode 100644 index 7aca53dfc9..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowser.java +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.folderbrowser; - -import android.app.ListFragment; -import android.os.Bundle; -import android.os.Environment; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; - -import java.io.File; -import java.util.*; - -import org.dolphinemu.dolphinemu.NativeLibrary; -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.gamelist.GameListActivity; - -/** - * A basic folder browser {@link ListFragment} that allows - * the user to select ISOs/ROMs for playing within the - * emulator. - *

- * Any valid ISO/ROM selected in this will be added to - * the game list for easy browsing the next time the - * application is used. - *

- * Note that this file browser does not display files - * or directories that are hidden - */ -public final class FolderBrowser extends ListFragment -{ - private FolderBrowserAdapter adapter; - private static File currentDir = null; - - // Populates the FolderView with the given currDir's contents. - private void Fill(File currDir) - { - // Clear the adapter of previous items. - adapter.clear(); - - // Set the activity title to the current directory the FolderBrowser is in. - getActivity().setTitle(String.format(getString(R.string.current_dir), currDir.getName())); - - File[] dirs = currDir.listFiles(); - List dir = new ArrayList(); - List fls = new ArrayList(); - - // Supported extensions to filter by - Set validExts = new HashSet(Arrays.asList(".dff", ".dol", ".elf", ".gcm", ".gcz", ".iso", ".wad", ".wbfs")); - - // If dirs is null, then we don't have access permissions to the selected folder. - if (dirs != null) - { - // Search for any directories or files within the current dir. - for(File entry : dirs) - { - try - { - String entryName = entry.getName(); - boolean hasExtension = (entryName.lastIndexOf(".") != -1); - - // Skip hidden folders/files. - if (!entry.isHidden()) - { - if(entry.isDirectory()) - { - dir.add(new FolderBrowserItem(entryName, entry.getAbsolutePath())); - } - else if (entry.isFile() && hasExtension) - { - if (validExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.')))) - { - fls.add(new FolderBrowserItem(entryName, String.format(getString(R.string.file_size), entry.length()), entry.getAbsolutePath())); - } - } - } - } - catch (Exception ex) - { - Log.e("FolderBrowser", ex.toString()); - } - } - } - - Collections.sort(dir); - Collections.sort(fls); - dir.addAll(fls); - - // Check for a parent directory to the one we're currently in. - if (!currDir.getPath().equalsIgnoreCase("/")) - dir.add(0, new FolderBrowserItem("..", getString(R.string.parent_directory), currDir.getParent())); - - // Add the items to the adapter and notify the adapter users of its new contents. - adapter.addAll(dir); - adapter.notifyDataSetChanged(); - } - - @Override - public void onListItemClick(ListView lv, View v, int position, long id) - { - FolderBrowserItem item = adapter.getItem(position); - if(item.isDirectory()) - { - currentDir = new File(item.getPath()); - Fill(currentDir); - } - else - { - FolderSelected(); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - if(currentDir == null) - currentDir = new File(Environment.getExternalStorageDirectory().getPath()); - - ListView rootView = (ListView) inflater.inflate(R.layout.folderbrowser_listview, container, false); - adapter = new FolderBrowserAdapter(getActivity(), R.layout.folderbrowser_list_item); - rootView.setAdapter(adapter); - - Fill(currentDir); - return rootView; - } - - private void FolderSelected() - { - String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "ISOPaths", "0"); - int intDirectories = Integer.parseInt(Directories); - - // Check to see if a path set in the Dolphin config - // matches the one the user is trying to add. If it's - // already set, then don't add it to the list again. - boolean pathNotPresent = true; - for (int i = 0; i < intDirectories; i++) - { - String isoPath = NativeLibrary.GetConfig("Dolphin.ini", "General", "ISOPath" + i, ""); - - pathNotPresent = !isoPath.equals(currentDir.getPath()); - } - - // User doesn't have this path in the config, so add it. - if (pathNotPresent) - { - NativeLibrary.SetConfig("Dolphin.ini", "General", "ISOPaths", Integer.toString(intDirectories+1)); - NativeLibrary.SetConfig("Dolphin.ini", "General", "ISOPath" + Integer.toString(intDirectories), currentDir.getPath()); - } - - ((GameListActivity)getActivity()).SwitchPage(0); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserAdapter.java deleted file mode 100644 index 966b7245d4..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserAdapter.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.folderbrowser; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import org.dolphinemu.dolphinemu.R; - -/** - * The {@link ArrayAdapter} that backs the file browser. - *

- * This is responsible for correctly handling the display - * of the items for the {@link FolderBrowser} UI. - */ -public final class FolderBrowserAdapter extends ArrayAdapter -{ - // ViewHolder which is used to hold onto - // items within a listview. This is done - // so that findViewById is not needed to - // be excessively called over and over. - private static final class ViewHolder - { - TextView title; - TextView subtitle; - ImageView icon; - } - - private final Context context; - private final int id; - private ViewHolder viewHolder; - - /** - * Constructor - * - * @param context The current {@link Context}. - * @param resourceId The resource ID for a layout file containing a layout to use when instantiating views. - */ - public FolderBrowserAdapter(Context context, int resourceId) - { - super(context, resourceId); - - this.context = context; - this.id = resourceId; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) - { - if (convertView == null) - { - LayoutInflater vi = LayoutInflater.from(context); - convertView = vi.inflate(id, parent, false); - - // Initialize the ViewHolder and store it. - viewHolder = new ViewHolder(); - viewHolder.title = (TextView) convertView.findViewById(R.id.BrowserItemTitle); - viewHolder.subtitle = (TextView) convertView.findViewById(R.id.BrowserItemSubTitle); - viewHolder.icon = (ImageView) convertView.findViewById(R.id.BrowserItemIcon); - convertView.setTag(viewHolder); - } - else // Can recover the holder. - { - viewHolder = (ViewHolder) convertView.getTag(); - } - - final FolderBrowserItem item = getItem(position); - if (item != null) - { - if (viewHolder.title != null) - { - viewHolder.title.setText(item.getName()); - } - - if (viewHolder.subtitle != null) - { - // Remove the subtitle for all folders, except for the parent directory folder. - if (item.isDirectory() && !item.getSubtitle().equals(context.getString(R.string.parent_directory))) - { - viewHolder.subtitle.setVisibility(View.GONE); - } - else - { - viewHolder.subtitle.setVisibility(View.VISIBLE); - viewHolder.subtitle.setText(item.getSubtitle()); - } - } - - if (viewHolder.icon != null) - { - if (item.isDirectory()) - { - viewHolder.icon.setImageResource(R.drawable.ic_menu_folder); - } - else - { - viewHolder.icon.setImageResource(R.drawable.ic_menu_file); - } - } - } - return convertView; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserItem.java deleted file mode 100644 index 8e909dbf1e..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserItem.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.folderbrowser; - -import java.io.File; - -/** - * Represents an item in the {@link FolderBrowser} list. - */ -public final class FolderBrowserItem implements Comparable -{ - private final String name; - private final String subtitle; - private final String path; - private final File underlyingFile; - - /** - * Constructor - * - * @param name The name of the file/folder represented by this item. - * @param subtitle The subtitle of this FolderBrowserItem. - * @param path The path of the file/folder represented by this item. - */ - public FolderBrowserItem(String name, String subtitle, String path) - { - this.name = name; - this.subtitle = subtitle; - this.path = path; - this.underlyingFile = new File(path); - } - - /** - * Constructor. Initializes a FolderBrowserItem with an empty subtitle. - * - * @param name The name of the file/folder represented by this item. - * @param path The path of the file/folder represented by this item. - */ - public FolderBrowserItem(String name, String path) - { - this.name = name; - this.subtitle = ""; - this.path = path; - this.underlyingFile = new File(path); - } - - /** - * Gets the name of the file/folder represented by this FolderBrowserItem. - * - * @return the name of the file/folder represented by this FolderBrowserItem. - */ - public String getName() - { - return name; - } - - /** - * Gets the subtitle text of this FolderBrowserItem. - * - * @return the subtitle text of this FolderBrowserItem. - */ - public String getSubtitle() - { - return subtitle; - } - - /** - * Gets the path of the file/folder represented by this FolderBrowserItem. - * - * @return the path of the file/folder represented by this FolderBrowserItem. - */ - public String getPath() - { - return path; - } - - /** - * Gets the {@link File} representation of the underlying file/folder - * represented by this FolderBrowserItem. - * - * @return the {@link File} representation of the underlying file/folder - * represented by this FolderBrowserItem. - */ - public File getUnderlyingFile() - { - return underlyingFile; - } - - /** - * Gets whether or not this FolderBrowserItem represents a directory. - * - * @return true if this FolderBrowserItem represents a directory, false otherwise. - */ - public boolean isDirectory() - { - return underlyingFile.isDirectory(); - } - - @Override - public int compareTo(FolderBrowserItem other) - { - if(name != null) - return name.toLowerCase().compareTo(other.getName().toLowerCase()); - else - throw new NullPointerException("The name of this FolderBrowserItem is null"); - } -} 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 4b3adf10c6..70dff7237e 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 @@ -15,7 +15,7 @@ import android.view.ViewGroup; import org.dolphinemu.dolphinemu.BuildConfig; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.emulation.overlay.InputOverlay; +import org.dolphinemu.dolphinemu.overlay.InputOverlay; public final class EmulationFragment extends Fragment implements SurfaceHolder.Callback diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListActivity.java deleted file mode 100644 index fe49cd0c20..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListActivity.java +++ /dev/null @@ -1,373 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.gamelist; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Fragment; -import android.app.FragmentTransaction; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -import android.preference.PreferenceManager; -import android.support.v4.app.ActionBarDrawerToggle; -import android.support.v4.widget.DrawerLayout; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.widget.AdapterView; -import android.widget.ListView; - -import org.dolphinemu.dolphinemu.NativeLibrary; -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.about.AboutActivity; -import org.dolphinemu.dolphinemu.emulation.EmulationActivity; -import org.dolphinemu.dolphinemu.folderbrowser.FolderBrowser; -import org.dolphinemu.dolphinemu.services.AssetCopyService; -import org.dolphinemu.dolphinemu.settings.PrefsActivity; -import org.dolphinemu.dolphinemu.sidemenu.SideMenuAdapter; -import org.dolphinemu.dolphinemu.sidemenu.SideMenuItem; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -/** - * The activity that implements all of the functions - * for the game list. - */ -public final class GameListActivity extends Activity - implements GameListFragment.OnGameListZeroListener -{ - private int mCurFragmentNum = 0; - - private ActionBarDrawerToggle mDrawerToggle; - private DrawerLayout mDrawerLayout; - private SideMenuAdapter mDrawerAdapter; - private ListView mDrawerList; - private boolean mAutoStart = false; - private String mAutoStartFile = ""; - - /** - * Called from the {@link GameListFragment}. - *

- * This is called when there are no games - * currently present within the game list. - */ - public void onZeroFiles() - { - mDrawerLayout.openDrawer(mDrawerList); - } - - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - setContentView(R.layout.gamelist_activity); - - mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - mDrawerList = (ListView) findViewById(R.id.left_drawer); - - // Construct list of items to add to the side menu. - List dir = new ArrayList(); - dir.add(new SideMenuItem(getString(R.string.game_list), 0)); - dir.add(new SideMenuItem(getString(R.string.browse_folder), 1)); - dir.add(new SideMenuItem(getString(R.string.settings), 2)); - dir.add(new SideMenuItem(getString(R.string.about), 3)); - - mDrawerAdapter = new SideMenuAdapter(this, R.layout.sidemenu, dir); - mDrawerList.setAdapter(mDrawerAdapter); - mDrawerList.setOnItemClickListener(mMenuItemClickListener); - - // Enable ActionBar app icon to behave as action to toggle nav drawer - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); - - // ActionBarDrawerToggle ties together the the proper interactions - // between the sliding drawer and the action bar app icon - mDrawerToggle = new ActionBarDrawerToggle( - this, /* Host Activity */ - mDrawerLayout, /* DrawerLayout object */ - R.drawable.ic_drawer, /* Navigation drawer image to replace 'Up' caret */ - R.string.drawer_open, /* "open drawer" description for accessibility */ - R.string.drawer_close /* "close drawer" description for accessibility */ - ) { - public void onDrawerClosed(View view) { - invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() - } - - public void onDrawerOpened(View drawerView) { - invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() - } - }; - mDrawerLayout.setDrawerListener(mDrawerToggle); - - CheckForIntent(); - - String BaseDir = NativeLibrary.GetUserDirectory(); - final String DefaultDir = Environment.getExternalStorageDirectory() + File.separator + "dolphin-emu"; - if (BaseDir.isEmpty()) - BaseDir = DefaultDir; - NativeLibrary.SetUserDirectory(BaseDir); - - // Stuff in this block only happens when this activity is newly created (i.e. not a rotation) - if (savedInstanceState == null) - { - // Copy assets into appropriate locations. - Intent copyAssets = new Intent(this, AssetCopyService.class); - startService(copyAssets); - - // Display the game list fragment. - final GameListFragment gameList = new GameListFragment(); - FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(R.id.content_frame, gameList); - ft.commit(); - } - - // Create an alert telling them that their phone sucks - if (Build.CPU_ABI.contains("arm") && !NativeLibrary.SupportsNEON()) - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.device_compat_warning); - builder.setMessage(R.string.device_compat_warning_msg); - builder.setPositiveButton(R.string.yes, null); - builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) - { - finish(); - } - }); - builder.show(); - } - - if (mAutoStart) - { - // Start the emulation activity - Intent intent = new Intent(this, EmulationActivity.class); - intent.putExtra("SelectedGame", mAutoStartFile); - startActivity(intent); - } - } - - private void CheckForIntent() - { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - boolean handled = prefs.getBoolean("HandledIntent", false); - - // Get an editor. - SharedPreferences.Editor editor = prefs.edit(); - - Bundle extras = getIntent().getExtras(); - - if (!handled && extras != null) - { - // Application got passed extra data - editor.putBoolean("HandledIntent", true); - editor.apply(); - - // Did we get passed a new user directory? - String user_dir = extras.getString("UserDir"); - if (user_dir != null && user_dir.length() != 0) - NativeLibrary.SetUserDirectory(user_dir); - - // Did we get passed a file? - String start_file = extras.getString("AutoStartFile"); - if (start_file != null && start_file.length() != 0) - { - mAutoStart = true; - mAutoStartFile = start_file; - } - return; - } - - editor.putBoolean("HandledIntent", false); - editor.apply(); - } - - /** - * Switches to the {@link Fragment} represented - * by the given ID number. - * - * @param toPage the number representing the {@link Fragment} to switch to. - */ - public void SwitchPage(int toPage) - { - if (mCurFragmentNum == toPage) - return; - - switch(toPage) - { - case 0: // Game list - { - // We use the title section as the browser directory tracker in the folder browser. - // Make sure we flip the title back if we're coming from that fragment. - if (mCurFragmentNum == 1) - setTitle(R.string.app_name); - - mCurFragmentNum = 0; - final GameListFragment gameList = new GameListFragment(); - FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(R.id.content_frame, gameList); - ft.commit(); - invalidateOptionsMenu(); - } - break; - - case 1: // Folder Browser - { - mCurFragmentNum = 1; - final FolderBrowser folderBrowser = new FolderBrowser(); - FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(R.id.content_frame, folderBrowser); - ft.addToBackStack(null); - ft.commit(); - invalidateOptionsMenu(); - } - break; - - case 2: // Settings - { - Intent intent = new Intent(this, PrefsActivity.class); - startActivity(intent); - } - break; - - case 3: // About - { - Intent intent = new Intent(this, AboutActivity.class); - startActivity(intent); - } - break; - - default: - break; - } - } - - private final AdapterView.OnItemClickListener mMenuItemClickListener = new AdapterView.OnItemClickListener() - { - public void onItemClick(AdapterView parent, View view, int position, long id) - { - SideMenuItem o = mDrawerAdapter.getItem(position); - mDrawerLayout.closeDrawer(mDrawerList); - SwitchPage(o.getID()); - } - }; - - /** - * When using the ActionBarDrawerToggle, you must call it during - * onPostCreate() and onConfigurationChanged()... - */ - @Override - protected void onPostCreate(Bundle savedInstanceState) - { - super.onPostCreate(savedInstanceState); - - // Sync the toggle state after onRestoreInstanceState has occurred. - mDrawerToggle.syncState(); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) - { - super.onConfigurationChanged(newConfig); - - // Pass any configuration change to the drawer toggle - mDrawerToggle.onConfigurationChanged(newConfig); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) - { - // Only show this in the game list. - if (mCurFragmentNum == 0) - { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.gamelist_menu, menu); - return true; - } - - return false; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) - { - // The action bar home/up action should open or close the drawer. - // ActionBarDrawerToggle will take care of this. - if (mDrawerToggle.onOptionsItemSelected(item)) - { - return true; - } - - // If clear game list is pressed. - if (item.getItemId() == R.id.clearGameList) - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.clear_game_list); - builder.setMessage(getString(R.string.clear_game_list_confirm)); - builder.setNegativeButton(R.string.no, null); - builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) - { - String directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "ISOPaths", "0"); - int intDirs = Integer.parseInt(directories); - - for (int i = 0; i < intDirs; i++) - { - NativeLibrary.SetConfig("Dolphin.ini", "General", "ISOPath" + i, ""); - } - - // Since we flushed all paths, we signify this in the ini. - NativeLibrary.SetConfig("Dolphin.ini", "General", "ISOPaths", "0"); - - // Now finally, clear the game list. - ((GameListFragment) getFragmentManager().findFragmentById(R.id.content_frame)).clearGameList(); - } - }); - - builder.show(); - } - - return super.onOptionsItemSelected(item); - } - - @Override - public void onSaveInstanceState(Bundle outState) - { - super.onSaveInstanceState(outState); - - outState.putInt("currentFragmentNum", mCurFragmentNum); - } - - @Override - public void onRestoreInstanceState(Bundle savedInstanceState) - { - super.onRestoreInstanceState(savedInstanceState); - - mCurFragmentNum = savedInstanceState.getInt("currentFragmentNum"); - } - - @Override - public void onBackPressed() - { - if (mCurFragmentNum == 0) - { - finish(); - } - else - { - SwitchPage(0); - } - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListAdapter.java deleted file mode 100644 index 3c9e51d271..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListAdapter.java +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.gamelist; - -import android.content.Context; -import android.graphics.Bitmap; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import org.dolphinemu.dolphinemu.R; - -/** - * The adapter backing the game list. - *

- * Responsible for handling each game list item individually. - */ -public final class GameListAdapter extends ArrayAdapter -{ - private static final float BYTES_PER_GIB = 1024 * 1024 * 1024; - private static final float BYTES_PER_MIB = 1024 * 1024; - - private final Context context; - private final int id; - - /** - * Constructor - * - * @param context The current {@link Context}. - * @param resourceId The resource ID for a layout file containing a layout to use when instantiating views. - */ - public GameListAdapter(Context context, int resourceId) - { - super(context, resourceId); - - this.context = context; - this.id = resourceId; - } - - @Override - public View getView(int position, View gameView, ViewGroup parent) - { - ViewHolder holder; - - // If getView() was called without passing in a recycled view, - if (gameView == null) - { - // Inflate a new view using the appropriate XML layout. - LayoutInflater inflater = LayoutInflater.from(context); - gameView = inflater.inflate(id, parent, false); - - // Instantiate a holder to contain references to the game's views. - holder = new ViewHolder(); - holder.title = (TextView) gameView.findViewById(R.id.GameListItemTitle); - holder.subtitle = (TextView) gameView.findViewById(R.id.GameListItemSubTitle); - holder.icon = (ImageView) gameView.findViewById(R.id.GameListItemIcon); - - // Attach this list of references to the view. - gameView.setTag(holder); - } - // If we do have a recycled view, we can use the references it already contains. - else - { - holder = (ViewHolder) gameView.getTag(); - } - - // Get a reference to the game represented by this row. - final GameListItem item = getItem(position); - - // Whether this row's view is newly created or not, set the children to contain the game's data. - if (item != null) - { - holder.title.setText(item.getName()); - - Bitmap icon = item.getImage(); - - if (icon != null) - { - holder.icon.setImageBitmap(icon); - } - else - { - holder.icon.setImageResource(R.drawable.no_banner); - } - - float fileSize = item.getFilesize() / BYTES_PER_GIB; - - String subtitle; - - if (fileSize >= 1.0f) - { - subtitle = String.format(context.getString(R.string.file_size_gib), fileSize); - } - else - { - fileSize = item.getFilesize() / BYTES_PER_MIB; - subtitle = String.format(context.getString(R.string.file_size_mib), fileSize); - } - - holder.subtitle.setText(subtitle); - } - - // Make every other game in the list grey - if (position % 2 == 1) - gameView.setBackgroundColor(0xFFE3E3E3); - - return gameView; - } - - private final class ViewHolder - { - public TextView title; - public TextView subtitle; - public ImageView icon; - } -} - diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListFragment.java deleted file mode 100644 index 7c32813a3f..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListFragment.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.gamelist; - -import android.app.Activity; -import android.app.ListFragment; -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; -import android.widget.Toast; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.dolphinemu.dolphinemu.NativeLibrary; -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.emulation.EmulationActivity; - - -/** - * The {@link ListFragment} responsible for displaying the game list. - */ -public final class GameListFragment extends ListFragment -{ - private GameListAdapter mGameAdapter; - private OnGameListZeroListener mCallback; - - /** - * Interface that defines how to handle the case - * when there are zero games in the game list. - */ - public interface OnGameListZeroListener - { - /** - * This is called when there are no games - * currently present within the game list. - */ - void onZeroFiles(); - } - - /** - * Clears all entries from the {@link GameListAdapter} - * backing this GameListFragment. - */ - public void clearGameList() - { - mGameAdapter.clear(); - mGameAdapter.notifyDataSetChanged(); - } - - private void fill() - { - List fls = new ArrayList(); - String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "ISOPaths", "0"); - int intDirectories = Integer.parseInt(Directories); - - // Extensions to filter by. - Set exts = new HashSet(Arrays.asList(".dff", ".dol", ".elf", ".gcm", ".gcz", ".iso", ".wad", ".wbfs")); - - for (int a = 0; a < intDirectories; ++a) - { - String BrowseDir = NativeLibrary.GetConfig("Dolphin.ini", "General", "ISOPath" + a, ""); - File currentDir = new File(BrowseDir); - File[] dirs = currentDir.listFiles(); - try - { - for (File entry : dirs) - { - String entryName = entry.getName(); - - if (!entry.isHidden() && !entry.isDirectory()) - { - if (exts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.')))) - fls.add(new GameListItem(getActivity(), entryName, entry.length(), entry.getAbsolutePath())); - } - - } - } - catch (Exception ignored) - { - } - } - Collections.sort(fls); - - // Add all the items to the adapter - mGameAdapter.addAll(fls); - mGameAdapter.notifyDataSetChanged(); - - if (fls.isEmpty()) - { - mCallback.onZeroFiles(); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); - mGameAdapter = new GameListAdapter(getActivity(), R.layout.gamelist_list_item); - rootView.setAdapter(mGameAdapter); - - fill(); - - return rootView; - } - - @Override - public void onListItemClick(ListView listView, View view, int position, long id) - { - GameListItem item = mGameAdapter.getItem(position); - - // Show a toast indicating which game was clicked. - Toast.makeText(getActivity(), String.format(getString(R.string.file_clicked), item.getPath()), Toast.LENGTH_SHORT).show(); - - // Start the emulation activity and send the path of the clicked ROM to it. - Intent intent = new Intent(getActivity(), EmulationActivity.class); - intent.putExtra("SelectedGame", item.getPath()); - startActivity(intent); - } - - @Override - public void onAttach(Activity activity) - { - super.onAttach(activity); - - // This makes sure that the container activity has implemented - // the callback interface. If not, it throws an exception - try - { - mCallback = (OnGameListZeroListener) activity; - } - catch (ClassCastException e) - { - throw new ClassCastException(activity.toString() - + " must implement OnGameListZeroListener"); - } - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListItem.java deleted file mode 100644 index 5fcaa2d9e1..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/gamelist/GameListItem.java +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.gamelist; - -import android.content.Context; -import android.graphics.Bitmap; - -import java.io.File; - -import org.dolphinemu.dolphinemu.NativeLibrary; - -/** - * Represents an item in the game list. - */ -public final class GameListItem implements Comparable -{ - private String name; - private long filesize; - private final String path; - private Bitmap image; - - /** - * Constructor. - * - * @param ctx The current {@link Context} - * @param name The name of this GameListItem. - * @param filesize The filesize for this GameListItem, in GiB - * @param path The file path for the game represented by this GameListItem. - */ - public GameListItem(Context ctx, String name, long filesize, String path) - { - this.name = name; - this.filesize = filesize; - this.path = path; - - File file = new File(path); - if (!file.isDirectory() && !path.isEmpty()) - { - int[] Banner = NativeLibrary.GetBanner(path); - if (Banner[0] != 0) - { - image = Bitmap.createBitmap(Banner, 96, 32, Bitmap.Config.ARGB_8888); - } - - this.name = NativeLibrary.GetTitle(path); - } - } - - /** - * Gets the name of this GameListItem. - * - * @return the name of this GameListItem. - */ - public String getName() - { - return name; - } - - /** - * Gets the filesize of this GameListItem, in GiB. - * - * @return the filesize of this GameListItem. - */ - public long getFilesize() - { - return filesize; - } - - /** - * Gets the file path of the game represented by this GameListItem. - * - * @return the file path of the game represented by this GameListItem. - */ - public String getPath() - { - return path; - } - - /** - * Gets the image data for this game as a {@link Bitmap}. - * - * @return the image data for this game as a {@link Bitmap}. - */ - public Bitmap getImage() - { - return image; - } - - @Override - public int compareTo(GameListItem o) - { - if (name != null) - return name.toLowerCase().compareTo(o.getName().toLowerCase()); - else - throw new NullPointerException("The name of this GameListItem is null"); - } -} - diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java index 4c2bffed0d..6604717d92 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java @@ -111,10 +111,35 @@ public final class GameDatabase extends SQLiteOpenHelper public void scanLibrary(SQLiteDatabase database) { - // TODO Before scanning known folders, go through the game table and remove any entries for which the file itself is missing. + // Before scanning known folders, go through the game table and remove any entries for which the file itself is missing. + Cursor fileCursor = database.query(TABLE_NAME_GAMES, + null, // Get all columns. + null, // Get all rows. + null, + null, // No grouping. + null, + null); // Order of games is irrelevant. + + // Possibly overly defensive, but ensures that moveToNext() does not skip a row. + fileCursor.moveToPosition(-1); + + while (fileCursor.moveToNext()) + { + String gamePath = fileCursor.getString(GAME_COLUMN_PATH); + File game = new File(gamePath); + + if (!game.exists()) + { + Log.e("DolphinEmu", "Game file no longer exists. Removing from the library: " + gamePath); + database.delete(TABLE_NAME_GAMES, + KEY_DB_ID + " = ?", + new String[]{Long.toString(fileCursor.getLong(COLUMN_DB_ID))}); + } + } + // Get a cursor listing all the folders the user has added to the library. - Cursor cursor = database.query(TABLE_NAME_FOLDERS, + Cursor folderCursor = database.query(TABLE_NAME_FOLDERS, null, // Get all columns. null, // Get all rows. null, @@ -125,74 +150,91 @@ public final class GameDatabase extends SQLiteOpenHelper Set allowedExtensions = new HashSet(Arrays.asList(".dff", ".dol", ".elf", ".gcm", ".gcz", ".iso", ".wad", ".wbfs")); // Possibly overly defensive, but ensures that moveToNext() does not skip a row. - cursor.moveToPosition(-1); + folderCursor.moveToPosition(-1); // Iterate through all results of the DB query (i.e. all folders in the library.) - while (cursor.moveToNext()) + while (folderCursor.moveToNext()) { - String folderPath = cursor.getString(FOLDER_COLUMN_PATH); + String folderPath = folderCursor.getString(FOLDER_COLUMN_PATH); File folder = new File(folderPath); Log.i("DolphinEmu", "Reading files from library folder: " + folderPath); // Iterate through every file in the folder. File[] children = folder.listFiles(); - for (File file : children) + + if (children != null) { - if (!file.isHidden() && !file.isDirectory()) + for (File file : children) { - String filePath = file.getPath(); - - int extensionStart = filePath.lastIndexOf('.'); - if (extensionStart > 0) + if (!file.isHidden() && !file.isDirectory()) { - String fileExtension = filePath.substring(extensionStart); + String filePath = file.getPath(); - // Check that the file has an extension we care about before trying to read out of it. - if (allowedExtensions.contains(fileExtension)) + int extensionStart = filePath.lastIndexOf('.'); + if (extensionStart > 0) { - String name = NativeLibrary.GetTitle(filePath); + String fileExtension = filePath.substring(extensionStart); - // If the game's title field is empty, use the filename. - if (name.isEmpty()) + // Check that the file has an extension we care about before trying to read out of it. + if (allowedExtensions.contains(fileExtension)) { - name = filePath.substring(filePath.lastIndexOf("/") + 1); - } + String name = NativeLibrary.GetTitle(filePath); - ContentValues game = Game.asContentValues(NativeLibrary.GetPlatform(filePath), - name, - NativeLibrary.GetDescription(filePath).replace("\n", " "), - NativeLibrary.GetCountry(filePath), - filePath, - NativeLibrary.GetGameId(filePath), - NativeLibrary.GetCompany(filePath)); + // If the game's title field is empty, use the filename. + if (name.isEmpty()) + { + name = filePath.substring(filePath.lastIndexOf("/") + 1); + } - // Try to update an existing game first. - int rowsMatched = database.update(TABLE_NAME_GAMES, // Which table to update. - game, // The values to fill the row with. - KEY_GAME_ID + " = ?", // The WHERE clause used to find the right row. - new String[]{game.getAsString(KEY_GAME_ID)}); // The ? in WHERE clause is replaced with this, - // which is provided as an array because there - // could potentially be more than one argument. + ContentValues game = Game.asContentValues(NativeLibrary.GetPlatform(filePath), + name, + NativeLibrary.GetDescription(filePath).replace("\n", " "), + NativeLibrary.GetCountry(filePath), + filePath, + NativeLibrary.GetGameId(filePath), + NativeLibrary.GetCompany(filePath)); - // If update fails, insert a new game instead. - if (rowsMatched == 0) - { - Log.v("DolphinEmu", "Adding game: " + game.getAsString(KEY_GAME_TITLE)); - database.insert(TABLE_NAME_GAMES, null, game); - } - else - { - Log.v("DolphinEmu", "Updated game: " + game.getAsString(KEY_GAME_TITLE)); + // Try to update an existing game first. + int rowsMatched = database.update(TABLE_NAME_GAMES, // Which table to update. + game, // The values to fill the row with. + KEY_GAME_ID + " = ?", // The WHERE clause used to find the right row. + new String[]{game.getAsString(KEY_GAME_ID)}); // The ? in WHERE clause is replaced with this, + // which is provided as an array because there + // could potentially be more than one argument. + + // If update fails, insert a new game instead. + if (rowsMatched == 0) + { + Log.v("DolphinEmu", "Adding game: " + game.getAsString(KEY_GAME_TITLE)); + database.insert(TABLE_NAME_GAMES, null, game); + } + else + { + Log.v("DolphinEmu", "Updated game: " + game.getAsString(KEY_GAME_TITLE)); + } } } } } } + // If the folder is empty because it no longer exists, remove it from the library. + else if (!folder.exists()) + { + Log.e("DolphinEmu", "Folder no longer exists. Removing from the library: " + folderPath); + database.delete(TABLE_NAME_FOLDERS, + KEY_DB_ID + " = ?", + new String[]{Long.toString(folderCursor.getLong(COLUMN_DB_ID))}); + } + else + { + Log.e("DolphinEmu", "Folder contains no games: " + folderPath); + } } - cursor.close(); + + folderCursor.close(); database.close(); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java index 0ee2d3928e..dd83851a91 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java @@ -98,6 +98,7 @@ public final class GameProvider extends ContentProvider { if (table.equals(REFRESH_LIBRARY)) { + Log.i("DolphinEmu", "URI specified table REFRESH_LIBRARY. No insertion necessary; refreshing library contents..."); mDbHelper.scanLibrary(database); return uri; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlay.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java similarity index 99% rename from Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlay.java rename to Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java index 8a47e44e90..fc1a75cd0f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlay.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java @@ -4,7 +4,7 @@ * Refer to the license.txt file included. */ -package org.dolphinemu.dolphinemu.emulation.overlay; +package org.dolphinemu.dolphinemu.overlay; import android.content.Context; import android.content.SharedPreferences; @@ -21,10 +21,12 @@ import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; import android.view.View.OnTouchListener; + import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.NativeLibrary.ButtonState; import org.dolphinemu.dolphinemu.NativeLibrary.ButtonType; import org.dolphinemu.dolphinemu.R; + import java.util.HashSet; import java.util.Set; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayDrawableButton.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableButton.java similarity index 95% rename from Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayDrawableButton.java rename to Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableButton.java index eac83c4b8b..e02e352e56 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayDrawableButton.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableButton.java @@ -4,7 +4,7 @@ * Refer to the license.txt file included. */ -package org.dolphinemu.dolphinemu.emulation.overlay; +package org.dolphinemu.dolphinemu.overlay; import android.content.res.Resources; import android.graphics.Bitmap; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayDrawableJoystick.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java similarity index 98% rename from Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayDrawableJoystick.java rename to Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java index 4970b0d0e8..d4082e4289 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayDrawableJoystick.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java @@ -4,7 +4,7 @@ * Refer to the license.txt file included. */ -package org.dolphinemu.dolphinemu.emulation.overlay; +package org.dolphinemu.dolphinemu.overlay; import android.content.res.Resources; import android.graphics.Bitmap; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/AssetCopyService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/AssetCopyService.java index 6c3f4fd643..1f6f94bc8a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/AssetCopyService.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/AssetCopyService.java @@ -13,7 +13,7 @@ import android.preference.PreferenceManager; import android.util.Log; import org.dolphinemu.dolphinemu.NativeLibrary; -import org.dolphinemu.dolphinemu.settings.UserPreferences; +import org.dolphinemu.dolphinemu.utils.UserPreferences; import java.io.File; import java.io.FileOutputStream; 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 index 3af7aef1d6..1cf018ed16 100644 --- 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 @@ -4,7 +4,7 @@ import android.app.IntentService; import android.content.Intent; import android.util.Log; -import org.dolphinemu.dolphinemu.settings.UserPreferences; +import org.dolphinemu.dolphinemu.utils.UserPreferences; /** * IntentServices, unlike regular services, inherently run on a background thread. diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/PrefsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/PrefsActivity.java deleted file mode 100644 index 27ffc9c05e..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/PrefsActivity.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.settings; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.settings.cpu.CPUSettingsFragment; -import org.dolphinemu.dolphinemu.settings.input.InputConfigFragment; -import org.dolphinemu.dolphinemu.settings.video.VideoSettingsFragment; - -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v13.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; - -/** - * Main activity that manages all of the preference fragments used to display - * the settings to the user. - */ -public final class PrefsActivity extends Activity implements OnSharedPreferenceChangeListener -{ - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - setContentView(R.layout.viewpager); - - // Set the ViewPager adapter. - final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); - viewPager.setAdapter(new ViewPagerAdapter(getFragmentManager())); - - // Register the preference change listener. - final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(this); - sPrefs.registerOnSharedPreferenceChangeListener(this); - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) - { - // If any change is made to the preferences in the front-end, immediately save them. - UserPreferences.SavePrefsToIni(this); - } - - /** - * A {@link FragmentPagerAdapter} that returns a fragment - * corresponding to one of the sections/tabs/pages. - */ - private final class ViewPagerAdapter extends FragmentPagerAdapter - { - private final String[] pageTitles = { - getString(R.string.cpu_settings), - getString(R.string.input_settings), - getString(R.string.video_settings) - }; - - public ViewPagerAdapter(FragmentManager fm) - { - super(fm); - } - - @Override - public Fragment getItem(int position) - { - switch(position) - { - case 0: - return new CPUSettingsFragment(); - - case 1: - return new InputConfigFragment(); - - case 2: - return new VideoSettingsFragment(); - - default: // Should never happen. - return null; - } - } - - @Override - public int getCount() - { - // Show total pages. - return 3; - } - - @Override - public CharSequence getPageTitle(int position) - { - return pageTitles[position]; - } - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/cpu/CPUSettingsFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/cpu/CPUSettingsFragment.java deleted file mode 100644 index 9dcc8776aa..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/cpu/CPUSettingsFragment.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.settings.cpu; - -import org.dolphinemu.dolphinemu.R; - -import android.os.Build; -import android.os.Bundle; -import android.preference.ListPreference; -import android.preference.PreferenceFragment; - -/** - * Responsible for the loading of the CPU preferences. - */ -public final class CPUSettingsFragment extends PreferenceFragment -{ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // Load the preferences from an XML resource - addPreferencesFromResource(R.xml.cpu_prefs); - - final ListPreference cpuCores = (ListPreference) findPreference("cpuCorePref"); - - // - // Set valid emulation cores depending on the CPU architecture - // that the Android device is running on. - // - if (Build.CPU_ABI.contains("x86-64")) - { - cpuCores.setEntries(R.array.emuCoreEntriesX86_64); - cpuCores.setEntryValues(R.array.emuCoreValuesX86_64); - } - else if (Build.CPU_ABI.contains("arm64")) - { - cpuCores.setEntries(R.array.emuCoreEntriesARM64); - cpuCores.setEntryValues(R.array.emuCoreValuesARM64); - } - else - { - cpuCores.setEntries(R.array.emuCoreEntriesOther); - cpuCores.setEntryValues(R.array.emuCoreValuesOther); - } - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/custom/UpdatingListPreference.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/custom/UpdatingListPreference.java deleted file mode 100644 index e5d71490c6..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/custom/UpdatingListPreference.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.settings.custom; - -import android.content.Context; -import android.preference.ListPreference; -import android.util.AttributeSet; - -/** - * A {@link ListPreference} that updates its summary upon it's selection being changed. - */ -public final class UpdatingListPreference extends ListPreference -{ - /** - * Constructor - * - * @param context the current {@link Context}. - */ - public UpdatingListPreference(Context context, AttributeSet attribs) - { - super(context, attribs); - } - - @Override - public void onDialogClosed(boolean positiveResult) - { - super.onDialogClosed(positiveResult); - - // If an entry was selected - if (positiveResult) - { - setSummary(getEntry()); - } - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/overlayconfig/OverlayConfigActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/overlayconfig/OverlayConfigActivity.java deleted file mode 100644 index f251e3d7ee..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/overlayconfig/OverlayConfigActivity.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.settings.input.overlayconfig; - -import org.dolphinemu.dolphinemu.R; - -import android.app.Activity; -import android.os.Bundle; -import android.widget.RelativeLayout; - -/** - * {@link Activity} used for configuring the input overlay. - */ -public final class OverlayConfigActivity extends Activity -{ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // Initialize all of the buttons to add. - final OverlayConfigButton buttonA = new OverlayConfigButton(this, "gcpad_a", R.drawable.gcpad_a); - final OverlayConfigButton buttonB = new OverlayConfigButton(this, "gcpad_b", R.drawable.gcpad_b); - final OverlayConfigButton buttonX = new OverlayConfigButton(this, "gcpad_x", R.drawable.gcpad_x); - final OverlayConfigButton buttonY = new OverlayConfigButton(this, "gcpad_y", R.drawable.gcpad_y); - final OverlayConfigButton buttonZ = new OverlayConfigButton(this, "gcpad_z", R.drawable.gcpad_z); - final OverlayConfigButton buttonS = new OverlayConfigButton(this, "gcpad_start", R.drawable.gcpad_start); - final OverlayConfigButton buttonL = new OverlayConfigButton(this, "gcpad_l", R.drawable.gcpad_l); - final OverlayConfigButton buttonR = new OverlayConfigButton(this, "gcpad_r", R.drawable.gcpad_r); - final OverlayConfigButton joystick = new OverlayConfigButton(this, "gcpad_joystick_range", R.drawable.gcpad_joystick_range); - - // Add the buttons to the layout - final RelativeLayout configLayout = new RelativeLayout(this); - configLayout.addView(buttonA); - configLayout.addView(buttonB); - configLayout.addView(buttonX); - configLayout.addView(buttonY); - configLayout.addView(buttonZ); - configLayout.addView(buttonS); - configLayout.addView(buttonL); - configLayout.addView(buttonR); - configLayout.addView(joystick); - - // Now set the layout - setContentView(configLayout); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/overlayconfig/OverlayConfigButton.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/overlayconfig/OverlayConfigButton.java deleted file mode 100644 index c6ab8be498..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/overlayconfig/OverlayConfigButton.java +++ /dev/null @@ -1,166 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.settings.input.overlayconfig; - -import android.content.Context; -import android.content.SharedPreferences; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.preference.PreferenceManager; -import android.util.DisplayMetrics; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnTouchListener; -import android.widget.Button; -import org.dolphinemu.dolphinemu.R; - -/** - * A movable {@link Button} for use within the - * input overlay configuration screen. - */ -public final class OverlayConfigButton extends Button implements OnTouchListener -{ - // SharedPreferences instance that the button positions are cached to. - private final SharedPreferences sharedPrefs; - - // The String ID for this button. - // - // This ID is used upon releasing this button as the key for saving - // the X and Y coordinates of this button. This same key is also used - // for setting the coordinates of the button on the actual overlay during emulation. - // - // They can be accessed through SharedPreferences respectively as follows: - // - // SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(this); - // float buttonX = sPrefs.getFloat(buttonId+"-X", -1f); - // float buttonY = sPrefs.getFloat(buttonId+"-Y", -1f); - // - private final String buttonId; - - // The offset of the press while moving the button - private float moveOffsetX, moveOffsetY; - - private Drawable resizeDrawable(Drawable image, float scale) - { - // Retrieve screen dimensions. - DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); - - Bitmap b = ((BitmapDrawable)image).getBitmap(); - Bitmap bitmapResized = Bitmap.createScaledBitmap(b, - (int)(displayMetrics.heightPixels * scale), - (int)(displayMetrics.heightPixels * scale), - true); - - return new BitmapDrawable(getResources(), bitmapResized); - } - - /** - * Constructor - * - * @param context the current {@link Context}. - * @param buttonId the String ID for this button. - * @param drawableId the Drawable ID for the image to represent this OverlayConfigButton. - */ - public OverlayConfigButton(Context context, String buttonId, int drawableId) - { - super(context); - - // Set the button ID. - this.buttonId = buttonId; - - // Set the button as its own OnTouchListener. - setOnTouchListener(this); - - // Get the SharedPreferences instance. - sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - - // Decide scale based on button ID - - // SeekBars are not able to set a minimum value, only a maximum value, which complicates - // things a bit. What happens here is after the SeekBar's value is retrieved, 25 is - // added so the value will never go below 25. It is then divided by 50 (25 + 25) so the - // default value will be 100%. - float scale; - float overlaySize = sharedPrefs.getInt("controls_size", 25); - overlaySize += 25; - overlaySize /= 50; - - switch (drawableId) - { - case R.drawable.gcpad_b: - scale = 0.13f * overlaySize; - break; - case R.drawable.gcpad_x: - case R.drawable.gcpad_y: - scale = 0.18f * overlaySize; - break; - case R.drawable.gcpad_start: - scale = 0.12f * overlaySize; - break; - case R.drawable.gcpad_joystick_range: - scale = 0.30f * overlaySize; - break; - default: - scale = 0.20f * overlaySize; - break; - } - - // Set the button's icon that represents it. - setBackground(resizeDrawable(getResources().getDrawable(drawableId), scale)); - - // Check if this button has previous values set that aren't the default. - final float x = sharedPrefs.getFloat(buttonId+"-X", -1f); - final float y = sharedPrefs.getFloat(buttonId+"-Y", -1f); - - // If they are not -1, then they have a previous value set. - // Thus, we set those coordinate values. - if (x != -1f && y != -1f) - { - setX(x); - setY(y); - } - } - - @Override - public boolean onTouch(View v, MotionEvent event) - { - switch(event.getAction()) - { - // Get the offset of the press within the button - // The event X and Y locations are the offset within the button, not the screen - case MotionEvent.ACTION_DOWN: - { - moveOffsetX = event.getX(); - moveOffsetY = event.getY(); - return true; - } - - // Only change the X/Y coordinates when we move the button. - case MotionEvent.ACTION_MOVE: - { - setX(getX() + event.getX() - moveOffsetX); - setY(getY() + event.getY() - moveOffsetY); - return true; - } - - // Whenever the press event has ended - // is when we save all of the information. - case MotionEvent.ACTION_UP: - { - // Add the current X and Y positions of this button into SharedPreferences. - SharedPreferences.Editor editor = sharedPrefs.edit(); - editor.putFloat(buttonId+"-X", getX()); - editor.putFloat(buttonId+"-Y", getY()); - editor.apply(); - return true; - } - } - - return false; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java deleted file mode 100644 index be24331886..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.settings.video; - -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.os.Bundle; -import android.os.Environment; -import android.preference.ListPreference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; - -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; - -/** - * Responsible for handling the loading of the video preferences. - */ -public final class VideoSettingsFragment extends PreferenceFragment -{ - private final EGLHelper eglHelper = new EGLHelper(EGLHelper.EGL_OPENGL_ES2_BIT); - private final String vendor = eglHelper.getGL().glGetString(GL10.GL_VENDOR); - private final String version = eglHelper.getGL().glGetString(GL10.GL_VERSION); - - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // Load the preferences from an XML resource - addPreferencesFromResource(R.xml.video_prefs); - - // - // Setting valid video backends. - // - final ListPreference videoBackends = (ListPreference) findPreference("gpuPref"); - final boolean deviceSupportsGL = eglHelper.supportsOpenGL(); - final boolean deviceSupportsGLES3 = eglHelper.supportsGLES3(); - - if (deviceSupportsGL) - { - videoBackends.setEntries(R.array.videoBackendEntriesGL); - videoBackends.setEntryValues(R.array.videoBackendValuesGL); - } - else if (deviceSupportsGLES3) - { - videoBackends.setEntries(R.array.videoBackendEntriesGLES3); - videoBackends.setEntryValues(R.array.videoBackendValuesGLES3); - } - else - { - videoBackends.setEntries(R.array.videoBackendEntriesNoGLES3); - videoBackends.setEntryValues(R.array.videoBackendValuesNoGLES3); - } - - // - // Set available post processing shaders - // - - List shader_names = new ArrayList(); - List shader_values = new ArrayList(); - - // Disabled option - shader_names.add("Disabled"); - shader_values.add(""); - - 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.contains(".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. - // - final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - final PreferenceScreen mainScreen = getPreferenceScreen(); - - if (videoBackends.getValue().equals("Software Renderer")) - { - mainScreen.getPreference(0).setEnabled(false); - mainScreen.getPreference(1).setEnabled(false); - mainScreen.getPreference(3).setEnabled(false); - } - else if (videoBackends.getValue().equals("OGL")) - { - mainScreen.getPreference(0).setEnabled(true); - mainScreen.getPreference(1).setEnabled(true); - mainScreen.getPreference(3).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 ((eglHelper.supportsOpenGL() && eglHelper.GetVersion() >= 320) || - (eglHelper.supportsGLES3() && eglHelper.GetVersion() >= 310 && eglHelper.SupportsExtension("GL_ANDROID_extension_pack_es31a"))) - mainScreen.findPreference("StereoscopyScreen").setEnabled(true); - else - mainScreen.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". - sPrefs.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() - { - @Override - public void onSharedPreferenceChanged(SharedPreferences preference, String key) - { - if (key.equals("gpuPref")) - { - if (preference.getString(key, "Software Renderer").equals("Software Renderer")) - { - mainScreen.getPreference(0).setEnabled(false); - mainScreen.getPreference(1).setEnabled(false); - mainScreen.getPreference(3).setEnabled(false); - } - else if (preference.getString(key, "Software Renderer").equals("OGL")) - { - mainScreen.getPreference(0).setEnabled(true); - mainScreen.getPreference(1).setEnabled(true); - mainScreen.getPreference(3).setEnabled(true); - - // Create an alert telling them that their phone sucks - if (eglHelper.supportsGLES3() - && vendor.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 = sPrefs.edit(); - editor.putString("gpuPref", "Software Renderer"); - editor.apply(); - videoBackends.setValue("Software Renderer"); - videoBackends.setSummary("Software Renderer"); - } - }); - builder.show(); - } - } - } - } - }); - } - - private float getQualcommVersion() - { - final int start = version.indexOf("V@") + 2; - final StringBuilder versionBuilder = new StringBuilder(); - - for (int i = start; i < version.length(); i++) - { - char c = version.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/sidemenu/SideMenuAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/sidemenu/SideMenuAdapter.java deleted file mode 100644 index 616bf01c54..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/sidemenu/SideMenuAdapter.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.sidemenu; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ListView; -import android.widget.TextView; - -import java.util.List; - -import org.dolphinemu.dolphinemu.R; - -/** - * Adapter that backs the sidebar menu. - *

- * Responsible for handling the elements of each sidebar item. - */ -public final class SideMenuAdapter extends ArrayAdapter -{ - private final Context context; - private final int id; - private final Listitems; - - /** - * Constructor - * - * @param context The current {@link Context}. - * @param resourceId The resource ID for a layout file containing a layout to use when instantiating views. - * @param objects The objects to represent in the {@link ListView}. - */ - public SideMenuAdapter(Context context, int resourceId, List objects) - { - super(context, resourceId, objects); - - this.context = context; - this.id = resourceId; - this.items = objects; - } - - @Override - public SideMenuItem getItem(int i) - { - return items.get(i); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) - { - if (convertView == null) - { - LayoutInflater vi = LayoutInflater.from(context); - convertView = vi.inflate(id, null); - } - - final SideMenuItem item = items.get(position); - if (item != null) - { - TextView title = (TextView) convertView.findViewById(R.id.SideMenuTitle); - - if (title != null) - title.setText(item.getName()); - } - - return convertView; - } -} - diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/sidemenu/SideMenuItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/sidemenu/SideMenuItem.java deleted file mode 100644 index 89acbd3772..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/sidemenu/SideMenuItem.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu.sidemenu; - - -/** - * Represents an item that goes in the sidemenu of the app. - */ -public final class SideMenuItem -{ - private final String name; - private final int id; - - /** - * Constructor - * - * @param name The name of the SideMenuItem. - * @param id ID number of this specific SideMenuItem. - */ - public SideMenuItem(String name, int id) - { - this.name = name; - this.id = id; - } - - /** - * Gets the name of this SideMenuItem. - * - * @return the name of this SideMenuItem. - */ - public String getName() - { - return name; - } - - /** - * Gets the ID of this SideMenuItem. - * - * @return the ID of this SideMenuItem. - */ - public int getID() - { - return id; - } -} - diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/InputBindingPreference.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/InputBindingPreference.java similarity index 85% rename from Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/InputBindingPreference.java rename to Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/InputBindingPreference.java index e182f93a5c..cb67b90a18 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/InputBindingPreference.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/InputBindingPreference.java @@ -1,6 +1,4 @@ -package org.dolphinemu.dolphinemu.settings.input; - -import org.dolphinemu.dolphinemu.R; +package org.dolphinemu.dolphinemu.utils; import android.app.AlertDialog; import android.content.Context; @@ -8,6 +6,9 @@ import android.content.DialogInterface; import android.preference.Preference; import android.util.AttributeSet; +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.dialogs.MotionAlertDialog; + /** * {@link Preference} subclass that represents a preference * used for assigning a key bind. @@ -16,7 +17,7 @@ public final class InputBindingPreference extends Preference { /** * Constructor that is called when inflating an InputBindingPreference from XML. - * + * * @param context The current {@link Context}. * @param attrs The attributes of the XML tag that is inflating the preference. */ @@ -34,11 +35,11 @@ public final class InputBindingPreference extends Preference // Set the cancel button. dialog.setButton(AlertDialog.BUTTON_NEGATIVE, getContext().getString(R.string.cancel), new AlertDialog.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) - { - // Do nothing. Just makes the cancel button show up. - } + @Override + public void onClick(DialogInterface dialog, int which) + { + // Do nothing. Just makes the cancel button show up. + } }); // Set the title and description message. diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/InputConfigFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/InputConfigFragment.java similarity index 98% rename from Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/InputConfigFragment.java rename to Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/InputConfigFragment.java index edf7089eb7..ce1e4a2145 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/input/InputConfigFragment.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/InputConfigFragment.java @@ -4,7 +4,7 @@ * Refer to the license.txt file included. */ -package org.dolphinemu.dolphinemu.settings.input; +package org.dolphinemu.dolphinemu.utils; import android.app.Fragment; import android.os.Build; @@ -12,6 +12,7 @@ import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; import android.view.InputDevice; + import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/UserPreferences.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/UserPreferences.java similarity index 99% rename from Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/UserPreferences.java rename to Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/UserPreferences.java index a24d5b6e72..168bd2dd93 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/settings/UserPreferences.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/UserPreferences.java @@ -4,15 +4,15 @@ * Refer to the license.txt file included. */ -package org.dolphinemu.dolphinemu.settings; - -import org.dolphinemu.dolphinemu.NativeLibrary; +package org.dolphinemu.dolphinemu.utils; import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.preference.PreferenceManager; +import org.dolphinemu.dolphinemu.NativeLibrary; + /** * A class that retrieves all of the set user preferences in Android, in a safe way. *

diff --git a/Source/Android/app/src/main/res/layout/about_layout.xml b/Source/Android/app/src/main/res/layout/about_layout.xml deleted file mode 100644 index b3110331a5..0000000000 --- a/Source/Android/app/src/main/res/layout/about_layout.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/Source/Android/app/src/main/res/layout/emulation_view.xml b/Source/Android/app/src/main/res/layout/emulation_view.xml deleted file mode 100644 index 1d0472d527..0000000000 --- a/Source/Android/app/src/main/res/layout/emulation_view.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/Source/Android/app/src/main/res/layout/folderbrowser_list_item.xml b/Source/Android/app/src/main/res/layout/folderbrowser_list_item.xml deleted file mode 100644 index 318efc75ec..0000000000 --- a/Source/Android/app/src/main/res/layout/folderbrowser_list_item.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - diff --git a/Source/Android/app/src/main/res/layout/folderbrowser_listview.xml b/Source/Android/app/src/main/res/layout/folderbrowser_listview.xml deleted file mode 100644 index 3e213ed72f..0000000000 --- a/Source/Android/app/src/main/res/layout/folderbrowser_listview.xml +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/Source/Android/app/src/main/res/layout/fragment_emulation.xml b/Source/Android/app/src/main/res/layout/fragment_emulation.xml index 1db0d6b49f..451e4bec60 100644 --- a/Source/Android/app/src/main/res/layout/fragment_emulation.xml +++ b/Source/Android/app/src/main/res/layout/fragment_emulation.xml @@ -13,7 +13,7 @@ android:focusableInTouchMode="false"/> - - - - - diff --git a/Source/Android/app/src/main/res/layout/gamelist_list_item.xml b/Source/Android/app/src/main/res/layout/gamelist_list_item.xml deleted file mode 100644 index c2d722c31c..0000000000 --- a/Source/Android/app/src/main/res/layout/gamelist_list_item.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - diff --git a/Source/Android/app/src/main/res/layout/gamelist_listview.xml b/Source/Android/app/src/main/res/layout/gamelist_listview.xml deleted file mode 100644 index d52b319df6..0000000000 --- a/Source/Android/app/src/main/res/layout/gamelist_listview.xml +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/Source/Android/app/src/main/res/layout/sidemenu.xml b/Source/Android/app/src/main/res/layout/sidemenu.xml deleted file mode 100644 index f844630928..0000000000 --- a/Source/Android/app/src/main/res/layout/sidemenu.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/Source/Android/app/src/main/res/layout/viewpager.xml b/Source/Android/app/src/main/res/layout/viewpager.xml deleted file mode 100644 index b231974405..0000000000 --- a/Source/Android/app/src/main/res/layout/viewpager.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - diff --git a/Source/Android/app/src/main/res/xml/input_prefs.xml b/Source/Android/app/src/main/res/xml/input_prefs.xml index f6d8842f89..4ce2373af0 100644 --- a/Source/Android/app/src/main/res/xml/input_prefs.xml +++ b/Source/Android/app/src/main/res/xml/input_prefs.xml @@ -32,102 +32,102 @@ android:key="enableController1" android:title="@string/enable_controller"/> - - - - - - - - - - - - - - - - - - - - @@ -139,102 +139,102 @@ android:key="enableController2" android:title="@string/enable_controller"/> - - - - - - - - - - - - - - - - - - - - @@ -246,102 +246,102 @@ android:key="enableController3" android:title="@string/enable_controller"/> - - - - - - - - - - - - - - - - - - - - @@ -353,102 +353,102 @@ android:key="enableController4" android:title="@string/enable_controller"/> - - - - - - - - - - - - - - - - - - - - @@ -469,142 +469,142 @@ android:key="enableWiimote1" android:title="@string/enable_wiimote"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -617,142 +617,142 @@ android:key="enableWiimote2" android:title="@string/enable_wiimote"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -765,142 +765,142 @@ android:key="enableWiimote3" android:title="@string/enable_wiimote"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -913,142 +913,142 @@ android:key="enableWiimote4" android:title="@string/enable_wiimote"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Android/app/src/main/res/xml/preferences.xml b/Source/Android/app/src/main/res/xml/preferences.xml index b2af687783..a05cc7c14d 100644 --- a/Source/Android/app/src/main/res/xml/preferences.xml +++ b/Source/Android/app/src/main/res/xml/preferences.xml @@ -68,102 +68,102 @@ android:key="enableController1" android:title="@string/enable_controller"/> - - - - - - - - - - - - - - - - - - - - @@ -178,102 +178,102 @@ android:key="enableController2" android:title="@string/enable_controller"/> - - - - - - - - - - - - - - - - - - - - @@ -287,102 +287,102 @@ android:key="enableController3" android:title="@string/enable_controller"/> - - - - - - - - - - - - - - - - - - - - @@ -397,102 +397,102 @@ android:key="enableController4" android:title="@string/enable_controller"/> - - - - - - - - - - - - - - - - - - - -