diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseGLActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseGLActivity.java new file mode 100644 index 000000000..1fbecb1a6 --- /dev/null +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseGLActivity.java @@ -0,0 +1,217 @@ +package com.reicast.emulator; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v4.app.ActivityCompat; +import android.util.Log; +import android.view.Gravity; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.widget.TextView; + +import com.reicast.emulator.config.Config; +import com.reicast.emulator.debug.GenerateLogs; +import com.reicast.emulator.emu.AudioBackend; +import com.reicast.emulator.emu.JNIdc; +import com.reicast.emulator.periph.InputDeviceManager; +import com.reicast.emulator.periph.SipEmulator; + +import java.util.ArrayList; +import java.util.List; + +import tv.ouya.console.api.OuyaController; + +public class BaseGLActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback { + protected View mView; + protected SharedPreferences prefs; + protected float[][] vjoy_d_cached; // Used for VJoy editing + private AudioBackend audioBackend; + private Handler handler = new Handler(); + public static byte[] syms; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + prefs = PreferenceManager.getDefaultSharedPreferences(this); + + Emulator app = (Emulator)getApplicationContext(); + app.getConfigurationPrefs(); + Emulator.setCurrentActivity(this); + + OuyaController.init(this); + + String home_directory = prefs.getString(Config.pref_home, ""); + String result = JNIdc.initEnvironment((Emulator)getApplicationContext(), home_directory); + if (result != null) + showToastMessage("Initialization failed: " + result, Snackbar.LENGTH_LONG); + + String android_home_directory = Environment.getExternalStorageDirectory().getAbsolutePath(); + List pathList = new ArrayList<>(); + pathList.add(android_home_directory); + pathList.addAll(FileBrowser.getExternalMounts()); + Log.i("reicast", "External storage dirs: " + pathList); + JNIdc.setExternalStorageDirectories(pathList.toArray()); + + InputDeviceManager.getInstance().startListening(getApplicationContext()); + register(this); + + audioBackend = new AudioBackend(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + InputDeviceManager.getInstance().stopListening(); + register(null); + audioBackend.release(); + Emulator.setCurrentActivity(null); + stopEmulator(); + } + + private boolean showMenu() { + JNIdc.guiOpenSettings(); + return true; + } + + private boolean processJoystickInput(MotionEvent event, int axis) { + float v = event.getAxisValue(axis); + return InputDeviceManager.getInstance().joystickAxisEvent(event.getDeviceId(), axis, (int)Math.round(v * 32767.f)); + } + @Override + public boolean onGenericMotionEvent(MotionEvent event) { + if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK && event.getAction() == MotionEvent.ACTION_MOVE) { + boolean rc = processJoystickInput(event, MotionEvent.AXIS_X); + rc |= processJoystickInput(event, MotionEvent.AXIS_Y); + rc |= processJoystickInput(event, MotionEvent.AXIS_LTRIGGER); + rc |= processJoystickInput(event, MotionEvent.AXIS_RTRIGGER); + rc |= processJoystickInput(event, MotionEvent.AXIS_RX); + rc |= processJoystickInput(event, MotionEvent.AXIS_RY); + if (rc) + return true; + } + else if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == InputDevice.SOURCE_CLASS_POINTER) + { + if (mView != null) { + float scl = mView.getHeight() / 480.0f; + float tx = (mView.getWidth() - 640.0f * scl) / 2; + int xpos = Math.round((event.getX() - tx) / scl); + int ypos = Math.round(event.getY() / scl); + InputDeviceManager.getInstance().mouseEvent(xpos, ypos, event.getButtonState()); + } + + } + return super.onGenericMotionEvent(event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, false)) + return true; + return super.onKeyUp(keyCode, event); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (!JNIdc.guiIsOpen()) { + showMenu(); + return true; + } + else if (JNIdc.guiIsContentBrowser()) { + // Only if this is the main activity + //finish(); + // so for now we hack it + Intent startMain = new Intent(Intent.ACTION_MAIN); + startMain.addCategory(Intent.CATEGORY_HOME); + startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(startMain); + return true; + } + } + if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, true)) + return true; + + if (ViewConfiguration.get(this).hasPermanentMenuKey()) { + if (keyCode == KeyEvent.KEYCODE_MENU) { + return showMenu(); + } + } + return super.onKeyDown(keyCode, event); + } + + private void showToastMessage(String message, int duration) { + View view = findViewById(android.R.id.content); + Snackbar snackbar = Snackbar.make(view, message, duration); + View snackbarLayout = snackbar.getView(); + TextView textView = (TextView) snackbarLayout.findViewById( + android.support.design.R.id.snackbar_text); + textView.setGravity(Gravity.CENTER_VERTICAL); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) + textView.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); + textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_notification, 0, 0, 0); + textView.setCompoundDrawablePadding(getResources() + .getDimensionPixelOffset(R.dimen.snackbar_icon_padding)); + snackbar.show(); + } + + protected void stopEmulator() { + JNIdc.stop(); + } + + void requestRecordAudioPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + handler.post(new Runnable() { + @Override + public void run() { + mView.setVisibility(View.INVISIBLE); + ActivityCompat.requestPermissions(BaseGLActivity.this, + new String[]{ + Manifest.permission.RECORD_AUDIO + }, + 0); + + } + }); + } + else + { + onRequestPermissionsResult(0, new String[] { Manifest.permission.RECORD_AUDIO }, + new int[] { PackageManager.PERMISSION_GRANTED }); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (permissions.length > 0 && Manifest.permission.RECORD_AUDIO .equals(permissions[0]) && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + SipEmulator sip = new SipEmulator(); + sip.startRecording(); + JNIdc.setupMic(sip); + } + } + + // Called from native code + private void generateErrorLog() { + try { + new GenerateLogs(this).execute(getFilesDir().getAbsolutePath()); + } catch (RuntimeException e) { + showToastMessage("An error occurred retrieving the log file: " + e.getMessage(), Snackbar.LENGTH_LONG); + } + } + + private static native void register(BaseGLActivity activity); +} diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseNativeGLActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseNativeGLActivity.java deleted file mode 100644 index f62c715a9..000000000 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseNativeGLActivity.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.reicast.emulator; - -import android.app.Activity; -import android.net.Uri; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.util.Log; -import android.view.SurfaceHolder; - -import com.reicast.emulator.emu.JNIdc; -import com.reicast.emulator.emu.NativeGLView; - -public class BaseNativeGLActivity extends Activity { - protected NativeGLView mView; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Create the actual GL view -// mView = new NativeGLView(this); -// setContentView(mView); - setContentView(R.layout.nativegl_content); - mView = (NativeGLView)findViewById(R.id.glView); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - stopEmulator(); - } - - protected void stopEmulator() { - JNIdc.stop(); - } -} diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java index 4a5095251..7b958fa71 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java @@ -1,47 +1,17 @@ package com.reicast.emulator; -import android.Manifest; -import android.app.Activity; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; -import android.util.Log; -import android.view.Gravity; -import android.view.InputDevice; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.ViewConfiguration; -import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; -import android.widget.PopupWindow; import com.reicast.emulator.config.Config; import com.reicast.emulator.emu.GL2JNIView; import com.reicast.emulator.emu.JNIdc; -import com.reicast.emulator.emu.OnScreenMenu; -import com.reicast.emulator.periph.Gamepad; -import com.reicast.emulator.periph.InputDeviceManager; -import com.reicast.emulator.periph.SipEmulator; - -import java.util.HashMap; - -import tv.ouya.console.api.OuyaController; - -public class GL2JNIActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback { - public GL2JNIView mView; - private SharedPreferences prefs; - - private Gamepad pad = new Gamepad(); - - public static byte[] syms; +import com.reicast.emulator.periph.VJoy; +public class GL2JNIActivity extends BaseGLActivity implements ActivityCompat.OnRequestPermissionsResultCallback { @Override protected void onCreate(Bundle icicle) { requestWindowFeature(Window.FEATURE_NO_TITLE); @@ -51,261 +21,73 @@ public class GL2JNIActivity extends Activity implements ActivityCompat.OnRequest WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); } - InputDeviceManager.getInstance().startListening(getApplicationContext()); - - Emulator app = (Emulator)getApplicationContext(); - app.getConfigurationPrefs(); - - pad.isOuyaOrTV = pad.IsOuyaOrTV(GL2JNIActivity.this, false); - - /* - * try { //int rID = - * getResources().getIdentifier("fortyonepost.com.lfas:raw/syms.map", - * null, null); //get the file as a stream InputStream is = - * getResources().openRawResource(R.raw.syms); - * - * syms = new byte[(int) is.available()]; is.read(syms); is.close(); } - * catch (IOException e) { e.getMessage(); e.printStackTrace(); } - */ - - String fileName = null; // Call parent onCreate() super.onCreate(icicle); - OuyaController.init(this); - // Populate device descriptor-to-player-map from preferences - pad.deviceDescriptor_PlayerNum.put( - prefs.getString(Gamepad.pref_player1, null), 0); - pad.deviceDescriptor_PlayerNum.put( - prefs.getString(Gamepad.pref_player2, null), 1); - pad.deviceDescriptor_PlayerNum.put( - prefs.getString(Gamepad.pref_player3, null), 2); - pad.deviceDescriptor_PlayerNum.put( - prefs.getString(Gamepad.pref_player4, null), 3); - pad.deviceDescriptor_PlayerNum.remove(null); - - // JNIdc.initControllers(Emulator.maple_devices, Emulator.maple_expansion_devices); - - int joys[] = InputDevice.getDeviceIds(); - for (int joy: joys) { - String descriptor; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - descriptor = InputDevice.getDevice(joy).getDescriptor(); - } else { - descriptor = InputDevice.getDevice(joy).getName(); - } - Log.d("reicast", "InputDevice ID: " + joy); - Log.d("reicast", - "InputDevice Name: " - + InputDevice.getDevice(joy).getName()); - Log.d("reicast", "InputDevice Descriptor: " + descriptor); - pad.deviceId_deviceDescriptor.put(joy, descriptor); - } - - boolean detected = false; - for (int joy : joys) { - Integer playerNum = pad.deviceDescriptor_PlayerNum - .get(pad.deviceId_deviceDescriptor.get(joy)); - - if (playerNum != null) { - detected = true; - String id = pad.portId[playerNum]; - pad.custom[playerNum] = prefs.getBoolean(Gamepad.pref_js_modified + id, false); - pad.compat[playerNum] = prefs.getBoolean(Gamepad.pref_js_compat + id, false); - pad.joystick[playerNum] = prefs.getBoolean(Gamepad.pref_js_merged + id, false); - if (InputDevice.getDevice(joy).getName() - .contains(Gamepad.controllers_gamekey)) { - if (pad.custom[playerNum]) { - pad.setCustomMapping(id, playerNum, prefs); - } else { - pad.map[playerNum] = pad.getConsoleController(); - } - } else if (!pad.compat[playerNum]) { - if (pad.custom[playerNum]) { - pad.setCustomMapping(id, playerNum, prefs); - } else if (InputDevice.getDevice(joy).getName() - .equals(Gamepad.controllers_sony)) { - pad.map[playerNum] = pad.getConsoleController(); - } else if (InputDevice.getDevice(joy).getName() - .equals(Gamepad.controllers_xbox)) { - pad.map[playerNum] = pad.getConsoleController(); - } else if (InputDevice.getDevice(joy).getName() - .contains(Gamepad.controllers_shield)) { - pad.map[playerNum] = pad.getConsoleController(); - } else if (InputDevice.getDevice(joy).getName() - .startsWith(Gamepad.controllers_moga)) { - pad.map[playerNum] = pad.getMogaController(); - } else { // Ouya controller - pad.map[playerNum] = pad.getOUYAController(); - } - } else { - pad.getCompatibilityMap(playerNum, id, prefs); - } - pad.initJoyStickLayout(playerNum); - } - } - if (joys.length == 0 || !detected) { - pad.fullCompatibilityMode(prefs); - } - - // Create the actual GLES view + // Create the actual GLES view mView = new GL2JNIView(GL2JNIActivity.this, false, - prefs.getInt(Config.pref_renderdepth, 24), 8, false); + prefs.getInt(Config.pref_renderdepth, 24), 8); setContentView(mView); //setup mic - if (Emulator.micPluggedIn()) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - ActivityCompat.requestPermissions(this, - new String[]{ - Manifest.permission.RECORD_AUDIO - }, - 0); - } - else - { - onRequestPermissionsResult(0, new String[] { Manifest.permission.RECORD_AUDIO }, new int[] { PackageManager.PERMISSION_GRANTED }); - } - } - } - - public Gamepad getPad() { - return pad; + if (Emulator.micPluggedIn()) + requestRecordAudioPermission(); } public void screenGrab() { - mView.screenGrab(); - } - - public void displayPopUp(PopupWindow popUp) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - popUp.showAtLocation(mView, Gravity.BOTTOM, 0, 60); - } else { - popUp.showAtLocation(mView, Gravity.BOTTOM, 0, 0); - } - popUp.update(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT); - } - - public void displayConfig(PopupWindow popUpConfig) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - popUpConfig.showAtLocation(mView, Gravity.BOTTOM, 0, 60); - } else { - popUpConfig.showAtLocation(mView, Gravity.BOTTOM, 0, 0); - } - popUpConfig.update(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT); - } - - public void displayDebug(PopupWindow popUpDebug) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - popUpDebug.showAtLocation(mView, Gravity.BOTTOM, 0, 60); - } else { - popUpDebug.showAtLocation(mView, Gravity.BOTTOM, 0, 0); - } - popUpDebug.update(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT); - } - - private boolean showMenu() { - JNIdc.guiOpenSettings(); - return true; - } - - private boolean processJoystickInput(MotionEvent event, int axis) { - float v = event.getAxisValue(axis); - return InputDeviceManager.getInstance().joystickAxisEvent(event.getDeviceId(), axis, (int)Math.round(v * 32767.f)); - } - @Override - public boolean onGenericMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK && event.getAction() == MotionEvent.ACTION_MOVE) { - boolean rc = processJoystickInput(event, MotionEvent.AXIS_X); - rc |= processJoystickInput(event, MotionEvent.AXIS_Y); - rc |= processJoystickInput(event, MotionEvent.AXIS_LTRIGGER); - rc |= processJoystickInput(event, MotionEvent.AXIS_RTRIGGER); - rc |= processJoystickInput(event, MotionEvent.AXIS_RX); - rc |= processJoystickInput(event, MotionEvent.AXIS_RY); - if (rc) - return true; - } - else if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == InputDevice.SOURCE_CLASS_POINTER) - { - if (mView != null) { - float scl = mView.getHeight() / 480.0f; - float tx = (mView.getWidth() - 640.0f * scl) / 2; - int xpos = Math.round((event.getX() - tx) / scl); - int ypos = Math.round(event.getY() / scl); - InputDeviceManager.getInstance().mouseEvent(xpos, ypos, event.getButtonState()); - } - - } - return super.onGenericMotionEvent(event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, false)) - return true; - return super.onKeyUp(keyCode, event); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - // FIXME - showMenu(); - } - if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, true)) - return true; - - if (keyCode == pad.getSelectButtonCode()) { - return showMenu(); - } - if (ViewConfiguration.get(this).hasPermanentMenuKey()) { - if (keyCode == KeyEvent.KEYCODE_MENU) { - return showMenu(); - } - } - return super.onKeyDown(keyCode, event); + ((GL2JNIView)mView).screenGrab(); } @Override protected void onPause() { super.onPause(); - mView.onPause(); + ((GL2JNIView)mView).onPause(); JNIdc.pause(); } @Override protected void onDestroy() { super.onDestroy(); - InputDeviceManager.getInstance().stopListening(); if (mView != null) { - mView.onDestroy(); - JNIdc.destroy(); + ((GL2JNIView)mView).onDestroy(); } } - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - } - @Override protected void onResume() { super.onResume(); - mView.onResume(); + ((GL2JNIView)mView).onResume(); JNIdc.resume(); } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (permissions.length > 0 && Manifest.permission.RECORD_AUDIO .equals(permissions[0]) && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - SipEmulator sip = new SipEmulator(); - sip.startRecording(); - JNIdc.setupMic(sip); - } + // Called from native code + private void VJoyStartEditing() { + vjoy_d_cached = VJoy.readCustomVjoyValues(getApplicationContext()); + JNIdc.show_osd(); + ((GL2JNIView)mView).setEditVjoyMode(true); + } + // Called from native code + private void VJoyResetEditing() { + VJoy.resetCustomVjoyValues(getApplicationContext()); + ((GL2JNIView)mView).readCustomVjoyValues(); + ((GL2JNIView)mView).resetEditMode(); + runOnUiThread(new Runnable() { + @Override + public void run() { + mView.requestLayout(); + } + }); + } + // Called from native code + private void VJoyStopEditing(final boolean canceled) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (canceled) + ((GL2JNIView)mView).restoreCustomVjoyValues(vjoy_d_cached); + ((GL2JNIView)mView).setEditVjoyMode(false); + } + }); } } diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java index 06c2eccc1..89aeb7e55 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java @@ -156,7 +156,7 @@ public class MainActivity extends AppCompatActivity { if (gameUri != null) JNIdc.setGameUri(gameUri.toString()); Intent intent = new Intent("com.reicast.EMULATOR", - // uri, getApplicationContext(), GL2JNIActivity.class); + //gameUri, getApplicationContext(), GL2JNIActivity.class); gameUri, getApplicationContext(), NativeGLActivity.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/NativeGLActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/NativeGLActivity.java index 92722bd46..5a02ff309 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/NativeGLActivity.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/NativeGLActivity.java @@ -1,235 +1,61 @@ package com.reicast.emulator; -import android.Manifest; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.os.Build; import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.preference.PreferenceManager; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.constraint.ConstraintLayout; -import android.support.design.widget.Snackbar; -import android.support.v4.app.ActivityCompat; -import android.util.Log; -import android.view.Gravity; -import android.view.InputDevice; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; import android.view.Window; -import android.widget.FrameLayout; -import android.widget.TextView; -import com.reicast.emulator.config.Config; -import com.reicast.emulator.debug.GenerateLogs; -import com.reicast.emulator.emu.AudioBackend; import com.reicast.emulator.emu.JNIdc; -import com.reicast.emulator.periph.InputDeviceManager; -import com.reicast.emulator.periph.SipEmulator; +import com.reicast.emulator.emu.NativeGLView; import com.reicast.emulator.periph.VJoy; -import java.util.ArrayList; -import java.util.List; - -import tv.ouya.console.api.OuyaController; - -public final class NativeGLActivity extends BaseNativeGLActivity implements ActivityCompat.OnRequestPermissionsResultCallback { - public static byte[] syms; - private float[][] vjoy_d_cached; // Used for VJoy editing - private AudioBackend audioBackend; - private Handler handler = new Handler(); +public final class NativeGLActivity extends BaseGLActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); - InputDeviceManager.getInstance().startListening(getApplicationContext()); - - Emulator app = (Emulator)getApplicationContext(); - app.getConfigurationPrefs(); - Emulator.setCurrentActivity(this); - - OuyaController.init(this); super.onCreate(savedInstanceState); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - String home_directory = prefs.getString(Config.pref_home, ""); - String result = JNIdc.initEnvironment((Emulator)getApplicationContext(), home_directory); - if (result != null) - showToastMessage("Initialization failed: " + result, Snackbar.LENGTH_LONG); - - String android_home_directory = Environment.getExternalStorageDirectory().getAbsolutePath(); - List pathList = new ArrayList<>(); - pathList.add(android_home_directory); - pathList.addAll(FileBrowser.getExternalMounts()); - Log.i("reicast", "External storage dirs: " + pathList); - JNIdc.setExternalStorageDirectories(pathList.toArray()); - - register(this); - - audioBackend = new AudioBackend(); + // Create the actual GL view +// mView = new NativeGLView(this); +// setContentView(mView); + setContentView(R.layout.nativegl_content); + mView = findViewById(R.id.glView); //setup mic if (Emulator.micPluggedIn()) requestRecordAudioPermission(); } - private boolean showMenu() { - JNIdc.guiOpenSettings(); - return true; - } - - private boolean processJoystickInput(MotionEvent event, int axis) { - float v = event.getAxisValue(axis); - return InputDeviceManager.getInstance().joystickAxisEvent(event.getDeviceId(), axis, (int)Math.round(v * 32767.f)); - } - @Override - public boolean onGenericMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK && event.getAction() == MotionEvent.ACTION_MOVE) { - boolean rc = processJoystickInput(event, MotionEvent.AXIS_X); - rc |= processJoystickInput(event, MotionEvent.AXIS_Y); - rc |= processJoystickInput(event, MotionEvent.AXIS_LTRIGGER); - rc |= processJoystickInput(event, MotionEvent.AXIS_RTRIGGER); - rc |= processJoystickInput(event, MotionEvent.AXIS_RX); - rc |= processJoystickInput(event, MotionEvent.AXIS_RY); - if (rc) - return true; - } - else if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == InputDevice.SOURCE_CLASS_POINTER) - { - if (mView != null) { - float scl = mView.getHeight() / 480.0f; - float tx = (mView.getWidth() - 640.0f * scl) / 2; - int xpos = Math.round((event.getX() - tx) / scl); - int ypos = Math.round(event.getY() / scl); - InputDeviceManager.getInstance().mouseEvent(xpos, ypos, event.getButtonState()); - } - - } - return super.onGenericMotionEvent(event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, false)) - return true; - return super.onKeyUp(keyCode, event); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - // FIXME - showMenu(); - } - if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, true)) - return true; - - if (ViewConfiguration.get(this).hasPermanentMenuKey()) { - if (keyCode == KeyEvent.KEYCODE_MENU) { - return showMenu(); - } - } - return super.onKeyDown(keyCode, event); - } - @Override protected void onPause() { super.onPause(); - mView.pause(); + ((NativeGLView)mView).pause(); } @Override protected void onResume() { super.onResume(); - mView.resume(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - InputDeviceManager.getInstance().stopListening(); - register(null); - audioBackend.release(); - Emulator.setCurrentActivity(null); - } - - void requestRecordAudioPermission() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - handler.post(new Runnable() { - @Override - public void run() { - mView.setVisibility(View.INVISIBLE); - ActivityCompat.requestPermissions(NativeGLActivity.this, - new String[]{ - Manifest.permission.RECORD_AUDIO - }, - 0); - - } - }); - } - else - { - onRequestPermissionsResult(0, new String[] { Manifest.permission.RECORD_AUDIO }, - new int[] { PackageManager.PERMISSION_GRANTED }); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (permissions.length > 0 && Manifest.permission.RECORD_AUDIO .equals(permissions[0]) && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - SipEmulator sip = new SipEmulator(); - sip.startRecording(); - JNIdc.setupMic(sip); - } - - mView.setVisibility(View.VISIBLE); - } - - private void showToastMessage(String message, int duration) { - View view = findViewById(android.R.id.content); - Snackbar snackbar = Snackbar.make(view, message, duration); - View snackbarLayout = snackbar.getView(); - TextView textView = (TextView) snackbarLayout.findViewById( - android.support.design.R.id.snackbar_text); - textView.setGravity(Gravity.CENTER_VERTICAL); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) - textView.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); - textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_notification, 0, 0, 0); - textView.setCompoundDrawablePadding(getResources() - .getDimensionPixelOffset(R.dimen.snackbar_icon_padding)); - snackbar.show(); + ((NativeGLView)mView).resume(); } // Called from native code private void VJoyStartEditing() { vjoy_d_cached = VJoy.readCustomVjoyValues(getApplicationContext()); JNIdc.show_osd(); - mView.setEditVjoyMode(true); + ((NativeGLView)mView).setEditVjoyMode(true); } // Called from native code private void VJoyResetEditing() { VJoy.resetCustomVjoyValues(getApplicationContext()); - mView.readCustomVjoyValues(); - mView.resetEditMode(); + ((NativeGLView)mView).readCustomVjoyValues(); + ((NativeGLView)mView).resetEditMode(); mView.requestLayout(); } // Called from native code private void VJoyStopEditing(boolean canceled) { if (canceled) - mView.restoreCustomVjoyValues(vjoy_d_cached); - mView.setEditVjoyMode(false); + ((NativeGLView)mView).restoreCustomVjoyValues(vjoy_d_cached); + ((NativeGLView)mView).setEditVjoyMode(false); } - // Called from native code - private void generateErrorLog() { - new GenerateLogs(this).execute(getFilesDir().getAbsolutePath()); - } - - private static native void register(NativeGLActivity activity); } diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java index 0f774215a..7b3347fcf 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java @@ -205,7 +205,6 @@ public class GenerateLogs extends AsyncTask { @Override protected void onPostExecute(final String response) { if (response != null) { - showToastMessage(mContext.get().getString(R.string.log_saved), Snackbar.LENGTH_LONG); android.content.ClipboardManager clipboard = (android.content.ClipboardManager) mContext.get() .getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("logcat", response); @@ -214,34 +213,4 @@ public class GenerateLogs extends AsyncTask { mContext.get().startActivity(browserIntent); } } - - private void showToastMessage(String message, int duration) { - View layout = - ((Activity) mContext.get()).findViewById(android.R.id.content); - Snackbar snackbar = Snackbar.make(layout, message, duration); - View snackbarLayout = snackbar.getView(); - ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams( - ConstraintLayout.LayoutParams.MATCH_PARENT, - ConstraintLayout.LayoutParams.WRAP_CONTENT - ); - lp.setMargins(0, 0, 0, 0); - snackbarLayout.setLayoutParams(lp); - TextView textView = (TextView) snackbarLayout.findViewById( - android.support.design.R.id.snackbar_text); - textView.setGravity(Gravity.CENTER_VERTICAL); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) - textView.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); - Drawable drawable; - if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.M) { - drawable = mContext.get().getResources().getDrawable( - R.drawable.ic_send, ((Activity) mContext.get()).getTheme()); - } else { - drawable = VectorDrawableCompat.create(mContext.get().getResources(), - R.drawable.ic_send, ((Activity) mContext.get()).getTheme()); - } - textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); - textView.setCompoundDrawablePadding(mContext.get().getResources() - .getDimensionPixelOffset(R.dimen.snackbar_icon_padding)); - snackbar.show(); - } } diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java index 0422e6e79..e2d9b2acb 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java @@ -61,29 +61,16 @@ public class GL2JNIView extends GLSurfaceView public static final int LAYER_TYPE_SOFTWARE = 1; public static final int LAYER_TYPE_HARDWARE = 2; - private Handler handler = new Handler(); - Vibrator vib; - - private boolean editVjoyMode = false; - private int selectedVjoyElement = -1; - private ScaleGestureDetector scaleGestureDetector; - - public float[][] vjoy_d_custom; - - private static final float[][] vjoy = VJoy.baseVJoy(); + VirtualJoystickDelegate vjoyDelegate; Renderer rend; Context context; public void restoreCustomVjoyValues(float[][] vjoy_d_cached) { - vjoy_d_custom = vjoy_d_cached; - VJoy.writeCustomVjoyValues(vjoy_d_cached, context); - - resetEditMode(); - requestLayout(); + vjoyDelegate.restoreCustomVjoyValues(vjoy_d_cached); } public GL2JNIView(Context context) { @@ -96,10 +83,9 @@ public class GL2JNIView extends GLSurfaceView @TargetApi(Build.VERSION_CODES.HONEYCOMB) public GL2JNIView(final Context context, boolean translucent, - int depth, int stencil, boolean editVjoyMode) { + int depth, int stencil) { super(context); this.context = context; - this.editVjoyMode = editVjoyMode; setKeepScreenOn(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { @@ -115,11 +101,10 @@ public class GL2JNIView extends GLSurfaceView } }); } + vjoyDelegate = new VirtualJoystickDelegate(this); setPreserveEGLContextOnPause(true); - vib = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); DisplayMetrics dm = context.getResources().getDisplayMetrics(); @@ -127,10 +112,6 @@ public class GL2JNIView extends GLSurfaceView this.setLayerType(prefs.getInt(Config.pref_rendertype, LAYER_TYPE_HARDWARE), null); - vjoy_d_custom = VJoy.readCustomVjoyValues(context); - - scaleGestureDetector = new ScaleGestureDetector(context, new OscOnScaleGestureListener()); - if (GL2JNIActivity.syms != null) JNIdc.data(1, GL2JNIActivity.syms); @@ -163,338 +144,29 @@ public class GL2JNIView extends GLSurfaceView return rend; } - private void reset_analog() - { - - int j=11; - vjoy[j+1][0]=vjoy[j][0]+vjoy[j][2]/2-vjoy[j+1][2]/2; - vjoy[j+1][1]=vjoy[j][1]+vjoy[j][3]/2-vjoy[j+1][3]/2; - JNIdc.vjoy(j+1, vjoy[j+1][0], vjoy[j+1][1], vjoy[j+1][2], vjoy[j+1][3]); - } - - int get_anal(int j, int axis) - { - return (int) (((vjoy[j+1][axis]+vjoy[j+1][axis+2]/2) - vjoy[j][axis] - vjoy[j][axis+2]/2)*254/vjoy[j][axis+2]); - } - - float vbase(float p, float m, float scl) - { - return (int) ( m - (m -p)*scl); - } - - float vbase(float p, float scl) - { - return (int) (p*scl ); - } - - public boolean isTablet() { - return (getContext().getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) - >= Configuration.SCREENLAYOUT_SIZE_LARGE; - } - @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); - //dcpx/cm = dcpx/px * px/cm - float magic = isTablet() ? 0.8f : 0.7f; - float scl = 480.0f/getHeight() * getContext().getResources().getDisplayMetrics().density * magic; - float scl_dc = getHeight()/480.0f; - float tx = ((getWidth()-640.0f*scl_dc)/2)/scl_dc; - - float a_x = -tx+ 24*scl; - float a_y=- 24*scl; - - float[][] vjoy_d = VJoy.getVjoy_d(vjoy_d_custom); - - for (int i=0;i vjoy[j][0] && x <= (vjoy[j][0] + vjoy[j][2])) { - /* - //Disable pressure sensitive R/L - //Doesn't really work properly - - int pre=(int)(event.getPressure(i)*255); - if (pre>20) - { - pre-=20; - pre*=7; - } - if (pre>255) pre=255; - */ - - int pre = 255; - - if (y > vjoy[j][1] && y <= (vjoy[j][1] + vjoy[j][3])) { - if (vjoy[j][4] >= -2) { - if (vjoy[j][5] == 0) - if (!editVjoyMode && Emulator.vibrationDuration > 0) - vib.vibrate(Emulator.vibrationDuration); - vjoy[j][5] = 2; - } - - - if (vjoy[j][4] == -3) { - if (editVjoyMode) { - selectedVjoyElement = 5; // Analog - resetEditMode(); - } else { - vjoy[j + 1][0] = x - vjoy[j + 1][2] / 2; - vjoy[j + 1][1] = y - vjoy[j + 1][3] / 2; - - JNIdc.vjoy(j + 1, vjoy[j + 1][0], vjoy[j + 1][1], vjoy[j + 1][2], vjoy[j + 1][3]); - anal_id = event.getPointerId(i); - } - } else if (vjoy[j][4] != -4) { - if (vjoy[j][4] == -1) { - if (editVjoyMode) { - selectedVjoyElement = 3; // Left Trigger - resetEditMode(); - } else { - left_trigger = pre; - lt_id = event.getPointerId(i); - } - } else if (vjoy[j][4] == -2) { - if (editVjoyMode) { - selectedVjoyElement = 4; // Right Trigger - resetEditMode(); - } else { - right_trigger = pre; - rt_id = event.getPointerId(i); - } - } else { - if (editVjoyMode) { - selectedVjoyElement = getElementIdFromButtonId(j); - resetEditMode(); - } else - rv &= ~(int) vjoy[j][4]; - } - } - } - } - } - } else { - if (x < vjoy[11][0]) - x = vjoy[11][0]; - else if (x > (vjoy[11][0] + vjoy[11][2])) - x = vjoy[11][0] + vjoy[11][2]; - - if (y < vjoy[11][1]) - y = vjoy[11][1]; - else if (y > (vjoy[11][1] + vjoy[11][3])) - y = vjoy[11][1] + vjoy[11][3]; - - int j = 11; - vjoy[j + 1][0] = x - vjoy[j + 1][2] / 2; - vjoy[j + 1][1] = y - vjoy[j + 1][3] / 2; - - JNIdc.vjoy(j + 1, vjoy[j + 1][0], vjoy[j + 1][1], vjoy[j + 1][2], vjoy[j + 1][3]); - - } - } - - for (int j = 0; j < vjoy.length; j++) { - if (vjoy[j][5] == 2) - vjoy[j][5] = 1; - else if (vjoy[j][5] == 1) - vjoy[j][5] = 0; - } - } - - switch(aid) - { - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - selectedVjoyElement = -1; - reset_analog(); - anal_id = -1; - rv = 0xFFFF; - right_trigger = 0; - left_trigger = 0; - lt_id = -1; - rt_id = -1; - for (int j= 0 ;j < vjoy.length; j++) - vjoy[j][5] = 0; - mouse_btns = 0; - break; - - case MotionEvent.ACTION_POINTER_UP: - if (event.getPointerId(event.getActionIndex())==anal_id) - { - reset_analog(); - anal_id = -1; - } - else if (event.getPointerId(event.getActionIndex())==lt_id) - { - left_trigger = 0; - lt_id = -1; - } - else if (event.getPointerId(event.getActionIndex())==rt_id) - { - right_trigger = 0; - rt_id = -1; - } - break; - - case MotionEvent.ACTION_POINTER_DOWN: - case MotionEvent.ACTION_DOWN: - if (event.getPointerCount() != 1) - { - mouse_btns = 0; - } - else - { - MotionEvent.PointerCoords pointerCoords = new MotionEvent.PointerCoords(); - event.getPointerCoords(0, pointerCoords); - mouse_pos[0] = Math.round((pointerCoords.x - tx) / scl); - mouse_pos[1] = Math.round(pointerCoords.y / scl); - mouse_btns = MotionEvent.BUTTON_PRIMARY; // Mouse left button down - } - break; - - case MotionEvent.ACTION_MOVE: - if (event.getPointerCount() == 1) - { - MotionEvent.PointerCoords pointerCoords = new MotionEvent.PointerCoords(); - event.getPointerCoords(0, pointerCoords); - mouse_pos[0] = Math.round((pointerCoords.x - tx) / scl); - mouse_pos[1] = Math.round(pointerCoords.y / scl); - } - break; - } - if (getResources().getString(R.string.flavor).equals("naomi")) // FIXME - { - if (left_trigger != 0) - rv &= ~VJoy.key_CONT_C; // Service key/coin - } - int joyx = get_anal(11, 0); - int joyy = get_anal(11, 1); - InputDeviceManager.getInstance().virtualGamepadEvent(rv, joyx, joyy, left_trigger, right_trigger); - // Only register the mouse event if no virtual gamepad button is down - if ((!editVjoyMode && rv == 0xFFFF) || JNIdc.guiIsOpen()) - InputDeviceManager.getInstance().mouseEvent(mouse_pos[0], mouse_pos[1], mouse_btns); - return(true); + return vjoyDelegate.onTouchEvent(event, getWidth(), getHeight()); } - private class OscOnScaleGestureListener extends - SimpleOnScaleGestureListener { - - @Override - public boolean onScale(ScaleGestureDetector detector) { - if (editVjoyMode && selectedVjoyElement != -1) { - vjoy_d_custom[selectedVjoyElement][2] *= detector.getScaleFactor(); - requestLayout(); - - return true; - } - - return false; - } - - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - selectedVjoyElement = -1; - } + public void setEditVjoyMode(boolean editVjoyMode) { + vjoyDelegate.setEditVjoyMode(editVjoyMode); } + public void readCustomVjoyValues() { + vjoyDelegate.readCustomVjoyValues(); + } private static class Renderer implements GLSurfaceView.Renderer { diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/JNIdc.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/JNIdc.java index f7da3c90a..b605716fa 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/JNIdc.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/JNIdc.java @@ -39,6 +39,7 @@ public final class JNIdc public static native void screenDpi(int screenDpi); public static native void guiOpenSettings(); public static native boolean guiIsOpen(); + public static native boolean guiIsContentBrowser(); public static void show_osd() { JNIdc.vjoy(13, 1,0,0,0); diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/NativeGLView.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/NativeGLView.java index b7719fa6f..4aabf8c4d 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/NativeGLView.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/NativeGLView.java @@ -67,7 +67,6 @@ public class NativeGLView extends SurfaceView implements SurfaceHolder.Callback private void startRendering() { // Continuously render frames - //Log.i("reicast", "NativeGLView.startRendering in 500 ms"); handler.removeCallbacksAndMessages(null); handler.postAtTime(new Runnable() { @Override @@ -113,7 +112,6 @@ public class NativeGLView extends SurfaceView implements SurfaceHolder.Callback public void surfaceDestroyed(SurfaceHolder surfaceHolder) { //Log.i("reicast", "NativeGLView.surfaceDestroyed"); JNIdc.rendinitNative(null, 0, 0); - paused = true; } public void pause() { @@ -127,8 +125,8 @@ public class NativeGLView extends SurfaceView implements SurfaceHolder.Callback //Log.i("reicast", "NativeGLView.resume"); paused = false; JNIdc.resume(); - startRendering(); } + startRendering(); } @TargetApi(19) diff --git a/shell/android-studio/reicast/src/main/jni/src/Android.cpp b/shell/android-studio/reicast/src/main/jni/src/Android.cpp index 31cf64ff5..b74274028 100644 --- a/shell/android-studio/reicast/src/main/jni/src/Android.cpp +++ b/shell/android-studio/reicast/src/main/jni/src/Android.cpp @@ -109,6 +109,7 @@ SETTINGS_ACCESSORS(VirtualGamepadVibration, input.VirtualGamepadVibration, jint) JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_screenDpi(JNIEnv *env,jobject obj, jint screenDpi) __attribute__((visibility("default"))); JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_guiOpenSettings(JNIEnv *env,jobject obj) __attribute__((visibility("default"))); JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_emu_JNIdc_guiIsOpen(JNIEnv *env,jobject obj) __attribute__((visibility("default"))); +JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_emu_JNIdc_guiIsContentBrowser(JNIEnv *env,jobject obj) __attribute__((visibility("default"))); JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_init(JNIEnv *env, jobject obj) __attribute__((visibility("default"))); JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_joystickAdded(JNIEnv *env, jobject obj, jint id, jstring name, jint maple_port) __attribute__((visibility("default"))); @@ -120,7 +121,7 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_mouse JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_AudioBackend_setInstance(JNIEnv *env, jobject obj, jobject instance) __attribute__((visibility("default"))); -JNIEXPORT void JNICALL Java_com_reicast_emulator_NativeGLActivity_register(JNIEnv *env, jobject obj, jobject activity) __attribute__((visibility("default"))); +JNIEXPORT void JNICALL Java_com_reicast_emulator_BaseGLActivity_register(JNIEnv *env, jobject obj, jobject activity) __attribute__((visibility("default"))); }; JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_screenDpi(JNIEnv *env,jobject obj, jint screenDpi) @@ -511,6 +512,11 @@ JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_emu_JNIdc_guiIsOpen(JNIEnv return gui_is_open(); } +JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_emu_JNIdc_guiIsContentBrowser(JNIEnv *env,jobject obj) +{ + return gui_is_content_browser(); +} + // Audio Stuff u32 androidaudio_push(void* frame, u32 amt, bool wait) { @@ -678,7 +684,7 @@ static jmethodID VJoyStartEditingMID; static jmethodID VJoyStopEditingMID; static jmethodID VJoyResetEditingMID; -JNIEXPORT void JNICALL Java_com_reicast_emulator_NativeGLActivity_register(JNIEnv *env, jobject obj, jobject activity) +JNIEXPORT void JNICALL Java_com_reicast_emulator_BaseGLActivity_register(JNIEnv *env, jobject obj, jobject activity) { if (g_activity != NULL) {