From c58abd14aa7085ec41a8b708862b443264a97c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 29 Aug 2025 19:28:23 +0200 Subject: [PATCH] Remove support for Moga controllers. Moga was an early "standard" (well, supported by a single company) for joystick input before Android got official support, which was a long, long time ago. I can't imagine many of these are still in use. Plus, the Moga integration library broke back in Lollipop so we've carried around an ugly workaround. Let's just get rid of this stuff. --- android/build.gradle | 9 -- .../com/bda/controller/Controller.java | 39 ------ .../bda/controller/ControllerListener.java | 9 -- .../bda/controller/IControllerService.java | 4 - .../com/bda/controller/KeyEvent.java | 20 --- .../com/bda/controller/MotionEvent.java | 14 -- .../com/bda/controller/StateEvent.java | 19 --- android/libs/com.bda.controller.jar | Bin 30211 -> 0 bytes android/src/org/ppsspp/ppsspp/MogaHack.java | 101 -------------- .../src/org/ppsspp/ppsspp/NativeActivity.java | 10 +- .../src/org/ppsspp/ppsspp/NativeGLView.java | 129 +---------------- .../org/ppsspp/ppsspp/NativeSurfaceView.java | 130 +----------------- 12 files changed, 4 insertions(+), 480 deletions(-) delete mode 100644 android/libs/MogaStubs/com/bda/controller/Controller.java delete mode 100644 android/libs/MogaStubs/com/bda/controller/ControllerListener.java delete mode 100644 android/libs/MogaStubs/com/bda/controller/IControllerService.java delete mode 100644 android/libs/MogaStubs/com/bda/controller/KeyEvent.java delete mode 100644 android/libs/MogaStubs/com/bda/controller/MotionEvent.java delete mode 100644 android/libs/MogaStubs/com/bda/controller/StateEvent.java delete mode 100644 android/libs/com.bda.controller.jar delete mode 100644 android/src/org/ppsspp/ppsspp/MogaHack.java diff --git a/android/build.gradle b/android/build.gradle index 2922fee401..0fb6b53a2f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -243,12 +243,3 @@ android { afterEvaluate { android.sourceSets.main.assets.getSrcDirs().each { println it } } - -// F-Droid lite version can be created with : ./gradlew assembleOptimized -Pf_droid -if (project.hasProperty("f_droid")) { - project.android.sourceSets.main.java.srcDirs += 'libs/MogaStubs' -} else { - project.dependencies { - implementation files('libs/com.bda.controller.jar') - } -} diff --git a/android/libs/MogaStubs/com/bda/controller/Controller.java b/android/libs/MogaStubs/com/bda/controller/Controller.java deleted file mode 100644 index c30cae357b..0000000000 --- a/android/libs/MogaStubs/com/bda/controller/Controller.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.bda.controller; - -import android.app.Activity; -import android.os.Handler; -import android.view.SurfaceView; - -public class Controller { - public static final int ACTION_VERSION_MOGA = 0; - public static final int STATE_CURRENT_PRODUCT_VERSION = 1; - - static Controller sInstance; - - private Controller() {} - - public static Controller getInstance(Activity activity) { - if (sInstance == null) { - sInstance = new Controller(); - } - return sInstance; - } - public int getState(int val) { - return 0; - } - public int setListener(SurfaceView view, Handler handler) { - return 0; - } - public int init() { - return 0; - } - public int onPause() { - return 0; - } - public int onResume() { - return 0; - } - public int exit() { - return 0; - } -} diff --git a/android/libs/MogaStubs/com/bda/controller/ControllerListener.java b/android/libs/MogaStubs/com/bda/controller/ControllerListener.java deleted file mode 100644 index c1bde2b583..0000000000 --- a/android/libs/MogaStubs/com/bda/controller/ControllerListener.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.bda.controller; - -public interface ControllerListener { - public abstract void onKeyEvent(KeyEvent event); - - public abstract void onMotionEvent(MotionEvent event); - - public abstract void onStateEvent(StateEvent state); -} diff --git a/android/libs/MogaStubs/com/bda/controller/IControllerService.java b/android/libs/MogaStubs/com/bda/controller/IControllerService.java deleted file mode 100644 index 2fe7a5c3f6..0000000000 --- a/android/libs/MogaStubs/com/bda/controller/IControllerService.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bda.controller; - -public class IControllerService { -} diff --git a/android/libs/MogaStubs/com/bda/controller/KeyEvent.java b/android/libs/MogaStubs/com/bda/controller/KeyEvent.java deleted file mode 100644 index 2a6a108921..0000000000 --- a/android/libs/MogaStubs/com/bda/controller/KeyEvent.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.bda.controller; - -public class KeyEvent { - public static final int ACTION_DOWN = 0; - public static final int ACTION_UP = 1; - public static final int KEYCODE_DPAD_UP = 2; - public static final int KEYCODE_DPAD_DOWN = 3; - public static final int KEYCODE_DPAD_LEFT = 4; - public static final int KEYCODE_DPAD_RIGHT = 5; - - public int getAction() { - return 0; - } - public int getState(int val) { - return 0; - } - public int getKeyCode() { - return 0; - } -} diff --git a/android/libs/MogaStubs/com/bda/controller/MotionEvent.java b/android/libs/MogaStubs/com/bda/controller/MotionEvent.java deleted file mode 100644 index 35d8816ff2..0000000000 --- a/android/libs/MogaStubs/com/bda/controller/MotionEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.bda.controller; - -public class MotionEvent { - public static final int AXIS_X = 0; - public static final int AXIS_Y = 1; - public static final int AXIS_Z = 2; - public static final int AXIS_RZ = 3; - public static final int AXIS_LTRIGGER = 4; - public static final int AXIS_RTRIGGER = 5; - - public int getAxisValue(int val) { - return 0; - } -} diff --git a/android/libs/MogaStubs/com/bda/controller/StateEvent.java b/android/libs/MogaStubs/com/bda/controller/StateEvent.java deleted file mode 100644 index 230e8b7172..0000000000 --- a/android/libs/MogaStubs/com/bda/controller/StateEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.bda.controller; - -public class StateEvent { - public static final int STATE_POWER_LOW = 0; - public static final int STATE_CONNECTION = 1; - - public static final int ACTION_FALSE = 0; - public static final int ACTION_TRUE = 1; - public static final int ACTION_DISCONNECTED = 2; - public static final int ACTION_CONNECTING = 3; - public static final int ACTION_CONNECTED = 4; - - public int getAction() { - return 0; - } - public int getState() { - return 0; - } -} diff --git a/android/libs/com.bda.controller.jar b/android/libs/com.bda.controller.jar deleted file mode 100644 index f71dbece3486a143c4fe6feba4152a71587ebba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30211 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ౖz!nQ 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 diff --git a/android/src/org/ppsspp/ppsspp/MogaHack.java b/android/src/org/ppsspp/ppsspp/MogaHack.java deleted file mode 100644 index 9b09d3a86e..0000000000 --- a/android/src/org/ppsspp/ppsspp/MogaHack.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Mupen64PlusAE, an N64 emulator for the Android platform - * - * Copyright (C) 2013 Paul Lamb - * - * This file is part of Mupen64PlusAE. - * - * Mupen64PlusAE is free software: you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Mupen64PlusAE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Mupen64PlusAE. If - * not, see . - * - * Authors: Paul Lamb - */ -package org.ppsspp.ppsspp; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; -import android.os.Build; -import android.util.Log; -import com.bda.controller.Controller; -import com.bda.controller.IControllerService; -import java.util.List; - -/** - * Temporary hack for crash in MOGA library on Lollipop. This hack can be removed once MOGA fixes - * their library. The actual issue is caused by the use of implicit service intents, which are - * illegal in Lollipop, as seen in the logcat message below. - * - *
- * {@code Service Intent must be explicit: Intent { act=com.bda.controller.IControllerService } }
- * 
- * - * @see MOGA developer site - * @see - * Discussion on explicit intents - */ -public class MogaHack { - public static void init(Controller controller, Context context) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - controller.init(); - return; - } - try { - boolean mIsBound = false; - java.lang.reflect.Field fIsBound = null; - android.content.ServiceConnection mServiceConnection = null; - java.lang.reflect.Field fServiceConnection = null; - - Class cMogaController = controller.getClass(); - fIsBound = cMogaController.getDeclaredField("mIsBound"); - fIsBound.setAccessible(true); - mIsBound = fIsBound.getBoolean(controller); - fServiceConnection = cMogaController.getDeclaredField("mServiceConnection"); - fServiceConnection.setAccessible(true); - mServiceConnection = (android.content.ServiceConnection) fServiceConnection.get(controller); - - if ((!mIsBound) && (mServiceConnection != null)) { - // Convert implicit intent to explicit intent, see http://stackoverflow.com/a/26318757 - Intent intent = new Intent(IControllerService.class.getName()); - List resolveInfos = context.getPackageManager().queryIntentServices(intent, 0); - if (resolveInfos.size() != 1) { - // What? this doesn't do anything. - // Log.e("MogaHack", "Somebody is trying to intercept our intent. Disabling MOGA controller for security."); - } - ServiceInfo serviceInfo = resolveInfos.get(0).serviceInfo; - String packageName = serviceInfo.packageName; - String className = serviceInfo.name; - intent.setComponent(new ComponentName(packageName, className)); - - // Start the service explicitly - context.startService(intent); - context.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE ); - try { - fIsBound.setBoolean(controller, true); - } catch (IllegalAccessException e) { - Log.e("MogaHack", "MOGA Lollipop Hack IllegalAccessException (set)", e); - } catch (IllegalArgumentException e) { - Log.e("MogaHack", "MOGA Lollipop Hack IllegalArgumentException (set)", e); - } - } - } catch (NoSuchFieldException e) { - Log.e("MogaHack", "MOGA Lollipop Hack NoSuchFieldException (get)", e); - } catch (IllegalAccessException e) { - Log.e("MogaHack", "MOGA Lollipop Hack IllegalAccessException (get)", e); - } catch (IllegalArgumentException e) { - Log.e("MogaHack", "MOGA Lollipop Hack IllegalArgumentException (get)", e); - } catch (Exception e) { - Log.e("MogaHack", "MOGA", e); - } - } -} diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index e85581d1f0..76f332175d 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -755,15 +755,9 @@ public abstract class NativeActivity extends Activity { nativeRenderer = null; } } - if (mGLSurfaceView != null) { - mGLSurfaceView.onDestroy(); - mGLSurfaceView = null; - } + mGLSurfaceView = null; } else { - if (mSurfaceView != null) { - mSurfaceView.onDestroy(); - mSurfaceView = null; - } + mSurfaceView = null; mSurface = null; } diff --git a/android/src/org/ppsspp/ppsspp/NativeGLView.java b/android/src/org/ppsspp/ppsspp/NativeGLView.java index 7bbdd31712..67b27ce541 100644 --- a/android/src/org/ppsspp/ppsspp/NativeGLView.java +++ b/android/src/org/ppsspp/ppsspp/NativeGLView.java @@ -18,20 +18,11 @@ import android.util.Log; import android.view.InputDevice; import android.view.MotionEvent; -import com.bda.controller.Controller; -import com.bda.controller.ControllerListener; -import com.bda.controller.KeyEvent; -import com.bda.controller.StateEvent; - -public class NativeGLView extends GLSurfaceView implements SensorEventListener, ControllerListener { +public class NativeGLView extends GLSurfaceView implements SensorEventListener { private final static String TAG = "NativeGLView"; private final SensorManager mSensorManager; private final Sensor mAccelerometer; - // Moga controller - private final Controller mController; - private boolean isMogaPro = false; - NativeActivity mActivity; public NativeGLView(NativeActivity activity) { @@ -40,16 +31,6 @@ public class NativeGLView extends GLSurfaceView implements SensorEventListener, mSensorManager = (SensorManager) activity.getSystemService(Activity.SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); - - mController = Controller.getInstance(activity); - - try { - MogaHack.init(mController, activity); - Log.i(TAG, "MOGA initialized"); - mController.setListener(this, new Handler()); - } catch (Exception e) { - // Log.d(TAG, "MOGA failed to initialize"); - } } private int getToolType(final MotionEvent ev, int pointer) { @@ -149,119 +130,11 @@ public class NativeGLView extends GLSurfaceView implements SensorEventListener, public void onPause() { super.onPause(); mSensorManager.unregisterListener(this); - if (mController != null) { - mController.onPause(); - } } @Override public void onResume() { super.onResume(); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME); - if (mController != null) { - mController.onResume(); - // According to the docs, the Moga's state can be inconsistent here. - // We should do a one time poll. TODO - } - } - - public void onDestroy() { - if (mController != null) { - mController.exit(); - } - } - - // MOGA Controller - from ControllerListener - @Override - public void onKeyEvent(KeyEvent event) { - // The Moga left stick doubles as a D-pad. This creates mapping conflicts so let's turn it off. - // Unfortunately this breaks menu navigation in PPSSPP currently but meh. - // This is different on Moga Pro though. - - if (!isMogaPro) { - switch (event.getKeyCode()) { - case KeyEvent.KEYCODE_DPAD_DOWN: - case KeyEvent.KEYCODE_DPAD_UP: - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_RIGHT: - return; - default: - break; - } - } - - boolean repeat = false; // Moga has no repeats? - switch (event.getAction()) { - case KeyEvent.ACTION_DOWN: - NativeApp.keyDown(NativeApp.DEVICE_ID_PAD_0, event.getKeyCode(), repeat); - break; - case KeyEvent.ACTION_UP: - NativeApp.keyUp(NativeApp.DEVICE_ID_PAD_0, event.getKeyCode()); - break; - } - } - - // MOGA Controller - from ControllerListener - @Override - public void onMotionEvent(com.bda.controller.MotionEvent event) { - int [] axisIds = new int[]{ - com.bda.controller.MotionEvent.AXIS_X, - com.bda.controller.MotionEvent.AXIS_Y, - com.bda.controller.MotionEvent.AXIS_Z, - com.bda.controller.MotionEvent.AXIS_RZ, - com.bda.controller.MotionEvent.AXIS_LTRIGGER, - com.bda.controller.MotionEvent.AXIS_RTRIGGER, - }; - float [] values = new float[]{ - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_X), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_Y), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_Z), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_RZ), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_LTRIGGER), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_RTRIGGER), - }; - NativeApp.joystickAxis(NativeApp.DEVICE_ID_PAD_0, axisIds, values, 6); - } - - // MOGA Controller - from ControllerListener - @Override - public void onStateEvent(StateEvent state) { - switch (state.getState()) { - case StateEvent.STATE_CONNECTION: - switch (state.getAction()) { - case StateEvent.ACTION_CONNECTED: - Log.i(TAG, "Moga Connected"); - if (mController.getState(Controller.STATE_CURRENT_PRODUCT_VERSION) == Controller.ACTION_VERSION_MOGA) { - NativeApp.sendMessageFromJava("moga", "Moga"); - } else { - Log.i(TAG, "MOGA Pro detected"); - isMogaPro = true; - NativeApp.sendMessageFromJava("moga", "MogaPro"); - } - break; - case StateEvent.ACTION_CONNECTING: - Log.i(TAG, "Moga Connecting..."); - break; - case StateEvent.ACTION_DISCONNECTED: - Log.i(TAG, "Moga Disconnected (or simply Not connected)"); - NativeApp.sendMessageFromJava("moga", ""); - break; - } - break; - - case StateEvent.STATE_POWER_LOW: - switch (state.getAction()) { - case StateEvent.ACTION_TRUE: - Log.i(TAG, "Moga Power Low"); - break; - case StateEvent.ACTION_FALSE: - Log.i(TAG, "Moga Power OK"); - break; - } - break; - - default: - break; - } } } diff --git a/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java b/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java index c5878f2117..d84f198a07 100644 --- a/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java +++ b/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java @@ -21,20 +21,11 @@ import android.view.SurfaceView; import androidx.annotation.RequiresApi; -import com.bda.controller.Controller; -import com.bda.controller.ControllerListener; -import com.bda.controller.KeyEvent; -import com.bda.controller.StateEvent; - -public class NativeSurfaceView extends SurfaceView implements SensorEventListener, ControllerListener { +public class NativeSurfaceView extends SurfaceView implements SensorEventListener { private static final String TAG = "NativeSurfaceView"; private final SensorManager mSensorManager; private final Sensor mAccelerometer; - // Moga controller - private final Controller mController; - private boolean isMogaPro = false; - public NativeSurfaceView(NativeActivity activity) { super(activity); @@ -42,16 +33,6 @@ public class NativeSurfaceView extends SurfaceView implements SensorEventListene mSensorManager = (SensorManager) activity.getSystemService(Activity.SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); - - mController = Controller.getInstance(activity); - - try { - MogaHack.init(mController, activity); - Log.i(TAG, "MOGA initialized"); - mController.setListener(this, new Handler()); - } catch (Exception e) { - // Ignore. - } } private int getToolType(final MotionEvent ev, int pointer) { @@ -170,118 +151,9 @@ public class NativeSurfaceView extends SurfaceView implements SensorEventListene public void onPause() { mSensorManager.unregisterListener(this); - if (mController != null) { - mController.onPause(); - } } public void onResume() { mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME); - if (mController != null) { - mController.onResume(); - // According to the docs, the Moga's state can be inconsistent here. - // Should we do a one time poll? - } - } - - public void onDestroy() { - if (mController != null) { - mController.exit(); - } - } - - // MOGA Controller - from ControllerListener - @Override - public void onKeyEvent(KeyEvent event) { - // The Moga left stick doubles as a D-pad. This creates mapping conflicts so let's turn it off. - // Unfortunately this breaks menu navigation in PPSSPP currently but meh. - // This is different on Moga Pro though. - - if (!isMogaPro) { - switch (event.getKeyCode()) { - case KeyEvent.KEYCODE_DPAD_DOWN: - case KeyEvent.KEYCODE_DPAD_UP: - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_RIGHT: - return; - default: - break; - } - } - - boolean repeat = false; // Moga has no repeats? - switch (event.getAction()) { - case KeyEvent.ACTION_DOWN: - NativeApp.keyDown(NativeApp.DEVICE_ID_PAD_0, event.getKeyCode(), repeat); - break; - case KeyEvent.ACTION_UP: - NativeApp.keyUp(NativeApp.DEVICE_ID_PAD_0, event.getKeyCode()); - break; - } - } - - // MOGA Controller - from ControllerListener - @Override - public void onMotionEvent(com.bda.controller.MotionEvent event) { - int [] axisIds = new int[]{ - com.bda.controller.MotionEvent.AXIS_X, - com.bda.controller.MotionEvent.AXIS_Y, - com.bda.controller.MotionEvent.AXIS_Z, - com.bda.controller.MotionEvent.AXIS_RZ, - com.bda.controller.MotionEvent.AXIS_LTRIGGER, - com.bda.controller.MotionEvent.AXIS_RTRIGGER, - }; - float [] values = new float[]{ - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_X), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_Y), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_Z), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_RZ), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_LTRIGGER), - event.getAxisValue(com.bda.controller.MotionEvent.AXIS_RTRIGGER), - }; - - NativeApp.joystickAxis(NativeApp.DEVICE_ID_PAD_0, axisIds, values, 6); - } - - // MOGA Controller - from ControllerListener - @Override - public void onStateEvent(StateEvent state) { - switch (state.getState()) { - case StateEvent.STATE_CONNECTION: - switch (state.getAction()) { - case StateEvent.ACTION_CONNECTED: - Log.i(TAG, "Moga Connected"); - if (mController.getState(Controller.STATE_CURRENT_PRODUCT_VERSION) == Controller.ACTION_VERSION_MOGA) { - NativeApp.sendMessageFromJava("moga", "Moga"); - } else { - Log.i(TAG, "MOGA Pro detected"); - isMogaPro = true; - NativeApp.sendMessageFromJava("moga", "MogaPro"); - } - break; - case StateEvent.ACTION_CONNECTING: - Log.i(TAG, "Moga Connecting..."); - break; - case StateEvent.ACTION_DISCONNECTED: - Log.i(TAG, "Moga Disconnected (or simply Not connected)"); - NativeApp.sendMessageFromJava("moga", ""); - break; - } - break; - - case StateEvent.STATE_POWER_LOW: - switch (state.getAction()) { - case StateEvent.ACTION_TRUE: - Log.i(TAG, "Moga Power Low"); - break; - case StateEvent.ACTION_FALSE: - Log.i(TAG, "Moga Power OK"); - break; - } - break; - - default: - break; - } } }