/// <summary> /// Performs vibration animation /// </summary> /// <returns>Returns an instance of <see cref="OperationResult"/> that represents the outcome of the animation /// and stores a <c>finalValue</c> representing the completed state of the animation.</returns> public override Task <OperationResult <double> > PerformAnimation() { AnimationTaskCompletionSource = new TaskCompletionSource <OperationResult <double> >(); _repeatCount = 0; Animation.Commit(Control, AnimationId, length: (uint)GetVibrateDuration(), finished: (finalValue, wasCancelled) => { if (_repeatCount == RepeatCount) { Control.TranslationX = 0; AnimationTaskCompletionSource.SetResult(OperationResult <double> .AsSuccess(finalValue)); } else { Control.TranslationX = -GetVibrateXChange(); } if (wasCancelled) { Control.TranslationX = 0; AnimationTaskCompletionSource.SetResult(OperationResult <double> .AsCancel()); } }, repeat: () => ++ _repeatCount < RepeatCount); return(AnimationTaskCompletionSource.Task); }
public Task <OperationResult <string> > PresentVideoEditor(string videoPath, double maxDuration) { var tcs = new TaskCompletionSource <OperationResult <string> >(); var videoEditor = new UIVideoEditorController(); videoEditor.VideoPath = videoPath; videoEditor.VideoMaximumDuration = maxDuration; videoEditor.VideoQuality = UIImagePickerControllerQualityType.High; videoEditor.Failed += (object sender, NSErrorEventArgs e) => { videoEditor.DismissModalViewController(true); tcs.SetResult(OperationResult <string> .AsFailure(e.Error.LocalizedDescription)); }; videoEditor.UserCancelled += (object sender, EventArgs e) => { videoEditor.DismissModalViewController(true); tcs.SetResult(OperationResult <string> .AsCancel()); }; videoEditor.Saved += (object sender, UIPathEventArgs e) => { tcs.SetResult(OperationResult <string> .AsSuccess(e.Path)); videoEditor.DismissModalViewController(true); }; NavigationHelper.GetActiveViewController().PresentViewController(videoEditor, true, null); return(tcs.Task); }
private Task <OperationResult> GetMediaItem(string destinationPath, MediaItemType mediaItemType, UIImagePickerControllerSourceType sourceType) { var tcs = new TaskCompletionSource <OperationResult>(); var picker = new ExtendedUIImagePickerController(); picker.PreferredOrientation = UIApplication.SharedApplication.StatusBarOrientation; if (mediaItemType == MediaItemType.Video) { picker.VideoQuality = UIImagePickerControllerQualityType.At1280x720; } picker.SourceType = sourceType; var typeString = mediaItemType == MediaItemType.Video ? "public.movie" : "public.image"; picker.MediaTypes = new string[] { typeString }; picker.Canceled += (object sender, EventArgs e) => { tcs.SetResult(OperationResult.AsCancel()); picker.DismissViewController(true, null); }; picker.FinishedPickingMedia += (object sender, UIImagePickerMediaPickedEventArgs e) => { picker.DismissViewController(true, () => { NSUrl mediaURl = null; if (e.MediaUrl != null) { mediaURl = e.MediaUrl; File.Copy(mediaURl.Path, destinationPath, true); tcs.SetResult(OperationResult.AsSuccess()); } else { var originalImage = e.OriginalImage; var imageData = originalImage.AsJPEG(); NSError err = null; if (imageData.Save(destinationPath, false, out err)) { tcs.SetResult(OperationResult.AsSuccess()); } else { tcs.SetResult(OperationResult.AsFailure(err.LocalizedDescription)); } } }); }; NavigationHelper.GetActiveViewController().PresentViewController(picker, true, null); return(tcs.Task); }
public async Task <OperationResult <FacebookSession> > Login(List <string> fields, List <string> permissions = null) { var taskCompletionSource = new TaskCompletionSource <OperationResult <FacebookSession> >(); try { var session = this.GetSession(); if (session == null) { if (permissions == null) { permissions = _readPermissions; } try { var result = await _manager.Value.LogInWithReadPermissionsAsync(permissions.ToArray(), null); if (result.IsCancelled) { taskCompletionSource.SetResult(OperationResult <FacebookSession> .AsCancel()); } else if (result.Token != null) { session = GetSessionToken(result.Token); } else { taskCompletionSource.SetResult(OperationResult <FacebookSession> .AsFailure("Token is not available")); } } catch (Exception ex) { taskCompletionSource.SetResult(OperationResult <FacebookSession> .AsFailure(ex)); } } if (session != null) { GetUserInfo(fields, session, taskCompletionSource); } } catch (AggregateException ex) { taskCompletionSource.SetResult(OperationResult <FacebookSession> .AsFailure(ex)); } return(await taskCompletionSource.Task); }
public void AsCancel_ShouldSetFieldsCorrectly() { var result = OperationResult.AsCancel(); Assert.False(result.IsSuccessful); Assert.True(result.IsCancelled); Assert.Null(result.Exception); Assert.Null(result.Message); var genericResult = OperationResult <Dummy> .AsCancel(); Assert.False(genericResult.IsSuccessful); Assert.True(genericResult.IsCancelled); Assert.Null(genericResult.Exception); Assert.Null(genericResult.Message); Assert.Null(genericResult.Result); }
private void OnAnimationCompleted(double finalValue, bool wasCancelled) { if (wasCancelled) { _numberOfBouncesPerformed = 0; Control.TranslationY = 0; AnimationTaskCompletionSource.SetResult(OperationResult <double> .AsCancel()); } else if (_numberOfBouncesPerformed == NumberOfBounces) { _numberOfBouncesPerformed = 0; AnimationTaskCompletionSource.SetResult(OperationResult <double> .AsSuccess(finalValue)); } else { CreateAndStartBounceAnimation(); } }
/// <summary> /// Performs fade animation. /// </summary> /// <returns>Returns an instance of <see cref="OperationResult"/> that represents the outcome of the animation /// and stores a <c>finalValue</c> representing the completed state of the animation.</returns> public override Task <OperationResult <double> > PerformAnimation() { AnimationTaskCompletionSource = new TaskCompletionSource <OperationResult <double> >(); Animation.Commit(Control, AnimationId, length: (uint)Duration, finished: (finalValue, wasCancelled) => { if (ShouldReset) { Control.Opacity = ResetValue; } if (wasCancelled) { AnimationTaskCompletionSource.SetResult(OperationResult <double> .AsCancel()); } else { AnimationTaskCompletionSource.SetResult(OperationResult <double> .AsSuccess(finalValue)); } }, repeat: () => ShouldRepeat); return(AnimationTaskCompletionSource.Task); }
public async Task <OperationResult> TrimVideo(string sourcePath, string destinationPath, double startTime, double endTime) { if (string.IsNullOrEmpty(sourcePath) || !File.Exists(sourcePath)) { return(OperationResult.AsFailure("Invalid video file path specified")); } var url = NSUrl.CreateFileUrl(sourcePath, false, null); var asset = AVAsset.FromUrl(url); var session = new AVAssetExportSession(asset, AVAssetExportSession.PresetPassthrough); session.OutputUrl = NSUrl.FromFilename(destinationPath); session.OutputFileType = AVFileType.Mpeg4; var cmStartTime = CMTime.FromSeconds(startTime, asset.Duration.TimeScale); var duration = CMTime.FromSeconds(endTime - startTime, asset.Duration.TimeScale); var range = new CMTimeRange(); range.Start = cmStartTime; range.Duration = duration; session.TimeRange = range; await session.ExportTaskAsync(); if (session.Status == AVAssetExportSessionStatus.Cancelled) { return(OperationResult.AsCancel()); } else if (session.Status == AVAssetExportSessionStatus.Failed) { return(OperationResult.AsFailure(session.Error.LocalizedDescription)); } else { return(OperationResult.AsSuccess()); } }