From ac4506e389a6b6e7c367de7aad40e034882f96f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 6 Jul 2023 17:13:04 +0200 Subject: [PATCH] Stop "messages from java" to leak out to NativeMessageReceived except where explicitly allowed --- Core/KeyMap.cpp | 3 +++ UI/NativeApp.cpp | 10 +------- android/jni/app-android.cpp | 25 ++++++++++++++----- .../org/ppsspp/ppsspp/InputDeviceState.java | 4 +-- .../src/org/ppsspp/ppsspp/NativeActivity.java | 14 +++++------ android/src/org/ppsspp/ppsspp/NativeApp.java | 2 +- .../src/org/ppsspp/ppsspp/NativeGLView.java | 6 ++--- .../org/ppsspp/ppsspp/NativeSurfaceView.java | 6 ++--- .../ppsspp/ppsspp/PowerSaveModeReceiver.java | 4 +-- .../src/org/ppsspp/ppsspp/SizeManager.java | 2 +- 10 files changed, 42 insertions(+), 34 deletions(-) diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index 5683e218bb..3296ae09e9 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -780,6 +780,7 @@ bool HasBuiltinController(const std::string &name) { } void NotifyPadConnected(InputDeviceID deviceId, const std::string &name) { + std::lock_guard guard(g_controllerMapLock); g_seenPads.insert(name); g_padNames[deviceId] = name; } @@ -812,10 +813,12 @@ void AutoConfForPad(const std::string &name) { } const std::set &GetSeenPads() { + std::lock_guard guard(g_controllerMapLock); return g_seenPads; } std::string PadName(InputDeviceID deviceId) { + std::lock_guard guard(g_controllerMapLock); auto it = g_padNames.find(deviceId); if (it != g_padNames.end()) return it->second; diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index caa7c8c5b6..fbb96fc441 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1135,15 +1135,7 @@ void NativeRender(GraphicsContext *graphicsContext) { } void HandleGlobalMessage(const std::string &msg, const std::string &value) { - // A bit ugly, see InputDeviceState.java. - static InputDeviceID nextInputDeviceID = DEVICE_ID_ANY; - if (msg == "inputDeviceConnectedID") { - nextInputDeviceID = (InputDeviceID)parseLong(value); - } - else if (msg == "inputDeviceConnected") { - KeyMap::NotifyPadConnected(nextInputDeviceID, value); - } - else if (msg == "savestate_displayslot") { + if (msg == "savestate_displayslot") { auto sy = GetI18NCategory(I18NCat::SYSTEM); std::string msg = StringFromFormat("%s: %d", sy->T("Savestate Slot"), SaveState::GetCurrentSlot() + 1); // Show for the same duration as the preview. diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index e1b05a58e3..4349768981 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -90,6 +90,7 @@ struct JNIEnv {}; #include "Core/ConfigValues.h" #include "Core/Loaders.h" #include "Core/FileLoaders/LocalFileLoader.h" +#include "Core/KeyMap.h" #include "Core/System.h" #include "Core/HLE/sceUsbCam.h" #include "Core/HLE/sceUsbGps.h" @@ -369,7 +370,7 @@ static void EmuThreadJoin() { static void ProcessFrameCommands(JNIEnv *env); -void PushCommand(std::string cmd, std::string param) { +static void PushCommand(std::string cmd, std::string param) { std::lock_guard guard(frameCommandLock); frameCommands.push(FrameCommand(cmd, param)); } @@ -1243,10 +1244,13 @@ extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_accelerometer(JNIEnv *, NativeAxis(axis); } -extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_sendMessage(JNIEnv *env, jclass, jstring message, jstring param) { +extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_sendMessageFromJava(JNIEnv *env, jclass, jstring message, jstring param) { std::string msg = GetJavaString(env, message); std::string prm = GetJavaString(env, param); + // A bit ugly, see InputDeviceState.java. + static InputDeviceID nextInputDeviceID = DEVICE_ID_ANY; + // Some messages are caught by app-android. TODO: Should be all. if (msg == "moga") { mogaVersion = prm; @@ -1254,12 +1258,15 @@ extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_sendMessage(JNIEnv *env INFO_LOG(SYSTEM, "STORAGE PERMISSION: PENDING"); // TODO: Add support for other permissions permissions[SYSTEM_PERMISSION_STORAGE] = PERMISSION_STATUS_PENDING; + // Don't need to send along, nothing else is listening. } else if (msg == "permission_denied") { INFO_LOG(SYSTEM, "STORAGE PERMISSION: DENIED"); permissions[SYSTEM_PERMISSION_STORAGE] = PERMISSION_STATUS_DENIED; + // Don't need to send along, nothing else is listening. } else if (msg == "permission_granted") { INFO_LOG(SYSTEM, "STORAGE PERMISSION: GRANTED"); - permissions[SYSTEM_PERMISSION_STORAGE] = PERMISSION_STATUS_GRANTED; + // Send along. + NativeMessageReceived(msg.c_str(), prm.c_str()); } else if (msg == "sustained_perf_supported") { sustainedPerfSupported = true; } else if (msg == "safe_insets") { @@ -1272,10 +1279,16 @@ extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_sendMessage(JNIEnv *env g_safeInsetTop = (float)top * g_display.dpi_scale_y; g_safeInsetBottom = (float)bottom * g_display.dpi_scale_y; } + } else if (msg == "inputDeviceConnectedID") { + nextInputDeviceID = (InputDeviceID)parseLong(prm); + } else if (msg == "inputDeviceConnected") { + KeyMap::NotifyPadConnected(nextInputDeviceID, prm); + } else if (msg == "core_powerSaving") { + // Forward. + NativeMessageReceived(msg.c_str(), prm.c_str()); + } else { + ERROR_LOG(SYSTEM, "Got unexpected message from Java, ignoring: %s / %s", msg.c_str(), prm.c_str()); } - - // Ensures that the receiver can handle it on a sensible thread. - NativeMessageReceived(msg.c_str(), prm.c_str()); } extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeActivity_requestExitVulkanRenderLoop(JNIEnv *env, jobject obj) { diff --git a/android/src/org/ppsspp/ppsspp/InputDeviceState.java b/android/src/org/ppsspp/ppsspp/InputDeviceState.java index b221032cd6..fc22876a32 100644 --- a/android/src/org/ppsspp/ppsspp/InputDeviceState.java +++ b/android/src/org/ppsspp/ppsspp/InputDeviceState.java @@ -128,8 +128,8 @@ public class InputDeviceState { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { logAdvanced(device); } - NativeApp.sendMessage("inputDeviceConnectedID", String.valueOf(this.deviceId)); - NativeApp.sendMessage("inputDeviceConnected", device.getName()); + NativeApp.sendMessageFromJava("inputDeviceConnectedID", String.valueOf(this.deviceId)); + NativeApp.sendMessageFromJava("inputDeviceConnected", device.getName()); } public boolean onKeyDown(KeyEvent event) { diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index 740eef13bf..4f43d79d0e 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -200,9 +200,9 @@ public abstract class NativeActivity extends Activity { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Let's start out granted if it was granted already. if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { - NativeApp.sendMessage("permission_granted", "storage"); + NativeApp.sendMessageFromJava("permission_granted", "storage"); } else { - NativeApp.sendMessage("permission_denied", "storage"); + NativeApp.sendMessageFromJava("permission_denied", "storage"); } } } @@ -220,9 +220,9 @@ public abstract class NativeActivity extends Activity { switch (requestCode) { case REQUEST_CODE_STORAGE_PERMISSION: if (permissionsGranted(permissions, grantResults)) { - NativeApp.sendMessage("permission_granted", "storage"); + NativeApp.sendMessageFromJava("permission_granted", "storage"); } else { - NativeApp.sendMessage("permission_denied", "storage"); + NativeApp.sendMessageFromJava("permission_denied", "storage"); } break; case REQUEST_CODE_LOCATION_PERMISSION: @@ -364,7 +364,7 @@ public abstract class NativeActivity extends Activity { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (powerManager != null && powerManager.isSustainedPerformanceModeSupported()) { sustainedPerfSupported = true; - NativeApp.sendMessage("sustained_perf_supported", "1"); + NativeApp.sendMessageFromJava("sustained_perf_supported", "1"); } } @@ -1515,9 +1515,9 @@ public abstract class NativeActivity extends Activity { recreate(); } else if (command.equals("ask_permission") && params.equals("storage")) { if (askForPermissions(permissionsForStorage, REQUEST_CODE_STORAGE_PERMISSION)) { - NativeApp.sendMessage("permission_pending", "storage"); + NativeApp.sendMessageFromJava("permission_pending", "storage"); } else { - NativeApp.sendMessage("permission_granted", "storage"); + NativeApp.sendMessageFromJava("permission_granted", "storage"); } } else if (command.equals("gps_command")) { if (params.equals("open")) { diff --git a/android/src/org/ppsspp/ppsspp/NativeApp.java b/android/src/org/ppsspp/ppsspp/NativeApp.java index 00ee71d57a..b91d1cee9e 100644 --- a/android/src/org/ppsspp/ppsspp/NativeApp.java +++ b/android/src/org/ppsspp/ppsspp/NativeApp.java @@ -50,7 +50,7 @@ public class NativeApp { public static native void accelerometer(float x, float y, float z); - public static native void sendMessage(String msg, String arg); + public static native void sendMessageFromJava(String msg, String arg); public static native void sendRequestResult(int seqID, boolean result, String value, int iValue); public static native String queryConfig(String queryName); diff --git a/android/src/org/ppsspp/ppsspp/NativeGLView.java b/android/src/org/ppsspp/ppsspp/NativeGLView.java index 6dbf91974d..d6a67ab00d 100644 --- a/android/src/org/ppsspp/ppsspp/NativeGLView.java +++ b/android/src/org/ppsspp/ppsspp/NativeGLView.java @@ -189,11 +189,11 @@ public class NativeGLView extends GLSurfaceView implements SensorEventListener, case StateEvent.ACTION_CONNECTED: Log.i(TAG, "Moga Connected"); if (mController.getState(Controller.STATE_CURRENT_PRODUCT_VERSION) == Controller.ACTION_VERSION_MOGA) { - NativeApp.sendMessage("moga", "Moga"); + NativeApp.sendMessageFromJava("moga", "Moga"); } else { Log.i(TAG, "MOGA Pro detected"); isMogaPro = true; - NativeApp.sendMessage("moga", "MogaPro"); + NativeApp.sendMessageFromJava("moga", "MogaPro"); } break; case StateEvent.ACTION_CONNECTING: @@ -201,7 +201,7 @@ public class NativeGLView extends GLSurfaceView implements SensorEventListener, break; case StateEvent.ACTION_DISCONNECTED: Log.i(TAG, "Moga Disconnected (or simply Not connected)"); - NativeApp.sendMessage("moga", ""); + NativeApp.sendMessageFromJava("moga", ""); break; } break; diff --git a/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java b/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java index fa70f96cce..81625b3f99 100644 --- a/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java +++ b/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java @@ -186,11 +186,11 @@ public class NativeSurfaceView extends SurfaceView implements SensorEventListene case StateEvent.ACTION_CONNECTED: Log.i(TAG, "Moga Connected"); if (mController.getState(Controller.STATE_CURRENT_PRODUCT_VERSION) == Controller.ACTION_VERSION_MOGA) { - NativeApp.sendMessage("moga", "Moga"); + NativeApp.sendMessageFromJava("moga", "Moga"); } else { Log.i(TAG, "MOGA Pro detected"); isMogaPro = true; - NativeApp.sendMessage("moga", "MogaPro"); + NativeApp.sendMessageFromJava("moga", "MogaPro"); } break; case StateEvent.ACTION_CONNECTING: @@ -198,7 +198,7 @@ public class NativeSurfaceView extends SurfaceView implements SensorEventListene break; case StateEvent.ACTION_DISCONNECTED: Log.i(TAG, "Moga Disconnected (or simply Not connected)"); - NativeApp.sendMessage("moga", ""); + NativeApp.sendMessageFromJava("moga", ""); break; } break; diff --git a/android/src/org/ppsspp/ppsspp/PowerSaveModeReceiver.java b/android/src/org/ppsspp/ppsspp/PowerSaveModeReceiver.java index 38649b873c..b480c9e906 100644 --- a/android/src/org/ppsspp/ppsspp/PowerSaveModeReceiver.java +++ b/android/src/org/ppsspp/ppsspp/PowerSaveModeReceiver.java @@ -108,9 +108,9 @@ public class PowerSaveModeReceiver extends BroadcastReceiver { try { if (isBatteryLow || isPowerSaving) { - NativeApp.sendMessage("core_powerSaving", "true"); + NativeApp.sendMessageFromJava("core_powerSaving", "true"); } else { - NativeApp.sendMessage("core_powerSaving", "false"); + NativeApp.sendMessageFromJava("core_powerSaving", "false"); } } catch (Exception e) { Log.e(TAG, "Exception in sendPowerSaving: " + e.toString()); diff --git a/android/src/org/ppsspp/ppsspp/SizeManager.java b/android/src/org/ppsspp/ppsspp/SizeManager.java index 174396f863..25509769eb 100644 --- a/android/src/org/ppsspp/ppsspp/SizeManager.java +++ b/android/src/org/ppsspp/ppsspp/SizeManager.java @@ -203,7 +203,7 @@ public class SizeManager implements SurfaceHolder.Callback { safeInsetTop = 0; safeInsetBottom = 0; } - NativeApp.sendMessage("safe_insets", safeInsetLeft + ":" + safeInsetRight + ":" + safeInsetTop + ":" + safeInsetBottom); + NativeApp.sendMessageFromJava("safe_insets", safeInsetLeft + ":" + safeInsetRight + ":" + safeInsetTop + ":" + safeInsetBottom); } } }