TM-SGNL-iOS/SignalServiceKit/Messages/Attachments/V2/AttachmentReference/AttachmentReference+RenderingFlag.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

88 lines
2.8 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
extension AttachmentReference {
/// A flag set by the sender of an attachment _on_ a message (or story message)
/// that gives rendering hints to the receiver.
///
/// Not all flags are valid on all attachment/message types. See documentation
/// of cases and ``AttachmentReference.Owner`` for more information.
///
/// NOTE: these are non-mutually exclusive on the proto, but are mutually exclusive
/// in practice; this may change in the future if a new type is added (but we are unlikely
/// to add a new flag type).
public enum RenderingFlag: Int, Codable, Equatable {
/// Set implicitly by default on all attachments unless another value is provided.
case `default` = 0
/// Should be rendered as a voice message; typically recorded by the sender in-app.
/// Only valid for audio attachments.
case voiceMessage = 1
/// Should be rendered inline in chat without any border.
/// Only valid for images. Invalid for story messages.
case borderless = 2
/// The video or animated image should loop when finished playing.
/// Only valid for videos and animated images.
///
/// (Originally named ``SSKProtoAttachmentPointerFlags``.gif, but that's somewhat
/// of a misnomer; it is orthogonal to whether the file type is gif.)
case shouldLoop = 3
init(rawValue: UInt32) throws {
guard
let rawValue = Int(exactly: rawValue),
let value = AttachmentReference.RenderingFlag(rawValue: rawValue)
else {
throw OWSAssertionError("Invalid rendering flag")
}
self = value
}
}
}
extension AttachmentReference.RenderingFlag {
public static func fromProto(_ proto: SSKProtoAttachmentPointer) -> Self {
guard
proto.hasFlags,
let rawValue = Int32.init(exactly: proto.flags)
else {
return .default
}
return .fromProto(.init(rawValue: rawValue))
}
public static func fromProto(_ proto: SSKProtoAttachmentPointerFlags?) -> Self {
switch proto {
case nil:
return .default
case .voiceMessage:
return .voiceMessage
case .borderless:
return .borderless
case .gif:
return .shouldLoop
}
}
public func toProto() -> SSKProtoAttachmentPointerFlags? {
switch self {
case .default:
return nil
case .voiceMessage:
return .voiceMessage
case .borderless:
return .borderless
case .shouldLoop:
return .gif
}
}
}