void SetActivityViewControllerCompletionHandler(UserInfo info)
		{
			activityViewController.SetCompletionHandler ((activityType, completed, returnedItems, error) => {
				CleanupActivity();
				RestoreActivityForImageIdentifier(info);
			});
		}
		public void RestoreActivityForImageIdentifier (UserInfo userInfo)
		{
			if (userInfo == null)
				throw new ArgumentNullException ("userInfo");

			if (activityViewController != null) {
				SetActivityViewControllerCompletionHandler (userInfo);
				return;
			}

			ImageIdentifier = userInfo.ImageId;

			image = null;   // clear the old image
			UpdateImage (false, true);  // apply the new image (based on ImageIdentifier) and apply the 2 filter values

			// setup our filters (if not already allocated) and assign their values
			float blurFilterValue = userInfo.BlurRadius;
			var blurFilter = (BlurFilter)CreateImageFilter (BlurFilter.Key);
			blurFilter.BlurRadius = blurFilterValue;

			// the blur has changed from the activity on the other device
			blurFilter.Dirty = blurFilterValue > 0 ? true : blurFilter.Dirty;

			var sepiaFilterValue = userInfo.Intensity;
			var sepiaFilter = (ModifyFilter)CreateImageFilter (ModifyFilter.Key);
			sepiaFilter.Intensity = sepiaFilterValue;
			// the sepia has changed from the activity on the other device
			sepiaFilter.Dirty = sepiaFilterValue > 0 ? true : sepiaFilter.Dirty;

			// providing a different image requires us to adjust our view constraints and zoom
			UpdateConstraints ();
			UpdateZoom ();

			// a different image means updating our current user activity
			UpdateActivity ();

			// dismiss either filter view controller if necessary
			if (currentFilterViewController != null)
				currentFilterViewController.DismissViewController (false, null);
			else if (activityViewController != null)
				activityViewController.DismissViewController (false, null);
		}
		UserInfo GetFilterValues()
		{
			var info = new UserInfo ();

			// obtain the filter values and save them
			ImageFilter filter;
			if(filters.TryGetValue (BlurFilter.Key, out filter))
				info.BlurRadius = ((BlurFilter)filter).BlurRadius;

			if (filters.TryGetValue (ModifyFilter.Key, out filter))
				info.Intensity = ((ModifyFilter)filter).Intensity;

			return info;
		}
        public bool HandleUserActivity(NSUserActivity userActivity)
        {
            var userInfo = new UserInfo (userActivity.UserInfo);
            bool rc = HandleActivityUserInfo (userInfo);
            ClearActivityContinuationInProgress ();

            return rc;
        }
        bool HandleActivityUserInfo(UserInfo userInfo)
        {
            string imageIdentifier = userInfo.ImageId;
            if (string.IsNullOrEmpty (imageIdentifier)) {
                HandleActivityFailure ();
                return false;
            }

            int row = int.Parse (imageIdentifier);
            NSIndexPath indexPath = NSIndexPath.FromRowSection (row, 0);

            CollectionView.SelectItem (indexPath, false, UICollectionViewScrollPosition.None);
            CollectionView.ScrollToItem (indexPath, UICollectionViewScrollPosition.None, false);
            if (detailViewController == null)
                InstantiateAndPushDetailViewController (true);

            DispatchQueue.MainQueue.DispatchAsync (() => {
                detailViewController.RestoreActivityForImageIdentifier (userInfo);
                SaveActivity ();
            });

            return true;
        }
        public override void UpdateUserActivityState(NSUserActivity activity)
        {
            base.UpdateUserActivityState (activity);

            string imageIdentifier = detailViewController.ImageIdentifier;
            if (string.IsNullOrEmpty (imageIdentifier))
                return;

            activity.Title = DataSource.GetTitleForIdentifier (imageIdentifier);

            var userInfo = new UserInfo {
                ImageId = imageIdentifier
            };
            activity.AddUserInfoEntries (userInfo.Dictionary);
        }