Add contact share approval view.

This commit is contained in:
Matthew Chen 2018-05-03 10:47:42 -04:00
parent 4fcbfe0e12
commit 0c745dd989
10 changed files with 1387 additions and 10 deletions

View File

@ -48,6 +48,7 @@
34330A5C1E787A9800DF2FB9 /* dripicons-v2.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A5B1E787A9800DF2FB9 /* dripicons-v2.ttf */; };
34330A5E1E787BD800DF2FB9 /* ElegantIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A5D1E787BD800DF2FB9 /* ElegantIcons.ttf */; };
34330AA31E79686200DF2FB9 /* OWSProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34330AA21E79686200DF2FB9 /* OWSProgressView.m */; };
34382266209A4E400094FEB7 /* ApproveContactShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34382265209A4E3F0094FEB7 /* ApproveContactShareViewController.swift */; };
34386A51207D0C01009F5D9C /* HomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34386A4D207D0C01009F5D9C /* HomeViewController.m */; };
34386A52207D0C01009F5D9C /* HomeViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34386A50207D0C01009F5D9C /* HomeViewCell.m */; };
34386A54207D271D009F5D9C /* NeverClearView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34386A53207D271C009F5D9C /* NeverClearView.swift */; };
@ -630,6 +631,7 @@
34330A5D1E787BD800DF2FB9 /* ElegantIcons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = ElegantIcons.ttf; sourceTree = "<group>"; };
34330AA11E79686200DF2FB9 /* OWSProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSProgressView.h; sourceTree = "<group>"; };
34330AA21E79686200DF2FB9 /* OWSProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSProgressView.m; sourceTree = "<group>"; };
34382265209A4E3F0094FEB7 /* ApproveContactShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ApproveContactShareViewController.swift; path = SignalMessaging/attachments/ApproveContactShareViewController.swift; sourceTree = SOURCE_ROOT; };
34386A4D207D0C01009F5D9C /* HomeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeViewController.m; sourceTree = "<group>"; };
34386A4E207D0C01009F5D9C /* HomeViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeViewCell.h; sourceTree = "<group>"; };
34386A4F207D0C01009F5D9C /* HomeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeViewController.h; sourceTree = "<group>"; };
@ -1551,12 +1553,12 @@
346129A11FD1F09100532771 /* contacts */ = {
isa = PBXGroup;
children = (
3400C7941EAF99F4008A8584 /* SelectThreadViewController.h */,
3400C7951EAF99F4008A8584 /* SelectThreadViewController.m */,
346129A21FD1F09100532771 /* OWSContactsManager.h */,
346129A31FD1F09100532771 /* OWSContactsManager.m */,
34612A041FD7238500532771 /* OWSContactsSyncing.h */,
34612A051FD7238500532771 /* OWSContactsSyncing.m */,
3400C7941EAF99F4008A8584 /* SelectThreadViewController.h */,
3400C7951EAF99F4008A8584 /* SelectThreadViewController.m */,
346129AE1FD1F5D900532771 /* SystemContactsFetcher.swift */,
);
path = contacts;
@ -1596,6 +1598,7 @@
346129DB1FD5C02900532771 /* viewControllers */ = {
isa = PBXGroup;
children = (
34382265209A4E3F0094FEB7 /* ApproveContactShareViewController.swift */,
344F2498200FD03200CFB4F4 /* AttachmentApprovalViewController.swift */,
344F248220069E9B00CFB4F4 /* CountryCodeViewController.h */,
344F248320069E9B00CFB4F4 /* CountryCodeViewController.m */,
@ -3093,6 +3096,7 @@
451F8A3F1FD71455005CB9DA /* OWSTableViewController.m in Sources */,
451F8A351FD710DE005CB9DA /* Searcher.swift in Sources */,
451F8A481FD715BA005CB9DA /* OWSContactAvatarBuilder.m in Sources */,
34382266209A4E400094FEB7 /* ApproveContactShareViewController.swift in Sources */,
4503F1C3204711D300CEE724 /* OWS107LegacySounds.m in Sources */,
346129A61FD1F09100532771 /* OWSContactsManager.m in Sources */,
4598198F204E2F28009414F2 /* OWS108CallLoggingPreference.m in Sources */,

View File

@ -60,7 +60,8 @@ public class ContactsPicker: OWSViewController, UITableViewDelegate, UITableView
CNContactFormatter.descriptorForRequiredKeys(for: .fullName),
CNContactThumbnailImageDataKey as CNKeyDescriptor,
CNContactPhoneNumbersKey as CNKeyDescriptor,
CNContactEmailAddressesKey as CNKeyDescriptor
CNContactEmailAddressesKey as CNKeyDescriptor,
CNContactPostalAddressesKey as CNKeyDescriptor
]
// MARK: - Lifecycle Methods

View File

@ -117,6 +117,7 @@ typedef enum : NSUInteger {
#pragma mark -
@interface ConversationViewController () <AttachmentApprovalViewControllerDelegate,
ApproveContactShareViewControllerDelegate,
AVAudioPlayerDelegate,
CNContactViewControllerDelegate,
ContactEditingDelegate,
@ -337,8 +338,26 @@ typedef enum : NSUInteger {
OWSAssertIsOnMainThread();
[self ensureDynamicInteractions];
// [self tryToShowContactShareUI];
}
//- (void)tryToShowContactShareUI
//{
// OWSAssertIsOnMainThread();
//
// Contact *_Nullable firstContact = self.contactsManager.allContacts.firstObject;
// DDLogInfo(@"%@ firstContact: %@ %d", self.logTag, firstContact, firstContact.cnContact != nil);
// [DDLog flushLog];
// if (!firstContact.cnContact) {
// return;
// }
// static dispatch_once_t onceToken;
// dispatch_once(&onceToken, ^{
// [self contactsPicker:nil didSelectContact:firstContact];
// });
//}
- (void)otherUsersProfileDidChange:(NSNotification *)notification
{
OWSAssertIsOnMainThread();
@ -489,6 +508,11 @@ typedef enum : NSUInteger {
[self addNotificationListeners];
[self loadDraftInCompose];
dispatch_async(dispatch_get_main_queue(), ^{
[self showPhonyContactShareApproval];
// [self tryToShowContactShareUI];
});
}
- (void)loadView
@ -2522,6 +2546,7 @@ typedef enum : NSUInteger {
}
#pragma mark - Attachment Picking: Contacts
- (void)chooseContactForSending
{
ContactsPicker *contactsPicker =
@ -4903,6 +4928,79 @@ interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransiti
#pragma mark - ContactsPickerDelegate
- (void)showPhonyContactShareApproval
{
ApproveContactShareViewController *approveContactShare =
[[ApproveContactShareViewController alloc] initWithContactShare:self.makePhonyContact
contactsManager:self.contactsManager
delegate:self];
// contactsPicker.title
// = NSLocalizedString(@"CONTACT_PICKER_TITLE", @"navbar title for contact picker when sharing a contact");
UINavigationController *navigationController =
[[UINavigationController alloc] initWithRootViewController:approveContactShare];
[self dismissKeyBoard];
[self presentViewController:navigationController animated:YES completion:nil];
// [self contactsPicker:nil didSelectContact:self.makePhonyContact];
}
- (OWSContact *)makePhonyContact
{
OWSContact *contact = [OWSContact new];
contact.givenName = @"Alice";
contact.familyName = @"Carol";
contact.middleName = @"Bob";
contact.namePrefix = @"Ms.";
contact.nameSuffix = @"Esq.";
contact.organizationName = @"Falafel Hut";
OWSContactPhoneNumber *phoneNumber1 = [OWSContactPhoneNumber new];
phoneNumber1.phoneType = OWSContactPhoneType_Home;
phoneNumber1.phoneNumber = @"+13213214321";
OWSContactPhoneNumber *phoneNumber2 = [OWSContactPhoneNumber new];
phoneNumber2.phoneType = OWSContactPhoneType_Custom;
phoneNumber2.label = @"Carphone";
phoneNumber2.phoneNumber = @"+13332221111";
contact.phoneNumbers = @[
phoneNumber1,
phoneNumber2,
];
NSMutableArray<OWSContactEmail *> *emails = [NSMutableArray new];
for (NSUInteger i = 0; i < 16; i++) {
OWSContactEmail *email = [OWSContactEmail new];
email.emailType = OWSContactEmailType_Home;
email.email = [NSString stringWithFormat:@"a%zd@b.com", i];
[emails addObject:email];
}
contact.emails = emails;
OWSContactAddress *address1 = [OWSContactAddress new];
address1.addressType = OWSContactAddressType_Home;
address1.street = @"123 home st.";
address1.neighborhood = @"round the bend.";
address1.city = @"homeville";
address1.region = @"HO";
address1.postcode = @"12345";
address1.country = @"USA";
OWSContactAddress *address2 = [OWSContactAddress new];
address2.addressType = OWSContactAddressType_Custom;
address2.label = @"Otra casa";
address2.pobox = @"caja 123";
address2.street = @"123 casa calle";
address2.city = @"barrio norte";
address2.region = @"AB";
address2.postcode = @"53421";
address2.country = @"MX";
contact.addresses = @[
address1,
address2,
];
// TODO: Avatar
return contact;
}
- (void)contactsPickerDidCancel:(ContactsPicker *)contactsPicker
{
DDLogDebug(@"%@ in %s", self.logTag, __PRETTY_FUNCTION__);
@ -4915,10 +5013,32 @@ interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransiti
- (void)contactsPicker:(ContactsPicker *)contactsPicker didSelectContact:(Contact *)contact
{
OWSAssert(contact);
OWSAssert(contact.cnContact);
DDLogDebug(@"%@ in %s with contact: %@", self.logTag, __PRETTY_FUNCTION__, contact);
OWSContact *_Nullable contactShare = [OWSContacts contactForSystemContact:contact.cnContact];
if (!contactShare) {
DDLogError(@"%@ Could not convert system contact.", self.logTag);
return;
}
// TODO actually build contact message.
self.inputToolbar.messageText = contact.fullName;
// self.inputToolbar.messageText = contact.fullName;
// TODO: We should probably show this in the same navigation view controller.
ApproveContactShareViewController *approveContactShare =
[[ApproveContactShareViewController alloc] initWithContactShare:contactShare
contactsManager:self.contactsManager
delegate:self];
// contactsPicker.title
// = NSLocalizedString(@"CONTACT_PICKER_TITLE", @"navbar title for contact picker when sharing a contact");
UINavigationController *navigationController =
[[UINavigationController alloc] initWithRootViewController:approveContactShare];
[self dismissKeyBoard];
[self presentViewController:navigationController animated:YES completion:nil];
}
- (void)contactsPicker:(ContactsPicker *)contactsPicker didSelectMultipleContacts:(NSArray<Contact *> *)contacts
@ -4932,6 +5052,17 @@ interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransiti
return YES;
}
#pragma mark - ApproveContactShareViewControllerDelegate
- (void)approveContactShare:(ApproveContactShareViewController *)approveContactShare
didApproveContactShare:(OWSContact *)contactShare
{
DDLogInfo(@"%@ in %s", self.logTag, __PRETTY_FUNCTION__);
// TODO:
}
@end
NS_ASSUME_NONNULL_END

View File

@ -421,6 +421,27 @@
/* Label for a contact's email address. */
"CONTACT_EMAIL" = "Email";
/* Label for the 'city' field of a contact's address. */
"CONTACT_FIELD_ADDRESS_CITY" = "City";
/* Label for the 'country' field of a contact's address. */
"CONTACT_FIELD_ADDRESS_COUNTRY" = "Country";
/* Label for the 'neighborhood' field of a contact's address. */
"CONTACT_FIELD_ADDRESS_NEIGHBORHOOD" = "Neighborhood";
/* Label for the 'pobox' field of a contact's address. */
"CONTACT_FIELD_ADDRESS_POBOX" = "P.O. Box";
/* Label for the 'postcode' field of a contact's address. */
"CONTACT_FIELD_ADDRESS_POSTCODE" = "Post Code";
/* Label for the 'region' field of a contact's address. */
"CONTACT_FIELD_ADDRESS_REGION" = "Region";
/* Label for the 'street' field of a contact's address. */
"CONTACT_FIELD_ADDRESS_STREET" = "Street";
/* Label for a contact's phone number. */
"CONTACT_PHONE" = "Phone";
@ -433,6 +454,9 @@
/* navbar title for contact picker when sharing a contact */
"CONTACT_PICKER_TITLE" = "Select Contact";
/* Title for the 'Approve contact share' view. */
"CONTACT_SHARE_APPROVAL_VIEW_TITLE" = "Share Contact";
/* Indicates that a contact has no name. */
"CONTACT_WITHOUT_NAME" = "Unnamed Contact";

File diff suppressed because it is too large Load Diff

View File

@ -343,10 +343,10 @@ NSString *const OWSContactsManagerSignalAccountsDidChangeNotification
{
OWSAssertIsOnMainThread();
if ([signalAccounts isEqual:self.signalAccounts]) {
DDLogDebug(@"%@ SignalAccounts unchanged.", self.logTag);
return;
}
// if ([signalAccounts isEqual:self.signalAccounts]) {
// DDLogDebug(@"%@ SignalAccounts unchanged.", self.logTag);
// return;
// }
NSMutableDictionary<NSString *, SignalAccount *> *signalAccountMap = [NSMutableDictionary new];
for (SignalAccount *signalAccount in signalAccounts) {

View File

@ -34,6 +34,7 @@ class ContactsFrameworkContactStoreAdaptee: ContactStoreAdaptee {
CNContactThumbnailImageDataKey as CNKeyDescriptor, // TODO full image instead of thumbnail?
CNContactPhoneNumbersKey as CNKeyDescriptor,
CNContactEmailAddressesKey as CNKeyDescriptor,
CNContactPostalAddressesKey as CNKeyDescriptor,
CNContactViewController.descriptorForRequiredKeys()
]

View File

@ -134,6 +134,10 @@ static NSString *const RPDefaultsKeyPhoneNumberCanonical = @"RPDefaultsKeyPhoneN
{
OWSAssert(phoneNumber);
if (![phoneNumber hasPrefix:COUNTRY_CODE_PREFIX]) {
return phoneNumber;
}
PhoneNumber *_Nullable parsedPhoneNumber = [self tryParsePhoneNumberFromE164:phoneNumber];
if (!parsedPhoneNumber) {
DDLogWarn(@"%@ could not parse phone number.", self.logTag);
@ -356,6 +360,9 @@ static NSString *const RPDefaultsKeyPhoneNumberCanonical = @"RPDefaultsKeyPhoneN
+ (PhoneNumber *)tryParsePhoneNumberFromE164:(NSString *)text {
OWSAssert(text != nil);
if (![text hasPrefix:COUNTRY_CODE_PREFIX]) {
return nil;
}
return [self phoneNumberFromE164:text];
}

View File

@ -154,6 +154,10 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value);
+ (nullable OWSSignalServiceProtosDataMessageContact *)protoForContact:(OWSContact *)contact;
+ (OWSContact *_Nullable)contactForDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage;
//#pragma mark - Old Contacts
//
//+ (nullable OWSContact *)contactForOldContact:(Contact *)oldContact
@end
NS_ASSUME_NONNULL_END

View File

@ -7,6 +7,8 @@
#import "OWSContact+Private.h"
#import "OWSSignalServiceProtos.pb.h"
#import "PhoneNumber.h"
//#import "Contact.h"
#import "TSAttachment.h"
#import <YapDatabase/YapDatabaseTransaction.h>
@ -45,8 +47,8 @@ NSString *NSStringForContactPhoneType(OWSContactPhoneType value)
- (BOOL)ows_isValid
{
if (![PhoneNumber tryParsePhoneNumberFromE164:self.phoneNumber]) {
DDLogWarn(@"%@ invalid phone number; not e164: %@.", self.logTag, self.phoneNumber);
if (self.phoneNumber.ows_stripped.length < 1) {
DDLogWarn(@"%@ invalid phone number: %@.", self.logTag, self.phoneNumber);
return NO;
}
return YES;
@ -958,6 +960,76 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
return result;
}
//#pragma mark - Old Contacts
//
//+ (nullable OWSContact *)contactForOldContact:(Contact *)oldContact
//{
// OWSAssert(oldContact);
// OWSAssert(oldContact.cnContact);
//
//// DDLogDebug(@"%@ in %s with contact: %@", self.logTag, __PRETTY_FUNCTION__, contact);
//
// return [self contactForSystemContact:oldContact.cnContact];
//
//// OWSContact *newContact = [OWSContact new];
////
//// newContact.givenName = oldContact.firstName;
//// newContact.familyName = oldContact.lastName;
////
//// NSMutableArray<
//// OWSContactPhoneNumber *> *newPhoneNumbers = [NSMutableArray new];
//// for (NSString *oldPhoneNumber in oldContact.userTextPhoneNumbers) {
//// OWSContactPhoneNumber *newPhoneNumber = [OWSContactPhoneNumber new];
//// newPhoneNumber.phoneNumber = oldPhoneNumber;
//// newPhoneNumber.phoneType = OWSContactPhoneType_Custom;
//// [newPhoneNumbers addObject:newPhoneNumber];
//// }
//// newContact.phoneNumbers = newPhoneNumbers;
////
//// NSMutableArray<
//// OWSContactEmail *> *newEmails = [NSMutableArray new];
//// for (NSString *oldEmail in oldContact.emails) {
//// OWSContactEmail *newEmail = [OWSContactEmail new];
//// newEmail.email = oldEmail;
//// newEmail.emailType = OWSContactEmailType_Custom;
//// [newEmails addObject:newEmail];
//// }
//// newContact.emails = newEmails;
////
//// @interface Contact : MTLModel
////
//// @property (nullable, readonly, nonatomic) NSString *firstName;
//// @property (nullable, readonly, nonatomic) NSString *lastName;
//// @property (readonly, nonatomic) NSString *fullName;
//// @property (readonly, nonatomic) NSString *comparableNameFirstLast;
//// @property (readonly, nonatomic) NSString *comparableNameLastFirst;
//// @property (readonly, nonatomic) NSArray<PhoneNumber *> *parsedPhoneNumbers;
//// @property (readonly, nonatomic) NSArray<NSString *> *userTextPhoneNumbers;
//// @property (readonly, nonatomic) NSArray<NSString *> *emails;
//// @property (readonly, nonatomic) NSString *uniqueId;
//// @property (nonatomic, readonly) BOOL isSignalContact;
////#if TARGET_OS_IOS
//// @property (nullable, readonly, nonatomic) UIImage *image;
//// @property (nullable, nonatomic, readonly) CNContact *cnContact;
////#endif // TARGET_OS_IOS
////
//// - (NSArray<SignalRecipient *> *)signalRecipientsWithTransaction:(YapDatabaseReadTransaction *)transaction;
//// // TODO: Remove this method.
//// - (NSArray<NSString *> *)textSecureIdentifiers;
////
////#if TARGET_OS_IOS
////
//// - (instancetype)initWithSystemContact:(CNContact *)contact NS_AVAILABLE_IOS(9_0);
////
//// - (NSString *)nameForPhoneNumber:(NSString *)recipientId;
////
////#endif // TARGET_OS_IOS
////
//// + (NSComparator)comparatorSortingNamesByFirstThenLast:(BOOL)firstNameOrdering;
////
//// @end
//}
@end
NS_ASSUME_NONNULL_END