コード例 #1
0
        static async Task <FileInfo[]> PickPhotoCore(bool enableMultipleSelection, OnError errorAction = OnError.Alert)
        {
            if (!SupportsPickingPhoto())
            {
                await errorAction.Apply("Your device does not support picking photos.");

                return(null);
            }

            if (!await Permission.Albums.IsRequestGranted())
            {
                await SuggestLaunchingSettings(errorAction, "Permission was denied to access the device gallery.");

                return(null);
            }

            try
            {
                return(await Thread.UI.Run(() => DoPickPhoto(enableMultipleSelection)));
            }
            catch (Exception ex)
            {
                await errorAction.Apply("Failed to pick a photo: " + ex.Message);

                return(null);
            }
        }
コード例 #2
0
 public static async Task SendSMS(SMS message, OnError errorAction = OnError.Alert)
 {
     if (!CanSendSMS)
     {
         await errorAction.Apply("Your device does not support sending SMS.");
     }
     else
     {
         try { await SMSHelper.ComposeAsync(message); }
         catch (Exception ex) { await errorAction.Apply("Failed to send SMS: " + ex.Message); }
     }
 }
コード例 #3
0
 /// <summary>Send an email using the default email application on the device.</summary>
 public static async Task SendEmail(EmailMessage message, OnError errorAction = OnError.Alert)
 {
     if (!CanSendEmail)
     {
         await errorAction.Apply("Your device does not support sending emails.");
     }
     else
     {
         try { await DoSendEmail(message); }
         catch (Exception ex) { await errorAction.Apply("Failed to send email: " + ex.Message); }
     }
 }
コード例 #4
0
        /// <summary>Returns the current user position.</summary>
        /// <param name="desiredAccuracy">In meters</param>
        /// <param name="timeout">Milliseconds</param>
        /// <param name="silently">If set to true, then the position will only be returned if it's available and request is previously granted but there will be no user interaction (this can only be used in combination with OnError.Ignore or Throw). If set to false (default) then if necessary, the user will be prompted for granting permission, and in any case the specified error action will apply when there i any problem (GPS not supported or enabled on the device, permission denied, general error, etc.)</param>
        public static async Task <GeoPosition> GetCurrentPosition(double desiredAccuracy = TEN_METERS, int timeout = FIVE_SECONDS, bool silently = false, OnError errorAction = OnError.Alert)
        {
            if (silently && errorAction != OnError.Ignore && errorAction != OnError.Throw)
            {
                throw new Exception("If you want to get the DeviceLocation silently, ErrorAction must also be Ignore or Throw.");
            }

            await AskForPermission();

            if (!(await IsSupported()))
            {
                await errorAction.Apply("Geo DeviceLocation is not supported on your device.");

                return(null);
            }

            if (OS.Platform != DevicePlatform.IOS && !await IsEnabled())
            {
                var result = await Device.Permissions.Check(Permission.Location);

                if (result != PermissionResult.Granted)
                {
                    await errorAction.Apply("Geo DeviceLocation is not enabled on your device.");

                    return(null);
                }
            }

            if (silently && !await Permission.Location.IsGranted())
            {
                await errorAction.Apply("Permission is not already granted to access the current DeviceLocation.");

                return(null);
            }

            if (!await Permission.Location.IsRequestGranted())
            {
                await errorAction.Apply("Permission was not granted to access your current DeviceLocation.");

                return(null);
            }

            try
            {
                return(await Thread.UI.Run(() => TryGetCurrentPosition(desiredAccuracy, timeout)));
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Failed to get current position.");

                return(null);
            }
        }
コード例 #5
0
 /// <summary>
 /// Make a phone call using the default dialer UI on the device.
 /// </summary>
 /// <param name="number">Number to phone</param>
 public static async Task PhoneCall(string number, string name = null, OnError errorAction = OnError.Alert)
 {
     if (!await Device.Permission.PhoneCall.IsRequestGranted())
     {
         await errorAction.Apply("Permission was denied to make a phone call.");
     }
     else
     {
         try { await DoMakePhoneCall(number, name); }
         catch (Exception ex)
         {
             await errorAction.Apply("Failed to call number " + number + ". " + ex.Message);
         }
     }
 }
コード例 #6
0
ファイル: AudioPlayer.cs プロジェクト: Geeksltd/Zebble.Audio
        Task ExecuteSafe(Func <Task> execution, OnError errorAction, string errorMessage)
        {
            var task = new TaskCompletionSource <bool>();

            AudioThread.Post(async() =>
            {
                try
                {
                    await execution();
                    task.TrySetResult(true);
                }
                catch (Exception ex)
                {
                    if (errorAction == OnError.Throw)
                    {
                        task.TrySetException(ex);
                    }
                    else
                    {
                        await errorAction.Apply(ex, "Failed to play audio file");
                        task.TrySetResult(false);
                    }
                }
            });

            return(task.Task);
        }
