// // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN @class Contact; @class ContactsViewHelper; @class SignalAccount; @class TSThread; @protocol CNContactViewControllerDelegate; @protocol ContactsViewHelperDelegate <NSObject> - (void)contactsViewHelperDidUpdateContacts; @optional - (BOOL)shouldHideLocalNumber; @end @protocol ContactEditingDelegate <CNContactViewControllerDelegate> - (void)didFinishEditingContact; @end #pragma mark - @class CNContact; @class OWSBlockingManager; @class OWSContactsManager; @interface ContactsViewHelper : NSObject @property (nonatomic, readonly, weak) id<ContactsViewHelperDelegate> delegate; @property (nonatomic, readonly) OWSContactsManager *contactsManager; @property (nonatomic, readonly) OWSBlockingManager *blockingManager; @property (nonatomic, readonly) NSDictionary<NSString *, SignalAccount *> *signalAccountMap; @property (nonatomic, readonly) NSArray<SignalAccount *> *signalAccounts; // Useful to differentiate between having no signal accounts vs. haven't checked yet @property (nonatomic, readonly) BOOL hasUpdatedContactsAtLeastOnce; // Suitable when the user tries to perform an action which is not possible due to the user having // previously denied contact access. - (void)presentMissingContactAccessAlertControllerFromViewController:(UIViewController *)viewController; - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithDelegate:(id<ContactsViewHelperDelegate>)delegate; - (nullable SignalAccount *)fetchSignalAccountForRecipientId:(NSString *)recipientId; - (SignalAccount *)fetchOrBuildSignalAccountForRecipientId:(NSString *)recipientId; // This method is faster than OWSBlockingManager but // is only safe to be called on the main thread. - (BOOL)isRecipientIdBlocked:(NSString *)recipientId; // This method is faster than OWSBlockingManager but // is only safe to be called on the main thread. - (BOOL)isThreadBlocked:(TSThread *)thread; // NOTE: This method uses a transaction. - (NSString *)localNumber; - (NSArray<SignalAccount *> *)signalAccountsMatchingSearchString:(NSString *)searchText; - (void)warmNonSignalContactsCacheAsync; - (NSArray<Contact *> *)nonSignalContactsMatchingSearchString:(NSString *)searchText; - (void)presentContactViewControllerForRecipientId:(NSString *)recipientId fromViewController:(UIViewController<ContactEditingDelegate> *)fromViewController editImmediately:(BOOL)shouldEditImmediately; // This method can be used to edit existing contacts. - (void)presentContactViewControllerForRecipientId:(NSString *)recipientId fromViewController:(UIViewController<ContactEditingDelegate> *)fromViewController editImmediately:(BOOL)shouldEditImmediately addToExistingCnContact:(CNContact *_Nullable)cnContact; + (void)presentMissingContactAccessAlertControllerFromViewController:(UIViewController *)viewController; @end NS_ASSUME_NONNULL_END