/// <summary>
        ///
        /// </summary>
        /// <param name="self"></param>
        /// <param name="rootPath"></param>
        /// <returns></returns>
        public static string GetFilePath(this StoreMediaOptions self, string rootPath)
        {
            bool isPhoto = !(self is StoreVideoOptions);

            string name = (self != null) ? self.Name : null;

            if (String.IsNullOrWhiteSpace(name))
            {
                string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
                if (isPhoto)
                {
                    name = "IMG_" + timestamp + ".jpg";
                }
                else
                {
                    name = "VID_" + timestamp + ".mp4";
                }
            }

            string ext = Path.GetExtension(name);

            if (ext == String.Empty)
            {
                ext = ((isPhoto) ? ".jpg" : ".mp4");
            }

            name = Path.GetFileNameWithoutExtension(name);

            string folder = Path.Combine(rootPath ?? String.Empty,
                                         (self != null && self.Directory != null) ? self.Directory : String.Empty);

            return(Path.Combine(folder, name + ext));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="self"></param>
        /// <param name="rootPath"></param>
        /// <param name="checkExists"></param>
        /// <returns></returns>
        public static string GetUniqueFilepath(this StoreMediaOptions self, string rootPath, Func <string, bool> checkExists)
        {
            string path   = self.GetFilePath(rootPath);
            string folder = Path.GetDirectoryName(path);
            string ext    = Path.GetExtension(path);
            string name   = Path.GetFileNameWithoutExtension(path);

            string nname = name + ext;
            int    i     = 1;

            while (checkExists(Path.Combine(folder, nname)))
            {
                nname = name + "_" + (i++) + ext;
            }

            return(Path.Combine(folder, nname));
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="self"></param>
 public static void VerifyOptions(this StoreMediaOptions self)
 {
     if (self == null)
     {
         throw new ArgumentNullException("options");
     }
     //if (!Enum.IsDefined (typeof(MediaFileStoreLocation), options.Location))
     //    throw new ArgumentException ("options.Location is not a member of MediaFileStoreLocation");
     //if (options.Location == MediaFileStoreLocation.Local)
     //{
     //if (String.IsNullOrWhiteSpace (options.Directory))
     //	throw new ArgumentNullException ("options", "For local storage, options.Directory must be set");
     if (Path.IsPathRooted(self.Directory))
     {
         throw new ArgumentException("options.Directory must be a relative path", "options");
     }
     //}
 }
 private void VerifyOptions(StoreMediaOptions options)
 {
   if (options == null)
     throw new ArgumentNullException("options");
   if (options.Directory != null && Path.IsPathRooted(options.Directory))
     throw new ArgumentException("options.Directory must be a relative path", "options");
 }
    private Task<Media.Plugin.Abstractions.MediaFile> TakeMediaAsync(string type, string action, StoreMediaOptions options)
		{
			int id = GetRequestId();

      var ntcs = new TaskCompletionSource<Media.Plugin.Abstractions.MediaFile>(id);
			if (Interlocked.CompareExchange (ref this.completionSource, ntcs, null) != null)
				throw new InvalidOperationException ("Only one operation can be active at a time");

			this.context.StartActivity (CreateMediaIntent (id, type, action, options));

			EventHandler<MediaPickedEventArgs> handler = null;
			handler = (s, e) =>
			{
        var tcs = Interlocked.Exchange(ref this.completionSource, null);

				MediaPickerActivity.MediaPicked -= handler;

				if (e.RequestId != id)
					return;

        if (e.Error != null)
          tcs.SetResult(null);
        else if (e.IsCanceled)
          tcs.SetResult(null);
        else
          tcs.SetResult(e.Media);
			};

			MediaPickerActivity.MediaPicked += handler;

			return ntcs.Task;
		}
		private Intent CreateMediaIntent (int id, string type, string action, StoreMediaOptions options, bool tasked = true)
		{
			Intent pickerIntent = new Intent (this.context, typeof (MediaPickerActivity));
			pickerIntent.PutExtra (MediaPickerActivity.ExtraId, id);
			pickerIntent.PutExtra (MediaPickerActivity.ExtraType, type);
			pickerIntent.PutExtra (MediaPickerActivity.ExtraAction, action);
			pickerIntent.PutExtra (MediaPickerActivity.ExtraTasked, tasked);

			if (options != null) {
				pickerIntent.PutExtra (MediaPickerActivity.ExtraPath, options.Directory);
				pickerIntent.PutExtra (MediaStore.Images.ImageColumns.Title, options.Name);

				var vidOptions = (options as StoreVideoOptions);
				if (vidOptions != null) {
					pickerIntent.PutExtra (MediaStore.ExtraDurationLimit, (int)vidOptions.DesiredLength.TotalSeconds);
					pickerIntent.PutExtra (MediaStore.ExtraVideoQuality, (int)vidOptions.Quality);
				}
			}
      //pickerIntent.SetFlags(ActivityFlags.ClearTop);
      pickerIntent.SetFlags(ActivityFlags.NewTask);
			return pickerIntent;
		}