Signal-iOS/SignalServiceKit/src/Messages/TypingIndicatorMessage.swift
Evan Hahn da322d3bf9 Add "urgent" boolean to outgoing messages
To improve message reliability, we're adding an urgency flag to outgoing
messages. For example, outgoing calls are urgent, but delivery receipts
are not. [Android][] and [Desktop][] have already done this work.

At a high level, I added an `isUrgent` property to `TSOutgoingMessage`s.
It defaults to `true`. Some subclasses, like
`OWSReceiptsForSenderMessage`, override it to return `false`.

Builds off of a few other commits (not necessary to understand this
commit, but might be useful for posterity):

- e858a0d916
- 8c6d2ebe8c
- 402b117221
- 2ba0cd764d
- 266a4663e9
- 8e5009bbf7

[Android]: dc04c8ed98
[Desktop]: 06190b1434
2022-08-18 07:35:41 -05:00

101 lines
2.5 KiB
Swift

//
// Copyright (c) 2022 Open Whisper Systems. All rights reserved.
//
import Foundation
@objc(OWSTypingIndicatorAction)
public enum TypingIndicatorAction: Int {
case started
case stopped
}
@objc(OWSTypingIndicatorMessage)
public class TypingIndicatorMessage: TSOutgoingMessage {
private let action: TypingIndicatorAction
// MARK: Initializers
@objc
public init(thread: TSThread,
action: TypingIndicatorAction,
transaction: SDSAnyReadTransaction) {
self.action = action
let builder = TSOutgoingMessageBuilder(thread: thread)
super.init(outgoingMessageWithBuilder: builder, transaction: transaction)
}
@objc
public required init!(coder: NSCoder) {
self.action = .started
super.init(coder: coder)
}
@objc
public required init(dictionary dictionaryValue: [String: Any]!) throws {
self.action = .started
try super.init(dictionary: dictionaryValue)
}
@objc
public override func shouldSyncTranscript() -> Bool {
return false
}
@objc
public override var isOnline: Bool {
return true
}
@objc
public override var isUrgent: Bool { false }
private func protoAction(forAction action: TypingIndicatorAction) -> SSKProtoTypingMessageAction {
switch action {
case .started:
return .started
case .stopped:
return .stopped
}
}
public override func contentBuilder(thread: TSThread,
transaction: SDSAnyReadTransaction) -> SSKProtoContentBuilder? {
let typingBuilder = SSKProtoTypingMessage.builder(timestamp: self.timestamp)
typingBuilder.setAction(protoAction(forAction: action))
if let groupThread = thread as? TSGroupThread {
typingBuilder.setGroupID(groupThread.groupModel.groupId)
}
let contentBuilder = SSKProtoContent.builder()
do {
contentBuilder.setTypingMessage(try typingBuilder.build())
return contentBuilder
} catch let error {
owsFailDebug("failed to build protobuf: \(error)")
return nil
}
}
// MARK: TSYapDatabaseObject overrides
@objc
public override var shouldBeSaved: Bool {
return false
}
@objc
public override var debugDescription: String {
return "typingIndicatorMessage"
}
@objc
override var shouldRecordSendLog: Bool { false }
@objc
override var contentHint: SealedSenderContentHint { .implicit }
}