mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Android: Remove the old UI.
This commit is contained in:
@@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
-48
@@ -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;
|
||||
}
|
||||
}
|
||||
-67
@@ -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<AboutFragmentItem>
|
||||
{
|
||||
private final int id;
|
||||
private final List<AboutFragmentItem> items;
|
||||
|
||||
public AboutInfoFragmentAdapter(Context ctx, int id, List<AboutFragmentItem> 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;
|
||||
}
|
||||
}
|
||||
@@ -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<AboutFragmentItem> items = new ArrayList<AboutFragmentItem>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
-48
@@ -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<AboutFragmentItem> Input = new ArrayList<AboutFragmentItem>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
-82
@@ -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<AboutFragmentItem> Input = new ArrayList<AboutFragmentItem>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
-114
@@ -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<AboutFragmentItem> Input = new ArrayList<AboutFragmentItem>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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<AboutFragmentItem> Input = new ArrayList<AboutFragmentItem>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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;
|
||||
|
||||
|
||||
-316
@@ -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<InputDevice.MotionRange> motions = input.getMotionRanges();
|
||||
|
||||
for (InputDevice.MotionRange range : motions)
|
||||
{
|
||||
NativeLibrary.onGamePadMoveEvent(InputConfigFragment.getInputDesc(input), range.getAxis(), event.getAxisValue(range.getAxis()));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
-74
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
-159
@@ -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.
|
||||
* <p>
|
||||
* Any valid ISO/ROM selected in this will be added to
|
||||
* the game list for easy browsing the next time the
|
||||
* application is used.
|
||||
* <p>
|
||||
* 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<FolderBrowserItem> dir = new ArrayList<FolderBrowserItem>();
|
||||
List<FolderBrowserItem> fls = new ArrayList<FolderBrowserItem>();
|
||||
|
||||
// Supported extensions to filter by
|
||||
Set<String> validExts = new HashSet<String>(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);
|
||||
}
|
||||
}
|
||||
-112
@@ -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.
|
||||
* <p>
|
||||
* This is responsible for correctly handling the display
|
||||
* of the items for the {@link FolderBrowser} UI.
|
||||
*/
|
||||
public final class FolderBrowserAdapter extends ArrayAdapter<FolderBrowserItem>
|
||||
{
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
-110
@@ -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<FolderBrowserItem>
|
||||
{
|
||||
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");
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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
|
||||
|
||||
-373
@@ -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}.
|
||||
* <p>
|
||||
* 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<SideMenuItem> dir = new ArrayList<SideMenuItem>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
-124
@@ -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.
|
||||
* <p>
|
||||
* Responsible for handling each game list item individually.
|
||||
*/
|
||||
public final class GameListAdapter extends ArrayAdapter<GameListItem>
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
-150
@@ -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<GameListItem> fls = new ArrayList<GameListItem>();
|
||||
String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "ISOPaths", "0");
|
||||
int intDirectories = Integer.parseInt(Directories);
|
||||
|
||||
// Extensions to filter by.
|
||||
Set<String> exts = new HashSet<String>(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");
|
||||
}
|
||||
}
|
||||
}
|
||||
-102
@@ -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<GameListItem>
|
||||
{
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user