diff --git a/ElementX/Sources/Other/SwiftUI/Views/RoomInviterLabel.swift b/ElementX/Sources/Other/SwiftUI/Views/RoomInviterLabel.swift index 17ad05bb81..6a11dfac21 100644 --- a/ElementX/Sources/Other/SwiftUI/Views/RoomInviterLabel.swift +++ b/ElementX/Sources/Other/SwiftUI/Views/RoomInviterLabel.swift @@ -58,6 +58,7 @@ struct RoomInviterLabel: View { avatarSize: .custom(16), imageProvider: imageProvider) .alignmentGuide(.firstTextBaseline) { $0[.bottom] * 0.8 } + .accessibilityHidden(true) Text(inviter.attributedInviteText) } diff --git a/ElementX/Sources/Screens/HomeScreen/View/HomeScreenInviteCell.swift b/ElementX/Sources/Screens/HomeScreen/View/HomeScreenInviteCell.swift index b3140b3032..ed2ee011aa 100644 --- a/ElementX/Sources/Screens/HomeScreen/View/HomeScreenInviteCell.swift +++ b/ElementX/Sources/Screens/HomeScreen/View/HomeScreenInviteCell.swift @@ -57,14 +57,18 @@ struct HomeScreenInviteCell: View { private var mainContent: some View { VStack(alignment: .leading, spacing: 0) { - HStack(alignment: .firstTextBaseline, spacing: 16) { - textualContent - badge + VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .firstTextBaseline, spacing: 16) { + textualContent + badge + } + + inviterView + .padding(.top, 6) + .padding(.trailing, 16) } - - inviterView - .padding(.top, 6) - .padding(.trailing, 16) + .fixedSize(horizontal: false, vertical: true) + .accessibilityElement(children: .combine) buttons .padding(.top, 14) diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift index 77d9bcc479..9a52fde414 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift @@ -109,6 +109,7 @@ enum RoomScreenViewAction { case itemDisappeared(itemID: TimelineItemIdentifier) case itemTapped(itemID: TimelineItemIdentifier) + case itemSendInfoTapped(itemID: TimelineItemIdentifier) case toggleReaction(key: String, itemID: TimelineItemIdentifier) case sendReadReceiptIfNeeded(TimelineItemIdentifier) case paginateBackwards @@ -241,6 +242,8 @@ struct ReadReceiptSummaryInfo: Identifiable { enum RoomScreenAlertInfoType: Hashable { case audioRecodingPermissionError case pollEndConfirmation(String) + case sendingFailed + case encryptionAuthenticity(String) } struct RoomMemberState { diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index 2698452c2f..2e282300b7 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -169,6 +169,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol case .itemTapped(let id): Task { await handleItemTapped(with: id) } + case .itemSendInfoTapped(let itemID): + handleItemSendInfoTapped(itemID: itemID) case .toggleReaction(let emoji, let itemId): Task { await timelineController.toggleReaction(emoji, to: itemId) } case .sendReadReceiptIfNeeded(let lastVisibleItemID): @@ -607,6 +609,23 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol } state.showLoading = false } + + private func handleItemSendInfoTapped(itemID: TimelineItemIdentifier) { + guard let timelineItem = timelineController.timelineItems.firstUsingStableID(itemID) else { + MXLog.warning("Couldn't find timeline item.") + return + } + + guard let eventTimelineItem = timelineItem as? EventBasedTimelineItemProtocol else { + fatalError("Only events can have send info.") + } + + if eventTimelineItem.properties.deliveryStatus == .sendingFailed { + displayAlert(.sendingFailed) + } else if let authenticityMessage = eventTimelineItem.properties.encryptionAuthenticity?.message { + displayAlert(.encryptionAuthenticity(authenticityMessage)) + } + } private func sendCurrentMessage(_ message: String, html: String?, mode: RoomScreenComposerMode, intentionalMentions: IntentionalMentions) async { guard !message.isEmpty else { @@ -851,6 +870,14 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol message: L10n.commonPollEndConfirmation, primaryButton: .init(title: L10n.actionCancel, role: .cancel, action: nil), secondaryButton: .init(title: L10n.actionOk, action: { self.roomScreenInteractionHandler.endPoll(pollStartID: pollStartID) })) + case .sendingFailed: + state.bindings.alertInfo = .init(id: type, + title: L10n.commonSendingFailed, + primaryButton: .init(title: L10n.actionOk, action: nil)) + case .encryptionAuthenticity(let message): + state.bindings.alertInfo = .init(id: type, + title: message, + primaryButton: .init(title: L10n.actionOk, action: nil)) } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/ItemMenu/TimelineItemMenu.swift b/ElementX/Sources/Screens/RoomScreen/View/ItemMenu/TimelineItemMenu.swift index 29d612f55f..13cc9ef4b5 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/ItemMenu/TimelineItemMenu.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/ItemMenu/TimelineItemMenu.swift @@ -29,7 +29,7 @@ struct TimelineItemMenu: View { var body: some View { VStack(spacing: 8) { - header + messagePreview .frame(idealWidth: 300.0) Divider() @@ -63,34 +63,44 @@ struct TimelineItemMenu: View { .presentationDragIndicator(.visible) } - private var header: some View { - HStack(alignment: .top, spacing: 0.0) { - LoadableAvatarImage(url: item.sender.avatarURL, - name: item.sender.displayName, - contentID: item.sender.id, - avatarSize: .user(on: .timeline), - imageProvider: context.imageProvider) - - Spacer(minLength: 8.0) - - VStack(alignment: .leading, spacing: 0) { - Text(item.sender.displayName ?? item.sender.id) - .font(.compound.bodySMSemibold) - .foregroundColor(.compound.textPrimary) - .textSelection(.enabled) + private var messagePreview: some View { + VStack(alignment: .leading, spacing: 20) { + HStack(alignment: .top, spacing: 0.0) { + LoadableAvatarImage(url: item.sender.avatarURL, + name: item.sender.displayName, + contentID: item.sender.id, + avatarSize: .user(on: .timeline), + imageProvider: context.imageProvider) + .accessibilityHidden(true) + + Spacer(minLength: 8.0) + + VStack(alignment: .leading, spacing: 0) { + Text(item.sender.displayName ?? item.sender.id) + .font(.compound.bodySMSemibold) + .foregroundColor(.compound.textPrimary) + .textSelection(.enabled) + + Text(item.timelineMenuDescription) + .font(.compound.bodyMD) + .foregroundColor(.compound.textSecondary) + .lineLimit(1) + } + .frame(maxWidth: .infinity, alignment: .leading) + + Spacer(minLength: 16.0) - Text(item.timelineMenuDescription) - .font(.compound.bodyMD) + Text(item.timestamp) + .font(.compound.bodyXS) .foregroundColor(.compound.textSecondary) - .lineLimit(1) } - .frame(maxWidth: .infinity, alignment: .leading) + .accessibilityElement(children: .combine) - Spacer(minLength: 16.0) - - Text(item.timestamp) - .font(.compound.bodyXS) - .foregroundColor(.compound.textSecondary) + if let authenticity = item.properties.encryptionAuthenticity { + Label(authenticity.message, icon: authenticity.icon, iconSize: .small, relativeTo: .compound.bodySMSemibold) + .font(.compound.bodySMSemibold) + .foregroundStyle(authenticity.foregroundStyle) + } } .padding(.horizontal) .padding(.top, 32.0) @@ -169,23 +179,54 @@ struct TimelineItemMenu: View { } } +private extension EncryptionAuthenticity { + var foregroundStyle: SwiftUI.Color { + switch color { + case .red: .compound.textCriticalPrimary + case .gray: .compound.textSecondary + } + } +} + +// MARK: - Previews + struct TimelineItemMenu_Previews: PreviewProvider, TestablePreview { static let viewModel = RoomScreenViewModel.mock + static let (item, actions) = makeItem() + static let (backupItem, _) = makeItem(authenticity: .notGuaranteed(color: .gray)) + static let (unencryptedItem, _) = makeItem(authenticity: .sentInClear(color: .red)) static var previews: some View { - testView + TimelineItemMenu(item: item, actions: actions) + .environmentObject(viewModel.context) .previewDisplayName("With button shapes off") - testView + + TimelineItemMenu(item: item, actions: actions) + .environmentObject(viewModel.context) .environment(\._accessibilityShowButtonShapes, true) .previewDisplayName("With button shapes on") + + TimelineItemMenu(item: backupItem, actions: actions) + .environmentObject(viewModel.context) + .previewDisplayName("Authenticity not guaranteed") + + TimelineItemMenu(item: unencryptedItem, actions: actions) + .environmentObject(viewModel.context) + .previewDisplayName("Unencrypted") } - @ViewBuilder - static var testView: some View { - if let item = RoomTimelineItemFixtures.singleMessageChunk.first as? EventBasedTimelineItemProtocol, - let actions = TimelineItemMenuActions(isReactable: true, actions: [.copy, .edit, .reply(isThread: false), .pin, .redact], debugActions: [.viewSource]) { - TimelineItemMenu(item: item, actions: actions) - .environmentObject(viewModel.context) + static func makeItem(authenticity: EncryptionAuthenticity? = nil) -> (TextRoomTimelineItem, TimelineItemMenuActions)! { + guard var item = RoomTimelineItemFixtures.singleMessageChunk.first as? TextRoomTimelineItem, + let actions = TimelineItemMenuActions(isReactable: true, + actions: [.copy, .edit, .reply(isThread: false), .pin, .redact], + debugActions: [.viewSource]) else { + return nil + } + + if let authenticity { + item.properties.encryptionAuthenticity = authenticity } + + return (item, actions) } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift index cf5ddb862c..0883697852 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift @@ -157,7 +157,7 @@ struct TimelineItemBubbledStylerView: View { var messageBubble: some View { contentWithReply - .timelineItemSendInfo(timelineItem: timelineItem, adjustedDeliveryStatus: adjustedDeliveryStatus) + .timelineItemSendInfo(timelineItem: timelineItem, adjustedDeliveryStatus: adjustedDeliveryStatus, context: context) .bubbleStyle(insets: timelineItem.bubbleInsets, color: timelineItem.bubbleBackgroundColor, corners: roundedCorners) diff --git a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemSendInfoLabel.swift b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemSendInfoLabel.swift index 834fc0d62e..d12b7d37fb 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemSendInfoLabel.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemSendInfoLabel.swift @@ -20,15 +20,18 @@ import SwiftUI extension View { /// Adds the send info (timestamp along indicators for edits and delivery/encryption issues) for the given timeline item to this view. func timelineItemSendInfo(timelineItem: EventBasedTimelineItemProtocol, - adjustedDeliveryStatus: TimelineItemDeliveryStatus?) -> some View { + adjustedDeliveryStatus: TimelineItemDeliveryStatus?, + context: RoomScreenViewModel.Context) -> some View { modifier(TimelineItemSendInfoModifier(sendInfo: .init(timelineItem: timelineItem, - adjustedDeliveryStatus: adjustedDeliveryStatus))) + adjustedDeliveryStatus: adjustedDeliveryStatus), + context: context)) } } /// Adds the send info to a view with the correct layout. private struct TimelineItemSendInfoModifier: ViewModifier { let sendInfo: TimelineItemSendInfo + let context: RoomScreenViewModel.Context var layout: AnyLayout { switch sendInfo.layoutType { @@ -44,7 +47,15 @@ private struct TimelineItemSendInfoModifier: ViewModifier { func body(content: Content) -> some View { layout { content + TimelineItemSendInfoLabel(sendInfo: sendInfo) + .contentShape(.rect) + // Tap gesture to avoid the message being detected as a button by VoiceOver + // (and the action shows a description that is already read to the user). + .onTapGesture { + guard sendInfo.status != nil else { return } + context.send(viewAction: .itemSendInfoTapped(itemID: sendInfo.itemID)) + } } } } @@ -55,26 +66,17 @@ private struct TimelineItemSendInfoLabel: View { var statusIcon: KeyPath? { switch sendInfo.status { - case .sendingFailed: - \.error - case .encryptionAuthenticity(.notGuaranteed): - \.infoSolid - case .encryptionAuthenticity(.unknownDevice), - .encryptionAuthenticity(.unsignedDevice), - .encryptionAuthenticity(.unverifiedIdentity), - .encryptionAuthenticity(.sentInClear): - \.lockOff - case .none: - nil + case .sendingFailed: \.error + case .encryptionAuthenticity(let authenticity): authenticity.icon + case .none: nil } } var statusIconAccessibilityLabel: String? { switch sendInfo.status { case .sendingFailed: L10n.commonSendingFailed - case .none: nil - // Temporary testing strings. case .encryptionAuthenticity(let authenticity): authenticity.message + case .none: nil } } @@ -104,9 +106,10 @@ private struct TimelineItemSendInfoLabel: View { HStack(spacing: 4) { Text(sendInfo.localizedString) - if let statusIcon, let statusIconAccessibilityLabel { + if let statusIcon { CompoundIcon(statusIcon, size: .xSmall, relativeTo: .compound.bodyXS) - .accessibilityLabel(statusIconAccessibilityLabel) + .accessibilityLabel(statusIconAccessibilityLabel ?? "") + .accessibilityHidden(statusIconAccessibilityLabel == nil) } } .font(.compound.bodyXS) @@ -125,6 +128,7 @@ private struct TimelineItemSendInfo { case overlay(capsuleStyle: Bool) } + let itemID: TimelineItemIdentifier let localizedString: String var status: Status? let layoutType: LayoutType @@ -143,6 +147,7 @@ private struct TimelineItemSendInfo { private extension TimelineItemSendInfo { init(timelineItem: EventBasedTimelineItemProtocol, adjustedDeliveryStatus: TimelineItemDeliveryStatus?) { + itemID = timelineItem.id localizedString = timelineItem.localizedSendInfo status = if adjustedDeliveryStatus == .sendingFailed { @@ -172,18 +177,9 @@ private extension TimelineItemSendInfo { private extension EncryptionAuthenticity { var foregroundStyle: SwiftUI.Color { - switch self { - case .notGuaranteed(let color), - .unknownDevice(let color), - .unsignedDevice(let color), - .unverifiedIdentity(let color), - .sentInClear(let color): - switch color { - case .red: - .compound.textCriticalPrimary - case .gray: - .compound.textSecondary - } + switch color { + case .red: .compound.textCriticalPrimary + case .gray: .compound.textSecondary } } } @@ -193,20 +189,25 @@ private extension EncryptionAuthenticity { struct TimelineItemSendInfoLabel_Previews: PreviewProvider, TestablePreview { static var previews: some View { VStack(spacing: 16) { - TimelineItemSendInfoLabel(sendInfo: .init(localizedString: "09:47 AM", + TimelineItemSendInfoLabel(sendInfo: .init(itemID: .random, + localizedString: "09:47 AM", layoutType: .horizontal())) - TimelineItemSendInfoLabel(sendInfo: .init(localizedString: "09:47 AM", + TimelineItemSendInfoLabel(sendInfo: .init(itemID: .random, + localizedString: "09:47 AM", status: .sendingFailed, layoutType: .horizontal())) - TimelineItemSendInfoLabel(sendInfo: .init(localizedString: "09:47 AM", + TimelineItemSendInfoLabel(sendInfo: .init(itemID: .random, + localizedString: "09:47 AM", status: .encryptionAuthenticity(.unsignedDevice(color: .red)), layoutType: .horizontal())) - TimelineItemSendInfoLabel(sendInfo: .init(localizedString: "09:47 AM", + TimelineItemSendInfoLabel(sendInfo: .init(itemID: .random, + localizedString: "09:47 AM", status: .encryptionAuthenticity(.notGuaranteed(color: .gray)), layoutType: .horizontal())) -// TimelineItemSendInfoLabel(sendInfo: .init(localizedString: "09:47 AM", -// status: .unencrypted, -// layoutType: .horizontal())) + TimelineItemSendInfoLabel(sendInfo: .init(itemID: .random, + localizedString: "09:47 AM", + status: .encryptionAuthenticity(.sentInClear(color: .red)), + layoutType: .horizontal())) } } } diff --git a/ElementX/Sources/Services/Timeline/TimelineItemContent/EncryptionAuthenticity.swift b/ElementX/Sources/Services/Timeline/TimelineItemContent/EncryptionAuthenticity.swift index fef91f098e..6966e1760f 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItemContent/EncryptionAuthenticity.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItemContent/EncryptionAuthenticity.swift @@ -14,8 +14,9 @@ // limitations under the License. // -import Foundation +import Compound import MatrixRustSDK +import SwiftUI /// Represents and issue with a timeline item's authenticity such as coming from an /// unsigned session or being sent unencrypted in an encrypted room. See Rust's @@ -43,6 +44,25 @@ enum EncryptionAuthenticity: Hashable { L10n.eventShieldReasonSentInClear } } + + var color: Color { + switch self { + case .notGuaranteed(let color), + .unknownDevice(let color), + .unsignedDevice(let color), + .unverifiedIdentity(let color), + .sentInClear(let color): + color + } + } + + var icon: KeyPath { + // TODO: Should sentInClear have a dedicated icon??? + switch color { + case .red: \.error + case .gray: \.info + } + } } extension EncryptionAuthenticity { diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPad-en-GB.Encryption-Indicators.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPad-en-GB.Encryption-Indicators.png index 489f113889..84a226e845 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPad-en-GB.Encryption-Indicators.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPad-en-GB.Encryption-Indicators.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cfcaff9f0d5680fc4dbb30c906b8ce84213b6a41f6b4fb52c2ec256902fce350 -size 437852 +oid sha256:f8ef2a2f846c6906a4cef21d909c3cf6b989a13b488a7d0ee530c4b29b1617c1 +size 438499 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPad-pseudo.Encryption-Indicators.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPad-pseudo.Encryption-Indicators.png index e97cd1fe45..7a168fef77 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPad-pseudo.Encryption-Indicators.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPad-pseudo.Encryption-Indicators.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec285cfbd7793fa8feca3e8869b776f64214b3cfd116bb6e77d9f4149732625a -size 440028 +oid sha256:6274dbd83240ee4197699683c66b2f0e7b22490b5d4d904aa92f653eb7bc5847 +size 440632 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPhone-15-en-GB.Encryption-Indicators.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPhone-15-en-GB.Encryption-Indicators.png index 39476b5fa5..4d558b4953 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPhone-15-en-GB.Encryption-Indicators.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPhone-15-en-GB.Encryption-Indicators.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cb717b5c2f4c5e5dc9f0a473934bb237eebad19e401ea08353a62d5567d99fc3 -size 343142 +oid sha256:07184e8192f4e80a0fb9fda161d0966c30858f17dacf43843f36bfc6a5c807de +size 343391 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPhone-15-pseudo.Encryption-Indicators.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPhone-15-pseudo.Encryption-Indicators.png index 2334be92ff..9d424a30bf 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPhone-15-pseudo.Encryption-Indicators.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemBubbledStylerView-iPhone-15-pseudo.Encryption-Indicators.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8613ae1955fd57f8536f51e46b87913b0c6f156d8cff7db6a3e6f7f18846896 -size 344422 +oid sha256:4571579a42406d66a4a61d91b79b6809e376dc95910a6e07d582f23fa99ac15f +size 344668 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-en-GB.Authenticity-not-guaranteed.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-en-GB.Authenticity-not-guaranteed.png new file mode 100644 index 0000000000..91ab0bee36 --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-en-GB.Authenticity-not-guaranteed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a814e87ba746f5d1590bc620afae3d473eab3497875da9f56fa1f5aceb6b593 +size 139034 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-en-GB.Unencrypted.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-en-GB.Unencrypted.png new file mode 100644 index 0000000000..a115772831 --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-en-GB.Unencrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6418fe1b15eb9f94ef1e4f1329508788d1df9616b24760a26ec7c0317d75546 +size 131913 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-pseudo.Authenticity-not-guaranteed.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-pseudo.Authenticity-not-guaranteed.png new file mode 100644 index 0000000000..736724f173 --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-pseudo.Authenticity-not-guaranteed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc5eb6e01de2c2e7b57683ffa0881a300b073c1b0517d96dbc477689e2e4f2e7 +size 146246 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-pseudo.Unencrypted.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-pseudo.Unencrypted.png new file mode 100644 index 0000000000..71899d5643 --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPad-pseudo.Unencrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfce5e379a6235cd954ae464fea78a419bb210b799b1df5a21cdc172e4233e3e +size 134505 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-en-GB.Authenticity-not-guaranteed.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-en-GB.Authenticity-not-guaranteed.png new file mode 100644 index 0000000000..455ec6afbb --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-en-GB.Authenticity-not-guaranteed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32ef4ab70c1c611b8022a85855cbc3f0483aeb8b794bc31403dbdeeb417dca3f +size 91903 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-en-GB.Unencrypted.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-en-GB.Unencrypted.png new file mode 100644 index 0000000000..925fafd8f2 --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-en-GB.Unencrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73da91674825a74fd803055253153543cf8b6985a670a46521897dd06db47851 +size 83950 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-pseudo.Authenticity-not-guaranteed.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-pseudo.Authenticity-not-guaranteed.png new file mode 100644 index 0000000000..89961f7daf --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-pseudo.Authenticity-not-guaranteed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:011c4ce8721d2d12fd159b9451e06f03419543ad6744c7c2ec2f977f46803687 +size 107558 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-pseudo.Unencrypted.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-pseudo.Unencrypted.png new file mode 100644 index 0000000000..4012e9ab2c --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemMenu-iPhone-15-pseudo.Unencrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7532e6e65ed00921a92b7d6c431485907f7b26bbf193ea3ecc75848566f660ec +size 89746 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPad-en-GB.1.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPad-en-GB.1.png index 47a1d61850..9e6ed9a527 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPad-en-GB.1.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPad-en-GB.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d8a4a63fd7a948b134d02a405070c038116405d6b19f7ab45930d8d8fe25d66c -size 78530 +oid sha256:897afefdd96515ac7269c760ebe56cbeaff0834f023caf384365439ae0838b8d +size 81737 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPad-pseudo.1.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPad-pseudo.1.png index 47a1d61850..9e6ed9a527 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPad-pseudo.1.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPad-pseudo.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d8a4a63fd7a948b134d02a405070c038116405d6b19f7ab45930d8d8fe25d66c -size 78530 +oid sha256:897afefdd96515ac7269c760ebe56cbeaff0834f023caf384365439ae0838b8d +size 81737 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPhone-15-en-GB.1.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPhone-15-en-GB.1.png index 132c59a02e..db76091627 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPhone-15-en-GB.1.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPhone-15-en-GB.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67533013d6b66f5256e00fbb7ee684f4ec364f640d10a9209dc14f067aa31905 -size 36782 +oid sha256:82cb8d10fb5922d8fd6a69cae52509f5b493ba95c626f90df2ba3dec23ed5317 +size 39063 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPhone-15-pseudo.1.png b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPhone-15-pseudo.1.png index 132c59a02e..db76091627 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPhone-15-pseudo.1.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_timelineItemSendInfoLabel-iPhone-15-pseudo.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67533013d6b66f5256e00fbb7ee684f4ec364f640d10a9209dc14f067aa31905 -size 36782 +oid sha256:82cb8d10fb5922d8fd6a69cae52509f5b493ba95c626f90df2ba3dec23ed5317 +size 39063