Make contact share "bubble/card" reflect share contents.

This commit is contained in:
Matthew Chen 2018-05-16 15:47:17 -04:00
parent 3cdce13b44
commit f436fc19c2
9 changed files with 56 additions and 36 deletions

View File

@ -48,7 +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 */; };
34382266209A4E400094FEB7 /* ContactShareApprovalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34382265209A4E3F0094FEB7 /* ContactShareApprovalViewController.swift */; };
3438226A209B63500094FEB7 /* EditContactShareNameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34382269209B63500094FEB7 /* EditContactShareNameViewController.swift */; };
34386A51207D0C01009F5D9C /* HomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34386A4D207D0C01009F5D9C /* HomeViewController.m */; };
34386A52207D0C01009F5D9C /* HomeViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34386A50207D0C01009F5D9C /* HomeViewCell.m */; };
@ -638,7 +638,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; };
34382265209A4E3F0094FEB7 /* ContactShareApprovalViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ContactShareApprovalViewController.swift; path = SignalMessaging/attachments/ContactShareApprovalViewController.swift; sourceTree = SOURCE_ROOT; };
34382269209B63500094FEB7 /* EditContactShareNameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EditContactShareNameViewController.swift; path = SignalMessaging/attachments/EditContactShareNameViewController.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>"; };
@ -1614,9 +1614,9 @@
346129DB1FD5C02900532771 /* viewControllers */ = {
isa = PBXGroup;
children = (
34382265209A4E3F0094FEB7 /* ApproveContactShareViewController.swift */,
344F2498200FD03200CFB4F4 /* AttachmentApprovalViewController.swift */,
348BB253209CD4B80047AEC2 /* ContactFieldView.swift */,
34382265209A4E3F0094FEB7 /* ContactShareApprovalViewController.swift */,
344F248220069E9B00CFB4F4 /* CountryCodeViewController.h */,
344F248320069E9B00CFB4F4 /* CountryCodeViewController.m */,
34382269209B63500094FEB7 /* EditContactShareNameViewController.swift */,
@ -3136,7 +3136,7 @@
451F8A3F1FD71455005CB9DA /* OWSTableViewController.m in Sources */,
451F8A351FD710DE005CB9DA /* Searcher.swift in Sources */,
451F8A481FD715BA005CB9DA /* OWSContactAvatarBuilder.m in Sources */,
34382266209A4E400094FEB7 /* ApproveContactShareViewController.swift in Sources */,
34382266209A4E400094FEB7 /* ContactShareApprovalViewController.swift in Sources */,
4503F1C3204711D300CEE724 /* OWS107LegacySounds.m in Sources */,
3438226A209B63500094FEB7 /* EditContactShareNameViewController.swift in Sources */,
346129A61FD1F09100532771 /* OWSContactsManager.m in Sources */,

View File

@ -188,8 +188,9 @@ NS_ASSUME_NONNULL_BEGIN
[contentView autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:self.vMargin];
AvatarImageView *avatarView = [AvatarImageView new];
avatarView.image =
[self.contactShare getAvatarImageWithDiameter:self.iconSize contactsManager:self.contactsManager];
avatarView.image = [self.contactShare getAvatarImageWithDiameter:self.iconSize
contactsManager:self.contactsManager
ignoreContactAndProfile:YES];
[avatarView autoSetDimension:ALDimensionWidth toSize:self.iconSize];
[avatarView autoSetDimension:ALDimensionHeight toSize:self.iconSize];

View File

@ -118,7 +118,7 @@ typedef enum : NSUInteger {
#pragma mark -
@interface ConversationViewController () <AttachmentApprovalViewControllerDelegate,
ApproveContactShareViewControllerDelegate,
ContactShareApprovalViewControllerDelegate,
AVAudioPlayerDelegate,
CNContactViewControllerDelegate,
ContactEditingDelegate,
@ -3005,7 +3005,7 @@ typedef enum : NSUInteger {
BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread];
[self.editingDatabaseConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) {
[self.editingDatabaseConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
if (contactShare.avatarImage) {
[contactShare.dbRecord saveAvatarImage:contactShare.avatarImage transaction:transaction];
}
@ -5030,10 +5030,10 @@ interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransiti
[[ContactShareViewModel alloc] initWithContactShareRecord:contactShareRecord avatarImageData:avatarImageData];
// TODO: We should probably show this in the same navigation view controller.
ApproveContactShareViewController *approveContactShare =
[[ApproveContactShareViewController alloc] initWithContactShare:contactShare
contactsManager:self.contactsManager
delegate:self];
ContactShareApprovalViewController *approveContactShare =
[[ContactShareApprovalViewController alloc] initWithContactShare:contactShare
contactsManager:self.contactsManager
delegate:self];
OWSAssert(contactsPicker.navigationController);
[contactsPicker.navigationController pushViewController:approveContactShare animated:YES];
}
@ -5050,9 +5050,9 @@ interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransiti
return YES;
}
#pragma mark - ApproveContactShareViewControllerDelegate
#pragma mark - ContactShareApprovalViewControllerDelegate
- (void)approveContactShare:(ApproveContactShareViewController *)approveContactShare
- (void)approveContactShare:(ContactShareApprovalViewController *)approveContactShare
didApproveContactShare:(ContactShareViewModel *)contactShare
{
DDLogInfo(@"%@ in %s", self.logTag, __PRETTY_FUNCTION__);
@ -5063,7 +5063,7 @@ interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransiti
}];
}
- (void)approveContactShare:(ApproveContactShareViewController *)approveContactShare
- (void)approveContactShare:(ContactShareApprovalViewController *)approveContactShare
didCancelContactShare:(ContactShareViewModel *)contactShare
{
DDLogInfo(@"%@ in %s", self.logTag, __PRETTY_FUNCTION__);

View File

@ -90,6 +90,7 @@ class ContactCell: UITableViewCell {
let avatarBuilder = OWSContactAvatarBuilder(nonSignalName: contact.fullName,
colorSeed: contactIdForDeterminingBackgroundColor,
diameter: ContactCell.kAvatarDiameter,
ignoreContactAndProfile: false,
contactsManager: contactsManager)
contactImageView.image = avatarBuilder.buildDefaultImage()
@ -135,7 +136,7 @@ fileprivate extension CNContact {
if let attributedName = CNContactFormatter.attributedString(from: self, style: .fullName, defaultAttributes: nil) {
let highlightedName = attributedName.mutableCopy() as! NSMutableAttributedString
highlightedName.enumerateAttributes(in: NSMakeRange(0, highlightedName.length), options: [], using: { (attrs, range, _) in
highlightedName.enumerateAttributes(in: NSRange(location: 0, length: highlightedName.length), options: [], using: { (attrs, range, _) in
if let property = attrs[CNContactPropertyAttribute] as? String, property == keyToHighlight {
highlightedName.addAttributes(boldAttributes, range: range)
}

View File

@ -42,7 +42,7 @@ public class ContactShareViewModel: NSObject {
}
}
public func getAvatarImage(diameter: CGFloat, contactsManager: OWSContactsManager) -> UIImage {
public func getAvatarImage(diameter: CGFloat, contactsManager: OWSContactsManager, ignoreContactAndProfile: Bool = false) -> UIImage {
if let avatarImage = avatarImage {
return avatarImage
}
@ -59,6 +59,7 @@ public class ContactShareViewModel: NSObject {
let avatarBuilder = OWSContactAvatarBuilder(nonSignalName: displayName,
colorSeed: colorSeed,
diameter: UInt(diameter),
ignoreContactAndProfile: ignoreContactAndProfile,
contactsManager: contactsManager)
return avatarBuilder.build()
}

View File

@ -6,10 +6,10 @@ import Foundation
import SignalServiceKit
@objc
public protocol ApproveContactShareViewControllerDelegate: class {
func approveContactShare(_ approveContactShare: ApproveContactShareViewController,
public protocol ContactShareApprovalViewControllerDelegate: class {
func approveContactShare(_ approveContactShare: ContactShareApprovalViewController,
didApproveContactShare contactShare: ContactShareViewModel)
func approveContactShare(_ approveContactShare: ApproveContactShareViewController,
func approveContactShare(_ approveContactShare: ContactShareApprovalViewController,
didCancelContactShare contactShare: ContactShareViewModel)
}
@ -214,9 +214,9 @@ class ContactShareFieldView: UIStackView {
// TODO: Rename to ContactShareApprovalViewController
@objc
public class ApproveContactShareViewController: OWSViewController, EditContactShareNameViewControllerDelegate, ContactShareFieldViewDelegate {
public class ContactShareApprovalViewController: OWSViewController, EditContactShareNameViewControllerDelegate, ContactShareFieldViewDelegate {
weak var delegate: ApproveContactShareViewControllerDelegate?
weak var delegate: ContactShareApprovalViewControllerDelegate?
let contactsManager: OWSContactsManager
@ -234,7 +234,7 @@ public class ApproveContactShareViewController: OWSViewController, EditContactSh
}
@objc
required public init(contactShare: ContactShareViewModel, contactsManager: OWSContactsManager, delegate: ApproveContactShareViewControllerDelegate) {
required public init(contactShare: ContactShareViewModel, contactsManager: OWSContactsManager, delegate: ContactShareApprovalViewControllerDelegate) {
self.contactsManager = contactsManager
self.contactShare = contactShare
self.delegate = delegate
@ -463,6 +463,7 @@ public class ApproveContactShareViewController: OWSViewController, EditContactSh
}
let filteredContactShare = self.filteredContactShare()
assert(filteredContactShare.ows_isValid)
delegate.approveContactShare(self, didApproveContactShare: filteredContactShare)

View File

@ -24,7 +24,7 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion);
@interface SharingThreadPickerViewController () <SelectThreadViewControllerDelegate,
AttachmentApprovalViewControllerDelegate,
MessageApprovalViewControllerDelegate,
ApproveContactShareViewControllerDelegate>
ContactShareApprovalViewControllerDelegate>
@property (nonatomic, readonly) OWSContactsManager *contactsManager;
@property (nonatomic, readonly) OWSMessageSender *messageSender;
@ -175,10 +175,10 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion);
[[ContactShareViewModel alloc] initWithContactShareRecord:contactShareRecord
avatarImageData:avatarImageData];
ApproveContactShareViewController *approvalVC =
[[ApproveContactShareViewController alloc] initWithContactShare:contactShare
contactsManager:self.contactsManager
delegate:self];
ContactShareApprovalViewController *approvalVC =
[[ContactShareApprovalViewController alloc] initWithContactShare:contactShare
contactsManager:self.contactsManager
delegate:self];
[self.navigationController pushViewController:approvalVC animated:YES];
return;
}
@ -289,9 +289,9 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion);
[self cancelShareExperience];
}
#pragma mark - ApproveContactShareViewControllerDelegate
#pragma mark - ContactShareApprovalViewControllerDelegate
- (void)approveContactShare:(ApproveContactShareViewController *)approvalViewController
- (void)approveContactShare:(ContactShareApprovalViewController *)approvalViewController
didApproveContactShare:(ContactShareViewModel *)contactShare
{
DDLogInfo(@"%@ in %s", self.logTag, __PRETTY_FUNCTION__);
@ -321,7 +321,7 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion);
fromViewController:approvalViewController];
}
- (void)approveContactShare:(ApproveContactShareViewController *)approvalViewController
- (void)approveContactShare:(ContactShareApprovalViewController *)approvalViewController
didCancelContactShare:(ContactShareViewModel *)contactShare
{
DDLogInfo(@"%@ in %s", self.logTag, __PRETTY_FUNCTION__);

View File

@ -1,5 +1,5 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "OWSAvatarBuilder.h"
@ -24,9 +24,9 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithNonSignalName:(NSString *)nonSignalName
colorSeed:(NSString *)colorSeed
diameter:(NSUInteger)diameter
ignoreContactAndProfile:(BOOL)ignoreContactAndProfile
contactsManager:(OWSContactsManager *)contactsManager;
@end
NS_ASSUME_NONNULL_END

View File

@ -1,5 +1,5 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "OWSContactAvatarBuilder.h"
@ -10,6 +10,7 @@
#import "UIColor+OWS.h"
#import "UIFont+OWS.h"
#import <SignalMessaging/SignalMessaging-Swift.h>
// SHARINGEXTENSION FIXME
// intern or reimplement this so that SignalMessaging doesn't depend on JSQ
#import <JSQMessagesViewController/JSQMessagesAvatarImageFactory.h>
@ -22,6 +23,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) NSString *signalId;
@property (nonatomic, readonly) NSString *contactName;
@property (nonatomic, readonly) NSUInteger diameter;
@property (nonatomic, readonly) BOOL ignoreContactAndProfile;
@end
@ -32,6 +34,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithContactId:(NSString *)contactId
name:(NSString *)name
diameter:(NSUInteger)diameter
ignoreContactAndProfile:(BOOL)ignoreContactAndProfile
contactsManager:(OWSContactsManager *)contactsManager
{
self = [super init];
@ -42,6 +45,7 @@ NS_ASSUME_NONNULL_BEGIN
_signalId = contactId;
_contactName = name;
_diameter = diameter;
_ignoreContactAndProfile = ignoreContactAndProfile;
_contactsManager = contactsManager;
return self;
@ -59,21 +63,33 @@ NS_ASSUME_NONNULL_BEGIN
if (name.length == 0) {
name = signalId;
}
return [self initWithContactId:signalId name:name diameter:diameter contactsManager:contactsManager];
return [self initWithContactId:signalId
name:name
diameter:diameter
ignoreContactAndProfile:NO
contactsManager:contactsManager];
}
- (instancetype)initWithNonSignalName:(NSString *)nonSignalName
colorSeed:(NSString *)colorSeed
diameter:(NSUInteger)diameter
ignoreContactAndProfile:(BOOL)ignoreContactAndProfile
contactsManager:(OWSContactsManager *)contactsManager
{
return [self initWithContactId:colorSeed name:nonSignalName diameter:diameter contactsManager:contactsManager];
return [self initWithContactId:colorSeed
name:nonSignalName
diameter:diameter
ignoreContactAndProfile:ignoreContactAndProfile
contactsManager:contactsManager];
}
#pragma mark - Instance methods
- (nullable UIImage *)buildSavedImage
{
if (self.ignoreContactAndProfile) {
return nil;
}
return [self.contactsManager imageForPhoneIdentifier:self.signalId];
}