Unify the "message was sent" logic in conversation view. Ensure "message sent" sounds are played after sending attachments.

// FREEBIE
This commit is contained in:
Matthew Chen 2017-09-30 21:04:36 -04:00
parent 3bfb91d0c2
commit 5b70116209
2 changed files with 80 additions and 40 deletions

View File

@ -238,7 +238,8 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
UIImagePickerControllerDelegate,
UINavigationControllerDelegate,
UITextViewDelegate,
JSQLayoutDelegate>
JSQLayoutDelegate,
GifPickerViewControllerDelegate>
@property (nonatomic) TSThread *thread;
@property (nonatomic) TSMessageAdapter *lastDeliveredMessage;
@ -1685,40 +1686,37 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if (text.length > 0) {
if ([Environment.preferences soundInForeground]) {
[JSQSystemSoundPlayer jsq_playMessageSentSound];
}
// Limit outgoing text messages to 16kb.
//
// We convert large text messages to attachments
// which are presented as normal text messages.
const NSUInteger kOversizeTextMessageSizeThreshold = 16 * 1024;
BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread];
TSOutgoingMessage *message;
if ([text lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= kOversizeTextMessageSizeThreshold) {
DataSource *_Nullable dataSource = [DataSourceValue dataSourceWithOversizeText:text];
SignalAttachment *attachment =
[SignalAttachment attachmentWithDataSource:dataSource dataUTI:kOversizeTextAttachmentUTI];
message =
[ThreadUtil sendMessageWithAttachment:attachment inThread:self.thread messageSender:self.messageSender];
} else {
message = [ThreadUtil sendMessageWithText:text inThread:self.thread messageSender:self.messageSender];
}
[self updateLastVisibleTimestamp:message.timestampForSorting];
if (text.length < 1) {
return;
}
self.lastMessageSentDate = [NSDate new];
[self clearUnreadMessagesIndicator];
// Limit outgoing text messages to 16kb.
//
// We convert large text messages to attachments
// which are presented as normal text messages.
const NSUInteger kOversizeTextMessageSizeThreshold = 16 * 1024;
BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread];
TSOutgoingMessage *message;
if ([text lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= kOversizeTextMessageSizeThreshold) {
DataSource *_Nullable dataSource = [DataSourceValue dataSourceWithOversizeText:text];
SignalAttachment *attachment =
[SignalAttachment attachmentWithDataSource:dataSource dataUTI:kOversizeTextAttachmentUTI];
message =
[ThreadUtil sendMessageWithAttachment:attachment inThread:self.thread messageSender:self.messageSender];
} else {
message = [ThreadUtil sendMessageWithText:text inThread:self.thread messageSender:self.messageSender];
}
if (updateKeyboardState) {
[self toggleDefaultKeyboard];
}
[self clearDraft];
[self finishSendingMessage];
[((OWSMessagesToolbarContentView *)self.inputToolbar.contentView)ensureSubviews];
if (didAddToProfileWhitelist) {
[self ensureDynamicInteractions];
}
[self messageWasSent:message];
if (updateKeyboardState) {
[self toggleDefaultKeyboard];
}
[self clearDraft];
[self finishSendingMessage];
[((OWSMessagesToolbarContentView *)self.inputToolbar.contentView)ensureSubviews];
if (didAddToProfileWhitelist) {
[self ensureDynamicInteractions];
}
}
@ -3209,10 +3207,42 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
{
GifPickerViewController *view =
[[GifPickerViewController alloc] initWithThread:self.thread messageSender:self.messageSender];
view.delegate = self;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:view];
[self presentViewController:navigationController animated:YES completion:nil];
}
#pragma mark GifPickerViewControllerDelegate
- (void)gifPickerWillSend
{
[ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread];
}
- (void)gifPickerDidSendWithOutgoingMessage:(TSOutgoingMessage *)message
{
[self messageWasSent:message];
[self ensureDynamicInteractions];
}
- (void)messageWasSent:(TSOutgoingMessage *)message
{
OWSAssert([NSThread isMainThread]);
OWSAssert(message);
[self.editingDatabaseConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[message saveWithTransaction:transaction];
}];
[self updateLastVisibleTimestamp:message.timestampForSorting];
self.lastMessageSentDate = [NSDate new];
[self clearUnreadMessagesIndicator];
if ([Environment.preferences soundInForeground]) {
[JSQSystemSoundPlayer jsq_playMessageSentSound];
}
}
#pragma mark UIDocumentMenuDelegate
- (void)documentMenu:(UIDocumentMenuViewController *)documentMenu
@ -3488,12 +3518,9 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread];
TSOutgoingMessage *message =
[ThreadUtil sendMessageWithAttachment:attachment inThread:self.thread messageSender:self.messageSender];
[self.editingDatabaseConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[message saveWithTransaction:transaction];
}];
[self updateLastVisibleTimestamp:message.timestampForSorting];
self.lastMessageSentDate = [NSDate new];
[self clearUnreadMessagesIndicator];
[self messageWasSent:message];
if (didAddToProfileWhitelist) {
[self ensureDynamicInteractions];
}

View File

@ -4,11 +4,19 @@
import Foundation
@objc
protocol GifPickerViewControllerDelegate: class {
func gifPickerWillSend()
func gifPickerDidSend(outgoingMessage: TSOutgoingMessage)
}
class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollectionViewDataSource, UICollectionViewDelegate, GifPickerLayoutDelegate {
let TAG = "[GifPickerViewController]"
// MARK: Properties
public weak var delegate: GifPickerViewControllerDelegate?
var thread: TSThread?
var messageSender: MessageSender?
@ -166,7 +174,12 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect
owsFail("\(TAG) Missing messageSender.")
return
}
ThreadUtil.sendMessage(with: attachment, in: thread, messageSender: messageSender)
self.delegate?.gifPickerWillSend()
let outgoingMessage = ThreadUtil.sendMessage(with: attachment, in: thread, messageSender: messageSender)
self.delegate?.gifPickerDidSend(outgoingMessage: outgoingMessage)
dismiss(animated: true, completion:nil)
}