public Task <Phone> SelectPhone() { var tcs = new TaskCompletionSource <Phone>(); Task.Run(async() => { var hasPermission = await PermissionsService.CheckPermission(Permission.Contacts, true, _permissionMessage); if (!hasPermission) { tcs.TrySetCanceled(); return; } var picker = new CNContactPickerViewController { DisplayedPropertyKeys = new NSString[] { CNContactKey.PhoneNumbers }, PredicateForEnablingContact = NSPredicate.FromFormat("phoneNumbers.@count > 0"), PredicateForSelectionOfContact = NSPredicate.FromFormat("phoneNumbers.@count == 1") }; var pickerDelegate = new ContactPickerDelegate(); picker.Delegate = pickerDelegate; pickerDelegate.SelectionCanceled = () => tcs.TrySetCanceled(); pickerDelegate.ContactPropertySelected = (prop) => { var phone = (prop?.Value as CNPhoneNumber)?.StringValue; tcs.TrySetResult((prop == null) ? null : new Phone { FullValue = phone }); }; pickerDelegate.ContactSelected = (contact) => { var phone = contact.PhoneNumbers?.FirstOrDefault()?.Value?.StringValue; tcs.TrySetResult((phone == null) ? null : new Phone { FullValue = phone }); }; Mvx.Resolve <IMvxMainThreadDispatcher>().RequestMainThreadAction(() => { GetPresentedViewController().PresentViewController(picker, true, null); }); }); return(tcs.Task); }
public Task <Contact> SelectContact() { var tcs = new TaskCompletionSource <Contact>(); Task.Run(async() => { var hasPermission = await PermissionsService.CheckPermission(Permission.Contacts, true, _permissionMessage); if (!hasPermission) { tcs.TrySetCanceled(); return; } var picker = new CNContactPickerViewController(); var pickerDelegate = new ContactPickerDelegate(); picker.Delegate = pickerDelegate; pickerDelegate.SelectionCanceled = () => tcs.TrySetCanceled(); pickerDelegate.ContactPropertySelected = (prop) => pickerDelegate.ContactSelected?.Invoke(prop.Contact); pickerDelegate.ContactSelected = (contact) => { tcs.TrySetResult(new Contact { FirstName = contact.GivenName, LastName = contact.FamilyName, MiddleName = contact.MiddleName, Phones = contact.PhoneNumbers?.Select(x => new Phone { FullValue = x.Value.StringValue }).ToList(), Emails = contact.EmailAddresses?.Select(x => new Email { FullValue = x.Value }).ToList() }); }; Mvx.Resolve <IMvxMainThreadDispatcher>().RequestMainThreadAction(() => { GetPresentedViewController().PresentViewController(picker, true, null); }); }); return(tcs.Task); }