mirror of https://github.com/oxen-io/session-ios
Sketch out "contact share" model.
parent
6005747856
commit
4b8a2fa8a3
@ -1 +1 @@
|
||||
Subproject commit e67a14d7af8c1e54e2e68aa4488a7528eb99e896
|
||||
Subproject commit 7f6203376010de8838e21a2c22546f10fc24f712
|
@ -0,0 +1,99 @@
|
||||
//
|
||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Mantle/MTLModel.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class OWSSignalServiceProtosDataMessage;
|
||||
@class TSAttachment;
|
||||
@class YapDatabaseReadWriteTransaction;
|
||||
|
||||
typedef NS_ENUM(NSUInteger, OWSContactSharePhoneType) {
|
||||
OWSContactSharePhoneType_Home = 1,
|
||||
OWSContactSharePhoneType_Mobile,
|
||||
OWSContactSharePhoneType_Work,
|
||||
OWSContactSharePhoneType_Custom,
|
||||
};
|
||||
|
||||
@interface OWSContactSharePhoneNumber : MTLModel
|
||||
|
||||
@property (nonatomic, readonly) OWSContactSharePhoneType phoneType;
|
||||
// Applies in the OWSContactSharePhoneType_Custom case.
|
||||
@property (nonatomic, readonly, nullable) NSString *label;
|
||||
|
||||
@property (nonatomic, readonly) NSString *phoneNumber;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
typedef NS_ENUM(NSUInteger, OWSContactShareEmailType) {
|
||||
OWSContactShareEmailType_Home = 1,
|
||||
OWSContactShareEmailType_Mobile,
|
||||
OWSContactShareEmailType_Work,
|
||||
OWSContactShareEmailType_Custom,
|
||||
};
|
||||
|
||||
@interface OWSContactShareEmail : MTLModel
|
||||
|
||||
@property (nonatomic, readonly) OWSContactShareEmailType emailType;
|
||||
// Applies in the OWSContactShareEmailType_Custom case.
|
||||
@property (nonatomic, readonly, nullable) NSString *label;
|
||||
|
||||
@property (nonatomic, readonly) NSString *email;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
typedef NS_ENUM(NSUInteger, OWSContactShareAddressType) {
|
||||
OWSContactShareAddressType_Home = 1,
|
||||
OWSContactShareAddressType_Work,
|
||||
OWSContactShareAddressType_Custom,
|
||||
};
|
||||
|
||||
@interface OWSContactShareAddress : MTLModel
|
||||
|
||||
@property (nonatomic, readonly) OWSContactShareAddressType addressType;
|
||||
// Applies in the OWSContactShareAddressType_Custom case.
|
||||
@property (nonatomic, readonly, nullable) NSString *label;
|
||||
|
||||
@property (nonatomic, readonly, nullable) NSString *street;
|
||||
@property (nonatomic, readonly, nullable) NSString *pobox;
|
||||
@property (nonatomic, readonly, nullable) NSString *neighborhood;
|
||||
@property (nonatomic, readonly, nullable) NSString *city;
|
||||
@property (nonatomic, readonly, nullable) NSString *region;
|
||||
@property (nonatomic, readonly, nullable) NSString *postcode;
|
||||
@property (nonatomic, readonly, nullable) NSString *country;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@interface OWSContactShare : MTLModel
|
||||
|
||||
@property (nonatomic, readonly, nullable) NSString *givenName;
|
||||
@property (nonatomic, readonly, nullable) NSString *familyName;
|
||||
@property (nonatomic, readonly, nullable) NSString *nameSuffix;
|
||||
@property (nonatomic, readonly, nullable) NSString *namePrefix;
|
||||
@property (nonatomic, readonly, nullable) NSString *middleName;
|
||||
|
||||
@property (nonatomic, readonly, nullable) NSArray<OWSContactSharePhoneNumber *> *phoneNumbers;
|
||||
@property (nonatomic, readonly, nullable) NSArray<OWSContactShareEmail *> *emails;
|
||||
@property (nonatomic, readonly, nullable) NSArray<OWSContactShareAddress *> *addresses;
|
||||
|
||||
// TODO: This is provisional.
|
||||
@property (nonatomic, readonly, nullable) TSAttachment *avatar;
|
||||
// "Profile" avatars should _not_ be saved to device contacts.
|
||||
@property (nonatomic, readonly) BOOL isProfileAvatar;
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
+ (OWSContactShare *_Nullable)contactShareMessageForDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
|
||||
transaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
@ -0,0 +1,259 @@
|
||||
//
|
||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OWSContactShare.h"
|
||||
#import "OWSSignalServiceProtos.pb.h"
|
||||
#import "TSAttachment.h"
|
||||
#import <YapDatabase/YapDatabaseTransaction.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface OWSContactSharePhoneNumber ()
|
||||
|
||||
@property (nonatomic) OWSContactSharePhoneType phoneType;
|
||||
@property (nonatomic, nullable) NSString *label;
|
||||
|
||||
@property (nonatomic) NSString *phoneNumber;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@implementation OWSContactSharePhoneNumber
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@interface OWSContactShareEmail ()
|
||||
|
||||
@property (nonatomic) OWSContactShareEmailType emailType;
|
||||
@property (nonatomic, nullable) NSString *label;
|
||||
|
||||
@property (nonatomic) NSString *email;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@implementation OWSContactShareEmail
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@interface OWSContactShareAddress ()
|
||||
|
||||
@property (nonatomic) OWSContactShareAddressType addressType;
|
||||
@property (nonatomic, nullable) NSString *label;
|
||||
|
||||
@property (nonatomic, nullable) NSString *street;
|
||||
@property (nonatomic, nullable) NSString *pobox;
|
||||
@property (nonatomic, nullable) NSString *neighborhood;
|
||||
@property (nonatomic, nullable) NSString *city;
|
||||
@property (nonatomic, nullable) NSString *region;
|
||||
@property (nonatomic, nullable) NSString *postcode;
|
||||
@property (nonatomic, nullable) NSString *country;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@implementation OWSContactShareAddress
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@interface OWSContactShare ()
|
||||
|
||||
@property (nonatomic, nullable) NSString *givenName;
|
||||
@property (nonatomic, nullable) NSString *familyName;
|
||||
@property (nonatomic, nullable) NSString *nameSuffix;
|
||||
@property (nonatomic, nullable) NSString *namePrefix;
|
||||
@property (nonatomic, nullable) NSString *middleName;
|
||||
|
||||
@property (nonatomic, nullable) NSArray<OWSContactSharePhoneNumber *> *phoneNumbers;
|
||||
@property (nonatomic, nullable) NSArray<OWSContactShareEmail *> *emails;
|
||||
@property (nonatomic, nullable) NSArray<OWSContactShareAddress *> *addresses;
|
||||
|
||||
@property (nonatomic, nullable) TSAttachment *avatar;
|
||||
@property (nonatomic) BOOL isProfileAvatar;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@implementation OWSContactShare
|
||||
|
||||
+ (OWSContactShare *_Nullable)contactShareMessageForDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
|
||||
transaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
OWSAssert(dataMessage);
|
||||
|
||||
if (dataMessage.contact.count < 1) {
|
||||
return nil;
|
||||
}
|
||||
OWSAssert(dataMessage.contact.count == 1);
|
||||
OWSSignalServiceProtosDataMessageContact *contactProto = dataMessage.contact.firstObject;
|
||||
|
||||
OWSContactShare *contactShare = [OWSContactShare new];
|
||||
if (contactProto.hasName) {
|
||||
OWSSignalServiceProtosDataMessageContactName *nameProto = contactProto.name;
|
||||
|
||||
if (nameProto.hasGivenName) {
|
||||
contactShare.givenName = nameProto.givenName;
|
||||
}
|
||||
if (nameProto.hasFamilyName) {
|
||||
contactShare.familyName = nameProto.familyName;
|
||||
}
|
||||
if (nameProto.hasPrefix) {
|
||||
contactShare.namePrefix = nameProto.prefix;
|
||||
}
|
||||
if (nameProto.hasSuffix) {
|
||||
contactShare.nameSuffix = nameProto.suffix;
|
||||
}
|
||||
if (nameProto.hasMiddleName) {
|
||||
contactShare.middleName = nameProto.middleName;
|
||||
}
|
||||
}
|
||||
|
||||
NSMutableArray<OWSContactSharePhoneNumber *> *phoneNumbers = [NSMutableArray new];
|
||||
for (OWSSignalServiceProtosDataMessageContactPhone *phoneNumberProto in contactProto.number) {
|
||||
OWSContactSharePhoneNumber *_Nullable phoneNumber = [self phoneNumberForProto:phoneNumberProto];
|
||||
if (phoneNumber) {
|
||||
[phoneNumbers addObject:phoneNumber];
|
||||
}
|
||||
}
|
||||
contactShare.phoneNumbers = [phoneNumbers copy];
|
||||
|
||||
NSMutableArray<OWSContactShareEmail *> *emails = [NSMutableArray new];
|
||||
for (OWSSignalServiceProtosDataMessageContactEmail *emailProto in contactProto.email) {
|
||||
OWSContactShareEmail *_Nullable email = [self emailForProto:emailProto];
|
||||
if (email) {
|
||||
[emails addObject:email];
|
||||
}
|
||||
}
|
||||
contactShare.emails = [emails copy];
|
||||
|
||||
NSMutableArray<OWSContactShareAddress *> *addresses = [NSMutableArray new];
|
||||
for (OWSSignalServiceProtosDataMessageContactPostalAddress *addressProto in contactProto.address) {
|
||||
OWSContactShareAddress *_Nullable address = [self addressForProto:addressProto];
|
||||
if (address) {
|
||||
[addresses addObject:address];
|
||||
}
|
||||
}
|
||||
contactShare.addresses = [addresses copy];
|
||||
|
||||
return contactShare;
|
||||
}
|
||||
|
||||
+ (nullable OWSContactSharePhoneNumber *)phoneNumberForProto:
|
||||
(OWSSignalServiceProtosDataMessageContactPhone *)phoneNumberProto
|
||||
{
|
||||
OWSContactSharePhoneNumber *result = [OWSContactSharePhoneNumber new];
|
||||
result.phoneType = OWSContactSharePhoneType_Custom;
|
||||
if (phoneNumberProto.hasType) {
|
||||
switch (phoneNumberProto.type) {
|
||||
case OWSSignalServiceProtosDataMessageContactPhoneTypeHome:
|
||||
result.phoneType = OWSContactSharePhoneType_Home;
|
||||
break;
|
||||
case OWSSignalServiceProtosDataMessageContactPhoneTypeMobile:
|
||||
result.phoneType = OWSContactSharePhoneType_Mobile;
|
||||
break;
|
||||
case OWSSignalServiceProtosDataMessageContactPhoneTypeWork:
|
||||
result.phoneType = OWSContactSharePhoneType_Work;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (phoneNumberProto.hasLabel) {
|
||||
result.label = phoneNumberProto.label;
|
||||
}
|
||||
if (phoneNumberProto.hasValue) {
|
||||
result.phoneNumber = phoneNumberProto.value;
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
+ (nullable OWSContactShareEmail *)emailForProto:(OWSSignalServiceProtosDataMessageContactEmail *)emailProto
|
||||
{
|
||||
OWSContactShareEmail *result = [OWSContactShareEmail new];
|
||||
result.emailType = OWSContactShareEmailType_Custom;
|
||||
if (emailProto.hasType) {
|
||||
switch (emailProto.type) {
|
||||
case OWSSignalServiceProtosDataMessageContactEmailTypeHome:
|
||||
result.emailType = OWSContactShareEmailType_Home;
|
||||
break;
|
||||
case OWSSignalServiceProtosDataMessageContactEmailTypeMobile:
|
||||
result.emailType = OWSContactShareEmailType_Mobile;
|
||||
break;
|
||||
case OWSSignalServiceProtosDataMessageContactEmailTypeWork:
|
||||
result.emailType = OWSContactShareEmailType_Work;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (emailProto.hasLabel) {
|
||||
result.label = emailProto.label;
|
||||
}
|
||||
if (emailProto.hasValue) {
|
||||
result.email = emailProto.value;
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
+ (nullable OWSContactShareAddress *)addressForProto:
|
||||
(OWSSignalServiceProtosDataMessageContactPostalAddress *)addressProto
|
||||
{
|
||||
OWSContactShareAddress *result = [OWSContactShareAddress new];
|
||||
result.addressType = OWSContactShareAddressType_Custom;
|
||||
if (addressProto.hasType) {
|
||||
switch (addressProto.type) {
|
||||
case OWSSignalServiceProtosDataMessageContactPostalAddressTypeHome:
|
||||
result.addressType = OWSContactShareAddressType_Home;
|
||||
break;
|
||||
case OWSSignalServiceProtosDataMessageContactPostalAddressTypeWork:
|
||||
result.addressType = OWSContactShareAddressType_Work;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (addressProto.hasLabel) {
|
||||
result.label = addressProto.label;
|
||||
}
|
||||
if (addressProto.hasStreet) {
|
||||
result.street = addressProto.street;
|
||||
}
|
||||
if (addressProto.hasPobox) {
|
||||
result.pobox = addressProto.pobox;
|
||||
}
|
||||
if (addressProto.hasNeighborhood) {
|
||||
result.neighborhood = addressProto.neighborhood;
|
||||
}
|
||||
if (addressProto.hasCity) {
|
||||
result.city = addressProto.city;
|
||||
}
|
||||
if (addressProto.hasRegion) {
|
||||
result.region = addressProto.region;
|
||||
}
|
||||
if (addressProto.hasPostcode) {
|
||||
result.postcode = addressProto.postcode;
|
||||
}
|
||||
if (addressProto.hasCountry) {
|
||||
result.country = addressProto.country;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
Loading…
Reference in New Issue