コード例 #7
0
        static async Task Turn(AVCaptureTorchMode mode, OnError errorAction)
        {
            using (var captureDevice = GetCamera())
            {
                if (captureDevice == null)
                {
                    throw new Exception("Camera device was not found.");
                }

                try
                {
                    captureDevice.LockForConfiguration(out var error);

                    if (error != null)
                    {
                        throw new Exception(error.Description);
                    }

                    if (captureDevice.TorchMode != mode)
                    {
                        captureDevice.TorchMode = mode;
                    }

                    captureDevice.UnlockForConfiguration();
                }
                catch (Exception ex) { await errorAction.Apply(ex); }
            }
        }
コード例 #8
0
        public static async Task <FingerprintResult> Authenticate(FingerprintRequestConfig request, OnError errorAction = OnError.Alert)
        {
            if (request is null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            try
            {
                return(await Thread.UI.Run(async() =>
                {
                    var config = request.ToConfiguration();
                    var result = await CrossFingerprint.Current.AuthenticateAsync(config, request.CancellationToken);

                    return FingerprintResult.From(result);
                }));
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Failed to access fingerprint: " + ex.Message);

                return(new FingerprintResult
                {
                    Status = FingerprintCheckStatus.Failed,
                    ErrorMessage = ex.Message
                });
            }
        }
コード例 #9
0
        /// <summary>Saves a taken video into a local temp folder in the device's cache folder and returns it.</summary>
        public static async Task <FileInfo> TakeVideo(MediaCaptureSettings settings = null, OnError errorAction = OnError.Alert)
        {
            if (!await IsCameraAvailable())
            {
                await errorAction.Apply("No available camera was found on this device.");

                return(null);
            }

            if (!SupportsTakingVideo())
            {
                await errorAction.Apply("Your device does not support recoding video.");

                return(null);
            }

            if (!await Permission.Camera.IsRequestGranted())
            {
                await SuggestLaunchingSettings(errorAction, "Permission was denied to access the camera.");

                return(null);
            }

#if ANDROID
            if (settings?.PurgeCameraRoll == true)
            {
                if (!await Permission.ExternalStorage.IsRequestGranted())
                {
                    await SuggestLaunchingSettings(errorAction, "Permission was denied to access the external storage.");

                    return(null);
                }
            }
#endif

            try
            {
                return(await Thread.UI.Run(() => DoTakeVideo(settings ?? new MediaCaptureSettings())));
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Failed to capture a video: " + ex.Message);

                return(null);
            }
        }
コード例 #10
0
 public static async Task OnRegisteredSuccess(object token, OnError errorAction = OnError.Toast)
 {
     try { await OnRegisteredSuccess(token); }
     catch (Exception ex)
     {
         await errorAction.Apply(ex, "Failed to consume the token provided by the push notification server.");
     }
 }
コード例 #11
0
        /// <summary>Starts tracking the user's DeviceLocation.</summary>
        /// <param name="silently">If set to true, then the tracking will start if DeviceLocation permission is already granted but there will be no user interaction (this can only be used in combination with OnError.Ignore or Throw). If set to false (default) then if necessary, the user will be prompted for granting permission, and in any case the specified error action will apply when there i any problem (GPS not supported or enabled on the device, permission denied, general error, etc.)</param>
        public static async Task <bool> StartTracking(LocationTrackingSettings settings = null, bool silently = false, OnError errorAction = OnError.Alert)
        {
            if (silently && errorAction != OnError.Ignore && errorAction != OnError.Throw)
            {
                throw new Exception("If you want to track the DeviceLocation silently, ErrorAction must be Ignore or Throw.");
            }

            await AskForPermission();

            if (silently && !await Permission.Location.IsGranted())
            {
                await errorAction.Apply("Permission is not already granted to access the current DeviceLocation.");

                return(false);
            }

            if (!await Permission.Location.IsRequestGranted())
            {
                await errorAction.Apply("Permission was not granted to access your current DeviceLocation.");

                return(false);
            }

            if (IsTracking)
            {
                await StopTracking();
            }

            if (settings == null)
            {
                settings = new LocationTrackingSettings();
            }

            try
            {
                await DoStartTracking(settings);

                return(true);
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Failed to start tracking your DeviceLocation.");

                return(false);
            }
        }
コード例 #12
0
 public static async Task Register(OnError errorAction = OnError.Toast)
 {
     try { await Thread.UI.Run(DoRegister); }
     catch (Exception ex)
     {
         await errorAction.Apply(ex, "Failed to register for push notification.");
     }
 }
コード例 #13
0
 public static async Task UnRegister(object userState = null, OnError errorAction = OnError.Toast)
 {
     try { await Thread.UI.Run(() => DoUnRegister(userState)); }
     catch (Exception ex)
     {
         await errorAction.Apply(ex, "Failed to un-register from push notification.");
     }
 }
コード例 #14
0
ファイル: Sensor.cs プロジェクト: Geeksltd/Zebble.Sensors
 public async Task Start(SensorDelay delay = SensorDelay.Game, OnError errorAction = OnError.Toast)
 {
     try
     {
         DoStart(delay);
         IsActive = true;
     }
     catch (Exception ex) { await errorAction.Apply(ex); }
 }
コード例 #15
0
        public static async Task <bool> OnMessageReceived(object message, OnError errorAction = OnError.Toast)
        {
            try { return(await OnMessageReceived(message)); }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Failed to process the received message.");

                return(false);
            }
        }
