diff options
Diffstat (limited to 'Source/Android/src')
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(); + } +} + |
