mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			170 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			170 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Swift
		
	
| 
											8 years ago
										 | // | ||
| 
											8 years ago
										 | //  Copyright (c) 2018 Open Whisper Systems. All rights reserved. | ||
| 
											8 years ago
										 | // | ||
|  | 
 | ||
|  | import Foundation | ||
| 
											5 years ago
										 | import SignalUtilitiesKit | ||
|  | import SignalUtilitiesKit | ||
| 
											8 years ago
										 | 
 | ||
| 
											8 years ago
										 | @objc public enum MessageReceiptStatus: Int { | ||
| 
											8 years ago
										 |     case uploading | ||
|  |     case sending | ||
|  |     case sent | ||
|  |     case delivered | ||
|  |     case read | ||
|  |     case failed | ||
| 
											8 years ago
										 |     case skipped | ||
| 
											8 years ago
										 | } | ||
|  | 
 | ||
| 
											8 years ago
										 | @objc | ||
|  | public class MessageRecipientStatusUtils: NSObject { | ||
| 
											8 years ago
										 |     // MARK: Initializers | ||
|  | 
 | ||
|  |     @available(*, unavailable, message:"do not instantiate this class.") | ||
|  |     private override init() { | ||
|  |     } | ||
|  | 
 | ||
| 
											8 years ago
										 |     // This method is per-recipient. | ||
| 
											8 years ago
										 |     @objc | ||
|  |     public class func recipientStatus(outgoingMessage: TSOutgoingMessage, | ||
| 
											7 years ago
										 |             recipientState: TSOutgoingMessageRecipientState) -> MessageReceiptStatus { | ||
| 
											8 years ago
										 |         let (messageReceiptStatus, _, _) = recipientStatusAndStatusMessage(outgoingMessage: outgoingMessage, | ||
| 
											7 years ago
										 |                                                                              recipientState: recipientState) | ||
| 
											8 years ago
										 |         return messageReceiptStatus | ||
| 
											8 years ago
										 |     } | ||
|  | 
 | ||
| 
											8 years ago
										 |     // This method is per-recipient. | ||
| 
											8 years ago
										 |     @objc | ||
| 
											8 years ago
										 |     public class func shortStatusMessage(outgoingMessage: TSOutgoingMessage, | ||
| 
											7 years ago
										 |         recipientState: TSOutgoingMessageRecipientState) -> String { | ||
| 
											8 years ago
										 |         let (_, shortStatusMessage, _) = recipientStatusAndStatusMessage(outgoingMessage: outgoingMessage, | ||
| 
											7 years ago
										 |                                                                          recipientState: recipientState) | ||
| 
											8 years ago
										 |         return shortStatusMessage | ||
|  |     } | ||
|  | 
 | ||
| 
											8 years ago
										 |     // This method is per-recipient. | ||
| 
											8 years ago
										 |     @objc | ||
| 
											8 years ago
										 |     public class func longStatusMessage(outgoingMessage: TSOutgoingMessage, | ||
| 
											7 years ago
										 |         recipientState: TSOutgoingMessageRecipientState) -> String { | ||
| 
											8 years ago
										 |         let (_, _, longStatusMessage) = recipientStatusAndStatusMessage(outgoingMessage: outgoingMessage, | ||
| 
											7 years ago
										 |                                                                         recipientState: recipientState) | ||
| 
											8 years ago
										 |         return longStatusMessage | ||
| 
											8 years ago
										 |     } | ||
|  | 
 | ||
| 
											8 years ago
										 |     // This method is per-recipient. | ||
| 
											8 years ago
										 |     class func recipientStatusAndStatusMessage(outgoingMessage: TSOutgoingMessage, | ||
| 
											7 years ago
										 |         recipientState: TSOutgoingMessageRecipientState) -> (status: MessageReceiptStatus, shortStatusMessage: String, longStatusMessage: String) { | ||
| 
											8 years ago
										 | 
 | ||
| 
											8 years ago
										 |         switch recipientState.state { | ||
|  |         case .failed: | ||
|  |             let shortStatusMessage = NSLocalizedString("MESSAGE_STATUS_FAILED_SHORT", comment: "status message for failed messages") | ||
| 
											7 years ago
										 |             let longStatusMessage = NSLocalizedString("MESSAGE_STATUS_FAILED", comment: "status message for failed messages") | ||
| 
											8 years ago
										 |             return (status:.failed, shortStatusMessage:shortStatusMessage, longStatusMessage:longStatusMessage) | ||
|  |         case .sending: | ||
|  |             if outgoingMessage.hasAttachments() { | ||
|  |                 assert(outgoingMessage.messageState == .sending) | ||
| 
											8 years ago
										 | 
 | ||
| 
											8 years ago
										 |                 let statusMessage = NSLocalizedString("MESSAGE_STATUS_UPLOADING", | ||
| 
											7 years ago
										 |                                                       comment: "status message while attachment is uploading") | ||
| 
											8 years ago
										 |                 return (status:.uploading, shortStatusMessage:statusMessage, longStatusMessage:statusMessage) | ||
|  |             } else { | ||
|  |                 assert(outgoingMessage.messageState == .sending) | ||
| 
											8 years ago
										 | 
 | ||
| 
											8 years ago
										 |                 let statusMessage = NSLocalizedString("MESSAGE_STATUS_SENDING", | ||
|  |                                                       comment: "message status while message is sending.") | ||
|  |                 return (status:.sending, shortStatusMessage:statusMessage, longStatusMessage:statusMessage) | ||
|  |             } | ||
|  |         case .sent: | ||
|  |             if let readTimestamp = recipientState.readTimestamp { | ||
| 
											7 years ago
										 |                 let timestampString = DateUtil.formatPastTimestampRelativeToNow(readTimestamp.uint64Value) | ||
| 
											8 years ago
										 |                 let shortStatusMessage = timestampString | ||
| 
											7 years ago
										 |                 let longStatusMessage = NSLocalizedString("MESSAGE_STATUS_READ", comment: "status message for read messages").rtlSafeAppend(" ") | ||
| 
											7 years ago
										 |                     .rtlSafeAppend(timestampString) | ||
| 
											8 years ago
										 |                 return (status:.read, shortStatusMessage:shortStatusMessage, longStatusMessage:longStatusMessage) | ||
|  |             } | ||
|  |             if let deliveryTimestamp = recipientState.deliveryTimestamp { | ||
| 
											7 years ago
										 |                 let timestampString = DateUtil.formatPastTimestampRelativeToNow(deliveryTimestamp.uint64Value) | ||
| 
											8 years ago
										 |                 let shortStatusMessage = timestampString | ||
|  |                 let longStatusMessage = NSLocalizedString("MESSAGE_STATUS_DELIVERED", | ||
| 
											7 years ago
										 |                                                           comment: "message status for message delivered to their recipient.").rtlSafeAppend(" ") | ||
|  |                     .rtlSafeAppend(timestampString) | ||
| 
											8 years ago
										 |                 return (status:.delivered, shortStatusMessage:shortStatusMessage, longStatusMessage:longStatusMessage) | ||
|  |             } | ||
| 
											8 years ago
										 |             let statusMessage = | ||
|  |                 NSLocalizedString("MESSAGE_STATUS_SENT", | ||
| 
											7 years ago
										 |                                   comment: "status message for sent messages") | ||
| 
											8 years ago
										 |             return (status:.sent, shortStatusMessage:statusMessage, longStatusMessage:statusMessage) | ||
| 
											8 years ago
										 |         case .skipped: | ||
|  |             let statusMessage = NSLocalizedString("MESSAGE_STATUS_RECIPIENT_SKIPPED", | ||
| 
											7 years ago
										 |                                                   comment: "message status if message delivery to a recipient is skipped. We skip delivering group messages to users who have left the group or unregistered their Signal account.") | ||
| 
											8 years ago
										 |             return (status:.skipped, shortStatusMessage:statusMessage, longStatusMessage:statusMessage) | ||
| 
											8 years ago
										 |         } | ||
|  |     } | ||
|  | 
 | ||
| 
											8 years ago
										 |     // This method is per-message. | ||
| 
											7 years ago
										 |     internal class func receiptStatusAndMessage(outgoingMessage: TSOutgoingMessage) -> (status: MessageReceiptStatus, message: String) { | ||
| 
											8 years ago
										 | 
 | ||
| 
											8 years ago
										 |         switch outgoingMessage.messageState { | ||
| 
											8 years ago
										 |         case .failed: | ||
| 
											8 years ago
										 |             // Use the "long" version of this message here. | ||
| 
											7 years ago
										 |             return (.failed, NSLocalizedString("MESSAGE_STATUS_FAILED", comment: "status message for failed messages")) | ||
| 
											8 years ago
										 |         case .sending: | ||
| 
											8 years ago
										 |             if outgoingMessage.hasAttachments() { | ||
| 
											8 years ago
										 |                 return (.uploading, NSLocalizedString("MESSAGE_STATUS_UPLOADING", | ||
| 
											7 years ago
										 |                                          comment: "status message while attachment is uploading")) | ||
| 
											8 years ago
										 |             } else { | ||
| 
											8 years ago
										 |                 return (.sending, NSLocalizedString("MESSAGE_STATUS_SENDING", | ||
|  |                                          comment: "message status while message is sending.")) | ||
| 
											8 years ago
										 |             } | ||
| 
											8 years ago
										 |         case .sent: | ||
|  |             if outgoingMessage.readRecipientIds().count > 0 { | ||
| 
											7 years ago
										 |                 return (.read, NSLocalizedString("MESSAGE_STATUS_READ", comment: "status message for read messages")) | ||
| 
											8 years ago
										 |             } | ||
| 
											8 years ago
										 |             if outgoingMessage.wasDeliveredToAnyRecipient { | ||
| 
											8 years ago
										 |                 return (.delivered, NSLocalizedString("MESSAGE_STATUS_DELIVERED", | ||
|  |                                          comment: "message status for message delivered to their recipient.")) | ||
| 
											8 years ago
										 |             } | ||
| 
											8 years ago
										 |             return (.sent, NSLocalizedString("MESSAGE_STATUS_SENT", | ||
| 
											7 years ago
										 |                                      comment: "status message for sent messages")) | ||
| 
											8 years ago
										 |         default: | ||
| 
											7 years ago
										 |             owsFailDebug("Message has unexpected status: \(outgoingMessage.messageState).") | ||
| 
											8 years ago
										 |             return (.sent, NSLocalizedString("MESSAGE_STATUS_SENT", | ||
| 
											7 years ago
										 |                                      comment: "status message for sent messages")) | ||
| 
											8 years ago
										 |         } | ||
|  |     } | ||
| 
											8 years ago
										 | 
 | ||
| 
											8 years ago
										 |     // This method is per-message. | ||
| 
											8 years ago
										 |     @objc | ||
| 
											7 years ago
										 |     public class func receiptMessage(outgoingMessage: TSOutgoingMessage) -> String { | ||
|  |         let (_, message ) = receiptStatusAndMessage(outgoingMessage: outgoingMessage) | ||
| 
											8 years ago
										 |         return message | ||
|  |     } | ||
| 
											8 years ago
										 | 
 | ||
| 
											8 years ago
										 |     // This method is per-message. | ||
| 
											8 years ago
										 |     @objc | ||
| 
											7 years ago
										 |     public class func recipientStatus(outgoingMessage: TSOutgoingMessage) -> MessageReceiptStatus { | ||
|  |         let (status, _ ) = receiptStatusAndMessage(outgoingMessage: outgoingMessage) | ||
| 
											8 years ago
										 |         return status | ||
| 
											8 years ago
										 |     } | ||
| 
											7 years ago
										 | 
 | ||
|  |     @objc | ||
|  |     public class func description(forMessageReceiptStatus value: MessageReceiptStatus) -> String { | ||
|  |         switch(value) { | ||
|  |         case .read: | ||
|  |             return "read" | ||
|  |         case .uploading: | ||
|  |             return "uploading" | ||
|  |         case .delivered: | ||
|  |             return "delivered" | ||
|  |         case .sent: | ||
|  |             return "sent" | ||
|  |         case .sending: | ||
|  |             return "sending" | ||
|  |         case .failed: | ||
|  |             return "failed" | ||
|  |         case .skipped: | ||
|  |             return "skipped" | ||
|  |         } | ||
|  |     } | ||
| 
											8 years ago
										 | } |