コード例 #16
0
ファイル: Sharing.cs プロジェクト: Geeksltd/Zebble.Sharing
        public static async Task <bool> SupportsClipboard(OnError errorAction = OnError.Alert)
        {
            try
            {
                return(SupportsClipboard());
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Unable to share: ");

                return(false);
            }
        }
コード例 #17
0
        public static async Task TurnOn(OnError errorAction = OnError.Toast)
        {
            try
            {
                await SetMode(AndroidCamera.Parameters.FlashModeTorch);

                Camera.StartPreview();
            }
            catch (Exception ex) { await errorAction.Apply(ex); return; }

            // Fix for Nexus 5
            try { Camera.SetPreviewTexture(new SurfaceTexture(0)); }
            catch { /* Ignore. No logging needed. */ }
        }
コード例 #18
0
ファイル: Contacts.cs プロジェクト: Geeksltd/Zebble.Contacts
            /// <summary>
            /// Returns the contacts in the device operating system which match the specified search query.
            /// </summary>
            public static async Task <IEnumerable <Contact> > Search(ContactSearchParams searchParams, OnError errorAction = OnError.Alert)
            {
                try
                {
                    if (await Permissions.Check(Permission.Contacts) != PermissionResult.Granted)
                    {
                        if (await Permissions.Request(Permission.Contacts) != PermissionResult.Granted)
                        {
                            await errorAction.Apply("Permission for reading device contacts not granted");

                            return(null);
                        }
                    }

                    return(await DoReadContacts(searchParams));
                }
                catch (Exception ex)
                {
                    await errorAction.Apply(ex, "Failed to read contacts: " + ex.Message);

                    return(null);
                }
            }
コード例 #19
0
ファイル: Torch.cs プロジェクト: Geeksltd/Zebble.Torch
        static async Task Turn(bool on, OnError errorAction)
        {
            try
            {
                var lamp = await GetLamp();

                if (lamp == null)
                {
                    throw new Exception("Lamp was not found on this device.");
                }

                lamp.IsEnabled = on;
            }
            catch (Exception ex) { await errorAction.Apply(ex); }
        }
コード例 #20
0
ファイル: Sharing.cs プロジェクト: Geeksltd/Zebble.Sharing
        public static async Task <bool> SetClipboard(string text, string androidLabel, OnError errorAction = OnError.Alert)
        {
            try
            {
                await DoSetClipboard(text, androidLabel);

                return(true);
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Attempting to set the clipboard failed: " + ex.Message);

                return(false);
            }
        }
コード例 #21
0
        async static Task SuggestLaunchingSettings(OnError errorAction, string error)
        {
            if (errorAction == OnError.Ignore || errorAction == OnError.Throw)
            {
                await errorAction.Apply(error);
            }
            else
            {
                var launchSettings = await Alert.Confirm(error + " Do you want to go to your device settings to enable it?");

                if (launchSettings)
                {
                    await OS.OpenSettings();
                }
            }
        }
コード例 #22
0
        /// <summary>
        /// Will launch the external directions application and return whether it was successful.
        /// </summary>
        public static async Task <bool> LaunchDirections(NavigationAddress destination, OnError errorAction = OnError.Toast)
        {
            try
            {
                await AskForPermission();

                await DoLaunchDirections(destination);

                return(true);
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Launching navigation directions failed");

                return(false);
            }
        }
