From 22f9a91f97df77ef5d7f8cc4acefdf1b63f80a2d Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 18 Feb 2021 00:04:13 +0400 Subject: [PATCH] Fix voice chats in legacy groups --- submodules/ChatListUI/Sources/Node/ChatListItem.swift | 6 ++++++ submodules/SyncCore/Sources/TelegramGroup.swift | 2 ++ submodules/TelegramCore/Sources/ApiGroupOrChannel.swift | 6 ++++++ submodules/TelegramCore/Sources/GroupCalls.swift | 9 +++++++++ .../TelegramUI/Sources/PeerInfo/PeerInfoData.swift | 8 ++++++++ .../TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift | 6 ++++-- 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index f3ad85d1d4..11168b14a8 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -1424,6 +1424,12 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { online = true } animateOnline = true + } else if let group = renderedPeer.peer as? TelegramGroup { + onlineIsVoiceChat = true + if group.flags.contains(.hasActiveVoiceChat) && item.interaction.searchTextHighightState == nil { + online = true + } + animateOnline = true } } diff --git a/submodules/SyncCore/Sources/TelegramGroup.swift b/submodules/SyncCore/Sources/TelegramGroup.swift index 3a3cd1bb3b..07e15aa413 100644 --- a/submodules/SyncCore/Sources/TelegramGroup.swift +++ b/submodules/SyncCore/Sources/TelegramGroup.swift @@ -60,6 +60,8 @@ public struct TelegramGroupFlags: OptionSet { } public static let deactivated = TelegramGroupFlags(rawValue: 1 << 1) + public static let hasVoiceChat = TelegramGroupFlags(rawValue: 1 << 2) + public static let hasActiveVoiceChat = TelegramGroupFlags(rawValue: 1 << 3) } public struct TelegramGroupToChannelMigrationReference: Equatable { diff --git a/submodules/TelegramCore/Sources/ApiGroupOrChannel.swift b/submodules/TelegramCore/Sources/ApiGroupOrChannel.swift index 39715f9fe3..52821a2f2c 100644 --- a/submodules/TelegramCore/Sources/ApiGroupOrChannel.swift +++ b/submodules/TelegramCore/Sources/ApiGroupOrChannel.swift @@ -51,6 +51,12 @@ func parseTelegramGroupOrChannel(chat: Api.Chat) -> Peer? { if (flags & (1 << 5)) != 0 { groupFlags.insert(.deactivated) } + if (flags & Int32(1 << 23)) != 0 { + groupFlags.insert(.hasVoiceChat) + } + if (flags & Int32(1 << 24)) != 0 { + groupFlags.insert(.hasActiveVoiceChat) + } return TelegramGroup(id: PeerId(namespace: Namespaces.Peer.CloudGroup, id: id), title: title, photo: imageRepresentationsForApiChatPhoto(photo), participantCount: Int(participantsCount), role: role, membership: left ? .Left : .Member, flags: groupFlags, defaultBannedRights: defaultBannedRights.flatMap(TelegramChatBannedRights.init(apiBannedRights:)), migrationReference: migrationReference, creationDate: date, version: Int(version)) case let .chatEmpty(id): return TelegramGroup(id: PeerId(namespace: Namespaces.Peer.CloudGroup, id: id), title: "", photo: [], participantCount: 0, role: .member, membership: .Removed, flags: [], defaultBannedRights: nil, migrationReference: nil, creationDate: 0, version: 0) diff --git a/submodules/TelegramCore/Sources/GroupCalls.swift b/submodules/TelegramCore/Sources/GroupCalls.swift index b286058b6f..b4dca496c9 100644 --- a/submodules/TelegramCore/Sources/GroupCalls.swift +++ b/submodules/TelegramCore/Sources/GroupCalls.swift @@ -522,6 +522,15 @@ public func stopGroupCall(account: Account, peerId: PeerId, callId: Int64, acces return updated }) } + if var peer = transaction.getPeer(peerId) as? TelegramGroup { + var flags = peer.flags + flags.remove(.hasVoiceChat) + flags.remove(.hasActiveVoiceChat) + peer = peer.updateFlags(flags: flags, version: peer.version) + updatePeers(transaction: transaction, peers: [peer], update: { _, updated in + return updated + }) + } account.stateManager.addUpdates(result) } diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoData.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoData.swift index 565b31f214..861a6bc6d9 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoData.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoData.swift @@ -1055,6 +1055,11 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro var canAddMembers = false var isPublic = false var isCreator = false + var hasVoiceChat = false + + if group.flags.contains(.hasVoiceChat) { + hasVoiceChat = true + } if case .creator = group.role { isCreator = true @@ -1079,6 +1084,9 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro } result.append(.mute) + if hasVoiceChat { + result.append(.voiceChat) + } result.append(.search) result.append(.more) } diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index a66cd720c4..a656fe701c 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -3012,7 +3012,9 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD case .videoCall: self.requestCall(isVideo: true) case .voiceChat: - if let cachedData = self.data?.cachedData as? CachedChannelData, let activeCall = cachedData.activeCall { + if let cachedData = self.data?.cachedData as? CachedGroupData, let activeCall = cachedData.activeCall { + self.context.joinGroupCall(peerId: self.peerId, activeCall: activeCall) + } else if let cachedData = self.data?.cachedData as? CachedChannelData, let activeCall = cachedData.activeCall { self.context.joinGroupCall(peerId: self.peerId, activeCall: activeCall) } case .mute: @@ -3257,7 +3259,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD canManageGroupCalls = true } } - if canManageGroupCalls { + if canManageGroupCalls, !group.flags.contains(.hasVoiceChat) { items.append(ActionSheetButtonItem(title: presentationData.strings.ChannelInfo_CreateVoiceChat, color: .accent, action: { [weak self] in dismissAction()