| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- using System;
- using System.Collections.Generic;
- #if UNITY_ANDROID
- using UnityEngine.Android;
- #endif
- using UnityEngine.Events;
- namespace UnityEngine.XR.Interaction.Toolkit.Samples.StarterAssets
- {
- /// <summary>
- /// Utility class to help define and manage Android device permissions and specify corresponding permission callbacks via <see cref="UnityEvent"/>.
- /// </summary>
- /// <remarks>
- /// This component is currently designed to work with Android platform permissions only.
- /// </remarks>
- [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<PermissionRequestGroup> m_PermissionGroups = new List<PermissionRequestGroup>();
- /// <summary>
- /// Current platform permission group to process. This is determined during the <see cref="Awake"/> method using based on <see cref="XRPlatformUnderstanding"/>.
- /// </summary>
- PermissionRequestGroup m_CurrentPlatformPermissionGroup = new PermissionRequestGroup();
- /// <summary>
- /// A group of permissions to request based on a specific platform.
- /// </summary>
- [Serializable]
- class PermissionRequestGroup
- {
- [Tooltip("The platform type for which these permissions is intended for.")]
- public XRPlatformType platformType;
- public List<PermissionRequest> permissions;
- }
- /// <summary>
- /// A permission request to be made to the Android operating system.
- /// </summary>
- [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<string> onPermissionGranted;
- public UnityEvent<string> onPermissionDenied;
- }
- void Awake()
- {
- if (m_ProcessPermissionsOnAwake)
- ProcessPermissions();
- }
- /// <summary>
- /// Process the permissions defined in the <see cref="m_PermissionGroups"/> list.
- /// </summary>
- 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<string>();
- // 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);
- }
- }
- }
|