mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
Share picker searches by profile name
Consolidate some of the share logic // FREEBIE
This commit is contained in:
parent
3ed52b6d5a
commit
766e579961
4 changed files with 86 additions and 27 deletions
|
@ -60,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||||
[self updateContacts];
|
[self updateContacts];
|
||||||
self.shouldNotifyDelegateOfUpdatedContacts = NO;
|
self.shouldNotifyDelegateOfUpdatedContacts = NO;
|
||||||
|
|
||||||
_signalAccountSearcher = [self buildAccountSearcher];
|
_signalAccountSearcher = [self buildSignalAccountSearcher];
|
||||||
|
|
||||||
[self observeNotifications];
|
[self observeNotifications];
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
#pragma mark - Contacts
|
#pragma mark - Contacts
|
||||||
|
|
||||||
- (AnySearcher *)buildAccountSearcher
|
- (AnySearcher *)buildSignalAccountSearcher
|
||||||
{
|
{
|
||||||
return [[AnySearcher alloc] initWithIndexer:^NSString *_Nonnull(id _Nonnull obj) {
|
return [[AnySearcher alloc] initWithIndexer:^NSString *_Nonnull(id _Nonnull obj) {
|
||||||
if (![obj isKindOfClass:[SignalAccount class]]) {
|
if (![obj isKindOfClass:[SignalAccount class]]) {
|
||||||
|
|
|
@ -236,28 +236,8 @@ NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
- (NSArray<TSThread *> *)filteredThreadsWithSearchText
|
- (NSArray<TSThread *> *)filteredThreadsWithSearchText
|
||||||
{
|
{
|
||||||
NSArray<TSThread *> *threads = self.threadViewHelper.threads;
|
|
||||||
|
|
||||||
NSString *searchTerm = [[self.searchBar text] ows_stripped];
|
NSString *searchTerm = [[self.searchBar text] ows_stripped];
|
||||||
|
return [self.threadViewHelper threadsMatchingSearchString:searchTerm];
|
||||||
if ([searchTerm isEqualToString:@""]) {
|
|
||||||
return threads;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString *formattedNumber = [PhoneNumber removeFormattingCharacters:searchTerm];
|
|
||||||
|
|
||||||
NSMutableArray *result = [NSMutableArray new];
|
|
||||||
for (TSThread *thread in threads) {
|
|
||||||
if ([thread.name containsString:searchTerm]) {
|
|
||||||
[result addObject:thread];
|
|
||||||
} else if ([thread isKindOfClass:[TSContactThread class]]) {
|
|
||||||
TSContactThread *contactThread = (TSContactThread *)thread;
|
|
||||||
if (formattedNumber.length > 0 && [contactThread.contactIdentifier containsString:formattedNumber]) {
|
|
||||||
[result addObject:thread];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSArray<SignalAccount *> *)filteredSignalAccountsWithSearchText
|
- (NSArray<SignalAccount *> *)filteredSignalAccountsWithSearchText
|
||||||
|
@ -273,10 +253,11 @@ NS_ASSUME_NONNULL_BEGIN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString *searchString = [self.searchBar text];
|
NSString *searchString = self.searchBar.text;
|
||||||
|
NSArray<SignalAccount *> *matchingAccounts =
|
||||||
|
[self.contactsViewHelper signalAccountsMatchingSearchString:searchString];
|
||||||
|
|
||||||
ContactsViewHelper *helper = self.contactsViewHelper;
|
return [matchingAccounts
|
||||||
return [[helper signalAccountsMatchingSearchString:searchString]
|
|
||||||
filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(SignalAccount *signalAccount,
|
filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(SignalAccount *signalAccount,
|
||||||
NSDictionary<NSString *, id> *_Nullable bindings) {
|
NSDictionary<NSString *, id> *_Nullable bindings) {
|
||||||
return ![contactIdsToIgnore containsObject:signalAccount.recipientId];
|
return ![contactIdsToIgnore containsObject:signalAccount.recipientId];
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@class AnySearcher;
|
||||||
|
|
||||||
@protocol ThreadViewHelperDelegate <NSObject>
|
@protocol ThreadViewHelperDelegate <NSObject>
|
||||||
|
|
||||||
- (void)threadListDidChange;
|
- (void)threadListDidChange;
|
||||||
|
@ -22,8 +24,11 @@ NS_ASSUME_NONNULL_BEGIN
|
||||||
@interface ThreadViewHelper : NSObject
|
@interface ThreadViewHelper : NSObject
|
||||||
|
|
||||||
@property (nonatomic, weak) id<ThreadViewHelperDelegate> delegate;
|
@property (nonatomic, weak) id<ThreadViewHelperDelegate> delegate;
|
||||||
|
|
||||||
@property (nonatomic, readonly) NSMutableArray<TSThread *> *threads;
|
@property (nonatomic, readonly) NSMutableArray<TSThread *> *threads;
|
||||||
|
@property (nonatomic, readonly) AnySearcher *groupThreadSearcher;
|
||||||
|
@property (nonatomic, readonly) AnySearcher *contactThreadSearcher;
|
||||||
|
|
||||||
|
- (NSArray<TSThread *> *)threadsMatchingSearchString:(NSString *)searchString;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "ThreadViewHelper.h"
|
#import "ThreadViewHelper.h"
|
||||||
|
#import "Signal-Swift.h"
|
||||||
#import <SignalServiceKit/TSDatabaseView.h>
|
#import <SignalServiceKit/TSDatabaseView.h>
|
||||||
#import <SignalServiceKit/TSStorageManager.h>
|
#import <SignalServiceKit/TSStorageManager.h>
|
||||||
#import <SignalServiceKit/TSThread.h>
|
#import <SignalServiceKit/TSThread.h>
|
||||||
|
@ -29,6 +30,8 @@ NS_ASSUME_NONNULL_BEGIN
|
||||||
}
|
}
|
||||||
|
|
||||||
[self initializeMapping];
|
[self initializeMapping];
|
||||||
|
_groupThreadSearcher = [self buildGroupThreadSearcher];
|
||||||
|
_contactThreadSearcher = [self buildContactThreadSearcher];
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -123,6 +126,76 @@ NS_ASSUME_NONNULL_BEGIN
|
||||||
_threads = [threads copy];
|
_threads = [threads copy];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - Searching
|
||||||
|
|
||||||
|
- (OWSContactsManager *)contactsManager
|
||||||
|
{
|
||||||
|
return [Environment getCurrent].contactsManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *)searchIndexStringForRecipientId:(NSString *)recipientId
|
||||||
|
{
|
||||||
|
NSString *contactName = [self.contactsManager displayNameForPhoneIdentifier:recipientId];
|
||||||
|
NSString *profileName = [self.contactsManager profileNameForRecipientId:recipientId];
|
||||||
|
|
||||||
|
return [NSString stringWithFormat:@"%@ %@ %@", recipientId, contactName, profileName];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (AnySearcher *)buildContactThreadSearcher
|
||||||
|
{
|
||||||
|
AnySearcher *searcher = [[AnySearcher alloc] initWithIndexer:^NSString *_Nonnull(id _Nonnull obj) {
|
||||||
|
if (![obj isKindOfClass:[TSContactThread class]]) {
|
||||||
|
OWSFail(@"unexpected item in searcher");
|
||||||
|
return @"";
|
||||||
|
}
|
||||||
|
TSContactThread *contactThread = (TSContactThread *)obj;
|
||||||
|
|
||||||
|
NSString *recipientId = contactThread.contactIdentifier;
|
||||||
|
return [self searchIndexStringForRecipientId:recipientId];
|
||||||
|
}];
|
||||||
|
|
||||||
|
return searcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (AnySearcher *)buildGroupThreadSearcher
|
||||||
|
{
|
||||||
|
AnySearcher *searcher = [[AnySearcher alloc] initWithIndexer:^NSString *_Nonnull(id _Nonnull obj) {
|
||||||
|
if (![obj isKindOfClass:[TSGroupThread class]]) {
|
||||||
|
OWSFail(@"unexpected item in searcher");
|
||||||
|
return @"";
|
||||||
|
}
|
||||||
|
TSGroupThread *groupThread = (TSGroupThread *)obj;
|
||||||
|
NSString *groupName = groupThread.groupModel.groupName;
|
||||||
|
NSMutableString *groupMemberStrings = [NSMutableString new];
|
||||||
|
for (NSString *recipientId in groupThread.groupModel.groupMemberIds) {
|
||||||
|
NSString *recipientString = [self searchIndexStringForRecipientId:recipientId];
|
||||||
|
[groupMemberStrings appendFormat:@" %@", recipientString];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [NSString stringWithFormat:@"%@ %@", groupName, groupMemberStrings];
|
||||||
|
}];
|
||||||
|
|
||||||
|
return searcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSArray<TSThread *> *)threadsMatchingSearchString:(NSString *)searchString
|
||||||
|
{
|
||||||
|
if (searchString.length == 0) {
|
||||||
|
return self.threads;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableArray *result = [NSMutableArray new];
|
||||||
|
for (TSThread *thread in self.threads) {
|
||||||
|
AnySearcher *searcher =
|
||||||
|
[thread isKindOfClass:[TSContactThread class]] ? self.contactThreadSearcher : self.groupThreadSearcher;
|
||||||
|
if ([searcher item:thread doesMatchQuery:searchString]) {
|
||||||
|
[result addObject:thread];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
NS_ASSUME_NONNULL_END
|
||||||
|
|
Loading…
Reference in a new issue