Don't open scheduled messages screen after sending when online if a message has been sent immediately

This commit is contained in:
Ilya Laktyushin 2019-11-22 20:11:42 +04:00
parent 9666c1d593
commit 4eb003d816
3 changed files with 45 additions and 24 deletions

View File

@ -215,7 +215,7 @@ func applyUpdateGroupMessages(postbox: Postbox, stateManager: AccountStateManage
let updatedRawMessageIds = result.updatedRawMessageIds
var namespace = Namespaces.Message.Cloud
if let message = messages.first, Namespaces.Message.allScheduled.contains(message.id.namespace) {
if let message = messages.first, let apiMessage = result.messages.first, message.scheduleTime != nil && message.scheduleTime == apiMessage.timestamp {
namespace = Namespaces.Message.ScheduledCloud
}
@ -225,7 +225,7 @@ func applyUpdateGroupMessages(postbox: Postbox, stateManager: AccountStateManage
resultMessages[id] = resultMessage
}
}
var mapping: [(Message, MessageIndex, StoreMessage)] = []
for message in messages {

View File

@ -75,7 +75,7 @@ private func reasonForError(_ error: String) -> PendingMessageFailureReason? {
}
private final class PeerPendingMessagesSummaryContext {
var messageDeliveredSubscribers = Bag<() -> Void>()
var messageDeliveredSubscribers = Bag<(MessageId.Namespace) -> Void>()
var messageFailedSubscribers = Bag<(PendingMessageFailureReason) -> Void>()
}
@ -239,7 +239,7 @@ public final class PendingMessageManager {
for peerId in peerIdsWithDeliveredMessages {
if let context = strongSelf.peerSummaryContexts[peerId] {
for subscriber in context.messageDeliveredSubscribers.copyItems() {
subscriber()
subscriber(Namespaces.Message.Cloud)
}
}
}
@ -1044,13 +1044,28 @@ public final class PendingMessageManager {
}
private func applySentMessage(postbox: Postbox, stateManager: AccountStateManager, message: Message, result: Api.Updates) -> Signal<Void, NoError> {
var apiMessage: Api.Message?
for resultMessage in result.messages {
if let id = resultMessage.id(namespace: Namespaces.Message.allScheduled.contains(message.id.namespace) ? Namespaces.Message.ScheduledCloud : Namespaces.Message.Cloud) {
if id.peerId == message.id.peerId {
apiMessage = resultMessage
break
}
}
}
var namespace = Namespaces.Message.Cloud
if let apiMessage = apiMessage, let id = apiMessage.id(namespace: message.scheduleTime != nil && message.scheduleTime == apiMessage.timestamp ? Namespaces.Message.ScheduledCloud : Namespaces.Message.Cloud) {
namespace = id.namespace
}
return applyUpdateMessage(postbox: postbox, stateManager: stateManager, message: message, result: result)
|> afterDisposed { [weak self] in
if let strongSelf = self {
strongSelf.queue.async {
if let context = strongSelf.peerSummaryContexts[message.id.peerId] {
for subscriber in context.messageDeliveredSubscribers.copyItems() {
subscriber()
subscriber(namespace)
}
}
}
@ -1059,13 +1074,18 @@ public final class PendingMessageManager {
}
private func applySentGroupMessages(postbox: Postbox, stateManager: AccountStateManager, messages: [Message], result: Api.Updates) -> Signal<Void, NoError> {
var namespace = Namespaces.Message.Cloud
if let message = messages.first, let apiMessage = result.messages.first, message.scheduleTime != nil && message.scheduleTime == apiMessage.timestamp {
namespace = Namespaces.Message.ScheduledCloud
}
return applyUpdateGroupMessages(postbox: postbox, stateManager: stateManager, messages: messages, result: result)
|> afterDisposed { [weak self] in
if let strongSelf = self {
strongSelf.queue.async {
if let peerId = messages.first?.id.peerId, let context = strongSelf.peerSummaryContexts[peerId] {
if let message = messages.first, let context = strongSelf.peerSummaryContexts[message.id.peerId] {
for subscriber in context.messageDeliveredSubscribers.copyItems() {
subscriber()
subscriber(namespace)
}
}
}
@ -1073,7 +1093,7 @@ public final class PendingMessageManager {
}
}
public func deliveredMessageEvents(peerId: PeerId) -> Signal<Bool, NoError> {
public func deliveredMessageEvents(peerId: PeerId) -> Signal<MessageId.Namespace, NoError> {
return Signal { subscriber in
let disposable = MetaDisposable()
@ -1086,8 +1106,8 @@ public final class PendingMessageManager {
self.peerSummaryContexts[peerId] = summaryContext
}
let index = summaryContext.messageDeliveredSubscribers.add({
subscriber.putNext(true)
let index = summaryContext.messageDeliveredSubscribers.add({ namespace in
subscriber.putNext(namespace)
})
disposable.set(ActionDisposable {

View File

@ -1615,7 +1615,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
strongSelf.presentScheduleTimePicker(completion: { [weak self] time in
if let strongSelf = self {
strongSelf.chatDisplayNode.sendCurrentMessage(scheduleTime: time, completion: { [weak self] in
if let strongSelf = self, !strongSelf.presentationInterfaceState.isScheduledMessages {
if let strongSelf = self, !strongSelf.presentationInterfaceState.isScheduledMessages && time != scheduleWhenOnlineTimestamp {
strongSelf.openScheduledMessages()
}
})
@ -4243,13 +4243,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
})
}
self.sentMessageEventsDisposable.set(self.context.account.pendingMessageManager.deliveredMessageEvents(peerId: peerId).start(next: { [weak self] _ in
self.sentMessageEventsDisposable.set((self.context.account.pendingMessageManager.deliveredMessageEvents(peerId: peerId)
|> deliverOnMainQueue).start(next: { [weak self] namespace in
if let strongSelf = self {
let inAppNotificationSettings: InAppNotificationSettings = strongSelf.context.sharedContext.currentInAppNotificationSettings.with { $0 }
let inAppNotificationSettings = strongSelf.context.sharedContext.currentInAppNotificationSettings.with { $0 }
if inAppNotificationSettings.playSounds {
serviceSoundManager.playMessageDeliveredSound()
}
if !strongSelf.presentationInterfaceState.isScheduledMessages && namespace == Namespaces.Message.ScheduledCloud {
strongSelf.openScheduledMessages()
}
}
}))
@ -4526,11 +4529,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
}
}
/*if let subject = self.subject, case .scheduledMessages = subject {
self.chatDisplayNode.animateIn()
self.updateTransitionWhenPresentedAsModal?(1.0, .animated(duration: 0.5, curve: .spring))
}*/
}
override public func viewWillDisappear(_ animated: Bool) {
@ -5514,7 +5512,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
strongSelf.presentScheduleTimePicker(completion: { [weak self] time in
if let strongSelf = self {
done(time)
if !strongSelf.presentationInterfaceState.isScheduledMessages {
if !strongSelf.presentationInterfaceState.isScheduledMessages && time != scheduleWhenOnlineTimestamp {
strongSelf.openScheduledMessages()
}
}
@ -5553,7 +5551,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
strongSelf.presentScheduleTimePicker(completion: { [weak self] time in
if let strongSelf = self {
done(time)
if !strongSelf.presentationInterfaceState.isScheduledMessages {
if !strongSelf.presentationInterfaceState.isScheduledMessages && time != scheduleWhenOnlineTimestamp {
strongSelf.openScheduledMessages()
}
}
@ -5745,7 +5743,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
strongSelf.presentScheduleTimePicker(completion: { [weak self] time in
if let strongSelf = self {
done(time)
if !strongSelf.presentationInterfaceState.isScheduledMessages {
if !strongSelf.presentationInterfaceState.isScheduledMessages && time != scheduleWhenOnlineTimestamp {
strongSelf.openScheduledMessages()
}
}
@ -7887,7 +7885,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
private func displaySendingOptionsTooltip() {
guard let rect = self.chatDisplayNode.frameForInputActionButton() else {
guard let rect = self.chatDisplayNode.frameForInputActionButton(), self.effectiveNavigationController?.topViewController === self else {
return
}
self.sendingOptionsTooltipController?.dismiss()
@ -8165,9 +8163,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
private func openScheduledMessages() {
guard let navigationController = self.effectiveNavigationController, navigationController.topViewController == self else {
return
}
let controller = ChatControllerImpl(context: self.context, chatLocation: self.chatLocation, subject: .scheduledMessages)
controller.navigationPresentation = .modal
self.effectiveNavigationController?.pushViewController(controller)
navigationController.pushViewController(controller)
}
private func presentScheduleTimePicker(selectedTime: Int32? = nil, dismissByTapOutside: Bool = true, completion: @escaping (Int32) -> Void) {