Hoist some attachment files into SignalUI

This commit is contained in:
Max Radermacher 2025-12-11 13:35:08 -06:00 committed by GitHub
parent e84fe860d0
commit 8c3fbbdca3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 58 additions and 60 deletions

View File

@ -580,8 +580,6 @@
501052692BDB232A0097DDC5 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 501052682BDB232A0097DDC5 /* PrivacyInfo.xcprivacy */; };
5010526B2BDB23F50097DDC5 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 5010526A2BDB23F50097DDC5 /* PrivacyInfo.xcprivacy */; };
5010B6B42C6BD41E00314CD4 /* PreKeyBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5010B6B32C6BD41E00314CD4 /* PreKeyBundle.swift */; };
5011C8D82ED77478005DF488 /* SendableAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5011C8D72ED77478005DF488 /* SendableAttachment.swift */; };
5011C8DA2ED77482005DF488 /* PreviewableAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5011C8D92ED77482005DF488 /* PreviewableAttachment.swift */; };
5011D1CB293FC7E000064098 /* DomainFrontingCountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5011D1CA293FC7E000064098 /* DomainFrontingCountryViewController.swift */; };
5011D9702A0429B6000FE8E5 /* ThreadMergerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5011D96F2A0429B6000FE8E5 /* ThreadMergerTest.swift */; };
5011D9722A04720E000FE8E5 /* OWSOrphanDataCleaner.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9CC66C02937B71E002172D0 /* OWSOrphanDataCleaner.swift */; };
@ -641,6 +639,9 @@
50468F2529EDD46500948E02 /* ParamParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EF7FC2107DDEE0007EBF7 /* ParamParserTest.swift */; };
50468F2929EE130A00948E02 /* InteractionStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50468F2829EE130A00948E02 /* InteractionStore.swift */; };
50468F2B29EE19C300948E02 /* PhoneNumberChangedMessageInserterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50468F2A29EE19C300948E02 /* PhoneNumberChangedMessageInserterTest.swift */; };
504861A92EEB4D0700B13C49 /* PreviewableAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5011C8D92ED77482005DF488 /* PreviewableAttachment.swift */; };
504861AA2EEB4D0D00B13C49 /* SendableAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5011C8D72ED77478005DF488 /* SendableAttachment.swift */; };
504861AB2EEB4D1500B13C49 /* SignalAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D913491F62D4A500722898 /* SignalAttachment.swift */; };
5049FA2F28BEAABE00D6E099 /* ContactDiscoveryV2Operation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5049FA2D28BEAABE00D6E099 /* ContactDiscoveryV2Operation.swift */; };
504F397C29D23B1700E849A6 /* ValidatedIncomingEnvelope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504F397B29D23B1700E849A6 /* ValidatedIncomingEnvelope.swift */; };
504F98B12EAFFAC600DF465B /* KyberPreKeyUseRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504F98B02EAFFAC600DF465B /* KyberPreKeyUseRecord.swift */; };
@ -919,7 +920,6 @@
6642A8792A8D85F500E591C2 /* OWSPaymentActivationRequestMessage+SDS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6642A8772A8D85F500E591C2 /* OWSPaymentActivationRequestMessage+SDS.swift */; };
6642A87A2A8D85F500E591C2 /* OWSPaymentActivationRequestFinishedMessage+SDS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6642A8782A8D85F500E591C2 /* OWSPaymentActivationRequestFinishedMessage+SDS.swift */; };
6642A87C2A8EB0D800E591C2 /* TSPaymentsActivationRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6642A87B2A8EB0D800E591C2 /* TSPaymentsActivationRequestModel.swift */; };
664428962C12305D0092D0E2 /* SignalAttachment+Sending.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664428952C12305D0092D0E2 /* SignalAttachment+Sending.swift */; };
6645F30829BF8D2000B58EBD /* AccountAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6645F30729BF8D2000B58EBD /* AccountAttributes.swift */; };
6645F30A29BF8DBC00B58EBD /* AccountAttributesRequestFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6645F30929BF8DBC00B58EBD /* AccountAttributesRequestFactory.swift */; };
6645F30C29BFA28A00B58EBD /* AccountAttributesGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6645F30B29BFA28A00B58EBD /* AccountAttributesGenerator.swift */; };
@ -1361,7 +1361,6 @@
725465642BA0369D00EABFD2 /* AppSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5033D46A29DB9F17007FEADA /* AppSetup.swift */; };
72552EF42C9EF9EC008614AF /* OWSIdentity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72552EF32C9EF9E7008614AF /* OWSIdentity.swift */; };
7255A4C42B98D81000E95368 /* Usernames+BetterIdentifierChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C2D777299B07D300D79715 /* Usernames+BetterIdentifierChecker.swift */; };
7255A4C72B98DEFB00E95368 /* SignalAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D913491F62D4A500722898 /* SignalAttachment.swift */; };
7255A4C82B98DF3E00E95368 /* FailedStorySendDisplayController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66C336D02A994B97000F4F50 /* FailedStorySendDisplayController.swift */; };
7255A4C92B98DF5500E95368 /* VoiceMessageConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 503AECC929B2B22E00642F66 /* VoiceMessageConstants.swift */; };
7255A4CA2B98DF5500E95368 /* VoiceMessageInterruptedDraftStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3402AABE271DA2720084CBAE /* VoiceMessageInterruptedDraftStore.swift */; };
@ -5094,7 +5093,6 @@
6642A8772A8D85F500E591C2 /* OWSPaymentActivationRequestMessage+SDS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OWSPaymentActivationRequestMessage+SDS.swift"; sourceTree = "<group>"; };
6642A8782A8D85F500E591C2 /* OWSPaymentActivationRequestFinishedMessage+SDS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OWSPaymentActivationRequestFinishedMessage+SDS.swift"; sourceTree = "<group>"; };
6642A87B2A8EB0D800E591C2 /* TSPaymentsActivationRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPaymentsActivationRequestModel.swift; sourceTree = "<group>"; };
664428952C12305D0092D0E2 /* SignalAttachment+Sending.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SignalAttachment+Sending.swift"; sourceTree = "<group>"; };
6645F30729BF8D2000B58EBD /* AccountAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountAttributes.swift; sourceTree = "<group>"; };
6645F30929BF8DBC00B58EBD /* AccountAttributesRequestFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountAttributesRequestFactory.swift; sourceTree = "<group>"; };
6645F30B29BFA28A00B58EBD /* AccountAttributesGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountAttributesGenerator.swift; sourceTree = "<group>"; };
@ -10893,10 +10891,6 @@
children = (
509085BD2C49C29400409B85 /* PaddingBucket.swift */,
509085BF2C49C2A500409B85 /* PaddingBucketTest.swift */,
5011C8D92ED77482005DF488 /* PreviewableAttachment.swift */,
5011C8D72ED77478005DF488 /* SendableAttachment.swift */,
664428952C12305D0092D0E2 /* SignalAttachment+Sending.swift */,
34D913491F62D4A500722898 /* SignalAttachment.swift */,
);
path = Attachments;
sourceTree = "<group>";
@ -11676,6 +11670,9 @@
B99CD9422DA99A1F0035C77B /* Attachments */ = {
isa = PBXGroup;
children = (
5011C8D92ED77482005DF488 /* PreviewableAttachment.swift */,
5011C8D72ED77478005DF488 /* SendableAttachment.swift */,
34D913491F62D4A500722898 /* SignalAttachment.swift */,
B99CD9432DA9AB530035C77B /* TypedItemProvider.swift */,
);
path = Attachments;
@ -17487,6 +17484,7 @@
3465F4D527287677001663AF /* PaymentsReconciliation.swift in Sources */,
3402AA79271D9E180084CBAE /* PermissiveGestureRecognizer.swift in Sources */,
501E78622CFE3E2700FD56C4 /* PhoneNumberCountry.swift in Sources */,
504861A92EEB4D0700B13C49 /* PreviewableAttachment.swift in Sources */,
32FAB92A2727A57100FB76A6 /* PrimaryImageView.swift in Sources */,
B92E76AB2B6871520095C4DF /* ProfileDetailLabel.swift in Sources */,
764FE0452A2F0C0F004D2804 /* QuotedReplyModel.swift in Sources */,
@ -17509,8 +17507,10 @@
50597BBF2B97D629004681E1 /* SearchableNameFinder.swift in Sources */,
66FC638E29EDABAC00F00DAC /* SearchDisplayConfigurations.swift in Sources */,
66FBC4E328DA82AA00BD9E8B /* SelectMyStoryRecipientsViewController.swift in Sources */,
504861AA2EEB4D0D00B13C49 /* SendableAttachment.swift in Sources */,
B9A53B932CF7928A0000578B /* SheetPreviewViewController.swift in Sources */,
3402AA3C271D9DCD0084CBAE /* SheetViewController.swift in Sources */,
504861AB2EEB4D1500B13C49 /* SignalAttachment.swift in Sources */,
B9E322E72CD170ED006DAF3B /* SignalList.swift in Sources */,
B9F817642BA263A900EAEE23 /* SignalSymbols.swift in Sources */,
342FFE57271DA8C9000AC89F /* Sounds+SignalUI.swift in Sources */,
@ -19286,7 +19286,6 @@
6681AB652B7AE53B0099D187 /* PreloadedTextAttachment.swift in Sources */,
7254653B2BA01FCC00EABFD2 /* PreparedGiftPayment.swift in Sources */,
664BA8452BB5CE12005638E0 /* PreparedOutgoingMessage.swift in Sources */,
5011C8DA2ED77482005DF488 /* PreviewableAttachment.swift in Sources */,
D9CA614B2C2F675E00F99EA3 /* PrivateStoryThreadDeletionManager.swift in Sources */,
725465452BA01FCC00EABFD2 /* ProfileBadgesSnapshot+Constructors.swift in Sources */,
D995546F2AF5668E0001E15C /* ProfileBadgesSnapshot.swift in Sources */,
@ -19387,7 +19386,6 @@
66138FB6298326C7002E0CFE /* SecureValueRecovery.swift in Sources */,
662C440B2A156DF7001F83E2 /* SecureValueRecovery2Impl.swift in Sources */,
6691E7F72996EAD70032A68A /* SecureValueRecoveryMock.swift in Sources */,
5011C8D82ED77478005DF488 /* SendableAttachment.swift in Sources */,
F9C5CD37289453B300548EEE /* SenderKeyStore.swift in Sources */,
725465392BA01FAA00EABFD2 /* SendGiftBadgeJobQueue.swift in Sources */,
D9AE0AD5291877600063488B /* SendGiftBadgeJobRecord.swift in Sources */,
@ -19415,8 +19413,6 @@
F9C5CCDD289453B300548EEE /* SignalAccountFinder.swift in Sources */,
50EF8DD52A1FE55D00A00935 /* SignalAccountMergeObserver.swift in Sources */,
50597BBA2B97C38C004681E1 /* SignalAccountStore.swift in Sources */,
664428962C12305D0092D0E2 /* SignalAttachment+Sending.swift in Sources */,
7255A4C72B98DEFB00E95368 /* SignalAttachment.swift in Sources */,
F9C5CC8F289453B300548EEE /* SignalIOS.pb.swift in Sources */,
F9C5CC9E289453B300548EEE /* SignalIOSProto.swift in Sources */,
725465382BA01FAA00EABFD2 /* SignalMessagingJobQueues.swift in Sources */,

View File

@ -5,6 +5,7 @@
import Foundation
import SignalServiceKit
import SignalUI
enum SignalAttachmentCloner {
static func cloneAsSignalAttachment(attachment: ReferencedAttachmentStream) throws -> PreviewableAttachment {

View File

@ -6,6 +6,7 @@
import CoreServices
import Foundation
import SignalServiceKit
import SignalUI
import UniformTypeIdentifiers
protocol VoiceMessageSendableDraft {

View File

@ -12,7 +12,7 @@ import Contacts
import CoreLocation
import CoreServices
public import MapKit
public import SignalServiceKit
import SignalServiceKit
import SignalUI
import UniformTypeIdentifiers
@ -475,7 +475,7 @@ public class Location: NSObject {
self.placemark = placemark
}
public func prepareAttachment() async throws -> SendableAttachment {
func prepareAttachment() async throws -> SendableAttachment {
let image = try await generateSnapshot()
guard let jpegData = image.jpegData(compressionQuality: 1.0) else {
throw LocationError.assertion

View File

@ -7,6 +7,7 @@ import CoreServices
import Foundation
import Photos
import SignalServiceKit
import SignalUI
protocol PhotoLibraryDelegate: AnyObject {
func photoLibraryDidChange(_ photoLibrary: PhotoLibrary)

View File

@ -6,6 +6,7 @@
import XCTest
import CoreServices
import SignalServiceKit
import SignalUI
import UniformTypeIdentifiers
class SignalAttachmentTest: SignalBaseTest {

View File

@ -1,30 +0,0 @@
//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
extension SendableAttachment {
public struct ForSending {
public let dataSource: AttachmentDataSource
public let renderingFlag: AttachmentReference.RenderingFlag
public init(dataSource: AttachmentDataSource, renderingFlag: AttachmentReference.RenderingFlag) {
self.dataSource = dataSource
self.renderingFlag = renderingFlag
}
}
public func forSending(attachmentContentValidator: any AttachmentContentValidator) async throws -> ForSending {
let dataSource = try await attachmentContentValidator.validateContents(
sendableAttachment: self,
shouldUseDefaultFilename: true,
)
return ForSending(
dataSource: dataSource,
renderingFlag: self.renderingFlag,
)
}
}

View File

@ -183,18 +183,6 @@ public protocol AttachmentContentValidator {
extension AttachmentContentValidator {
public func validateContents(
sendableAttachment: SendableAttachment,
shouldUseDefaultFilename: Bool,
) async throws -> AttachmentDataSource {
return try await validateContents(
dataSource: sendableAttachment.dataSource,
mimeType: sendableAttachment.mimeType,
renderingFlag: sendableAttachment.renderingFlag,
sourceFilename: sendableAttachment.sourceFilename?.rawValue ?? (shouldUseDefaultFilename ? sendableAttachment.defaultFilename : nil),
)
}
public func validateContents(
dataSource: DataSourcePath,
mimeType: String,

View File

@ -71,7 +71,7 @@ public struct ImageMetadata {
public let imageFormat: ImageFormat
public let pixelSize: CGSize
public let hasAlpha: Bool
let isAnimated: Bool
public let isAnimated: Bool
internal init(imageFormat: ImageFormat, pixelSize: CGSize, hasAlpha: Bool, isAnimated: Bool) {
self.imageFormat = imageFormat
@ -80,7 +80,7 @@ public struct ImageMetadata {
self.isAnimated = isAnimated
}
var hasStickerLikeProperties: Bool {
public var hasStickerLikeProperties: Bool {
let maxStickerHeight = CGFloat(512)
return (
pixelSize.width <= maxStickerHeight

View File

@ -4,7 +4,7 @@
//
import Foundation
public import SignalServiceKit
import SignalServiceKit
public class AttachmentApprovalItem {

View File

@ -4,6 +4,7 @@
//
import Foundation
public import SignalServiceKit
/// Represents an attachment the user *might* choose to send.
///

View File

@ -4,6 +4,7 @@
//
import Foundation
public import SignalServiceKit
/// Represents an attachment that's fully valid and ready to send.
///
@ -181,4 +182,41 @@ public struct SendableAttachment {
throw OWSAssertionError("Video segmentation failed with unknown status: \(exportSession.status)")
}
}
// MARK: - ForSending
public struct ForSending {
public let dataSource: AttachmentDataSource
public let renderingFlag: AttachmentReference.RenderingFlag
public init(dataSource: AttachmentDataSource, renderingFlag: AttachmentReference.RenderingFlag) {
self.dataSource = dataSource
self.renderingFlag = renderingFlag
}
}
public func forSending(attachmentContentValidator: any AttachmentContentValidator) async throws -> ForSending {
let dataSource = try await attachmentContentValidator.validateContents(
sendableAttachment: self,
shouldUseDefaultFilename: true,
)
return ForSending(
dataSource: dataSource,
renderingFlag: self.renderingFlag,
)
}
}
extension AttachmentContentValidator {
public func validateContents(
sendableAttachment: SendableAttachment,
shouldUseDefaultFilename: Bool,
) async throws -> AttachmentDataSource {
return try await validateContents(
dataSource: sendableAttachment.dataSource,
mimeType: sendableAttachment.mimeType,
renderingFlag: sendableAttachment.renderingFlag,
sourceFilename: sendableAttachment.sourceFilename?.rawValue ?? (shouldUseDefaultFilename ? sendableAttachment.defaultFilename : nil),
)
}
}

View File

@ -7,6 +7,7 @@ public import AVFoundation
import Foundation
import MobileCoreServices
import SDWebImage
public import SignalServiceKit
public enum SignalAttachmentError: Error {
case missingData