using System;
+using System.Threading.Tasks;
using Fitness.Controls;
using Fitness.Views;
using Tizen.NUI;
navigation.Push(new ExercisePreviewView(workoutId));
}
- public void NavigateToScanningView()
+ public async Task NavigateToScanningView()
{
- navigation.Push(new ScanningView());
+ var result = await PrivilegeService.Instance.CheckCameraPrivilege();
+ if (result == Tizen.Security.RequestResult.AllowForever)
+ {
+ navigation.Push(new ScanningView());
+ }
}
- public void NavigateToLoadingView()
+ public async Task NavigateToLoadingView()
{
- navigation.Push(new LoadingView());
+ var result = await PrivilegeService.Instance.CheckCameraPrivilege();
+ if (result == Tizen.Security.RequestResult.AllowForever)
+ {
+ navigation.Push(new LoadingView());
+ }
}
public void NavigateToSummaryView()
--- /dev/null
+using System.Threading.Tasks;
+using Tizen.Applications;
+using Tizen.NUI;
+using Tizen.NUI.Components;
+using Tizen.Security;
+
+namespace Fitness.Services
+{
+ /// <summary>
+ /// Class for handling privacy privileges requests.
+ /// </summary>
+ public class PrivilegeService
+ {
+ private static PrivilegeService instance;
+ private string privilege;
+ private TaskCompletionSource<RequestResult> taskCompletionSource;
+
+ private PrivilegeService()
+ {
+ }
+
+ /// <summary>
+ /// Gets the instance of the <see cref="PrivilegeService"/> class.
+ /// </summary>
+ public static PrivilegeService Instance
+ {
+ get
+ {
+ if (instance == null)
+ {
+ instance = new PrivilegeService();
+ }
+
+ return instance;
+ }
+ }
+
+ /// <summary>
+ /// Checks the status of camera privacy privilege permission and asks user to grant access if necessary.
+ /// </summary>
+ /// <returns>A <see cref="Task"/> representing the result of the asynchronous operation.</returns>
+ public async Task<RequestResult> CheckCameraPrivilege()
+ {
+ const string Privilege = "http://tizen.org/privilege/camera";
+ const string Message = "This view can't be shown without camera privilege.";
+
+ var result = await CheckPrivilege(Privilege);
+ if (result != RequestResult.AllowForever)
+ {
+ Notification
+ .MakeToast(Message, Notification.ToastBottom)
+ .Post(Notification.ToastLong);
+ }
+
+ return result;
+ }
+
+ /// <summary>
+ /// Checks the status of privacy privilege permission and asks user to grant access if necessary.
+ /// </summary>
+ /// <param name="privilege">Privacy privilege to be processed.</param>
+ /// <returns>A <see cref="Task"/> representing the result of the asynchronous operation.</returns>
+ public Task<RequestResult> CheckPrivilege(string privilege)
+ {
+ this.privilege = privilege;
+ taskCompletionSource = new TaskCompletionSource<RequestResult>();
+
+ CheckResult result = PrivacyPrivilegeManager.CheckPermission(privilege);
+
+ switch (result)
+ {
+ case CheckResult.Ask:
+ RegisterResponseHandler();
+ PrivacyPrivilegeManager.RequestPermission(privilege);
+ break;
+ case CheckResult.Allow:
+ taskCompletionSource.SetResult(RequestResult.AllowForever);
+ break;
+ case CheckResult.Deny:
+ taskCompletionSource.SetResult(RequestResult.DenyForever);
+ break;
+ default:
+ break;
+ }
+
+ return taskCompletionSource.Task;
+ }
+
+ private void RegisterResponseHandler()
+ {
+ if (PrivacyPrivilegeManager.GetResponseContext(privilege).TryGetTarget(out var context))
+ {
+ context.ResponseFetched += PPM_RequestResponse;
+ }
+ }
+
+ private void UnregisterResponseHandler()
+ {
+ if (PrivacyPrivilegeManager.GetResponseContext(privilege).TryGetTarget(out var context))
+ {
+ context.ResponseFetched -= PPM_RequestResponse;
+ }
+ }
+
+ private void PPM_RequestResponse(object sender, RequestResponseEventArgs e)
+ {
+ if (e.cause == CallCause.Answer)
+ {
+ taskCompletionSource.SetResult(e.result);
+ }
+ else
+ {
+ Services.Logger.Info($"Error occurred during requesting permission for {e.privilege}");
+ }
+
+ UnregisterResponseHandler();
+ }
+ }
+}
using Tizen.NUI;
using Tizen.NUI.BaseComponents;
using Tizen.NUI.Components;
-using Tizen.Security;
namespace Fitness.Views
{
public partial class MainView : Fitness.Controls.Page
{
- private const string CameraPrivilege = "http://tizen.org/privilege/camera";
-
public MainView()
{
- CheckPrivilege();
-
InitializeComponent();
}
-
- private void CheckPrivilege()
- {
- CheckResult result = PrivacyPrivilegeManager.CheckPermission(CameraPrivilege);
- Services.Logger.Info($"Privilege \"{CameraPrivilege}\" : {result}");
-
- if (result == CheckResult.Ask)
- {
- PrivacyPrivilegeManager.RequestPermission(CameraPrivilege);
- }
- }
}
}