From 0161c7793a54fbf4788acc8d18fbd23dec45dc32 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Wed, 21 Nov 2018 16:14:48 +0400 Subject: [PATCH] notifications --- TelegramUI/ChannelInfoController.swift | 8 +- TelegramUI/ChatController.swift | 4 +- TelegramUI/ChatListItem.swift | 2 +- TelegramUI/ChatTitleView.swift | 2 +- TelegramUI/GroupInfoController.swift | 8 +- .../NotificationExceptionControllerNode.swift | 77 +++++++++++-------- TelegramUI/PeerInfoController.swift | 5 ++ TelegramUI/PresenceStrings.swift | 13 ++++ TelegramUI/UserInfoController.swift | 10 ++- 9 files changed, 85 insertions(+), 44 deletions(-) diff --git a/TelegramUI/ChannelInfoController.swift b/TelegramUI/ChannelInfoController.swift index b896b9a336..ff5fa4a65d 100644 --- a/TelegramUI/ChannelInfoController.swift +++ b/TelegramUI/ChannelInfoController.swift @@ -505,8 +505,12 @@ private func channelInfoEntries(account: Account, presentationData: Presentation if let notificationSettings = view.notificationSettings as? TelegramPeerNotificationSettings { let notificationsText: String - if case .muted = notificationSettings.muteState { - notificationsText = presentationData.strings.UserInfo_NotificationsDisabled + if case let .muted(until) = notificationSettings.muteState, until >= Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) { + if until < Int32.max - 1 { + notificationsText = stringForRemainingMuteInterval(strings: presentationData.strings, muteInterval: until) + } else { + notificationsText = presentationData.strings.UserInfo_NotificationsDisabled + } } else { notificationsText = presentationData.strings.UserInfo_NotificationsEnabled } diff --git a/TelegramUI/ChatController.swift b/TelegramUI/ChatController.swift index 09a2930d0c..2bca204f84 100644 --- a/TelegramUI/ChatController.swift +++ b/TelegramUI/ChatController.swift @@ -1143,7 +1143,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, UID } var peerIsMuted = false if let notificationSettings = peerView.notificationSettings as? TelegramPeerNotificationSettings { - if case .muted = notificationSettings.muteState { + if case let .muted(until) = notificationSettings.muteState, until >= Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) { peerIsMuted = true } } @@ -5090,7 +5090,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, UID } if let notificationSettings = data.notificationSettings as? TelegramPeerNotificationSettings { - if case .muted = notificationSettings.muteState { + if case let .muted(until) = notificationSettings.muteState, until >= Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) { items.append(UIPreviewAction(title: presentationData.strings.Conversation_Unmute, style: .default, handler: { _, _ in if let strongSelf = self { let _ = togglePeerMuted(account: strongSelf.account, peerId: peer.id).start() diff --git a/TelegramUI/ChatListItem.swift b/TelegramUI/ChatListItem.swift index 94e5404b88..8b19202a9a 100644 --- a/TelegramUI/ChatListItem.swift +++ b/TelegramUI/ChatListItem.swift @@ -616,7 +616,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } if let notificationSettings = notificationSettings as? TelegramPeerNotificationSettings { - if case .muted = notificationSettings.muteState { + if case let .muted(until) = notificationSettings.muteState, until >= Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) { currentMutedIconImage = PresentationResourcesChatList.mutedIcon(item.presentationData.theme) } } diff --git a/TelegramUI/ChatTitleView.swift b/TelegramUI/ChatTitleView.swift index 3e04b268ad..aedfca6617 100644 --- a/TelegramUI/ChatTitleView.swift +++ b/TelegramUI/ChatTitleView.swift @@ -262,7 +262,7 @@ final class ChatTitleView: UIView, NavigationBarTitleView { titleLeftIcon = .lock } if let notificationSettings = peerView.notificationSettings as? TelegramPeerNotificationSettings { - if case .muted = notificationSettings.muteState { + if case let .muted(until) = notificationSettings.muteState, until >= Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) { titleRightIcon = .mute } } diff --git a/TelegramUI/GroupInfoController.swift b/TelegramUI/GroupInfoController.swift index 3f8da20687..f7e338b4d9 100644 --- a/TelegramUI/GroupInfoController.swift +++ b/TelegramUI/GroupInfoController.swift @@ -770,8 +770,12 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa let peerNotificationSettings: TelegramPeerNotificationSettings = (view.notificationSettings as? TelegramPeerNotificationSettings) ?? TelegramPeerNotificationSettings.defaultSettings let notificationsText: String - if case .muted = peerNotificationSettings.muteState { - notificationsText = presentationData.strings.UserInfo_NotificationsDisabled + if case let .muted(until) = peerNotificationSettings.muteState, until >= Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) { + if until < Int32.max - 1 { + notificationsText = stringForRemainingMuteInterval(strings: presentationData.strings, muteInterval: until) + } else { + notificationsText = presentationData.strings.UserInfo_NotificationsDisabled + } } else { notificationsText = presentationData.strings.UserInfo_NotificationsEnabled } diff --git a/TelegramUI/NotificationExceptionControllerNode.swift b/TelegramUI/NotificationExceptionControllerNode.swift index 3c6ef327a6..b7108c213b 100644 --- a/TelegramUI/NotificationExceptionControllerNode.swift +++ b/TelegramUI/NotificationExceptionControllerNode.swift @@ -262,21 +262,25 @@ private func notificationsExceptionEntries(presentationData: PresentationData, s var title: String switch value.settings.muteState { case let .muted(until): - if until < Int32.max - 1 { - let formatter = DateFormatter() - formatter.locale = Locale(identifier: presentationData.strings.baseLanguageCode) - - if Calendar.current.isDateInToday(Date(timeIntervalSince1970: Double(until))) { - formatter.dateFormat = "HH:mm" + if until >= Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) { + if until < Int32.max - 1 { + let formatter = DateFormatter() + formatter.locale = Locale(identifier: presentationData.strings.baseLanguageCode) + + if Calendar.current.isDateInToday(Date(timeIntervalSince1970: Double(until))) { + formatter.dateFormat = "HH:mm" + } else { + formatter.dateFormat = "E, d MMM HH:mm" + } + + let dateString = formatter.string(from: Date(timeIntervalSince1970: Double(until))) + + title = presentationData.strings.Notification_Exceptions_MutedUntil(dateString).0 } else { - formatter.dateFormat = "E, d MMM HH:mm" + title = presentationData.strings.Notification_Exceptions_AlwaysOff } - - let dateString = formatter.string(from: Date(timeIntervalSince1970: Double(until))) - - title = presentationData.strings.Notification_Exceptions_MutedUntil(dateString).0 } else { - title = presentationData.strings.Notification_Exceptions_AlwaysOff + title = presentationData.strings.Notification_Exceptions_AlwaysOn } case .unmuted: title = presentationData.strings.Notification_Exceptions_AlwaysOn @@ -552,27 +556,38 @@ final class NotificationExceptionsControllerNode: ViewControllerTracingNode { } let updateNotificationsDisposable = self.updateNotificationsDisposable + var peerIds: Set = Set(mode.peerIds) + let updateNotificationsView:()->Void = { - let key: PostboxViewKey = .peerNotificationSettings(peerIds: Set(mode.peerIds)) - updateNotificationsDisposable.set((account.postbox.combinedView(keys: [key]) |> deliverOnMainQueue).start(next: { view in - if let view = view.views[key] as? PeerNotificationSettingsView { - _ = account.postbox.transaction { transaction in - updateState { current in - var current = current - for (key, value) in view.notificationSettings { - if let value = value as? TelegramPeerNotificationSettings,let local = current.mode.settings[key] { - if !value.isEqual(to: local.settings), let peer = transaction.getPeer(key), let settings = transaction.getPeerNotificationSettings(key) as? TelegramPeerNotificationSettings, !settings.isEqual(to: local.settings) { - current = current.withUpdatedPeerSound(peer, settings.messageSound).withUpdatedPeerMuteInterval(peer, settings.muteState.timeInterval) + updateState { current in + peerIds = peerIds.union(current.mode.peerIds) + let key: PostboxViewKey = .peerNotificationSettings(peerIds: peerIds) + updateNotificationsDisposable.set((account.postbox.combinedView(keys: [key]) |> deliverOnMainQueue).start(next: { view in + if let view = view.views[key] as? PeerNotificationSettingsView { + _ = account.postbox.transaction { transaction in + updateState { current in + var current = current + for (key, value) in view.notificationSettings { + if let value = value as? TelegramPeerNotificationSettings { + if let local = current.mode.settings[key] { + if !value.isEqual(to: local.settings), let peer = transaction.getPeer(key), let settings = transaction.getPeerNotificationSettings(key) as? TelegramPeerNotificationSettings, !settings.isEqual(to: local.settings) { + current = current.withUpdatedPeerSound(peer, settings.messageSound).withUpdatedPeerMuteInterval(peer, settings.muteState.timeInterval) + } + } else if let peer = transaction.getPeer(key) { + current = current.withUpdatedPeerSound(peer, value.messageSound).withUpdatedPeerMuteInterval(peer, value.muteState.timeInterval) + } } } + return current } - return current - } - }.start() - - } - })) + }.start() + + } + })) + return current + } + } updateNotificationsView() @@ -585,12 +600,6 @@ final class NotificationExceptionsControllerNode: ViewControllerTracingNode { let updatePeerSound: (PeerId, PeerMessageSound) -> Signal = { peerId, sound in return updatePeerNotificationSoundInteractive(account: account, peerId: peerId, sound: sound) |> deliverOnMainQueue -// _ = (combineLatest(, account.postbox.loadedPeerWithId(peerId)) |> deliverOnMainQueue).start(next: { _, peer in -// updateState { value in -// return value.withUpdatedPeerSound(peer, sound) -// } -// updateNotificationsView() -// }) } let updatePeerNotificationInterval:(PeerId, Int32?) -> Signal = { peerId, muteInterval in diff --git a/TelegramUI/PeerInfoController.swift b/TelegramUI/PeerInfoController.swift index b7b6374385..fce3894669 100644 --- a/TelegramUI/PeerInfoController.swift +++ b/TelegramUI/PeerInfoController.swift @@ -4,6 +4,11 @@ import Postbox import SwiftSignalKit import TelegramCore + +/* + + */ + func peerInfoController(account: Account, peer: Peer) -> ViewController? { if let _ = peer as? TelegramGroup { return groupInfoController(account: account, peerId: peer.id) diff --git a/TelegramUI/PresenceStrings.swift b/TelegramUI/PresenceStrings.swift index 7e108b8017..a4802fcf37 100644 --- a/TelegramUI/PresenceStrings.swift +++ b/TelegramUI/PresenceStrings.swift @@ -337,3 +337,16 @@ func userPresenceStringRefreshTimeout(_ presence: TelegramUserPresence, relative return Double.infinity } } + + +func stringForRemainingMuteInterval(strings: PresentationStrings, muteInterval value: Int32) -> String { + let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) + let value = max(1 * 60, value - timestamp) + if value <= 1 * 60 * 60 { + return strings.MuteExpires_Minutes(Int32(round(Float(value) / 60))) + } else if value <= 24 * 60 * 60 { + return strings.MuteExpires_Hours(Int32(round(Float(value) / (60 * 60)))) + } else { + return strings.MuteExpires_Days(Int32(round(Float(value) / (24 * 60 * 60)))) + } +} diff --git a/TelegramUI/UserInfoController.swift b/TelegramUI/UserInfoController.swift index 4a32ae68a2..8a895bf593 100644 --- a/TelegramUI/UserInfoController.swift +++ b/TelegramUI/UserInfoController.swift @@ -3,6 +3,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import LegacyComponents private final class UserInfoControllerArguments { let account: Account @@ -40,6 +41,7 @@ private final class UserInfoControllerArguments { self.tapAvatarAction = tapAvatarAction self.openChat = openChat self.addContact = addContact + self.shareContact = shareContact self.shareMyContact = shareMyContact self.startSecretChat = startSecretChat @@ -663,8 +665,12 @@ private func userInfoEntries(account: Account, presentationData: PresentationDat entries.append(UserInfoEntry.sharedMedia(presentationData.theme, presentationData.strings.GroupInfo_SharedMedia)) } let notificationsLabel: String - if let settings = view.notificationSettings as? TelegramPeerNotificationSettings, case .muted = settings.muteState { - notificationsLabel = presentationData.strings.UserInfo_NotificationsDisabled + if let settings = view.notificationSettings as? TelegramPeerNotificationSettings, case let .muted(until) = settings.muteState, until >= Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) { + if until < Int32.max - 1 { + notificationsLabel = stringForRemainingMuteInterval(strings: presentationData.strings, muteInterval: until) + } else { + notificationsLabel = presentationData.strings.UserInfo_NotificationsDisabled + } } else { notificationsLabel = presentationData.strings.UserInfo_NotificationsEnabled }