コード例 #23
0
ファイル: Sharing.cs プロジェクト: Geeksltd/Zebble.Sharing
        public static async Task <bool> Share(string text, string title        = null, string url = null, string androidChooserTitle = null,
                                              DeviceSharingOption[] iosExclude = null, OnError errorAction = OnError.Alert)
        {
            try
            {
                await Thread.UI.Run <Task>(() => DoShare(new ShareMessage {
                    Title = title, Text = text, Url = url
                }, androidChooserTitle, iosExclude));

                return(true);
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Attempting to share failed: " + ex.Message);

                return(false);
            }
        }
コード例 #24
0
ファイル: Speech.cs プロジェクト: Geeksltd/Zebble.Speech
        /// <summary>
        /// Speaks a specified text using the device's operating system.
        /// </summary>
        public static async Task Speak(string text, Settings settings = null, OnError errorAction = OnError.Toast)
        {
            if (text.IsEmpty()) return;
            settings ??= new Settings();
            settings.Volume = settings.Volume.LimitWithin(0, 1);

            SpeechInProgress?.TrySetResult(false);

            SpeechInProgress = new TaskCompletionSource<bool>();

            try
            {
                await DoSpeak(text, settings);
                await SpeechInProgress.Task;
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Failed to run Text to Speech.");
            }
        }
コード例 #25
0
        /// <summary>
        /// Saves a specified image file to the device's camera roll.
        /// </summary>
        public static async Task <bool> SaveToAlbum(FileInfo file, OnError errorAction = OnError.Alert)
        {
            try
            {
                if (!await Permission.Albums.IsRequestGranted())
                {
                    throw new Exception("Permission to access the device albums (gallery) was denied.");
                }

                await Thread.UI.Run(() => DoSaveToAlbum(file)).ConfigureAwait(false);

                return(true);
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Failed to save a file to album: " + ex.Message);

                return(false);
            }
        }
コード例 #26
0
ファイル: Audio.cs プロジェクト: Geeksltd/Zebble.Audio
        public static Task StartRecording(OnError errorAction = OnError.Toast)
        {
            try
            {
                if (Recording?.Exists() == true)
                {
                    lock (Recording.GetSyncLock())
                        Recording.Delete();
                }

                var newFile = $"Myfile{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}.wav";
                Recording = IO.CreateTempDirectory().GetFile(newFile);
                lock (Recording.GetSyncLock())
                    Recording.Delete();

                CreateRecorder();
                Recorder.Start();
                return(Task.CompletedTask);
            }
            catch (Exception ex) { return(errorAction.Apply(ex)); }
        }
コード例 #27
0
        public static async Task Run(TimeSpan duration, OnError errorAction = OnError.Toast)
        {
            try
            {
                if (!await Device.Permission.Vibration.IsRequestGranted())
                {
                    throw new Exception("Permission to vibrate was denied.");
                }

                if (!IsAvailable())
                {
                    throw new Exception("Vibration is not available on this device.");
                }

                await DoRun((int)duration.TotalMilliseconds);
            }
            catch (Exception ex)
            {
                await errorAction.Apply(ex, "Vibration request failed.");
            }
        }
コード例 #28
0
            public static async Task <bool> Start(Action <string, bool> listener, OnError errorAction = OnError.Alert)
            {
                try { await Stop(); } catch { /* No logging is needed. */ }

                try
                {
                    if (!await Permission.Speech.IsRequestGranted())
                    {
                        throw new Exception("Request was denied to access Speech Recognition.");
                    }

                    await Thread.UI.Run(DoStart);

                    Listeners += listener;
                    return(true);
                }
                catch (Exception ex)
                {
                    await errorAction.Apply(ex);

                    return(false);
                }
            }
コード例 #29
0
        public static async Task StartRecording(OnError errorAction = OnError.Toast)
        {
            try
            {
                await StopRecording();

                if (Recording?.Exists() == true)
                {
                    lock (Recording.GetSyncLock())
                        Recording.Delete();
                }

                var newFile = $"Myfile{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}.wav";
                Recording = Device.IO.CreateTempDirectory().GetFile(newFile);
                lock (Recording.GetSyncLock())
                    Recording.Delete();

                CreateRecorder();

                Recorder.Record();
            }
            catch (Exception ex) { await errorAction.Apply(ex); }
        }
コード例 #30
0
ファイル: Audio.cs プロジェクト: Geeksltd/Zebble.Audio
 public static async Task StartRecording(OnError errorAction = OnError.Toast)
 {
     try { await Thread.Pool.Run(() => DoStartRecording()); }
     catch (Exception ex) { await errorAction.Apply(ex); }
 }