Add some plumbing for the Android 17 local network access permission

This commit is contained in:
Henrik Rydgård
2026-06-15 09:44:56 +02:00
parent b079c5d6ce
commit 697179c8cd
4 changed files with 58 additions and 10 deletions
+1
View File
@@ -18,6 +18,7 @@
enum SystemPermission {
SYSTEM_PERMISSION_STORAGE,
SYSTEM_PERMISSION_LOCAL_NETWORK,
};
enum PermissionStatus {
+1
View File
@@ -31,6 +31,7 @@
<uses-permission-sdk-23 android:name="android.permission.TRANSMIT_IR" />
<uses-permission-sdk-23 android:name="android.permission.CAMERA" />
<uses-permission-sdk-23 android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />
<!-- AndroidX minimum SDK workaround. We don't care if it's broken on older versions. -->
<uses-sdk tools:overrideLibrary="androidx.appcompat.resources,androidx.appcompat,androidx.fragment,androidx.drawerlayout,androidx.vectordrawable.animated,androidx.vectordrawable,androidx.viewpager,androidx.loader,androidx.activity,androidx.annotation,androidx.customview,androidx.cursoradapter,androidx.arch,androidx.collection,androidx.core,androidx.versionedparcelable,androidx.interpolator,androidx.lifecycle,androidx.loader,androidx.savedstate,androidx.lifecycle.viewmodel,androidx.lifecycle.livedata,androidx.lifecycle.livedata.core,androidx.arch.core,androidx.documentfile"/>
+24 -10
View File
@@ -1246,6 +1246,9 @@ void System_AskForPermission(SystemPermission permission) {
case SYSTEM_PERMISSION_STORAGE:
PushCommand("ask_permission", "storage");
break;
case SYSTEM_PERMISSION_LOCAL_NETWORK:
PushCommand("ask_permission", "local_network");
break;
}
}
@@ -1450,18 +1453,29 @@ extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_sendMessageFromJava(JNI
if (msg == "moga") {
mogaVersion = prm;
} else if (msg == "permission_pending") {
INFO_LOG(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.
if (prm == "storage") {
INFO_LOG(Log::System, "STORAGE PERMISSION: PENDING");
permissions[SYSTEM_PERMISSION_STORAGE] = PERMISSION_STATUS_PENDING;
} else if (prm == "local_network") {
INFO_LOG(Log::System, "LOCAL NETWORK PERMISSION: PENDING");
permissions[SYSTEM_PERMISSION_LOCAL_NETWORK] = PERMISSION_STATUS_PENDING;
}
} else if (msg == "permission_denied") {
INFO_LOG(Log::System, "STORAGE PERMISSION: DENIED");
permissions[SYSTEM_PERMISSION_STORAGE] = PERMISSION_STATUS_DENIED;
// Don't need to send along, nothing else is listening.
if (prm == "storage") {
INFO_LOG(Log::System, "STORAGE PERMISSION: DENIED");
permissions[SYSTEM_PERMISSION_STORAGE] = PERMISSION_STATUS_DENIED;
} else if (prm == "local_network") {
INFO_LOG(Log::System, "LOCAL NETWORK PERMISSION: DENIED");
permissions[SYSTEM_PERMISSION_LOCAL_NETWORK] = PERMISSION_STATUS_DENIED;
}
} else if (msg == "permission_granted") {
INFO_LOG(Log::System, "STORAGE PERMISSION: GRANTED");
permissions[SYSTEM_PERMISSION_STORAGE] = PERMISSION_STATUS_GRANTED;
// Send along.
if (prm == "storage") {
INFO_LOG(Log::System, "STORAGE PERMISSION: GRANTED");
permissions[SYSTEM_PERMISSION_STORAGE] = PERMISSION_STATUS_GRANTED;
} else if (prm == "local_network") {
INFO_LOG(Log::System, "LOCAL NETWORK PERMISSION: GRANTED");
permissions[SYSTEM_PERMISSION_LOCAL_NETWORK] = PERMISSION_STATUS_GRANTED;
}
System_PostUIMessage(UIMessage::PERMISSION_GRANTED, prm);
} else if (msg == "sustained_perf_supported") {
sustainedPerfSupported = true;
@@ -143,11 +143,15 @@ public class PpssppActivity extends AppCompatActivity implements SensorEventList
private static final String[] permissionsForMicrophone = {
Manifest.permission.RECORD_AUDIO
};
private static final String[] permissionsForLocalNetwork = {
"android.permission.ACCESS_LOCAL_NETWORK"
};
public static final int REQUEST_CODE_STORAGE_PERMISSION = 1;
public static final int REQUEST_CODE_LOCATION_PERMISSION = 2;
public static final int REQUEST_CODE_CAMERA_PERMISSION = 3;
public static final int REQUEST_CODE_MICROPHONE_PERMISSION = 4;
public static final int REQUEST_CODE_LOCAL_NETWORK_PERMISSION = 5;
// Once we received a "modern" mouse event, we stop listening to old style mouse
// button events.
@@ -255,6 +259,16 @@ public class PpssppActivity extends AppCompatActivity implements SensorEventList
} else {
NativeApp.sendMessageFromJava("permission_denied", "storage");
}
if (Build.VERSION.SDK_INT >= 35) {
if (this.checkSelfPermission("android.permission.ACCESS_LOCAL_NETWORK") == PackageManager.PERMISSION_GRANTED) {
NativeApp.sendMessageFromJava("permission_granted", "local_network");
} else {
NativeApp.sendMessageFromJava("permission_denied", "local_network");
}
} else {
NativeApp.sendMessageFromJava("permission_granted", "local_network");
}
}
}
@@ -292,6 +306,13 @@ public class PpssppActivity extends AppCompatActivity implements SensorEventList
NativeApp.audioRecording_Start();
}
break;
case REQUEST_CODE_LOCAL_NETWORK_PERMISSION:
if (permissionsGranted(permissions, grantResults)) {
NativeApp.sendMessageFromJava("permission_granted", "local_network");
} else {
NativeApp.sendMessageFromJava("permission_denied", "local_network");
}
break;
default:
}
}
@@ -1761,6 +1782,17 @@ public class PpssppActivity extends AppCompatActivity implements SensorEventList
NativeApp.sendMessageFromJava("permission_granted", "storage");
}
return true;
} else if (command.equals("ask_permission") && params.equals("local_network")) {
if (Build.VERSION.SDK_INT >= 35) {
if (askForPermissions(permissionsForLocalNetwork, REQUEST_CODE_LOCAL_NETWORK_PERMISSION)) {
NativeApp.sendMessageFromJava("permission_pending", "local_network");
} else {
NativeApp.sendMessageFromJava("permission_granted", "local_network");
}
} else {
NativeApp.sendMessageFromJava("permission_granted", "local_network");
}
return true;
} else if (command.equals("gps_command")) {
if (params.equals("open")) {
if (!askForPermissions(permissionsForLocation, REQUEST_CODE_LOCATION_PERMISSION)) {