diff --git a/Telegram-iOS/BlackClassicIcon@2x.png b/Telegram-iOS/BlackClassicIcon@2x.png index 12f8e1c429..093f5821a5 100755 Binary files a/Telegram-iOS/BlackClassicIcon@2x.png and b/Telegram-iOS/BlackClassicIcon@2x.png differ diff --git a/Telegram-iOS/BlackClassicIcon@3x.png b/Telegram-iOS/BlackClassicIcon@3x.png index e48f2b118d..13f8fe2694 100755 Binary files a/Telegram-iOS/BlackClassicIcon@3x.png and b/Telegram-iOS/BlackClassicIcon@3x.png differ diff --git a/Telegram-iOS/BlackClassicIconIpad.png b/Telegram-iOS/BlackClassicIconIpad.png index 0c016d11cb..46593ec465 100755 Binary files a/Telegram-iOS/BlackClassicIconIpad.png and b/Telegram-iOS/BlackClassicIconIpad.png differ diff --git a/Telegram-iOS/BlackClassicIconIpad@2x.png b/Telegram-iOS/BlackClassicIconIpad@2x.png index 8bdbc2ff47..ed0216f931 100755 Binary files a/Telegram-iOS/BlackClassicIconIpad@2x.png and b/Telegram-iOS/BlackClassicIconIpad@2x.png differ diff --git a/Telegram-iOS/BlackClassicIconLargeIpad@2x.png b/Telegram-iOS/BlackClassicIconLargeIpad@2x.png index 5867e6c6dd..1fcc6fc9bb 100755 Binary files a/Telegram-iOS/BlackClassicIconLargeIpad@2x.png and b/Telegram-iOS/BlackClassicIconLargeIpad@2x.png differ diff --git a/Telegram-iOS/BlackFilledIcon@2x.png b/Telegram-iOS/BlackFilledIcon@2x.png index 6d1aa23c8d..a327546043 100755 Binary files a/Telegram-iOS/BlackFilledIcon@2x.png and b/Telegram-iOS/BlackFilledIcon@2x.png differ diff --git a/Telegram-iOS/BlackFilledIcon@3x.png b/Telegram-iOS/BlackFilledIcon@3x.png index dc76ad7f75..a3972adeca 100755 Binary files a/Telegram-iOS/BlackFilledIcon@3x.png and b/Telegram-iOS/BlackFilledIcon@3x.png differ diff --git a/Telegram-iOS/BlackFilledIconIpad.png b/Telegram-iOS/BlackFilledIconIpad.png index 6314635155..d86fb7cb55 100644 Binary files a/Telegram-iOS/BlackFilledIconIpad.png and b/Telegram-iOS/BlackFilledIconIpad.png differ diff --git a/Telegram-iOS/BlackFilledIconIpad@2x.png b/Telegram-iOS/BlackFilledIconIpad@2x.png old mode 100644 new mode 100755 index 1529bf21a2..ed0216f931 Binary files a/Telegram-iOS/BlackFilledIconIpad@2x.png and b/Telegram-iOS/BlackFilledIconIpad@2x.png differ diff --git a/Telegram-iOS/BlackIcon@2x.png b/Telegram-iOS/BlackIcon@2x.png index 0b633d542b..5a3a76cbdd 100755 Binary files a/Telegram-iOS/BlackIcon@2x.png and b/Telegram-iOS/BlackIcon@2x.png differ diff --git a/Telegram-iOS/BlackIcon@3x.png b/Telegram-iOS/BlackIcon@3x.png index d664987bcc..a1d6016afb 100755 Binary files a/Telegram-iOS/BlackIcon@3x.png and b/Telegram-iOS/BlackIcon@3x.png differ diff --git a/Telegram-iOS/BlackIconIpad.png b/Telegram-iOS/BlackIconIpad.png old mode 100644 new mode 100755 diff --git a/Telegram-iOS/BlackIconIpad@2x.png b/Telegram-iOS/BlackIconIpad@2x.png old mode 100644 new mode 100755 diff --git a/Telegram-iOS/BlackIconLargeIpad@2x.png b/Telegram-iOS/BlackIconLargeIpad@2x.png old mode 100644 new mode 100755 diff --git a/Telegram-iOS/BlueClassicIcon@2x.png b/Telegram-iOS/BlueClassicIcon@2x.png index 59d5ef14fc..aa3ec282ce 100755 Binary files a/Telegram-iOS/BlueClassicIcon@2x.png and b/Telegram-iOS/BlueClassicIcon@2x.png differ diff --git a/Telegram-iOS/BlueClassicIcon@3x.png b/Telegram-iOS/BlueClassicIcon@3x.png index 5ebb074078..eca037efcf 100755 Binary files a/Telegram-iOS/BlueClassicIcon@3x.png and b/Telegram-iOS/BlueClassicIcon@3x.png differ diff --git a/Telegram-iOS/BlueClassicIconIpad.png b/Telegram-iOS/BlueClassicIconIpad.png index 490f5f8c60..2e5e919205 100755 Binary files a/Telegram-iOS/BlueClassicIconIpad.png and b/Telegram-iOS/BlueClassicIconIpad.png differ diff --git a/Telegram-iOS/BlueClassicIconIpad@2x.png b/Telegram-iOS/BlueClassicIconIpad@2x.png index d2b08c74c7..08da0b799a 100755 Binary files a/Telegram-iOS/BlueClassicIconIpad@2x.png and b/Telegram-iOS/BlueClassicIconIpad@2x.png differ diff --git a/Telegram-iOS/BlueClassicIconLargeIpad@2x.png b/Telegram-iOS/BlueClassicIconLargeIpad@2x.png index f6f08ff871..342e2766d9 100755 Binary files a/Telegram-iOS/BlueClassicIconLargeIpad@2x.png and b/Telegram-iOS/BlueClassicIconLargeIpad@2x.png differ diff --git a/Telegram-iOS/BlueFilledIcon@2x.png b/Telegram-iOS/BlueFilledIcon@2x.png index 0cc73bd47c..7c851299aa 100755 Binary files a/Telegram-iOS/BlueFilledIcon@2x.png and b/Telegram-iOS/BlueFilledIcon@2x.png differ diff --git a/Telegram-iOS/BlueFilledIcon@3x.png b/Telegram-iOS/BlueFilledIcon@3x.png index bd314a1bb0..49b7fd968c 100755 Binary files a/Telegram-iOS/BlueFilledIcon@3x.png and b/Telegram-iOS/BlueFilledIcon@3x.png differ diff --git a/Telegram-iOS/BlueIcon@2x.png b/Telegram-iOS/BlueIcon@2x.png index 4bc08e01e8..2e502e7dab 100755 Binary files a/Telegram-iOS/BlueIcon@2x.png and b/Telegram-iOS/BlueIcon@2x.png differ diff --git a/Telegram-iOS/BlueIcon@3x.png b/Telegram-iOS/BlueIcon@3x.png index 6647a2e34f..c47aeed4b1 100755 Binary files a/Telegram-iOS/BlueIcon@3x.png and b/Telegram-iOS/BlueIcon@3x.png differ diff --git a/Telegram-iOS/BlueIconIpad.png b/Telegram-iOS/BlueIconIpad.png old mode 100644 new mode 100755 index 07de560340..f07ad9568b Binary files a/Telegram-iOS/BlueIconIpad.png and b/Telegram-iOS/BlueIconIpad.png differ diff --git a/Telegram-iOS/BlueIconIpad@2x.png b/Telegram-iOS/BlueIconIpad@2x.png old mode 100644 new mode 100755 index d71dcd205e..1b21e8d928 Binary files a/Telegram-iOS/BlueIconIpad@2x.png and b/Telegram-iOS/BlueIconIpad@2x.png differ diff --git a/Telegram-iOS/BlueIconLargeIpad@2x.png b/Telegram-iOS/BlueIconLargeIpad@2x.png old mode 100644 new mode 100755 index f51ae17df9..9bf363744d Binary files a/Telegram-iOS/BlueIconLargeIpad@2x.png and b/Telegram-iOS/BlueIconLargeIpad@2x.png differ diff --git a/Telegram-iOS/WhiteFilledIcon@2x.png b/Telegram-iOS/WhiteFilledIcon@2x.png index 23bedc0e4e..221eb7e7ee 100644 Binary files a/Telegram-iOS/WhiteFilledIcon@2x.png and b/Telegram-iOS/WhiteFilledIcon@2x.png differ diff --git a/Telegram-iOS/WhiteFilledIcon@3x.png b/Telegram-iOS/WhiteFilledIcon@3x.png index f9be7ad977..98776bf3d9 100644 Binary files a/Telegram-iOS/WhiteFilledIcon@3x.png and b/Telegram-iOS/WhiteFilledIcon@3x.png differ diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 9a65d9135d..ef8337e795 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -1532,7 +1532,7 @@ "Forward.ChannelReadOnly" = "Sorry, you can't post to this channel."; "Channel.ErrorAccessDenied" = "Sorry, this channel is private."; -"Group.ErrorAccessDenied" = "Sorry, this channel is private."; +"Group.ErrorAccessDenied" = "Sorry, this group is private."; "Conversation.InputTextBroadcastPlaceholder" = "Broadcast"; "Channel.NotificationLoading" = "Loading..."; @@ -4409,7 +4409,7 @@ Any member of this group will be able to see messages in the channel."; "PeopleNearby.UsersEmpty" = "Looking for users around you..."; "PeopleNearby.Groups" = "Groups Nearby"; "PeopleNearby.CreateGroup" = "Create a Group Here"; -"PeopleNearby.Channels" = "Channels Nearby"; +"PeopleNearby.NoMembers" = "no members"; "Channel.Management.LabelOwner" = "Owner"; "Channel.Management.LabelAdministrator" = "Administrator"; @@ -4425,7 +4425,6 @@ Any member of this group will be able to see messages in the channel."; "Channel.AdminLog.MessageTransferedNameUsername" = "transferred ownership to %1$@ (%2$@)"; "Channel.AdminLog.MessageChangedGroupGeoLocation" = "changed group location to \"%@\""; -"Channel.AdminLog.MessageRemovedGroupGeoLocation" = "%@ removed group location"; "Map.SetThisLocation" = "Set This Location"; @@ -4450,6 +4449,8 @@ Any member of this group will be able to see messages in the channel."; "Group.PublicLink.Title" = "Public Link"; "Group.PublicLink.Placeholder" = "link"; -"Group.PublicLink.Info" = "People can share this link with others and find your group using Telegram search.\n\nYou can use use **a-z**, **0-9** and undescores. Minimum length is **5** characters."; +"Group.PublicLink.Info" = "People can share this link with others and find your group using Telegram search.\n\nYou can use **a-z**, **0-9** and underscores. Minimum length is **5** characters."; "CreateGroup.ErrorLocatedGroupsTooMuch" = "Sorry, you have too many location-based groups already. Please delete one of your existing ones first."; + +"GroupInfo.LabelOwner" = "owner"; diff --git a/submodules/TelegramCore/TelegramCore/AddressNames.swift b/submodules/TelegramCore/TelegramCore/AddressNames.swift index 62f058e211..62c808f82d 100644 --- a/submodules/TelegramCore/TelegramCore/AddressNames.swift +++ b/submodules/TelegramCore/TelegramCore/AddressNames.swift @@ -158,6 +158,21 @@ public func updateAddressName(account: Account, domain: AddressNameDomain, name: } |> mapError { _ -> UpdateAddressNameError in return .generic } |> switchToLatest } +public func checkPublicChannelCreationAvailability(account: Account, location: Bool = false) -> Signal { + var flags: Int32 = (1 << 1) + if location { + flags |= (1 << 0) + } + + return account.network.request(Api.functions.channels.getAdminedPublicChannels(flags: flags)) + |> map { _ -> Bool in + return true + } + |> `catch` { error -> Signal in + return .single(false) + } +} + public func adminedPublicChannels(account: Account, location: Bool = false) -> Signal<[Peer], NoError> { var flags: Int32 = 0 if location { diff --git a/submodules/TelegramCore/TelegramCore/ChannelCreation.swift b/submodules/TelegramCore/TelegramCore/ChannelCreation.swift index 46e9d81189..567a7f1b4b 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelCreation.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelCreation.swift @@ -40,7 +40,7 @@ private func createChannel(account: Account, title: String, description: String? return account.network.request(Api.functions.channels.createChannel(flags: flags, title: title, about: description ?? "", geoPoint: geoPoint, address: address), automaticFloodWait: false) |> mapError { error -> CreateChannelError in - if error.errorDescription == "" { + if error.errorDescription == "CHANNELS_ADMIN_LOCATED_TOO_MUCH" { return .tooMuchLocationBasedGroups } else if error.errorDescription == "USER_RESTRICTED" { return .restricted diff --git a/submodules/TelegramCore/TelegramCore/ChannelOwnershipTransfer.swift b/submodules/TelegramCore/TelegramCore/ChannelOwnershipTransfer.swift index 5b2b628561..26ebaf4c7a 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelOwnershipTransfer.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelOwnershipTransfer.swift @@ -56,7 +56,7 @@ public func checkOwnershipTranfserAvailability(postbox: Postbox, network: Networ } } else if error.errorDescription == "CHANNELS_ADMIN_PUBLIC_TOO_MUCH" { return .userPublicChannelsTooMuch - } else if error.errorDescription == "CHANNELS_ADMIN_LOCATED_TOO_MUCHs" { + } else if error.errorDescription == "CHANNELS_ADMIN_LOCATED_TOO_MUCH" { return .userLocatedGroupsTooMuch } else if error.errorDescription == "ADMINS_TOO_MUCH" { return .adminsTooMuch @@ -85,10 +85,17 @@ public func updateChannelOwnership(account: Account, accountStateManager: Accoun } |> mapToSignal { currentCreator, currentParticipant -> Signal<[(ChannelParticipant?, RenderedChannelParticipant)], ChannelOwnershipTransferError> in return account.postbox.transaction { transaction -> Signal<[(ChannelParticipant?, RenderedChannelParticipant)], ChannelOwnershipTransferError> in - if let channel = transaction.getPeer(channelId), let inputChannel = apiInputChannel(channel), let accountUser = transaction.getPeer(account.peerId), let user = transaction.getPeer(memberId), let inputUser = apiInputUser(user) { + if let channel = transaction.getPeer(channelId) as? TelegramChannel, let inputChannel = apiInputChannel(channel), let accountUser = transaction.getPeer(account.peerId), let user = transaction.getPeer(memberId), let inputUser = apiInputUser(user) { + + var flags: TelegramChatAdminRightsFlags + if case .broadcast = channel.info { + flags = TelegramChatAdminRightsFlags.broadcastSpecific + } else { + flags = TelegramChatAdminRightsFlags.groupSpecific + } let updatedParticipant = ChannelParticipant.creator(id: user.id) - let updatedPreviousCreator = ChannelParticipant.member(id: accountUser.id, invitedAt: Int32(Date().timeIntervalSince1970), adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags:[]), promotedBy: accountUser.id, canBeEditedByAccountPeer: false), banInfo: nil) + let updatedPreviousCreator = ChannelParticipant.member(id: accountUser.id, invitedAt: Int32(Date().timeIntervalSince1970), adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags: flags), promotedBy: accountUser.id, canBeEditedByAccountPeer: false), banInfo: nil) let checkPassword = twoStepAuthData(account.network) |> mapError { error -> ChannelOwnershipTransferError in @@ -131,6 +138,8 @@ public func updateChannelOwnership(account: Account, accountStateManager: Accoun } } else if error.errorDescription == "CHANNELS_ADMIN_PUBLIC_TOO_MUCH" { return .userPublicChannelsTooMuch + } else if error.errorDescription == "CHANNELS_ADMIN_LOCATED_TOO_MUCH" { + return .userLocatedGroupsTooMuch } else if error.errorDescription == "ADMINS_TOO_MUCH" { return .adminsTooMuch } else if error.errorDescription == "USER_PRIVACY_RESTRICTED" { diff --git a/submodules/TelegramCore/TelegramCore/PeersNearby.swift b/submodules/TelegramCore/TelegramCore/PeersNearby.swift index 0507c0a46a..d965544582 100644 --- a/submodules/TelegramCore/TelegramCore/PeersNearby.swift +++ b/submodules/TelegramCore/TelegramCore/PeersNearby.swift @@ -31,12 +31,15 @@ public final class PeersNearbyContext { private var entries: [PeerNearby]? public init(network: Network, accountStateManager: AccountStateManager, coordinate: (latitude: Double, longitude: Double)) { - self.disposable.set((network.request(Api.functions.contacts.getLocated(geoPoint: .inputGeoPoint(lat: coordinate.latitude, long: coordinate.longitude))) + let expiryExtension: Double = 10.0 + + let poll = network.request(Api.functions.contacts.getLocated(geoPoint: .inputGeoPoint(lat: coordinate.latitude, long: coordinate.longitude))) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) } - |> mapToSignal { updates -> Signal<[PeerNearby], NoError> in + |> introduceError(Void.self) + |> mapToSignal { updates -> Signal<[PeerNearby], Void> in var peersNearby: [PeerNearby] = [] if let updates = updates { switch updates { @@ -54,16 +57,31 @@ public final class PeersNearbyContext { accountStateManager.addUpdates(updates) } return .single(peersNearby) - |> then(accountStateManager.updatedPeersNearby()) + |> then( + accountStateManager.updatedPeersNearby() + |> introduceError(Void.self) + ) } + + let error: Signal = .single(Void()) |> then(Signal.fail(Void()) |> suspendAwareDelay(25.0, queue: self.queue)) + let combined = combineLatest(poll, error) + |> map { data, _ -> [PeerNearby] in + return data + } + |> restartIfError + |> `catch` { _ -> Signal<[PeerNearby], NoError> in + return .single([]) + } + + self.disposable.set((combined |> deliverOn(self.queue)).start(next: { [weak self] updatedEntries in guard let strongSelf = self else { return } let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 - var entries = strongSelf.entries?.filter { Double($0.expires) > timestamp } ?? [] - let updatedEntries = updatedEntries.filter { Double($0.expires) > timestamp } + var entries = strongSelf.entries?.filter { Double($0.expires) + expiryExtension > timestamp } ?? [] + let updatedEntries = updatedEntries.filter { Double($0.expires) + expiryExtension > timestamp } var existingPeerIds: [PeerId: Int] = [:] for i in 0 ..< entries.count { @@ -79,7 +97,6 @@ public final class PeersNearbyContext { } strongSelf.entries = entries - for subscriber in strongSelf.subscribers.copyItems() { subscriber(strongSelf.entries) } @@ -91,7 +108,10 @@ public final class PeersNearbyContext { } let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 - strongSelf.entries = strongSelf.entries?.filter { Double($0.expires) > timestamp } + strongSelf.entries = strongSelf.entries?.filter { Double($0.expires) + expiryExtension > timestamp } + for subscriber in strongSelf.subscribers.copyItems() { + subscriber(strongSelf.entries) + } }, queue: self.queue) self.timer?.start() } diff --git a/submodules/TelegramCore/TelegramCore/TextEntitiesMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/TextEntitiesMessageAttribute.swift index b97a5a4e48..e6c04ed113 100644 --- a/submodules/TelegramCore/TelegramCore/TextEntitiesMessageAttribute.swift +++ b/submodules/TelegramCore/TelegramCore/TextEntitiesMessageAttribute.swift @@ -305,13 +305,10 @@ func apiEntitiesFromMessageTextEntities(_ entities: [MessageTextEntity], associa break case .Strikethrough: apiEntities.append(.messageEntityStrike(offset: offset, length: length)) - break case .BlockQuote: apiEntities.append(.messageEntityBlockquote(offset: offset, length: length)) - break case .Underline: apiEntities.append(.messageEntityUnderline(offset: offset, length: length)) - break case .Custom: break } diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 8aa3bd313f..4ed1bd9129 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -223,200 +223,200 @@ public final class PresentationStrings { public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[35]! } public var Login_InvalidPhoneError: String { return self._s[37]! } public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[38]! } - public var Conversation_Moderate_Delete: String { return self._s[39]! } - public var Conversation_DeleteMessagesForEveryone: String { return self._s[40]! } - public var WatchRemote_AlertOpen: String { return self._s[41]! } + public var GroupInfo_LabelOwner: String { return self._s[39]! } + public var Conversation_Moderate_Delete: String { return self._s[40]! } + public var Conversation_DeleteMessagesForEveryone: String { return self._s[41]! } + public var WatchRemote_AlertOpen: String { return self._s[42]! } public func MediaPicker_Nof(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[42]!, self._r[42]!, [_0]) + return formatWithArgumentRanges(self._s[43]!, self._r[43]!, [_0]) } - public var AutoDownloadSettings_MediaTypes: String { return self._s[44]! } - public var Watch_GroupInfo_Title: String { return self._s[45]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[46]! } - public var Channel_Info_Members: String { return self._s[47]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[49]! } - public var Conversation_LiveLocation: String { return self._s[50]! } - public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[51]! } - public var NetworkUsageSettings_BytesReceived: String { return self._s[53]! } - public var Stickers_Search: String { return self._s[55]! } - public var NotificationsSound_Synth: String { return self._s[56]! } - public var LogoutOptions_LogOutInfo: String { return self._s[57]! } - public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[59]! } - public var AutoNightTheme_UseSunsetSunrise: String { return self._s[61]! } - public var FastTwoStepSetup_Title: String { return self._s[62]! } - public var Channel_Info_BlackList: String { return self._s[63]! } - public var Channel_AdminLog_InfoPanelTitle: String { return self._s[64]! } - public var Conversation_OpenFile: String { return self._s[65]! } - public var SecretTimer_ImageDescription: String { return self._s[66]! } - public var StickerSettings_ContextInfo: String { return self._s[67]! } - public var TwoStepAuth_GenericHelp: String { return self._s[69]! } - public var AutoDownloadSettings_Unlimited: String { return self._s[70]! } - public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[71]! } - public var AutoDownloadSettings_DataUsageHigh: String { return self._s[72]! } + public var AutoDownloadSettings_MediaTypes: String { return self._s[45]! } + public var Watch_GroupInfo_Title: String { return self._s[46]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[47]! } + public var Channel_Info_Members: String { return self._s[48]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[50]! } + public var Conversation_LiveLocation: String { return self._s[51]! } + public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[52]! } + public var NetworkUsageSettings_BytesReceived: String { return self._s[54]! } + public var Stickers_Search: String { return self._s[56]! } + public var NotificationsSound_Synth: String { return self._s[57]! } + public var LogoutOptions_LogOutInfo: String { return self._s[58]! } + public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[60]! } + public var AutoNightTheme_UseSunsetSunrise: String { return self._s[62]! } + public var FastTwoStepSetup_Title: String { return self._s[63]! } + public var Channel_Info_BlackList: String { return self._s[64]! } + public var Channel_AdminLog_InfoPanelTitle: String { return self._s[65]! } + public var Conversation_OpenFile: String { return self._s[66]! } + public var SecretTimer_ImageDescription: String { return self._s[67]! } + public var StickerSettings_ContextInfo: String { return self._s[68]! } + public var TwoStepAuth_GenericHelp: String { return self._s[70]! } + public var AutoDownloadSettings_Unlimited: String { return self._s[71]! } + public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[72]! } + public var AutoDownloadSettings_DataUsageHigh: String { return self._s[73]! } public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[73]!, self._r[73]!, [_1, _2]) + return formatWithArgumentRanges(self._s[74]!, self._r[74]!, [_1, _2]) } - public var Notifications_AddExceptionTitle: String { return self._s[74]! } - public var Watch_MessageView_Reply: String { return self._s[75]! } - public var Tour_Text6: String { return self._s[76]! } - public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[77]! } + public var Notifications_AddExceptionTitle: String { return self._s[75]! } + public var Watch_MessageView_Reply: String { return self._s[76]! } + public var Tour_Text6: String { return self._s[77]! } + public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[78]! } public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[78]!, self._r[78]!, [_0]) - } - public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[79]!, self._r[79]!, [_0]) } - public var AccessDenied_LocationDenied: String { return self._s[80]! } - public var CallSettings_RecentCalls: String { return self._s[81]! } - public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[82]! } - public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[83]! } - public var Passport_Authorize: String { return self._s[84]! } - public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[85]! } - public var AutoDownloadSettings_Videos: String { return self._s[86]! } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[87]! } - public var Tour_StartButton: String { return self._s[88]! } - public var Watch_AppName: String { return self._s[90]! } - public var StickerPack_ErrorNotFound: String { return self._s[91]! } - public var Channel_Info_Subscribers: String { return self._s[92]! } - public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[93]!, self._r[93]!, [_0]) + public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[80]!, self._r[80]!, [_0]) } - public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { + public var AccessDenied_LocationDenied: String { return self._s[81]! } + public var CallSettings_RecentCalls: String { return self._s[82]! } + public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[83]! } + public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[84]! } + public var Passport_Authorize: String { return self._s[85]! } + public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[86]! } + public var AutoDownloadSettings_Videos: String { return self._s[87]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[88]! } + public var Tour_StartButton: String { return self._s[89]! } + public var Watch_AppName: String { return self._s[91]! } + public var StickerPack_ErrorNotFound: String { return self._s[92]! } + public var Channel_Info_Subscribers: String { return self._s[93]! } + public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[94]!, self._r[94]!, [_0]) } - public var Conversation_StopLiveLocation: String { return self._s[96]! } - public var Channel_AdminLogFilter_EventsAll: String { return self._s[97]! } - public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[99]! } - public var Username_LinkCopied: String { return self._s[101]! } - public var GroupRemoved_Title: String { return self._s[102]! } - public var SecretVideo_Title: String { return self._s[103]! } + public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[95]!, self._r[95]!, [_0]) + } + public var Conversation_StopLiveLocation: String { return self._s[97]! } + public var Channel_AdminLogFilter_EventsAll: String { return self._s[98]! } + public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[100]! } + public var Username_LinkCopied: String { return self._s[102]! } + public var GroupRemoved_Title: String { return self._s[103]! } + public var SecretVideo_Title: String { return self._s[104]! } public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[104]!, self._r[104]!, [_1]) + return formatWithArgumentRanges(self._s[105]!, self._r[105]!, [_1]) } - public var AccessDenied_PhotosAndVideos: String { return self._s[105]! } + public var AccessDenied_PhotosAndVideos: String { return self._s[106]! } public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[106]!, self._r[106]!, [_1]) + return formatWithArgumentRanges(self._s[107]!, self._r[107]!, [_1]) } - public var Map_OpenInGoogleMaps: String { return self._s[107]! } + public var Map_OpenInGoogleMaps: String { return self._s[108]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[108]!, self._r[108]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[109]!, self._r[109]!, [_1, _2, _3]) } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[109]!, self._r[109]!, [_1, _2]) + return formatWithArgumentRanges(self._s[110]!, self._r[110]!, [_1, _2]) } - public var Call_StatusRinging: String { return self._s[110]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[111]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[112]! } - public var UserInfo_NotificationsEnabled: String { return self._s[113]! } - public var Map_Search: String { return self._s[114]! } - public var Login_TermsOfServiceHeader: String { return self._s[116]! } + public var Call_StatusRinging: String { return self._s[111]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[112]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[113]! } + public var UserInfo_NotificationsEnabled: String { return self._s[114]! } + public var Map_Search: String { return self._s[115]! } + public var Login_TermsOfServiceHeader: String { return self._s[117]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[117]!, self._r[117]!, [_0]) - } - public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_0]) } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[119]! } - public var Weekday_Today: String { return self._s[120]! } + public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[119]!, self._r[119]!, [_0]) + } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[120]! } + public var Weekday_Today: String { return self._s[121]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[122]!, self._r[122]!, [_1, _2]) + return formatWithArgumentRanges(self._s[123]!, self._r[123]!, [_1, _2]) } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[123]!, self._r[123]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[124]!, self._r[124]!, ["\(_1)"]) } - public var Notification_PassportValuePersonalDetails: String { return self._s[125]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[126]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[127]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[128]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[129]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[130]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[131]! } - public var Weekday_ShortMonday: String { return self._s[132]! } - public var Cache_KeepMedia: String { return self._s[133]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[134]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[126]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[127]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[128]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[129]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[130]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[131]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[132]! } + public var Weekday_ShortMonday: String { return self._s[133]! } + public var Cache_KeepMedia: String { return self._s[134]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[135]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[135]!, self._r[135]!, [_1, _2]) + return formatWithArgumentRanges(self._s[136]!, self._r[136]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[136]! } - public var Passport_Language_ru: String { return self._s[137]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[137]! } + public var Passport_Language_ru: String { return self._s[138]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[138]!, self._r[138]!, [_0, _1]) + return formatWithArgumentRanges(self._s[139]!, self._r[139]!, [_0, _1]) } - public var WallpaperPreview_PatternIntensity: String { return self._s[139]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[140]! } - public var EnterPasscode_TouchId: String { return self._s[141]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[144]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[146]! } - public var Gif_NoGifsPlaceholder: String { return self._s[148]! } - public var Conversation_OpenBotLinkTitle: String { return self._s[150]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[151]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[152]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[153]! } - public var AuthSessions_TerminateSession: String { return self._s[154]! } - public var Message_File: String { return self._s[155]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[156]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[157]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[158]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[159]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[140]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[141]! } + public var EnterPasscode_TouchId: String { return self._s[142]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[145]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[147]! } + public var Gif_NoGifsPlaceholder: String { return self._s[149]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[151]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[152]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[153]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[154]! } + public var AuthSessions_TerminateSession: String { return self._s[155]! } + public var Message_File: String { return self._s[156]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[157]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[158]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[159]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[160]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[160]!, self._r[160]!, [_0]) + return formatWithArgumentRanges(self._s[161]!, self._r[161]!, [_0]) } - public var Conversation_Moderate_Report: String { return self._s[162]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[163]! } - public var Passport_Language_ms: String { return self._s[164]! } - public var Channel_Edit_AboutItem: String { return self._s[166]! } - public var DialogList_SearchSectionGlobal: String { return self._s[170]! } - public var AttachmentMenu_WebSearch: String { return self._s[171]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[172]! } - public var Channel_BanUser_Title: String { return self._s[173]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[174]! } - public var ArchivedChats_IntroText2: String { return self._s[175]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[176]! } + public var Conversation_Moderate_Report: String { return self._s[163]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[164]! } + public var Passport_Language_ms: String { return self._s[165]! } + public var Channel_Edit_AboutItem: String { return self._s[167]! } + public var DialogList_SearchSectionGlobal: String { return self._s[171]! } + public var AttachmentMenu_WebSearch: String { return self._s[172]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[173]! } + public var Channel_BanUser_Title: String { return self._s[174]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[175]! } + public var ArchivedChats_IntroText2: String { return self._s[176]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[177]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[177]!, self._r[177]!, [_1, _2]) + return formatWithArgumentRanges(self._s[178]!, self._r[178]!, [_1, _2]) } - public var ChatSearch_SearchPlaceholder: String { return self._s[179]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[180]! } - public var NotificationsSound_Aurora: String { return self._s[181]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[180]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[181]! } + public var NotificationsSound_Aurora: String { return self._s[182]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[182]!, self._r[182]!, [_0]) + return formatWithArgumentRanges(self._s[183]!, self._r[183]!, [_0]) } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[185]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[186]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[186]!, self._r[186]!, [_0, _1]) + return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_0, _1]) } - public var Passport_PasswordNext: String { return self._s[187]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[188]! } - public var EmptyGroupInfo_Line2: String { return self._s[189]! } - public var Settings_FAQ_Intro: String { return self._s[191]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[193]! } - public var FeaturedStickerPacks_Title: String { return self._s[194]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[195]! } - public var Username_Title: String { return self._s[196]! } + public var Passport_PasswordNext: String { return self._s[188]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[189]! } + public var EmptyGroupInfo_Line2: String { return self._s[190]! } + public var Settings_FAQ_Intro: String { return self._s[192]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[194]! } + public var FeaturedStickerPacks_Title: String { return self._s[195]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[196]! } + public var Username_Title: String { return self._s[197]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[197]!, self._r[197]!, [_0]) + return formatWithArgumentRanges(self._s[198]!, self._r[198]!, [_0]) } - public var PasscodeSettings_AlphanumericCode: String { return self._s[198]! } - public var Localization_LanguageOther: String { return self._s[199]! } - public var Stickers_SuggestStickers: String { return self._s[200]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[199]! } + public var Localization_LanguageOther: String { return self._s[200]! } + public var Stickers_SuggestStickers: String { return self._s[201]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[201]!, self._r[201]!, [_0]) + return formatWithArgumentRanges(self._s[202]!, self._r[202]!, [_0]) } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[202]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[203]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[204]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[203]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[204]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[205]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[205]!, self._r[205]!, [_0]) + return formatWithArgumentRanges(self._s[206]!, self._r[206]!, [_0]) } - public var Group_UpgradeConfirmation: String { return self._s[207]! } - public var DialogList_Unpin: String { return self._s[208]! } - public var Passport_Identity_DateOfBirth: String { return self._s[209]! } - public var Month_ShortOctober: String { return self._s[210]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[211]! } - public var Notification_CallCanceledShort: String { return self._s[212]! } - public var Passport_Phone_Help: String { return self._s[213]! } - public var Passport_Language_az: String { return self._s[215]! } - public var CreatePoll_TextPlaceholder: String { return self._s[217]! } - public var PeopleNearby_Channels: String { return self._s[218]! } + public var Group_UpgradeConfirmation: String { return self._s[208]! } + public var DialogList_Unpin: String { return self._s[209]! } + public var Passport_Identity_DateOfBirth: String { return self._s[210]! } + public var Month_ShortOctober: String { return self._s[211]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[212]! } + public var Notification_CallCanceledShort: String { return self._s[213]! } + public var Passport_Phone_Help: String { return self._s[214]! } + public var Passport_Language_az: String { return self._s[216]! } + public var CreatePoll_TextPlaceholder: String { return self._s[218]! } public var Passport_Identity_DocumentNumber: String { return self._s[219]! } public var PhotoEditor_CurvesRed: String { return self._s[220]! } public var PhoneNumberHelp_Alert: String { return self._s[222]! } @@ -1201,595 +1201,593 @@ public final class PresentationStrings { public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[942]! } public var SocksProxySetup_Password: String { return self._s[943]! } public var Notifications_PermissionsEnable: String { return self._s[944]! } - public func Channel_AdminLog_MessageRemovedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[946]!, self._r[946]!, [_0]) - } - public var TwoStepAuth_ChangeEmail: String { return self._s[947]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[946]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[948]!, self._r[948]!, [_1]) + return formatWithArgumentRanges(self._s[947]!, self._r[947]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[950]!, self._r[950]!, [_0]) + return formatWithArgumentRanges(self._s[949]!, self._r[949]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[951]! } - public var ArchivedPacksAlert_Title: String { return self._s[952]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[950]! } + public var ArchivedPacksAlert_Title: String { return self._s[951]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[953]!, self._r[953]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[952]!, self._r[952]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[954]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[956]! } - public var Conversation_StatusTyping: String { return self._s[957]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[958]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[959]! } - public var UserInfo_CreateNewContact: String { return self._s[960]! } - public var Passport_Identity_FrontSide: String { return self._s[961]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[962]! } - public var Calls_CallTabTitle: String { return self._s[963]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[964]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[953]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[955]! } + public var Conversation_StatusTyping: String { return self._s[956]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[957]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[958]! } + public var UserInfo_CreateNewContact: String { return self._s[959]! } + public var Passport_Identity_FrontSide: String { return self._s[960]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[961]! } + public var Calls_CallTabTitle: String { return self._s[962]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[963]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[965]!, self._r[965]!, [_0]) + return formatWithArgumentRanges(self._s[964]!, self._r[964]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[966]! } - public var SharedMedia_EmptyMusicText: String { return self._s[967]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[968]! } - public var Paint_Stickers: String { return self._s[969]! } - public var Privacy_GroupsAndChannels: String { return self._s[970]! } - public var UserInfo_AddContact: String { return self._s[972]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[965]! } + public var SharedMedia_EmptyMusicText: String { return self._s[966]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[967]! } + public var Paint_Stickers: String { return self._s[968]! } + public var Privacy_GroupsAndChannels: String { return self._s[969]! } + public var UserInfo_AddContact: String { return self._s[971]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[973]!, self._r[973]!, [_0]) + return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[975]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[974]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[977]!, self._r[977]!, [_0]) + return formatWithArgumentRanges(self._s[976]!, self._r[976]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[978]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[979]! } - public var BlockedUsers_BlockUser: String { return self._s[980]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[981]! } - public var MediaPicker_UngroupDescription: String { return self._s[982]! } - public var Watch_NoConnection: String { return self._s[983]! } - public var Month_GenSeptember: String { return self._s[984]! } - public var Conversation_ViewGroup: String { return self._s[985]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[988]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[989]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[990]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[991]! } - public var MediaPicker_CameraRoll: String { return self._s[993]! } - public var Month_GenAugust: String { return self._s[994]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[995]! } - public var SharedMedia_EmptyText: String { return self._s[996]! } - public var Map_ShareLiveLocation: String { return self._s[997]! } - public var Calls_All: String { return self._s[998]! } - public var Appearance_ThemeNight: String { return self._s[1001]! } - public var Conversation_HoldForAudio: String { return self._s[1002]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1005]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1006]! } - public var SocksProxySetup_Secret: String { return self._s[1007]! } - public var Channel_BanList_RestrictedTitle: String { return self._s[1009]! } - public var Conversation_Location: String { return self._s[1010]! } + public var DialogList_NoMessagesTitle: String { return self._s[977]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[978]! } + public var BlockedUsers_BlockUser: String { return self._s[979]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[980]! } + public var MediaPicker_UngroupDescription: String { return self._s[981]! } + public var Watch_NoConnection: String { return self._s[982]! } + public var Month_GenSeptember: String { return self._s[983]! } + public var Conversation_ViewGroup: String { return self._s[984]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[987]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[988]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[989]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[990]! } + public var MediaPicker_CameraRoll: String { return self._s[992]! } + public var Month_GenAugust: String { return self._s[993]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[994]! } + public var SharedMedia_EmptyText: String { return self._s[995]! } + public var Map_ShareLiveLocation: String { return self._s[996]! } + public var Calls_All: String { return self._s[997]! } + public var Appearance_ThemeNight: String { return self._s[1000]! } + public var Conversation_HoldForAudio: String { return self._s[1001]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1004]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1005]! } + public var SocksProxySetup_Secret: String { return self._s[1006]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1008]! } + public var Conversation_Location: String { return self._s[1009]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1011]!, self._r[1011]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1010]!, self._r[1010]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1013]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1014]! } - public var Notifications_PermissionsText: String { return self._s[1015]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1016]! } - public var Call_Flip: String { return self._s[1017]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1018]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1020]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1022]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1024]! } - public var Login_InvalidCodeError: String { return self._s[1025]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1026]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1012]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1013]! } + public var Notifications_PermissionsText: String { return self._s[1014]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1015]! } + public var Call_Flip: String { return self._s[1016]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1017]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1019]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1021]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1023]! } + public var Login_InvalidCodeError: String { return self._s[1024]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1025]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1027]!, self._r[1027]!, [_0]) + return formatWithArgumentRanges(self._s[1026]!, self._r[1026]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1028]!, self._r[1028]!, [_0]) + return formatWithArgumentRanges(self._s[1027]!, self._r[1027]!, [_0]) } - public var Call_CallInProgressTitle: String { return self._s[1029]! } - public var Month_ShortSeptember: String { return self._s[1030]! } - public var Watch_ChannelInfo_Title: String { return self._s[1031]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1034]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1035]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1036]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1037]! } - public var PhotoEditor_CropReset: String { return self._s[1038]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1040]! } - public var Channel_Management_LabelEditor: String { return self._s[1041]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1043]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1044]! } - public var UserInfo_Title: String { return self._s[1045]! } - public var ChatList_HideAction: String { return self._s[1046]! } - public var AccessDenied_Title: String { return self._s[1047]! } - public var DialogList_SearchLabel: String { return self._s[1048]! } - public var Group_Setup_HistoryHidden: String { return self._s[1049]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1050]! } - public var State_Updating: String { return self._s[1052]! } - public var Contacts_TabTitle: String { return self._s[1053]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1055]! } - public var GroupInfo_GroupHistory: String { return self._s[1056]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1057]! } - public var Wallpaper_SetColor: String { return self._s[1058]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1059]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1060]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1061]! } - public var Contacts_NotRegisteredSection: String { return self._s[1062]! } + public var Call_CallInProgressTitle: String { return self._s[1028]! } + public var Month_ShortSeptember: String { return self._s[1029]! } + public var Watch_ChannelInfo_Title: String { return self._s[1030]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1033]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1034]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1035]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1036]! } + public var PhotoEditor_CropReset: String { return self._s[1037]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1039]! } + public var Channel_Management_LabelEditor: String { return self._s[1040]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1042]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1043]! } + public var UserInfo_Title: String { return self._s[1044]! } + public var ChatList_HideAction: String { return self._s[1045]! } + public var AccessDenied_Title: String { return self._s[1046]! } + public var DialogList_SearchLabel: String { return self._s[1047]! } + public var Group_Setup_HistoryHidden: String { return self._s[1048]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1049]! } + public var State_Updating: String { return self._s[1051]! } + public var Contacts_TabTitle: String { return self._s[1052]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1054]! } + public var GroupInfo_GroupHistory: String { return self._s[1055]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1056]! } + public var Wallpaper_SetColor: String { return self._s[1057]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1058]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1059]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1060]! } + public var Contacts_NotRegisteredSection: String { return self._s[1061]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1063]!, self._r[1063]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1064]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1065]! } - public var SocksProxySetup_Connecting: String { return self._s[1066]! } - public var ExplicitContent_AlertChannel: String { return self._s[1067]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1068]! } - public var Conversation_Contact: String { return self._s[1069]! } - public var Login_CodeExpired: String { return self._s[1070]! } - public var Passport_DiscardMessageAction: String { return self._s[1071]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1072]! } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1073]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1074]! } - public var Month_ShortApril: String { return self._s[1075]! } - public var AuthSessions_CurrentSession: String { return self._s[1076]! } - public var WallpaperPreview_CropTopText: String { return self._s[1080]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1081]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1082]! } - public var Channel_Setup_TypePrivate: String { return self._s[1084]! } - public var Forward_ChannelReadOnly: String { return self._s[1087]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1088]! } - public var AddContact_SharedContactException: String { return self._s[1089]! } - public var UserInfo_BotPrivacy: String { return self._s[1090]! } - public var Notification_PassportValueEmail: String { return self._s[1091]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1092]! } - public var GroupPermission_NewTitle: String { return self._s[1093]! } - public var CallFeedback_ReasonDropped: String { return self._s[1094]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1095]! } - public var Channel_SignMessages_Help: String { return self._s[1097]! } - public var Undo_ChatDeleted: String { return self._s[1099]! } - public var Conversation_ChatBackground: String { return self._s[1100]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1101]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1102]! } - public var Passport_Language_pt: String { return self._s[1103]! } - public var NotificationsSound_Popcorn: String { return self._s[1106]! } - public var AutoNightTheme_Disabled: String { return self._s[1107]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1108]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1109]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1110]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1111]! } + public var Paint_Clear: String { return self._s[1063]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1064]! } + public var SocksProxySetup_Connecting: String { return self._s[1065]! } + public var ExplicitContent_AlertChannel: String { return self._s[1066]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1067]! } + public var Conversation_Contact: String { return self._s[1068]! } + public var Login_CodeExpired: String { return self._s[1069]! } + public var Passport_DiscardMessageAction: String { return self._s[1070]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1071]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1072]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1073]! } + public var Month_ShortApril: String { return self._s[1074]! } + public var AuthSessions_CurrentSession: String { return self._s[1075]! } + public var WallpaperPreview_CropTopText: String { return self._s[1079]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1080]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1081]! } + public var Channel_Setup_TypePrivate: String { return self._s[1083]! } + public var Forward_ChannelReadOnly: String { return self._s[1086]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1087]! } + public var AddContact_SharedContactException: String { return self._s[1088]! } + public var UserInfo_BotPrivacy: String { return self._s[1089]! } + public var Notification_PassportValueEmail: String { return self._s[1090]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1091]! } + public var GroupPermission_NewTitle: String { return self._s[1092]! } + public var CallFeedback_ReasonDropped: String { return self._s[1093]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1094]! } + public var Channel_SignMessages_Help: String { return self._s[1096]! } + public var Undo_ChatDeleted: String { return self._s[1098]! } + public var Conversation_ChatBackground: String { return self._s[1099]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1100]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1101]! } + public var Passport_Language_pt: String { return self._s[1102]! } + public var NotificationsSound_Popcorn: String { return self._s[1105]! } + public var AutoNightTheme_Disabled: String { return self._s[1106]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1107]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1108]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1109]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1110]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1112]!, self._r[1112]!, [_0]) + return formatWithArgumentRanges(self._s[1111]!, self._r[1111]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1113]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1114]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1116]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1112]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1113]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1115]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1117]!, self._r[1117]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1116]!, self._r[1116]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1120]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1121]! } - public var Compose_NewEncryptedChat: String { return self._s[1122]! } - public var Login_CodeFloodError: String { return self._s[1123]! } - public var Calls_TabTitle: String { return self._s[1124]! } - public var Privacy_ProfilePhoto: String { return self._s[1125]! } - public var Passport_Language_he: String { return self._s[1126]! } - public var GroupPermission_Title: String { return self._s[1127]! } + public var SocksProxySetup_Hostname: String { return self._s[1119]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1120]! } + public var Compose_NewEncryptedChat: String { return self._s[1121]! } + public var Login_CodeFloodError: String { return self._s[1122]! } + public var Calls_TabTitle: String { return self._s[1123]! } + public var Privacy_ProfilePhoto: String { return self._s[1124]! } + public var Passport_Language_he: String { return self._s[1125]! } + public var GroupPermission_Title: String { return self._s[1126]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1128]!, self._r[1128]!, [_0]) + return formatWithArgumentRanges(self._s[1127]!, self._r[1127]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1129]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1130]! } - public var Tour_Text1: String { return self._s[1131]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1132]! } - public var Month_ShortFebruary: String { return self._s[1133]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1134]! } - public var NotificationsSound_Glass: String { return self._s[1135]! } - public var Appearance_ThemeNightBlue: String { return self._s[1136]! } - public var CheckoutInfo_Pay: String { return self._s[1137]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1139]! } - public var Call_CallAgain: String { return self._s[1141]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1142]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1143]! } - public var Passport_InvalidPasswordError: String { return self._s[1144]! } - public var Watch_Message_Game: String { return self._s[1145]! } - public var Stickers_Install: String { return self._s[1146]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1147]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1149]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1150]! } - public var AuthSessions_OtherSessions: String { return self._s[1151]! } - public var Channel_Username_Help: String { return self._s[1152]! } - public var Camera_Title: String { return self._s[1153]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1155]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1156]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1157]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1158]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1159]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1160]! } - public var Conversation_RestrictedStickers: String { return self._s[1161]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1163]! } - public var UserInfo_TelegramCall: String { return self._s[1165]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1166]! } - public var CreatePoll_OptionsHeader: String { return self._s[1167]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1168]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1169]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1170]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1171]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1128]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1129]! } + public var Tour_Text1: String { return self._s[1130]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1131]! } + public var Month_ShortFebruary: String { return self._s[1132]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1133]! } + public var NotificationsSound_Glass: String { return self._s[1134]! } + public var Appearance_ThemeNightBlue: String { return self._s[1135]! } + public var CheckoutInfo_Pay: String { return self._s[1136]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1138]! } + public var Call_CallAgain: String { return self._s[1140]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1141]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1142]! } + public var Passport_InvalidPasswordError: String { return self._s[1143]! } + public var Watch_Message_Game: String { return self._s[1144]! } + public var Stickers_Install: String { return self._s[1145]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1146]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1148]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1149]! } + public var AuthSessions_OtherSessions: String { return self._s[1150]! } + public var Channel_Username_Help: String { return self._s[1151]! } + public var Camera_Title: String { return self._s[1152]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1154]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1155]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1156]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1157]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1158]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1159]! } + public var Conversation_RestrictedStickers: String { return self._s[1160]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1162]! } + public var UserInfo_TelegramCall: String { return self._s[1164]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1165]! } + public var CreatePoll_OptionsHeader: String { return self._s[1166]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1167]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1168]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1169]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1170]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1172]!, self._r[1172]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1171]!, self._r[1171]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1173]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1174]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1175]! } - public var Conversation_MessageDialogRetry: String { return self._s[1176]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1177]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1178]! } - public var Group_Setup_TypeHeader: String { return self._s[1179]! } - public var Paint_RecentStickers: String { return self._s[1180]! } - public var PhotoEditor_GrainTool: String { return self._s[1181]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1182]! } - public var EmptyGroupInfo_Line4: String { return self._s[1183]! } - public var Watch_AuthRequired: String { return self._s[1185]! } + public var Settings_SaveEditedPhotos: String { return self._s[1172]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1173]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1174]! } + public var Conversation_MessageDialogRetry: String { return self._s[1175]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1176]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1177]! } + public var Group_Setup_TypeHeader: String { return self._s[1178]! } + public var Paint_RecentStickers: String { return self._s[1179]! } + public var PhotoEditor_GrainTool: String { return self._s[1180]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1181]! } + public var EmptyGroupInfo_Line4: String { return self._s[1182]! } + public var Watch_AuthRequired: String { return self._s[1184]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1186]!, self._r[1186]!, [_0]) + return formatWithArgumentRanges(self._s[1185]!, self._r[1185]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1187]! } - public var ChannelIntro_Text: String { return self._s[1188]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1189]! } - public var GroupPermission_NoSendMedia: String { return self._s[1190]! } - public var Calls_AddTab: String { return self._s[1191]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1192]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1193]! } - public var Notification_MessageLifetime1d: String { return self._s[1194]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1195]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1196]! } - public var Passport_Identity_GenderFemale: String { return self._s[1197]! } - public var BlockedUsers_BlockTitle: String { return self._s[1198]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1186]! } + public var ChannelIntro_Text: String { return self._s[1187]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1188]! } + public var GroupPermission_NoSendMedia: String { return self._s[1189]! } + public var Calls_AddTab: String { return self._s[1190]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1191]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1192]! } + public var Notification_MessageLifetime1d: String { return self._s[1193]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1194]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1195]! } + public var Passport_Identity_GenderFemale: String { return self._s[1196]! } + public var BlockedUsers_BlockTitle: String { return self._s[1197]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1199]!, self._r[1199]!, [_1]) + return formatWithArgumentRanges(self._s[1198]!, self._r[1198]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1200]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1201]! } - public var ChatList_ArchiveAction: String { return self._s[1202]! } - public var AutoNightTheme_Scheduled: String { return self._s[1203]! } + public var Weekday_Yesterday: String { return self._s[1199]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1200]! } + public var ChatList_ArchiveAction: String { return self._s[1201]! } + public var AutoNightTheme_Scheduled: String { return self._s[1202]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1203]!, self._r[1203]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1205]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1204]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1206]!, self._r[1206]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1205]!, self._r[1205]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1207]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1208]! } + public var CreatePoll_Create: String { return self._s[1206]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1207]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1209]!, self._r[1209]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1208]!, self._r[1208]!, [_1, _2]) } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1210]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1212]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1209]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1211]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1213]!, self._r[1213]!, [_1]) + return formatWithArgumentRanges(self._s[1212]!, self._r[1212]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1214]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1215]! } + public var Preview_OpenInInstagram: String { return self._s[1213]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1214]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1215]!, self._r[1215]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1217]!, self._r[1217]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1218]! } - public var ArchivedChats_IntroText3: String { return self._s[1219]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1220]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1221]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1222]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1217]! } + public var ArchivedChats_IntroText3: String { return self._s[1218]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1219]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1220]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1221]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1223]!, self._r[1223]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1222]!, self._r[1222]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1225]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1226]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1227]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1228]! } - public var Gif_NoGifsFound: String { return self._s[1229]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1230]! } - public var GroupInfo_ActionPromote: String { return self._s[1231]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1232]! } - public var GroupInfo_Permissions_Title: String { return self._s[1233]! } - public var Permissions_ContactsText_v0: String { return self._s[1234]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1235]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1238]! } - public var Passport_FieldEmailHelp: String { return self._s[1239]! } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1240]! } - public var Weekday_ShortSaturday: String { return self._s[1241]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1242]! } - public var Watch_Conversation_UserInfo: String { return self._s[1243]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1244]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1245]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1246]! } - public var PhotoEditor_VignetteTool: String { return self._s[1247]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1248]! } - public var Passport_Language_et: String { return self._s[1249]! } - public var AppUpgrade_Running: String { return self._s[1250]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1252]! } - public var Passport_Language_bg: String { return self._s[1253]! } - public var Stickers_NoStickersFound: String { return self._s[1255]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1224]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1225]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1226]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1227]! } + public var Gif_NoGifsFound: String { return self._s[1228]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1229]! } + public var GroupInfo_ActionPromote: String { return self._s[1230]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1231]! } + public var GroupInfo_Permissions_Title: String { return self._s[1232]! } + public var Permissions_ContactsText_v0: String { return self._s[1233]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1234]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1237]! } + public var Passport_FieldEmailHelp: String { return self._s[1238]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1239]! } + public var Weekday_ShortSaturday: String { return self._s[1240]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1241]! } + public var Watch_Conversation_UserInfo: String { return self._s[1242]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1243]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1244]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1245]! } + public var PhotoEditor_VignetteTool: String { return self._s[1246]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1247]! } + public var Passport_Language_et: String { return self._s[1248]! } + public var AppUpgrade_Running: String { return self._s[1249]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1251]! } + public var Passport_Language_bg: String { return self._s[1252]! } + public var Stickers_NoStickersFound: String { return self._s[1254]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1257]!, self._r[1257]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1256]!, self._r[1256]!, [_1, _2]) } - public var Settings_About: String { return self._s[1258]! } + public var Settings_About: String { return self._s[1257]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1259]!, self._r[1259]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1258]!, self._r[1258]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1261]! } - public var Group_ErrorAddBlocked: String { return self._s[1262]! } + public var KeyCommand_NewMessage: String { return self._s[1260]! } + public var Group_ErrorAddBlocked: String { return self._s[1261]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1263]!, self._r[1263]!, [_0]) + return formatWithArgumentRanges(self._s[1262]!, self._r[1262]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1264]! } - public var ReportGroupLocation_Title: String { return self._s[1265]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1266]! } - public var Cache_ClearProgress: String { return self._s[1267]! } + public var Map_LocationTitle: String { return self._s[1263]! } + public var ReportGroupLocation_Title: String { return self._s[1264]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1265]! } + public var Cache_ClearProgress: String { return self._s[1266]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1268]!, self._r[1268]!, [_0]) + return formatWithArgumentRanges(self._s[1267]!, self._r[1267]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1269]! } - public var Passport_UpdateRequiredError: String { return self._s[1270]! } + public var GroupRemoved_AddToGroup: String { return self._s[1268]! } + public var Passport_UpdateRequiredError: String { return self._s[1269]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_1]) + return formatWithArgumentRanges(self._s[1270]!, self._r[1270]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1273]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1274]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1275]! } - public var Passport_Language_ka: String { return self._s[1276]! } - public var Call_Decline: String { return self._s[1277]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1278]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1272]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1273]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1274]! } + public var Passport_Language_ka: String { return self._s[1275]! } + public var Call_Decline: String { return self._s[1276]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1277]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_0]) + return formatWithArgumentRanges(self._s[1280]!, self._r[1280]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1282]! } + public var CallFeedback_Send: String { return self._s[1281]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1283]!, self._r[1283]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1284]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1286]! } - public var Passport_DeletePassport: String { return self._s[1287]! } - public var Appearance_AppIconFilled: String { return self._s[1288]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1289]! } - public var Month_ShortDecember: String { return self._s[1290]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1292]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1283]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1285]! } + public var Passport_DeletePassport: String { return self._s[1286]! } + public var Appearance_AppIconFilled: String { return self._s[1287]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1288]! } + public var Month_ShortDecember: String { return self._s[1289]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1291]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1293]!, self._r[1293]!, [_0]) + return formatWithArgumentRanges(self._s[1292]!, self._r[1292]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1294]! } - public var Conversation_EncryptedDescription1: String { return self._s[1295]! } - public var Conversation_EncryptedDescription2: String { return self._s[1296]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1297]! } - public var Conversation_EncryptedDescription3: String { return self._s[1298]! } - public var PhotoEditor_SharpenTool: String { return self._s[1299]! } + public var Channel_Stickers_Searching: String { return self._s[1293]! } + public var Conversation_EncryptedDescription1: String { return self._s[1294]! } + public var Conversation_EncryptedDescription2: String { return self._s[1295]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1296]! } + public var Conversation_EncryptedDescription3: String { return self._s[1297]! } + public var PhotoEditor_SharpenTool: String { return self._s[1298]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1300]!, self._r[1300]!, [_0]) + return formatWithArgumentRanges(self._s[1299]!, self._r[1299]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1302]! } - public var Channel_Members_AddMembers: String { return self._s[1303]! } - public var Wallpaper_Search: String { return self._s[1304]! } - public var Weekday_Friday: String { return self._s[1305]! } - public var Privacy_ContactsSync: String { return self._s[1306]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1307]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1308]! } + public var Conversation_EncryptedDescription4: String { return self._s[1301]! } + public var Channel_Members_AddMembers: String { return self._s[1302]! } + public var Wallpaper_Search: String { return self._s[1303]! } + public var Weekday_Friday: String { return self._s[1304]! } + public var Privacy_ContactsSync: String { return self._s[1305]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1306]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1307]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1309]!, self._r[1309]!, [_0]) + return formatWithArgumentRanges(self._s[1308]!, self._r[1308]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1310]! } - public var Passport_Identity_GenderMale: String { return self._s[1311]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1309]! } + public var Passport_Identity_GenderMale: String { return self._s[1310]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1312]!, self._r[1312]!, [_0]) + return formatWithArgumentRanges(self._s[1311]!, self._r[1311]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1313]! } - public var Conversation_JumpToDate: String { return self._s[1314]! } - public var Contacts_GlobalSearch: String { return self._s[1315]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1316]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1317]! } - public var Profile_MessageLifetime1d: String { return self._s[1318]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1312]! } + public var Conversation_JumpToDate: String { return self._s[1313]! } + public var Contacts_GlobalSearch: String { return self._s[1314]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1315]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1316]! } + public var Profile_MessageLifetime1d: String { return self._s[1317]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1319]!, self._r[1319]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1318]!, self._r[1318]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1322]! } + public var StickerPack_BuiltinPackName: String { return self._s[1321]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1323]!, self._r[1323]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1322]!, self._r[1322]!, [_1, _2]) } - public var Passport_InfoTitle: String { return self._s[1325]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1326]! } + public var Passport_InfoTitle: String { return self._s[1324]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1325]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_0]) + return formatWithArgumentRanges(self._s[1329]!, self._r[1329]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1331]!, self._r[1331]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1332]! } - public var Profile_BotInfo: String { return self._s[1333]! } - public var Watch_Compose_CreateMessage: String { return self._s[1334]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1335]! } - public var Month_ShortNovember: String { return self._s[1336]! } - public var Conversation_ScamWarning: String { return self._s[1337]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1338]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1339]! } - public var NotificationsSound_Chime: String { return self._s[1340]! } - public var Passport_Language_ko: String { return self._s[1342]! } - public var InviteText_URL: String { return self._s[1343]! } - public var TextFormat_Monospace: String { return self._s[1344]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1331]! } + public var Profile_BotInfo: String { return self._s[1332]! } + public var Watch_Compose_CreateMessage: String { return self._s[1333]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1334]! } + public var Month_ShortNovember: String { return self._s[1335]! } + public var Conversation_ScamWarning: String { return self._s[1336]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1337]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1338]! } + public var NotificationsSound_Chime: String { return self._s[1339]! } + public var Passport_Language_ko: String { return self._s[1341]! } + public var InviteText_URL: String { return self._s[1342]! } + public var TextFormat_Monospace: String { return self._s[1343]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1345]!, self._r[1345]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1346]!, self._r[1346]!, [_0]) + return formatWithArgumentRanges(self._s[1345]!, self._r[1345]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1346]!, self._r[1346]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1349]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1350]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1351]! } - public var Your_card_has_expired: String { return self._s[1352]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1353]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1354]! } - public var Conversation_Report: String { return self._s[1358]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1359]! } - public var Notification_MessageLifetime1m: String { return self._s[1360]! } - public var Privacy_ContactsTitle: String { return self._s[1361]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1362]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1363]! } - public var Channel_Members_Title: String { return self._s[1364]! } - public var Map_OpenInWaze: String { return self._s[1365]! } - public var Login_PhoneBannedError: String { return self._s[1366]! } + public var Passport_InfoLearnMore: String { return self._s[1348]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1349]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1350]! } + public var Your_card_has_expired: String { return self._s[1351]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1352]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1353]! } + public var Conversation_Report: String { return self._s[1357]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1358]! } + public var Notification_MessageLifetime1m: String { return self._s[1359]! } + public var Privacy_ContactsTitle: String { return self._s[1360]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1361]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1362]! } + public var Channel_Members_Title: String { return self._s[1363]! } + public var Map_OpenInWaze: String { return self._s[1364]! } + public var Login_PhoneBannedError: String { return self._s[1365]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1367]!, self._r[1367]!, [_0]) + return formatWithArgumentRanges(self._s[1366]!, self._r[1366]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1368]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1369]! } - public var Common_OK: String { return self._s[1370]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1371]! } - public var Cache_Music: String { return self._s[1372]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1373]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1374]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1375]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1367]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1368]! } + public var Common_OK: String { return self._s[1369]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1370]! } + public var Cache_Music: String { return self._s[1371]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1372]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1373]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1374]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_1]) + return formatWithArgumentRanges(self._s[1375]!, self._r[1375]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1377]!, self._r[1377]!, [_0]) + return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1379]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1380]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1382]! } - public var State_ConnectingToProxyInfo: String { return self._s[1383]! } - public var Message_VideoMessage: String { return self._s[1385]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1386]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1387]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1388]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1389]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1390]! } - public var Activity_RecordingAudio: String { return self._s[1391]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1392]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1393]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1378]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1379]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1381]! } + public var State_ConnectingToProxyInfo: String { return self._s[1382]! } + public var Message_VideoMessage: String { return self._s[1384]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1385]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1386]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1387]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1388]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1389]! } + public var Activity_RecordingAudio: String { return self._s[1390]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1391]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1392]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1395]!, self._r[1395]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1399]!, self._r[1399]!, [_0]) + return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1400]! } - public var UserInfo_AddPhone: String { return self._s[1401]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1402]! } + public var Conversation_ApplyLocalization: String { return self._s[1399]! } + public var UserInfo_AddPhone: String { return self._s[1400]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1401]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1403]!, self._r[1403]!, [_0]) + return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_0]) } - public var Passport_Scans: String { return self._s[1405]! } - public var BlockedUsers_Unblock: String { return self._s[1406]! } + public var Passport_Scans: String { return self._s[1404]! } + public var BlockedUsers_Unblock: String { return self._s[1405]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_1]) + return formatWithArgumentRanges(self._s[1406]!, self._r[1406]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1408]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1409]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1410]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1411]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1412]! } + public var Channel_Management_LabelCreator: String { return self._s[1407]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1408]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1409]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1410]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1411]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1413]!, self._r[1413]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1412]!, self._r[1412]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1414]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1415]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1416]! } - public var ChannelIntro_CreateChannel: String { return self._s[1417]! } - public var Conversation_UnreadMessages: String { return self._s[1418]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1419]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1420]! } - public var Notification_GroupActivated: String { return self._s[1421]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1422]! } + public var Login_PhoneNumberHelp: String { return self._s[1413]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1414]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1415]! } + public var ChannelIntro_CreateChannel: String { return self._s[1416]! } + public var Conversation_UnreadMessages: String { return self._s[1417]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1418]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1419]! } + public var Notification_GroupActivated: String { return self._s[1420]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1421]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0]) + return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1424]!, self._r[1424]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1426]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1425]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_0]) + return formatWithArgumentRanges(self._s[1426]!, self._r[1426]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1428]! } - public var CallFeedback_AddComment: String { return self._s[1429]! } + public var Undo_DeletedChannel: String { return self._s[1427]! } + public var CallFeedback_AddComment: String { return self._s[1428]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1430]!, self._r[1430]!, [_0]) + return formatWithArgumentRanges(self._s[1429]!, self._r[1429]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1431]! } + public var Document_TargetConfirmationFormat: String { return self._s[1430]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1432]!, self._r[1432]!, [_0]) + return formatWithArgumentRanges(self._s[1431]!, self._r[1431]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1433]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1432]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1434]!, self._r[1434]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1433]!, self._r[1433]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1435]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1436]! } + public var Contacts_SortByName: String { return self._s[1434]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1435]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1438]!, self._r[1438]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1437]!, self._r[1437]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1439]! } - public var Conversation_ClearSelfHistory: String { return self._s[1440]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1441]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1442]! } - public var Stickers_SuggestNone: String { return self._s[1443]! } - public var ChatSettings_Cache: String { return self._s[1444]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1445]! } - public var Media_ShareThisPhoto: String { return self._s[1446]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1447]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1448]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1449]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1450]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1451]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1452]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1454]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1455]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1456]! } - public var Map_OpenIn: String { return self._s[1457]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1438]! } + public var Conversation_ClearSelfHistory: String { return self._s[1439]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1440]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1441]! } + public var Stickers_SuggestNone: String { return self._s[1442]! } + public var ChatSettings_Cache: String { return self._s[1443]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1444]! } + public var Media_ShareThisPhoto: String { return self._s[1445]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1446]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1447]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1448]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1449]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1450]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1451]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1453]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1454]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1455]! } + public var Map_OpenIn: String { return self._s[1456]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1460]!, self._r[1460]!, [_1]) + return formatWithArgumentRanges(self._s[1459]!, self._r[1459]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1461]!, self._r[1461]!, [_0]) + return formatWithArgumentRanges(self._s[1460]!, self._r[1460]!, [_0]) } - public var MessagePoll_LabelClosed: String { return self._s[1462]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1464]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1465]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1466]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1467]! } - public var Login_SelectCountry_Title: String { return self._s[1468]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1469]! } + public var MessagePoll_LabelClosed: String { return self._s[1461]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1463]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1464]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1465]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1466]! } + public var Login_SelectCountry_Title: String { return self._s[1467]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1468]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1470]!, self._r[1470]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1469]!, self._r[1469]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1471]! } - public var Watch_Suggestion_BRB: String { return self._s[1472]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1473]! } - public var Contacts_PermissionsTitle: String { return self._s[1474]! } - public var Conversation_RestrictedInline: String { return self._s[1475]! } - public var StickerPack_ViewPack: String { return self._s[1477]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1470]! } + public var Watch_Suggestion_BRB: String { return self._s[1471]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1472]! } + public var Contacts_PermissionsTitle: String { return self._s[1473]! } + public var Conversation_RestrictedInline: String { return self._s[1474]! } + public var StickerPack_ViewPack: String { return self._s[1476]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1478]!, self._r[1478]!, [_0]) + return formatWithArgumentRanges(self._s[1477]!, self._r[1477]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1480]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1483]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1485]! } - public var Channel_Info_Stickers: String { return self._s[1486]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1487]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1488]! } - public var Passport_DeletePersonalDetails: String { return self._s[1489]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1490]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1491]! } - public var Conversation_SearchNoResults: String { return self._s[1493]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1494]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1495]! } - public var Login_Code: String { return self._s[1496]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1497]! } - public var Weekday_ShortThursday: String { return self._s[1498]! } - public var Resolve_ErrorNotFound: String { return self._s[1500]! } - public var LastSeen_Offline: String { return self._s[1501]! } + public var Compose_NewChannel: String { return self._s[1479]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1482]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1484]! } + public var Channel_Info_Stickers: String { return self._s[1485]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1486]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1487]! } + public var Passport_DeletePersonalDetails: String { return self._s[1488]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1489]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1490]! } + public var Conversation_SearchNoResults: String { return self._s[1492]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1493]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1494]! } + public var Login_Code: String { return self._s[1495]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1496]! } + public var Weekday_ShortThursday: String { return self._s[1497]! } + public var Resolve_ErrorNotFound: String { return self._s[1499]! } + public var LastSeen_Offline: String { return self._s[1500]! } + public var PeopleNearby_NoMembers: String { return self._s[1501]! } public var GroupPermission_AddMembersNotAvailable: String { return self._s[1502]! } public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1503]! } public var GroupInfo_Title: String { return self._s[1504]! } @@ -3912,526 +3910,526 @@ public final class PresentationStrings { public var Channel_Setup_TypePublicHelp: String { return self._s[3461]! } public var Passport_Identity_EditInternalPassport: String { return self._s[3462]! } public var PhotoEditor_Skip: String { return self._s[3463]! } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func MessageTimer_Weeks(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { + public func Call_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } public func SharedMedia_Link(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func UserCount(_ value: Int32) -> String { + public func Conversation_StatusSubscribers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Seconds(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } public func Media_ShareVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortMinutes(_ value: Int32) -> String { + public func Map_ETAMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + public func StickerPack_AddStickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, _1, _2) } public func ForwardedFiles(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) } public func MessageTimer_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Minutes(_ value: Int32) -> String { + public func Map_ETAHours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Video(_ value: Int32) -> String { + public func InviteText_ContactsCountText(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPhotos(_ value: Int32) -> String { + public func SharedMedia_File(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, _1, _2) } - public func MessageTimer_Seconds(_ value: Int32) -> String { + public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, _1, _2) } public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Minutes(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_SelectedChats(_ value: Int32) -> String { + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedLocations(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + public func UserCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_File(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, _1, _2) } public func ForwardedVideoMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _0, _1) + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) } - public func Contacts_ImportersCount(_ value: Int32) -> String { + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_Exceptions(_ value: Int32) -> String { + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAHours(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedStickers(_ value: Int32) -> String { + public func SharedMedia_Photo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) } public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortSeconds(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + public func Conversation_StatusOnline(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/BUCK b/submodules/TelegramUI/BUCK index faa9336477..d1176c0a40 100644 --- a/submodules/TelegramUI/BUCK +++ b/submodules/TelegramUI/BUCK @@ -72,8 +72,6 @@ apple_library( 'TelegramUI/DeviceProximityManager.h', 'TelegramUI/RaiseToListenActivator.h', 'TelegramUI/TGMimeTypeMap.h', - 'TelegramUI/TGEmojiSuggestions.h', - 'TelegramUI/TGChannelIntroController.h', 'TelegramUI/EDSunriseSet.h', 'TelegramUI/TGBridgeAudioDecoder.h', 'TelegramUI/TGBridgeAudioEncoder.h', diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index 847e73a19e..eda3deda39 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -1641,8 +1641,8 @@ final class SharedApplicationContext { } else if let sendMessageIntent = userActivity.interaction?.intent as? INSendMessageIntent { if let contact = sendMessageIntent.recipients?.first, let handle = contact.customIdentifier, handle.hasPrefix("tg") { let string = handle.suffix(from: handle.index(handle.startIndex, offsetBy: 2)) - if let id = Int32(string), let context = self.contextValue { - navigateToChatController(navigationController: context.rootController, context: context.context, chatLocation: .peer(PeerId(namespace: Namespaces.Peer.CloudUser, id: id))) + if let id = Int32(string) { + self.openChatWhenReady(accountId: nil, peerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), activateInput: true) } } } @@ -1689,7 +1689,7 @@ final class SharedApplicationContext { }) } - private func openChatWhenReady(accountId: AccountRecordId?, peerId: PeerId, messageId: MessageId? = nil) { + private func openChatWhenReady(accountId: AccountRecordId?, peerId: PeerId, messageId: MessageId? = nil, activateInput: Bool = false) { let signal = self.sharedContextPromise.get() |> take(1) |> mapToSignal { sharedApplicationContext -> Signal in @@ -1707,7 +1707,7 @@ final class SharedApplicationContext { } self.openChatWhenReadyDisposable.set((signal |> deliverOnMainQueue).start(next: { context in - context.openChatWithPeerId(peerId: peerId, messageId: messageId) + context.openChatWithPeerId(peerId: peerId, messageId: messageId, activateInput: activateInput) })) } diff --git a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift index 00c8708175..87d33fe403 100644 --- a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift @@ -58,7 +58,7 @@ final class AuthorizedApplicationContext { let rootController: TelegramRootController let notificationController: NotificationContainerController - private var scheduledOperChatWithPeerId: PeerId? + private var scheduledOperChatWithPeerId: (PeerId, MessageId?, Bool)? private var scheduledOpenExternalUrl: URL? private let passcodeStatusDisposable = MetaDisposable() @@ -268,9 +268,9 @@ final class AuthorizedApplicationContext { strongSelf.notificationController.view.isHidden = false if strongSelf.rootController.rootTabController == nil { strongSelf.rootController.addRootControllers(showCallsTab: strongSelf.showCallsTab) - if let peerId = strongSelf.scheduledOperChatWithPeerId { + if let (peerId, messageId, activateInput) = strongSelf.scheduledOperChatWithPeerId { strongSelf.scheduledOperChatWithPeerId = nil - strongSelf.openChatWithPeerId(peerId: peerId) + strongSelf.openChatWithPeerId(peerId: peerId, messageId: messageId, activateInput: activateInput) } if let url = strongSelf.scheduledOpenExternalUrl { @@ -782,7 +782,7 @@ final class AuthorizedApplicationContext { self.permissionsDisposable.dispose() } - func openChatWithPeerId(peerId: PeerId, messageId: MessageId? = nil) { + func openChatWithPeerId(peerId: PeerId, messageId: MessageId? = nil, activateInput: Bool = false) { var visiblePeerId: PeerId? if let controller = self.rootController.topViewController as? ChatController, case let .peer(peerId) = controller.chatLocation { visiblePeerId = peerId @@ -790,9 +790,9 @@ final class AuthorizedApplicationContext { if visiblePeerId != peerId || messageId != nil { if self.rootController.rootTabController != nil { - navigateToChatController(navigationController: self.rootController, context: self.context, chatLocation: .peer(peerId), messageId: messageId) + navigateToChatController(navigationController: self.rootController, context: self.context, chatLocation: .peer(peerId), messageId: messageId, activateInput: activateInput) } else { - self.scheduledOperChatWithPeerId = peerId + self.scheduledOperChatWithPeerId = (peerId, messageId, activateInput) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChannelMemberCategoryListContext.swift b/submodules/TelegramUI/TelegramUI/ChannelMemberCategoryListContext.swift index 51fcc654fa..caf8d372f6 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelMemberCategoryListContext.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelMemberCategoryListContext.swift @@ -294,19 +294,22 @@ private final class ChannelMemberSingleCategoryListContext: ChannelMemberCategor } switch self.category { case let .admins(query): - if let updated = updated, let _ = updated.participant.adminInfo, (query == nil || updated.peer.indexName.matchesByTokens(query!)) { - var found = false - loop: for i in 0 ..< list.count { - if list[i].peer.id == updated.peer.id { - list[i] = updated - found = true - updatedList = true - break loop + if let updated = updated, (query == nil || updated.peer.indexName.matchesByTokens(query!)) { + if case let .member(_, _, adminInfo, _) = updated.participant, adminInfo == nil { + } else { + var found = false + loop: for i in 0 ..< list.count { + if list[i].peer.id == updated.peer.id { + list[i] = updated + found = true + updatedList = true + break loop + } + } + if !found { + list.insert(updated, at: 0) + updatedList = true } - } - if !found { - list.insert(updated, at: 0) - updatedList = true } } else if let previous = previous, let _ = previous.adminInfo { loop: for i in 0 ..< list.count { @@ -316,7 +319,7 @@ private final class ChannelMemberSingleCategoryListContext: ChannelMemberCategor break loop } } - if let updated = updated, case .creator = updated.participant{ + if let updated = updated, case .creator = updated.participant { list.insert(updated, at: 0) updatedList = true } diff --git a/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift b/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift index 583a3d8c1e..02e771e0af 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift @@ -1170,7 +1170,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, } else { if let addressName = peer.addressName, !addressName.isEmpty { selectedType = .publicChannel - } else if let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + } else if let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { selectedType = .publicChannel } else { selectedType = .privateChannel @@ -1193,8 +1193,16 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, title = isGroup ? presentationData.strings.GroupInfo_GroupType : presentationData.strings.Channel_TypeSetup_Title } } + + let entries = channelVisibilityControllerEntries(presentationData: presentationData, mode: mode, view: view, publicChannelsToRevoke: publicChannelsToRevoke, state: state) + + var focusItemTag: ItemListItemTag? + if entries.count > 1, let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + focusItemTag = ChannelVisibilityEntryTag.publicLink + } + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) - let listState = ItemListNodeState(entries: channelVisibilityControllerEntries(presentationData: presentationData, mode: mode, view: view, publicChannelsToRevoke: publicChannelsToRevoke, state: state), style: .blocks, crossfadeState: crossfade, animateChanges: false) + let listState = ItemListNodeState(entries: entries, style: .blocks, focusItemTag: focusItemTag, crossfadeState: crossfade, animateChanges: false) return (controllerState, (listState, arguments)) } |> afterDisposed { diff --git a/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift index 08a6abbe9c..91caff52eb 100644 --- a/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift @@ -136,7 +136,7 @@ final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { } else { text = presentationInterfaceState.strings.Group_ErrorAccessDenied } - strongSelf.interfaceInteraction?.presentController(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationInterfaceState.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationInterfaceState.strings.Common_OK, action: {})]), nil) + strongSelf.interfaceInteraction?.presentController(textAlertController(context: context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationInterfaceState.strings.Common_OK, action: {})]), nil) })) case .kicked: break diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 278ff9599f..68acc137dc 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -223,6 +223,10 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, private var screenCaptureEventsDisposable: Disposable? private let chatAdditionalDataDisposable = MetaDisposable() + private var reportIrrelvantGeoNoticePromise = Promise() + private var reportIrrelvantGeoNotice: Bool? + private var reportIrrelvantGeoDisposable: Disposable? + private var volumeButtonsListener: VolumeButtonsListener? private var beginMediaRecordingRequestId: Int = 0 @@ -1449,17 +1453,32 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } onlineMemberCount = recentOnlineSignal |> map(Optional.init) + + self.reportIrrelvantGeoNoticePromise.set(context.account.postbox.transaction { transaction -> Bool? in + if let _ = transaction.getNoticeEntry(key: ApplicationSpecificNotice.irrelevantPeerGeoReportKey(peerId: peerId)) as? ApplicationSpecificBoolNotice { + return true + } else { + return false + } + }) + } else { + self.reportIrrelvantGeoNoticePromise.set(.single(nil)) } - self.peerDisposable.set((combineLatest(queue: Queue.mainQueue(), peerView.get(), onlineMemberCount) - |> deliverOnMainQueue).start(next: { [weak self] peerView, onlineMemberCount in + + self.peerDisposable.set((combineLatest(queue: Queue.mainQueue(), peerView.get(), onlineMemberCount, self.reportIrrelvantGeoNoticePromise.get()) + |> deliverOnMainQueue).start(next: { [weak self] peerView, onlineMemberCount, peerReportNotice in if let strongSelf = self { if let peer = peerViewMainPeer(peerView) { strongSelf.chatTitleView?.titleContent = .peer(peerView: peerView, onlineMemberCount: onlineMemberCount) (strongSelf.chatInfoNavigationButton?.buttonItem.customDisplayNode as? ChatAvatarNavigationNode)?.avatarNode.setPeer(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, peer: peer, overrideImage: peer.isDeleted ? .deletedIcon : .none) } - if strongSelf.peerView === peerView { + + if strongSelf.peerView === peerView && strongSelf.reportIrrelvantGeoNotice == peerReportNotice { return } + + strongSelf.reportIrrelvantGeoNotice = peerReportNotice + var upgradedToPeerId: PeerId? if let previous = strongSelf.peerView, let group = previous.peers[previous.peerId] as? TelegramGroup, group.migrationReference == nil, let updatedGroup = peerView.peers[peerView.peerId] as? TelegramGroup, let migrationReference = updatedGroup.migrationReference { upgradedToPeerId = migrationReference.peerId @@ -1516,11 +1535,18 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, var contactStatus: ChatContactStatus? if let peer = peerView.peers[peerView.peerId] { if let cachedData = peerView.cachedData as? CachedUserData { - contactStatus = ChatContactStatus(canAddContact: !peerView.peerIsContact, peerStatusSettings: cachedData.peerStatusSettings) + contactStatus = ChatContactStatus(canAddContact: !peerView.peerIsContact, canReportIrrelevantLocation: false, peerStatusSettings: cachedData.peerStatusSettings) } else if let cachedData = peerView.cachedData as? CachedGroupData { - contactStatus = ChatContactStatus(canAddContact: false, peerStatusSettings: cachedData.peerStatusSettings) + contactStatus = ChatContactStatus(canAddContact: false, canReportIrrelevantLocation: false, peerStatusSettings: cachedData.peerStatusSettings) } else if let cachedData = peerView.cachedData as? CachedChannelData { - contactStatus = ChatContactStatus(canAddContact: false, peerStatusSettings: cachedData.peerStatusSettings) + var canReportIrrelevantLocation = true + if let peer = peerView.peers[peerView.peerId] as? TelegramChannel, peer.participationStatus == .member { + canReportIrrelevantLocation = false + } + if let peerReportNotice = peerReportNotice, peerReportNotice { + canReportIrrelevantLocation = false + } + contactStatus = ChatContactStatus(canAddContact: false, canReportIrrelevantLocation: canReportIrrelevantLocation, peerStatusSettings: cachedData.peerStatusSettings) } var peers = SimpleDictionary() @@ -1581,7 +1607,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, didDisplayActionsPanel = true } else if peerStatusSettings.contains(.canShareContact) { didDisplayActionsPanel = true - } else if peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { + } else if contactStatus.canReportIrrelevantLocation && peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { didDisplayActionsPanel = true } } @@ -1596,7 +1622,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, displayActionsPanel = true } else if peerStatusSettings.contains(.canShareContact) { displayActionsPanel = true - } else if peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { + } else if contactStatus.canReportIrrelevantLocation && peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { displayActionsPanel = true } } @@ -1932,6 +1958,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, self.shareStatusDisposable?.dispose() self.context.sharedContext.mediaManager.galleryHiddenMediaManager.removeTarget(self) self.preloadHistoryPeerIdDisposable.dispose() + self.reportIrrelvantGeoDisposable?.dispose() } public func updatePresentationMode(_ mode: ChatControllerPresentationMode) { @@ -3445,15 +3472,28 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: false, { $0.updatedInputMode({ _ in return .none }) }) } }, reportPeerIrrelevantGeoLocation: { [weak self] in - if let strongSelf = self { - strongSelf.chatDisplayNode.dismissInput() - - let actions = [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: { - }), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.ReportGroupLocation_Report, action: { - - })] - strongSelf.present(textAlertController(context: strongSelf.context, title: strongSelf.presentationData.strings.ReportGroupLocation_Title, text: strongSelf.presentationData.strings.ReportGroupLocation_Text, actions: actions), in: .window(.root)) + guard let strongSelf = self, case let .peer(peerId) = strongSelf.chatLocation else { + return } + + strongSelf.chatDisplayNode.dismissInput() + + let actions = [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: { + }), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.ReportGroupLocation_Report, action: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.reportIrrelvantGeoDisposable = (TelegramCore.reportPeer(account: strongSelf.context.account, peerId: peerId, reason: .irrelevantLocation) + |> deliverOnMainQueue).start(completed: { [weak self] in + if let strongSelf = self { + strongSelf.reportIrrelvantGeoNoticePromise.set(.single(true)) + let _ = ApplicationSpecificNotice.setIrrelevantPeerGeoReport(postbox: strongSelf.context.account.postbox, peerId: peerId).start() + + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ReportPeer_AlertSuccess, actions: [TextAlertAction(type: TextAlertActionType.defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + } + }) + })] + strongSelf.present(textAlertController(context: strongSelf.context, title: strongSelf.presentationData.strings.ReportGroupLocation_Title, text: strongSelf.presentationData.strings.ReportGroupLocation_Text, actions: actions), in: .window(.root)) }, statuses: ChatPanelInterfaceInteractionStatuses(editingMessage: self.editingMessage.get(), startingBot: self.startingBot.get(), unblockingPeer: self.unblockingPeer.get(), searching: self.searching.get(), loadingMessage: self.loadingMessage.get())) switch self.chatLocation { @@ -6729,7 +6769,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in return state.updatedInterfaceState { interfaceState in return interfaceState.withUpdatedEffectiveInputState(interfaceState.effectiveInputState) - }.updatedInputMode({ _ in ChatInputMode.text }) + }.updatedInputMode({ _ in .text }) }) } }), @@ -6740,7 +6780,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return state.updatedInterfaceState { interfaceState in let effectiveInputState = ChatTextInputState(inputText: NSAttributedString(string: "/")) return interfaceState.withUpdatedEffectiveInputState(effectiveInputState) - }.updatedInputMode({ _ in ChatInputMode.text }) + }.updatedInputMode({ _ in .text }) } else { return state } @@ -6754,7 +6794,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return state.updatedInterfaceState { interfaceState in let effectiveInputState = ChatTextInputState(inputText: NSAttributedString(string: "@")) return interfaceState.withUpdatedEffectiveInputState(effectiveInputState) - }.updatedInputMode({ _ in ChatInputMode.text }) + }.updatedInputMode({ _ in .text }) } else { return state } @@ -6768,7 +6808,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return state.updatedInterfaceState { interfaceState in let effectiveInputState = ChatTextInputState(inputText: NSAttributedString(string: "#")) return interfaceState.withUpdatedEffectiveInputState(effectiveInputState) - }.updatedInputMode({ _ in ChatInputMode.text }) + }.updatedInputMode({ _ in .text }) } else { return state } @@ -6846,6 +6886,12 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } } + func activateInput() { + self.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in + return state.updatedInputMode({ _ in .text }) + }) + } + private func clearInputText() { self.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in if !state.interfaceState.effectiveInputState.inputText.string.isEmpty { diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextQueries.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextQueries.swift index 290f7aad6c..b357ecfa26 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextQueries.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextQueries.swift @@ -83,7 +83,7 @@ private func updatedContextQueryResultStateForQuery(context: AccountContext, pee case .installed: scope = [.installed] } - return searchStickers(account: context.account, query: query, scope: scope) + return searchStickers(account: context.account, query: query.trimmedEmoji, scope: scope) } |> map { stickers -> (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult? in return { _ in diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift index 45997196b7..6531f718e3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift @@ -37,7 +37,7 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat displayActionsPanel = true } else if peerStatusSettings.contains(.canShareContact) { displayActionsPanel = true - } else if peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { + } else if contactStatus.canReportIrrelevantLocation && peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { displayActionsPanel = true } } diff --git a/submodules/TelegramUI/TelegramUI/ChatPresentationInterfaceState.swift b/submodules/TelegramUI/TelegramUI/ChatPresentationInterfaceState.swift index 52effb672e..b87f3d3774 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPresentationInterfaceState.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPresentationInterfaceState.swift @@ -322,6 +322,7 @@ final class ChatRecordedMediaPreview: Equatable { struct ChatContactStatus: Equatable { var canAddContact: Bool + var canReportIrrelevantLocation: Bool var peerStatusSettings: PeerStatusSettings? var isEmpty: Bool { @@ -331,6 +332,9 @@ struct ChatContactStatus: Equatable { if !self.canAddContact { peerStatusSettings.remove(.canAddContact) } + if !self.canReportIrrelevantLocation { + peerStatusSettings.remove(.canReportIrrelevantGeoLocation) + } return peerStatusSettings.isEmpty } } diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index 02450d5287..71a6fcb284 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -772,7 +772,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { strongSelf.openPeer(peerId: peerId, peer: nil) } case .inaccessiblePeer: - strongSelf.controllerInteraction.presentController(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Conversation_ErrorInaccessibleMessage, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), nil) + strongSelf.controllerInteraction.presentController(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_ErrorInaccessibleMessage, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), nil) case .botStart: break //strongSelf.openPeer(peerId: peerId, navigation: .withBotStartPayload(ChatControllerInitialBotStart(payload: payload, behavior: .interactive)), fromMessage: nil) diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift index adf659a02c..f55490ae2a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift @@ -949,14 +949,7 @@ struct ChatRecentActionsEntry: Comparable, Identifiable { let message = Message(stableId: self.entry.stableId, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud, id: Int32(bitPattern: self.entry.stableId)), globallyUniqueId: self.entry.event.id, groupingKey: nil, groupInfo: nil, timestamp: self.entry.event.date, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: author, text: text, attributes: [], media: [mediaMap], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) return ChatMessageItem(presentationData: self.presentationData, context: context, chatLocation: .peer(peer.id), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .channel, automaticDownloadNetworkType: .cellular, isRecentActions: true), controllerInteraction: controllerInteraction, content: .message(message: message, read: true, selection: .none, attributes: ChatMessageEntryAttributes(isAdmin: false, isContact: false))) - } else { - appendAttributedText(text: self.presentationData.strings.Channel_AdminLog_MessageRemovedGroupGeoLocation(author?.displayTitle ?? ""), generateEntities: { index in - if index == 0, let author = author { - return [.TextMention(peerId: author.id)] - } - return [] - }, to: &text, entities: &entities) - + } else { let action = TelegramMediaActionType.customText(text: text, entities: entities) let message = Message(stableId: self.entry.stableId, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud, id: Int32(bitPattern: self.entry.stableId)), globallyUniqueId: self.entry.event.id, groupingKey: nil, groupInfo: nil, timestamp: self.entry.event.date, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: author, text: "", attributes: [], media: [TelegramMediaAction(action: action)], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) diff --git a/submodules/TelegramUI/TelegramUI/ChatReportPeerTitlePanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatReportPeerTitlePanelNode.swift index d7a5a2c9b3..a54f4e9ff5 100644 --- a/submodules/TelegramUI/TelegramUI/ChatReportPeerTitlePanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatReportPeerTitlePanelNode.swift @@ -54,7 +54,7 @@ private func peerButtons(_ state: ChatPresentationInterfaceState) -> [ChatReport } } } else if let _ = state.renderedPeer?.chatMainPeer { - if let contactStatus = state.contactStatus, let peerStatusSettings = contactStatus.peerStatusSettings, peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { + if let contactStatus = state.contactStatus, contactStatus.canReportIrrelevantLocation, let peerStatusSettings = contactStatus.peerStatusSettings, peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { buttons.append(.reportIrrelevantGeoLocation) } else { buttons.append(.reportSpam) diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift index 7a38c348e2..58a4e337c8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift @@ -11,6 +11,7 @@ struct ChatTextInputAttributes { static let bold = NSAttributedStringKey(rawValue: "Attribute__Bold") static let italic = NSAttributedStringKey(rawValue: "Attribute__Italic") static let monospace = NSAttributedStringKey(rawValue: "Attribute__Monospace") + static let strikethrough = NSAttributedStringKey(rawValue: "Attribute__Strikethrough") static let textMention = NSAttributedStringKey(rawValue: "Attribute__TextMention") static let textUrl = NSAttributedStringKey(rawValue: "Attribute__TextUrl") } @@ -23,7 +24,7 @@ func stateAttributedStringForText(_ text: NSAttributedString) -> NSAttributedStr for (key, value) in attributes { if key == ChatTextInputAttributes.textMention || key == ChatTextInputAttributes.textUrl { result.addAttribute(key, value: value, range: range) - } else if key == ChatTextInputAttributes.bold || key == ChatTextInputAttributes.italic || key == ChatTextInputAttributes.monospace { + } else if key == ChatTextInputAttributes.bold || key == ChatTextInputAttributes.italic || key == ChatTextInputAttributes.monospace || key == ChatTextInputAttributes.strikethrough { result.addAttribute(key, value: value, range: range) } } @@ -37,7 +38,6 @@ private struct FontAttributes: OptionSet { static let bold = FontAttributes(rawValue: 1 << 0) static let italic = FontAttributes(rawValue: 1 << 1) static let monospace = FontAttributes(rawValue: 1 << 2) - static let strikethrough = FontAttributes(rawValue: 1 << 3) } func textAttributedStringForStateText(_ stateText: NSAttributedString, fontSize: CGFloat, textColor: UIColor, accentTextColor: UIColor) -> NSAttributedString { @@ -66,13 +66,20 @@ func textAttributedStringForStateText(_ stateText: NSAttributedString, fontSize: } else if key == ChatTextInputAttributes.monospace { result.addAttribute(key, value: value, range: range) fontAttributes.insert(.monospace) + } else if key == ChatTextInputAttributes.strikethrough { + result.addAttribute(key, value: value, range: range) + result.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSUnderlineStyle.styleSingle.rawValue as NSNumber, range: range) } } if !fontAttributes.isEmpty { var font: UIFont? if fontAttributes == [.bold, .italic, .monospace] { - + font = Font.semiboldItalicMonospace(fontSize) + } else if fontAttributes == [.bold, .monospace] { + font = Font.semiboldMonospace(fontSize) + } else if fontAttributes == [.italic, .monospace] { + font = Font.italicMonospace(fontSize) } else if fontAttributes == [.bold, .italic] { font = Font.semiboldItalic(fontSize) } else if fontAttributes == [.bold] { @@ -384,7 +391,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed } func refreshChatTextInputAttributes(_ textNode: ASEditableTextNode, theme: PresentationTheme, baseFontSize: CGFloat) { - guard var initialAttributedText = textNode.attributedText, initialAttributedText.length != 0 else { + guard let initialAttributedText = textNode.attributedText, initialAttributedText.length != 0 else { return } @@ -406,6 +413,7 @@ func refreshChatTextInputAttributes(_ textNode: ASEditableTextNode, theme: Prese textNode.textView.textStorage.removeAttribute(NSAttributedStringKey.font, range: fullRange) textNode.textView.textStorage.removeAttribute(NSAttributedStringKey.foregroundColor, range: fullRange) textNode.textView.textStorage.removeAttribute(NSAttributedStringKey.underlineStyle, range: fullRange) + textNode.textView.textStorage.removeAttribute(NSAttributedStringKey.strikethroughStyle, range: fullRange) textNode.textView.textStorage.removeAttribute(ChatTextInputAttributes.textMention, range: fullRange) textNode.textView.textStorage.removeAttribute(ChatTextInputAttributes.textUrl, range: fullRange) @@ -432,6 +440,9 @@ func refreshChatTextInputAttributes(_ textNode: ASEditableTextNode, theme: Prese } else if key == ChatTextInputAttributes.monospace { textNode.textView.textStorage.addAttribute(key, value: value, range: range) fontAttributes.insert(.monospace) + } else if key == ChatTextInputAttributes.strikethrough { + textNode.textView.textStorage.addAttribute(key, value: value, range: range) + textNode.textView.textStorage.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSUnderlineStyle.styleSingle.rawValue as NSNumber, range: range) } } @@ -492,8 +503,8 @@ func chatTextInputAddFormattingAttribute(_ state: ChatTextInputState, attribute: for (key, _) in attributes { if key == attribute && range == nsRange { addAttribute = false + attributesToRemove.append(key) } - attributesToRemove.append(key) } } @@ -634,7 +645,7 @@ func breakChatInputText(_ text: NSAttributedString) -> [NSAttributedString] { } } -private let markdownRegexFormat = "(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s)(`|\\*\\*|__)([^\\n]+?)\\7([\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)" +private let markdownRegexFormat = "(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s)(`|\\*\\*|__|~~)([^\\n]+?)\\7([\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)" private let markdownRegex = try? NSRegularExpression(pattern: markdownRegexFormat, options: [.caseInsensitive, .anchorsMatchLines]) func convertMarkdownToAttributes(_ text: NSAttributedString) -> NSAttributedString { @@ -678,6 +689,9 @@ func convertMarkdownToAttributes(_ text: NSAttributedString) -> NSAttributedStri case "__": result.append(NSAttributedString(string: substring, attributes: [ChatTextInputAttributes.italic: true as NSNumber])) offsetRanges.append((NSMakeRange(matchIndex + match.range(at: 6).length, text.count), match.range(at: 6).length * 2)) + case "~~": + result.append(NSAttributedString(string: substring, attributes: [ChatTextInputAttributes.strikethrough: true as NSNumber])) + offsetRanges.append((NSMakeRange(matchIndex + match.range(at: 6).length, text.count), match.range(at: 6).length * 2)) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ContactListNode.swift b/submodules/TelegramUI/TelegramUI/ContactListNode.swift index 0bb1ffa500..7ce7d4fa31 100644 --- a/submodules/TelegramUI/TelegramUI/ContactListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactListNode.swift @@ -855,7 +855,7 @@ final class ContactListNode: ASDisplayNode { var authorizeImpl: (() -> Void)? var openPrivacyPolicyImpl: (() -> Void)? - self.authorizationNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: PermissionKind.contacts.rawValue, icon: UIImage(bundleImageName: "Settings/Permissions/Contacts"), title: self.presentationData.strings.Contacts_PermissionsTitle, text: self.presentationData.strings.Contacts_PermissionsText, buttonTitle: self.presentationData.strings.Contacts_PermissionsAllow, buttonAction: { + self.authorizationNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: PermissionKind.contacts.rawValue, icon: .image(UIImage(bundleImageName: "Settings/Permissions/Contacts")), title: self.presentationData.strings.Contacts_PermissionsTitle, text: self.presentationData.strings.Contacts_PermissionsText, buttonTitle: self.presentationData.strings.Contacts_PermissionsAllow, buttonAction: { authorizeImpl?() }, openPrivacyPolicy: { openPrivacyPolicyImpl?() @@ -1261,7 +1261,7 @@ final class ContactListNode: ASDisplayNode { let authorizationPreviousHidden = strongSelf.authorizationNode.isHidden strongSelf.authorizationNode.removeFromSupernode() - strongSelf.authorizationNode = PermissionContentNode(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, kind: PermissionKind.contacts.rawValue, icon: UIImage(bundleImageName: "Settings/Permissions/Contacts"), title: strongSelf.presentationData.strings.Contacts_PermissionsTitle, text: strongSelf.presentationData.strings.Contacts_PermissionsText, buttonTitle: strongSelf.presentationData.strings.Contacts_PermissionsAllow, buttonAction: { + strongSelf.authorizationNode = PermissionContentNode(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, kind: PermissionKind.contacts.rawValue, icon: .image(UIImage(bundleImageName: "Settings/Permissions/Contacts")), title: strongSelf.presentationData.strings.Contacts_PermissionsTitle, text: strongSelf.presentationData.strings.Contacts_PermissionsText, buttonTitle: strongSelf.presentationData.strings.Contacts_PermissionsAllow, buttonAction: { authorizeImpl?() }, openPrivacyPolicy: { openPrivacyPolicyImpl?() diff --git a/submodules/TelegramUI/TelegramUI/CreateGroupController.swift b/submodules/TelegramUI/TelegramUI/CreateGroupController.swift index 8505a00d17..b2309751b0 100644 --- a/submodules/TelegramUI/TelegramUI/CreateGroupController.swift +++ b/submodules/TelegramUI/TelegramUI/CreateGroupController.swift @@ -443,7 +443,7 @@ public func createGroupController(context: AccountContext, peerIds: [PeerId], in case .tooMuchLocationBasedGroups: text = presentationData.strings.CreateGroup_ErrorLocatedGroupsTooMuch } - presentControllerImpl?(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + presentControllerImpl?(textAlertController(context: context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) })) } }, changeProfilePhoto: { diff --git a/submodules/TelegramUI/TelegramUI/EmojiUtils.swift b/submodules/TelegramUI/TelegramUI/EmojiUtils.swift index 628ae1fed9..6cd4d4144a 100644 --- a/submodules/TelegramUI/TelegramUI/EmojiUtils.swift +++ b/submodules/TelegramUI/TelegramUI/EmojiUtils.swift @@ -135,4 +135,12 @@ extension String { } return string } + + var trimmedEmoji: String { + if self.unicodeScalars.count > 1, self.unicodeScalars.first?.value == 0x2764 { + return String(self.unicodeScalars.prefix(self.unicodeScalars.count - 1)) + } else { + return self + } + } } diff --git a/submodules/TelegramUI/TelegramUI/GenerateTextEntities.swift b/submodules/TelegramUI/TelegramUI/GenerateTextEntities.swift index e3fee8d72a..a1ef209e47 100644 --- a/submodules/TelegramUI/TelegramUI/GenerateTextEntities.swift +++ b/submodules/TelegramUI/TelegramUI/GenerateTextEntities.swift @@ -132,6 +132,8 @@ func generateChatInputTextEntities(_ text: NSAttributedString) -> [MessageTextEn entities.append(MessageTextEntity(range: range.lowerBound ..< range.upperBound, type: .Italic)) } else if key == ChatTextInputAttributes.monospace { entities.append(MessageTextEntity(range: range.lowerBound ..< range.upperBound, type: .Code)) + } else if key == ChatTextInputAttributes.strikethrough { + entities.append(MessageTextEntity(range: range.lowerBound ..< range.upperBound, type: .Strikethrough)) } else if key == ChatTextInputAttributes.textMention, let value = value as? ChatTextInputTextMentionAttribute { entities.append(MessageTextEntity(range: range.lowerBound ..< range.upperBound, type: .TextMention(peerId: value.peerId))) } else if key == ChatTextInputAttributes.textUrl, let value = value as? ChatTextInputTextUrlAttribute { diff --git a/submodules/TelegramUI/TelegramUI/GroupInfoController.swift b/submodules/TelegramUI/TelegramUI/GroupInfoController.swift index 92cc8227f0..17aff0ee26 100644 --- a/submodules/TelegramUI/TelegramUI/GroupInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/GroupInfoController.swift @@ -94,6 +94,7 @@ private enum GroupInfoEntryTag { private enum GroupInfoMemberStatus { case member case admin + case owner } private enum GroupEntryStableId: Hashable, Equatable { @@ -529,6 +530,8 @@ private enum GroupInfoEntry: ItemListNodeEntry { case let .member(theme, strings, dateTimeFormat, nameDisplayOrder, _, _, peer, participant, presence, memberStatus, editing, actions, enabled, selectable): let label: String? switch memberStatus { + case .owner: + label = strings.GroupInfo_LabelOwner case .admin: label = strings.GroupInfo_LabelAdmin case .member: @@ -831,7 +834,9 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa if isCreator || (channel.adminRights != nil && channel.hasPermission(.pinMessages)) { if cachedChannelData.peerGeoLocation != nil { - entries.append(GroupInfoEntry.groupTypeSetup(presentationData.theme, presentationData.strings.GroupInfo_PublicLink, channel.addressName ?? presentationData.strings.GroupInfo_PublicLinkAdd)) + if isCreator { + entries.append(GroupInfoEntry.groupTypeSetup(presentationData.theme, presentationData.strings.GroupInfo_PublicLink, channel.addressName ?? presentationData.strings.GroupInfo_PublicLinkAdd)) + } } else { if cachedChannelData.flags.contains(.canChangeUsername) { entries.append(GroupInfoEntry.groupTypeSetup(presentationData.theme, presentationData.strings.GroupInfo_GroupType, isPublic ? presentationData.strings.Channel_Setup_TypePublic : presentationData.strings.Channel_Setup_TypePrivate)) @@ -1128,7 +1133,7 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa let memberStatus: GroupInfoMemberStatus switch participant.participant { case .creator: - memberStatus = .admin + memberStatus = .owner case let .member(_, _, adminInfo, _): if adminInfo != nil { memberStatus = .admin @@ -1563,7 +1568,7 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: } } else if let channel = groupPeer as? TelegramChannel { if channel.hasPermission(.inviteMembers) { - if channel.flags.contains(.isCreator) || channel.adminRights != nil { + if channel.flags.contains(.isCreator) || (channel.adminRights != nil && channel.username == nil) { canCreateInviteLink = true } } @@ -2027,7 +2032,9 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: |> mapToSignal { address -> Signal in return updateChannelGeoLocation(postbox: context.account.postbox, network: context.account.network, channelId: peer.id, coordinate: (coordinate.latitude, coordinate.longitude), address: address) } - |> deliverOnMainQueue).start() + |> deliverOnMainQueue).start(error: { errror in + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: {})]), nil) + }) }, sendLiveLocation: { _, _ in }, theme: presentationData.theme, customLocationPicker: true, presentationCompleted: { clearHighlightImpl?() }) diff --git a/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift b/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift index ffcb48d99a..a85983d0bd 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift @@ -184,13 +184,14 @@ class ItemListAddressItemNode: ListViewItemNode { let string = stringWithAppliedEntities(item.text, entities: [], baseColor: baseColor, linkColor: item.theme.list.itemAccentColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, fixedFont: textFixedFont) let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: string, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - leftOffset - leftInset - rightInset - 98.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) - var padding: CGFloat = !item.label.isEmpty ? 39.0 : 20.0 - let contentSize = CGSize(width: params.width, height: textLayout.size.height + padding) + let padding: CGFloat = !item.label.isEmpty ? 39.0 : 20.0 - let imageSide = min(90.0, contentSize.height - 18.0) + let imageSide = min(90.0, max(46.0, textLayout.size.height + padding - 18.0)) let imageSize = CGSize(width: imageSide, height: imageSide) let imageApply = makeImageLayout(TransformImageArguments(corners: ImageCorners(radius: 4.0), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets())) + let contentSize = CGSize(width: params.width, height: max(textLayout.size.height + padding, imageSize.height + 18.0)) + let nodeLayout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) return (nodeLayout, { [weak self] animation in if let strongSelf = self { @@ -250,7 +251,8 @@ class ItemListAddressItemNode: ListViewItemNode { strongSelf.imageNode.frame = imageFrame if let icon = strongSelf.iconNode.image { - strongSelf.iconNode.frame = CGRect(origin: CGPoint(x: imageFrame.minX + floorToScreenPixels((imageFrame.width - icon.size.width) / 2.0), y: imageFrame.minY + floorToScreenPixels((imageFrame.height - icon.size.height) / 2.0) - 7.0), size: icon.size) + strongSelf.iconNode.frame = CGRect(origin: CGPoint(x: imageFrame.minX + floorToScreenPixels((imageFrame.width - icon.size.width) / 2.0), y: imageFrame.minY + floorToScreenPixels((imageFrame.height - icon.size.height) / 2.0) - 7.0), size: icon.size) + strongSelf.iconNode.isHidden = imageSize.height < 50.0 } let leftInset: CGFloat diff --git a/submodules/TelegramUI/TelegramUI/ItemListSectionHeaderItem.swift b/submodules/TelegramUI/TelegramUI/ItemListSectionHeaderItem.swift index 232dfdef74..2c729af3c2 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListSectionHeaderItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListSectionHeaderItem.swift @@ -19,15 +19,17 @@ class ItemListSectionHeaderItem: ListViewItem, ItemListItem { let theme: PresentationTheme let text: String let multiline: Bool + let activityIndicator: Bool let accessoryText: ItemListSectionHeaderAccessoryText? let sectionId: ItemListSectionId let isAlwaysPlain: Bool = true - init(theme: PresentationTheme, text: String, multiline: Bool = false, accessoryText: ItemListSectionHeaderAccessoryText? = nil, sectionId: ItemListSectionId) { + init(theme: PresentationTheme, text: String, multiline: Bool = false, activityIndicator: Bool = false, accessoryText: ItemListSectionHeaderAccessoryText? = nil, sectionId: ItemListSectionId) { self.theme = theme self.text = text self.multiline = multiline + self.activityIndicator = activityIndicator self.accessoryText = accessoryText self.sectionId = sectionId } @@ -72,8 +74,11 @@ class ItemListSectionHeaderItem: ListViewItem, ItemListItem { private let titleFont = Font.regular(14.0) class ItemListSectionHeaderItemNode: ListViewItemNode { + private var item: ItemListSectionHeaderItem? + private let titleNode: TextNode private let accessoryTextNode: TextNode + private var activityIndicator: ActivityIndicator? private let activateArea: AccessibilityAreaNode @@ -102,6 +107,8 @@ class ItemListSectionHeaderItemNode: ListViewItemNode { let makeTitleLayout = TextNode.asyncLayout(self.titleNode) let makeAccessoryTextLayout = TextNode.asyncLayout(self.accessoryTextNode) + let previousItem = self.item + return { item, params, neighbors in let leftInset: CGFloat = 15.0 + params.leftInset @@ -136,6 +143,8 @@ class ItemListSectionHeaderItemNode: ListViewItemNode { return (layout, { [weak self] in if let strongSelf = self { + strongSelf.item = item + let _ = titleApply() let _ = accessoryApply() @@ -144,6 +153,31 @@ class ItemListSectionHeaderItemNode: ListViewItemNode { strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 7.0), size: titleLayout.size) strongSelf.accessoryTextNode.frame = CGRect(origin: CGPoint(x: params.width - leftInset - accessoryLayout.size.width, y: 7.0), size: accessoryLayout.size) + + if previousItem?.activityIndicator != item.activityIndicator { + if item.activityIndicator { + let activityIndicator: ActivityIndicator + if let currentActivityIndicator = strongSelf.activityIndicator { + activityIndicator = currentActivityIndicator + } else { + activityIndicator = ActivityIndicator(type: .custom(item.theme.list.sectionHeaderTextColor, 18.0, 1.0, false)) + strongSelf.addSubnode(activityIndicator) + strongSelf.activityIndicator = activityIndicator + } + activityIndicator.isHidden = false + if previousItem != nil { + activityIndicator.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, removeOnCompletion: false) + } + } else if let activityIndicator = strongSelf.activityIndicator { + activityIndicator.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { finished in + if finished { + activityIndicator.isHidden = true + } + }) + } + } + + strongSelf.activityIndicator?.frame = CGRect(origin: CGPoint(x: strongSelf.titleNode.frame.maxX + 6.0, y: 7.0 - UIScreenPixel), size: CGSize(width: 18.0, height: 18.0)) } }) } diff --git a/submodules/TelegramUI/TelegramUI/LegacyChannelIntroController.swift b/submodules/TelegramUI/TelegramUI/LegacyChannelIntroController.swift deleted file mode 100644 index abf4953502..0000000000 --- a/submodules/TelegramUI/TelegramUI/LegacyChannelIntroController.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation -import TelegramCore -import Display -import TelegramPresentationData - -import TelegramUIPrivateModule - -func legacyChannelIntroController(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings) -> ViewController { - let controller = LegacyController(presentation: .custom, theme: theme) - controller.bind(controller: TGChannelIntroController(context: controller.context, getLocalizedString: { string in - guard let string = string else { - return nil - } - if let value = strings.primaryComponent.dict[string] { - return value - } else if let value = strings.secondaryComponent?.dict[string] { - return value - } else { - return string - } - }, theme: TGChannelIntroControllerTheme(backgroundColor: theme.list.plainBackgroundColor, primaryColor: theme.list.itemPrimaryTextColor, secondaryColor: theme.list.itemSecondaryTextColor, accentColor: theme.list.itemAccentColor, backArrowImage: NavigationBarTheme.generateBackArrowImage(color: theme.list.itemAccentColor), introImage: UIImage(bundleImageName: "Chat/Intro/ChannelIntro")), dismiss: { [weak controller] in - if let navigationController = controller?.navigationController as? NavigationController { - _ = navigationController.popViewController(animated: true) - } - }, completion: { [weak controller] in - if let navigationController = controller?.navigationController as? NavigationController { - navigationController.replaceTopController(createChannelController(context: context), animated: true) - } - })!) - return controller -} diff --git a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift index 30b2cd0bdb..082a37fb4d 100644 --- a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift +++ b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift @@ -10,7 +10,7 @@ public enum NavigateToChatKeepStack { case never } -public func navigateToChatController(navigationController: NavigationController, chatController: ChatController? = nil, context: AccountContext, chatLocation: ChatLocation, messageId: MessageId? = nil, botStart: ChatControllerInitialBotStart? = nil, updateTextInputState: ChatTextInputState? = nil, keepStack: NavigateToChatKeepStack = .default, purposefulAction: (() -> Void)? = nil, scrollToEndIfExists: Bool = false, animated: Bool = true, parentGroupId: PeerGroupId? = nil, completion: @escaping () -> Void = {}) { +public func navigateToChatController(navigationController: NavigationController, chatController: ChatController? = nil, context: AccountContext, chatLocation: ChatLocation, messageId: MessageId? = nil, botStart: ChatControllerInitialBotStart? = nil, updateTextInputState: ChatTextInputState? = nil, activateInput: Bool = false, keepStack: NavigateToChatKeepStack = .default, purposefulAction: (() -> Void)? = nil, scrollToEndIfExists: Bool = false, animated: Bool = true, parentGroupId: PeerGroupId? = nil, completion: @escaping () -> Void = {}) { var found = false var isFirst = true for controller in navigationController.viewControllers.reversed() { @@ -35,6 +35,9 @@ public func navigateToChatController(navigationController: NavigationController, completion() } controller.purposefulAction = purposefulAction + if activateInput { + controller.activateInput() + } found = true break } @@ -80,6 +83,9 @@ public func navigateToChatController(navigationController: NavigationController, navigationController.replaceControllersAndPush(controllers: viewControllers, controller: controller, animated: animated, completion: completion) } } + if activateInput { + controller.activateInput() + } } navigationController.currentWindow?.forEachController { controller in diff --git a/submodules/TelegramUI/TelegramUI/Notices.swift b/submodules/TelegramUI/TelegramUI/Notices.swift index d0d60b1308..dec9318aa2 100644 --- a/submodules/TelegramUI/TelegramUI/Notices.swift +++ b/submodules/TelegramUI/TelegramUI/Notices.swift @@ -141,11 +141,16 @@ private struct ApplicationSpecificNoticeKeys { private static let botPaymentLiabilityNamespace: Int32 = 1 private static let globalNamespace: Int32 = 2 private static let permissionsNamespace: Int32 = 3 + private static let peerReportNamespace: Int32 = 4 static func botPaymentLiabilityNotice(peerId: PeerId) -> NoticeEntryKey { return NoticeEntryKey(namespace: noticeNamespace(namespace: botPaymentLiabilityNamespace), key: noticeKey(peerId: peerId, key: 0)) } + static func irrelevantPeerGeoNotice(peerId: PeerId) -> NoticeEntryKey { + return NoticeEntryKey(namespace: noticeNamespace(namespace: peerReportNamespace), key: noticeKey(peerId: peerId, key: 0)) + } + static func secretChatInlineBotUsage() -> NoticeEntryKey { return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.secretChatInlineBotUsage.key) } @@ -200,6 +205,16 @@ private struct ApplicationSpecificNoticeKeys { } public struct ApplicationSpecificNotice { + static func irrelevantPeerGeoReportKey(peerId: PeerId) -> NoticeEntryKey { + return ApplicationSpecificNoticeKeys.irrelevantPeerGeoNotice(peerId: peerId) + } + + static func setIrrelevantPeerGeoReport(postbox: Postbox, peerId: PeerId) -> Signal { + return postbox.transaction { transaction -> Void in + transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.irrelevantPeerGeoNotice(peerId: peerId), value: ApplicationSpecificBoolNotice()) + } + } + static func getBotPaymentLiability(accountManager: AccountManager, peerId: PeerId) -> Signal { return accountManager.transaction { transaction -> Bool in if let _ = transaction.getNotice(ApplicationSpecificNoticeKeys.botPaymentLiabilityNotice(peerId: peerId)) as? ApplicationSpecificBoolNotice { diff --git a/submodules/TelegramUI/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift b/submodules/TelegramUI/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift index 1f5242f177..f258c50927 100644 --- a/submodules/TelegramUI/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift +++ b/submodules/TelegramUI/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift @@ -253,9 +253,7 @@ final class PeerChannelMemberCategoriesContextsManager { strongSelf.impl.with { impl in for (contextPeerId, context) in impl.contexts { if peerId == contextPeerId { - for (previous, updated) in results { - context.replayUpdates([(previous, updated, nil)]) - } + context.replayUpdates(results.map { ($0.0, $0.1, nil) }) } } } diff --git a/submodules/TelegramUI/TelegramUI/PeersNearbyController.swift b/submodules/TelegramUI/TelegramUI/PeersNearbyController.swift index 37e043ce91..5bcd2261b1 100644 --- a/submodules/TelegramUI/TelegramUI/PeersNearbyController.swift +++ b/submodules/TelegramUI/TelegramUI/PeersNearbyController.swift @@ -56,11 +56,11 @@ private enum PeersNearbySection: Int32 { private enum PeersNearbyEntry: ItemListNodeEntry { case header(PresentationTheme, String) - case usersHeader(PresentationTheme, String) - case empty(PresentationTheme, String, Bool) + case usersHeader(PresentationTheme, String, Bool) + case empty(PresentationTheme, String) case user(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) - case groupsHeader(PresentationTheme, String) + case groupsHeader(PresentationTheme, String, Bool) case createGroup(PresentationTheme, String, Double?, Double?, String?) case group(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) @@ -111,14 +111,14 @@ private enum PeersNearbyEntry: ItemListNodeEntry { } else { return false } - case let .usersHeader(lhsTheme, lhsText): - if case let .usersHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + case let .usersHeader(lhsTheme, lhsText, lhsLoading): + if case let .usersHeader(rhsTheme, rhsText, rhsLoading) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsLoading == rhsLoading { return true } else { return false } - case let .empty(lhsTheme, lhsText, lhsLoading): - if case let .empty(rhsTheme, rhsText, rhsLoading) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsLoading == rhsLoading { + case let .empty(lhsTheme, lhsText): + if case let .empty(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { return true } else { return false @@ -129,8 +129,8 @@ private enum PeersNearbyEntry: ItemListNodeEntry { } else { return false } - case let .groupsHeader(lhsTheme, lhsText): - if case let .groupsHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + case let .groupsHeader(lhsTheme, lhsText, lhsLoading): + if case let .groupsHeader(rhsTheme, rhsText, rhsLoading) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsLoading == rhsLoading { return true } else { return false @@ -181,16 +181,16 @@ private enum PeersNearbyEntry: ItemListNodeEntry { switch self { case let .header(theme, text): return PeersNearbyHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .usersHeader(theme, text): - return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .empty(theme, text, _): + case let .usersHeader(theme, text, loading): + return ItemListSectionHeaderItem(theme: theme, text: text, activityIndicator: loading, sectionId: self.section) + case let .empty(theme, text): return ItemListPlaceholderItem(theme: theme, text: text, sectionId: self.section, style: .blocks) case let .user(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer.peer.0, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: .text(strings.Map_DistanceAway(stringForDistance(peer.distance)).0), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { arguments.openChat(peer.peer.0) }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopGroupInset: false, tag: nil) - case let .groupsHeader(theme, text): - return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) + case let .groupsHeader(theme, text, loading): + return ItemListSectionHeaderItem(theme: theme, text: text, activityIndicator: loading, sectionId: self.section) case let .createGroup(theme, title, latitude, longitude, address): return ItemListPeerActionItem(theme: theme, icon: PresentationResourcesItemList.createGroupIcon(theme), title: title, alwaysPlain: false, sectionId: self.section, editing: false, action: { if let latitude = latitude, let longitude = longitude { @@ -200,7 +200,7 @@ private enum PeersNearbyEntry: ItemListNodeEntry { case let .group(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): var text: ItemListPeerItemText if let cachedData = peer.peer.1 as? CachedChannelData, let memberCount = cachedData.participantsSummary.memberCount { - text = .text("\(strings.Map_DistanceAway(stringForDistance(peer.distance)).0), \(strings.Conversation_StatusMembers(memberCount))") + text = .text("\(strings.Map_DistanceAway(stringForDistance(peer.distance)).0), \(memberCount > 0 ? strings.Conversation_StatusMembers(memberCount) : strings.PeopleNearby_NoMembers)") } else { text = .text(strings.Map_DistanceAway(stringForDistance(peer.distance)).0) } @@ -245,11 +245,11 @@ private struct PeersNearbyData: Equatable { } } -private func peersNearbyControllerEntries(data: PeersNearbyData?, presentationData: PresentationData) -> [PeersNearbyEntry] { +private func peersNearbyControllerEntries(data: PeersNearbyData?, presentationData: PresentationData, displayLoading: Bool) -> [PeersNearbyEntry] { var entries: [PeersNearbyEntry] = [] entries.append(.header(presentationData.theme, presentationData.strings.PeopleNearby_Description)) - entries.append(.usersHeader(presentationData.theme, presentationData.strings.PeopleNearby_Users.uppercased())) + entries.append(.usersHeader(presentationData.theme, presentationData.strings.PeopleNearby_Users.uppercased(), displayLoading && data == nil)) if let data = data, !data.users.isEmpty { var i: Int32 = 0 for user in data.users { @@ -257,10 +257,10 @@ private func peersNearbyControllerEntries(data: PeersNearbyData?, presentationDa i += 1 } } else { - entries.append(.empty(presentationData.theme, presentationData.strings.PeopleNearby_UsersEmpty, data == nil)) + entries.append(.empty(presentationData.theme, presentationData.strings.PeopleNearby_UsersEmpty)) } - entries.append(.groupsHeader(presentationData.theme, presentationData.strings.PeopleNearby_Groups.uppercased())) + entries.append(.groupsHeader(presentationData.theme, presentationData.strings.PeopleNearby_Groups.uppercased(), displayLoading && data == nil)) entries.append(.createGroup(presentationData.theme, presentationData.strings.PeopleNearby_CreateGroup, data?.latitude, data?.longitude, data?.address)) if let data = data, !data.groups.isEmpty { var i: Int32 = 0 @@ -271,7 +271,6 @@ private func peersNearbyControllerEntries(data: PeersNearbyData?, presentationDa } if let data = data, !data.channels.isEmpty { - entries.append(.channelsHeader(presentationData.theme, presentationData.strings.PeopleNearby_Channels.uppercased())) var i: Int32 = 0 for channel in data.channels { entries.append(.channel(i, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, channel)) @@ -290,6 +289,8 @@ public func peersNearbyController(context: AccountContext) -> ViewController { var navigateToChatImpl: ((Peer) -> Void)? let actionsDisposable = DisposableSet() + let checkCreationAvailabilityDisposable = MetaDisposable() + actionsDisposable.add(checkCreationAvailabilityDisposable) let dataPromise = Promise(nil) let addressPromise = Promise(nil) @@ -298,40 +299,66 @@ public func peersNearbyController(context: AccountContext) -> ViewController { navigateToChatImpl?(peer) }, openCreateGroup: { latitude, longitude, address in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = PermissionController(context: context, splashScreen: true) - controller.setState(.custom(icon: PermissionControllerCustomIcon(light: UIImage(bundleImageName: "Location/LocalGroupLightIcon"), dark: UIImage(bundleImageName: "Location/LocalGroupDarkIcon")), title: presentationData.strings.LocalGroup_Title, subtitle: address, text: presentationData.strings.LocalGroup_Text, buttonTitle: presentationData.strings.LocalGroup_ButtonTitle, footerText: presentationData.strings.LocalGroup_IrrelevantWarning), animated: false) - controller.proceed = { result in - replaceTopControllerImpl?(createGroupController(context: context, peerIds: [], mode: .locatedGroup(latitude: latitude, longitude: longitude, address: address))) + + var cancelImpl: (() -> Void)? + let progressSignal = Signal { subscriber in + let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + cancelImpl?() + })) + presentControllerImpl?(controller, nil) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } + } } - pushControllerImpl?(controller) + |> runOn(Queue.mainQueue()) + |> delay(0.5, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() + cancelImpl = { + checkCreationAvailabilityDisposable.set(nil) + } + checkCreationAvailabilityDisposable.set((checkPublicChannelCreationAvailability(account: context.account, location: true) + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } + } + |> deliverOnMainQueue).start(next: { available in + if available { + let controller = PermissionController(context: context, splashScreen: true) + controller.setState(.custom(icon: PermissionControllerCustomIcon(light: UIImage(bundleImageName: "Location/LocalGroupLightIcon"), dark: UIImage(bundleImageName: "Location/LocalGroupDarkIcon")), title: presentationData.strings.LocalGroup_Title, subtitle: address, text: presentationData.strings.LocalGroup_Text, buttonTitle: presentationData.strings.LocalGroup_ButtonTitle, footerText: presentationData.strings.LocalGroup_IrrelevantWarning), animated: false) + controller.proceed = { result in + replaceTopControllerImpl?(createGroupController(context: context, peerIds: [], mode: .locatedGroup(latitude: latitude, longitude: longitude, address: address))) + } + pushControllerImpl?(controller) + } else { + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.CreateGroup_ErrorLocatedGroupsTooMuch, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + } + })) }) - let dataSignal: Signal = currentLocationManagerCoordinate(manager: context.sharedContext.locationManager!, timeout: 5.0) - |> introduceError(Void.self) - |> mapToSignal { coordinate -> Signal in + let dataSignal: Signal = currentLocationManagerCoordinate(manager: context.sharedContext.locationManager!, timeout: 5.0) + |> mapToSignal { coordinate -> Signal in guard let coordinate = coordinate else { return .single(nil) } - print("TTTTT: \(CFAbsoluteTimeGetCurrent())") - return Signal { subscriber in let peersNearbyContext = PeersNearbyContext(network: context.account.network, accountStateManager: context.account.stateManager, coordinate: (latitude: coordinate.latitude, longitude: coordinate.longitude)) - let peersNearby: Signal = combineLatest(peersNearbyContext.get(), addressPromise.get()) - |> introduceError(Void.self) - |> mapToSignal { peersNearby, address -> Signal<([PeerNearby]?, String?), Void> in + let peersNearby: Signal = combineLatest(peersNearbyContext.get(), addressPromise.get()) + |> mapToSignal { peersNearby, address -> Signal<([PeerNearby]?, String?), NoError> in if let address = address { return .single((peersNearby, address)) } else { return reverseGeocodeLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) - |> introduceError(Void.self) |> map { placemark in return (peersNearby, placemark?.fullAddress) } } } - |> mapToSignal { peersNearby, address -> Signal in + |> mapToSignal { peersNearby, address -> Signal in guard let peersNearby = peersNearby else { return .single(nil) } @@ -350,7 +377,6 @@ public func peersNearbyController(context: AccountContext) -> ViewController { } return PeersNearbyData(latitude: coordinate.latitude, longitude: coordinate.longitude, address: address, users: users, groups: groups, channels: []) } - |> introduceError(Void.self) } let disposable = peersNearby.start(next: { data in @@ -363,25 +389,18 @@ public func peersNearbyController(context: AccountContext) -> ViewController { } } } - - let errorSignal: Signal = .single(Void()) |> then( Signal.fail(Void()) |> suspendAwareDelay(25.0, queue: Queue.concurrentDefaultQueue()) ) - let combinedSignal = combineLatest(dataSignal, errorSignal) |> map { data, _ -> PeersNearbyData? in - return data - } - |> restartIfError - |> `catch` { _ -> Signal in - return .single(nil) - } |> filter { value in - return value != nil - } - dataPromise.set(.single(nil) |> then(combinedSignal)) - + dataPromise.set(dataSignal) let previousData = Atomic(value: nil) + let displayLoading: Signal = .single(false) + |> then( + .single(true) + |> delay(1.0, queue: Queue.mainQueue()) + ) - let signal = combineLatest(context.sharedContext.presentationData, dataPromise.get()) + let signal = combineLatest(context.sharedContext.presentationData, dataPromise.get(), displayLoading) |> deliverOnMainQueue - |> map { presentationData, data -> (ItemListControllerState, (ItemListNodeState, PeersNearbyEntry.ItemGenerationArguments)) in + |> map { presentationData, data, displayLoading -> (ItemListControllerState, (ItemListNodeState, PeersNearbyEntry.ItemGenerationArguments)) in let previous = previousData.swap(data) var crossfade = false @@ -393,7 +412,7 @@ public func peersNearbyController(context: AccountContext) -> ViewController { } let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.PeopleNearby_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) - let listState = ItemListNodeState(entries: peersNearbyControllerEntries(data: data, presentationData: presentationData), style: .blocks, emptyStateItem: nil, crossfadeState: crossfade, animateChanges: !crossfade, userInteractionEnabled: true) + let listState = ItemListNodeState(entries: peersNearbyControllerEntries(data: data, presentationData: presentationData, displayLoading: displayLoading), style: .blocks, emptyStateItem: nil, crossfadeState: crossfade, animateChanges: !crossfade, userInteractionEnabled: true) return (controllerState, (listState, arguments)) } diff --git a/submodules/TelegramUI/TelegramUI/PermissionContentNode.swift b/submodules/TelegramUI/TelegramUI/PermissionContentNode.swift index 5b2045e323..3a8bd2b6de 100644 --- a/submodules/TelegramUI/TelegramUI/PermissionContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/PermissionContentNode.swift @@ -4,10 +4,24 @@ import Display import AsyncDisplayKit import TelegramPresentationData +enum PermissionContentIcon { + case image(UIImage?) + case icon(PermissionControllerCustomIcon) + + func imageForTheme(_ theme: PresentationTheme) -> UIImage? { + switch self { + case let .image(image): + return image + case let .icon(icon): + return theme.overallDarkAppearance ? (icon.dark ?? icon.light) : icon.light + } + } +} + final class PermissionContentNode: ASDisplayNode { private var theme: PresentationTheme let kind: Int32 - + private let iconNode: ASImageNode private let nearbyIconNode: PeersNearbyIconNode? private let titleNode: ImmediateTextNode @@ -17,19 +31,25 @@ final class PermissionContentNode: ASDisplayNode { private let footerNode: ImmediateTextNode private let privacyPolicyButton: HighlightableButtonNode + private let icon: PermissionContentIcon private var title: String + private var text: String var buttonAction: (() -> Void)? var openPrivacyPolicy: (() -> Void)? - init(theme: PresentationTheme, strings: PresentationStrings, kind: Int32, icon: UIImage?, title: String, subtitle: String? = nil, text: String, buttonTitle: String, footerText: String? = nil, buttonAction: @escaping () -> Void, openPrivacyPolicy: (() -> Void)?) { + var validLayout: (CGSize, UIEdgeInsets)? + + init(theme: PresentationTheme, strings: PresentationStrings, kind: Int32, icon: PermissionContentIcon, title: String, subtitle: String? = nil, text: String, buttonTitle: String, footerText: String? = nil, buttonAction: @escaping () -> Void, openPrivacyPolicy: (() -> Void)?) { self.theme = theme self.kind = kind self.buttonAction = buttonAction self.openPrivacyPolicy = openPrivacyPolicy + self.icon = icon self.title = title + self.text = text self.iconNode = ASImageNode() self.iconNode.isLayerBacked = true @@ -71,7 +91,7 @@ final class PermissionContentNode: ASDisplayNode { super.init() - self.iconNode.image = icon + self.iconNode.image = icon.imageForTheme(theme) self.title = title let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemPrimaryTextColor) @@ -107,11 +127,39 @@ final class PermissionContentNode: ASDisplayNode { self.privacyPolicyButton.addTarget(self, action: #selector(self.privacyPolicyPressed), forControlEvents: .touchUpInside) } + func updatePresentationData(_ presentationData: PresentationData) { + let theme = presentationData.theme + self.theme = theme + + self.iconNode.image = self.icon.imageForTheme(theme) + + let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemPrimaryTextColor) + let link = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemAccentColor, additionalAttributes: [TelegramTextAttributes.URL: ""]) + self.textNode.attributedText = parseMarkdownIntoAttributedString(self.text.replacingOccurrences(of: "]", with: "]()"), attributes: MarkdownAttributes(body: body, bold: body, link: link, linkAttribute: { _ in nil }), textAlignment: .center) + + if let subtitle = self.subtitleNode.attributedText?.string { + self.subtitleNode.attributedText = NSAttributedString(string: subtitle, font: Font.regular(13.0), textColor: theme.list.freeTextColor, paragraphAlignment: .center) + } + if let footerText = self.footerNode.attributedText?.string { + self.footerNode.attributedText = NSAttributedString(string: footerText, font: Font.regular(13.0), textColor: theme.list.freeTextColor, paragraphAlignment: .center) + } + + if let privacyPolicyTitle = self.privacyPolicyButton.attributedTitle(for: .normal)?.string { + self.privacyPolicyButton.setTitle(privacyPolicyTitle, with: Font.regular(16.0), with: theme.list.itemAccentColor, for: .normal) + } + + if let validLayout = self.validLayout { + self.updateLayout(size: validLayout.0, insets: validLayout.1, transition: .immediate) + } + } + @objc func privacyPolicyPressed() { self.openPrivacyPolicy?() } func updateLayout(size: CGSize, insets: UIEdgeInsets, transition: ContainedViewLayoutTransition) { + self.validLayout = (size, insets) + let sidePadding: CGFloat let fontSize: CGFloat if min(size.width, size.height) > 330.0 { @@ -159,7 +207,12 @@ final class PermissionContentNode: ASDisplayNode { let privacySpacing: CGFloat = max(30.0 + privacyButtonSize.height, (availableHeight - titleTextSpacing - buttonSpacing - imageSize.height - imageSpacing) / 2.0) - let contentOrigin = insets.top + floor((size.height - insets.top - insets.bottom - contentHeight) / 2.0) - availableHeight * 0.05 + var verticalOffset: CGFloat = 0.0 + if size.height >= 568.0 { + verticalOffset = availableHeight * 0.05 + } + + let contentOrigin = insets.top + floor((size.height - insets.top - insets.bottom - contentHeight) / 2.0) - verticalOffset let iconFrame = CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: contentOrigin), size: imageSize) let nearbyIconFrame = CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: contentOrigin), size: imageSize) let titleFrame = CGRect(origin: CGPoint(x: floor((size.width - titleSize.width) / 2.0), y: iconFrame.maxY + imageSpacing), size: titleSize) @@ -188,5 +241,7 @@ final class PermissionContentNode: ASDisplayNode { transition.updateFrame(node: self.actionButton, frame: buttonFrame) transition.updateFrame(node: self.footerNode, frame: footerFrame) transition.updateFrame(node: self.privacyPolicyButton, frame: privacyButtonFrame) + + self.footerNode.isHidden = size.height < 568.0 } } diff --git a/submodules/TelegramUI/TelegramUI/PermissionControllerNode.swift b/submodules/TelegramUI/TelegramUI/PermissionControllerNode.swift index 9cd45c2878..a3318b8d1d 100644 --- a/submodules/TelegramUI/TelegramUI/PermissionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PermissionControllerNode.swift @@ -84,17 +84,14 @@ final class PermissionControllerNode: ASDisplayNode { return UITracingLayerView() }) - self.applyPresentationData() + self.updatePresentationData(self.presentationData) } func updatePresentationData(_ presentationData: PresentationData) { self.presentationData = presentationData - self.applyPresentationData() - } - - private func applyPresentationData() { self.backgroundColor = self.presentationData.theme.list.plainBackgroundColor + self.contentNode?.updatePresentationData(self.presentationData) } func animateIn(completion: (() -> Void)? = nil) { @@ -207,7 +204,7 @@ final class PermissionControllerNode: ASDisplayNode { hasPrivacyPolicy = false } - let contentNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: dataState.kind.rawValue, icon: icon, title: title, text: text, buttonTitle: buttonTitle, buttonAction: { [weak self] in + let contentNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: dataState.kind.rawValue, icon: .image(icon), title: title, text: text, buttonTitle: buttonTitle, buttonAction: { [weak self] in self?.allow?() }, openPrivacyPolicy: hasPrivacyPolicy ? self.openPrivacyPolicy : nil) self.insertSubnode(contentNode, at: 0) @@ -236,15 +233,8 @@ final class PermissionControllerNode: ASDisplayNode { if let contentNode = self.contentNode { transition.updateFrame(node: contentNode, frame: contentFrame) contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: transition) - } else { - let iconImage: UIImage? - if self.presentationData.theme.overallDarkAppearance { - iconImage = icon.dark ?? icon.light - } else { - iconImage = icon.light - } - - let contentNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: 0, icon: iconImage, title: title, subtitle: subtitle, text: text, buttonTitle: buttonTitle, footerText: footerText, buttonAction: { [weak self] in + } else { + let contentNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: 0, icon: .icon(icon), title: title, subtitle: subtitle, text: text, buttonTitle: buttonTitle, footerText: footerText, buttonAction: { [weak self] in self?.allow?() }, openPrivacyPolicy: nil) self.insertSubnode(contentNode, at: 0) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 5f0e5ad953..43f28b412f 100644 Binary files a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping and b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping differ diff --git a/submodules/TelegramUI/TelegramUI/SolidRoundedButtonNode.swift b/submodules/TelegramUI/TelegramUI/SolidRoundedButtonNode.swift index b5b0349a64..eceb8094e9 100644 --- a/submodules/TelegramUI/TelegramUI/SolidRoundedButtonNode.swift +++ b/submodules/TelegramUI/TelegramUI/SolidRoundedButtonNode.swift @@ -68,6 +68,14 @@ final class SolidRoundedButtonNode: ASDisplayNode { } } + func updateTheme(_ theme: PresentationTheme) { + self.theme = theme + + self.buttonBackgroundNode.image = generateStretchableFilledCircleImage(radius: cornerRadius, color: theme.list.itemCheckColors.fillColor) + self.buttonGlossNode.color = theme.list.itemCheckColors.foregroundColor + self.labelNode.attributedText = NSAttributedString(string: self.title ?? "", font: Font.medium(17.0), textColor: theme.list.itemCheckColors.foregroundColor) + } + func updateLayout(width: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat { self.validLayout = width diff --git a/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift index c038c59c41..d36a8ff2da 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift @@ -267,7 +267,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode { let query = text.trimmingCharacters(in: .whitespacesAndNewlines) if query.isSingleEmoji { - signals = .single([searchStickers(account: account, query: text) + signals = .single([searchStickers(account: account, query: text.trimmedEmoji) |> take(1) |> map { (nil, $0) }]) } else if query.count > 1, let languageCode = languageCode, !languageCode.isEmpty && languageCode != "emoji" { @@ -290,7 +290,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode { var signals: [Signal<(String?, [FoundStickerItem]), NoError>] = [] let emoticons = keywords.flatMap { $0.emoticons } for emoji in emoticons { - signals.append(searchStickers(account: self.context.account, query: emoji) + signals.append(searchStickers(account: self.context.account, query: emoji.trimmedEmoji) |> take(1) |> map { (emoji, $0) }) } diff --git a/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift b/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift index 63adeae151..9c38d83547 100644 --- a/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift +++ b/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift @@ -34,6 +34,8 @@ func chatInputStateStringWithAppliedEntities(_ text: String, entities: [MessageT string.addAttribute(ChatTextInputAttributes.textUrl, value: ChatTextInputTextUrlAttribute(url: url), range: range) case .Code, .Pre: string.addAttribute(ChatTextInputAttributes.monospace, value: true as NSNumber, range: range) + case .Strikethrough: + string.addAttribute(ChatTextInputAttributes.strikethrough, value: true as NSNumber, range: range) default: break } @@ -121,6 +123,8 @@ func stringWithAppliedEntities(_ text: String, entities: [MessageTextEntity], ba nsString = text as NSString } string.addAttribute(NSAttributedStringKey(rawValue: TelegramTextAttributes.PeerTextMention), value: nsString!.substring(with: range), range: range) + case .Strikethrough: + string.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSUnderlineStyle.styleSingle.rawValue as NSNumber, range: range) case let .TextMention(peerId): string.addAttribute(NSAttributedStringKey.foregroundColor, value: linkColor, range: range) if underlineLinks && underlineAllLinks { diff --git a/submodules/TelegramUI/TelegramUI/TGChannelIntroController.h b/submodules/TelegramUI/TelegramUI/TGChannelIntroController.h deleted file mode 100644 index 3eb7a0f481..0000000000 --- a/submodules/TelegramUI/TelegramUI/TGChannelIntroController.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -@interface TGChannelIntroControllerTheme : NSObject - -@property (nonatomic, strong, readonly) UIColor *backgroundColor; -@property (nonatomic, strong, readonly) UIColor *primaryColor; -@property (nonatomic, strong, readonly) UIColor *secondaryColor; -@property (nonatomic, strong, readonly) UIColor *accentColor; -@property (nonatomic, strong, readonly) UIImage *backArrowImage; -@property (nonatomic, strong, readonly) UIImage *introImage; - -- (instancetype)initWithBackgroundColor:(UIColor *)backgroundColor primaryColor:(UIColor *)primaryColor secondaryColor:(UIColor *)secondaryColor accentColor:(UIColor *)accentColor backArrowImage:(UIImage *)backArrowImage introImage:(UIImage *)introImage; - -@end - -@interface TGChannelIntroController : TGViewController - -- (instancetype)initWithContext:(id)context getLocalizedString:(NSString *(^)(NSString *))getLocalizedString theme:(TGChannelIntroControllerTheme *)theme dismiss:(void (^)(void))dismiss completion:(void (^)(void))completion; - -@end diff --git a/submodules/TelegramUI/TelegramUI/TGChannelIntroController.m b/submodules/TelegramUI/TelegramUI/TGChannelIntroController.m deleted file mode 100644 index e21d2fa343..0000000000 --- a/submodules/TelegramUI/TelegramUI/TGChannelIntroController.m +++ /dev/null @@ -1,266 +0,0 @@ -#import "TGChannelIntroController.h" - -#import -#import - -@implementation TGChannelIntroControllerTheme - -- (instancetype)initWithBackgroundColor:(UIColor *)backgroundColor primaryColor:(UIColor *)primaryColor secondaryColor:(UIColor *)secondaryColor accentColor:(UIColor *)accentColor backArrowImage:(UIImage *)backArrowImage introImage:(UIImage *)introImage { - self = [super init]; - if (self != nil) { - _backgroundColor = backgroundColor; - _primaryColor = primaryColor; - _secondaryColor = secondaryColor; - _accentColor = accentColor; - _backArrowImage = backArrowImage; - _introImage = introImage; - } - return self; -} - -@end - -@interface TGChannelIntroController () -{ - TGModernButton *_backButton; - UIImageView *_phoneImageView; - UILabel *_titleLabel; - UILabel *_descriptionLabel; - TGModernButton *_createButton; - TGChannelIntroControllerTheme *_theme; - NSString *(^_getLocalizedString)(NSString *); - void (^_dismiss)(void); - void (^_completion)(void); -} -@end - -@implementation TGChannelIntroController - -- (instancetype)initWithContext:(id)context getLocalizedString:(NSString *(^)(NSString *))getLocalizedString theme:(TGChannelIntroControllerTheme *)theme dismiss:(void (^)(void))dismiss completion:(void (^)(void))completion { - self = [super initWithContext:context]; - if (self != nil) { - _getLocalizedString = [getLocalizedString copy]; - _theme = theme; - _dismiss = [dismiss copy]; - _completion = [completion copy]; - } - return self; -} - -- (void)loadView -{ - [super loadView]; - - self.view.backgroundColor = _theme.backgroundColor; - - UIImage *image = _theme.backArrowImage; - UIGraphicsBeginImageContextWithOptions(image.size, false, 0.0f); - CGContextRef context = UIGraphicsGetCurrentContext(); - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - CGContextSetBlendMode (context, kCGBlendModeSourceAtop); - CGContextSetFillColorWithColor(context, _theme.accentColor.CGColor); - CGContextFillRect(context, CGRectMake(0, 0, image.size.width, image.size.height)); - - UIImage *arrowImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - _backButton = [[TGModernButton alloc] initWithFrame:CGRectZero]; - _backButton.exclusiveTouch = true; - _backButton.titleLabel.font = TGSystemFontOfSize(17); - [_backButton setTitle:_getLocalizedString(@"Common.Back") forState:UIControlStateNormal]; - [_backButton setTitleColor:_theme.accentColor]; - [_backButton addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; - [self.view addSubview:_backButton]; - - UIImageView *arrowView = [[UIImageView alloc] initWithFrame:CGRectMake(-19, 5.5f, 13, 22)]; - arrowView.image = arrowImage; - [_backButton addSubview:arrowView]; - - _phoneImageView = [[UIImageView alloc] initWithImage:_theme.introImage]; - _phoneImageView.frame = CGRectMake(0, 0, 154, 220); - [self.view addSubview:_phoneImageView]; - - _titleLabel = [[UILabel alloc] init]; - _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.font = TGSystemFontOfSize(21); - _titleLabel.textColor = _theme.primaryColor; - _titleLabel.textAlignment = NSTextAlignmentCenter; - _titleLabel.text = _getLocalizedString(@"ChannelIntro.Title"); - [self.view addSubview:_titleLabel]; - - _descriptionLabel = [[UILabel alloc] init]; - _descriptionLabel.backgroundColor = [UIColor clearColor]; - _descriptionLabel.numberOfLines = 0; - _descriptionLabel.textAlignment = NSTextAlignmentCenter; - [self.view addSubview:_descriptionLabel]; - - NSString *description = _getLocalizedString(@"ChannelIntro.Text"); - NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:description]; - NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; - style.lineSpacing = 2; - style.alignment = NSTextAlignmentCenter; - [attrString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, description.length)]; - [attrString addAttribute:NSForegroundColorAttributeName value:_theme.secondaryColor range:NSMakeRange(0, description.length)]; - [attrString addAttribute:NSFontAttributeName value:TGSystemFontOfSize(16) range:NSMakeRange(0, description.length)]; - _descriptionLabel.attributedText = attrString; - - _createButton = [[TGModernButton alloc] init]; - _createButton.exclusiveTouch = true; - _createButton.backgroundColor = [UIColor clearColor]; - _createButton.titleLabel.font = TGSystemFontOfSize(21); - [_createButton setTitleColor:_theme.accentColor]; - [_createButton setTitle:_getLocalizedString(@"ChannelIntro.CreateChannel") forState:UIControlStateNormal]; - [_createButton addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; - [self.view addSubview:_createButton]; -} - -- (bool)navigationBarShouldBeHidden -{ - return true; -} - -- (void)backButtonPressed -{ - if (_dismiss != nil) - _dismiss(); - else - [self.navigationController popViewControllerAnimated:true]; -} - -- (void)buttonPressed -{ - _completion(); -} - -- (void)viewWillLayoutSubviews -{ - CGRect bounds = self.context.fullscreenBounds; - UIInterfaceOrientation orientation = UIInterfaceOrientationPortrait; - if (bounds.size.width > bounds.size.height) { - orientation = UIInterfaceOrientationLandscapeLeft; - } - - UIEdgeInsets safeAreaInset = [self calculatedSafeAreaInset]; - int iosVersion = [[[UIDevice currentDevice] systemVersion] intValue]; - if (UIEdgeInsetsEqualToEdgeInsets(safeAreaInset, UIEdgeInsetsZero) && (iosVersion < 11 || TGIsPad() || UIInterfaceOrientationIsPortrait(orientation))) - safeAreaInset.top = 20.0f; - - [_backButton sizeToFit]; - _backButton.frame = CGRectMake(27 + safeAreaInset.left, 5.0f + TGScreenPixel + safeAreaInset.top, ceil(_backButton.frame.size.width), ceil(_backButton.frame.size.height)); - - [_titleLabel sizeToFit]; - [_descriptionLabel sizeToFit]; - [_createButton sizeToFit]; - - int screenSize = (int)TGScreenSize().height; - CGFloat titleY = 0; - CGFloat imageY = 0; - CGFloat descY = 0; - CGFloat buttonY = 0; - - if (UIInterfaceOrientationIsPortrait(orientation)) - { - switch (screenSize) - { - case 812: - case 896: - titleY = 445 + 44; - imageY = 141 + 44; - descY = 490 + 44; - buttonY = 610 + 44; - break; - - case 736: - titleY = 445; - imageY = 141; - descY = 490; - buttonY = 610; - break; - - case 667: - titleY = 407; - imageY = 120; - descY = 448; - buttonY = 558; - break; - - case 568: - titleY = 354; - imageY = 87; - descY = 397; - buttonY = 496; - break; - - default: - titleY = 307; - imageY = 60; - descY = 344; - buttonY = 424; - break; - } - - _phoneImageView.frame = CGRectMake((self.view.frame.size.width - _phoneImageView.frame.size.width) / 2, imageY, _phoneImageView.frame.size.width, _phoneImageView.frame.size.height); - _titleLabel.frame = CGRectMake((self.view.frame.size.width - _titleLabel.frame.size.width) / 2, titleY, ceil(_titleLabel.frame.size.width), ceil(_titleLabel.frame.size.height)); - _descriptionLabel.frame = CGRectMake((self.view.frame.size.width - _descriptionLabel.frame.size.width) / 2, descY, ceil(_descriptionLabel.frame.size.width), ceil(_descriptionLabel.frame.size.height)); - - _createButton.frame = CGRectMake((self.view.frame.size.width - _createButton.frame.size.width) / 2, buttonY, ceil(_createButton.frame.size.width), ceil(_createButton.frame.size.height)); - } - else - { - CGFloat leftX = 0; - CGFloat rightX = 0; - - switch (screenSize) - { - case 812: - leftX = 190 + 44; - rightX = 448 + 44; - titleY = 103; - descY = 148; - buttonY = 237; - break; - - case 736: - leftX = 209; - rightX = 504; - titleY = 115; - descY = 156; - buttonY = 278; - break; - - case 667: - leftX = 190; - rightX = 448; - titleY = 103; - descY = 148; - buttonY = 237; - break; - - case 568: - leftX = 164; - rightX = 388; - titleY = 78; - descY = 121; - buttonY = 217; - break; - - default: - leftX = 125; - rightX = 328; - titleY = 78; - descY = 121; - buttonY = 219; - break; - } - - _phoneImageView.frame = CGRectMake(leftX - _phoneImageView.frame.size.width / 2, (self.view.frame.size.height - _phoneImageView.frame.size.height) / 2, _phoneImageView.frame.size.width, _phoneImageView.frame.size.height); - - _titleLabel.frame = CGRectMake(rightX - _titleLabel.frame.size.width / 2, titleY, ceil(_titleLabel.frame.size.width), ceil(_titleLabel.frame.size.height)); - - _descriptionLabel.frame = CGRectMake(rightX - _descriptionLabel.frame.size.width / 2, descY, ceil(_descriptionLabel.frame.size.width), ceil(_descriptionLabel.frame.size.height)); - - _createButton.frame = CGRectMake(rightX - _createButton.frame.size.width / 2, buttonY, ceil(_createButton.frame.size.width), ceil(_createButton.frame.size.height)); - } -} - -@end diff --git a/submodules/TelegramUI/TelegramUI/TelegramUIPrivate/module.modulemap b/submodules/TelegramUI/TelegramUI/TelegramUIPrivate/module.modulemap index 24fe6ca685..077a2f392e 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramUIPrivate/module.modulemap +++ b/submodules/TelegramUI/TelegramUI/TelegramUIPrivate/module.modulemap @@ -12,7 +12,6 @@ module TelegramUIPrivateModule { header "../DeviceProximityManager.h" header "../RaiseToListenActivator.h" header "../TGMimeTypeMap.h" - header "../TGChannelIntroController.h" header "../Bridge Audio/TGBridgeAudioDecoder.h" header "../Bridge Audio/TGBridgeAudioEncoder.h" header "../TGContactModel.h" diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift index 3730aa15b4..75711374a3 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift @@ -190,16 +190,19 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { self.scrollNode.view.showsHorizontalScrollIndicator = false } + private func scrollToNode(_ node: ThemeSettingsAppIconNode, animated: Bool) { + let bounds = self.scrollNode.view.bounds + let frame = node.frame.insetBy(dx: -48.0, dy: 0.0) + + if frame.minX < bounds.minX || frame.maxX > bounds.maxX { + self.scrollNode.view.scrollRectToVisible(frame, animated: animated) + } + } + func asyncLayout() -> (_ item: ThemeSettingsAppIconItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { let currentItem = self.item return { item, params, neighbors in - var themeUpdated = false - if currentItem?.theme !== item.theme { - themeUpdated = true - - } - let contentSize: CGSize let insets: UIEdgeInsets let separatorHeight = UIScreenPixel @@ -255,6 +258,9 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { let nodeSize = CGSize(width: 80.0, height: 112.0) var nodeOffset = nodeInset + var updated = false + var selectedNode: ThemeSettingsAppIconNode? + var i = 0 for icon in item.icons { let imageNode: ThemeSettingsAppIconNode @@ -264,10 +270,14 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { imageNode = ThemeSettingsAppIconNode() strongSelf.nodes.append(imageNode) strongSelf.scrollNode.addSubnode(imageNode) + updated = true } if let image = UIImage(named: icon.imageName, in: Bundle.main, compatibleWith: nil) { let selected = icon.name == item.currentIconName + if selected { + selectedNode = imageNode + } var name = "Icon" var bordered = true @@ -292,8 +302,11 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { break } - imageNode.setup(theme: item.theme, icon: image, title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: bordered, selected: selected, action: { + imageNode.setup(theme: item.theme, icon: image, title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: bordered, selected: selected, action: { [weak self, weak imageNode] in item.updated(icon.name) + if let imageNode = imageNode { + self?.scrollToNode(imageNode, animated: true) + } }) } @@ -309,6 +322,10 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { strongSelf.scrollNode.view.contentSize = contentSize } } + + if updated, let selectedNode = selectedNode { + strongSelf.scrollToNode(selectedNode, animated: false) + } } }) } diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift index 3c357f7f79..1d13c1f872 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift @@ -240,15 +240,19 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { self.scrollNode.view.showsHorizontalScrollIndicator = false } + private func scrollToNode(_ node: ThemeSettingsThemeItemIconNode, animated: Bool) { + let bounds = self.scrollNode.view.bounds + let frame = node.frame.insetBy(dx: -48.0, dy: 0.0) + + if frame.minX < bounds.minX || frame.maxX > bounds.maxX { + self.scrollNode.view.scrollRectToVisible(frame, animated: animated) + } + } + func asyncLayout() -> (_ item: ThemeSettingsThemeItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { let currentItem = self.item return { item, params, neighbors in - var themeUpdated = false - if currentItem?.theme !== item.theme { - themeUpdated = true - } - let contentSize: CGSize let insets: UIEdgeInsets let separatorHeight = UIScreenPixel @@ -304,6 +308,9 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { let nodeSize = CGSize(width: 116.0, height: 112.0) var nodeOffset = nodeInset + var updated = false + var selectedNode: ThemeSettingsThemeItemIconNode? + var i = 0 for (theme, accentColor) in item.themes { let imageNode: ThemeSettingsThemeItemIconNode @@ -313,9 +320,14 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { imageNode = ThemeSettingsThemeItemIconNode() strongSelf.nodes.append(imageNode) strongSelf.scrollNode.addSubnode(imageNode) + updated = true } let selected = theme == item.currentTheme + if selected { + selectedNode = imageNode + } + let name: String switch theme { case .dayClassic: @@ -328,8 +340,11 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { name = item.strings.Appearance_ThemeCarouselNightBlue } - imageNode.setup(theme: item.theme, icon: generateThemeIconImage(theme: theme, accentColor: accentColor), title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: true, selected: selected, action: { + imageNode.setup(theme: item.theme, icon: generateThemeIconImage(theme: theme, accentColor: accentColor), title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: true, selected: selected, action: { [weak self, weak imageNode] in item.updated(theme) + if let imageNode = imageNode { + self?.scrollToNode(imageNode, animated: true) + } }) imageNode.frame = CGRect(origin: CGPoint(x: nodeOffset, y: 0.0), size: nodeSize) @@ -344,6 +359,10 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { strongSelf.scrollNode.view.contentSize = contentSize } } + + if updated, let selectedNode = selectedNode { + strongSelf.scrollToNode(selectedNode, animated: false) + } } }) } diff --git a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj index a9097920b2..ab9fc61672 100644 --- a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj @@ -407,9 +407,6 @@ D0642EFC1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0642EFB1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift */; }; D064EF871F69A06F00AC0398 /* MessageContentKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = D064EF861F69A06F00AC0398 /* MessageContentKind.swift */; }; D0671F2D2145AB28000A8AE7 /* LegacyAvatarPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0671F2C2145AB28000A8AE7 /* LegacyAvatarPicker.swift */; }; - D067B4A5211C911C00796039 /* LegacyChannelIntroController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D067B4A4211C911C00796039 /* LegacyChannelIntroController.swift */; }; - D067B4AA211C916300796039 /* TGChannelIntroController.h in Headers */ = {isa = PBXBuildFile; fileRef = D067B4A6211C916200796039 /* TGChannelIntroController.h */; }; - D067B4AD211C916300796039 /* TGChannelIntroController.m in Sources */ = {isa = PBXBuildFile; fileRef = D067B4A9211C916200796039 /* TGChannelIntroController.m */; }; D0684A041F6C3AD50059F570 /* ChatListTypingNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0684A031F6C3AD50059F570 /* ChatListTypingNode.swift */; }; D06887F01F72DEE6000AB936 /* ShareInputFieldNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06887EF1F72DEE6000AB936 /* ShareInputFieldNode.swift */; }; D069F5D0212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D069F5CF212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift */; }; @@ -1733,9 +1730,6 @@ D0642EFB1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatHistoryNavigationButtons.swift; sourceTree = ""; }; D064EF861F69A06F00AC0398 /* MessageContentKind.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageContentKind.swift; sourceTree = ""; }; D0671F2C2145AB28000A8AE7 /* LegacyAvatarPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyAvatarPicker.swift; sourceTree = ""; }; - D067B4A4211C911C00796039 /* LegacyChannelIntroController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyChannelIntroController.swift; sourceTree = ""; }; - D067B4A6211C916200796039 /* TGChannelIntroController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGChannelIntroController.h; sourceTree = ""; }; - D067B4A9211C916200796039 /* TGChannelIntroController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGChannelIntroController.m; sourceTree = ""; }; D0684A031F6C3AD50059F570 /* ChatListTypingNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListTypingNode.swift; sourceTree = ""; }; D06879541DB8F1FC00424BBD /* CachedResourceRepresentations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedResourceRepresentations.swift; sourceTree = ""; }; D06879561DB8F22200424BBD /* FetchCachedRepresentations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchCachedRepresentations.swift; sourceTree = ""; }; @@ -3267,16 +3261,6 @@ name = "Setup Two Step Verification"; sourceTree = ""; }; - D067B4AE211C916D00796039 /* Channel Intro */ = { - isa = PBXGroup; - children = ( - D067B4A4211C911C00796039 /* LegacyChannelIntroController.swift */, - D067B4A6211C916200796039 /* TGChannelIntroController.h */, - D067B4A9211C916200796039 /* TGChannelIntroController.m */, - ); - name = "Channel Intro"; - sourceTree = ""; - }; D0736F261DF4D2F300F2C02A /* Telegram Controller */ = { isa = PBXGroup; children = ( @@ -3336,7 +3320,6 @@ D07551891DDA4C7C0073E051 /* Legacy Components */ = { isa = PBXGroup; children = ( - D067B4AE211C916D00796039 /* Channel Intro */, D0AE2FDB22B1D3610058D3BC /* Bridge Audio */, D075518A1DDA4D7D0073E051 /* LegacyController.swift */, D075518C1DDA4E0B0073E051 /* LegacyControllerNode.swift */, @@ -4899,7 +4882,6 @@ D0E9BACB1F05738600F079A4 /* STPAPIPostRequest.h in Headers */, D0E9BA561F055A0B00F079A4 /* STPFormTextField.h in Headers */, D008177C22B46B7E008A895F /* TGItemProviderSignals.h in Headers */, - D067B4AA211C916300796039 /* TGChannelIntroController.h in Headers */, D0E9BABE1F05735F00F079A4 /* STPPaymentConfiguration+Private.h in Headers */, D0E9BACA1F05738600F079A4 /* STPAPIClient+Private.h in Headers */, D0E9BA251F05578900F079A4 /* STPCardBrand.h in Headers */, @@ -5232,7 +5214,6 @@ D0AB263321C3DFEA008F6685 /* CreatePollOptionActionItem.swift in Sources */, 09FFBCDB22849CB500C33B4B /* PDF.swift in Sources */, 09D968A1221F7FF100B1458A /* ChatTypingActivityContentNode.swift in Sources */, - D067B4AD211C916300796039 /* TGChannelIntroController.m in Sources */, D0BE303220601FFC00FBE6D8 /* LocationBroadcastActionSheetItem.swift in Sources */, 090E778E22AA863A00CD99F5 /* PeersNearbyIconNode.swift in Sources */, D0EC6CF41EB9F58800EBF1C3 /* ManagedMediaId.swift in Sources */, @@ -5959,7 +5940,6 @@ 091417F421EF4F5F00C8325A /* WallpaperGalleryItem.swift in Sources */, D02F4AE91FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift in Sources */, D0EC6E461EB9F58900EBF1C3 /* ItemListLoadingIndicatorEmptyStateItem.swift in Sources */, - D067B4A5211C911C00796039 /* LegacyChannelIntroController.swift in Sources */, D00817CF22B47A14008A895F /* LegacyFileImport.swift in Sources */, D01A21AF1F39EA2E00DDA104 /* InstantPageTheme.swift in Sources */, D0EC6E471EB9F58900EBF1C3 /* ItemListTextEmptyStateItem.swift in Sources */, diff --git a/submodules/TelegramUIPreferences/Sources/CallListSettings.swift b/submodules/TelegramUIPreferences/Sources/CallListSettings.swift index ff81d69b1a..239f6a554c 100644 --- a/submodules/TelegramUIPreferences/Sources/CallListSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/CallListSettings.swift @@ -6,7 +6,7 @@ public struct CallListSettings: PreferencesEntry, Equatable { public var showTab: Bool public static var defaultSettings: CallListSettings { - return CallListSettings(showTab: false) + return CallListSettings(showTab: true) } public init(showTab: Bool) {