using System; using System.Collections; using System.Collections.Generic; using UnityEngine; #if UNITY_ANDROID using UnityEngine.Android; #endif // UNITY_ANDROID using UnityEngine.Events; namespace Unity.VRTemplate { /// /// Utility class to help define and manage Android device permissions and specify corresponding permission callbacks via . /// public class PermissionsManager : MonoBehaviour { const string k_DefaultPermissionId = "com.oculus.permission.USE_SCENE"; [SerializeField] private bool m_ProcessPermissionsOnStart = true; [Serializable] class PermissionRequest { [SerializeField, Tooltip("The Android system permission to request when this component starts.")] public string m_PermissionId = k_DefaultPermissionId; [SerializeField, Tooltip("Whether to request permission from the operating system.")] public bool m_Enabled = true; [HideInInspector] public bool m_Requested = false; [HideInInspector] public bool m_ResponseReceived = false; [HideInInspector] public bool m_Granted = false; [SerializeField] public UnityEvent m_PermissionGranted; [SerializeField] public UnityEvent m_PermissionDenied; } #pragma warning disable CS0414 [SerializeField, Tooltip("The system permissions to request when this component Starts.")] List m_PermissionRequests = new List(); int m_CurrentPermissionIdx = 0; #pragma warning restore CS0414 IEnumerator Start() { if (m_ProcessPermissionsOnStart) yield return ProcessPermissions(); } public IEnumerator ProcessPermissions() { var permissions = new List(); #if UNITY_ANDROID for (m_CurrentPermissionIdx = 0; m_CurrentPermissionIdx < m_PermissionRequests.Count;) { var permission = m_PermissionRequests[m_CurrentPermissionIdx]; if (!permission.m_Enabled) { m_CurrentPermissionIdx++; continue; } if (!Permission.HasUserAuthorizedPermission(permission.m_PermissionId) && !permission.m_Requested) { permissions.Add(permission.m_PermissionId); permission.m_Requested = true; } else { Debug.Log($"User has permission for: {permission.m_PermissionId}", this); } m_CurrentPermissionIdx++; } if (permissions.Count > 0) { var callbacks = new PermissionCallbacks(); callbacks.PermissionDenied += OnPermissionDenied; callbacks.PermissionGranted += OnPermissionGranted; Permission.RequestUserPermissions(permissions.ToArray(), callbacks); } #endif // UNITY_ANDROID yield break; } void OnPermissionGranted(string permissionStr) { var permission = m_PermissionRequests[m_CurrentPermissionIdx]; permission.m_Granted = true; permission.m_ResponseReceived = true; m_CurrentPermissionIdx++; Debug.Log($"User granted permission for: {permissionStr}", this); permission.m_PermissionGranted.Invoke(permissionStr); } void OnPermissionDenied(string permissionStr) { var permission = m_PermissionRequests[m_CurrentPermissionIdx]; permission.m_Granted = false; permission.m_ResponseReceived = true; m_CurrentPermissionIdx++; Debug.LogWarning($"User denied permission for: {permissionStr}", this); permission.m_PermissionDenied.Invoke(permissionStr); } } }