diff --git a/Common/System/System.h b/Common/System/System.h index 57c118dc8c..a1a10d9dd9 100644 --- a/Common/System/System.h +++ b/Common/System/System.h @@ -18,6 +18,7 @@ enum SystemPermission { SYSTEM_PERMISSION_STORAGE, + SYSTEM_PERMISSION_LOCAL_NETWORK, }; enum PermissionStatus { diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 5ffcdaab7f..849c5856d3 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -31,6 +31,7 @@ + diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 902c04e9f9..3315bb6be4 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -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; diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 6d9236a665..40652eca41 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -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)) {