using System; using System.Collections.Generic; #if UNITY_ANDROID using UnityEngine.Android; #endif using UnityEngine.Events; namespace UnityEngine.XR.Interaction.Toolkit.Samples.StarterAssets { /// /// Utility class to help define and manage Android device permissions and specify corresponding permission callbacks via . /// /// /// This component is currently designed to work with Android platform permissions only. /// [DefaultExecutionOrder(-9999)] public class PermissionsManager : MonoBehaviour { const string k_DefaultPermissionId = "com.oculus.permission.USE_SCENE"; [SerializeField, Tooltip("Enables or disables the processing of permissions on Awake. If disabled, permissions will not be processed until the ProcessPermissions method is called.")] bool m_ProcessPermissionsOnAwake = true; [SerializeField, Tooltip("The system permissions to request when this component starts.")] List m_PermissionGroups = new List(); /// /// Current platform permission group to process. This is determined during the method using based on . /// PermissionRequestGroup m_CurrentPlatformPermissionGroup = new PermissionRequestGroup(); /// /// A group of permissions to request based on a specific platform. /// [Serializable] class PermissionRequestGroup { [Tooltip("The platform type for which these permissions is intended for.")] public XRPlatformType platformType; public List permissions; } /// /// A permission request to be made to the Android operating system. /// [Serializable] class PermissionRequest { [Tooltip("The Android system permission to request when this component starts.")] public string permissionId = k_DefaultPermissionId; [Tooltip("Whether to request permission from the operating system.")] public bool enabled = true; [HideInInspector] public bool requested = false; [HideInInspector] public bool responseReceived = false; [HideInInspector] public bool granted = false; public UnityEvent onPermissionGranted; public UnityEvent onPermissionDenied; } void Awake() { if (m_ProcessPermissionsOnAwake) ProcessPermissions(); } /// /// Process the permissions defined in the list. /// public void ProcessPermissions() { #if UNITY_ANDROID // Grab the current platform permission group based on the current platform in use. var currentPlatform = XRPlatformUnderstanding.CurrentPlatform; m_CurrentPlatformPermissionGroup = m_PermissionGroups.Find(g => g.platformType == currentPlatform); if (m_CurrentPlatformPermissionGroup == null) { // No permission group defined for the current platform. // No permissions will be requested by this component. return; } var permissionIds = new List(); // Loop through the current platform's permissions and add them to the // list of permissions to request if they are enabled and not already requested. for (var i = 0; i < m_CurrentPlatformPermissionGroup.permissions.Count; i++) { var permission = m_CurrentPlatformPermissionGroup.permissions[i]; if (!permission.enabled) continue; // If permission is not granted and not requested, add it to the list of permissions to request if (!Permission.HasUserAuthorizedPermission(permission.permissionId) && !permission.requested) { permissionIds.Add(permission.permissionId); permission.requested = true; } else { Debug.Log($"User has permission for: {permission.permissionId}", this); } } // Process permissions that were not already granted if (permissionIds.Count > 0) { var callbacks = new PermissionCallbacks(); callbacks.PermissionDenied += OnPermissionDenied; callbacks.PermissionGranted += OnPermissionGranted; Permission.RequestUserPermissions(permissionIds.ToArray(), callbacks); } #endif // UNITY_ANDROID } void OnPermissionGranted(string permissionStr) { // Find the permission var permission = m_CurrentPlatformPermissionGroup.permissions.Find(p => p.permissionId == permissionStr); if (permission == null) { Debug.LogWarning($"Permission granted callback received for an unexpected permission request, permission ID {permissionStr}", this); return; } // Enable permission permission.granted = true; permission.responseReceived = true; Debug.Log($"User granted permission for: {permissionStr}", this); permission.onPermissionGranted.Invoke(permissionStr); } void OnPermissionDenied(string permissionStr) { // Find the permission var permission = m_CurrentPlatformPermissionGroup.permissions.Find(p => p.permissionId == permissionStr); if (permission == null) { Debug.LogWarning($"Permission denied callback received for an unexpected permission request, permission ID {permissionStr}", this); return; } // Disable permission permission.granted = false; permission.responseReceived = true; Debug.LogWarning($"User denied permission for: {permissionStr}", this); permission.onPermissionDenied.Invoke(permissionStr); } } }