WIP unjank home screen

verify `description` isn't used elsewhere (notifications? conversation
view?)

Probably want to remove overzealous asserts for now, but would be good
to work towards leaving them enabled.

// FREEBIE
pull/1/head
Michael Kirk 7 years ago
parent 7912598ccb
commit 1fb1b5bbe2

@ -6,6 +6,7 @@ NS_ASSUME_NONNULL_BEGIN
@class OWSContactsManager; @class OWSContactsManager;
@class TSThread; @class TSThread;
@class YapDatabaseReadTransaction;
@interface HomeViewCell : UITableViewCell @interface HomeViewCell : UITableViewCell
@ -15,7 +16,8 @@ NS_ASSUME_NONNULL_BEGIN
- (void)configureWithThread:(TSThread *)thread - (void)configureWithThread:(TSThread *)thread
contactsManager:(OWSContactsManager *)contactsManager contactsManager:(OWSContactsManager *)contactsManager
blockedPhoneNumberSet:(NSSet<NSString *> *)blockedPhoneNumberSet; blockedPhoneNumberSet:(NSSet<NSString *> *)blockedPhoneNumberSet
transaction:(YapDatabaseReadTransaction *)transaction;
@end @end

@ -146,11 +146,13 @@ NS_ASSUME_NONNULL_BEGIN
- (void)configureWithThread:(TSThread *)thread - (void)configureWithThread:(TSThread *)thread
contactsManager:(OWSContactsManager *)contactsManager contactsManager:(OWSContactsManager *)contactsManager
blockedPhoneNumberSet:(NSSet<NSString *> *)blockedPhoneNumberSet blockedPhoneNumberSet:(NSSet<NSString *> *)blockedPhoneNumberSet
transaction:(YapDatabaseReadTransaction *)transaction
{ {
OWSAssertIsOnMainThread(); OWSAssertIsOnMainThread();
OWSAssert(thread); OWSAssert(thread);
OWSAssert(contactsManager); OWSAssert(contactsManager);
OWSAssert(blockedPhoneNumberSet); OWSAssert(blockedPhoneNumberSet);
OWSAssert(transaction);
self.thread = thread; self.thread = thread;
self.contactsManager = contactsManager; self.contactsManager = contactsManager;
@ -171,7 +173,9 @@ NS_ASSUME_NONNULL_BEGIN
// changes to the dynamic type settings are reflected. // changes to the dynamic type settings are reflected.
self.snippetLabel.font = [self snippetFont]; self.snippetLabel.font = [self snippetFont];
self.snippetLabel.attributedText = self.snippetLabel.attributedText =
[self attributedSnippetForThread:thread blockedPhoneNumberSet:blockedPhoneNumberSet]; [self attributedSnippetForThread:thread
blockedPhoneNumberSet:blockedPhoneNumberSet
transaction:transaction];
self.dateTimeLabel.text = [self stringForDate:thread.lastMessageDate]; self.dateTimeLabel.text = [self stringForDate:thread.lastMessageDate];
@ -253,6 +257,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSAttributedString *)attributedSnippetForThread:(TSThread *)thread - (NSAttributedString *)attributedSnippetForThread:(TSThread *)thread
blockedPhoneNumberSet:(NSSet<NSString *> *)blockedPhoneNumberSet blockedPhoneNumberSet:(NSSet<NSString *> *)blockedPhoneNumberSet
transaction:(YapDatabaseReadTransaction *)transaction
{ {
OWSAssert(thread); OWSAssert(thread);
@ -285,7 +290,7 @@ NS_ASSUME_NONNULL_BEGIN
: [UIColor lightGrayColor]), : [UIColor lightGrayColor]),
}]]; }]];
} }
NSString *displayableText = thread.lastMessageLabel.filterStringForDisplay; NSString *displayableText = [thread lastMessageLabelWithTransaction:transaction];
if (displayableText) { if (displayableText) {
[snippetText appendAttributedString:[[NSAttributedString alloc] [snippetText appendAttributedString:[[NSAttributedString alloc]
initWithString:displayableText initWithString:displayableText

@ -395,7 +395,11 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState };
- (void)viewWillAppear:(BOOL)animated - (void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
if ([TSThread numberOfKeysInCollection] > 0) { __block BOOL hasAnyMessages;
[self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) {
hasAnyMessages = [self hasAnyMessagesWithTransaction:transaction];
}];
if (hasAnyMessages) {
[self.contactsManager requestSystemContactsOnceWithCompletion:^(NSError *_Nullable error) { [self.contactsManager requestSystemContactsOnceWithCompletion:^(NSError *_Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[self updateReminderViews]; [self updateReminderViews];
@ -490,7 +494,11 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState };
// If the user hasn't already granted contact access // If the user hasn't already granted contact access
// we don't want to request until they receive a message. // we don't want to request until they receive a message.
if ([TSThread numberOfKeysInCollection] > 0) { __block BOOL hasAnyMessages;
[self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) {
hasAnyMessages = [self hasAnyMessagesWithTransaction:transaction];
}];
if (hasAnyMessages) {
[self.contactsManager requestSystemContactsOnce]; [self.contactsManager requestSystemContactsOnce];
} }
} }
@ -506,11 +514,21 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState };
self.isAppInBackground = YES; self.isAppInBackground = YES;
} }
- (BOOL)hasAnyMessagesWithTransaction:(YapDatabaseReadTransaction *)transaction
{
return [TSThread numberOfKeysInCollectionWithTransaction:transaction] > 0;
}
- (void)applicationDidBecomeActive:(NSNotification *)notification - (void)applicationDidBecomeActive:(NSNotification *)notification
{ {
// It's possible a thread was created while we where in the background. But since we don't honor contact // It's possible a thread was created while we where in the background. But since we don't honor contact
// requests unless the app is in the foregrond, we must check again here upon becoming active. // requests unless the app is in the foregrond, we must check again here upon becoming active.
if ([TSThread numberOfKeysInCollection] > 0) { __block BOOL hasAnyMessages;
[self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) {
hasAnyMessages = [self hasAnyMessagesWithTransaction:transaction];
}];
if (hasAnyMessages) {
[self.contactsManager requestSystemContactsOnceWithCompletion:^(NSError *_Nullable error) { [self.contactsManager requestSystemContactsOnceWithCompletion:^(NSError *_Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[self updateReminderViews]; [self updateReminderViews];
@ -584,9 +602,12 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState };
TSThread *thread = [self threadForIndexPath:indexPath]; TSThread *thread = [self threadForIndexPath:indexPath];
[cell configureWithThread:thread [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) {
contactsManager:self.contactsManager [cell configureWithThread:thread
blockedPhoneNumberSet:self.blockedPhoneNumberSet]; contactsManager:self.contactsManager
blockedPhoneNumberSet:self.blockedPhoneNumberSet
transaction:transaction];
}];
if ((unsigned long)indexPath.row == [self.threadMappings numberOfItemsInSection:0] - 1) { if ((unsigned long)indexPath.row == [self.threadMappings numberOfItemsInSection:0] - 1) {
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f); cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);

@ -90,7 +90,7 @@ NS_ASSUME_NONNULL_BEGIN
* *
* @return Thread preview string. * @return Thread preview string.
*/ */
- (NSString *)lastMessageLabel; - (NSString *)lastMessageLabelWithTransaction:(YapDatabaseReadTransaction *)transaction;
/** /**
* Updates the thread's caches of the latest interaction. * Updates the thread's caches of the latest interaction.

@ -4,6 +4,7 @@
#import "TSThread.h" #import "TSThread.h"
#import "NSDate+OWS.h" #import "NSDate+OWS.h"
#import "NSString+SSK.h"
#import "OWSPrimaryStorage.h" #import "OWSPrimaryStorage.h"
#import "OWSReadTracking.h" #import "OWSReadTracking.h"
#import "TSDatabaseView.h" #import "TSDatabaseView.h"
@ -246,26 +247,24 @@ NS_ASSUME_NONNULL_BEGIN
return last; return last;
} }
- (TSInteraction *)lastInteractionForInbox - (TSInteraction *)lastInteractionForInboxWithTransaction:(YapDatabaseReadTransaction *)transaction
{ {
__block TSInteraction *last = nil; __block TSInteraction *last = nil;
[OWSPrimaryStorage.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { [[transaction ext:TSMessageDatabaseViewExtensionName]
[[transaction ext:TSMessageDatabaseViewExtensionName] enumerateRowsInGroup:self.uniqueId
enumerateRowsInGroup:self.uniqueId withOptions:NSEnumerationReverse
withOptions:NSEnumerationReverse usingBlock:^(
usingBlock:^( NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) {
NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) {
OWSAssert([object isKindOfClass:[TSInteraction class]]);
OWSAssert([object isKindOfClass:[TSInteraction class]]);
TSInteraction *interaction = (TSInteraction *)object;
TSInteraction *interaction = (TSInteraction *)object;
if ([TSThread shouldInteractionAppearInInbox:interaction]) {
if ([TSThread shouldInteractionAppearInInbox:interaction]) { last = interaction;
last = interaction; *stop = YES;
*stop = YES; }
} }];
}];
}];
return last; return last;
} }
@ -277,12 +276,14 @@ NS_ASSUME_NONNULL_BEGIN
} }
} }
- (NSString *)lastMessageLabel { - (NSString *)lastMessageLabelWithTransaction:(YapDatabaseReadTransaction *)transaction
TSInteraction *interaction = self.lastInteractionForInbox; {
if (interaction == nil) { TSInteraction *interaction = [self lastInteractionForInboxWithTransaction:transaction];
return @""; if ([interaction conformsToProtocol:@protocol(OWSPreviewText)]) {
id<OWSPreviewText> previewable = (id<OWSPreviewText>)interaction;
return [previewable previewTextWithTransaction:transaction].filterStringForDisplay;
} else { } else {
return interaction.description; return @"";
} }
} }

@ -56,7 +56,7 @@ NS_ASSUME_NONNULL_BEGIN
return NO; return NO;
} }
- (NSString *)description -(NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction
{ {
if (self.createdByRemoteName) { if (self.createdByRemoteName) {
if (self.configurationIsEnabled && self.configurationDurationSeconds > 0) { if (self.configurationIsEnabled && self.configurationDurationSeconds > 0) {

@ -97,7 +97,8 @@ NSUInteger TSErrorMessageSchemaVersion = 1;
return OWSInteractionType_Error; return OWSInteractionType_Error;
} }
- (NSString *)description { - (NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction
{
switch (_errorType) { switch (_errorType) {
case TSErrorMessageNoSession: case TSErrorMessageNoSession:
return NSLocalizedString(@"ERROR_MESSAGE_NO_SESSION", @""); return NSLocalizedString(@"ERROR_MESSAGE_NO_SESSION", @"");

@ -91,7 +91,8 @@ NSUInteger TSInfoMessageSchemaVersion = 1;
return OWSInteractionType_Info; return OWSInteractionType_Info;
} }
- (NSString *)description { - (NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction
{
switch (_messageType) { switch (_messageType) {
case TSInfoMessageTypeSessionDidEnd: case TSInfoMessageTypeSessionDidEnd:
return NSLocalizedString(@"SECURE_SESSION_RESET", nil); return NSLocalizedString(@"SECURE_SESSION_RESET", nil);

@ -19,6 +19,12 @@ typedef NS_ENUM(NSInteger, OWSInteractionType) {
OWSInteractionType_Offer, OWSInteractionType_Offer,
}; };
@protocol OWSPreviewText
- (NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction;
@end
@interface TSInteraction : TSYapDatabaseObject @interface TSInteraction : TSYapDatabaseObject
- (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread; - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread;

@ -128,6 +128,7 @@ NS_ASSUME_NONNULL_BEGIN
} }
- (NSString *)description { - (NSString *)description {
OWSFail(@"Abstract Method");
return @"Interaction description"; return @"Interaction description";
} }

@ -15,7 +15,7 @@ NS_ASSUME_NONNULL_BEGIN
@class TSQuotedMessage; @class TSQuotedMessage;
@class YapDatabaseReadWriteTransaction; @class YapDatabaseReadWriteTransaction;
@interface TSMessage : TSInteraction @interface TSMessage : TSInteraction <OWSPreviewText>
@property (nonatomic, readonly) NSMutableArray<NSString *> *attachmentIds; @property (nonatomic, readonly) NSMutableArray<NSString *> *attachmentIds;
@property (nonatomic, readonly, nullable) NSString *body; @property (nonatomic, readonly, nullable) NSString *body;
@ -39,7 +39,6 @@ NS_ASSUME_NONNULL_BEGIN
- (BOOL)hasAttachments; - (BOOL)hasAttachments;
- (nullable TSAttachment *)attachmentWithTransaction:(YapDatabaseReadTransaction *)transaction; - (nullable TSAttachment *)attachmentWithTransaction:(YapDatabaseReadTransaction *)transaction;
- (NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction;
- (void)setQuotedMessageThumbnailAttachmentStream:(TSAttachmentStream *)attachmentStream; - (void)setQuotedMessageThumbnailAttachmentStream:(TSAttachmentStream *)attachmentStream;
- (BOOL)shouldStartExpireTimer; - (BOOL)shouldStartExpireTimer;

@ -265,14 +265,11 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
} }
} }
// TODO deprecate this and implement something like previewTextWithTransaction: for all TSInteractions
- (NSString *)description - (NSString *)description
{ {
__block NSString *result; // TODO verify this isn't exposed in the UI
[self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { OWSFail(@"%@ in %s verify this isn't being used anywhere except logging.", self.logTag, __PRETTY_FUNCTION__);
result = [self previewTextWithTransaction:transaction]; return [super description];
}];
return result;
} }
- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction - (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction

@ -67,7 +67,13 @@ NSUInteger TSCallCurrentSchemaVersion = 1;
return OWSInteractionType_Call; return OWSInteractionType_Call;
} }
- (NSString *)description { - (NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction
{
return [self previewText];
}
- (NSString *)previewText
{
switch (_callType) { switch (_callType) {
case RPRecentCallTypeIncoming: case RPRecentCallTypeIncoming:
return NSLocalizedString(@"INCOMING_CALL", @""); return NSLocalizedString(@"INCOMING_CALL", @"");
@ -83,10 +89,16 @@ NSUInteger TSCallCurrentSchemaVersion = 1;
return NSLocalizedString(@"INFO_MESSAGE_MISSED_CALL_DUE_TO_CHANGED_IDENITY", @"info message text shown in conversation view"); return NSLocalizedString(@"INFO_MESSAGE_MISSED_CALL_DUE_TO_CHANGED_IDENITY", @"info message text shown in conversation view");
case RPRecentCallTypeIncomingDeclined: case RPRecentCallTypeIncomingDeclined:
return NSLocalizedString(@"INCOMING_DECLINED_CALL", return NSLocalizedString(@"INCOMING_DECLINED_CALL",
@"info message recorded in conversation history when local user declined a call"); @"info message recorded in conversation history when local user declined a call");
} }
} }
- (NSString *)description
{
OWSFail(@"%@ in %s verify this isnt exposed in the UI", self.logTag, __PRETTY_FUNCTION__);
return [self previewText];
}
#pragma mark - OWSReadTracking #pragma mark - OWSReadTracking
- (uint64_t)expireStartedAt - (uint64_t)expireStartedAt

@ -109,17 +109,20 @@ NS_ASSUME_NONNULL_BEGIN
+ (YapDatabaseConnection *)dbReadConnection + (YapDatabaseConnection *)dbReadConnection
{ {
OWSAssert(![NSThread isMainThread]);
// We use TSYapDatabaseObject's dbReadWriteConnection (not OWSPrimaryStorage's // We use TSYapDatabaseObject's dbReadWriteConnection (not OWSPrimaryStorage's
// dbReadConnection) for consistency, since we tend to [TSYapDatabaseObject // dbReadConnection) for consistency, since we tend to [TSYapDatabaseObject
// save] and want to write to the same connection we read from. To get true // save] and want to write to the same connection we read from. To get true
// consistency, we'd want to update entities by reading & writing from within // consistency, we'd want to update entities by reading & writing from within
// the same transaction, but that'll be a big refactor. // the same transaction, but that'll be a big refactor.
return self.dbReadWriteConnection; return self.dbReadWriteConnection;
} }
+ (YapDatabaseConnection *)dbReadWriteConnection + (YapDatabaseConnection *)dbReadWriteConnection
{ {
OWSAssert(![NSThread isMainThread]);
// Use a dedicated connection for model reads & writes. // Use a dedicated connection for model reads & writes.
static YapDatabaseConnection *dbReadWriteConnection = nil; static YapDatabaseConnection *dbReadWriteConnection = nil;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;

Loading…
Cancel
Save