Android: add achievements host override receiver

This commit is contained in:
david.schkalee committed 2026-06-01 01:44:04 +02:00
1 parent 3b6ecc4001
commit d477afa9b2
7 files changed
+238

No files matched your search

+8
View File
@@ -116,6 +116,14 @@
<activity android:name=".DocumentResultProxyActivity"
android:theme="@style/Theme.ProxyTransparent"
android:launchMode="standard" />
<receiver
android:name=".AchievementsHostOverrideReceiver"
android:exported="true">
<intent-filter>
<action android:name="org.ppsspp.ppsspp.action.SET_ACHIEVEMENTS_HOST_OVERRIDE" />
<action android:name="org.ppsspp.ppsspp.action.CLEAR_ACHIEVEMENTS_HOST_OVERRIDE" />
</intent-filter>
</receiver>
<profileable android:shell="true" android:enabled="true" />
</application>
+9
View File
@@ -870,6 +870,15 @@ retry:
}
}
extern "C" void Java_org_ppsspp_ppsspp_NativeApp_setAchievementsHostOverride(JNIEnv *env, jclass, jstring jhost) {
std::string host = GetJavaString(env, jhost);
NativeSetAchievementsHostOverride(host);
}
extern "C" void Java_org_ppsspp_ppsspp_NativeApp_clearAchievementsHostOverride(JNIEnv *, jclass) {
NativeClearAchievementsHostOverride();
}
AudioBackend *System_CreateAudioBackend() {
// Use legacy mechanisms.
return nullptr;
@@ -0,0 +1,109 @@
package org.ppsspp.ppsspp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
public class AchievementsHostOverrideReceiver extends BroadcastReceiver {
private static final String TAG = "AchievementsHostOverride";
public static final String ACTION_SET = "org.ppsspp.ppsspp.action.SET_ACHIEVEMENTS_HOST_OVERRIDE";
public static final String ACTION_CLEAR = "org.ppsspp.ppsspp.action.CLEAR_ACHIEVEMENTS_HOST_OVERRIDE";
public static final String EXTRA_HOST = "host";
private static final String PREFS_NAME = "achievements_host_override";
private static final String KEY_HOST = "host";
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null || intent.getAction() == null) {
return;
}
SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
String action = intent.getAction();
if (ACTION_CLEAR.equals(action)) {
clearHostOverride(prefs);
PpssppActivity.clearAchievementsHostOverride();
Log.i(TAG, "Cleared achievements host override");
return;
}
if (!ACTION_SET.equals(action)) {
return;
}
String host = intent.getStringExtra(EXTRA_HOST);
if (host != null) {
host = host.trim();
}
if (TextUtils.isEmpty(host)) {
clearHostOverride(prefs);
PpssppActivity.clearAchievementsHostOverride();
Log.i(TAG, "Empty host received, cleared override");
return;
}
if (!isAllowedHost(host)) {
Log.w(TAG, "Rejected non-loopback achievements host override");
return;
}
prefs.edit().putString(KEY_HOST, host).apply();
PpssppActivity.applyAchievementsHostOverride(host);
Log.i(TAG, "Stored achievements host override");
}
public static String getAchievementsHostOverride(Context context) {
SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
return prefs.getString(KEY_HOST, null);
}
private static void clearHostOverride(SharedPreferences prefs) {
prefs.edit().remove(KEY_HOST).apply();
}
private static boolean isAllowedHost(String host) {
Uri uri = Uri.parse(host);
if (uri == null) {
return false;
}
if (!"http".equals(uri.getScheme())) {
return false;
}
if (!uri.isHierarchical()) {
return false;
}
String authority = uri.getEncodedAuthority();
if (TextUtils.isEmpty(authority) || authority.contains("@")) {
return false;
}
if (!TextUtils.isEmpty(uri.getEncodedPath()) && !"/".equals(uri.getEncodedPath())) {
return false;
}
if (!TextUtils.isEmpty(uri.getEncodedQuery()) || !TextUtils.isEmpty(uri.getEncodedFragment())) {
return false;
}
int port = uri.getPort();
if (port < 0 || port > 65535) {
return false;
}
String parsedHost = uri.getHost();
if (TextUtils.isEmpty(parsedHost)) {
return false;
}
return "127.0.0.1".equals(parsedHost) || "localhost".equalsIgnoreCase(parsedHost) || "::1".equals(parsedHost);
}
}
@@ -71,6 +71,8 @@ public class NativeApp {
public static native void mouseDelta(float x, float y);
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 void setAchievementsHostOverride(String host);
public static native void clearAchievementsHostOverride();
public static native String queryConfig(String queryName);
public static native int getSelectedCamera();
@@ -172,6 +172,22 @@ public class PpssppActivity extends AppCompatActivity implements SensorEventList
public static boolean libraryLoaded = false;
public static void applyAchievementsHostOverride(String host) {
if (!initialized || !libraryLoaded || host == null || host.isEmpty()) {
return;
}
NativeApp.setAchievementsHostOverride(host);
}
public static void clearAchievementsHostOverride() {
if (!initialized || !libraryLoaded) {
return;
}
NativeApp.clearAchievementsHostOverride();
}
public static void CheckABIAndLoadLibrary() {
try {
System.loadLibrary("ppsspp_jni");
@@ -707,6 +723,12 @@ public class PpssppActivity extends AppCompatActivity implements SensorEventList
setShortcutParam(shortcutParam);
}
String achievementsHostOverride = AchievementsHostOverrideReceiver.getAchievementsHostOverride(this);
if (achievementsHostOverride != null && !achievementsHostOverride.isEmpty()) {
NativeApp.setAchievementsHostOverride(achievementsHostOverride);
Log.i(TAG, "Found achievements host override");
}
lifeCycle.onCreate();
mSensorManager = (SensorManager)getSystemService(Activity.SENSOR_SERVICE);