summaryrefslogtreecommitdiff
path: root/Source/Android/src
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Android/src')
-rw-r--r--Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java166
-rw-r--r--Source/Android/src/org/dolphinemu/dolphinemu/FileArrayAdapter.java53
-rw-r--r--Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java81
-rw-r--r--Source/Android/src/org/dolphinemu/dolphinemu/NativeListView.java94
-rw-r--r--Source/Android/src/org/dolphinemu/dolphinemu/Option.java38
5 files changed, 432 insertions, 0 deletions
diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java
new file mode 100644
index 0000000000..d94033a95e
--- /dev/null
+++ b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java
@@ -0,0 +1,166 @@
+package org.dolphinemu.dolphinemu;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.WindowManager;
+
+public class DolphinEmulator<MainActivity> extends Activity
+{
+ static private NativeGLSurfaceView GLview = null;
+ static private boolean Running = false;
+
+ private float screenWidth;
+ private float screenHeight;
+
+ public static native void onTouchEvent(int Action, float X, float Y);
+
+ static
+ {
+ try
+ {
+ System.loadLibrary("dolphin-emu-nogui");
+ }
+ catch (Exception ex)
+ {
+ Log.w("me", ex.toString());
+ }
+ }
+ private void CopyAsset(String asset, String output) {
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ in = getAssets().open(asset);
+ out = new FileOutputStream(output);
+ copyFile(in, out);
+ in.close();
+ in = null;
+ out.flush();
+ out.close();
+ out = null;
+ } catch(IOException e) {
+ Log.e("tag", "Failed to copy asset file: " + asset, e);
+ }
+ }
+ private void copyFile(InputStream in, OutputStream out) throws IOException {
+ byte[] buffer = new byte[1024];
+ int read;
+ while((read = in.read(buffer)) != -1){
+ out.write(buffer, 0, read);
+ }
+ }
+
+ @Override
+ public void onStop()
+ {
+ super.onStop();
+ if (Running)
+ NativeGLSurfaceView.StopEmulation();
+ }
+ @Override
+ public void onPause()
+ {
+ super.onPause();
+ if (Running)
+ NativeGLSurfaceView.PauseEmulation();
+ }
+ @Override
+ public void onResume()
+ {
+ super.onResume();
+ if (Running)
+ NativeGLSurfaceView.UnPauseEmulation();
+ }
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState == null)
+ {
+ Intent ListIntent = new Intent(this, NativeListView.class);
+ startActivityForResult(ListIntent, 1);
+
+ // Make the assets directory
+ File directory = new File(
+ Environment.getExternalStorageDirectory()+File.separator+"dolphin-emu"+File.separator+"Config");
+ directory.mkdirs();
+
+ // Copy assets if needed
+ java.io.File file = new java.io.File(
+ Environment.getExternalStorageDirectory()+File.separator+"dolphin-emu" + File.separator + "ButtonStart.png");
+ if(!file.exists())
+ {
+ CopyAsset("ButtonA.png",
+ Environment.getExternalStorageDirectory()+File.separator+
+ "dolphin-emu" + File.separator + "ButtonA.png");
+ CopyAsset("ButtonB.png",
+ Environment.getExternalStorageDirectory()+File.separator+
+ "dolphin-emu" + File.separator + "ButtonB.png");
+ CopyAsset("ButtonStart.png",
+ Environment.getExternalStorageDirectory()+File.separator+
+ "dolphin-emu" + File.separator + "ButtonStart.png");
+ CopyAsset("GCPadNew.ini",
+ Environment.getExternalStorageDirectory()+File.separator+
+ "dolphin-emu" + File.separator +"Config"+ File.separator +"GCPadNew.ini");
+ }
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data)
+ {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (resultCode == Activity.RESULT_OK)
+ {
+ DisplayMetrics displayMetrics = new DisplayMetrics();
+ WindowManager wm = (WindowManager) getApplicationContext().getSystemService(getApplicationContext().WINDOW_SERVICE); // the results will be higher than using the activity context object or the getWindowManager() shortcut
+ wm.getDefaultDisplay().getMetrics(displayMetrics);
+ screenWidth = displayMetrics.widthPixels;
+ screenHeight = displayMetrics.heightPixels;
+
+ String FileName = data.getStringExtra("Select");
+ GLview = new NativeGLSurfaceView(this);
+ //this.getWindow().setUiOptions(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN, View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
+ GLview.SetDimensions(screenWidth, screenHeight);
+ GLview.SetFileName(FileName);
+ setContentView(GLview);
+ Running = true;
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event)
+ {
+ float X, Y;
+ int Action;
+ X = event.getX();
+ Y = event.getY();
+ Action = event.getActionMasked();
+
+ // Converts button locations 0 - 1 to OGL screen coords -1.0 - 1.0
+ float ScreenX = ((X / screenWidth) * 2.0f) - 1.0f;
+ float ScreenY = ((Y / screenHeight) * -2.0f) + 1.0f;
+
+ onTouchEvent(Action, ScreenX, ScreenY);
+
+ return false;
+ }
+
+ public boolean overrideKeys()
+ {
+ return false;
+ }
+
+} \ No newline at end of file
diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/FileArrayAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/FileArrayAdapter.java
new file mode 100644
index 0000000000..b49149a36c
--- /dev/null
+++ b/Source/Android/src/org/dolphinemu/dolphinemu/FileArrayAdapter.java
@@ -0,0 +1,53 @@
+package org.dolphinemu.dolphinemu;
+
+import java.util.List;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
+
+public class FileArrayAdapter extends ArrayAdapter<Option>{
+
+ private Context c;
+ private int id;
+ private List<Option>items;
+
+ public FileArrayAdapter(Context context, int textViewResourceId,
+ List<Option> objects) {
+ super(context, textViewResourceId, objects);
+ c = context;
+ id = textViewResourceId;
+ items = objects;
+ }
+ public Option getItem(int i)
+ {
+ return items.get(i);
+ }
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View v = convertView;
+ if (v == null) {
+ LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ v = vi.inflate(id, null);
+ }
+ final Option o = items.get(position);
+ if (o != null) {
+ TextView t1 = (TextView) v.findViewById(R.id.TextView01);
+ TextView t2 = (TextView) v.findViewById(R.id.TextView02);
+
+ if(t1!=null)
+ t1.setText(o.getName());
+ if(t2!=null)
+ t2.setText(o.getData());
+
+ }
+ return v;
+ }
+
+
+
+}
+
diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java
new file mode 100644
index 0000000000..25c7ace0a0
--- /dev/null
+++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java
@@ -0,0 +1,81 @@
+package org.dolphinemu.dolphinemu;
+
+import android.content.Context;
+import android.opengl.GLSurfaceView;
+import android.util.Log;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+
+public class NativeGLSurfaceView extends SurfaceView {
+ static private String FileName;
+ static private Thread myRun;
+ static private boolean Running = false;
+ static private boolean Created = false;
+ static private float width;
+ static private float height;
+
+ public static native void main(String File, Surface surf, int width, int height);
+ public static native void UnPauseEmulation();
+ public static native void PauseEmulation();
+ public static native void StopEmulation();
+
+ static
+ {
+ try
+ {
+ System.loadLibrary("dolphin-emu-nogui");
+ }
+ catch (Exception ex)
+ {
+ Log.w("me", ex.toString());
+ }
+ }
+
+ public NativeGLSurfaceView(Context context) {
+ super(context);
+ if (!Created)
+ {
+ myRun = new Thread()
+ {
+ @Override
+ public void run() {
+ main(FileName, getHolder().getSurface(), (int)width, (int)height);
+ }
+ };
+ 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 arg0, int arg1,
+ int arg2, int arg3) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void surfaceDestroyed(SurfaceHolder arg0) {
+ // TODO Auto-generated method stub
+
+ }
+ });
+ Created = true;
+ }
+ }
+
+ public void SetFileName(String file)
+ {
+ FileName = file;
+ }
+
+ public void SetDimensions(float screenWidth, float screenHeight)
+ {
+ width = screenWidth;
+ height = screenHeight;
+ }
+}
diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeListView.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeListView.java
new file mode 100644
index 0000000000..0b30cda639
--- /dev/null
+++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeListView.java
@@ -0,0 +1,94 @@
+package org.dolphinemu.dolphinemu;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import android.app.Activity;
+import android.app.ListActivity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Environment;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.Toast;
+
+public class NativeListView extends ListActivity {
+ private FileArrayAdapter adapter;
+ static private File currentDir = null;
+
+ private void Fill(File f)
+ {
+ File[]dirs = f.listFiles();
+ this.setTitle("Current Dir: " + f.getName());
+ List<Option>dir = new ArrayList<Option>();
+ List<Option>fls = new ArrayList<Option>();
+
+ try
+ {
+ for(File ff: dirs)
+ {
+ if (ff.getName().charAt(0) != '.')
+ if(ff.isDirectory())
+ dir.add(new Option(ff.getName(),"Folder",ff.getAbsolutePath()));
+ else
+ if (ff.getName().toLowerCase().indexOf(".gcm") >= 0 ||
+ ff.getName().toLowerCase().indexOf(".iso") >= 0 ||
+ ff.getName().toLowerCase().indexOf(".wbfs") >= 0 ||
+ ff.getName().toLowerCase().indexOf(".gcz") >= 0 ||
+ ff.getName().toLowerCase().indexOf(".dol") >= 0 ||
+ ff.getName().toLowerCase().indexOf(".elf") >= 0)
+ fls.add(new Option(ff.getName(),"File Size: "+ff.length(),ff.getAbsolutePath()));
+ }
+ }
+ catch(Exception e)
+ {
+ }
+
+ Collections.sort(dir);
+ Collections.sort(fls);
+ dir.addAll(fls);
+
+ if(!f.getName().equalsIgnoreCase("sdcard"))
+ dir.add(0,new Option("..","Parent Directory",f.getParent()));
+ adapter = new FileArrayAdapter(this,R.layout.main,dir);
+ this.setListAdapter(adapter);
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ // TODO Auto-generated method stub
+ super.onListItemClick(l, v, position, id);
+ Option o = adapter.getItem(position);
+ if(o.getData().equalsIgnoreCase("folder")||o.getData().equalsIgnoreCase("parent directory")){
+ currentDir = new File(o.getPath());
+ Fill(currentDir);
+ }
+ else
+ {
+ onFileClick(o.getPath());
+ }
+ }
+
+ private void onFileClick(String o)
+ {
+ Toast.makeText(this, "File Clicked: " + o, Toast.LENGTH_SHORT).show();
+
+ Intent intent = new Intent();
+ intent.putExtra("Select", o);
+ setResult(Activity.RESULT_OK, intent);
+
+ this.finish();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ if(currentDir == null)
+ currentDir = new File(Environment.getExternalStorageDirectory().getPath());
+ Fill(currentDir);
+ }
+}
diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/Option.java b/Source/Android/src/org/dolphinemu/dolphinemu/Option.java
new file mode 100644
index 0000000000..dba6dfd534
--- /dev/null
+++ b/Source/Android/src/org/dolphinemu/dolphinemu/Option.java
@@ -0,0 +1,38 @@
+package org.dolphinemu.dolphinemu;
+
+public class Option implements Comparable<Option>{
+ private String name;
+ private String data;
+ private String path;
+
+ public Option(String n,String d,String p)
+ {
+ name = n;
+ data = d;
+ path = p;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public String getData()
+ {
+ return data;
+ }
+
+ public String getPath()
+ {
+ return path;
+ }
+
+ public int compareTo(Option o)
+ {
+ if(this.name != null)
+ return this.name.toLowerCase().compareTo(o.getName().toLowerCase());
+ else
+ throw new IllegalArgumentException();
+ }
+}
+