Fix voice message handling

pull/365/head
Niels Andriesse 4 years ago
parent aa5b0ed6e4
commit 0fc181ae9a

@ -373,23 +373,32 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
} }
func handleViewItemTapped(_ viewItem: ConversationViewItem, gestureRecognizer: UITapGestureRecognizer) { func handleViewItemTapped(_ viewItem: ConversationViewItem, gestureRecognizer: UITapGestureRecognizer) {
func confirmDownload() {
let modal = DownloadAttachmentModal(viewItem: viewItem)
modal.modalPresentationStyle = .overFullScreen
modal.modalTransitionStyle = .crossDissolve
present(modal, animated: true, completion: nil)
}
if let message = viewItem.interaction as? TSOutgoingMessage, message.messageState == .failed { if let message = viewItem.interaction as? TSOutgoingMessage, message.messageState == .failed {
// Show the failed message sheet // Show the failed message sheet
showFailedMessageSheet(for: message) showFailedMessageSheet(for: message)
} else { } else {
switch viewItem.messageCellType { switch viewItem.messageCellType {
case .audio: playOrPauseAudio(for: viewItem) case .audio:
if viewItem.interaction is TSIncomingMessage,
let thread = self.thread as? TSContactThread,
Storage.shared.getContact(with: thread.contactIdentifier())?.isTrusted != true {
confirmDownload()
} else {
playOrPauseAudio(for: viewItem)
}
case .mediaMessage: case .mediaMessage:
guard let index = viewItems.firstIndex(where: { $0 === viewItem }), guard let index = viewItems.firstIndex(where: { $0 === viewItem }),
let cell = messagesTableView.cellForRow(at: IndexPath(row: index, section: 0)) as? VisibleMessageCell else { return } let cell = messagesTableView.cellForRow(at: IndexPath(row: index, section: 0)) as? VisibleMessageCell else { return }
if viewItem.interaction is TSIncomingMessage, if viewItem.interaction is TSIncomingMessage,
let thread = self.thread as? TSContactThread, let thread = self.thread as? TSContactThread,
Storage.shared.getContact(with: thread.contactIdentifier())?.isTrusted != true { Storage.shared.getContact(with: thread.contactIdentifier())?.isTrusted != true {
// Ask the user whether they want to download this attachment confirmDownload()
let modal = DownloadAttachmentModal(viewItem: viewItem)
modal.modalPresentationStyle = .overFullScreen
modal.modalTransitionStyle = .crossDissolve
present(modal, animated: true, completion: nil)
} else { } else {
guard let albumView = cell.albumView else { return } guard let albumView = cell.albumView else { return }
let locationInCell = gestureRecognizer.location(in: cell) let locationInCell = gestureRecognizer.location(in: cell)
@ -417,10 +426,16 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
gallery.presentDetailView(fromViewController: self, mediaAttachment: stream) gallery.presentDetailView(fromViewController: self, mediaAttachment: stream)
} }
case .genericAttachment: case .genericAttachment:
if viewItem.interaction is TSIncomingMessage,
let thread = self.thread as? TSContactThread,
Storage.shared.getContact(with: thread.contactIdentifier())?.isTrusted != true {
confirmDownload()
} else {
// Open the document if possible // Open the document if possible
guard let url = viewItem.attachmentStream?.originalMediaURL else { return } guard let url = viewItem.attachmentStream?.originalMediaURL else { return }
let shareVC = UIActivityViewController(activityItems: [ url ], applicationActivities: nil) let shareVC = UIActivityViewController(activityItems: [ url ], applicationActivities: nil)
navigationController!.present(shareVC, animated: true, completion: nil) navigationController!.present(shareVC, animated: true, completion: nil)
}
case .textOnlyMessage: case .textOnlyMessage:
if let preview = viewItem.linkPreview, let urlAsString = preview.urlString, let url = URL(string: urlAsString) { if let preview = viewItem.linkPreview, let urlAsString = preview.urlString, let url = URL(string: urlAsString) {
// Open the link preview URL // Open the link preview URL

@ -31,7 +31,7 @@ final class MediaPlaceholderView : UIView {
attachments = message.attachments(with: transaction) attachments = message.attachments(with: transaction)
} }
guard let contentType = attachments.first?.contentType else { return ("actionsheet_document_black", "file") } // Should never occur guard let contentType = attachments.first?.contentType else { return ("actionsheet_document_black", "file") } // Should never occur
if MIMETypeUtil.isAudio(contentType) { return ("Microphone", "audio") } if MIMETypeUtil.isAudio(contentType) { return ("attachment_audio", "audio") }
if MIMETypeUtil.isImage(contentType) || MIMETypeUtil.isVideo(contentType) { return ("actionsheet_camera_roll_black", "media") } if MIMETypeUtil.isImage(contentType) || MIMETypeUtil.isVideo(contentType) { return ("actionsheet_camera_roll_black", "media") }
return ("actionsheet_document_black", "file") return ("actionsheet_document_black", "file")
}() }()

@ -302,6 +302,11 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewDelegate {
private func populateContentView(for viewItem: ConversationViewItem) { private func populateContentView(for viewItem: ConversationViewItem) {
snContentView.subviews.forEach { $0.removeFromSuperview() } snContentView.subviews.forEach { $0.removeFromSuperview() }
func showMediaPlaceholder() {
let mediaPlaceholderView = MediaPlaceholderView(viewItem: viewItem, textColor: bodyLabelTextColor)
snContentView.addSubview(mediaPlaceholderView)
mediaPlaceholderView.pin(to: snContentView)
}
albumView = nil albumView = nil
bodyTextView = nil bodyTextView = nil
mediaTextOverlayView = nil mediaTextOverlayView = nil
@ -340,9 +345,7 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewDelegate {
if viewItem.interaction is TSIncomingMessage, if viewItem.interaction is TSIncomingMessage,
let thread = viewItem.interaction.thread as? TSContactThread, let thread = viewItem.interaction.thread as? TSContactThread,
Storage.shared.getContact(with: thread.contactIdentifier())?.isTrusted != true { Storage.shared.getContact(with: thread.contactIdentifier())?.isTrusted != true {
let mediaPlaceholderView = MediaPlaceholderView(viewItem: viewItem, textColor: bodyLabelTextColor) showMediaPlaceholder()
snContentView.addSubview(mediaPlaceholderView)
mediaPlaceholderView.pin(to: snContentView)
} else { } else {
guard let cache = delegate?.getMediaCache() else { preconditionFailure() } guard let cache = delegate?.getMediaCache() else { preconditionFailure() }
let maxMessageWidth = VisibleMessageCell.getMaxWidth(for: viewItem) let maxMessageWidth = VisibleMessageCell.getMaxWidth(for: viewItem)
@ -365,14 +368,26 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewDelegate {
unloadContent = { albumView.unloadMedia() } unloadContent = { albumView.unloadMedia() }
} }
case .audio: case .audio:
if viewItem.interaction is TSIncomingMessage,
let thread = viewItem.interaction.thread as? TSContactThread,
Storage.shared.getContact(with: thread.contactIdentifier())?.isTrusted != true {
showMediaPlaceholder()
} else {
let voiceMessageView = VoiceMessageView(viewItem: viewItem) let voiceMessageView = VoiceMessageView(viewItem: viewItem)
snContentView.addSubview(voiceMessageView) snContentView.addSubview(voiceMessageView)
voiceMessageView.pin(to: snContentView) voiceMessageView.pin(to: snContentView)
viewItem.lastAudioMessageView = voiceMessageView viewItem.lastAudioMessageView = voiceMessageView
}
case .genericAttachment: case .genericAttachment:
if viewItem.interaction is TSIncomingMessage,
let thread = viewItem.interaction.thread as? TSContactThread,
Storage.shared.getContact(with: thread.contactIdentifier())?.isTrusted != true {
showMediaPlaceholder()
} else {
let documentView = DocumentView(viewItem: viewItem, textColor: bodyLabelTextColor) let documentView = DocumentView(viewItem: viewItem, textColor: bodyLabelTextColor)
snContentView.addSubview(documentView) snContentView.addSubview(documentView)
documentView.pin(to: snContentView) documentView.pin(to: snContentView)
}
default: return default: return
} }
} }

Loading…
Cancel
Save