Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
7ff2044
Add db migration for new columns on OWSReaction and message attachmen…
diaruga777 Mar 12, 2026
4f840a0
Proto changes to service, storageservice, and backup protos
diaruga777 Mar 16, 2026
4329bb0
Run make on protos
diaruga777 Mar 12, 2026
dd99474
Add new sticker fields to OWSReaction
diaruga777 Mar 16, 2026
9f7a150
Add reaction sticker attachment case to AttachmentReference types
diaruga777 Mar 12, 2026
a096470
Deal with sticker reacts in attachment download manager. make the cal…
diaruga777 Mar 12, 2026
1b846dd
Handle deleting refs when reaction is deleted
diaruga777 Mar 12, 2026
494936d
Handle stickers in OutgojngReactionMessage
diaruga777 Mar 17, 2026
a238ccc
Prepared message types for sticker reactions
diaruga777 Mar 12, 2026
64b7455
Handle incoming and outgoing reaction stickers
diaruga777 Mar 17, 2026
73546f6
Piping for story sticker reactions; break apart assumptions that stor…
diaruga777 Mar 14, 2026
55ab9d4
Change custom reaction emoji to include stickers
diaruga777 Mar 15, 2026
2d3ef3a
Sync custom reaction sets with storage service
diaruga777 Mar 16, 2026
e4f98c1
Backups + custom reaction stickers
diaruga777 Mar 16, 2026
1595c95
Backups + story reaction stickers
diaruga777 Mar 16, 2026
0540f54
Backups + sticker reactions
diaruga777 Mar 17, 2026
c626ca2
Make StickerView in SignalUI public
diaruga777 Mar 17, 2026
f62dec2
Quick notification reply doesn't use a sticker
diaruga777 Mar 19, 2026
b7ad336
Load reaction states into InteractionReactionState
diaruga777 Mar 19, 2026
a265af9
Stop using EmojiWithSkinTones in MessageReactionPicker; it only compa…
diaruga777 Mar 20, 2026
b55ec69
Update reaction pickers to show stickers
diaruga777 Mar 20, 2026
7747b01
Save recent reactions with its own ordering
diaruga777 Mar 20, 2026
ae35eda
Show stickers on messages in conversation
diaruga777 Mar 23, 2026
1c54347
Story reply sticker rendering
diaruga777 Mar 24, 2026
948f8a8
Story reply sheet UI for reaction stickers
diaruga777 Mar 24, 2026
c01bf3e
Finishing touches: notification and chat preview text
diaruga777 Mar 24, 2026
bb54156
Finishing touches: story reaction flyby animation
diaruga777 Mar 24, 2026
d8e14f1
Fixup tests
diaruga777 Mar 25, 2026
5e7e519
Protect against empty emoji strings
diaruga777 Mar 25, 2026
bdae9d6
Take it or leave it: tweak reaction view sizes to better suit sticker…
diaruga777 Mar 25, 2026
5db65a1
Fix after rebasing main
diaruga777 Mar 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions Signal.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1537,6 +1537,10 @@
76F4B581293ACCD200A7CF2F /* UIKit+Animations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76F4B580293ACCD200A7CF2F /* UIKit+Animations.swift */; };
76F958632A09A5AE00B43E63 /* DebugUIDiskUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76F958622A09A5AE00B43E63 /* DebugUIDiskUsage.swift */; };
76FCCDBC27AB8FBE00BAA7F0 /* MediaControls.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FCCDBB27AB8FBE00BAA7F0 /* MediaControls.swift */; };
79246E552F6C9CC20085AD50 /* ReactionPickerSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79246E542F6C9CC20085AD50 /* ReactionPickerSheet.swift */; };
79246E592F71E0470085AD50 /* StickerReactionImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79246E582F71E0470085AD50 /* StickerReactionImageCache.swift */; };
797B94E52F677561001C9E24 /* CustomReactionItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 797B94E42F67755A001C9E24 /* CustomReactionItem.swift */; };
79F764502F656A1F001399AF /* StoryReaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79F7644F2F656A1C001399AF /* StoryReaction.swift */; };
83B9573927C9A1FA00A678FD /* CaptchaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83B9573827C9A1FA00A678FD /* CaptchaView.swift */; };
8803FF6628EF89B50023574A /* StorySharingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88F5FA9528EF7E02007AA1BF /* StorySharingTests.swift */; };
8806EF19248DBD7200E764C7 /* NotificationPermissionReminderMegaphone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8806EF18248DBD7200E764C7 /* NotificationPermissionReminderMegaphone.swift */; };
Expand Down Expand Up @@ -3491,7 +3495,7 @@
EC7A9D369AF9724FEEE5B653 /* Pods_SignalUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3F39202F831935AAE1C5F54 /* Pods_SignalUITests.framework */; };
F02564D8274EDF4600D7B48A /* BadgeIssueSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02564D7274EDF4600D7B48A /* BadgeIssueSheet.swift */; };
F05F51C926A90D6B00861034 /* ContextMenuActionsAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = F05F51C826A90D6B00861034 /* ContextMenuActionsAccessory.swift */; };
F090C8202762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F090C81F2762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift */; };
F090C8202762F2C5005C20FC /* CustomReactionPickerConfigViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F090C81F2762F2C5005C20FC /* CustomReactionPickerConfigViewController.swift */; };
F0B872B6269CF6D900D26481 /* ContextMenuInteraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0B872B5269CF6D900D26481 /* ContextMenuInteraction.swift */; };
F0B872B8269D079B00D26481 /* ContextMenuConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0B872B7269D079B00D26481 /* ContextMenuConfiguration.swift */; };
F0EE4DB626A7AC18001DE4ED /* ContextMenuReactionBarAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0EE4DB526A7AC18001DE4ED /* ContextMenuReactionBarAccessory.swift */; };
Expand Down Expand Up @@ -5727,6 +5731,10 @@
76F4B580293ACCD200A7CF2F /* UIKit+Animations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIKit+Animations.swift"; sourceTree = "<group>"; };
76F958622A09A5AE00B43E63 /* DebugUIDiskUsage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugUIDiskUsage.swift; sourceTree = "<group>"; };
76FCCDBB27AB8FBE00BAA7F0 /* MediaControls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaControls.swift; sourceTree = "<group>"; };
79246E542F6C9CC20085AD50 /* ReactionPickerSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionPickerSheet.swift; sourceTree = "<group>"; };
79246E582F71E0470085AD50 /* StickerReactionImageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerReactionImageCache.swift; sourceTree = "<group>"; };
797B94E42F67755A001C9E24 /* CustomReactionItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomReactionItem.swift; sourceTree = "<group>"; };
79F7644F2F656A1C001399AF /* StoryReaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryReaction.swift; sourceTree = "<group>"; };
7F965533D71CA51BE6704CC4 /* Pods_SignalNSE.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SignalNSE.framework; sourceTree = BUILT_PRODUCTS_DIR; };
7FF88FB580BC19B240EEB86A /* Pods_Signal.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Signal.framework; sourceTree = BUILT_PRODUCTS_DIR; };
83B9573827C9A1FA00A678FD /* CaptchaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptchaView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -7785,7 +7793,7 @@
F00385FE273F6388000B5ABD /* Stripe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stripe.swift; sourceTree = "<group>"; };
F02564D7274EDF4600D7B48A /* BadgeIssueSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeIssueSheet.swift; sourceTree = "<group>"; };
F05F51C826A90D6B00861034 /* ContextMenuActionsAccessory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuActionsAccessory.swift; sourceTree = "<group>"; };
F090C81F2762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiReactionPickerConfigViewController.swift; sourceTree = "<group>"; };
F090C81F2762F2C5005C20FC /* CustomReactionPickerConfigViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomReactionPickerConfigViewController.swift; sourceTree = "<group>"; };
F0B872B5269CF6D900D26481 /* ContextMenuInteraction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuInteraction.swift; sourceTree = "<group>"; };
F0B872B7269D079B00D26481 /* ContextMenuConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuConfiguration.swift; sourceTree = "<group>"; };
F0C124B626D4788A0031C96F /* NSE-Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "NSE-Images.xcassets"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -8732,7 +8740,7 @@
880D902B2480889B003D2B14 /* EmojiPickerCollectionView.swift */,
880D902D2480A23E003D2B14 /* EmojiPickerSectionToolbar.swift */,
880D90292480887F003D2B14 /* EmojiPickerSheet.swift */,
F090C81F2762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift */,
F090C81F2762F2C5005C20FC /* CustomReactionPickerConfigViewController.swift */,
88238EBB24F21EE400F28079 /* EmojiSkinTonePicker.swift */,
3428577326BD8777005A2A96 /* EmojiWithSkinTones.swift */,
);
Expand Down Expand Up @@ -9342,6 +9350,7 @@
34B3F8331E8DF1700035BE1A /* ViewControllers */ = {
isa = PBXGroup;
children = (
79246E542F6C9CC20085AD50 /* ReactionPickerSheet.swift */,
340FC87A204DAC8C007AEB0F /* AppSettings */,
8809CE8822F93C0D00D38867 /* Attachment Keyboard */,
883A7FC1269F4BE700841DF9 /* Avatars */,
Expand Down Expand Up @@ -9956,6 +9965,7 @@
50E7E1D12BACC3DB00A94861 /* Reactions */ = {
isa = PBXGroup;
children = (
79246E582F71E0470085AD50 /* StickerReactionImageCache.swift */,
8855DF88238F2E690066D96F /* EmojiCountsCollectionView.swift */,
8855DF86238F1E0C0066D96F /* EmojiReactorsTableView.swift */,
88BCCC8023837B7D00CE5FE6 /* InteractionReactionState.swift */,
Expand Down Expand Up @@ -14935,6 +14945,8 @@
F9C5C948289453B100548EEE /* Reactions */ = {
isa = PBXGroup;
children = (
797B94E42F67755A001C9E24 /* CustomReactionItem.swift */,
79F7644F2F656A1C001399AF /* StoryReaction.swift */,
50A5AA9C2A7475A900CF2ECC /* OutgoingReactionMessage.swift */,
F9C5C94A289453B100548EEE /* OWSReaction.swift */,
F9C5C94C289453B100548EEE /* ReactionFinder.swift */,
Expand Down Expand Up @@ -18030,6 +18042,7 @@
882BDAAE249050F000C14587 /* AddToGroupViewController.swift in Sources */,
D9E43C112CC194140001536E /* AdHocCallStateObserver.swift in Sources */,
88C7597324B7EAA600DB03EA /* AdvancedPinSettingsTableViewController.swift in Sources */,
79246E592F71E0470085AD50 /* StickerReactionImageCache.swift in Sources */,
887B381325F0681400685845 /* AdvancedPrivacySettingsViewController.swift in Sources */,
45D49115296F69AA00B92BB1 /* AllMediaViewController.swift in Sources */,
32E958AA25C12B3800BF12AD /* AnimatedProgressView.swift in Sources */,
Expand Down Expand Up @@ -18330,6 +18343,7 @@
F9B652C128D8CB75006914CA /* DatabaseRecoveryViewController.swift in Sources */,
346C19DF25ACDF0B00061D3A /* DataSettingsTableViewController.swift in Sources */,
88535064240829950011D318 /* DateHeaderInteraction.swift in Sources */,
79246E552F6C9CC20085AD50 /* ReactionPickerSheet.swift in Sources */,
50A1CE3A2A00931900730C40 /* DebugLogger+MainApp.swift in Sources */,
04A573762E75B00B0019651F /* DebugLogPreviewViewController.swift in Sources */,
34067EAB2710D61A000407C3 /* DebugLogs.swift in Sources */,
Expand Down Expand Up @@ -18406,7 +18420,7 @@
880D902C2480889B003D2B14 /* EmojiPickerCollectionView.swift in Sources */,
880D902E2480A23E003D2B14 /* EmojiPickerSectionToolbar.swift in Sources */,
880D902A2480887F003D2B14 /* EmojiPickerSheet.swift in Sources */,
F090C8202762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift in Sources */,
F090C8202762F2C5005C20FC /* CustomReactionPickerConfigViewController.swift in Sources */,
8855DF87238F1E0C0066D96F /* EmojiReactorsTableView.swift in Sources */,
88238EBC24F21EE400F28079 /* EmojiSkinTonePicker.swift in Sources */,
D94B71782EF5FD7A000C4C98 /* EmojiWithSkinTones+String.swift in Sources */,
Expand Down Expand Up @@ -19043,6 +19057,7 @@
667BB2082C580C1400E79B57 /* BackupAttachmentDownloadStore.swift in Sources */,
D9C4C0852E0A75F200B74696 /* BackupAttachmentUploadEraStore.swift in Sources */,
668345502DCA9BEE00566AB3 /* BackupAttachmentUploadProgress.swift in Sources */,
79F764502F656A1F001399AF /* StoryReaction.swift in Sources */,
663AAF222E01EDDD00B9C4B8 /* BackupAttachmentUploadQueueRunner.swift in Sources */,
D98ACAA72E0CA11F00FA497F /* BackupAttachmentUploadQueueStatusManager.swift in Sources */,
66734F012CA1ED3F00558494 /* BackupAttachmentUploadScheduler.swift in Sources */,
Expand Down Expand Up @@ -19246,6 +19261,7 @@
503B47232AF0569B00978266 /* ECKeyPair.swift in Sources */,
66F2CE1F2A3A37CB00519342 /* EditableMessageBody.swift in Sources */,
C1DB22C329C9F95500757380 /* EditManager.swift in Sources */,
797B94E52F677561001C9E24 /* CustomReactionItem.swift in Sources */,
66076B5F2BC06CA70043D547 /* EditManagerAttachments.swift in Sources */,
66076B5E2BC06CA70043D547 /* EditManagerAttachmentsImpl.swift in Sources */,
668B30092BBDD9A20001FD25 /* EditManagerImpl.swift in Sources */,
Expand Down
17 changes: 12 additions & 5 deletions Signal/Calls/UserInterface/CallControlsOverflowView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import UIKit
class CallControlsOverflowView: UIView {
private lazy var reactionPicker: MessageReactionPicker = {
let picker = MessageReactionPicker(
selectedEmoji: nil,
selectedReaction: nil,
delegate: self,
style: .contextMenu(allowGlass: false),
// Calls only support emoji reactions, not stickers.
allowStickers: false,
)
picker.overrideUserInterfaceStyle = .dark
picker.translatesAutoresizingMaskIntoConstraints = false
Expand Down Expand Up @@ -236,11 +238,16 @@ class CallControlsOverflowView: UIView {
// MARK: - MessageReactionPickerDelegate

extension CallControlsOverflowView: MessageReactionPickerDelegate {
func didSelectReaction(reaction: String, isRemoving: Bool, inPosition position: Int) {
self.react(with: reaction)
func didSelectReaction(
_ reaction: CustomReactionItem,
isRemoving: Bool,
inPosition position: Int
) {
// Calls only support emoji reactions, not stickers.
self.react(with: reaction.emoji)
}

func didSelectAnyEmoji() {
func didSelectMore() {
let sheet = EmojiPickerSheet(
message: nil,
reactionPickerConfigurationListener: self,
Expand Down Expand Up @@ -283,7 +290,7 @@ extension CallControlsOverflowView: MessageReactionPickerDelegate {

extension CallControlsOverflowView: ReactionPickerConfigurationListener {
func didCompleteReactionPickerConfiguration() {
self.reactionPicker.updateReactionPickerEmojis()
self.reactionPicker.updateReactionPickerItems()
}
}

Expand Down
Loading