public override void ViewDidLoad()
        {
            PullToRefresh = false;

            base.ViewDidLoad();

            TableSource = new SharingTableViewSource();
            ((SharingTableViewSource)TableSource).ShowsAccessory = Shared.SelectedCard.IsMine();
            TableSource.ItemSelected += (arg1, arg2) =>
            {
                if (Shared.SelectedCard.IsMine())
                {
                    var footer = ChildViewControllers.Where(c => c.GetType() == typeof(CardSharingStatusViewController)).FirstOrDefault() as CardSharingStatusViewController;
                    if (footer == null)
                    {
                        return;
                    }
                    if (footer.Sharing)
                    {
                        return;
                    }

                    Shared.OutletSelected(arg2);
                    TableView.ReloadRows(new NSIndexPath[] { arg1 }, UITableViewRowAnimation.Automatic);

                    HeaderView.Update(false);

                    footer.Update();
                    return;
                }

                ApplicationExtensions.OpenApplicationFromOutlet(arg2);
            };
            TableView.Source = TableSource;

            HeaderView = new CardViewController();
            HeaderView.SelectedCard   = Shared.SelectedCard;
            HeaderView.View.Frame     = new CGRect(0, 0, TableView.Frame.Width, CardViewController.GetCalculatedHeight());
            TableView.TableHeaderView = HeaderView.View;
            AddChildViewController(HeaderView);
            HeaderView.DidMoveToParentViewController(this);

            if (Shared.SelectedCard.IsMine())
            {
                CardSharingStatusViewController footerView = new CardSharingStatusViewController();
                footerView.SelectedCard   = Shared.SelectedCard;
                footerView.View.Frame     = new CGRect(0, 0, TableView.Frame.Width, footerView.GetHeight());
                TableView.TableFooterView = footerView.View;
                AddChildViewController(footerView);
            }
        }
        void StartPartThree(Action completed)
        {
            if (Cancelled)
            {
                return;
            }

            var share_with_people_nearby = GetDefaultLabel(Strings.Onboarding.share_with_people_nearby);

            share_with_people_nearby.Frame = new CGRect(100, 50, 200, 75);
            share_with_people_nearby.Alpha = 1;
            View.AddSubview(share_with_people_nearby);

            var whitePhone = new UIImageView(UIImage.FromBundle("PhoneWhiteLarge"));

            whitePhone.ContentMode = UIViewContentMode.ScaleToFill;
            whitePhone.Frame       = new CGRect(View.Frame.GetMaxX() - 120, View.Frame.GetMidY() - 100, 100, 210);
            whitePhone.Alpha       = 0;
            View.AddSubview(whitePhone);

            var fakeCardView = CardImageView;

            fakeCardView.Alpha = 1;
            View.AddSubview(fakeCardView);

            var arrowImageView = new UIImageView(UIImage.FromBundle("ArrowWhite"));

            arrowImageView.Alpha = 1;
            View.AddSubview(arrowImageView);

            var pressAndHold = GetDefaultLabel(Strings.Onboarding.tap_to_share);

            pressAndHold.Alpha = 1;
            View.AddSubview(pressAndHold);

            CardSharingStatusViewController vc = new CardSharingStatusViewController();

            vc.DisplayPurposeOnly = true;
            vc.View.Frame         = new CGRect(50, View.Frame.GetMaxY() - 180, 100, 150);
            vc.View.Alpha         = 1;
            AddChildViewController(vc);
            View.AddSubview(vc.View);
            vc.FirstTapInitiatedAction += () =>
            {
                if (Cancelled)
                {
                    return;
                }

                UIView.Animate(animationDuration / 2, () =>
                {
                    whitePhone.Alpha     = 1;
                    arrowImageView.Alpha = 0;
                    pressAndHold.Alpha   = 0;
                }, async() =>
                {
                    if (Cancelled)
                    {
                        return;
                    }

                    MoveCardBetweenPhones(fakeCardView, animationDuration, new CGPoint(whitePhone.Frame.GetMidX(), whitePhone.Frame.GetMidY()));
                    await Task.Delay(TimeSpan.FromSeconds(animationDuration));

                    if (IsSufficentPermissionGranted())
                    {
                        StartPartFourHelper();
                    }
                    else if (ArePermissionUnknown()) //show permission alert, first time visitor
                    {
                        LocationPermissionAlertShown = true;
                        vc.StartLocationManager(); //see DidBecomeActive for callback
                    }
                    else //returning user, alert already shown some time ago
                    {
                        StartPartFourHelper();
                    }
                });
            };

            arrowImageView.Frame = new CGRect(vc.View.Frame.GetMaxX() - 20, vc.View.Frame.GetMidY() + 20, 100, 28);
            pressAndHold.Frame   = new CGRect(arrowImageView.Frame.GetMidX() - 50, arrowImageView.Frame.GetMaxY(), 100, 25);
            fakeCardView.Frame   = new CGRect(vc.View.Center.X - 7, vc.View.Center.Y + 40, 14, 8);
            ShakeViewLeftAndRight(arrowImageView);
        }