From 7be336fbaa4436432172e640f1289e810f0d59d9 Mon Sep 17 00:00:00 2001 From: Fredia Huya-Kouadio Date: Sun, 8 Sep 2024 11:22:08 -0700 Subject: [PATCH] Add a project setting to enable/disable automatic requests for runtime permissions --- plugin/src/main/cpp/include/register_types.h | 2 ++ plugin/src/main/cpp/register_types.cpp | 27 +++++++++++++++++++ .../godotengine/openxr/vendors/GodotOpenXR.kt | 18 ++++++++++--- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/cpp/include/register_types.h b/plugin/src/main/cpp/include/register_types.h index cdf62ca1..afb80d93 100644 --- a/plugin/src/main/cpp/include/register_types.h +++ b/plugin/src/main/cpp/include/register_types.h @@ -35,3 +35,5 @@ using namespace godot; void initialize_plugin_module(ModuleInitializationLevel p_level); void terminate_plugin_module(ModuleInitializationLevel p_level); + +void add_plugin_project_settings(); diff --git a/plugin/src/main/cpp/register_types.cpp b/plugin/src/main/cpp/register_types.cpp index 87490e2e..130da3c0 100644 --- a/plugin/src/main/cpp/register_types.cpp +++ b/plugin/src/main/cpp/register_types.cpp @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -155,6 +156,8 @@ void initialize_plugin_module(ModuleInitializationLevel p_level) { break; case MODULE_INITIALIZATION_LEVEL_SCENE: { + add_plugin_project_settings(); + Engine::get_singleton()->register_singleton("OpenXRFbPassthroughExtensionWrapper", OpenXRFbPassthroughExtensionWrapper::get_singleton()); Engine::get_singleton()->register_singleton("OpenXRFbRenderModelExtensionWrapper", OpenXRFbRenderModelExtensionWrapper::get_singleton()); Engine::get_singleton()->register_singleton("OpenXRFbSceneCaptureExtensionWrapper", OpenXRFbSceneCaptureExtensionWrapper::get_singleton()); @@ -214,6 +217,30 @@ void initialize_plugin_module(ModuleInitializationLevel p_level) { void terminate_plugin_module(ModuleInitializationLevel p_level) { } +void add_plugin_project_settings() { + ProjectSettings* project_settings = ProjectSettings::get_singleton(); + if (project_settings == nullptr) { + return; + } + + { + // Add the 'automatically_request_runtime_permissions' project setting + String request_permissions_setting = "xr/openxr/extensions/automatically_request_runtime_permissions"; + if (!project_settings->has_setting(request_permissions_setting)) { + // Default value is `true` to match prior plugin behavior + project_settings->set_setting(request_permissions_setting, true); + } + + project_settings->set_initial_value(request_permissions_setting, true); + project_settings->set_as_basic(request_permissions_setting, false); + Dictionary property_info; + property_info["name"] = request_permissions_setting; + property_info["type"] = Variant::Type::BOOL; + property_info["hint"] = PROPERTY_HINT_NONE; + project_settings->add_property_info(property_info); + } +} + extern "C" { GDExtensionBool GDE_EXPORT plugin_library_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) { godot::GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization); diff --git a/plugin/src/main/java/org/godotengine/openxr/vendors/GodotOpenXR.kt b/plugin/src/main/java/org/godotengine/openxr/vendors/GodotOpenXR.kt index 9bfb373f..71823834 100644 --- a/plugin/src/main/java/org/godotengine/openxr/vendors/GodotOpenXR.kt +++ b/plugin/src/main/java/org/godotengine/openxr/vendors/GodotOpenXR.kt @@ -31,6 +31,7 @@ package org.godotengine.openxr.vendors import android.util.Log import org.godotengine.godot.Godot +import org.godotengine.godot.GodotLib import org.godotengine.godot.plugin.GodotPlugin import org.godotengine.godot.utils.PermissionsUtil @@ -56,10 +57,19 @@ abstract class GodotOpenXR(godot: Godot?) : GodotPlugin(godot) { override fun onGodotSetupCompleted() { super.onGodotSetupCompleted() - // Request plugin permissions if needed - val permissionsToRequest = getPluginPermissionsToEnable() - if (permissionsToRequest.isNotEmpty()) { - PermissionsUtil.requestPermissions(activity, permissionsToRequest) + // Check if automatic permissions request is enabled. + val automaticallyRequestPermissionsSetting = GodotLib.getGlobal("xr/openxr/extensions/automatically_request_runtime_permissions") + // We only request permissions when the project setting is enabled. + // If the project setting is not defined, we fall-back to the default behavior which is + // to automatically request permissions. + val requestPermissionsEnabled = automaticallyRequestPermissionsSetting.isNullOrEmpty() || + automaticallyRequestPermissionsSetting.toBoolean() + if (requestPermissionsEnabled) { + val permissionsToRequest = getPluginPermissionsToEnable() + if (permissionsToRequest.isNotEmpty()) { + Log.v(TAG, "Performing automatic request of runtime permissions") + PermissionsUtil.requestPermissions(activity, permissionsToRequest) + } } }