From 534dd03f415d0a95e7816bb9769388db267e195e Mon Sep 17 00:00:00 2001 From: ichmagmaus 812 Date: Wed, 4 Mar 2026 23:26:03 +0100 Subject: [PATCH 1/2] fix: three critical bugs in scheduled send and account switcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug 1 — Video recorder freeze with SendDelayManager enabled When SendDelayManager is active, video notes (кружки) and media are enqueued into Namespaces.Message.ScheduledLocal, not the main chat history. This broke setupSendActionOnViewUpdate which expects the message to appear in the regular history before triggering its callback (dismiss recorder, collapse input). The callback never fired → recorder overlay stayed on screen → app froze. Fix: in requestVideoRecorder's completion closure, detect when SendDelayManager.shared.isEnabled, immediately dismiss the recorder and clear the interface state, bypassing the broken animation path. Bug 2 — Scheduled messages remain visible after being sent When AntiDeleteManager is enabled, the .DeleteMessages case in AccountStateManagementUtils uses to skip non-Cloud namespaces (ScheduledCloud, ScheduledLocal). However after the loop no code physically removed those skipped messages from Postbox — they stayed in the scheduled list forever, appearing as 'planned' messages that never disappeared. Fix: collect non-Cloud IDs during the Anti-Delete loop and physically delete them via _internal_deleteMessages after the loop. Bug 3 — Account switcher avatar not loading Race condition in avatar loading: resourceData was subscribed to first, then fetchedMediaResource triggered the network fetch. The signal's callback fired before data arrived, calling buildButton(nil) which discarded the real avatar. Fix: trigger fetchedMediaResource first, then subscribe to resourceData with filter { $0.complete } |> take(1) so the signal stays alive until the download completes. --- .../Sources/ChatListController.swift | 31 ++++++++------- .../State/AccountStateManagementUtils.swift | 18 ++++++++- .../Chat/ChatControllerMediaRecording.swift | 39 ++++++++++++++----- 3 files changed, 63 insertions(+), 25 deletions(-) diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index 8de604b6..6b6cf315 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -6695,20 +6695,10 @@ private final class ChatListLocationContext { let resource = representation.resource let account = nextAccount.account - // Try to read cached data first; if not ready, trigger a fetch then watch for completion - self.accountSwitcherAvatarDisposable = (account.postbox.mediaBox - .resourceData(resource) - |> deliverOnMainQueue) - .start(next: { data in - if data.complete, let uiImage = UIImage(contentsOfFile: data.path) { - buildButton(uiImage) - } - }, completed: { - // If resource was never complete after signal ended, show placeholder - buildButton(nil) - }) - - // Trigger the actual network fetch so mediaBox populates the resource + // GHOSTGRAM: Fetch first so the resource is populated by the time + // resourceData emits a complete result. The old order (subscribe→fetch) + // had a race where `completed` fired before data arrived, causing + // buildButton(nil) to be called and the avatar to never show. if let peerReference = PeerReference(nextPeer) { let _ = fetchedMediaResource( mediaBox: account.postbox.mediaBox, @@ -6717,6 +6707,19 @@ private final class ChatListLocationContext { reference: .avatar(peer: peerReference, resource: resource) ).start() } + + self.accountSwitcherAvatarDisposable = (account.postbox.mediaBox + .resourceData(resource) + |> filter { $0.complete } + |> take(1) + |> deliverOnMainQueue) + .start(next: { data in + if let uiImage = UIImage(contentsOfFile: data.path) { + buildButton(uiImage) + } else { + buildButton(nil) + } + }) } else { // No photo — show placeholder buildButton(nil) diff --git a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift index d252bc6b..5215a042 100644 --- a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift @@ -4378,9 +4378,18 @@ func replayFinalState( // ANTI-DELETE: Mark messages as deleted instead of removing them if AntiDeleteManager.shared.isEnabled { + // GHOSTGRAM: Collect non-Cloud IDs (scheduled/local) that must be + // physically removed even when AntiDelete is on. Without this, sent + // scheduled messages stay stuck in the scheduled list forever because + // the `continue` guard skips them but nothing else removes them. + var nonCloudIdsToDelete: [MessageId] = [] + for messageId in ids { // Skip scheduled/local/quick-reply messages — they get deleted when sent, not by the remote peer - guard messageId.namespace == Namespaces.Message.Cloud else { continue } + guard messageId.namespace == Namespaces.Message.Cloud else { + nonCloudIdsToDelete.append(messageId) + continue + } // Mark as deleted for icon display AntiDeleteManager.shared.markAsDeleted(peerId: messageId.peerId.toInt64(), messageId: messageId.id) @@ -4396,6 +4405,13 @@ func replayFinalState( return .update(StoreMessage(id: currentMessage.id, customStableId: nil, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media)) }) } + + // Physically remove scheduled/local messages that were skipped above + if !nonCloudIdsToDelete.isEmpty { + _internal_deleteMessages(transaction: transaction, mediaBox: mediaBox, ids: nonCloudIdsToDelete, manualAddMessageThreadStatsDifference: { id, add, remove in + addMessageThreadStatsDifference(threadKey: id, remove: remove, addedMessagePeer: nil, addedMessageId: nil, isOutgoing: false) + }) + } } else { _internal_deleteMessages(transaction: transaction, mediaBox: mediaBox, ids: ids, manualAddMessageThreadStatsDifference: { id, add, remove in addMessageThreadStatsDifference(threadKey: id, remove: remove, addedMessagePeer: nil, addedMessageId: nil, isOutgoing: false) diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerMediaRecording.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerMediaRecording.swift index 807b2f12..3142a054 100644 --- a/submodules/TelegramUI/Sources/Chat/ChatControllerMediaRecording.swift +++ b/submodules/TelegramUI/Sources/Chat/ChatControllerMediaRecording.swift @@ -208,7 +208,16 @@ extension ChatControllerImpl { } var usedCorrelationId = false - if scheduleTime == nil, shouldAnimateMessageTransition, let extractedView = videoController.extractVideoSnapshot() { + + // GHOSTGRAM: When SendDelayManager is active the message lands in + // ScheduledLocal namespace, NOT in the main history. This means + // setupSendActionOnViewUpdate's callback would NEVER fire (it waits + // for the message to appear in the normal chat view), causing the + // video recorder overlay to stay on screen and the app to freeze. + // Solution: dismiss the recorder immediately and skip the animation. + let isSendDelayActive = SendDelayManager.shared.isEnabled + + if !isSendDelayActive, scheduleTime == nil, shouldAnimateMessageTransition, let extractedView = videoController.extractVideoSnapshot() { usedCorrelationId = true self.chatDisplayNode.messageTransitionNode.add(correlationId: correlationId, source: .videoMessage(ChatMessageTransitionNodeImpl.Source.VideoMessage(view: extractedView)), initiated: { [weak videoController, weak self] in videoController?.hideVideoSnapshot() @@ -221,15 +230,25 @@ extension ChatControllerImpl { self.videoRecorder.set(.single(nil)) } - self.chatDisplayNode.setupSendActionOnViewUpdate({ [weak self] in - if let self { - self.chatDisplayNode.collapseInput() - - self.updateChatPresentationInterfaceState(animated: true, interactive: false, { - $0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil).withUpdatedMediaDraftState(nil).withUpdatedPostSuggestionState(nil) } - }) - } - }, usedCorrelationId ? correlationId : nil) + if isSendDelayActive { + // Dismiss recorder and clear state immediately without waiting + // for the scheduled message to appear in history. + self.chatDisplayNode.collapseInput() + self.updateChatPresentationInterfaceState(animated: true, interactive: false, { + $0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil).withUpdatedMediaDraftState(nil).withUpdatedPostSuggestionState(nil) } + }) + } else { + self.chatDisplayNode.setupSendActionOnViewUpdate({ [weak self] in + if let self { + self.chatDisplayNode.collapseInput() + + self.updateChatPresentationInterfaceState(animated: true, interactive: false, { + $0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil).withUpdatedMediaDraftState(nil).withUpdatedPostSuggestionState(nil) } + }) + } + }, usedCorrelationId ? correlationId : nil) + } + let messages = [message] let transformedMessages: [EnqueueMessage] From 1a3303b0593d858fc8f97f7133b436f7eb82e767 Mon Sep 17 00:00:00 2001 From: ichmagmaus 812 Date: Wed, 4 Mar 2026 23:46:44 +0100 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20custom=20ghost=20icon=20+=20move=20?= =?UTF-8?q?Ghostgram=20Settings=20under=20=D0=9A=D0=BE=D1=88=D0=B5=D0=BB?= =?UTF-8?q?=D1=91=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Generated ghost icon for Ghostgram Settings menu item - Added GhostgramSettings.imageset (@1x/@2x/@3x PNG) - Moved Ghostgram Settings from .advanced section (between Privacy & Chat Settings) into .myProfile section, placing it directly after 'Мой профиль' (visually appears just below Кошелёк in the list) - Replaced generic Appearance icon with new custom ghost icon --- .../Sources/PeerInfoSettingsItems.swift | 6 ++--- .../GhostgramSettings.imageset/Contents.json | 23 ++++++++++++++++++ .../ghost_settings.png | Bin 0 -> 1301 bytes .../ghost_settings@2x.png | Bin 0 -> 6900 bytes .../ghost_settings@3x.png | Bin 0 -> 13963 bytes 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/ghost_settings.png create mode 100644 submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/ghost_settings@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/ghost_settings@3x.png diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoSettingsItems.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoSettingsItems.swift index e59306be..7cf4c722 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoSettingsItems.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoSettingsItems.swift @@ -152,6 +152,9 @@ func settingsItems(data: PeerInfoScreenData?, context: AccountContext, presentat items[.myProfile]!.append(PeerInfoScreenDisclosureItem(id: 0, text: presentationData.strings.Settings_MyProfile, icon: PresentationResourcesSettings.myProfile, action: { interaction.openSettings(.profile) })) + items[.myProfile]!.append(PeerInfoScreenDisclosureItem(id: 1001, text: "Ghostgram Settings", icon: UIImage(bundleImageName: "Settings/Menu/GhostgramSettings"), action: { + interaction.openSettings(.ghostgram) + })) if !settings.proxySettings.servers.isEmpty { let proxyType: String @@ -232,9 +235,6 @@ func settingsItems(data: PeerInfoScreenData?, context: AccountContext, presentat items[.advanced]!.append(PeerInfoScreenDisclosureItem(id: 1, text: presentationData.strings.Settings_PrivacySettings, icon: PresentationResourcesSettings.security, action: { interaction.openSettings(.privacyAndSecurity) })) - items[.advanced]!.append(PeerInfoScreenDisclosureItem(id: 1001, text: "Ghostgram Settings", icon: UIImage(bundleImageName: "Settings/Menu/Appearance"), action: { - interaction.openSettings(.ghostgram) - })) items[.advanced]!.append(PeerInfoScreenDisclosureItem(id: 2, text: presentationData.strings.Settings_ChatSettings, icon: PresentationResourcesSettings.dataAndStorage, action: { interaction.openSettings(.dataAndStorage) })) diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/Contents.json new file mode 100644 index 00000000..a02308ab --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images": [ + { + "filename": "ghost_settings.png", + "idiom": "universal", + "scale": "1x" + }, + { + "filename": "ghost_settings@2x.png", + "idiom": "universal", + "scale": "2x" + }, + { + "filename": "ghost_settings@3x.png", + "idiom": "universal", + "scale": "3x" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/ghost_settings.png b/submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/ghost_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..aa778f3fb8bea520b64df160352c209f414e1c9d GIT binary patch literal 1301 zcmV+w1?u{VP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR919iRgM1ONa40RR919RL6T0N#5RQ2+o0e@R3^R7eeVmQ70}R}_ZpR#$(h zAjTOcOrqJ?ffyzTE)*uH3t_}ICzus)oa1|HpoK_xn3Q(-4vn>Z+;}-XX!rnZ#KMO(q7yK6#`d zQIb@3%`>DafSH4W0)RonMQoEKs3IpuIQ>PJl48SOlnGn91lR3$(z?d8)=$VlKoKZg zmQJIhD9prmwbktSJB8XAHC0kZvT%x=o2V+$fdI!aPXU!QQRiim%Hm;rY~kScbkMQK z2gbO^E?pqMA)~)El%kB$DIkt;D-%8;ltws7Q@X;Ww4|(PRCLHpkie?FOba?K?}YZD zrg;PKsp$s2#0tulHu_4YKR&>w|*>DvO*a{PpK+ z#7N;%w~1Gm1qf5zC9fx3;zbVmUcE={!sIC{10imCV$CxNAMEjZOpBBJ6f{&Iswx3hA)LE z*UD1+I{AZTLmn5L1`=K9`G-lEMJ9~6=bbo)pxVX5qv~+fM#(nn9%*^KI z=0Bf4U0hrU$%vPNYbfmQ?h-OfG#=xkM94@u=*%gjQNd9`A?RjsJUtaMR*i1WY15n`_J32bhpm+&@Me#V zo2mBV)E#Hy+hh^JbBP1NK0d8`TyN%IU9n814^qQx7gBNcHZ+ydtph)3vUnk>L~^gU zG+os=iM=Nd3*RtOY-r5lkFUXes16`BzcD~XXZ|sg2rmX9*2sk7qNW@xe2DD%(n|Sp z#U;7*b-vxCD|OQ$Ux7n&xaa2?_{3SHAKSZ48mq%E}I&Q+n-00000 LNkvXXu0mjf%=cxX literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/ghost_settings@2x.png b/submodules/TelegramUI/Images.xcassets/Settings/Menu/GhostgramSettings.imageset/ghost_settings@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f119400c141cc53a1dea6cc86f5c510a2d1c1c1d GIT binary patch literal 6900 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 literal 0 HcmV?d00001