diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2013-06-18 07:09:20 -0500 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2013-06-18 07:09:38 -0500 |
| commit | 7223778520472bc2cca33632df56e451fc1d3796 (patch) | |
| tree | db11405cd792b4dd3de08c30a822033e2c2bbee2 /Source/Android/src | |
| parent | a518a1cbdcc311af1b01eeb940b3fb57f6f15554 (diff) | |
[Android] Gamepad input. Refactor JNI native functions to all pull from a single class instead of everywhere willy-nilly
Diffstat (limited to 'Source/Android/src')
8 files changed, 398 insertions, 75 deletions
diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java index bee3e5fcca..d8432b7e22 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java @@ -7,10 +7,13 @@ import android.os.Bundle; import android.os.Environment; import android.util.DisplayMetrics; import android.util.Log; +import android.view.InputDevice; +import android.view.KeyEvent; import android.view.MotionEvent; import android.view.WindowManager; import java.io.*; +import java.util.List; public class DolphinEmulator<MainActivity> extends Activity { @@ -20,19 +23,6 @@ public class DolphinEmulator<MainActivity> extends Activity 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; @@ -49,6 +39,7 @@ public class DolphinEmulator<MainActivity> extends Activity 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; @@ -62,21 +53,21 @@ public class DolphinEmulator<MainActivity> extends Activity { super.onStop(); if (Running) - NativeGLSurfaceView.StopEmulation(); + NativeLibrary.StopEmulation(); } @Override public void onPause() { super.onPause(); if (Running) - NativeGLSurfaceView.PauseEmulation(); + NativeLibrary.PauseEmulation(); } @Override public void onResume() { super.onResume(); if (Running) - NativeGLSurfaceView.UnPauseEmulation(); + NativeLibrary.UnPauseEmulation(); } /** Called when the activity is first created. */ @@ -158,14 +149,46 @@ public class DolphinEmulator<MainActivity> extends Activity float ScreenX = ((X / screenWidth) * 2.0f) - 1.0f; float ScreenY = ((Y / screenHeight) * -2.0f) + 1.0f; - onTouchEvent(Action, ScreenX, ScreenY); + NativeLibrary.onTouchEvent(Action, ScreenX, ScreenY); return false; } - - public boolean overrideKeys() - { - return false; - } + + // Gets button presses + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + int action = 0; + switch (event.getAction()) { + case KeyEvent.ACTION_DOWN: + action = 0; + break; + case KeyEvent.ACTION_UP: + action = 1; + break; + default: + break; + } + InputDevice input = event.getDevice(); + NativeLibrary.onGamePadEvent(input.getDescriptor(), event.getKeyCode(), action); + return true; + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) { + if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0)) { + return super.dispatchGenericMotionEvent(event); + } + + InputDevice input = event.getDevice(); + List<InputDevice.MotionRange> motions = input.getMotionRanges(); + for (int a = 0; a < motions.size(); ++a) + { + InputDevice.MotionRange range; + range = motions.get(a); + NativeLibrary.onGamePadMoveEvent(input.getDescriptor(), range.getAxis(), event.getAxisValue(range.getAxis())); + } + + return true; + } }
\ No newline at end of file diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java index 87137db48d..3018300b12 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java @@ -1,33 +1,19 @@ package org.dolphinemu.dolphinemu; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.util.Log; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; public class GameListItem implements Comparable<GameListItem>{ private String name; private String data; private String path; private Bitmap image; - public static native int[] GetBanner(String filename); - public static native String GetTitle(String filename); - static - { - try - { - System.loadLibrary("dolphin-emu-nogui"); - } - catch (Exception ex) - { - Log.w("me", ex.toString()); - } - } - + public GameListItem(Context ctx, String n,String d,String p) { name = n; @@ -36,7 +22,7 @@ public class GameListItem implements Comparable<GameListItem>{ File file = new File(path); if (!file.isDirectory()) { - int[] Banner = GetBanner(path); + int[] Banner = NativeLibrary.GetBanner(path); if (Banner[0] == 0) { try { @@ -50,7 +36,7 @@ public class GameListItem implements Comparable<GameListItem>{ } else image = Bitmap.createBitmap(Banner, 96, 32, Bitmap.Config.ARGB_8888); - name = GetTitle(path); + name = NativeLibrary.GetTitle(path); } } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListView.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListView.java index 314e8e0ae5..ac1329f6a9 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListView.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/GameListView.java @@ -24,22 +24,18 @@ public class GameListView extends ListActivity { private SideMenuAdapter mAdapter; private static GameListView me; - public static native String GetConfig(String Key, String Value, String Default); - public static native void SetConfig(String Key, String Value, String Default); enum keyTypes {TYPE_STRING, TYPE_BOOL}; private void Fill() { - - this.setTitle("Game List"); List<GameListItem>fls = new ArrayList<GameListItem>(); - String Directories = GetConfig("General", "GCMPathes", "0"); + String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); int intDirectories = Integer.parseInt(Directories); for (int a = 0; a < intDirectories; ++a) { - String BrowseDir = GetConfig("General", "GCMPath" + Integer.toString(a), ""); + String BrowseDir = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPath" + Integer.toString(a), ""); File currentDir = new File(BrowseDir); File[]dirs = currentDir.listFiles(); try @@ -101,11 +97,11 @@ public class GameListView extends ListActivity { { String FileName = data.getStringExtra("Select"); Toast.makeText(this, "Folder Selected: " + FileName, Toast.LENGTH_SHORT).show(); - String Directories = GetConfig("General", "GCMPathes", "0"); + String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); int intDirectories = Integer.parseInt(Directories); Directories = Integer.toString(intDirectories + 1); - SetConfig("General", "GCMPathes", Directories); - SetConfig("General", "GCMPath" + Integer.toString(intDirectories), FileName); + NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPathes", Directories); + NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPath" + Integer.toString(intDirectories), FileName); Fill(); } @@ -142,16 +138,19 @@ public class GameListView extends ListActivity { { case TYPE_STRING: String strPref = prefs.getString(Keys[a], ""); - SetConfig(Key, Value, strPref); + NativeLibrary.SetConfig("Dolphin.ini", Key, Value, strPref); break; case TYPE_BOOL: boolean boolPref = prefs.getBoolean(Keys[a], true); - SetConfig(Key, Value, boolPref ? "True" : "False"); + NativeLibrary.SetConfig("Dolphin.ini", Key, Value, boolPref ? "True" : "False"); break; } } break; + case 3: // Gamepad settings + /* Do Nothing */ + break; } } @@ -169,6 +168,7 @@ public class GameListView extends ListActivity { List<SideMenuItem>dir = new ArrayList<SideMenuItem>(); dir.add(new SideMenuItem("Browse Folder", 0)); dir.add(new SideMenuItem("Settings", 1)); + dir.add(new SideMenuItem("Gamepad Config", 2)); ListView mList = new ListView(this); mAdapter = new SideMenuAdapter(this,R.layout.sidemenu,dir); @@ -193,6 +193,11 @@ public class GameListView extends ListActivity { Intent SettingIntent = new Intent(me, PrefsActivity.class); startActivityForResult(SettingIntent, 2); break; + case 2: + Toast.makeText(me, "Loading up settings", Toast.LENGTH_SHORT).show(); + Intent ConfigIntent = new Intent(me, InputConfigActivity.class); + startActivityForResult(ConfigIntent, 3); + break; default: break; } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigActivity.java new file mode 100644 index 0000000000..1df812b830 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigActivity.java @@ -0,0 +1,181 @@ +package org.dolphinemu.dolphinemu; + +import android.app.Activity; +import android.app.ListActivity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ListView; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ +public class InputConfigActivity extends ListActivity { + private InputConfigAdapter adapter; + private int configPosition = 0; + boolean Configuring = false; + boolean firstEvent = true; + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + List<InputConfigItem> Input = new ArrayList<InputConfigItem>(); + int a = 0; + + Input.add(a++, new InputConfigItem("Draw on-screen controls", "Android-ScreenControls", "True")); + Input.add(a++, new InputConfigItem("Button A", "Android-InputA")); + Input.add(a++, new InputConfigItem("Button B", "Android-InputB")); + Input.add(a++, new InputConfigItem("Button Start", "Android-InputStart")); + Input.add(a++, new InputConfigItem("Button X", "Android-InputX")); + Input.add(a++, new InputConfigItem("Button Y", "Android-InputY")); + Input.add(a++, new InputConfigItem("Button Z", "Android-InputZ")); + Input.add(a++, new InputConfigItem("D-Pad Up", "Android-DPadUp")); + Input.add(a++, new InputConfigItem("D-Pad Down", "Android-DPadDown")); + Input.add(a++, new InputConfigItem("D-Pad Left", "Android-DPadLeft")); + Input.add(a++, new InputConfigItem("D-Pad Right", "Android-DPadRight")); + Input.add(a++, new InputConfigItem("Main Stick Up", "Android-MainUp")); + Input.add(a++, new InputConfigItem("Main Stick Down", "Android-MainDown")); + Input.add(a++, new InputConfigItem("Main Stick Left", "Android-MainLeft")); + Input.add(a++, new InputConfigItem("Main Stick Right", "Android-MainRight")); + Input.add(a++, new InputConfigItem("C Stick Up", "Android-CStickUp")); + Input.add(a++, new InputConfigItem("C Stick Down", "Android-CStickDown")); + Input.add(a++, new InputConfigItem("C Stick Left", "Android-CStickLeft")); + Input.add(a++, new InputConfigItem("C Stick Right", "Android-CStickRight")); + Input.add(a++, new InputConfigItem("Trigger L", "Android-InputL")); + Input.add(a++, new InputConfigItem("Trigger R", "Android-InputR")); + + adapter = new InputConfigAdapter(this,R.layout.folderbrowser, Input); + this.setListAdapter(adapter); + } + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + super.onListItemClick(l, v, position, id); + InputConfigItem o = adapter.getItem(position); + switch(position) + { + case 0: // On screen controls + String newBind; + if (o.getBind() == "True") + { + Toast.makeText(this, "Not Drawing on screen controls", Toast.LENGTH_SHORT).show(); + newBind = "False"; + } + else + { + Toast.makeText(this, "Drawing on screen controls", Toast.LENGTH_SHORT).show(); + newBind = "True"; + } + adapter.remove(o); + o.setBind(newBind); + adapter.insert(o, position); + break; + default: // gamepad controls + Toast.makeText(this, "Press button to configure " + o.getName(), Toast.LENGTH_SHORT).show(); + configPosition = position; + Configuring = true; + firstEvent = true; + break; + } + + } + static ArrayList<Float> m_values = new ArrayList<Float>(); + // Gets move(triggers, joystick) events + void AssignBind(String bind) + { + InputConfigItem o = adapter.getItem(configPosition); + adapter.remove(o); + o.setBind(bind); + adapter.insert(o, configPosition); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) { + if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0)) { + return super.dispatchGenericMotionEvent(event); + } + InputDevice input = event.getDevice(); + List<InputDevice.MotionRange> motions = input.getMotionRanges(); + if (Configuring) + { + if (firstEvent) + { + m_values.clear(); + for (int a = 0; a < motions.size(); ++a) + { + InputDevice.MotionRange range = motions.get(a); + m_values.add(event.getAxisValue(range.getAxis())); + } + firstEvent = false; + } + else + { + for (int a = 0; a < motions.size(); ++a) + { + InputDevice.MotionRange range; + range = motions.get(a); + if (m_values.get(a) > (event.getAxisValue(range.getAxis()) + 0.5f)) + { + AssignBind("Device '" + input.getDescriptor() + "'-Axis " + range.getAxis() + "-"); + Configuring = false; + } + else if (m_values.get(a) < (event.getAxisValue(range.getAxis()) - 0.5f)) + { + AssignBind("Device '" + input.getDescriptor() + "'-Axis " + range.getAxis() + "+"); + Configuring = false; + } + } + } + } + return true; + } + + // Gets button presses + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + Log.w("Dolphinemu", "Got Event " + event.getAction()); + switch (event.getAction()) { + case KeyEvent.ACTION_DOWN: + case KeyEvent.ACTION_UP: + if (Configuring) + { + InputDevice input = event.getDevice(); + AssignBind("Device '" + input.getDescriptor() + "'-Button " + event.getKeyCode()); + Configuring = false; + return true; + } + default: + break; + } + + return super.dispatchKeyEvent(event); + } + + @Override + public void onBackPressed() { + for (int a = 0; a < adapter.getCount(); ++a) + { + InputConfigItem o = adapter.getItem(a); + String config = o.getConfig(); + String bind = o.getBind(); + String ConfigValues[] = config.split("-"); + String Key = ConfigValues[0]; + String Value = ConfigValues[1]; + NativeLibrary.SetConfig("Dolphin.ini", Key, Value, bind); + } + Intent intent = new Intent(); + setResult(Activity.RESULT_OK, intent); + this.finish(); + super.onBackPressed(); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java new file mode 100644 index 0000000000..4430126d46 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java @@ -0,0 +1,56 @@ +package org.dolphinemu.dolphinemu; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import java.util.List; + +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ +public class InputConfigAdapter extends ArrayAdapter<InputConfigItem> { + private Context c; + private int id; + private List<InputConfigItem> items; + + public InputConfigAdapter(Context context, int textViewResourceId, + List<InputConfigItem> objects) { + super(context, textViewResourceId, objects); + c = context; + id = textViewResourceId; + items = objects; + } + + public InputConfigItem 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 InputConfigItem 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.getBind()); + } + return v; + } + + + +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java new file mode 100644 index 0000000000..7511406dc9 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java @@ -0,0 +1,56 @@ +package org.dolphinemu.dolphinemu; + +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ +public class InputConfigItem implements Comparable<InputConfigItem>{ + private String m_name; + private String m_Config; + private String m_bind; + + private void Init(String n, String c, String d) + { + m_name = n; + m_Config = c; + String ConfigValues[] = m_Config.split("-"); + String Key = ConfigValues[0]; + String Value = ConfigValues[1]; + m_bind = NativeLibrary.GetConfig("Dolphin.ini", Key, Value, d); + } + + public InputConfigItem(String n, String c, String d) + { + Init(n, c, d); + } + + public InputConfigItem(String n, String c) + { + Init(n, c, "None"); + } + public String getName() + { + return m_name; + } + public String getConfig() + { + return m_Config; + } + public String getBind() + { + return m_bind; + } + public void setBind(String b) + { + m_bind = b; + } + + public int compareTo(InputConfigItem o) + { + if(this.m_name != null) + return this.m_name.toLowerCase().compareTo(o.getName().toLowerCase()); + else + throw new IllegalArgumentException(); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java index 25c7ace0a0..8a8041a08b 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java @@ -1,9 +1,6 @@ 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; @@ -14,23 +11,6 @@ public class NativeGLSurfaceView extends SurfaceView { 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); @@ -40,7 +20,7 @@ public class NativeGLSurfaceView extends SurfaceView { { @Override public void run() { - main(FileName, getHolder().getSurface(), (int)width, (int)height); + NativeLibrary.Run(FileName, getHolder().getSurface(), (int)width, (int)height); } }; getHolder().addCallback(new SurfaceHolder.Callback() { diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java new file mode 100644 index 0000000000..52918a040a --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -0,0 +1,36 @@ +package org.dolphinemu.dolphinemu; + +import android.util.Log; +import android.view.Surface; + +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ +public class NativeLibrary { + public static native void onTouchEvent(int Action, float X, float Y); + public static native void onGamePadEvent(String Device, int Button, int Action); + public static native void onGamePadMoveEvent(String Device, int Axis, float Value); + public static native String GetConfig(String configFile, String Key, String Value, String Default); + public static native void SetConfig(String configFile, String Key, String Value, String Default); + public static native int[] GetBanner(String filename); + public static native String GetTitle(String filename); + + public static native void Run(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()); + } + } +} |
