diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift index d14cb4d662..a00827f038 100644 --- a/NotificationService/NotificationService.swift +++ b/NotificationService/NotificationService.swift @@ -295,6 +295,7 @@ class NotificationService: UNNotificationServiceExtension { var peerId: PeerId? var messageId: Int32? + var silent = false if let msgId = dict["msg_id"] as? String { userInfo["msg_id"] = msgId @@ -318,6 +319,9 @@ class NotificationService: UNNotificationServiceExtension { peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: id) } } + if let silentValue = dict["silent"] as? String { + silent = silentValue == "1" + } var attachment: ParsedMediaAttachment? var attachmentData: Data? @@ -412,6 +416,9 @@ class NotificationService: UNNotificationServiceExtension { self.bestAttemptContent?.body = alert } else if let alert = aps["alert"] as? [AnyHashable: Any] { self.bestAttemptContent?.title = alert["title"] as? String ?? "" + if let title = self.bestAttemptContent?.title, !title.isEmpty && silent { + self.bestAttemptContent?.title = "\(title) 🔕" + } self.bestAttemptContent?.subtitle = alert["subtitle"] as? String ?? "" self.bestAttemptContent?.body = alert["body"] as? String ?? "" } diff --git a/SiriIntents/IntentContacts.swift b/SiriIntents/IntentContacts.swift index c16680033b..19ae8cf1e6 100644 --- a/SiriIntents/IntentContacts.swift +++ b/SiriIntents/IntentContacts.swift @@ -53,6 +53,16 @@ func matchingCloudContacts(postbox: Postbox, contacts: [MatchingDeviceContact]) } } +func matchingCloudContact(postbox: Postbox, peerId: PeerId) -> Signal { + return postbox.transaction { transaction -> TelegramUser? in + if let user = transaction.getPeer(peerId) as? TelegramUser { + return user + } else { + return nil + } + } +} + func personWithUser(stableId: String, user: TelegramUser) -> INPerson { var nameComponents = PersonNameComponents() nameComponents.givenName = user.firstName diff --git a/SiriIntents/IntentHandler.swift b/SiriIntents/IntentHandler.swift index 1615a8b387..c74f61d180 100644 --- a/SiriIntents/IntentHandler.swift +++ b/SiriIntents/IntentHandler.swift @@ -120,6 +120,9 @@ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessag return .complete() } } + |> afterNext { account in + account.resetStateManagement() + } |> take(1) } self.accountPromise.set(account) @@ -140,23 +143,22 @@ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessag return } - let filteredPersons = initialPersons.filter({ person in + var filteredPersons: [INPerson] = [] + for person in initialPersons { if let contactIdentifier = person.contactIdentifier, !contactIdentifier.isEmpty { - return true + filteredPersons.append(person) } if #available(iOSApplicationExtension 10.3, *) { if let siriMatches = person.siriMatches { for match in siriMatches { if let contactIdentifier = match.contactIdentifier, !contactIdentifier.isEmpty { - return true + filteredPersons.append(match) } } } } - - return false - }) + } if filteredPersons.isEmpty { completion([INPersonResolutionResult.needsValue()]) @@ -223,7 +225,36 @@ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessag // MARK: - INSendMessageIntentHandling func resolveRecipients(for intent: INSendMessageIntent, with completion: @escaping ([INPersonResolutionResult]) -> Void) { - self.resolve(persons: intent.recipients, with: completion) + if #available(iOSApplicationExtension 11.0, *) { + if let peerId = intent.conversationIdentifier.flatMap(Int64.init) { + let account = self.accountPromise.get() + + let signal = account + |> mapToSignal { account -> Signal in + return matchingCloudContact(postbox: account.postbox, peerId: PeerId(peerId)) + |> map { user -> INPerson? in + if let user = user { + return personWithUser(stableId: "tg\(peerId)", user: user) + } else { + return nil + } + } + } + + self.resolvePersonsDisposable.set((signal + |> deliverOnMainQueue).start(next: { person in + if let person = person { + completion([INPersonResolutionResult.success(with: person)]) + } else { + completion([INPersonResolutionResult.needsValue()]) + } + })) + } else { + self.resolve(persons: intent.recipients, with: completion) + } + } else { + self.resolve(persons: intent.recipients, with: completion) + } } func resolveContent(for intent: INSendMessageIntent, with completion: @escaping (INStringResolutionResult) -> Void) { @@ -295,8 +326,18 @@ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessag |> introduceError(IntentHandlingError.self) |> mapToSignal { account -> Signal<[INMessage], IntentHandlingError> in account.shouldBeServiceTaskMaster.set(.single(.now)) - return unreadMessages(account: account) + + let completedUpdating: Signal = (.single(true) |> then(account.stateManager.isUpdating)) |> introduceError(IntentHandlingError.self) + |> filter { !$0 } + |> take(1) + |> timeout(3.0, queue: Queue.mainQueue(), alternate: .fail(.generic)) + + return completedUpdating + |> mapToSignal { value -> Signal<[INMessage], IntentHandlingError> in + return unreadMessages(account: account) + |> introduceError(IntentHandlingError.self) + } |> afterDisposed { account.shouldBeServiceTaskMaster.set(.single(.never)) } diff --git a/SiriIntents/IntentMessages.swift b/SiriIntents/IntentMessages.swift index 3ea3769a9d..8e29092f39 100644 --- a/SiriIntents/IntentMessages.swift +++ b/SiriIntents/IntentMessages.swift @@ -14,8 +14,10 @@ func unreadMessages(account: Account) -> Signal<[INMessage], NoError> { for entry in view.0.entries { if case let .MessageEntry(index, _, readState, notificationSettings, _, _, _, _) = entry { var hasUnread = false + var fixedCombinedReadStates: MessageHistoryViewReadState? if let readState = readState { hasUnread = readState.count != 0 + fixedCombinedReadStates = .peer([index.messageIndex.id.peerId: readState]) } var isMuted = false if let notificationSettings = notificationSettings as? TelegramPeerNotificationSettings { @@ -25,12 +27,17 @@ func unreadMessages(account: Account) -> Signal<[INMessage], NoError> { } if !isMuted && hasUnread { - signals.append(account.postbox.aroundMessageHistoryViewForLocation(.peer(index.messageIndex.id.peerId), anchor: .upperBound, count: 10, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: Set(), tagMask: nil, orderStatistics: .combinedLocation) + signals.append(account.postbox.aroundMessageHistoryViewForLocation(.peer(index.messageIndex.id.peerId), anchor: .upperBound, count: 10, fixedCombinedReadStates: fixedCombinedReadStates, topTaggedMessageIdNamespaces: Set(), tagMask: nil, orderStatistics: .combinedLocation) |> take(1) |> map { view -> [INMessage] in var messages: [INMessage] = [] for entry in view.0.entries { - if !entry.isRead { + var isRead = true + if let readState = readState { + isRead = readState.isIncomingMessageIndexRead(entry.message.index) + } + + if !isRead { if let message = messageWithTelegramMessage(entry.message, account: account) { messages.append(message) } @@ -150,7 +157,8 @@ private func messageWithTelegramMessage(_ telegramMessage: Message, account: Acc personHandle = INPersonHandle(value: user.phone ?? "", type: .phoneNumber) } - let sender = INPerson(personHandle: personHandle, nameComponents: nil, displayName: user.displayTitle, image: nil, contactIdentifier: nil, customIdentifier: "tg\(user.id.toInt64())") + let personIdentifier = "tg\(user.id.toInt64())" + let sender = INPerson(personHandle: personHandle, nameComponents: nil, displayName: user.displayTitle, image: nil, contactIdentifier: personIdentifier, customIdentifier: personIdentifier) let date = Date(timeIntervalSince1970: TimeInterval(telegramMessage.timestamp)) let message: INMessage diff --git a/Telegram-iOS.xcodeproj/project.pbxproj b/Telegram-iOS.xcodeproj/project.pbxproj index 94321e98e9..188366cbc1 100644 --- a/Telegram-iOS.xcodeproj/project.pbxproj +++ b/Telegram-iOS.xcodeproj/project.pbxproj @@ -12,6 +12,24 @@ 090E777622A6945900CD99F5 /* BlackClassicIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 090E777222A6945800CD99F5 /* BlackClassicIcon@3x.png */; }; 090E777722A6945900CD99F5 /* BlueClassicIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 090E777322A6945800CD99F5 /* BlueClassicIcon@2x.png */; }; 092F368521542D6C001A9F49 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 092F368321542D6C001A9F49 /* Localizable.strings */; }; + 094DDF0822E7A0D3004B0256 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF0222E7A0D3004B0256 /* Localizable.strings */; }; + 094DDF0922E7A0D3004B0256 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF0422E7A0D3004B0256 /* InfoPlist.strings */; }; + 094DDF0A22E7A0D3004B0256 /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF0622E7A0D3004B0256 /* AppIntentVocabulary.plist */; }; + 094DDF3222E7A61B004B0256 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF2C22E7A61B004B0256 /* Localizable.strings */; }; + 094DDF3322E7A61B004B0256 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF2E22E7A61B004B0256 /* InfoPlist.strings */; }; + 094DDF3422E7A61B004B0256 /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF3022E7A61B004B0256 /* AppIntentVocabulary.plist */; }; + 094DDF3C22E7A98E004B0256 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF3622E7A98E004B0256 /* Localizable.strings */; }; + 094DDF3D22E7A98E004B0256 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF3822E7A98E004B0256 /* InfoPlist.strings */; }; + 094DDF3E22E7A98E004B0256 /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF3A22E7A98E004B0256 /* AppIntentVocabulary.plist */; }; + 094DDF4622E7A9A8004B0256 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF4022E7A9A8004B0256 /* Localizable.strings */; }; + 094DDF4722E7A9A8004B0256 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF4222E7A9A8004B0256 /* InfoPlist.strings */; }; + 094DDF4822E7A9A8004B0256 /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF4422E7A9A8004B0256 /* AppIntentVocabulary.plist */; }; + 094DDF5722E8C310004B0256 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF4A22E8C30F004B0256 /* Localizable.strings */; }; + 094DDF5822E8C310004B0256 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF4C22E8C30F004B0256 /* InfoPlist.strings */; }; + 094DDF5922E8C310004B0256 /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF4E22E8C30F004B0256 /* AppIntentVocabulary.plist */; }; + 094DDF5A22E8C310004B0256 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF5122E8C30F004B0256 /* Localizable.strings */; }; + 094DDF5B22E8C310004B0256 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF5322E8C30F004B0256 /* InfoPlist.strings */; }; + 094DDF5C22E8C310004B0256 /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = 094DDF5522E8C30F004B0256 /* AppIntentVocabulary.plist */; }; 0956AF2F217B8109008106D0 /* TGNeoUnsupportedMessageViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0956AF2E217B8109008106D0 /* TGNeoUnsupportedMessageViewModel.m */; }; 0972C6E021791D950069E98A /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0972C6DF21791D950069E98A /* UserNotifications.framework */; }; 0972C6E421792D130069E98A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0972C6E221792D120069E98A /* InfoPlist.strings */; }; @@ -514,6 +532,24 @@ 090E777222A6945800CD99F5 /* BlackClassicIcon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlackClassicIcon@3x.png"; sourceTree = ""; }; 090E777322A6945800CD99F5 /* BlueClassicIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlueClassicIcon@2x.png"; sourceTree = ""; }; 092F368421542D6C001A9F49 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Share/en.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; + 094DDF0322E7A0D3004B0256 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = Localizable.strings; sourceTree = ""; }; + 094DDF0522E7A0D3004B0256 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = InfoPlist.strings; sourceTree = ""; }; + 094DDF0722E7A0D3004B0256 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = fr; path = AppIntentVocabulary.plist; sourceTree = ""; }; + 094DDF2D22E7A61B004B0256 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Localizable.strings; sourceTree = ""; }; + 094DDF2F22E7A61B004B0256 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = InfoPlist.strings; sourceTree = ""; }; + 094DDF3122E7A61B004B0256 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = tr; path = AppIntentVocabulary.plist; sourceTree = ""; }; + 094DDF3722E7A98E004B0256 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = Localizable.strings; sourceTree = ""; }; + 094DDF3922E7A98E004B0256 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = InfoPlist.strings; sourceTree = ""; }; + 094DDF3B22E7A98E004B0256 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ca; path = AppIntentVocabulary.plist; sourceTree = ""; }; + 094DDF4122E7A9A8004B0256 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = Localizable.strings; sourceTree = ""; }; + 094DDF4322E7A9A8004B0256 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = InfoPlist.strings; sourceTree = ""; }; + 094DDF4522E7A9A8004B0256 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = uk; path = AppIntentVocabulary.plist; sourceTree = ""; }; + 094DDF4B22E8C30F004B0256 /* ms */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ms; path = Localizable.strings; sourceTree = ""; }; + 094DDF4D22E8C30F004B0256 /* ms */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ms; path = InfoPlist.strings; sourceTree = ""; }; + 094DDF4F22E8C30F004B0256 /* ms */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ms; path = AppIntentVocabulary.plist; sourceTree = ""; }; + 094DDF5222E8C30F004B0256 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = Localizable.strings; sourceTree = ""; }; + 094DDF5422E8C30F004B0256 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = InfoPlist.strings; sourceTree = ""; }; + 094DDF5622E8C30F004B0256 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = id; path = AppIntentVocabulary.plist; sourceTree = ""; }; 0956AF2B217B4642008106D0 /* WatchCommunicationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchCommunicationManager.swift; sourceTree = ""; }; 0956AF2D217B8109008106D0 /* TGNeoUnsupportedMessageViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TGNeoUnsupportedMessageViewModel.h; sourceTree = ""; }; 0956AF2E217B8109008106D0 /* TGNeoUnsupportedMessageViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TGNeoUnsupportedMessageViewModel.m; sourceTree = ""; }; @@ -1213,6 +1249,66 @@ path = en.lproj; sourceTree = ""; }; + 094DDF0122E7A0D3004B0256 /* fr.lproj */ = { + isa = PBXGroup; + children = ( + 094DDF0222E7A0D3004B0256 /* Localizable.strings */, + 094DDF0422E7A0D3004B0256 /* InfoPlist.strings */, + 094DDF0622E7A0D3004B0256 /* AppIntentVocabulary.plist */, + ); + path = fr.lproj; + sourceTree = ""; + }; + 094DDF2B22E7A61B004B0256 /* tr.lproj */ = { + isa = PBXGroup; + children = ( + 094DDF2C22E7A61B004B0256 /* Localizable.strings */, + 094DDF2E22E7A61B004B0256 /* InfoPlist.strings */, + 094DDF3022E7A61B004B0256 /* AppIntentVocabulary.plist */, + ); + path = tr.lproj; + sourceTree = ""; + }; + 094DDF3522E7A98E004B0256 /* ca.lproj */ = { + isa = PBXGroup; + children = ( + 094DDF3622E7A98E004B0256 /* Localizable.strings */, + 094DDF3822E7A98E004B0256 /* InfoPlist.strings */, + 094DDF3A22E7A98E004B0256 /* AppIntentVocabulary.plist */, + ); + path = ca.lproj; + sourceTree = ""; + }; + 094DDF3F22E7A9A8004B0256 /* uk.lproj */ = { + isa = PBXGroup; + children = ( + 094DDF4022E7A9A8004B0256 /* Localizable.strings */, + 094DDF4222E7A9A8004B0256 /* InfoPlist.strings */, + 094DDF4422E7A9A8004B0256 /* AppIntentVocabulary.plist */, + ); + path = uk.lproj; + sourceTree = ""; + }; + 094DDF4922E8C30F004B0256 /* ms.lproj */ = { + isa = PBXGroup; + children = ( + 094DDF4A22E8C30F004B0256 /* Localizable.strings */, + 094DDF4C22E8C30F004B0256 /* InfoPlist.strings */, + 094DDF4E22E8C30F004B0256 /* AppIntentVocabulary.plist */, + ); + path = ms.lproj; + sourceTree = ""; + }; + 094DDF5022E8C30F004B0256 /* id.lproj */ = { + isa = PBXGroup; + children = ( + 094DDF5122E8C30F004B0256 /* Localizable.strings */, + 094DDF5322E8C30F004B0256 /* InfoPlist.strings */, + 094DDF5522E8C30F004B0256 /* AppIntentVocabulary.plist */, + ); + path = id.lproj; + sourceTree = ""; + }; 0972C6E121792CED0069E98A /* ru.lproj */ = { isa = PBXGroup; children = ( @@ -1868,13 +1964,19 @@ D0612E481D58B478000C8F02 /* Application.swift */, D09DCBB41D0C854D00F51FFE /* en.lproj */, D0CE6F47213EDA4400BCD44B /* ar.lproj */, + 094DDF3522E7A98E004B0256 /* ca.lproj */, D0CE6F4E213EDA4400BCD44B /* de.lproj */, D0CE6F40213EDA4400BCD44B /* es.lproj */, + 094DDF0122E7A0D3004B0256 /* fr.lproj */, + 094DDF5022E8C30F004B0256 /* id.lproj */, D0CE6F24213EDA4300BCD44B /* it.lproj */, D0CE6F2B213EDA4300BCD44B /* ko.lproj */, + 094DDF4922E8C30F004B0256 /* ms.lproj */, D0CE6F32213EDA4300BCD44B /* nl.lproj */, D0CE6F1D213EDA4200BCD44B /* pt.lproj */, D0CE6F39213EDA4300BCD44B /* ru.lproj */, + 094DDF2B22E7A61B004B0256 /* tr.lproj */, + 094DDF3F22E7A9A8004B0256 /* uk.lproj */, D00859A01B28189D00EAF753 /* Info.plist */, D09A59B71B5876B600FC3724 /* Telegram-Bridging-Header.h */, D02E31221BD803E800CD3F01 /* main.m */, @@ -2225,9 +2327,9 @@ D09DCBB41D0C854D00F51FFE /* en.lproj */ = { isa = PBXGroup; children = ( - D00ED7581FE94630001F38BD /* AppIntentVocabulary.plist */, D09DCBB51D0C856B00F51FFE /* Localizable.strings */, D00ED75B1FE95287001F38BD /* InfoPlist.strings */, + D00ED7581FE94630001F38BD /* AppIntentVocabulary.plist */, ); name = en.lproj; sourceTree = ""; @@ -2342,15 +2444,15 @@ D0E41A3A1D65A69C00FBFC00 /* Widget */ = { isa = PBXGroup; children = ( - 0972C6E121792CED0069E98A /* ru.lproj */, + D04FA1AE2145E37F0006EF45 /* en.lproj */, D04FA1B62145E3800006EF45 /* ar.lproj */, D04FA1B32145E37F0006EF45 /* de.lproj */, - D04FA1AE2145E37F0006EF45 /* en.lproj */, D04FA1C52145E3810006EF45 /* es.lproj */, D04FA1BF2145E3800006EF45 /* it.lproj */, D04FA1BC2145E3800006EF45 /* ko.lproj */, D04FA1B92145E3800006EF45 /* nl.lproj */, D04FA1C22145E3810006EF45 /* pt.lproj */, + 0972C6E121792CED0069E98A /* ru.lproj */, D0ADF955212B3B6400310BBC /* Widget-AppStoreLLC.entitlements */, D0B2F75A204F51E400D3BFB9 /* Widget-AppStore.entitlements */, D0B2F75B204F51E500D3BFB9 /* Widget-HockeyApp.entitlements */, @@ -2658,6 +2760,12 @@ es, ar, de, + fr, + tr, + ca, + uk, + ms, + id, ); mainGroup = D00859931B28189D00EAF753; productRefGroup = D008599D1B28189D00EAF753 /* Products */; @@ -2728,6 +2836,9 @@ D04DCC341F71C80000B021D7 /* 7.m4a in Resources */, 09E9600722C23FF200B13673 /* BlackNotificationIcon@3x.png in Resources */, 09EBE2A522B004EA00F670AB /* BlueFilledIconIpad.png in Resources */, + 094DDF5C22E8C310004B0256 /* AppIntentVocabulary.plist in Resources */, + 094DDF3C22E7A98E004B0256 /* Localizable.strings in Resources */, + 094DDF3422E7A61B004B0256 /* AppIntentVocabulary.plist in Resources */, D0CE6F60213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, D0CE6F63213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, D00ED75D1FE95287001F38BD /* InfoPlist.strings in Resources */, @@ -2747,16 +2858,21 @@ 09E9601322C2441000B13673 /* BlackClassicNotificationIcon@2x.png in Resources */, D0E8C2DE2285EA55009F26E8 /* BlackIcon@2x.png in Resources */, D09DCBB71D0C856B00F51FFE /* Localizable.strings in Resources */, + 094DDF5722E8C310004B0256 /* Localizable.strings in Resources */, D0CE6F66213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, D08DB0B8213F4D1D00F2ADBF /* powerful_mask@2x.png in Resources */, D08DB0B4213F4D1D00F2ADBF /* knot_down@2x.png in Resources */, + 094DDF4822E7A9A8004B0256 /* AppIntentVocabulary.plist in Resources */, 09EC5CDA22CBBF9600292E42 /* telegram_plane1@2x.png in Resources */, D08DB0BC213F4D1D00F2ADBF /* start_arrow@2x.png in Resources */, D08DB0B6213F4D1D00F2ADBF /* powerful_infinity@2x.png in Resources */, + 094DDF5B22E8C310004B0256 /* InfoPlist.strings in Resources */, 09EBE2AA22B004EA00F670AB /* BlueIconLargeIpad@2x.png in Resources */, D0CE6F5B213EDA4400BCD44B /* Localizable.strings in Resources */, 09EBE2AF22B004EA00F670AB /* BlackIconIpad@2x.png in Resources */, + 094DDF5922E8C310004B0256 /* AppIntentVocabulary.plist in Resources */, 09A4193422B7A4D500637EB4 /* BlackClassicIconIpad.png in Resources */, + 094DDF4622E7A9A8004B0256 /* Localizable.strings in Resources */, 09A4193222B7A4D500637EB4 /* BlueClassicIconIpad.png in Resources */, D0CE6F62213EDA4400BCD44B /* InfoPlist.strings in Resources */, D08DB0A8213F4D1D00F2ADBF /* fast_arrow_shadow@2x.png in Resources */, @@ -2767,13 +2883,17 @@ 09E9601722C2441000B13673 /* BlackClassicNotificationIcon.png in Resources */, D0CE6F64213EDA4400BCD44B /* Localizable.strings in Resources */, D0CE6F6C213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, + 094DDF3E22E7A98E004B0256 /* AppIntentVocabulary.plist in Resources */, + 094DDF3D22E7A98E004B0256 /* InfoPlist.strings in Resources */, D04DCC231F71C80000B021D7 /* 100.m4a in Resources */, 09E9600A22C23FF200B13673 /* BlueNotificationIcon@2x.png in Resources */, + 094DDF3222E7A61B004B0256 /* Localizable.strings in Resources */, 09A218EF22A1570A00DE6898 /* BlueIcon@2x.png in Resources */, D04DCC281F71C80000B021D7 /* 105.m4a in Resources */, D08DB0BB213F4D1D00F2ADBF /* private_screw@2x.png in Resources */, D0CE6F5F213EDA4400BCD44B /* InfoPlist.strings in Resources */, D04DCC2D1F71C80000B021D7 /* 110.m4a in Resources */, + 094DDF5A22E8C310004B0256 /* Localizable.strings in Resources */, D04DCC2B1F71C80000B021D7 /* 108.m4a in Resources */, D00859AC1B28189D00EAF753 /* LaunchScreen.xib in Resources */, D08DB0B5213F4D1D00F2ADBF /* knot_up1@2x.png in Resources */, @@ -2803,6 +2923,7 @@ 09EBE2B022B004EA00F670AB /* BlueFilledIconLargeIpad@2x.png in Resources */, D0CE6F58213EDA4400BCD44B /* Localizable.strings in Resources */, D08DB0AF213F4D1D00F2ADBF /* ic_pencil@2x.png in Resources */, + 094DDF5822E8C310004B0256 /* InfoPlist.strings in Resources */, 09E9601822C2441000B13673 /* BlueClassicNotificationIcon@3x.png in Resources */, D0CE6F67213EDA4400BCD44B /* Localizable.strings in Resources */, 09A4193322B7A4D500637EB4 /* BlueClassicIconLargeIpad@2x.png in Resources */, @@ -2811,12 +2932,16 @@ D052974622B0073F004ABAF6 /* WhiteFilledIcon@3x.png in Resources */, D08DB0B7213F4D1D00F2ADBF /* powerful_infinity_white@2x.png in Resources */, D00859A91B28189D00EAF753 /* Images.xcassets in Resources */, + 094DDF0922E7A0D3004B0256 /* InfoPlist.strings in Resources */, D001D5AA1F878DA300DF975A /* PhoneCountries.txt in Resources */, + 094DDF0822E7A0D3004B0256 /* Localizable.strings in Resources */, + 094DDF4722E7A9A8004B0256 /* InfoPlist.strings in Resources */, D0CE6F56213EDA4400BCD44B /* InfoPlist.strings in Resources */, D0CE6F65213EDA4400BCD44B /* InfoPlist.strings in Resources */, D0E8B8B12044496C00605593 /* voip_busy.caf in Resources */, 09EBE2A622B004EA00F670AB /* BlueIconIpad@2x.png in Resources */, D08DB0A7213F4D1D00F2ADBF /* fast_arrow@2x.png in Resources */, + 094DDF0A22E7A0D3004B0256 /* AppIntentVocabulary.plist in Resources */, D0E8B8AF2044496C00605593 /* voip_fail.caf in Resources */, D0CE6F55213EDA4400BCD44B /* Localizable.strings in Resources */, D08DB0B2213F4D1D00F2ADBF /* ic_smile_eye@2x.png in Resources */, @@ -2834,6 +2959,7 @@ 09EBE2A822B004EA00F670AB /* BlackFilledIconIpad@2x.png in Resources */, D021D4D9219CAEDD0064BEBA /* Config-Fork.xcconfig in Resources */, D08DB0AD213F4D1D00F2ADBF /* ic_cam@2x.png in Resources */, + 094DDF3322E7A61B004B0256 /* InfoPlist.strings in Resources */, 090E777622A6945900CD99F5 /* BlackClassicIcon@3x.png in Resources */, D0E8B8B02044496C00605593 /* voip_ringback.caf in Resources */, 09E9600822C23FF200B13673 /* BlackNotificationIcon.png in Resources */, @@ -3168,6 +3294,150 @@ name = Localizable.strings; sourceTree = ""; }; + 094DDF0222E7A0D3004B0256 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF0322E7A0D3004B0256 /* fr */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 094DDF0422E7A0D3004B0256 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF0522E7A0D3004B0256 /* fr */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 094DDF0622E7A0D3004B0256 /* AppIntentVocabulary.plist */ = { + isa = PBXVariantGroup; + children = ( + 094DDF0722E7A0D3004B0256 /* fr */, + ); + name = AppIntentVocabulary.plist; + sourceTree = ""; + }; + 094DDF2C22E7A61B004B0256 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF2D22E7A61B004B0256 /* tr */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 094DDF2E22E7A61B004B0256 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF2F22E7A61B004B0256 /* tr */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 094DDF3022E7A61B004B0256 /* AppIntentVocabulary.plist */ = { + isa = PBXVariantGroup; + children = ( + 094DDF3122E7A61B004B0256 /* tr */, + ); + name = AppIntentVocabulary.plist; + sourceTree = ""; + }; + 094DDF3622E7A98E004B0256 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF3722E7A98E004B0256 /* ca */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 094DDF3822E7A98E004B0256 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF3922E7A98E004B0256 /* ca */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 094DDF3A22E7A98E004B0256 /* AppIntentVocabulary.plist */ = { + isa = PBXVariantGroup; + children = ( + 094DDF3B22E7A98E004B0256 /* ca */, + ); + name = AppIntentVocabulary.plist; + sourceTree = ""; + }; + 094DDF4022E7A9A8004B0256 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF4122E7A9A8004B0256 /* uk */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 094DDF4222E7A9A8004B0256 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF4322E7A9A8004B0256 /* uk */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 094DDF4422E7A9A8004B0256 /* AppIntentVocabulary.plist */ = { + isa = PBXVariantGroup; + children = ( + 094DDF4522E7A9A8004B0256 /* uk */, + ); + name = AppIntentVocabulary.plist; + sourceTree = ""; + }; + 094DDF4A22E8C30F004B0256 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF4B22E8C30F004B0256 /* ms */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 094DDF4C22E8C30F004B0256 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF4D22E8C30F004B0256 /* ms */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 094DDF4E22E8C30F004B0256 /* AppIntentVocabulary.plist */ = { + isa = PBXVariantGroup; + children = ( + 094DDF4F22E8C30F004B0256 /* ms */, + ); + name = AppIntentVocabulary.plist; + sourceTree = ""; + }; + 094DDF5122E8C30F004B0256 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF5222E8C30F004B0256 /* id */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 094DDF5322E8C30F004B0256 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 094DDF5422E8C30F004B0256 /* id */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 094DDF5522E8C30F004B0256 /* AppIntentVocabulary.plist */ = { + isa = PBXVariantGroup; + children = ( + 094DDF5622E8C30F004B0256 /* id */, + ); + name = AppIntentVocabulary.plist; + sourceTree = ""; + }; 0972C6E221792D120069E98A /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( diff --git a/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme b/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme index b6a8297fcd..837168a96b 100644 --- a/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme +++ b/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme @@ -57,7 +57,7 @@ - + + + - + diff --git a/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements b/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements index 9936cfa965..cf2fe70016 100644 --- a/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements +++ b/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements @@ -33,5 +33,7 @@ merchant.privatbank.test.telergramios merchant.privatbank.prod.telergram + com.apple.developer.carplay-messaging + com.apple.developer.carplay-calling diff --git a/Telegram-iOS/ar.lproj/InfoPlist.strings b/Telegram-iOS/ar.lproj/InfoPlist.strings index 979491d3b3..174276a904 100644 --- a/Telegram-iOS/ar.lproj/InfoPlist.strings +++ b/Telegram-iOS/ar.lproj/InfoPlist.strings @@ -1,16 +1,12 @@ /* Localized versions of Info.plist keys */ - "CFBundleDisplayName" = "تيليجرام"; - "NSContactsUsageDescription" = "سيقوم تيليجرام برفع جهات الاتصال الخاصة بك باستمرار إلى خوادم التخزين السحابية ذات التشفير العالي لتتمكن من التواصل مع أصدقائك من خلال جميع أجهزتك."; "NSLocationWhenInUseUsageDescription" = "عندما ترغب في مشاركة مكانك مع أصدقائك، تيليجرام يحتاج لصلاحيات لعرض الخريطة لهم."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "عندما تختار أن تشارك مكانك بشكل حي مع أصدقائك في المحادثة، يحتاج تيليجرام إلى الوصول لموقعك في الخلفية حتى بعد إغلاق تيليجرام خلال فترة المشاركة."; "NSLocationAlwaysUsageDescription" = "عندما تقوم بمشاركة موقعك مع أصدقائك، تيليجرام يحتاج إلى الصلاحية ليعرض لهم الخريطة. كما تحتاج لإعطاء تيليجرام الصلاحية لتتمكن من إرسال موقعك من ساعة آبل."; "NSCameraUsageDescription" = "نحتاج ذلك لتتمكن من التقاط وإرسال الصور والفيديوهات."; "NSPhotoLibraryUsageDescription" = "نحتاج ذلك لتتمكن من إرسال الصور والفيديوهات من ألبوم الصور."; +"NSPhotoLibraryAddUsageDescription" = "نحتاج هذه الصلاحية لتتمكن من حفظ وسائطك في مكتبة الصور الخاصة بك."; "NSMicrophoneUsageDescription" = "نحتاج ذلك لتتمكن من تسجيل رسائل صوتية وفيديوهات بالصوت لترسلها.."; "NSSiriUsageDescription" = "يمكنك استخدام سيري لإرسال رسائلك."; - -"NSLocationAlwaysAndWhenInUseUsageDescription" = "عندما تختار أن تشارك مكانك بشكل حي مع أصدقائك في المحادثة، يحتاج تيليجرام إلى الوصول لموقعك في الخلفية حتى بعد إغلاق تيليجرام خلال فترة المشاركة."; -"NSLocationAlwaysUsageDescription" = "عندما تقوم بمشاركة موقعك مع أصدقائك، تيليجرام يحتاج إلى الصلاحية ليعرض لهم الخريطة. كما تحتاج لإعطاء تيليجرام الصلاحية لتتمكن من إرسال موقعك من ساعة آبل."; -"NSLocationWhenInUseUsageDescription" = "عندما ترغب في مشاركة مكانك مع أصدقائك، تيليجرام يحتاج لصلاحيات لعرض الخريطة لهم."; - +"NSFaceIDUsageDescription" = "يمكنك استخدام Face ID لفتح قفل التطبيق."; diff --git a/Telegram-iOS/ca.lproj/AppIntentVocabulary.plist b/Telegram-iOS/ca.lproj/AppIntentVocabulary.plist new file mode 100644 index 0000000000..504ece4483 --- /dev/null +++ b/Telegram-iOS/ca.lproj/AppIntentVocabulary.plist @@ -0,0 +1,17 @@ + + + + + IntentPhrases + + + IntentName + INSendMessageIntent + IntentExamples + + Send a Telegram message to Alex saying I'll be there in 10 minutes + + + + + diff --git a/Telegram-iOS/ca.lproj/InfoPlist.strings b/Telegram-iOS/ca.lproj/InfoPlist.strings new file mode 100644 index 0000000000..fe8899ddd2 --- /dev/null +++ b/Telegram-iOS/ca.lproj/InfoPlist.strings @@ -0,0 +1,12 @@ +/* Localized versions of Info.plist keys */ + +"NSContactsUsageDescription" = "Telegram pujarà automàticament els vostres contactes als seus servidors xifrats, perquè pugueu connectar-vos amb els amics des de qualsevol dispositiu."; +"NSLocationWhenInUseUsageDescription" = "Si envieu la vostra ubicació als amics, Telegram requereix accés per a mostra-los un mapa."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Si trieu de compartir la vostra ubicació en directe amb amics en un xat, Telegram requereix accés en segon pla a la vostra ubicació per a actualitzar-la durant la compartició en directe."; +"NSLocationAlwaysUsageDescription" = "Si trieu de compartir la vostra ubicació en directe amb amics en un xat, Telegram requereix de tenir accés en segon pla a la vostra ubicació per a actualitzar-la durant la compartició en directe. També necessiteu això per a enviar ubicacions des d'un Apple Watch."; +"NSCameraUsageDescription" = "Ens cal això perquè pugueu fer i compartir fotos i vídeos."; +"NSPhotoLibraryUsageDescription" = "Ens cal això perquè pugueu compartir fotos i vídeos de la biblioteca de fotos."; +"NSPhotoLibraryAddUsageDescription" = "Ens cal això perquè així pugueu desar fotos i vídeos a la biblioteca de fotos."; +"NSMicrophoneUsageDescription" = "Ens cal això perquè pugueu enregistrar i compartir missatges de veu i vídeos amb so."; +"NSSiriUsageDescription" = "Podeu usar Siri per a enviar missatges."; +"NSFaceIDUsageDescription" = "Podeu emprar Face ID per a desblocar l'aplicació."; diff --git a/Telegram-iOS/ca.lproj/Localizable.strings b/Telegram-iOS/ca.lproj/Localizable.strings new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Telegram-iOS/ca.lproj/Localizable.strings @@ -0,0 +1 @@ + diff --git a/Telegram-iOS/de.lproj/InfoPlist.strings b/Telegram-iOS/de.lproj/InfoPlist.strings index ff1210247f..792eaa3cc3 100644 --- a/Telegram-iOS/de.lproj/InfoPlist.strings +++ b/Telegram-iOS/de.lproj/InfoPlist.strings @@ -2,13 +2,11 @@ "NSContactsUsageDescription" = "Telegram lädt deine Kontakte durchgehend auf die stark verschlüsselten Cloud Server, damit du dich mit deinen Freunden auf all deinen Geräten verbinden kannst."; "NSLocationWhenInUseUsageDescription" = "Wenn du Freunden deinen Standort mitteilen willst, musst du Telegram den Zugriff darauf erlauben."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Wenn du deinen Live-Standort mit Freunden im Chat teilen möchtest, benötigt Telegram so lange im Hintergrund Zugriff auf deinen Standort, bis du ihn nicht mehr teilen willst."; "NSLocationAlwaysUsageDescription" = "Wenn du Freunden deinen Standort mitteilen willst, musst du Telegram den Zugriff darauf erlauben. Diese Bereichtigung wird auch für die Apple Watch benötigt."; "NSCameraUsageDescription" = "Brauchen wir, damit du Bilder und Videos aufnehmen und teilen kannst."; "NSPhotoLibraryUsageDescription" = "Brauchen wir, damit du Bilder und Videos aus deiner Fotomediathek teilen kannst."; +"NSPhotoLibraryAddUsageDescription" = "Brauchen wir, damit du Bilder und Videos in deiner Fotomediathek speichern kannst."; "NSMicrophoneUsageDescription" = "Brauchen wir, damit du Sprachnachrichten aufnehmen und Videos mit Ton teilen kannst."; "NSSiriUsageDescription" = "Mit Siri kannst du Nachrichten senden."; - -"NSLocationAlwaysAndWhenInUseUsageDescription" = "Wenn du deinen Live-Standort mit Freunden im Chat teilen möchtest, benötigt Telegram so lange im Hintergrund Zugriff auf deinen Standort, bis du ihn nicht mehr teilen willst."; -"NSLocationAlwaysUsageDescription" = "Wenn du Freunden deinen Standort mitteilen willst, musst du Telegram den Zugriff darauf erlauben. Diese Bereichtigung wird auch für die Apple Watch benötigt."; -"NSLocationWhenInUseUsageDescription" = "Wenn du Freunden deinen Standort mitteilen willst, musst du Telegram den Zugriff darauf erlauben."; - +"NSFaceIDUsageDescription" = "Mit Face ID kannst du die App entsperren."; diff --git a/Telegram-iOS/en.lproj/InfoPlist.strings b/Telegram-iOS/en.lproj/InfoPlist.strings index 119c5d2f9a..21c893850f 100644 --- a/Telegram-iOS/en.lproj/InfoPlist.strings +++ b/Telegram-iOS/en.lproj/InfoPlist.strings @@ -2,12 +2,11 @@ "NSContactsUsageDescription" = "Telegram will continuously upload your contacts to its heavily encrypted cloud servers to let you connect with your friends across all your devices."; "NSLocationWhenInUseUsageDescription" = "When you send your location to your friends, Telegram needs access to show them a map."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "When you choose to share your Live Location with friends in a chat, Telegram needs background access to your location to keep them updated for the duration of the live sharing."; +"NSLocationAlwaysUsageDescription" = "When you choose to share your live location with friends in a chat, Telegram needs background access to your location to keep them updated for the duration of the live sharing. You also need this to send locations from an Apple Watch."; "NSCameraUsageDescription" = "We need this so that you can take and share photos and videos."; "NSPhotoLibraryUsageDescription" = "We need this so that you can share photos and videos from your photo library."; "NSPhotoLibraryAddUsageDescription" = "We need this so that you can save photos and videos to your photo library."; "NSMicrophoneUsageDescription" = "We need this so that you can record and share voice messages and videos with sound."; "NSSiriUsageDescription" = "You can use Siri to send messages."; - -"NSLocationAlwaysAndWhenInUseUsageDescription" = "When you choose to share your Live Location with friends in a chat, Telegram needs background access to your location to keep them updated for the duration of the live sharing."; -"NSLocationAlwaysUsageDescription" = "When you choose to share your live location with friends in a chat, Telegram needs background access to your location to keep them updated for the duration of the live sharing. You also need this to send locations from an Apple Watch."; -"NSLocationWhenInUseUsageDescription" = "When you send your location to your friends, Telegram needs access to show them a map."; +"NSFaceIDUsageDescription" = "You can use Face ID to unlock the app."; diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 5f4906713d..fa77ad9df3 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4485,44 +4485,22 @@ Any member of this group will be able to see messages in the channel."; "Chat.AttachmentMultipleFilesDisabled" = "Slowmode is enabled. You can't send multiple files at once."; "Chat.AttachmentMultipleForwardDisabled" = "Slowmode is enabled. You can't forward multiple messages at once."; "Chat.MultipleTextMessagesDisabled" = "Slowmode is enabled. You can't send multiple messages at once."; +"Share.MultipleMessagesDisabled" = "Slowmode is enabled. You can't send multiple messages at once."; +"Chat.SlowmodeSendError" = "Slowmode is enabled."; "StickerPacksSettings.AnimatedStickersInfo" = "Animated stickers in a chat will play continuously."; -"Appearance.ThemePreview.ChatList.1.Name" = "Eva Summer"; -"Appearance.ThemePreview.ChatList.1.Text" = "Text"; - -"Appearance.ThemePreview.ChatList.2.Name" = "Your inner Competition"; -"Appearance.ThemePreview.ChatList.2.Text" = "Hey"; - -"Appearance.ThemePreview.ChatList.3.Name" = "Mike Apple"; -"Appearance.ThemePreview.ChatList.3.Text" = "Mike Apple"; - -"Appearance.ThemePreview.ChatList.4.Name" = "Paul Newman"; -"Appearance.ThemePreview.ChatList.4.Text" = "Any ideas?"; - -"Appearance.ThemePreview.ChatList.5.Name" = "Old Pirates"; -"Appearance.ThemePreview.ChatList.5.Text" = "Yo-ho-ho"; - -"Appearance.ThemePreview.ChatList.6.Name" = "Kate Bright"; -"Appearance.ThemePreview.ChatList.6.Text" = "Hola!"; - -"Appearance.ThemePreview.ChatList.7.Name" = "What"; -"Appearance.ThemePreview.ChatList.7.Text" = "Hola!"; - -"Appearance.ThemePreview.ChatList.8.Name" = "What"; -"Appearance.ThemePreview.ChatList.8.Text" = "Hola!"; - -"Appearance.ThemePreview.Chat.1.Text" = "Reminds me of a Chinese proverb: the best time to plant a tree was 20 years ago. The second best time is now."; -"Appearance.ThemePreview.Chat.1.ReplyName" = "Alex Cassio"; -"Appearance.ThemePreview.Chat.1.ReplyText" = "Mark Twain said that ☝️"; - -"Appearance.ThemePreview.Chat.2.Text" = "Mark Twain said that ☝️"; -"Appearance.ThemePreview.Chat.3.Text" = "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do, so throw off the bowlines, sail away from safe harboor, catch the trade winds in your sails."; - -"Appearance.ThemePreview.Chat.4.Text" = "Nearly missed the sunrise."; - "Conversation.Owner" = "owner"; "Group.EditAdmin.RankTitle" = "CUSTOM TITLE"; "Group.EditAdmin.RankInfo" = "A title that will be shown instead of '%@'."; "Group.EditAdmin.RankOwnerPlaceholder" = "owner"; "Group.EditAdmin.RankAdminPlaceholder" = "admin"; + +"Conversation.SendMessage.SendSilently" = "Send Without Sound"; + +"Appearance.ThemeCarouselTintedNight" = "Tinted Night"; +"Appearance.ThemeCarouselNewNight" = "Night"; + +"Channel.AdminLog.MessageRankName" = "changed custom title for %1$@:\n%2$@"; +"Channel.AdminLog.MessageRankUsername" = "changed custom title for %1$@ (%2$@):\n%3$@"; +"Channel.AdminLog.MessageRank" = "changed custom title:\n%1$@"; diff --git a/Telegram-iOS/es.lproj/InfoPlist.strings b/Telegram-iOS/es.lproj/InfoPlist.strings index 54c7b1d54b..dd4511b397 100644 --- a/Telegram-iOS/es.lproj/InfoPlist.strings +++ b/Telegram-iOS/es.lproj/InfoPlist.strings @@ -2,13 +2,11 @@ "NSContactsUsageDescription" = "Telegram subirá continuamente tus contactos a sus servidores fuertemente cifrados, para permitirte interactuar con tus amigos en todos tus dispositivos."; "NSLocationWhenInUseUsageDescription" = "Cuando envías tu ubicación a tus amigos, Telegram necesita acceso para mostrarles un mapa."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Cuando eliges compartir tu ubicación en tiempo real con amigos en un chat, Telegram necesita acceso en segundo plano a tu ubicación para mantenerla actualizada mientras la función esté en uso."; "NSLocationAlwaysUsageDescription" = "Cuando envías tu ubicación a tus amigos, Telegram necesita acceso para mostrarles un mapa. También es requerido para enviar ubicaciones desde un Apple Watch."; "NSCameraUsageDescription" = "Es requerido para que puedas hacer fotos y vídeos."; "NSPhotoLibraryUsageDescription" = "Es requerido para que puedas compartir fotos y vídeos desde tu biblioteca de fotos."; +"NSPhotoLibraryAddUsageDescription" = "Necesitamos esto para que puedas guardar fotos y videos en tu biblioteca de fotos."; "NSMicrophoneUsageDescription" = "Es requerido para que puedas grabar y compartir mensajes de voz y vídeos con sonido."; "NSSiriUsageDescription" = "Puedes usar Siri para enviar mensajes."; - -"NSLocationAlwaysAndWhenInUseUsageDescription" = "Cuando eliges compartir tu ubicación en tiempo real con amigos en un chat, Telegram necesita acceso en segundo plano a tu ubicación para mantenerla actualizada mientras la función esté en uso."; -"NSLocationAlwaysUsageDescription" = "Cuando envías tu ubicación a tus amigos, Telegram necesita acceso para mostrarles un mapa. También es requerido para enviar ubicaciones desde un Apple Watch."; -"NSLocationWhenInUseUsageDescription" = "Cuando envías tu ubicación a tus amigos, Telegram necesita acceso para mostrarles un mapa."; - +"NSFaceIDUsageDescription" = "Puedes usar Face ID para desbloquear la app."; diff --git a/Telegram-iOS/fr.lproj/AppIntentVocabulary.plist b/Telegram-iOS/fr.lproj/AppIntentVocabulary.plist new file mode 100644 index 0000000000..504ece4483 --- /dev/null +++ b/Telegram-iOS/fr.lproj/AppIntentVocabulary.plist @@ -0,0 +1,17 @@ + + + + + IntentPhrases + + + IntentName + INSendMessageIntent + IntentExamples + + Send a Telegram message to Alex saying I'll be there in 10 minutes + + + + + diff --git a/Telegram-iOS/fr.lproj/InfoPlist.strings b/Telegram-iOS/fr.lproj/InfoPlist.strings new file mode 100644 index 0000000000..fa15291c28 --- /dev/null +++ b/Telegram-iOS/fr.lproj/InfoPlist.strings @@ -0,0 +1,12 @@ +/* Localized versions of Info.plist keys */ + +"NSContactsUsageDescription" = "Telegram va synchroniser en continu vos contacts sur ses serveurs chiffrés pour vous permettre de joindre vos amis sur tous vos appareils."; +"NSLocationWhenInUseUsageDescription" = "Quand vous envoyez votre position à vos amis, Telegram doit accéder à votre position pour leur montrer une carte."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Quand vous décidez de partager votre position en temps réel dans un échange, Telegram doit y accéder en arrière-plan pour l'actualiser pendant la durée du partage."; +"NSLocationAlwaysUsageDescription" = "Quand vous décidez de partager votre position en temps réel dans un échange, Telegram doit y accéder en arrière-plan pour l'actualiser pendant la durée du partage. Cela sert aussi à envoyer une position depuis l'Apple Watch."; +"NSCameraUsageDescription" = "Nous en avons besoin pour que vous puissiez prendre et partager des photos et des vidéos."; +"NSPhotoLibraryUsageDescription" = "Nous en avons besoin pour que vous puissiez partager des photos et des vidéos de votre photothèque."; +"NSPhotoLibraryAddUsageDescription" = "Nous en avons besoin pour que vous puissiez enregistrer des photos et des vidéos dans votre photothèque."; +"NSMicrophoneUsageDescription" = "Nous en avons besoin pour que vous puissiez enregistrer et partager des messages vocaux et des vidéos avec du son."; +"NSSiriUsageDescription" = "Vous pouvez utiliser Siri pour envoyer des messages."; +"NSFaceIDUsageDescription" = "Vous pouvez déverrouiller Telegram avec Face ID."; diff --git a/Telegram-iOS/fr.lproj/Localizable.strings b/Telegram-iOS/fr.lproj/Localizable.strings new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Telegram-iOS/fr.lproj/Localizable.strings @@ -0,0 +1 @@ + diff --git a/Telegram-iOS/id.lproj/AppIntentVocabulary.plist b/Telegram-iOS/id.lproj/AppIntentVocabulary.plist new file mode 100644 index 0000000000..504ece4483 --- /dev/null +++ b/Telegram-iOS/id.lproj/AppIntentVocabulary.plist @@ -0,0 +1,17 @@ + + + + + IntentPhrases + + + IntentName + INSendMessageIntent + IntentExamples + + Send a Telegram message to Alex saying I'll be there in 10 minutes + + + + + diff --git a/Telegram-iOS/id.lproj/InfoPlist.strings b/Telegram-iOS/id.lproj/InfoPlist.strings new file mode 100644 index 0000000000..8291c51d7f --- /dev/null +++ b/Telegram-iOS/id.lproj/InfoPlist.strings @@ -0,0 +1,12 @@ +/* Localized versions of Info.plist keys */ + +"NSContactsUsageDescription" = "Telegram akan terus mengunggah kontak Anda ke penyimpanan awan yang dienkripsi penuh, sehingga Anda dapat terhubung dengan teman Anda di semua perangkat Anda."; +"NSLocationWhenInUseUsageDescription" = "Ketika Anda mengirim lokasi untuk teman, Telegram membutuhkan akses untuk berbagi peta."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Jika Anda memilih untuk membagikan Live Location dengan teman dalam obrolan, Telegram memerlukan akses latar belakang ke lokasi Anda agar lokasi tetap diperbarui selama lokasi langsung dibagikan."; +"NSLocationAlwaysUsageDescription" = "Jika Anda ingin berbagi Live Location dengan teman dalam chat, Telegram perlu akses latar belakang ke lokasi Anda agar lokasi tetap diperbarui selama lokasi langsung dibagikan. Hal yang sama perlu dilakukan untuk berbagi lokasi dari Apple Watch."; +"NSCameraUsageDescription" = "Kami membutuhkan hal ini agar Anda dapat mengambil dan membagikan foto dan video."; +"NSPhotoLibraryUsageDescription" = "Kami membutuhkan hal ini agar Anda dapat berbagi foto dan video dari galeri foto Anda."; +"NSPhotoLibraryAddUsageDescription" = "Kami membutuhkan hal ini agar Anda dapat menyimpan foto dan video ke galeri foto."; +"NSMicrophoneUsageDescription" = "Kami butuh hal ini agar Anda dapat merekam dan berbagi pesan audio dan video dengan suara."; +"NSSiriUsageDescription" = "Anda dapat menggunakan Siri untuk mengirim pesan."; +"NSFaceIDUsageDescription" = "Anda dapat menggunakan Face ID untuk membuka kunci aplikasi."; diff --git a/Telegram-iOS/id.lproj/Localizable.strings b/Telegram-iOS/id.lproj/Localizable.strings new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Telegram-iOS/id.lproj/Localizable.strings @@ -0,0 +1 @@ + diff --git a/Telegram-iOS/it.lproj/InfoPlist.strings b/Telegram-iOS/it.lproj/InfoPlist.strings index 773512d3bf..9e1ae9a309 100644 --- a/Telegram-iOS/it.lproj/InfoPlist.strings +++ b/Telegram-iOS/it.lproj/InfoPlist.strings @@ -3,12 +3,10 @@ "NSContactsUsageDescription" = "Telegram caricherà continuamente i tuoi contatti sui suoi server cloud altamente criptati per farti connettere con i tuoi amici da tutti i tuoi dispositivi."; "NSLocationWhenInUseUsageDescription" = "Quando invii la tua posizione ai tuoi amici, Telegram ha bisogno di accedere per mostrare loro la mappa."; "NSLocationAlwaysUsageDescription" = "Quando invii la tua posizione ai tuoi amici, Telegram ha bisogno di accedere per mostrare loro la mappa. Ti serve anche per inviare posizioni da Apple Watch."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Quando scegli di condividere la tua Posizione Attuale con gli amici in una chat, Telegram ha bisogno dell'accesso in background alla tua posizione per tenerli aggiornati durante la durata della condivisione della posizione."; "NSCameraUsageDescription" = "Ci serve per farti scattare, registrare e condividere foto e video."; "NSPhotoLibraryUsageDescription" = "Ci serve per farti condividere foto e video dalla tua libreria foto."; +"NSPhotoLibraryAddUsageDescription" = "Ci serve per farti salvare foto e video nella tua libreria foto."; "NSMicrophoneUsageDescription" = "Ci serve per farti registrare e condividere messaggi vocali e video con il sonoro."; "NSSiriUsageDescription" = "Puoi usare Siri per inviare messaggi."; - -"NSLocationAlwaysAndWhenInUseUsageDescription" = "Quando scegli di condividere la tua Posizione Attuale con gli amici in una chat, Telegram ha bisogno dell'accesso in background alla tua posizione per tenerli aggiornati durante la durata della condivisione della posizione."; -"NSLocationAlwaysUsageDescription" = "Quando invii la tua posizione ai tuoi amici, Telegram ha bisogno di accedere per mostrare loro la mappa. Ti serve anche per inviare posizioni da Apple Watch."; -"NSLocationWhenInUseUsageDescription" = "Quando invii la tua posizione ai tuoi amici, Telegram ha bisogno di accedere per mostrare loro la mappa."; - +"NSFaceIDUsageDescription" = "Puoi usare il Face ID per sbloccare l'app."; diff --git a/Telegram-iOS/ko.lproj/InfoPlist.strings b/Telegram-iOS/ko.lproj/InfoPlist.strings index 33a523ce44..b692e0af6c 100644 --- a/Telegram-iOS/ko.lproj/InfoPlist.strings +++ b/Telegram-iOS/ko.lproj/InfoPlist.strings @@ -1,16 +1,12 @@ /* Localized versions of Info.plist keys */ - "CFBundleDisplayName" = "텔레그램"; - "NSContactsUsageDescription" = "Telegram will continuously upload your contacts to its heavily encrypted cloud servers to let you connect with your friends across all your devices."; "NSLocationWhenInUseUsageDescription" = "친구에게 회원님의 위치를 전송할 경우 위치를 지도에 표시하기 위해 텔레그램이 위치 정보에 접근할 수 있어야 합니다."; "NSLocationAlwaysUsageDescription" = "친구에게 회원님의 위치를 전송할 경우 위치를 지도에 표시하기 위해 텔레그램이 위치 정보에 접근할 수 있어야 합니다. 애플워치에 위치 전송을 위해서도 필요합니다."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "When you choose to share your Live Location with friends in a chat, Telegram needs background access to your location to keep them updated for the duration of the live sharing."; "NSCameraUsageDescription" = "사진과 비디오 촬영을 위하여 필요합니다."; "NSPhotoLibraryUsageDescription" = "촬영한 사진과 비디오를 공유하기 위하여 필요합니다."; +"NSPhotoLibraryAddUsageDescription" = "사진과 동영상을 갤러리에 저장하기 위해 이 권한이 필요합니다."; "NSMicrophoneUsageDescription" = "음성메시지와 비디오 촬영시 음성 녹음을 위하여 필요합니다."; "NSSiriUsageDescription" = "시리를 통하여 메시지 전송이 가능합니다."; - -"NSLocationAlwaysAndWhenInUseUsageDescription" = "When you choose to share your Live Location with friends in a chat, Telegram needs background access to your location to keep them updated for the duration of the live sharing."; -"NSLocationAlwaysUsageDescription" = "친구에게 회원님의 위치를 전송할 경우 위치를 지도에 표시하기 위해 텔레그램이 위치 정보에 접근할 수 있어야 합니다. 애플워치에 위치 전송을 위해서도 필요합니다."; -"NSLocationWhenInUseUsageDescription" = "친구에게 회원님의 위치를 전송할 경우 위치를 지도에 표시하기 위해 텔레그램이 위치 정보에 접근할 수 있어야 합니다."; - +"NSFaceIDUsageDescription" = "Face ID 를 사용하여 앱 잠금을 해제할 수 있습니다"; diff --git a/Telegram-iOS/ms.lproj/AppIntentVocabulary.plist b/Telegram-iOS/ms.lproj/AppIntentVocabulary.plist new file mode 100644 index 0000000000..504ece4483 --- /dev/null +++ b/Telegram-iOS/ms.lproj/AppIntentVocabulary.plist @@ -0,0 +1,17 @@ + + + + + IntentPhrases + + + IntentName + INSendMessageIntent + IntentExamples + + Send a Telegram message to Alex saying I'll be there in 10 minutes + + + + + diff --git a/Telegram-iOS/ms.lproj/InfoPlist.strings b/Telegram-iOS/ms.lproj/InfoPlist.strings new file mode 100644 index 0000000000..10ef1e9f5f --- /dev/null +++ b/Telegram-iOS/ms.lproj/InfoPlist.strings @@ -0,0 +1,12 @@ +/* Localized versions of Info.plist keys */ + +"NSContactsUsageDescription" = "Telegram akan sentiasa muat naik kenalan anda ke pelayan awan yang berenkripsi tinggi agar anda boleh berhubung dengan rakan anda di semua peranti anda."; +"NSLocationWhenInUseUsageDescription" = "Bila anda hantar lokasi anda kepada rakan anda, Telegram perlukan akses untuk tunjuk peta."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Bila anda pilih untuk kongsi Lokasi Langsung anda dengan rakan dalam chat, Telegram perlu akses latar belakang ke lokasi anda agar lokasi anda sentiasa dikemaskini ketika perkongsian."; +"NSLocationAlwaysUsageDescription" = "Bila anda pilih untuk kongsi lokasi langsung anda dengan rakan dalam chat, Telegram perlu akses latar belakang agar lokasi anda sentiasa dikemaskini. Anda juga harus hantar lokasi anda ke Jam Apple."; +"NSCameraUsageDescription" = "Kita perlukan ini agar anda boleh ambil dan kongsi foto dan video."; +"NSPhotoLibraryUsageDescription" = "Kita perlu ini agar anda boleh kongsi foto dan video dari librari foto anda."; +"NSPhotoLibraryAddUsageDescription" = "Kita perlu ini agar anda boleh simpan foto dan video ke librari foto anda."; +"NSMicrophoneUsageDescription" = "Kita perlu ini agar anda boleh rekod dan kongsi mesej suara dan video dengan suara."; +"NSSiriUsageDescription" = "Anda boleh guna Siri untuk kirim mesej."; +"NSFaceIDUsageDescription" = "Anda boleh guna ID Muka untuk guna aplikasi."; diff --git a/Telegram-iOS/ms.lproj/Localizable.strings b/Telegram-iOS/ms.lproj/Localizable.strings new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Telegram-iOS/ms.lproj/Localizable.strings @@ -0,0 +1 @@ + diff --git a/Telegram-iOS/nl.lproj/InfoPlist.strings b/Telegram-iOS/nl.lproj/InfoPlist.strings index 2f2bf97fa2..1bddf64f04 100644 --- a/Telegram-iOS/nl.lproj/InfoPlist.strings +++ b/Telegram-iOS/nl.lproj/InfoPlist.strings @@ -2,13 +2,11 @@ "NSContactsUsageDescription" = "Telegram synchroniseert je contacten continu naar onze zwaar versleutelde Cloud-servers, zodat je contact kunt opnemen met je vrienden vanaf al je apparaten."; "NSLocationWhenInUseUsageDescription" = "Als je je locatie met vrienden wilt delen heeft Telegram toegang nodig om ze een kaart te kunnen tonen."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Als je ervoor kiest om je huidige locatie te delen met vrienden in een chat heeft Telegram achtergrondtoegang tot je locatie nodig om deze bij te werken tijdens het live-delen."; "NSLocationAlwaysUsageDescription" = "Telegram heeft toegang nodig om een kaart aan je vrienden te tonen als je jouw locatie met ze deelt. Je hebt dit ook nodig om locaties te sturen vanaf een Apple Watch."; "NSCameraUsageDescription" = "We hebben dit nodig zodat je foto's en video's kunt maken en delen."; "NSPhotoLibraryUsageDescription" = "We hebben dit nodig zodat je foto's en video's kunt delen vanuit je fotobibliotheek."; +"NSPhotoLibraryAddUsageDescription" = "We hebben dit nodig zodat je foto's en video's kunt opslaan in je fotobibliotheek."; "NSMicrophoneUsageDescription" = "We hebben dit nodig zodat je spraakberichten en video's met geluid kunt opnemen en delen."; "NSSiriUsageDescription" = "Je kunt Siri gebruiken om berichten te sturen"; - -"NSLocationAlwaysAndWhenInUseUsageDescription" = "Als je ervoor kiest om je huidige locatie te delen met vrienden in een chat heeft Telegram achtergrondtoegang tot je locatie nodig om deze bij te werken tijdens het live-delen."; -"NSLocationAlwaysUsageDescription" = "Telegram heeft toegang nodig om een kaart aan je vrienden te tonen als je jouw locatie met ze deelt. Je hebt dit ook nodig om locaties te sturen vanaf een Apple Watch."; -"NSLocationWhenInUseUsageDescription" = "Als je je locatie met vrienden wilt delen heeft Telegram toegang nodig om ze een kaart te kunnen tonen."; - +"NSFaceIDUsageDescription" = "Je kunt Face ID gebruiken om de app te ontgrendelen."; diff --git a/Telegram-iOS/pt.lproj/InfoPlist.strings b/Telegram-iOS/pt.lproj/InfoPlist.strings index 52d513f9fa..ddc65bbd02 100644 --- a/Telegram-iOS/pt.lproj/InfoPlist.strings +++ b/Telegram-iOS/pt.lproj/InfoPlist.strings @@ -2,13 +2,11 @@ "NSContactsUsageDescription" = "Telegram atualizará continuamente os seus contatos em servidores na nuvem fortemente criptografados para que você se conecte com seus amigos através de todos os seus dispositivos."; "NSLocationWhenInUseUsageDescription" = "Para enviar sua localização para seus amigos o Telegram precisa de permissão para mostrá-los o mapa."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Quando você escolhe compartilhar sua Localização em Tempo Real com amigos no chat, o Telegram precisa de acesso à sua localização em segundo plano para mantê-los atualizados durante o compartilhamento."; "NSLocationAlwaysUsageDescription" = "Para enviar sua localização para seus amigos, o Telegram precisa de permissão para mostrá-los o mapa. Você também precisará disso para enviar localizações de um Apple Watch."; "NSCameraUsageDescription" = "Precisamos acessar sua câmera para que você possa capturar fotos e vídeos."; "NSPhotoLibraryUsageDescription" = "Precisamos disso para que você possa compartilhar fotos e vídeos de sua galeria."; +"NSPhotoLibraryAddUsageDescription" = "Precisamos disso para que você possa salvar fotos e vídeos em sua galeria de fotos."; "NSMicrophoneUsageDescription" = "Precisamos disso para que você possa gravar mensagens de voz e vídeos com som."; "NSSiriUsageDescription" = "Você pode usar a Siri para enviar mensagens."; - -"NSLocationAlwaysAndWhenInUseUsageDescription" = "Quando você escolhe compartilhar sua Localização em Tempo Real com amigos no chat, o Telegram precisa de acesso à sua localização em segundo plano para mantê-los atualizados durante o compartilhamento."; -"NSLocationAlwaysUsageDescription" = "Para enviar sua localização para seus amigos, o Telegram precisa de permissão para mostrá-los o mapa. Você também precisará disso para enviar localizações de um Apple Watch."; -"NSLocationWhenInUseUsageDescription" = "Para enviar sua localização para seus amigos o Telegram precisa de permissão para mostrá-los o mapa."; - +"NSFaceIDUsageDescription" = "Você pode usar o Face ID para desbloquear o app."; diff --git a/Telegram-iOS/ru.lproj/InfoPlist.strings b/Telegram-iOS/ru.lproj/InfoPlist.strings index 4490f7aabf..f4b64e4983 100644 --- a/Telegram-iOS/ru.lproj/InfoPlist.strings +++ b/Telegram-iOS/ru.lproj/InfoPlist.strings @@ -2,12 +2,11 @@ "NSContactsUsageDescription" = "Актуальная информация о ваших контактах будет храниться зашифрованной в облаке Telegram, чтобы вы могли связаться с друзьями с любого устройства."; "NSLocationWhenInUseUsageDescription" = "Когда вы отправляете друзьям геопозицию, Telegram нужно разрешение, чтобы показать им карту."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Фоновый доступ к геопозиции требуется, чтобы обновлять вашу геопозицию, когда вы транслируете её в чат с друзьями. "; +"NSLocationAlwaysUsageDescription" = "Фоновый доступ к геопозиции требуется, чтобы обновлять вашу геопозицию, когда вы транслируете её в чат с друзьями. Он также необходим для отправки геопозиции с Apple Watch."; "NSCameraUsageDescription" = "Это необходимо, чтобы вы могли делиться снятыми фотографиями и видео."; "NSPhotoLibraryUsageDescription" = "Это необходимо, чтобы вы могли делиться фото и видео из библиотеки устройства."; "NSPhotoLibraryAddUsageDescription" = "Это необходимо, чтобы вы могли сохранять фото и видео в библиотеку устройства."; "NSMicrophoneUsageDescription" = "Это необходимо, чтобы вы могли делиться голосовыми сообщениями и видео со звуком."; "NSSiriUsageDescription" = "Вы можете использовать Siri для отправки сообщений"; -"NSLocationAlwaysAndWhenInUseUsageDescription" = "Фоновый доступ к геопозиции требуется, чтобы обновлять вашу геопозицию, когда вы транслируете её в чат с друзьями. "; -"NSLocationAlwaysUsageDescription" = "Фоновый доступ к геопозиции требуется, чтобы обновлять вашу геопозицию, когда вы транслируете её в чат с друзьями. Он также необходим для отправки геопозиции с Apple Watch."; -"NSLocationWhenInUseUsageDescription" = "Когда вы отправляете друзьям геопозицию, Telegram нужно разрешение, чтобы показать им карту."; "NSFaceIDUsageDescription" = "Вы можете разблокировать приложение с помощью Face ID."; diff --git a/Telegram-iOS/tr.lproj/AppIntentVocabulary.plist b/Telegram-iOS/tr.lproj/AppIntentVocabulary.plist new file mode 100644 index 0000000000..504ece4483 --- /dev/null +++ b/Telegram-iOS/tr.lproj/AppIntentVocabulary.plist @@ -0,0 +1,17 @@ + + + + + IntentPhrases + + + IntentName + INSendMessageIntent + IntentExamples + + Send a Telegram message to Alex saying I'll be there in 10 minutes + + + + + diff --git a/Telegram-iOS/tr.lproj/InfoPlist.strings b/Telegram-iOS/tr.lproj/InfoPlist.strings new file mode 100644 index 0000000000..1ba2967139 --- /dev/null +++ b/Telegram-iOS/tr.lproj/InfoPlist.strings @@ -0,0 +1,12 @@ +/* Localized versions of Info.plist keys */ + +"NSContactsUsageDescription" = "Telegram, arkadaşlarınızla tüm cihazlarınız arasında bağlantı kurmanızı sağlamak için kişilerinizi sürekli olarak şifreli bulut sunucularına yükleyecek."; +"NSLocationWhenInUseUsageDescription" = "Konumunuzu arkadaşlarınıza gönderdiğinizde, Telegram'ın onlara bir harita göstermesi için erişmesi gerekiyor."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Canlı Konumunuzu arkadaşlarınızla bir sohbette paylaşmayı seçtiğinizde, Telegram'ın canlı paylaşım süresince onları güncel tutmak için konumunuza arka plan erişimi olması gerekir."; +"NSLocationAlwaysUsageDescription" = "Canlı konumunuzu bir sohbette arkadaşlarınızla paylaşmayı seçtiğinizde, Telegram'ın canlı paylaşım süresince konumunuzu güncel tutması için bir arka plan erişimi gerekir. Ayrıca Apple Watch'dan konum göndermek için de buna ihtiyacınız var."; +"NSCameraUsageDescription" = "Fotoğraf ve video çekip paylaşabilmeniz için buna ihtiyacımız var."; +"NSPhotoLibraryUsageDescription" = "Fotoğraf arşivinizdeki fotoğraf ve videoları paylaşabilmeniz için buna ihtiyacımız var."; +"NSPhotoLibraryAddUsageDescription" = "Fotoğraf arşivine fotoğraf ve video kaydedebilmeniz için buna ihtiyacımız var."; +"NSMicrophoneUsageDescription" = "Sesli mesajları ve videoları ses ile kaydedebilmeniz ve paylaşabilmeniz için buna ihtiyacımız var."; +"NSSiriUsageDescription" = "Mesaj göndermek için Siri'yi kullanabilirsiniz."; +"NSFaceIDUsageDescription" = "Uygulamanın kilidini açmak için Face ID'yi kullanabilirsiniz."; diff --git a/Telegram-iOS/tr.lproj/Localizable.strings b/Telegram-iOS/tr.lproj/Localizable.strings new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Telegram-iOS/tr.lproj/Localizable.strings @@ -0,0 +1 @@ + diff --git a/Telegram-iOS/uk.lproj/AppIntentVocabulary.plist b/Telegram-iOS/uk.lproj/AppIntentVocabulary.plist new file mode 100644 index 0000000000..504ece4483 --- /dev/null +++ b/Telegram-iOS/uk.lproj/AppIntentVocabulary.plist @@ -0,0 +1,17 @@ + + + + + IntentPhrases + + + IntentName + INSendMessageIntent + IntentExamples + + Send a Telegram message to Alex saying I'll be there in 10 minutes + + + + + diff --git a/Telegram-iOS/uk.lproj/InfoPlist.strings b/Telegram-iOS/uk.lproj/InfoPlist.strings new file mode 100644 index 0000000000..f9e8f94199 --- /dev/null +++ b/Telegram-iOS/uk.lproj/InfoPlist.strings @@ -0,0 +1,12 @@ +/* Localized versions of Info.plist keys */ + +"NSContactsUsageDescription" = "Telegram завантажуватиме ваші контакти до зашифрованих хмарних серверів, щоб ви могли зʼєднуватися з друзями на всіх пристроях."; +"NSLocationWhenInUseUsageDescription" = "Коли ви надсилаєте розташування друзям, Telegram потребує доступу, щоб показати їм мапу."; +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Коли ви захочете поділитися Маячком із друзями у чаті, Telegram потребує фонового доступу до розташування, щоб воно оновлювалося на час трансляції маячка."; +"NSLocationAlwaysUsageDescription" = "Коли ви захочете поділитися Маячком із друзями у чаті, Telegram потребує фонового доступу до розташування, щоб воно оновлювалося на час трансляції маячка. Також вам це потрібно для надсилання розташувань з Apple Watch."; +"NSCameraUsageDescription" = "Нам це потрібно, щоб ви могли знімати та ділитися фото й відео."; +"NSPhotoLibraryUsageDescription" = "Нам це потрібно, щоб ви могли ділитися фото та відео з вашої бібліотеки фото."; +"NSPhotoLibraryAddUsageDescription" = "Нам це потрібно, щоб ви могли зберігати фото та відео до вашої бібліотеки фото."; +"NSMicrophoneUsageDescription" = "Нам це потрібно, щоб ви могли записувати та ділитися голосовими повідомленнями та відео зі звуком."; +"NSSiriUsageDescription" = "Надсилайте повідомлення з Siri."; +"NSFaceIDUsageDescription" = "Розблоковуйте застосунок із Face ID."; diff --git a/Telegram-iOS/uk.lproj/Localizable.strings b/Telegram-iOS/uk.lproj/Localizable.strings new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Telegram-iOS/uk.lproj/Localizable.strings @@ -0,0 +1 @@ + diff --git a/submodules/Display/Display/ChildWindowHostView.swift b/submodules/Display/Display/ChildWindowHostView.swift index 3789c0dd71..c5a306ed22 100644 --- a/submodules/Display/Display/ChildWindowHostView.swift +++ b/submodules/Display/Display/ChildWindowHostView.swift @@ -8,6 +8,7 @@ private final class ChildWindowHostView: UIView, WindowHost { var presentController: ((ContainableController, PresentationSurfaceLevel, Bool, @escaping () -> Void) -> Void)? var invalidateDeferScreenEdgeGestureImpl: (() -> Void)? var invalidatePreferNavigationUIHiddenImpl: (() -> Void)? + var invalidateSupportedOrientationsImpl: (() -> Void)? var cancelInteractiveKeyboardGesturesImpl: (() -> Void)? var forEachControllerImpl: (((ContainableController) -> Void) -> Void)? var getAccessibilityElementsImpl: (() -> [Any]?)? @@ -38,6 +39,10 @@ private final class ChildWindowHostView: UIView, WindowHost { self.invalidatePreferNavigationUIHiddenImpl?() } + func invalidateSupportedOrientations() { + self.invalidateSupportedOrientationsImpl?() + } + func cancelInteractiveKeyboardGestures() { self.cancelInteractiveKeyboardGesturesImpl?() } @@ -101,6 +106,10 @@ public func childWindowHostView(parent: UIView) -> WindowHostView { return hostView?.invalidatePreferNavigationUIHidden?() } + view.invalidateSupportedOrientationsImpl = { [weak hostView] in + return hostView?.invalidateSupportedOrientations?() + } + view.cancelInteractiveKeyboardGesturesImpl = { [weak hostView] in hostView?.cancelInteractiveKeyboardGestures?() } diff --git a/submodules/Display/Display/EditableTextNode.swift b/submodules/Display/Display/EditableTextNode.swift index aaba8b9ac2..b10ea9b24a 100644 --- a/submodules/Display/Display/EditableTextNode.swift +++ b/submodules/Display/Display/EditableTextNode.swift @@ -16,3 +16,20 @@ public class EditableTextNode: ASEditableTextNode { } } } + +public extension UITextView { + var numberOfLines: Int { + let layoutManager = self.layoutManager + let numberOfGlyphs = layoutManager.numberOfGlyphs + var lineRange: NSRange = NSMakeRange(0, 1) + var index = 0 + var numberOfLines = 0 + + while index < numberOfGlyphs { + layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange) + index = NSMaxRange(lineRange) + numberOfLines += 1 + } + return numberOfLines + } +} diff --git a/submodules/Display/Display/HapticFeedback.swift b/submodules/Display/Display/HapticFeedback.swift index 2cb17e72cd..4d7d712891 100644 --- a/submodules/Display/Display/HapticFeedback.swift +++ b/submodules/Display/Display/HapticFeedback.swift @@ -1,5 +1,6 @@ import Foundation import UIKit +import AudioToolbox public enum ImpactHapticFeedbackStyle: Hashable { case light @@ -13,35 +14,77 @@ private final class HapticFeedbackImpl { [.light: UIImpactFeedbackGenerator(style: .light), .medium: UIImpactFeedbackGenerator(style: .medium), .heavy: UIImpactFeedbackGenerator(style: .heavy)] }() - private lazy var selectionGenerator = { UISelectionFeedbackGenerator() }() - private lazy var notificationGenerator = { UINotificationFeedbackGenerator() }() + + private lazy var selectionGenerator: UISelectionFeedbackGenerator? = { + let generator = UISelectionFeedbackGenerator() + generator.prepare() + var string = generator.debugDescription + string.removeLast() + let number = string.suffix(1) + if number == "1" { + return generator + } else { + return nil + } + }() + + private lazy var notificationGenerator: UINotificationFeedbackGenerator? = { + let generator = UINotificationFeedbackGenerator() + generator.prepare() + var string = generator.debugDescription + string.removeLast() + let number = string.suffix(1) + if number == "1" { + return generator + } else { + return nil + } + }() func prepareTap() { - self.selectionGenerator.prepare() + if let selectionGenerator = self.selectionGenerator { + selectionGenerator.prepare() + } } func tap() { - self.selectionGenerator.selectionChanged() + if let selectionGenerator = self.selectionGenerator { + selectionGenerator.selectionChanged() + } } func prepareImpact(_ style: ImpactHapticFeedbackStyle) { - self.impactGenerator[style]?.prepare() + if let impactGenerator = self.impactGenerator[style] { + impactGenerator.prepare() + } } func impact(_ style: ImpactHapticFeedbackStyle) { - self.impactGenerator[style]?.impactOccurred() + if let impactGenerator = self.impactGenerator[style] { + impactGenerator.impactOccurred() + } } func success() { - self.notificationGenerator.notificationOccurred(.success) + if let notificationGenerator = self.notificationGenerator { + notificationGenerator.notificationOccurred(.success) + } else { + AudioServicesPlaySystemSound(1520) + } } func prepareError() { - self.notificationGenerator.prepare() + if let notificationGenerator = self.notificationGenerator { + notificationGenerator.prepare() + } } func error() { - self.notificationGenerator.notificationOccurred(.error) + if let notificationGenerator = self.notificationGenerator { + notificationGenerator.notificationOccurred(.error) + } else { + AudioServicesPlaySystemSound(1521) + } } @objc dynamic func f() { diff --git a/submodules/Display/Display/ListView.swift b/submodules/Display/Display/ListView.swift index d94cd83817..3a1ac594fb 100644 --- a/submodules/Display/Display/ListView.swift +++ b/submodules/Display/Display/ListView.swift @@ -2509,9 +2509,12 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture if !updateSizeAndInsets.duration.isZero && !isExperimentalSnapToScrollToItem { let animation: CABasicAnimation + let animationCurve: ContainedViewLayoutTransitionCurve + let animationDuration: Double switch updateSizeAndInsets.curve { case let .Spring(duration): headerNodesTransition = (.animated(duration: duration, curve: .spring), false, -completeOffset) + animationCurve = .spring let springAnimation = makeSpringAnimation("sublayerTransform") springAnimation.fromValue = NSValue(caTransform3D: CATransform3DMakeTranslation(0.0, -completeOffset, 0.0)) springAnimation.toValue = NSValue(caTransform3D: CATransform3DIdentity) @@ -2525,11 +2528,14 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture if !duration.isZero { springAnimation.speed = speed * Float(springAnimation.duration / duration) } + animationDuration = duration springAnimation.isAdditive = true animation = springAnimation case let .Default(duration): headerNodesTransition = (.animated(duration: max(duration ?? 0.3, updateSizeAndInsets.duration), curve: .easeInOut), false, -completeOffset) + animationCurve = .easeInOut + animationDuration = duration ?? 0.3 let basicAnimation = CABasicAnimation(keyPath: "sublayerTransform") basicAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) basicAnimation.duration = updateSizeAndInsets.duration * UIView.animationDurationFactor() @@ -2545,6 +2551,9 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture self?.updateItemNodesVisibilities(onlyPositive: false) } self.layer.add(animation, forKey: nil) + for itemNode in self.itemNodes { + itemNode.applyAbsoluteOffset(value: -completeOffset, animationCurve: animationCurve, duration: animationDuration) + } } } else { self.visibleSize = updateSizeAndInsets.size @@ -2582,6 +2591,9 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture springAnimation.isAdditive = true self.layer.add(springAnimation, forKey: nil) + for itemNode in self.itemNodes { + itemNode.applyAbsoluteOffset(value: -completeOffset, animationCurve: .spring, duration: duration) + } } else { if let snapshotView = snapshotView { snapshotView.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: snapshotView.frame.size) @@ -2739,8 +2751,12 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture let animation: CABasicAnimation let reverseAnimation: CABasicAnimation + let animationCurve: ContainedViewLayoutTransitionCurve + let animationDuration: Double switch scrollToItem.curve { case let .Spring(duration): + animationCurve = .spring + animationDuration = duration let springAnimation = makeSpringAnimation("sublayerTransform") springAnimation.fromValue = NSValue(caTransform3D: CATransform3DMakeTranslation(0.0, -offset, 0.0)) springAnimation.toValue = NSValue(caTransform3D: CATransform3DIdentity) @@ -2770,6 +2786,8 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture reverseAnimation = reverseSpringAnimation case let .Default(duration): if let duration = duration { + animationCurve = .easeInOut + animationDuration = duration let basicAnimation = CABasicAnimation(keyPath: "sublayerTransform") basicAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) basicAnimation.duration = duration * UIView.animationDurationFactor() @@ -2789,6 +2807,9 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture animation = basicAnimation reverseAnimation = reverseBasicAnimation } else { + animationCurve = .slide + animationDuration = duration ?? 0.3 + let basicAnimation = CABasicAnimation(keyPath: "sublayerTransform") basicAnimation.timingFunction = ContainedViewLayoutTransitionCurve.slide.mediaTimingFunction basicAnimation.duration = (duration ?? 0.3) * UIView.animationDurationFactor() @@ -2812,24 +2833,18 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture animation.completion = { _ in for itemNode in temporaryPreviousNodes { itemNode.removeFromSupernode() - if useBackgroundDeallocation { - assertionFailure() - //ASDeallocQueue.sharedDeallocation().releaseObject(inBackground: itemNode) - } else { - //ASPerformMainThreadDeallocation(itemNode) - } } for headerNode in temporaryHeaderNodes { headerNode.removeFromSupernode() - if useBackgroundDeallocation { - assertionFailure() - //ASDeallocQueue.sharedDeallocation().releaseObject(inBackground: headerNode) - } else { - //ASPerformMainThreadDeallocation(headerNode) - } } } self.layer.add(animation, forKey: nil) + for itemNode in self.itemNodes { + itemNode.applyAbsoluteOffset(value: -offset, animationCurve: animationCurve, duration: animationDuration) + } + for itemNode in temporaryPreviousNodes { + itemNode.applyAbsoluteOffset(value: -offset, animationCurve: animationCurve, duration: animationDuration) + } if let verticalScrollIndicator = self.verticalScrollIndicator { verticalScrollIndicator.layer.add(reverseAnimation, forKey: nil) } diff --git a/submodules/Display/Display/ListViewItemNode.swift b/submodules/Display/Display/ListViewItemNode.swift index c12a81168f..af74876d61 100644 --- a/submodules/Display/Display/ListViewItemNode.swift +++ b/submodules/Display/Display/ListViewItemNode.swift @@ -550,11 +550,14 @@ open class ListViewItemNode: ASDisplayNode { (self.supernode as? ListView)?.ensureItemNodeVisible(self, animated: false, overflow: 22.0) } - func updateFrame(_ frame: CGRect, within containerSize: CGSize) { + public func updateFrame(_ frame: CGRect, within containerSize: CGSize) { self.frame = frame self.updateAbsoluteRect(frame, within: containerSize) } open func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { } + + open func applyAbsoluteOffset(value: CGFloat, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { + } } diff --git a/submodules/Display/Display/NativeWindowHostView.swift b/submodules/Display/Display/NativeWindowHostView.swift index 7361f152fa..a73092686a 100644 --- a/submodules/Display/Display/NativeWindowHostView.swift +++ b/submodules/Display/Display/NativeWindowHostView.swift @@ -225,6 +225,7 @@ private final class NativeWindow: UIWindow, WindowHost { var presentNativeImpl: ((UIViewController) -> Void)? var invalidateDeferScreenEdgeGestureImpl: (() -> Void)? var invalidatePreferNavigationUIHiddenImpl: (() -> Void)? + var invalidateSupportedOrientationsImpl: (() -> Void)? var cancelInteractiveKeyboardGesturesImpl: (() -> Void)? var forEachControllerImpl: (((ContainableController) -> Void) -> Void)? var getAccessibilityElementsImpl: (() -> [Any]?)? @@ -323,6 +324,10 @@ private final class NativeWindow: UIWindow, WindowHost { self.invalidatePreferNavigationUIHiddenImpl?() } + func invalidateSupportedOrientations() { + self.invalidateSupportedOrientationsImpl?() + } + func cancelInteractiveKeyboardGestures() { self.cancelInteractiveKeyboardGesturesImpl?() } @@ -394,6 +399,10 @@ public func nativeWindowHostView() -> (UIWindow & WindowHost, WindowHostView) { return hostView?.invalidatePreferNavigationUIHidden?() } + window.invalidateSupportedOrientationsImpl = { [weak hostView] in + return hostView?.invalidateSupportedOrientations?() + } + window.cancelInteractiveKeyboardGesturesImpl = { [weak hostView] in hostView?.cancelInteractiveKeyboardGestures?() } diff --git a/submodules/Display/Display/StatusBarProxyNode.swift b/submodules/Display/Display/StatusBarProxyNode.swift index be2f0f3795..ab1b02f81c 100644 --- a/submodules/Display/Display/StatusBarProxyNode.swift +++ b/submodules/Display/Display/StatusBarProxyNode.swift @@ -51,6 +51,14 @@ private func maxSubviewBounds(_ view: UIView) -> CGRect { return bounds } +private let formatter: DateFormatter? = { + let formatter = DateFormatter() + formatter.timeStyle = .short + formatter.locale = Locale.current + return formatter +}() + + private class StatusBarItemNode: ASDisplayNode { var statusBarStyle: StatusBarStyle var targetView: UIView @@ -103,11 +111,42 @@ private class StatusBarItemNode: ASDisplayNode { } } } else { - context.withContext { c in - c.translateBy(x: containingBounds.minX, y: -containingBounds.minY) - UIGraphicsPushContext(c) - self.targetView.layer.render(in: c) - UIGraphicsPopContext() + if self.targetView.checkIsKind(of: timeViewClass) { + context.withContext { c in + c.translateBy(x: containingBounds.minX, y: -containingBounds.minY) + UIGraphicsPushContext(c) + + let color: UIColor + switch self.statusBarStyle { + case .Black, .Ignore, .Hide: + color = UIColor.black + case .White: + color = UIColor.white + } + + formatter?.locale = Locale.current + if let string = formatter?.string(from: Date()) { + let attributedString = NSAttributedString(string: string, attributes: [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 12.0), NSAttributedStringKey.foregroundColor: color]) + + let line = CTLineCreateWithAttributedString(attributedString) + + c.translateBy(x: containingBounds.width / 2.0, y: containingBounds.height / 2.0) + c.scaleBy(x: 1.0, y: -1.0) + c.translateBy(x: -containingBounds.width / 2.0, y: -containingBounds.height / 2.0) + + c.translateBy(x: 0.0, y: 5.0 + UIScreenPixel) + CTLineDraw(line, c) + } + + UIGraphicsPopContext() + } + } else { + context.withContext { c in + c.translateBy(x: containingBounds.minX, y: -containingBounds.minY) + UIGraphicsPushContext(c) + self.targetView.layer.render(in: c) + UIGraphicsPopContext() + } } } //dumpViews(self.targetView) @@ -136,8 +175,9 @@ private class StatusBarItemNode: ASDisplayNode { type = .Activity } } - tintStatusBarItem(context, type: type, style: statusBarStyle) - self.contentNode.contents = context.generateImage()?.cgImage + tintStatusBarItem(context, type: type, style: self.statusBarStyle) + let image = context.generateImage()?.cgImage + self.contentNode.contents = image let mappedFrame = self.targetView.convert(self.targetView.bounds, to: self.rootView) self.frame = mappedFrame @@ -356,6 +396,14 @@ private let stringClass: AnyClass? = { return NSClassFromString("_UI" + nameString) }() +private let timeViewClass: AnyClass? = { + var nameString = "StatusBar" + if CFAbsoluteTimeGetCurrent() > 0 { + nameString += "TimeItemView" + } + return NSClassFromString("UI" + nameString) +}() + private func containsSubviewOfClass(view: UIView, of subviewClass: AnyClass?) -> Bool { guard let subviewClass = subviewClass else { return false diff --git a/submodules/Display/Display/ViewController.swift b/submodules/Display/Display/ViewController.swift index 96842fc87f..6c465231de 100644 --- a/submodules/Display/Display/ViewController.swift +++ b/submodules/Display/Display/ViewController.swift @@ -35,7 +35,7 @@ public enum ViewControllerPresentationAnimation { case modalSheet } -public struct ViewControllerSupportedOrientations { +public struct ViewControllerSupportedOrientations: Equatable { public var regularSize: UIInterfaceOrientationMask public var compactSize: UIInterfaceOrientationMask @@ -67,7 +67,13 @@ open class ViewControllerPresentationArguments { public let presentationContext: PresentationContext - public final var supportedOrientations: ViewControllerSupportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .allButUpsideDown) + public final var supportedOrientations: ViewControllerSupportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .allButUpsideDown) { + didSet { + if self.supportedOrientations != oldValue { + self.window?.invalidateSupportedOrientations() + } + } + } public final var lockedOrientation: UIInterfaceOrientationMask? public final var lockOrientation: Bool = false { didSet { diff --git a/submodules/Display/Display/WindowContent.swift b/submodules/Display/Display/WindowContent.swift index be3b7610ff..724128f6bc 100644 --- a/submodules/Display/Display/WindowContent.swift +++ b/submodules/Display/Display/WindowContent.swift @@ -230,6 +230,7 @@ public final class WindowHostView { var hitTest: ((CGPoint, UIEvent?) -> UIView?)? var invalidateDeferScreenEdgeGesture: (() -> Void)? var invalidatePreferNavigationUIHidden: (() -> Void)? + var invalidateSupportedOrientations: (() -> Void)? var cancelInteractiveKeyboardGestures: (() -> Void)? var forEachController: (((ContainableController) -> Void) -> Void)? var getAccessibilityElements: (() -> [Any]?)? @@ -263,6 +264,7 @@ public protocol WindowHost { func presentInGlobalOverlay(_ controller: ContainableController) func invalidateDeferScreenEdgeGestures() func invalidatePreferNavigationUIHidden() + func invalidateSupportedOrientations() func cancelInteractiveKeyboardGestures() } @@ -313,6 +315,7 @@ public class Window1 { private var tracingStatusBarsInvalidated = false private var shouldUpdateDeferScreenEdgeGestures = false private var shouldInvalidatePreferNavigationUIHidden = false + private var shouldInvalidateSupportedOrientations = false private var statusBarHidden = false @@ -419,6 +422,10 @@ public class Window1 { self?.invalidatePreferNavigationUIHidden() } + self.hostView.invalidateSupportedOrientations = { [weak self] in + self?.invalidateSupportedOrientations() + } + self.hostView.cancelInteractiveKeyboardGestures = { [weak self] in self?.cancelInteractiveKeyboardGestures() } @@ -612,6 +619,11 @@ public class Window1 { self.hostView.eventView.setNeedsLayout() } + public func invalidateSupportedOrientations() { + self.shouldInvalidateSupportedOrientations = true + self.hostView.eventView.setNeedsLayout() + } + public func cancelInteractiveKeyboardGestures() { self.windowPanRecognizer?.isEnabled = false self.windowPanRecognizer?.isEnabled = true @@ -817,19 +829,49 @@ public class Window1 { if resolvedOrientations.isEmpty { resolvedOrientations = [.portrait] } - self.hostView.updateSupportedInterfaceOrientations(resolvedOrientations) - - self.hostView.updateDeferScreenEdgeGestures(self.collectScreenEdgeGestures()) - self.hostView.updatePreferNavigationUIHidden(self.collectPreferNavigationUIHidden()) - - self.shouldUpdateDeferScreenEdgeGestures = false - self.shouldInvalidatePreferNavigationUIHidden = false - } else if self.shouldUpdateDeferScreenEdgeGestures || self.shouldInvalidatePreferNavigationUIHidden { - self.shouldUpdateDeferScreenEdgeGestures = false - self.shouldInvalidatePreferNavigationUIHidden = false + self.hostView.updateSupportedInterfaceOrientations(resolvedOrientations) self.hostView.updateDeferScreenEdgeGestures(self.collectScreenEdgeGestures()) self.hostView.updatePreferNavigationUIHidden(self.collectPreferNavigationUIHidden()) + + self.shouldUpdateDeferScreenEdgeGestures = false + self.shouldInvalidatePreferNavigationUIHidden = false + self.shouldInvalidateSupportedOrientations = false + } else if self.shouldUpdateDeferScreenEdgeGestures || self.shouldInvalidatePreferNavigationUIHidden || self.shouldInvalidateSupportedOrientations { + self.hostView.updateDeferScreenEdgeGestures(self.collectScreenEdgeGestures()) + self.hostView.updatePreferNavigationUIHidden(self.collectPreferNavigationUIHidden()) + + self.shouldUpdateDeferScreenEdgeGestures = false + self.shouldInvalidatePreferNavigationUIHidden = false + + if self.shouldInvalidateSupportedOrientations { + var supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .all) + let orientationToLock: UIInterfaceOrientationMask + if self.windowLayout.size.width < self.windowLayout.size.height { + orientationToLock = .portrait + } else { + orientationToLock = .landscape + } + if let _rootController = self._rootController { + supportedOrientations = supportedOrientations.intersection(_rootController.combinedSupportedOrientations(currentOrientationToLock: orientationToLock)) + } + supportedOrientations = supportedOrientations.intersection(self.presentationContext.combinedSupportedOrientations(currentOrientationToLock: orientationToLock)) + supportedOrientations = supportedOrientations.intersection(self.overlayPresentationContext.combinedSupportedOrientations(currentOrientationToLock: orientationToLock)) + + var resolvedOrientations: UIInterfaceOrientationMask + switch self.windowLayout.metrics.widthClass { + case .regular: + resolvedOrientations = supportedOrientations.regularSize + case .compact: + resolvedOrientations = supportedOrientations.compactSize + } + if resolvedOrientations.isEmpty { + resolvedOrientations = [.portrait] + } + self.hostView.updateSupportedInterfaceOrientations(resolvedOrientations) + + self.shouldInvalidateSupportedOrientations = false + } } if !UIWindow.isDeviceRotating() { diff --git a/submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaMute@2x.png b/submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaMute@2x.png new file mode 100644 index 0000000000..036c06a6d1 Binary files /dev/null and b/submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaMute@2x.png differ diff --git a/submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaMute@3x.png b/submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaMute@3x.png new file mode 100644 index 0000000000..a79ac3bd68 Binary files /dev/null and b/submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaMute@3x.png differ diff --git a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h index 3e1f089bf5..83a96e3f62 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h +++ b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h @@ -28,12 +28,13 @@ @property (nonatomic) bool asFile; @property (nonatomic) bool inhibitMute; @property (nonatomic) bool disableStickers; +@property (nonatomic) bool hasSilentPosting; @property (nonatomic, strong) NSArray *underlyingViews; @property (nonatomic, assign) bool openEditor; @property (nonatomic, copy) void (^cameraPressed)(TGAttachmentCameraView *cameraView); -@property (nonatomic, copy) void (^sendPressed)(TGMediaAsset *currentItem, bool asFiles); +@property (nonatomic, copy) void (^sendPressed)(TGMediaAsset *currentItem, bool asFiles, bool silentPosting); @property (nonatomic, copy) void (^avatarCompletionBlock)(UIImage *image); @property (nonatomic, copy) void (^editorOpened)(void); diff --git a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m index 89540f4b1f..549af5be97 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m +++ b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m @@ -264,7 +264,7 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; { if (strongSelf->_selectionContext.allowGrouping) [[NSUserDefaults standardUserDefaults] setObject:@(!strongSelf->_selectionContext.grouping) forKey:@"TG_mediaGroupingDisabled_v0"]; - strongSelf.sendPressed(nil, false); + strongSelf.sendPressed(nil, false, false); } }]; [_sendMediaItemView setHidden:true animated:false]; @@ -276,7 +276,7 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; { __strong TGAttachmentCarouselItemView *strongSelf = weakSelf; if (strongSelf != nil && strongSelf.sendPressed != nil) - strongSelf.sendPressed(nil, true); + strongSelf.sendPressed(nil, true, false); }]; _sendFileItemView.requiresDivider = false; [_sendFileItemView setHidden:true animated:false]; @@ -774,14 +774,14 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; strongSelf->_galleryMixin = nil; }; - mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item) + mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, bool silentPosting) { __strong TGAttachmentCarouselItemView *strongSelf = weakSelf; if (strongSelf != nil && strongSelf.sendPressed != nil) { if (strongSelf->_selectionContext.allowGrouping) [[NSUserDefaults standardUserDefaults] setObject:@(!strongSelf->_selectionContext.grouping) forKey:@"TG_mediaGroupingDisabled_v0"]; - strongSelf.sendPressed(item.asset, strongSelf.asFile); + strongSelf.sendPressed(item.asset, strongSelf.asFile, silentPosting); } }; @@ -801,7 +801,7 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; if ([cell isKindOfClass:[TGAttachmentAssetCell class]]) thumbnailImage = cell.imageView.image; - TGMediaPickerModernGalleryMixin *mixin = [[TGMediaPickerModernGalleryMixin alloc] initWithContext:_context item:asset fetchResult:_fetchResult parentController:self.parentController thumbnailImage:thumbnailImage selectionContext:_selectionContext editingContext:_editingContext suggestionContext:self.suggestionContext hasCaptions:(_allowCaptions && !_forProfilePhoto) allowCaptionEntities:self.allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:_inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:self.asFile itemsLimit:TGAttachmentDisplayedAssetLimit recipientName:self.recipientName]; + TGMediaPickerModernGalleryMixin *mixin = [[TGMediaPickerModernGalleryMixin alloc] initWithContext:_context item:asset fetchResult:_fetchResult parentController:self.parentController thumbnailImage:thumbnailImage selectionContext:_selectionContext editingContext:_editingContext suggestionContext:self.suggestionContext hasCaptions:(_allowCaptions && !_forProfilePhoto) allowCaptionEntities:self.allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:_inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:self.asFile itemsLimit:TGAttachmentDisplayedAssetLimit recipientName:self.recipientName hasSilentPosting:self.hasSilentPosting]; __weak TGAttachmentCarouselItemView *weakSelf = self; mixin.thumbnailSignalForItem = ^SSignal *(id item) diff --git a/submodules/LegacyComponents/LegacyComponents/TGCameraController.h b/submodules/LegacyComponents/LegacyComponents/TGCameraController.h index 051f15e933..bc792c72fb 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGCameraController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGCameraController.h @@ -35,6 +35,7 @@ typedef enum { @property (nonatomic, assign) bool inhibitMultipleCapture; @property (nonatomic, assign) bool inhibitMute; @property (nonatomic, assign) bool hasTimer; +@property (nonatomic, assign) bool hasSilentPosting; @property (nonatomic, strong) TGSuggestionContext *suggestionContext; @property (nonatomic, assign) bool shortcut; diff --git a/submodules/LegacyComponents/LegacyComponents/TGCameraController.m b/submodules/LegacyComponents/LegacyComponents/TGCameraController.m index fa2f5677ea..0afd5b81ef 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGCameraController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGCameraController.m @@ -1620,6 +1620,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus controller.shouldStoreAssets = self.shouldStoreCapturedAssets; controller.suggestionContext = self.suggestionContext; controller.hasTimer = self.hasTimer; + controller.hasSilentPosting = self.hasSilentPosting; __weak TGCameraPhotoPreviewController *weakController = controller; controller.beginTransitionIn = ^CGRect diff --git a/submodules/LegacyComponents/LegacyComponents/TGCameraPhotoPreviewController.h b/submodules/LegacyComponents/LegacyComponents/TGCameraPhotoPreviewController.h index e6fc992961..2824bd59de 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGCameraPhotoPreviewController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGCameraPhotoPreviewController.h @@ -23,6 +23,7 @@ @property (nonatomic, strong) TGSuggestionContext *suggestionContext; @property (nonatomic, assign) bool shouldStoreAssets; @property (nonatomic, assign) bool hasTimer; +@property (nonatomic, assign) bool hasSilentPosting; - (instancetype)initWithContext:(id)context image:(UIImage *)image metadata:(PGCameraShotMetadata *)metadata recipientName:(NSString *)recipientName saveCapturedMedia:(bool)saveCapturedMedia saveEditedPhotos:(bool)saveEditedPhotos; - (instancetype)initWithContext:(id)context image:(UIImage *)image metadata:(PGCameraShotMetadata *)metadata recipientName:(NSString *)recipientName backButtonTitle:(NSString *)backButtonTitle doneButtonTitle:(NSString *)doneButtonTitle saveCapturedMedia:(bool)saveCapturedMedia saveEditedPhotos:(bool)saveEditedPhotos; diff --git a/submodules/LegacyComponents/LegacyComponents/TGClipboardPreviewItemView.m b/submodules/LegacyComponents/LegacyComponents/TGClipboardPreviewItemView.m index eb961d54a2..f6bf824a74 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGClipboardPreviewItemView.m +++ b/submodules/LegacyComponents/LegacyComponents/TGClipboardPreviewItemView.m @@ -255,9 +255,6 @@ const CGFloat TGClipboardPreviewEdgeInset = 8.0f; if (strongSelf != nil && strongSelf.sendPressed != nil) strongSelf.sendPressed(item.image); }; - - //mixin.editorOpened = self.editorOpened; - //mixin.editorClosed = self.editorClosed; } - (TGClipboardGalleryMixin *)galleryMixinForIndexPath:(NSIndexPath *)indexPath diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h index 698991b82b..0abe8f975d 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h @@ -55,6 +55,7 @@ typedef enum @property (nonatomic, assign) bool hasTimer; @property (nonatomic, assign) bool onlyCrop; @property (nonatomic, assign) bool inhibitMute; +@property (nonatomic, assign) bool hasSilentPosting; @property (nonatomic, assign) bool liveVideoUploadEnabled; @property (nonatomic, assign) bool shouldShowFileTipIfNeeded; @@ -63,7 +64,7 @@ typedef enum @property (nonatomic, copy) NSDictionary *(^descriptionGenerator)(id, NSString *, NSArray *, NSString *); @property (nonatomic, copy) void (^avatarCompletionBlock)(UIImage *image); -@property (nonatomic, copy) void (^completionBlock)(NSArray *signals); +@property (nonatomic, copy) void (^completionBlock)(NSArray *signals, bool silentPosting); @property (nonatomic, copy) void (^singleCompletionBlock)(id item, TGMediaEditingContext *editingContext); @property (nonatomic, copy) void (^dismissalBlock)(void); @property (nonatomic, copy) void (^selectionBlock)(TGMediaAsset *asset, UIImage *); @@ -81,7 +82,7 @@ typedef enum - (NSArray *)resultSignalsWithCurrentItem:(TGMediaAsset *)currentItem descriptionGenerator:(id (^)(id, NSString *, NSArray *, NSString *))descriptionGenerator; - (void)completeWithAvatarImage:(UIImage *)image; -- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem; +- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem silentPosting:(bool)silentPosting; - (void)dismiss; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m index 5508323224..89a4ed425f 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m @@ -121,6 +121,7 @@ pickerController.recipientName = recipientName; pickerController.hasTimer = strongController.hasTimer; pickerController.onlyCrop = strongController.onlyCrop; + pickerController.hasSilentPosting = strongController.hasSilentPosting; [strongController pushViewController:pickerController animated:true]; }; [groupsController loadViewIfNeeded]; @@ -200,6 +201,12 @@ self.pickerController.hasTimer = hasTimer; } +- (void)setHasSilentPosting:(bool)hasSilentPosting +{ + _hasSilentPosting = hasSilentPosting; + self.pickerController.hasSilentPosting = hasSilentPosting; +} + - (void)setOnlyCrop:(bool)onlyCrop { _onlyCrop = onlyCrop; @@ -444,7 +451,7 @@ { __strong TGMediaAssetsController *strongSelf = weakSelf; if (strongSelf != nil) - [strongSelf completeWithCurrentItem:nil]; + [strongSelf completeWithCurrentItem:nil silentPosting:false]; }; } @@ -525,12 +532,12 @@ self.avatarCompletionBlock(image); } -- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem +- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem silentPosting:(bool)silentPosting { if (self.completionBlock != nil) { NSArray *signals = [self resultSignalsWithCurrentItem:currentItem descriptionGenerator:self.descriptionGenerator]; - self.completionBlock(signals); + self.completionBlock(signals, silentPosting); } else if (self.singleCompletionBlock != nil) { diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.m index 7af2d8dd49..b200ddd264 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.m @@ -124,7 +124,7 @@ - (TGMediaPickerModernGalleryMixin *)_galleryMixinForItem:(id)item thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaption allowCaptionEntities:(bool)allowCaptionEntities asFile:(bool)asFile { - return [[TGMediaPickerModernGalleryMixin alloc] initWithContext:_context item:item momentList:_momentList parentController:self thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaption allowCaptionEntities:allowCaptionEntities hasTimer:false onlyCrop:false inhibitDocumentCaptions:false inhibitMute:false asFile:asFile itemsLimit:0]; + return [[TGMediaPickerModernGalleryMixin alloc] initWithContext:_context item:item momentList:_momentList parentController:self thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaption allowCaptionEntities:allowCaptionEntities hasTimer:false onlyCrop:false inhibitDocumentCaptions:false inhibitMute:false asFile:asFile itemsLimit:0 hasSilentPosting:false]; } - (id)_itemAtIndexPath:(NSIndexPath *)indexPath diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m index 5008c90b45..77b0799cb5 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m @@ -309,19 +309,19 @@ strongSelf->_galleryMixin = nil; }; - mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item) + mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, bool silentPosting) { __strong TGMediaAssetsPickerController *strongSelf = weakSelf; if (strongSelf == nil) return; - [(TGMediaAssetsController *)strongSelf.navigationController completeWithCurrentItem:item.asset]; + [(TGMediaAssetsController *)strongSelf.navigationController completeWithCurrentItem:item.asset silentPosting:silentPosting]; }; } - (TGMediaPickerModernGalleryMixin *)_galleryMixinForContext:(id)context item:(id)item thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities inhibitDocumentCaptions:(bool)inhibitDocumentCaptions asFile:(bool)asFile { - return [[TGMediaPickerModernGalleryMixin alloc] initWithContext:context item:item fetchResult:_fetchResult parentController:self thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:asFile itemsLimit:0 recipientName:self.recipientName]; + return [[TGMediaPickerModernGalleryMixin alloc] initWithContext:context item:item fetchResult:_fetchResult parentController:self thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:asFile itemsLimit:0 recipientName:self.recipientName hasSilentPosting:self.hasSilentPosting]; } - (TGMediaPickerModernGalleryMixin *)galleryMixinForIndexPath:(NSIndexPath *)indexPath previewMode:(bool)previewMode outAsset:(TGMediaAsset **)outAsset diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h index ae94634486..98a355ba8e 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h @@ -27,6 +27,7 @@ @property (nonatomic, assign) bool onlyCrop; @property (nonatomic, assign) bool inhibitMute; @property (nonatomic, strong) NSString *recipientName; +@property (nonatomic, assign) bool hasSilentPosting; @property (nonatomic, strong) TGMediaAssetsPallete *pallete; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryInterfaceView.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryInterfaceView.h index b5ddb60a80..062b5e8e0e 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryInterfaceView.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryInterfaceView.h @@ -14,6 +14,7 @@ @property (nonatomic, copy) void (^captionSet)(id, NSString *, NSArray *); @property (nonatomic, copy) void (^donePressed)(id); +@property (nonatomic, copy) void (^doneLongPressed)(id); @property (nonatomic, copy) void (^photoStripItemSelected)(NSInteger index); @@ -32,6 +33,7 @@ @property (nonatomic, assign) bool capturing; @property (nonatomic, readonly) TGPhotoEditorTab currentTabs; +@property (nonatomic, readonly) CGRect doneButtonFrame; @property (nonatomic, readonly) UIView *timerButton; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryInterfaceView.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryInterfaceView.m index 6f4c8370c4..d3d5f3a38b 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryInterfaceView.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryInterfaceView.m @@ -137,9 +137,19 @@ if (strongSelf == nil) return; - [strongSelf.window endEditing:true]; + [strongSelf.window endEditing:true]; strongSelf->_donePressed(strongSelf->_currentItem); }; + void(^toolbarDoneLongPressed)(id) = ^(id sender) + { + __strong TGMediaPickerGalleryInterfaceView *strongSelf = weakSelf; + if (strongSelf == nil) + return; + + [strongSelf.window endEditing:true]; + if (strongSelf->_doneLongPressed != nil) + strongSelf->_doneLongPressed(strongSelf->_currentItem); + }; _muteButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 39.0f, 39.0f)]; _muteButton.hidden = true; @@ -342,11 +352,13 @@ _portraitToolbarView = [[TGPhotoToolbarView alloc] initWithBackButton:TGPhotoEditorBackButtonBack doneButton:TGPhotoEditorDoneButtonSend solidBackground:false]; _portraitToolbarView.cancelPressed = toolbarCancelPressed; _portraitToolbarView.donePressed = toolbarDonePressed; + _portraitToolbarView.doneLongPressed = toolbarDoneLongPressed; [_wrapperView addSubview:_portraitToolbarView]; _landscapeToolbarView = [[TGPhotoToolbarView alloc] initWithBackButton:TGPhotoEditorBackButtonBack doneButton:TGPhotoEditorDoneButtonSend solidBackground:false]; _landscapeToolbarView.cancelPressed = toolbarCancelPressed; _landscapeToolbarView.donePressed = toolbarDonePressed; + _landscapeToolbarView.doneLongPressed = toolbarDoneLongPressed; [_wrapperView addSubview:_landscapeToolbarView]; } return self; @@ -1736,4 +1748,12 @@ itemFooterView.frame = itemFooterViewFrame; } +- (CGRect)doneButtonFrame { + if (UIDeviceOrientationIsPortrait([self interfaceOrientation])) { + return [_portraitToolbarView.doneButton convertRect:_portraitToolbarView.doneButton.bounds toView:nil]; + } else { + return [_landscapeToolbarView.doneButton convertRect:_landscapeToolbarView.doneButton.bounds toView:nil]; + } +} + @end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryModel.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryModel.h index 1745e92754..0d590719df 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryModel.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryModel.h @@ -46,6 +46,4 @@ - (instancetype)initWithContext:(id)context items:(NSArray *)items focusItem:(id)focusItem selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions hasSelectionPanel:(bool)hasSelectionPanel hasCamera:(bool)hasCamera recipientName:(NSString *)recipientName; -//- (void)setCurrentItem:(id)item direction:(TGModernGalleryScrollAnimationDirection)direction; - @end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h index 8fdcba0740..7a2dfbdf6d 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h @@ -22,14 +22,14 @@ @property (nonatomic, copy) void (^didTransitionOut)(); @property (nonatomic, copy) UIView *(^referenceViewForItem)(TGMediaPickerGalleryItem *); -@property (nonatomic, copy) void (^completeWithItem)(TGMediaPickerGalleryItem *item); +@property (nonatomic, copy) void (^completeWithItem)(TGMediaPickerGalleryItem *item, bool silentPosting); @property (nonatomic, copy) void (^editorOpened)(void); @property (nonatomic, copy) void (^editorClosed)(void); -- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName; +- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting; -- (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit; +- (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit hasSilentPosting:(bool)hasSilentPosting; - (void)present; - (void)updateWithFetchResult:(TGMediaAssetFetchResult *)fetchResult; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m index 6787388a05..c14a6c4602 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m @@ -9,6 +9,8 @@ #import "TGMediaPickerGalleryVideoItemView.h" #import "TGMediaPickerGalleryGifItem.h" +#import "TGMediaPickerSendActionSheetController.h" + #import #import #import @@ -37,17 +39,17 @@ @implementation TGMediaPickerModernGalleryMixin -- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName +- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting { - return [self initWithContext:context item:item fetchResult:fetchResult momentList:nil parentController:parentController thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:hasTimer onlyCrop:onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:inhibitMute asFile:asFile itemsLimit:itemsLimit recipientName:recipientName]; + return [self initWithContext:context item:item fetchResult:fetchResult momentList:nil parentController:parentController thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:hasTimer onlyCrop:onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:inhibitMute asFile:asFile itemsLimit:itemsLimit recipientName:recipientName hasSilentPosting: hasSilentPosting]; } -- (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit +- (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit hasSilentPosting:(bool)hasSilentPosting { - return [self initWithContext:context item:item fetchResult:nil momentList:momentList parentController:parentController thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:hasTimer onlyCrop:onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:inhibitMute asFile:asFile itemsLimit:itemsLimit recipientName:nil]; + return [self initWithContext:context item:item fetchResult:nil momentList:momentList parentController:parentController thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:hasTimer onlyCrop:onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:inhibitMute asFile:asFile itemsLimit:itemsLimit recipientName:nil hasSilentPosting: hasSilentPosting]; } -- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName +- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting { self = [super init]; if (self != nil) @@ -134,7 +136,41 @@ strongSelf->_galleryModel.dismiss(true, false); if (strongSelf.completeWithItem != nil) - strongSelf.completeWithItem(item); + strongSelf.completeWithItem(item, false); + }; + + model.interfaceView.doneLongPressed = ^(TGMediaPickerGalleryItem *item) { + __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; + if (strongSelf == nil || !hasSilentPosting) + return; + + UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium]; + [generator impactOccurred]; + + TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame]; + controller.send = ^{ + __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; + if (strongSelf == nil) + return; + + strongSelf->_galleryModel.dismiss(true, false); + + if (strongSelf.completeWithItem != nil) + strongSelf.completeWithItem(item, false); + }; + controller.sendSilently = ^{ + __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; + if (strongSelf == nil) + return; + + strongSelf->_galleryModel.dismiss(true, false); + + if (strongSelf.completeWithItem != nil) + strongSelf.completeWithItem(item, true); + }; + + TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:[strongSelf->_context makeOverlayWindowManager] parentController:strongSelf->_parentController contentController:controller]; + controllerWindow.hidden = false; }; modernGallery.model = model; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h new file mode 100644 index 0000000000..201947a0ba --- /dev/null +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h @@ -0,0 +1,14 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TGMediaPickerSendActionSheetController : TGOverlayController + +@property (nonatomic, copy) void (^send)(void); +@property (nonatomic, copy) void (^sendSilently)(void); + +- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame; + +@end + +NS_ASSUME_NONNULL_END diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m new file mode 100644 index 0000000000..f4f21cb014 --- /dev/null +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m @@ -0,0 +1,202 @@ +#import "TGMediaPickerSendActionSheetController.h" +#import "LegacyComponentsInternal.h" + +#import "TGFont.h" +#import "TGImageUtils.h" +#import "TGModernButton.h" +#import "TGMediaAssetsController.h" + +@interface TGMediaPickerSendActionSheetController () +{ + id _context; + + CGRect _sendButtonFrame; + bool _autorotationWasEnabled; + + UIVisualEffectView *_effectView; + TGModernButton *_sendButton; + + UIView *_containerView; + TGModernButton *_buttonView; + UILabel *_buttonLabel; + UIImageView *_buttonIcon; +} +@end + +@implementation TGMediaPickerSendActionSheetController + +- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame { + self = [super initWithContext:context]; + if (self != nil) { + _context = context; + _sendButtonFrame = sendButtonFrame; + } + return self; +} + +- (void)loadView { + [super loadView]; + + _effectView = [[UIVisualEffectView alloc] initWithEffect:nil]; + if (iosMajorVersion() >= 9) { + _effectView.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; + } + [self.view addSubview:_effectView]; + + _containerView = [[UIView alloc] init]; + _containerView.backgroundColor = UIColorRGB(0x1f1f1f); + _containerView.clipsToBounds = true; + _containerView.layer.cornerRadius = 12.0; + [self.view addSubview:_containerView]; + + __weak TGMediaPickerSendActionSheetController *weakSelf = self; + _buttonView = [[TGModernButton alloc] init]; + _buttonView.adjustsImageWhenHighlighted = false; + _buttonView.highlitedChanged = ^(bool highlighted) { + __strong TGMediaPickerSendActionSheetController *strongSelf = weakSelf; + if (strongSelf != nil) { + if (highlighted) { + strongSelf->_buttonView.backgroundColor = UIColorRGB(0x363636); + } else { + strongSelf->_buttonView.backgroundColor = [UIColor clearColor]; + } + } + }; + [_buttonView addTarget:self action:@selector(sendSilentlyPressed) forControlEvents:UIControlEventTouchUpInside]; + [_containerView addSubview:_buttonView]; + + _buttonLabel = [[UILabel alloc] init]; + _buttonLabel.font = TGSystemFontOfSize(17.0f); + _buttonLabel.text = TGLocalized(@"Conversation.SendMessage.SendSilently"); + _buttonLabel.textColor = [UIColor whiteColor]; + [_buttonLabel sizeToFit]; + _buttonLabel.userInteractionEnabled = false; + [_containerView addSubview:_buttonLabel]; + + _buttonIcon = [[UIImageView alloc] init]; + _buttonIcon.image = TGTintedImage(TGComponentsImageNamed(@"MediaMute"), [UIColor whiteColor]); + [_buttonIcon sizeToFit]; + [_containerView addSubview:_buttonIcon]; + + TGMediaAssetsPallete *pallete = nil; + if ([[LegacyComponentsGlobals provider] respondsToSelector:@selector(mediaAssetsPallete)]) + pallete = [[LegacyComponentsGlobals provider] mediaAssetsPallete]; + + UIImage *doneImage = pallete != nil ? pallete.sendIconImage : TGComponentsImageNamed(@"PhotoPickerSendIcon"); + + _sendButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 33.0, 33.0)]; + _sendButton.adjustsImageWhenDisabled = false; + _sendButton.adjustsImageWhenHighlighted = false; + [_sendButton setImage:doneImage forState:UIControlStateNormal]; + [_sendButton addTarget:self action:@selector(sendPressed) forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:_sendButton]; +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + _autorotationWasEnabled = [TGViewController autorotationAllowed]; + [TGViewController disableAutorotation]; + + [self animateIn]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] init]; + [tapRecognizer addTarget:self action:@selector(dimTapGesture)]; + [_effectView addGestureRecognizer:tapRecognizer]; +} + +- (void)dimTapGesture { + [self animateOut:true]; +} + +- (BOOL)prefersStatusBarHidden { + return true; +} + +- (bool)statusBarShouldBeHidden { + return true; +} + +- (void)animateIn { + if (_effectView.effect != nil) { + _effectView.alpha = 0.0f; + } + [UIView animateWithDuration:0.3 animations:^{ + if (_effectView.effect == nil) { + _effectView.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; + } else { + _effectView.alpha = 1.0f; + } + }]; + + CGPoint targetPosition = _containerView.center; + _containerView.center = CGPointMake(targetPosition.x + 160.0, targetPosition.y + 44.0); + [UIView animateWithDuration:0.3 delay:0.0 options:7 << 16 animations:^{ + _containerView.center = targetPosition; + } completion:nil]; + + _containerView.alpha = 0.0f; + [UIView animateWithDuration:0.3 animations:^{ + _containerView.alpha = 1.0f; + }]; +} + +- (void)animateOut:(bool)cancel { + [UIView animateWithDuration:0.3 animations:^{ + if (iosMajorVersion() >= 9) { + _effectView.effect = nil; + } else { + _effectView.alpha = 0.0f; + } + + _containerView.alpha = 0.0f; + } completion:^(BOOL finished) { + if (!cancel) { + [self dismiss]; + } + }]; + + if (cancel) { + [UIView animateWithDuration:0.3 delay:0.0 options:7 << 16 animations:^{ + _containerView.center = CGPointMake(_containerView.center.x + 160.0, _containerView.center.y + 44.0); + } completion:^(BOOL finished) { + [self dismiss]; + }]; + } + + if (_autorotationWasEnabled) { + [TGViewController enableAutorotation]; + } +} + +- (void)viewDidLayoutSubviews { + _effectView.frame = self.view.bounds; + _sendButton.frame = _sendButtonFrame; + + _buttonLabel.frame = CGRectMake(16.0, 11.0, _buttonLabel.frame.size.width, _buttonLabel.frame.size.height); + CGFloat containerWidth = MAX(240.0, _buttonLabel.frame.size.width + 84.0); + _containerView.frame = CGRectMake(CGRectGetMaxX(_sendButtonFrame) - containerWidth - 8.0, _sendButtonFrame.origin.y - 44.0 - 4.0, containerWidth, 44.0); + _buttonView.frame = _containerView.bounds; + _buttonIcon.frame = CGRectMake(_containerView.frame.size.width - _buttonIcon.frame.size.width - 12.0, 9.0, _buttonIcon.frame.size.width, _buttonIcon.frame.size.height); +} + +- (void)sendPressed { + [self animateOut:false]; + + if (self.send != nil) + self.send(); +} + +- (void)sendSilentlyPressed { + [self animateOut:false]; + + if (self.sendSilently != nil) + self.sendSilently(); +} + +@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m b/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m index c92d841aa9..de20055193 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m +++ b/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m @@ -67,7 +67,7 @@ [TGPassportAttachMenu _displayCameraWithView:cameraView menuController:strongController parentController:strongParentController context:context intent:intent uploadAction:uploadAction]; }; - carouselItem.sendPressed = ^(TGMediaAsset *currentItem, __unused bool asFiles) + carouselItem.sendPressed = ^(TGMediaAsset *currentItem, __unused bool asFiles, __unused bool silentPosting) { __strong TGMenuSheetController *strongController = weakController; if (strongController == nil) diff --git a/submodules/LegacyComponents/LegacyComponents/TGPhotoToolbarView.m b/submodules/LegacyComponents/LegacyComponents/TGPhotoToolbarView.m index 7aaae5330b..2d15f274b7 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGPhotoToolbarView.m +++ b/submodules/LegacyComponents/LegacyComponents/TGPhotoToolbarView.m @@ -75,7 +75,6 @@ pallete = [[LegacyComponentsGlobals provider] mediaAssetsPallete]; doneImage = pallete != nil ? pallete.sendIconImage : TGComponentsImageNamed(@"PhotoPickerSendIcon"); - //buttonSize = CGSizeMake(52.0f, 52.0f); } break; } @@ -89,7 +88,7 @@ [_backgroundView addSubview:_doneButton]; _longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(doneButtonLongPressed:)]; - _longPressGestureRecognizer.minimumPressDuration = 0.65; + _longPressGestureRecognizer.minimumPressDuration = 0.4; [_doneButton addGestureRecognizer:_longPressGestureRecognizer]; } return self; diff --git a/submodules/LegacyComponents/LegacyComponents_Xcode.xcodeproj/project.pbxproj b/submodules/LegacyComponents/LegacyComponents_Xcode.xcodeproj/project.pbxproj index c60bbb6675..28f52bcca5 100644 --- a/submodules/LegacyComponents/LegacyComponents_Xcode.xcodeproj/project.pbxproj +++ b/submodules/LegacyComponents/LegacyComponents_Xcode.xcodeproj/project.pbxproj @@ -21,6 +21,8 @@ 0916FEA820A1EA7B0084A755 /* TGPassportScanView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0916FEA620A1EA7B0084A755 /* TGPassportScanView.m */; }; 0916FEAB20A1EBFA0084A755 /* TGPassportMRZ.m in Sources */ = {isa = PBXBuildFile; fileRef = 0916FEA920A1EBF90084A755 /* TGPassportMRZ.m */; }; 0916FEAC20A1EBFA0084A755 /* TGPassportMRZ.h in Headers */ = {isa = PBXBuildFile; fileRef = 0916FEAA20A1EBFA0084A755 /* TGPassportMRZ.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 092A65C922EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.h in Headers */ = {isa = PBXBuildFile; fileRef = 092A65C722EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.h */; }; + 092A65CA22EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.m in Sources */ = {isa = PBXBuildFile; fileRef = 092A65C822EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.m */; }; 09750F761F2FA816001B9886 /* SSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09750F741F2FA5E8001B9886 /* SSignalKit.framework */; }; 09750FB71F30DB0E001B9886 /* TGClipboardGalleryModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 09750FAF1F30DB0E001B9886 /* TGClipboardGalleryModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; 09750FB81F30DB0E001B9886 /* TGClipboardGalleryModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 09750FB01F30DB0E001B9886 /* TGClipboardGalleryModel.m */; }; @@ -1190,6 +1192,8 @@ 0916FEA620A1EA7B0084A755 /* TGPassportScanView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TGPassportScanView.m; sourceTree = ""; }; 0916FEA920A1EBF90084A755 /* TGPassportMRZ.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGPassportMRZ.m; sourceTree = ""; }; 0916FEAA20A1EBFA0084A755 /* TGPassportMRZ.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGPassportMRZ.h; sourceTree = ""; }; + 092A65C722EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TGMediaPickerSendActionSheetController.h; sourceTree = ""; }; + 092A65C822EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TGMediaPickerSendActionSheetController.m; sourceTree = ""; }; 09750F741F2FA5E8001B9886 /* SSignalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SSignalKit.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegraph-grvwvmixbmcefwboxkzfazvpcrxb/Build/Products/Release Hockeyapp-iphonesimulator/SSignalKit.framework"; sourceTree = ""; }; 09750FAF1F30DB0E001B9886 /* TGClipboardGalleryModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGClipboardGalleryModel.h; sourceTree = ""; }; 09750FB01F30DB0E001B9886 /* TGClipboardGalleryModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGClipboardGalleryModel.m; sourceTree = ""; }; @@ -3525,6 +3529,8 @@ D07BCA4A1F2A9DAB00ED97AA /* TGModernAnimatedImagePlayer.m */, D07BCA4D1F2A9DDD00ED97AA /* FLAnimatedImage.h */, D07BCA4E1F2A9DDD00ED97AA /* FLAnimatedImage.m */, + 092A65C722EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.h */, + 092A65C822EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.m */, ); name = "Media Picker"; sourceTree = ""; @@ -4412,6 +4418,7 @@ D07BCB641F2B6A5600ED97AA /* TGEmbedPlayerScrubber.h in Headers */, D07BCAF31F2B509200ED97AA /* TGAttachmentAssetCell.h in Headers */, D07BC8951F2A375800ED97AA /* TGPhotoCropControl.h in Headers */, + 092A65C922EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.h in Headers */, D07BC73B1F2A2A7D00ED97AA /* PGPhotoEditorRawDataOutput.h in Headers */, D01778B61F1FFFE30044446D /* TGToolbarButton.h in Headers */, D07BCBB71F2B6F6300ED97AA /* CBCoubNew.h in Headers */, @@ -5063,6 +5070,7 @@ D01778161F1F961D0044446D /* TGMessageEntityCode.m in Sources */, D07BC7281F2A2A5300ED97AA /* UICollectionView+Utils.m in Sources */, D07BCB671F2B6A5600ED97AA /* TGEmbedPlayerState.m in Sources */, + 092A65CA22EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.m in Sources */, D07BCA911F2B443700ED97AA /* TGMediaAssetsMomentsController.m in Sources */, D07BCBC41F2B6F6300ED97AA /* CBJSONCoubMapper.m in Sources */, D07BC7871F2A2B3700ED97AA /* TGPhotoEditorTabController.m in Sources */, diff --git a/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift index 5d6bd9bf39..b12b445457 100644 --- a/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift @@ -622,6 +622,12 @@ final class FFMpegMediaFrameSourceContext: NSObject { } if let closestFrame = closestFrame { actualPts = closestFrame.pts + } else { + if let videoStream = initializedState.videoStream { + actualPts = videoStream.duration + } else { + actualPts = extraVideoFrames.last!.pts + } } } if let audioStream = initializedState.audioStream { diff --git a/submodules/MediaPlayer/Sources/MediaPlayer.swift b/submodules/MediaPlayer/Sources/MediaPlayer.swift index 7aaf423231..1c4075e03e 100644 --- a/submodules/MediaPlayer/Sources/MediaPlayer.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayer.swift @@ -784,7 +784,7 @@ private final class MediaPlayerContext { } } else if let worstStatus = worstStatus, case let .finished(finishedAt) = worstStatus, finishedAt.isFinite { let nextTickDelay = max(0.0, finishedAt - timestamp) / self.baseRate - if nextTickDelay.isLessThanOrEqualTo(0.0) || timestamp.isEqual(to: 0.0) { + if nextTickDelay.isLessThanOrEqualTo(0.0) { rate = 0.0 performActionAtEndNow = true } else { diff --git a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift index 2d098b723d..e688160779 100644 --- a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift +++ b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift @@ -120,7 +120,7 @@ private final class UniversalSoftwareVideoSourceImpl { self.cancelRead = cancelInitialization - let ioBufferSize = 64 * 1024 + let ioBufferSize = 1 * 1024 guard let avIoContext = FFMpegAVIOContext(bufferSize: Int32(ioBufferSize), opaqueContext: Unmanaged.passUnretained(self).toOpaque(), readPacket: readPacketCallback, seek: seekCallback) else { return nil diff --git a/submodules/MtProtoKit/MTProtoKit/MTTcpConnection.m b/submodules/MtProtoKit/MTProtoKit/MTTcpConnection.m index 21213ec43b..d5a71afcfe 100644 --- a/submodules/MtProtoKit/MTProtoKit/MTTcpConnection.m +++ b/submodules/MtProtoKit/MTProtoKit/MTTcpConnection.m @@ -655,74 +655,99 @@ struct ctr_state { if (!_addedControlHeader) { _addedControlHeader = true; - uint8_t controlBytes[64]; - arc4random_buf(controlBytes, 64); - - int32_t controlVersion; - if (_useIntermediateFormat) { - controlVersion = 0xdddddddd; - } else { - controlVersion = 0xefefefef; - } - - memcpy(controlBytes + 56, &controlVersion, 4); - int16_t datacenterTag = (int16_t)_datacenterTag; - memcpy(controlBytes + 60, &datacenterTag, 2); - - uint8_t controlBytesReversed[64]; - for (int i = 0; i < 64; i++) { - controlBytesReversed[i] = controlBytes[64 - 1 - i]; - } - - NSData *aesKey = [[NSData alloc] initWithBytes:controlBytes + 8 length:32]; - NSData *aesIv = [[NSData alloc] initWithBytes:controlBytes + 8 + 32 length:16]; - - NSData *incomingAesKey = [[NSData alloc] initWithBytes:controlBytesReversed + 8 length:32]; - NSData *incomingAesIv = [[NSData alloc] initWithBytes:controlBytesReversed + 8 + 32 length:16]; - - NSData *effectiveSecret = nil; - if (_mtpSecret != nil) { - effectiveSecret = _mtpSecret.secret; - } - if (effectiveSecret.length != 16 && effectiveSecret.length != 17) { - effectiveSecret = nil; - } - - if (effectiveSecret) { - NSMutableData *aesKeyData = [[NSMutableData alloc] init]; - [aesKeyData appendData:aesKey]; - if (effectiveSecret.length == 16) { - [aesKeyData appendData:effectiveSecret]; - } else if (effectiveSecret.length == 17) { - [aesKeyData appendData:[effectiveSecret subdataWithRange:NSMakeRange(1, effectiveSecret.length - 1)]]; - } - NSData *aesKeyHash = MTSha256(aesKeyData); - aesKey = [aesKeyHash subdataWithRange:NSMakeRange(0, 32)]; + for (int retryCount = 0; retryCount < 10; retryCount++) { + uint8_t controlBytes[64]; + arc4random_buf(controlBytes, 64); - NSMutableData *incomingAesKeyData = [[NSMutableData alloc] init]; - [incomingAesKeyData appendData:incomingAesKey]; - if (effectiveSecret.length == 16) { - [incomingAesKeyData appendData:effectiveSecret]; - } else if (effectiveSecret.length == 17) { - [incomingAesKeyData appendData:[effectiveSecret subdataWithRange:NSMakeRange(1, effectiveSecret.length - 1)]]; + int32_t controlVersion; + if (_useIntermediateFormat) { + controlVersion = 0xdddddddd; + } else { + controlVersion = 0xefefefef; } - NSData *incomingAesKeyHash = MTSha256(incomingAesKeyData); - incomingAesKey = [incomingAesKeyHash subdataWithRange:NSMakeRange(0, 32)]; + + memcpy(controlBytes + 56, &controlVersion, 4); + int16_t datacenterTag = (int16_t)_datacenterTag; + memcpy(controlBytes + 60, &datacenterTag, 2); + + uint8_t controlBytesReversed[64]; + for (int i = 0; i < 64; i++) { + controlBytesReversed[i] = controlBytes[64 - 1 - i]; + } + + NSData *aesKey = [[NSData alloc] initWithBytes:controlBytes + 8 length:32]; + NSData *aesIv = [[NSData alloc] initWithBytes:controlBytes + 8 + 32 length:16]; + + NSData *incomingAesKey = [[NSData alloc] initWithBytes:controlBytesReversed + 8 length:32]; + NSData *incomingAesIv = [[NSData alloc] initWithBytes:controlBytesReversed + 8 + 32 length:16]; + + NSData *effectiveSecret = nil; + if (_mtpSecret != nil) { + effectiveSecret = _mtpSecret.secret; + } + if (effectiveSecret.length != 16 && effectiveSecret.length != 17) { + effectiveSecret = nil; + } + + if (effectiveSecret) { + NSMutableData *aesKeyData = [[NSMutableData alloc] init]; + [aesKeyData appendData:aesKey]; + if (effectiveSecret.length == 16) { + [aesKeyData appendData:effectiveSecret]; + } else if (effectiveSecret.length == 17) { + [aesKeyData appendData:[effectiveSecret subdataWithRange:NSMakeRange(1, effectiveSecret.length - 1)]]; + } + NSData *aesKeyHash = MTSha256(aesKeyData); + aesKey = [aesKeyHash subdataWithRange:NSMakeRange(0, 32)]; + + NSMutableData *incomingAesKeyData = [[NSMutableData alloc] init]; + [incomingAesKeyData appendData:incomingAesKey]; + if (effectiveSecret.length == 16) { + [incomingAesKeyData appendData:effectiveSecret]; + } else if (effectiveSecret.length == 17) { + [incomingAesKeyData appendData:[effectiveSecret subdataWithRange:NSMakeRange(1, effectiveSecret.length - 1)]]; + } + NSData *incomingAesKeyHash = MTSha256(incomingAesKeyData); + incomingAesKey = [incomingAesKeyHash subdataWithRange:NSMakeRange(0, 32)]; + } + + MTAesCtr *outgoingAesCtr = [[MTAesCtr alloc] initWithKey:aesKey.bytes keyLength:32 iv:aesIv.bytes decrypt:false]; + MTAesCtr *incomingAesCtr = [[MTAesCtr alloc] initWithKey:incomingAesKey.bytes keyLength:32 iv:incomingAesIv.bytes decrypt:false]; + + uint8_t encryptedControlBytes[64]; + [outgoingAesCtr encryptIn:controlBytes out:encryptedControlBytes len:64]; + + uint32_t intHeader = 0; + memcpy(&intHeader, encryptedControlBytes, 4); + + if (effectiveSecret) { + if (retryCount == 9) { + assert(false); + } else { + if (intHeader == 0x44414548 || + intHeader == 0x54534f50 || + intHeader == 0x20544547 || + intHeader == 0x4954504f || + intHeader == 0xdddddddd || + intHeader == 0xeeeeeeee || + intHeader == 0x02010316) { + continue; + } + } + } + + NSMutableData *outData = [[NSMutableData alloc] initWithLength:64 + packetData.length]; + memcpy(outData.mutableBytes, controlBytes, 56); + memcpy(outData.mutableBytes + 56, encryptedControlBytes + 56, 8); + + [outgoingAesCtr encryptIn:packetData.bytes out:outData.mutableBytes + 64 len:packetData.length]; + + _incomingAesCtr = incomingAesCtr; + _outgoingAesCtr = outgoingAesCtr; + [completeData appendData:outData]; + + break; } - - _outgoingAesCtr = [[MTAesCtr alloc] initWithKey:aesKey.bytes keyLength:32 iv:aesIv.bytes decrypt:false]; - _incomingAesCtr = [[MTAesCtr alloc] initWithKey:incomingAesKey.bytes keyLength:32 iv:incomingAesIv.bytes decrypt:false]; - - uint8_t encryptedControlBytes[64]; - [_outgoingAesCtr encryptIn:controlBytes out:encryptedControlBytes len:64]; - - NSMutableData *outData = [[NSMutableData alloc] initWithLength:64 + packetData.length]; - memcpy(outData.mutableBytes, controlBytes, 56); - memcpy(outData.mutableBytes + 56, encryptedControlBytes + 56, 8); - - [_outgoingAesCtr encryptIn:packetData.bytes out:outData.mutableBytes + 64 len:packetData.length]; - - [completeData appendData:outData]; } else { NSMutableData *encryptedData = [[NSMutableData alloc] initWithLength:packetData.length]; [_outgoingAesCtr encryptIn:packetData.bytes out:encryptedData.mutableBytes len:packetData.length]; diff --git a/submodules/RLottie/Sources/LottieInstance.h b/submodules/RLottie/Sources/LottieInstance.h index 42c949e81c..5eb3fb3d41 100644 --- a/submodules/RLottie/Sources/LottieInstance.h +++ b/submodules/RLottie/Sources/LottieInstance.h @@ -2,11 +2,13 @@ #define Lottie_h #import +#import @interface LottieInstance : NSObject @property (nonatomic, readonly) int32_t frameCount; @property (nonatomic, readonly) int32_t frameRate; +@property (nonatomic, readonly) CGSize dimensions; - (instancetype _Nullable)initWithData:(NSData * _Nonnull)data cacheKey:(NSString * _Nonnull)cacheKey; - (void)renderFrameWithIndex:(int32_t)index into:(uint8_t * _Nonnull)buffer width:(int32_t)width height:(int32_t)height; diff --git a/submodules/RLottie/Sources/LottieInstance.mm b/submodules/RLottie/Sources/LottieInstance.mm index 66e3ccdcb8..0b567f0dd6 100644 --- a/submodules/RLottie/Sources/LottieInstance.mm +++ b/submodules/RLottie/Sources/LottieInstance.mm @@ -21,6 +21,16 @@ _frameCount = (int32_t)_animation->totalFrame(); _frameRate = (int32_t)_animation->frameRate(); + size_t width = 0; + size_t height = 0; + _animation->size(width, height); + + if (width > 1024 || height > 1024) { + return nil; + } + + _dimensions = CGSizeMake(width, height); + if ((_frameRate > 60) || _animation->duration() > 4.5) { return nil; } diff --git a/submodules/TelegramCore/TelegramCore/Account.swift b/submodules/TelegramCore/TelegramCore/Account.swift index 65ee39605e..6b0ca3fc4a 100644 --- a/submodules/TelegramCore/TelegramCore/Account.swift +++ b/submodules/TelegramCore/TelegramCore/Account.swift @@ -1183,7 +1183,7 @@ public class Account { self.networkTypeValue.set(currentNetworkType()) - let serviceTasksMasterBecomeMaster = shouldBeServiceTaskMaster.get() + let serviceTasksMasterBecomeMaster = self.shouldBeServiceTaskMaster.get() |> distinctUntilChanged |> deliverOn(self.serviceQueue) @@ -1193,7 +1193,7 @@ public class Account { } })) - let shouldBeMaster = combineLatest(shouldBeServiceTaskMaster.get(), postbox.isMasterClient()) + let shouldBeMaster = combineLatest(self.shouldBeServiceTaskMaster.get(), postbox.isMasterClient()) |> map { [weak self] shouldBeMaster, isMaster -> Bool in if shouldBeMaster == .always && !isMaster { self?.postbox.becomeMasterClient() diff --git a/submodules/TelegramCore/TelegramCore/AddPeerMember.swift b/submodules/TelegramCore/TelegramCore/AddPeerMember.swift index 446c878aee..738d055187 100644 --- a/submodules/TelegramCore/TelegramCore/AddPeerMember.swift +++ b/submodules/TelegramCore/TelegramCore/AddPeerMember.swift @@ -100,7 +100,7 @@ public func addChannelMember(account: Account, peerId: PeerId, memberId: PeerId) |> map { [$0] } |> `catch` { error -> Signal<[Api.Updates], AddChannelMemberError> in switch error.errorDescription { - case "CHANNELS_TOO_MUCH": + case "USER_CHANNELS_TOO_MUCH": return .fail(.tooMuchJoined) case "USERS_TOO_MUCH": return .fail(.limitExceeded) @@ -195,7 +195,6 @@ public func addChannelMembers(account: Account, peerId: PeerId, memberIds: [Peer } if let peer = transaction.getPeer(peerId), let channel = peer as? TelegramChannel, let inputChannel = apiInputChannel(channel) { - let signal = account.network.request(Api.functions.channels.inviteToChannel(channel: inputChannel, users: inputUsers)) |> mapError { error -> AddChannelMemberError in switch error.errorDescription { diff --git a/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift b/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift index f64425309b..81f675bd6c 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift @@ -172,7 +172,6 @@ public func channelAdminLogEvents(postbox: Postbox, network: Network, peerId: Pe action = .updatePinned(rendered) } } - case let .channelAdminLogEventActionEditMessage(prev, new): if let prev = StoreMessage(apiMessage: prev), let prevRendered = locallyRenderedMessage(message: prev, peers: peers), let new = StoreMessage(apiMessage: new), let newRendered = locallyRenderedMessage(message: new, peers: peers) { action = .editMessage(prev: prevRendered, new: newRendered) diff --git a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift index 45ede2460d..7eed40126e 100644 --- a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift +++ b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift @@ -16,7 +16,7 @@ public enum EnqueueMessageGrouping { public enum EnqueueMessage { case message(text: String, attributes: [MessageAttribute], mediaReference: AnyMediaReference?, replyToMessageId: MessageId?, localGroupingKey: Int64?) - case forward(source: MessageId, grouping: EnqueueMessageGrouping) + case forward(source: MessageId, grouping: EnqueueMessageGrouping, attributes: [MessageAttribute]) public func withUpdatedReplyToMessageId(_ replyToMessageId: MessageId?) -> EnqueueMessage { switch self { @@ -31,8 +31,8 @@ public enum EnqueueMessage { switch self { case let .message(text, attributes, mediaReference, replyToMessageId, localGroupingKey): return .message(text: text, attributes: f(attributes), mediaReference: mediaReference, replyToMessageId: replyToMessageId, localGroupingKey: localGroupingKey) - case .forward: - return self + case let .forward(source, grouping, attributes): + return .forward(source: source, grouping: grouping, attributes: f(attributes)) } } } @@ -97,6 +97,8 @@ private func filterMessageAttributesForForwardedMessage(_ attributes: [MessageAt return true case _ as InlineBotMessageAttribute: return true + case _ as NotificationInfoMessageAttribute: + return true default: return false } @@ -246,10 +248,10 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, } } if canBeForwarded { - updatedMessages.append((true, .forward(source: replyToMessageId, grouping: .none))) + updatedMessages.append((true, .forward(source: replyToMessageId, grouping: .none, attributes: []))) } } - case let .forward(sourceId, _): + case let .forward(sourceId, _, _): if let sourceMessage = forwardedMessageToBeReuploaded(transaction: transaction, id: sourceId) { var mediaReference: AnyMediaReference? if sourceMessage.id.peerId.namespace == Namespaces.Peer.SecretChat { @@ -383,7 +385,7 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, } storeMessages.append(StoreMessage(peerId: peerId, namespace: Namespaces.Message.Local, globallyUniqueId: randomId, groupingKey: localGroupingKey, timestamp: timestamp, flags: flags, tags: tags, globalTags: globalTags, localTags: localTags, forwardInfo: nil, authorId: authorId, text: text, attributes: attributes, media: mediaList)) - case let .forward(source, grouping): + case let .forward(source, grouping, requestedAttributes): let sourceMessage = transaction.getMessage(source) if let sourceMessage = sourceMessage, let author = sourceMessage.author ?? sourceMessage.peers[sourceMessage.id.peerId] { if let peer = peer as? TelegramSecretChat { @@ -407,6 +409,7 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, attributes.append(SourceReferenceMessageAttribute(messageId: sourceMessage.id)) } + attributes.append(contentsOf: filterMessageAttributesForForwardedMessage(requestedAttributes)) attributes.append(contentsOf: filterMessageAttributesForForwardedMessage(sourceMessage.attributes)) var sourceReplyMarkup: ReplyMarkupMessageAttribute? = nil diff --git a/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift b/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift index 70dd956317..f3b3013918 100644 --- a/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift +++ b/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift @@ -18,10 +18,6 @@ import Foundation public struct PendingMessageStatus: Equatable { public let isRunning: Bool public let progress: Float - - public static func ==(lhs: PendingMessageStatus, rhs: PendingMessageStatus) -> Bool { - return lhs.isRunning == rhs.isRunning && lhs.progress.isEqual(to: rhs.progress) - } } private enum PendingMessageState { @@ -58,7 +54,8 @@ private final class PendingMessageContext { var contentType: PendingMessageUploadedContentType? = nil let activityDisposable = MetaDisposable() var status: PendingMessageStatus? - var statusSubscribers = Bag<(PendingMessageStatus?) -> Void>() + var error: PendingMessageFailureReason? + var statusSubscribers = Bag<(PendingMessageStatus?, PendingMessageFailureReason?) -> Void>() var forcedReuploadOnce: Bool = false } @@ -66,6 +63,7 @@ public enum PendingMessageFailureReason { case flood case publicBan case mediaRestricted + case slowmodeActive } private func reasonForError(_ error: String) -> PendingMessageFailureReason? { @@ -75,6 +73,8 @@ private func reasonForError(_ error: String) -> PendingMessageFailureReason? { return .publicBan } else if error.hasPrefix("CHAT_SEND_") && error.hasSuffix("_FORBIDDEN") { return .mediaRestricted + } else if error.hasPrefix("SLOWMODE_WAIT") { + return .slowmodeActive } else { return nil } @@ -202,7 +202,7 @@ public final class PendingMessageManager { if context.status != nil { context.status = nil for subscriber in context.statusSubscribers.copyItems() { - subscriber(nil) + subscriber(nil, context.error) } } @@ -261,7 +261,7 @@ public final class PendingMessageManager { } } - public func pendingMessageStatus(_ id: MessageId) -> Signal { + public func pendingMessageStatus(_ id: MessageId) -> Signal<(PendingMessageStatus?, PendingMessageFailureReason?), NoError> { return Signal { subscriber in let disposable = MetaDisposable() @@ -274,11 +274,11 @@ public final class PendingMessageManager { self.messageContexts[id] = messageContext } - let index = messageContext.statusSubscribers.add({ status in - subscriber.putNext(status) + let index = messageContext.statusSubscribers.add({ status, error in + subscriber.putNext((status, error)) }) - subscriber.putNext(messageContext.status) + subscriber.putNext((messageContext.status, messageContext.error)) disposable.set(ActionDisposable { self.queue.async { @@ -334,7 +334,7 @@ public final class PendingMessageManager { if status != messageContext.status { messageContext.status = status for subscriber in messageContext.statusSubscribers.copyItems() { - subscriber(status) + subscriber(messageContext.status, messageContext.error) } } } @@ -445,23 +445,7 @@ public final class PendingMessageManager { return .progress(1.0) } messages[0].0.sendDisposable.set((sendMessage - |> deliverOn(self.queue) - |> afterDisposed { [weak self] in - /*if let strongSelf = self { - assert(strongSelf.queue.isCurrent()) - for (_, id, _) in messages { - if let current = strongSelf.messageContexts[id] { - current.status = .none - for subscriber in current.statusSubscribers.copyItems() { - subscriber(nil) - } - if current.statusSubscribers.isEmpty { - strongSelf.messageContexts.removeValue(forKey: id) - } - } - } - }*/ - }).start()) + |> deliverOn(self.queue)).start()) } private func commitSendingSingleMessage(messageContext: PendingMessageContext, messageId: MessageId, content: PendingMessageUploadedContentAndReuploadInfo) { @@ -471,21 +455,7 @@ public final class PendingMessageManager { return .progress(1.0) } messageContext.sendDisposable.set((sendMessage - |> deliverOn(self.queue) - |> afterDisposed { [weak self] in - /*if let strongSelf = self { - assert(strongSelf.queue.isCurrent()) - if let current = strongSelf.messageContexts[messageId] { - current.status = .none - for subscriber in current.statusSubscribers.copyItems() { - subscriber(nil) - } - if current.statusSubscribers.isEmpty { - strongSelf.messageContexts.removeValue(forKey: messageId) - } - } - }*/ - }).start(next: { [weak self] next in + |> deliverOn(self.queue)).start(next: { [weak self] next in if let strongSelf = self { assert(strongSelf.queue.isCurrent()) @@ -495,7 +465,7 @@ public final class PendingMessageManager { let status = PendingMessageStatus(isRunning: true, progress: progress) current.status = status for subscriber in current.statusSubscribers.copyItems() { - subscriber(status) + subscriber(current.status, current.error) } } } @@ -513,7 +483,7 @@ public final class PendingMessageManager { let status = PendingMessageStatus(isRunning: true, progress: 0.0) messageContext.status = status for subscriber in messageContext.statusSubscribers.copyItems() { - subscriber(status) + subscriber(messageContext.status, messageContext.error) } self.addContextActivityIfNeeded(messageContext, peerId: id.peerId) @@ -548,7 +518,7 @@ public final class PendingMessageManager { let status = PendingMessageStatus(isRunning: true, progress: progress) current.status = status for subscriber in current.statusSubscribers.copyItems() { - subscriber(status) + subscriber(current.status, current.error) } } case let .content(content): @@ -582,7 +552,7 @@ public final class PendingMessageManager { let status = PendingMessageStatus(isRunning: true, progress: 0.0) context.status = status for subscriber in context.statusSubscribers.copyItems() { - subscriber(status) + subscriber(context.status, context.error) } self.addContextActivityIfNeeded(context, peerId: peerId) context.uploadDisposable.set((uploadSignal @@ -596,7 +566,7 @@ public final class PendingMessageManager { let status = PendingMessageStatus(isRunning: true, progress: progress) current.status = status for subscriber in current.statusSubscribers.copyItems() { - subscriber(status) + subscriber(context.status, context.error) } } case let .content(content): @@ -780,6 +750,15 @@ public final class PendingMessageManager { return .complete() } } else if let failureReason = reasonForError(error.errorDescription), let message = messages.first?.0 { + for (message, _) in messages { + if let context = strongSelf.messageContexts[message.id] { + context.error = failureReason + for f in context.statusSubscribers.copyItems() { + f(context.status, context.error) + } + } + } + if let context = strongSelf.peerSummaryContexts[message.id.peerId] { for subscriber in context.messageFailedSubscribers.copyItems() { subscriber(failureReason) @@ -900,9 +879,7 @@ public final class PendingMessageManager { var replyMessageId: Int32? var flags: Int32 = 0 - - flags |= (1 << 7) - + for attribute in message.attributes { if let replyAttribute = attribute as? ReplyMessageAttribute { replyMessageId = replyAttribute.messageId.id @@ -923,11 +900,16 @@ public final class PendingMessageManager { } } - if let _ = replyMessageId { - flags |= Int32(1 << 0) - } - if let _ = messageEntities { - flags |= Int32(1 << 3) + if case .forward = content.content { + } else { + flags |= (1 << 7) + + if let _ = replyMessageId { + flags |= Int32(1 << 0) + } + if let _ = messageEntities { + flags |= Int32(1 << 3) + } } let dependencyTag = PendingMessageRequestDependencyTag(messageId: messageId) @@ -941,7 +923,7 @@ public final class PendingMessageManager { |> map(NetworkRequestResult.result) case let .forward(sourceInfo): if let forwardSourceInfoAttribute = forwardSourceInfoAttribute, let sourcePeer = transaction.getPeer(forwardSourceInfoAttribute.messageId.peerId), let sourceInputPeer = apiInputPeer(sourcePeer) { - sendMessageRequest = network.request(Api.functions.messages.forwardMessages(flags: 0, fromPeer: sourceInputPeer, id: [sourceInfo.messageId.id], randomId: [uniqueId], toPeer: inputPeer), tag: dependencyTag) + sendMessageRequest = network.request(Api.functions.messages.forwardMessages(flags: flags, fromPeer: sourceInputPeer, id: [sourceInfo.messageId.id], randomId: [uniqueId], toPeer: inputPeer), tag: dependencyTag) |> map(NetworkRequestResult.result) } else { sendMessageRequest = .fail(MTRpcError(errorCode: 400, errorDescription: "internal")) @@ -993,6 +975,13 @@ public final class PendingMessageManager { return } } else if let failureReason = reasonForError(error.errorDescription) { + if let context = strongSelf.messageContexts[message.id] { + context.error = failureReason + for f in context.statusSubscribers.copyItems() { + f(context.status, context.error) + } + } + if let context = strongSelf.peerSummaryContexts[message.id.peerId] { for subscriber in context.messageFailedSubscribers.copyItems() { subscriber(failureReason) diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift index 24d33230fd..57b2b4297e 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift @@ -365,11 +365,7 @@ public final class TelegramMediaFile: Media, Equatable { public var isAnimatedSticker: Bool { if let _ = self.fileName, self.mimeType == "application/x-tgsticker" { - for attribute in self.attributes { - if case .Sticker = attribute { - return true - } - } + return true } return false } diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index 6246d70b1e..1504810d09 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -1,7 +1,8 @@ import Foundation import UIKit +import TelegramUIPreferences -private func makeDarkPresentationTheme(accentColor: UIColor) -> PresentationTheme { +private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: PresentationThemeBaseColor?, preview: Bool) -> PresentationTheme { let destructiveColor: UIColor = UIColor(rgb: 0xeb5545) let constructiveColor: UIColor = UIColor(rgb: 0x08a723) let secretColor: UIColor = UIColor(rgb: 0x00b12c) @@ -215,7 +216,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor) -> PresentationThem inputTextColor: .white, inputControlColor: UIColor(rgb: 0x7b7b7b), actionControlFillColor: accentColor, - actionControlForegroundColor: .white, + actionControlForegroundColor: badgeTextColor, primaryTextColor: .white, secondaryTextColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaRecordingDotColor: destructiveColor, @@ -306,6 +307,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor) -> PresentationThem name: .builtin(.night), author: "Telegram", overallDarkAppearance: true, + baseColor: baseColor, intro: intro, passcode: passcode, rootController: rootController, @@ -313,13 +315,14 @@ private func makeDarkPresentationTheme(accentColor: UIColor) -> PresentationThem chatList: chatList, chat: chat, actionSheet: actionSheet, - inAppNotification: inAppNotification + inAppNotification: inAppNotification, + preview: preview ) } -public let defaultDarkPresentationTheme = makeDarkPresentationTheme(accentColor: UIColor(rgb: 0x2ea6ff)) +public let defaultDarkPresentationTheme = makeDarkPresentationTheme(accentColor: UIColor(rgb: 0x2ea6ff), baseColor: .blue, preview: false) -public func makeDarkPresentationTheme(accentColor: UIColor?) -> PresentationTheme { +public func makeDarkPresentationTheme(accentColor: UIColor?, baseColor: PresentationThemeBaseColor?, preview: Bool) -> PresentationTheme { let accentColor = accentColor ?? defaultDayAccentColor - return makeDarkPresentationTheme(accentColor: accentColor) + return makeDarkPresentationTheme(accentColor: accentColor, baseColor: baseColor, preview: preview) } diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift index df94bd83bf..65a446dc86 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift @@ -1,7 +1,8 @@ import Foundation import UIKit +import TelegramUIPreferences -private func makeDarkPresentationTheme(accentColor: UIColor) -> PresentationTheme { +private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: PresentationThemeBaseColor?, preview: Bool) -> PresentationTheme { let destructiveColor: UIColor = UIColor(rgb: 0xff6767) let constructiveColor: UIColor = UIColor(rgb: 0x08a723) let secretColor: UIColor = UIColor(rgb: 0x89df9e) @@ -310,6 +311,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor) -> PresentationThem name: .builtin(.nightAccent), author: "Telegram", overallDarkAppearance: true, + baseColor: baseColor, intro: intro, passcode: passcode, rootController: rootController, @@ -317,13 +319,14 @@ private func makeDarkPresentationTheme(accentColor: UIColor) -> PresentationThem chatList: chatList, chat: chat, actionSheet: actionSheet, - inAppNotification: inAppNotification + inAppNotification: inAppNotification, + preview: preview ) } -public let defaultDarkAccentPresentationTheme = makeDarkAccentPresentationTheme(accentColor: UIColor(rgb: 0x2ea6ff)) +public let defaultDarkAccentPresentationTheme = makeDarkAccentPresentationTheme(accentColor: UIColor(rgb: 0x2ea6ff), baseColor: .blue, preview: false) -public func makeDarkAccentPresentationTheme(accentColor: UIColor?) -> PresentationTheme { +public func makeDarkAccentPresentationTheme(accentColor: UIColor?, baseColor: PresentationThemeBaseColor?, preview: Bool) -> PresentationTheme { let accentColor = accentColor ?? defaultDayAccentColor - return makeDarkPresentationTheme(accentColor: accentColor) + return makeDarkPresentationTheme(accentColor: accentColor, baseColor: baseColor, preview: preview) } diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index aa966f2916..83ad127d50 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -1,8 +1,9 @@ import Foundation import UIKit import TelegramCore +import TelegramUIPreferences -private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgroundColor: UIColor, day: Bool) -> PresentationTheme { +private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgroundColor: UIColor, baseColor: PresentationThemeBaseColor?, day: Bool, preview: Bool) -> PresentationTheme { let destructiveColor: UIColor = UIColor(rgb: 0xff3b30) let constructiveColor: UIColor = UIColor(rgb: 0x00c900) let secretColor: UIColor = UIColor(rgb: 0x00b12c) @@ -316,6 +317,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr name: .builtin(day ? .day : .dayClassic), author: "Telegram", overallDarkAppearance: false, + baseColor: baseColor, intro: intro, passcode: passcode, rootController: rootController, @@ -323,16 +325,17 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr chatList: chatList, chat: chat, actionSheet: actionSheet, - inAppNotification: inAppNotification + inAppNotification: inAppNotification, + preview: preview ) } -public let defaultPresentationTheme = makeDefaultDayPresentationTheme(accentColor: UIColor(rgb: 0x007ee5), serviceBackgroundColor: defaultServiceBackgroundColor, day: false) +public let defaultPresentationTheme = makeDefaultDayPresentationTheme(accentColor: UIColor(rgb: 0x007ee5), serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: nil, day: false, preview: false) public let defaultDayAccentColor = UIColor(rgb: 0x007ee5) public let defaultServiceBackgroundColor = UIColor(rgb: 0x000000, alpha: 0.3) -public func makeDefaultDayPresentationTheme(accentColor: UIColor? = nil, serviceBackgroundColor: UIColor, day: Bool) -> PresentationTheme { +public func makeDefaultDayPresentationTheme(accentColor: UIColor? = nil, serviceBackgroundColor: UIColor, baseColor: PresentationThemeBaseColor?, day: Bool, preview: Bool) -> PresentationTheme { let accentColor = accentColor ?? defaultDayAccentColor - return makeDefaultDayPresentationTheme(accentColor: accentColor, serviceBackgroundColor: serviceBackgroundColor, day: day) + return makeDefaultDayPresentationTheme(accentColor: accentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: day, preview: preview) } diff --git a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift index 2d25ba6745..421d05e5e1 100644 --- a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift @@ -2,19 +2,19 @@ import Foundation import UIKit import TelegramUIPreferences -public func makePresentationTheme(themeReference: PresentationThemeReference, accentColor: UIColor, serviceBackgroundColor: UIColor) -> PresentationTheme { +public func makePresentationTheme(themeReference: PresentationThemeReference, accentColor: UIColor, serviceBackgroundColor: UIColor, baseColor: PresentationThemeBaseColor?, preview: Bool = false) -> PresentationTheme { let theme: PresentationTheme switch themeReference { case let .builtin(reference): switch reference { case .dayClassic: - theme = makeDefaultDayPresentationTheme(serviceBackgroundColor: serviceBackgroundColor, day: false) + theme = makeDefaultDayPresentationTheme(serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: false, preview: preview) case .night: - theme = makeDarkPresentationTheme(accentColor: accentColor) + theme = makeDarkPresentationTheme(accentColor: accentColor, baseColor: baseColor, preview: preview) case .nightAccent: - theme = makeDarkAccentPresentationTheme(accentColor: accentColor) + theme = makeDarkAccentPresentationTheme(accentColor: accentColor, baseColor: baseColor, preview: preview) case .day: - theme = makeDefaultDayPresentationTheme(accentColor: accentColor, serviceBackgroundColor: serviceBackgroundColor, day: true) + theme = makeDefaultDayPresentationTheme(accentColor: accentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: true, preview: preview) } } return theme diff --git a/submodules/TelegramPresentationData/Sources/PresentationData.swift b/submodules/TelegramPresentationData/Sources/PresentationData.swift index 4a18027018..b42ad575d2 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationData.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationData.swift @@ -253,13 +253,13 @@ public func currentPresentationDataAndSettings(accountManager: AccountManager) - let parameters = AutomaticThemeSwitchParameters(settings: themeSettings.automaticThemeSwitchSetting) if automaticThemeShouldSwitchNow(parameters, currentTheme: themeSettings.theme) { - effectiveTheme = themeSettings.themeTintColors ? .builtin(.nightAccent) : .builtin(.night) + effectiveTheme = .builtin(themeSettings.automaticThemeSwitchSetting.theme) } else { effectiveTheme = themeSettings.theme } let effectiveAccentColor = themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.color ?? defaultDayAccentColor - themeValue = makePresentationTheme(themeReference: effectiveTheme, accentColor: effectiveAccentColor, serviceBackgroundColor: defaultServiceBackgroundColor) + themeValue = makePresentationTheme(themeReference: effectiveTheme, accentColor: effectiveAccentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.baseColor ?? .blue) if effectiveTheme != themeSettings.theme { switch effectiveChatWallpaper { @@ -513,7 +513,7 @@ public func updatedPresentationData(accountManager: AccountManager, applicationI var effectiveChatWallpaper: TelegramWallpaper = currentWallpaper if shouldSwitch { - let automaticTheme: PresentationThemeReference = themeSettings.themeTintColors ? .builtin(.nightAccent) : .builtin(.night) + let automaticTheme: PresentationThemeReference = .builtin(themeSettings.automaticThemeSwitchSetting.theme) if let themeSpecificWallpaper = themeSettings.themeSpecificChatWallpapers[automaticTheme.index] { effectiveChatWallpaper = themeSpecificWallpaper } @@ -524,7 +524,7 @@ public func updatedPresentationData(accountManager: AccountManager, applicationI let effectiveAccentColor = themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.color ?? defaultDayAccentColor - let themeValue = makePresentationTheme(themeReference: effectiveTheme, accentColor: effectiveAccentColor, serviceBackgroundColor: serviceBackgroundColor) + let themeValue = makePresentationTheme(themeReference: effectiveTheme, accentColor: effectiveAccentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.baseColor ?? .blue) if effectiveTheme != themeSettings.theme && themeSettings.themeSpecificChatWallpapers[effectiveTheme.index] == nil { switch effectiveChatWallpaper { diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 9af6801ce9..68674434ea 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -295,280 +295,280 @@ public final class PresentationStrings { return formatWithArgumentRanges(self._s[106]!, self._r[106]!, [_1]) } public var AccessDenied_PhotosAndVideos: String { return self._s[107]! } - public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[108]! } public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[109]!, self._r[109]!, [_1]) + return formatWithArgumentRanges(self._s[108]!, self._r[108]!, [_1]) } - public var Map_OpenInGoogleMaps: String { return self._s[110]! } + public var Map_OpenInGoogleMaps: String { return self._s[109]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[111]!, self._r[111]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[110]!, self._r[110]!, [_1, _2, _3]) } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[112]!, self._r[112]!, [_1, _2]) + return formatWithArgumentRanges(self._s[111]!, self._r[111]!, [_1, _2]) } - public var Call_StatusRinging: String { return self._s[113]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[114]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[115]! } - public var UserInfo_NotificationsEnabled: String { return self._s[116]! } - public var Map_Search: String { return self._s[117]! } - public var Login_TermsOfServiceHeader: String { return self._s[119]! } + public var Call_StatusRinging: String { return self._s[112]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[113]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[114]! } + public var UserInfo_NotificationsEnabled: String { return self._s[115]! } + public var Map_Search: String { return self._s[116]! } + public var Login_TermsOfServiceHeader: String { return self._s[118]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[120]!, self._r[120]!, [_0]) + return formatWithArgumentRanges(self._s[119]!, self._r[119]!, [_0]) } public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[121]!, self._r[121]!, [_0]) + return formatWithArgumentRanges(self._s[120]!, self._r[120]!, [_0]) } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[122]! } - public var Weekday_Today: String { return self._s[123]! } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[121]! } + public var Weekday_Today: String { return self._s[122]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[125]!, self._r[125]!, [_1, _2]) + return formatWithArgumentRanges(self._s[124]!, self._r[124]!, [_1, _2]) } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[126]!, self._r[126]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[125]!, self._r[125]!, ["\(_1)"]) } - public var Notification_PassportValuePersonalDetails: String { return self._s[128]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[129]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[130]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[131]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[132]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[133]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[134]! } - public var Weekday_ShortMonday: String { return self._s[135]! } - public var Cache_KeepMedia: String { return self._s[136]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[137]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[127]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[128]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[129]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[130]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[131]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[132]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[133]! } + public var Weekday_ShortMonday: String { return self._s[134]! } + public var Cache_KeepMedia: String { return self._s[135]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[136]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[138]!, self._r[138]!, [_1, _2]) + return formatWithArgumentRanges(self._s[137]!, self._r[137]!, [_1, _2]) } public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[139]!, self._r[139]!, [_0]) + return formatWithArgumentRanges(self._s[138]!, self._r[138]!, [_0]) } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[140]! } - public var Passport_Language_ru: String { return self._s[141]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[139]! } + public var Passport_Language_ru: String { return self._s[140]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[142]!, self._r[142]!, [_0, _1]) + return formatWithArgumentRanges(self._s[141]!, self._r[141]!, [_0, _1]) } - public var WallpaperPreview_PatternIntensity: String { return self._s[143]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[144]! } - public var EnterPasscode_TouchId: String { return self._s[145]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[148]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[150]! } - public var Gif_NoGifsPlaceholder: String { return self._s[152]! } - public var Conversation_OpenBotLinkTitle: String { return self._s[154]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[155]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[156]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[157]! } - public var AuthSessions_TerminateSession: String { return self._s[158]! } - public var Message_File: String { return self._s[159]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[160]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[161]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[162]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[163]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[142]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[143]! } + public var EnterPasscode_TouchId: String { return self._s[144]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[147]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[149]! } + public var Gif_NoGifsPlaceholder: String { return self._s[151]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[153]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[154]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[155]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[156]! } + public var AuthSessions_TerminateSession: String { return self._s[157]! } + public var Message_File: String { return self._s[158]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[159]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[160]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[161]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[162]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[164]!, self._r[164]!, [_0]) + return formatWithArgumentRanges(self._s[163]!, self._r[163]!, [_0]) } - public var Conversation_Moderate_Report: String { return self._s[166]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[167]! } - public var Passport_Language_ms: String { return self._s[168]! } - public var Channel_Edit_AboutItem: String { return self._s[170]! } - public var DialogList_SearchSectionGlobal: String { return self._s[174]! } - public var AttachmentMenu_WebSearch: String { return self._s[175]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[176]! } - public var Channel_BanUser_Title: String { return self._s[177]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[178]! } - public var ArchivedChats_IntroText2: String { return self._s[179]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[180]! } + public var Conversation_Moderate_Report: String { return self._s[165]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[166]! } + public var Passport_Language_ms: String { return self._s[167]! } + public var Channel_Edit_AboutItem: String { return self._s[169]! } + public var DialogList_SearchSectionGlobal: String { return self._s[173]! } + public var AttachmentMenu_WebSearch: String { return self._s[174]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[175]! } + public var Channel_BanUser_Title: String { return self._s[176]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[177]! } + public var ArchivedChats_IntroText2: String { return self._s[178]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[179]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[181]!, self._r[181]!, [_1, _2]) + return formatWithArgumentRanges(self._s[180]!, self._r[180]!, [_1, _2]) } - public var ChatSearch_SearchPlaceholder: String { return self._s[183]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[184]! } - public var NotificationsSound_Aurora: String { return self._s[185]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[182]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[183]! } + public var NotificationsSound_Aurora: String { return self._s[184]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[186]!, self._r[186]!, [_0]) + return formatWithArgumentRanges(self._s[185]!, self._r[185]!, [_0]) } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[189]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[188]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[190]!, self._r[190]!, [_0, _1]) + return formatWithArgumentRanges(self._s[189]!, self._r[189]!, [_0, _1]) } - public var Passport_PasswordNext: String { return self._s[191]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[192]! } - public var EmptyGroupInfo_Line2: String { return self._s[193]! } - public var Settings_FAQ_Intro: String { return self._s[195]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[197]! } - public var FeaturedStickerPacks_Title: String { return self._s[198]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[199]! } - public var Username_Title: String { return self._s[200]! } + public var Passport_PasswordNext: String { return self._s[190]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[191]! } + public var EmptyGroupInfo_Line2: String { return self._s[192]! } + public var Settings_FAQ_Intro: String { return self._s[194]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[196]! } + public var FeaturedStickerPacks_Title: String { return self._s[197]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[198]! } + public var Username_Title: String { return self._s[199]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[201]!, self._r[201]!, [_0]) + return formatWithArgumentRanges(self._s[200]!, self._r[200]!, [_0]) } - public var PasscodeSettings_AlphanumericCode: String { return self._s[202]! } - public var Localization_LanguageOther: String { return self._s[203]! } - public var Stickers_SuggestStickers: String { return self._s[204]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[201]! } + public var Localization_LanguageOther: String { return self._s[202]! } + public var Stickers_SuggestStickers: String { return self._s[203]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[205]!, self._r[205]!, [_0]) + return formatWithArgumentRanges(self._s[204]!, self._r[204]!, [_0]) } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[206]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[207]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[208]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[205]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[206]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[207]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[209]!, self._r[209]!, [_0]) + return formatWithArgumentRanges(self._s[208]!, self._r[208]!, [_0]) } - public var Group_UpgradeConfirmation: String { return self._s[211]! } - public var DialogList_Unpin: String { return self._s[212]! } - public var Passport_Identity_DateOfBirth: String { return self._s[213]! } - public var Month_ShortOctober: String { return self._s[214]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[215]! } - public var Notification_CallCanceledShort: String { return self._s[216]! } - public var Passport_Phone_Help: String { return self._s[217]! } - public var Chat_AttachmentLimitExceeded: String { return self._s[219]! } - public var Passport_Language_az: String { return self._s[220]! } - public var CreatePoll_TextPlaceholder: String { return self._s[222]! } - public var Passport_Identity_DocumentNumber: String { return self._s[223]! } - public var PhotoEditor_CurvesRed: String { return self._s[224]! } - public var PhoneNumberHelp_Alert: String { return self._s[226]! } - public var SocksProxySetup_Port: String { return self._s[227]! } - public var Checkout_PayNone: String { return self._s[228]! } - public var AutoDownloadSettings_WiFi: String { return self._s[229]! } - public var GroupInfo_GroupType: String { return self._s[230]! } - public var StickerSettings_ContextHide: String { return self._s[231]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[232]! } - public var Group_Setup_HistoryTitle: String { return self._s[234]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[235]! } - public var PasscodeSettings_AutoLock: String { return self._s[236]! } - public var Passport_Title: String { return self._s[237]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[238]! } - public var GroupPermission_NoSendGifs: String { return self._s[239]! } - public var PrivacySettings_PasscodeOn: String { return self._s[240]! } - public var State_WaitingForNetwork: String { return self._s[242]! } + public var Group_UpgradeConfirmation: String { return self._s[210]! } + public var DialogList_Unpin: String { return self._s[211]! } + public var Passport_Identity_DateOfBirth: String { return self._s[212]! } + public var Month_ShortOctober: String { return self._s[213]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[214]! } + public var Notification_CallCanceledShort: String { return self._s[215]! } + public var Passport_Phone_Help: String { return self._s[216]! } + public var Chat_AttachmentLimitExceeded: String { return self._s[218]! } + public var Passport_Language_az: String { return self._s[219]! } + public var CreatePoll_TextPlaceholder: String { return self._s[221]! } + public var Passport_Identity_DocumentNumber: String { return self._s[222]! } + public var PhotoEditor_CurvesRed: String { return self._s[223]! } + public var PhoneNumberHelp_Alert: String { return self._s[225]! } + public var SocksProxySetup_Port: String { return self._s[226]! } + public var Checkout_PayNone: String { return self._s[227]! } + public var AutoDownloadSettings_WiFi: String { return self._s[228]! } + public var GroupInfo_GroupType: String { return self._s[229]! } + public var StickerSettings_ContextHide: String { return self._s[230]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[231]! } + public var Group_Setup_HistoryTitle: String { return self._s[233]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[234]! } + public var PasscodeSettings_AutoLock: String { return self._s[235]! } + public var Passport_Title: String { return self._s[236]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[237]! } + public var GroupPermission_NoSendGifs: String { return self._s[238]! } + public var PrivacySettings_PasscodeOn: String { return self._s[239]! } + public var State_WaitingForNetwork: String { return self._s[241]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[243]!, self._r[243]!, [_0, _1]) + return formatWithArgumentRanges(self._s[242]!, self._r[242]!, [_0, _1]) } - public var Calls_NotNow: String { return self._s[245]! } + public var Calls_NotNow: String { return self._s[244]! } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[246]!, self._r[246]!, [_0]) + return formatWithArgumentRanges(self._s[245]!, self._r[245]!, [_0]) } - public var UserInfo_SendMessage: String { return self._s[247]! } - public var TwoStepAuth_PasswordSet: String { return self._s[248]! } - public var Passport_DeleteDocument: String { return self._s[249]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[250]! } + public var UserInfo_SendMessage: String { return self._s[246]! } + public var TwoStepAuth_PasswordSet: String { return self._s[247]! } + public var Passport_DeleteDocument: String { return self._s[248]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[249]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[251]!, self._r[251]!, [_1]) + return formatWithArgumentRanges(self._s[250]!, self._r[250]!, [_1]) } - public var GroupRemoved_Remove: String { return self._s[252]! } - public var Passport_FieldIdentity: String { return self._s[253]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[254]! } - public var Conversation_Processing: String { return self._s[256]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[258]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[261]! } - public var Month_GenFebruary: String { return self._s[262]! } + public var GroupRemoved_Remove: String { return self._s[251]! } + public var Passport_FieldIdentity: String { return self._s[252]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[253]! } + public var Conversation_Processing: String { return self._s[255]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[257]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[260]! } + public var Month_GenFebruary: String { return self._s[261]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[264]!, self._r[264]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[263]!, self._r[263]!, [_1, _2, _3, _4, _5]) } - public var Passport_Identity_TypeIdentityCard: String { return self._s[265]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[267]! } - public var GroupInfo_AddParticipant: String { return self._s[268]! } - public var KeyCommand_SendMessage: String { return self._s[269]! } - public var Map_LiveLocationShowAll: String { return self._s[271]! } - public var WallpaperSearch_ColorOrange: String { return self._s[273]! } - public var Appearance_AppIconDefaultX: String { return self._s[274]! } - public var Checkout_Receipt_Title: String { return self._s[275]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[276]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[277]! } - public var Message_Contact: String { return self._s[278]! } - public var Call_StatusIncoming: String { return self._s[279]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[264]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[266]! } + public var GroupInfo_AddParticipant: String { return self._s[267]! } + public var KeyCommand_SendMessage: String { return self._s[268]! } + public var Map_LiveLocationShowAll: String { return self._s[270]! } + public var WallpaperSearch_ColorOrange: String { return self._s[272]! } + public var Appearance_AppIconDefaultX: String { return self._s[273]! } + public var Checkout_Receipt_Title: String { return self._s[274]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[275]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[276]! } + public var Message_Contact: String { return self._s[277]! } + public var Call_StatusIncoming: String { return self._s[278]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[280]!, self._r[280]!, [_1]) + return formatWithArgumentRanges(self._s[279]!, self._r[279]!, [_1]) } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[282]!, self._r[282]!, [_1]) + return formatWithArgumentRanges(self._s[281]!, self._r[281]!, [_1]) } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[283]! } - public var Conversation_ViewChannel: String { return self._s[284]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[282]! } + public var Conversation_ViewChannel: String { return self._s[283]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[285]!, self._r[285]!, [_0]) + return formatWithArgumentRanges(self._s[284]!, self._r[284]!, [_0]) } - public var Passport_Language_nl: String { return self._s[287]! } - public var Camera_Retake: String { return self._s[288]! } + public var Passport_Language_nl: String { return self._s[286]! } + public var Camera_Retake: String { return self._s[287]! } public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[289]!, self._r[289]!, [_0]) + return formatWithArgumentRanges(self._s[288]!, self._r[288]!, [_0]) } - public var AuthSessions_LogOutApplications: String { return self._s[290]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[291]! } - public var Tour_Title6: String { return self._s[292]! } - public var Map_ChooseAPlace: String { return self._s[293]! } - public var CallSettings_Never: String { return self._s[295]! } + public var AuthSessions_LogOutApplications: String { return self._s[289]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[290]! } + public var Tour_Title6: String { return self._s[291]! } + public var Map_ChooseAPlace: String { return self._s[292]! } + public var CallSettings_Never: String { return self._s[294]! } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[296]!, self._r[296]!, [_0]) + return formatWithArgumentRanges(self._s[295]!, self._r[295]!, [_0]) } - public var ChannelRemoved_RemoveInfo: String { return self._s[297]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[296]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[298]!, self._r[298]!, [_0]) + return formatWithArgumentRanges(self._s[297]!, self._r[297]!, [_0]) } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[299]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[298]! } public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[300]!, self._r[300]!, [_0]) + return formatWithArgumentRanges(self._s[299]!, self._r[299]!, [_0]) } - public var GroupInfo_InviteLink_Title: String { return self._s[301]! } + public var GroupInfo_InviteLink_Title: String { return self._s[300]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[302]!, self._r[302]!, [_1, _2]) + return formatWithArgumentRanges(self._s[301]!, self._r[301]!, [_1, _2]) } - public var KeyCommand_ScrollUp: String { return self._s[303]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[304]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[305]! } + public var KeyCommand_ScrollUp: String { return self._s[302]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[303]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[304]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[306]!, self._r[306]!, [_0]) + return formatWithArgumentRanges(self._s[305]!, self._r[305]!, [_0]) } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[307]!, self._r[307]!, [_0]) + return formatWithArgumentRanges(self._s[306]!, self._r[306]!, [_0]) } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[308]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[309]! } - public var Weekday_Tuesday: String { return self._s[311]! } - public var UserInfo_StartSecretChat: String { return self._s[313]! } - public var Passport_Identity_FilesTitle: String { return self._s[314]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[315]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[317]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[318]! } - public var AuthSessions_Sessions: String { return self._s[319]! } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[307]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[308]! } + public var Weekday_Tuesday: String { return self._s[310]! } + public var UserInfo_StartSecretChat: String { return self._s[312]! } + public var Passport_Identity_FilesTitle: String { return self._s[313]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[314]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[316]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[317]! } + public var AuthSessions_Sessions: String { return self._s[318]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[321]!, self._r[321]!, [_0]) + return formatWithArgumentRanges(self._s[320]!, self._r[320]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[322]! } - public var Call_StatusWaiting: String { return self._s[323]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[324]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[325]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[326]! } - public var LogoutOptions_AddAccountText: String { return self._s[327]! } - public var PasscodeSettings_6DigitCode: String { return self._s[328]! } - public var Settings_LogoutConfirmationText: String { return self._s[329]! } - public var Passport_Identity_TypePassport: String { return self._s[331]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[321]! } + public var Call_StatusWaiting: String { return self._s[322]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[323]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[324]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[325]! } + public var LogoutOptions_AddAccountText: String { return self._s[326]! } + public var PasscodeSettings_6DigitCode: String { return self._s[327]! } + public var Settings_LogoutConfirmationText: String { return self._s[328]! } + public var Passport_Identity_TypePassport: String { return self._s[330]! } public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[334]!, self._r[334]!, [_1, _2]) + return formatWithArgumentRanges(self._s[333]!, self._r[333]!, [_1, _2]) } - public var SocksProxySetup_SaveProxy: String { return self._s[335]! } - public var AccessDenied_SaveMedia: String { return self._s[336]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[338]! } - public var Settings_Title: String { return self._s[340]! } - public var Contacts_InviteSearchLabel: String { return self._s[342]! } - public var ConvertToSupergroup_Title: String { return self._s[343]! } + public var SocksProxySetup_SaveProxy: String { return self._s[334]! } + public var AccessDenied_SaveMedia: String { return self._s[335]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[337]! } + public var Settings_Title: String { return self._s[339]! } + public var Contacts_InviteSearchLabel: String { return self._s[341]! } + public var ConvertToSupergroup_Title: String { return self._s[342]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[344]!, self._r[344]!, [_0]) + return formatWithArgumentRanges(self._s[343]!, self._r[343]!, [_0]) } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[345]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[344]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[346]!, self._r[346]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[345]!, self._r[345]!, [_1, _2, _3]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[347]! } - public var UserInfo_BotHelp: String { return self._s[348]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[349]! } - public var Checkout_Name: String { return self._s[350]! } - public var AutoDownloadSettings_DataUsage: String { return self._s[351]! } - public var Channel_BanUser_BlockFor: String { return self._s[352]! } - public var Checkout_ShippingAddress: String { return self._s[353]! } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[354]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[355]! } - public var Privacy_Forwards: String { return self._s[356]! } - public var Channel_BanUser_PermissionSendPolls: String { return self._s[357]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[346]! } + public var UserInfo_BotHelp: String { return self._s[347]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[348]! } + public var Checkout_Name: String { return self._s[349]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[350]! } + public var Channel_BanUser_BlockFor: String { return self._s[351]! } + public var Checkout_ShippingAddress: String { return self._s[352]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[353]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[354]! } + public var Privacy_Forwards: String { return self._s[355]! } + public var Channel_BanUser_PermissionSendPolls: String { return self._s[356]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[357]! } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[360]!, self._r[360]!, [_0]) } @@ -747,3671 +747,3666 @@ public final class PresentationStrings { public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[517]! } public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[518]! } public var DialogList_SearchSectionMessages: String { return self._s[521]! } - public var Appearance_ThemePreview_ChatList_8_Name: String { return self._s[522]! } - public var Notifications_ChannelNotifications: String { return self._s[523]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[524]! } - public var Passport_Language_sk: String { return self._s[525]! } - public var Notification_MessageLifetime1h: String { return self._s[526]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[527]! } - public var Call_ReportSkip: String { return self._s[529]! } - public var Cache_ServiceFiles: String { return self._s[530]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[531]! } - public var Map_Hybrid: String { return self._s[532]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[534]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[536]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[537]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[538]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[541]! } + public var Notifications_ChannelNotifications: String { return self._s[522]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[523]! } + public var Passport_Language_sk: String { return self._s[524]! } + public var Notification_MessageLifetime1h: String { return self._s[525]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[526]! } + public var Call_ReportSkip: String { return self._s[528]! } + public var Cache_ServiceFiles: String { return self._s[529]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[530]! } + public var Map_Hybrid: String { return self._s[531]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[533]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[535]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[536]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[537]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[540]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[542]!, self._r[542]!, [_1]) + return formatWithArgumentRanges(self._s[541]!, self._r[541]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[544]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[543]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[545]!, self._r[545]!, [_1, _2]) + return formatWithArgumentRanges(self._s[544]!, self._r[544]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[546]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[547]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[548]! } - public var UserInfo_ShareBot: String { return self._s[551]! } + public var Conversation_LiveLocationYou: String { return self._s[545]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[546]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[547]! } + public var UserInfo_ShareBot: String { return self._s[550]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[552]!, self._r[552]!, [_1, _2]) + return formatWithArgumentRanges(self._s[551]!, self._r[551]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[553]! } - public var Message_Audio: String { return self._s[554]! } - public var Passport_Language_lt: String { return self._s[555]! } + public var PhotoEditor_ShadowsTint: String { return self._s[552]! } + public var Message_Audio: String { return self._s[553]! } + public var Passport_Language_lt: String { return self._s[554]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[556]!, self._r[556]!, [_0]) + return formatWithArgumentRanges(self._s[555]!, self._r[555]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[557]! } - public var Conversation_FileICloudDrive: String { return self._s[558]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[559]! } + public var Permissions_SiriText_v0: String { return self._s[556]! } + public var Conversation_FileICloudDrive: String { return self._s[557]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[558]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[560]!, self._r[560]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[559]!, self._r[559]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[561]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[560]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[562]!, self._r[562]!, [_0]) + return formatWithArgumentRanges(self._s[561]!, self._r[561]!, [_0]) } - public var Channel_SignMessages: String { return self._s[563]! } + public var Channel_SignMessages: String { return self._s[562]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[564]!, self._r[564]!, [_1]) + return formatWithArgumentRanges(self._s[563]!, self._r[563]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[565]! } - public var Passport_ScanPassport: String { return self._s[566]! } - public var Watch_Suggestion_Thanks: String { return self._s[567]! } - public var BlockedUsers_AddNew: String { return self._s[568]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[564]! } + public var Passport_ScanPassport: String { return self._s[565]! } + public var Watch_Suggestion_Thanks: String { return self._s[566]! } + public var BlockedUsers_AddNew: String { return self._s[567]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[569]!, self._r[569]!, [_1, _2]) + return formatWithArgumentRanges(self._s[568]!, self._r[568]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[570]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[571]! } - public var Month_GenJuly: String { return self._s[572]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[573]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[575]! } - public var Notification_ChannelInviterSelf: String { return self._s[576]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[577]! } + public var Watch_Message_Invoice: String { return self._s[569]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[570]! } + public var Month_GenJuly: String { return self._s[571]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[572]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[574]! } + public var Notification_ChannelInviterSelf: String { return self._s[575]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[576]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[578]!, self._r[578]!, [_1, _2]) + return formatWithArgumentRanges(self._s[577]!, self._r[577]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[579]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[580]! } + public var CheckoutInfo_Title: String { return self._s[578]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[579]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[581]!, self._r[581]!, [_0]) + return formatWithArgumentRanges(self._s[580]!, self._r[580]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[582]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[583]! } - public var Passport_Language_de: String { return self._s[584]! } - public var Update_Title: String { return self._s[585]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[586]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[587]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[588]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[589]! } - public var NotificationsSound_Telegraph: String { return self._s[590]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[591]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[592]! } + public var Passport_Identity_MainPage: String { return self._s[581]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[582]! } + public var Passport_Language_de: String { return self._s[583]! } + public var Update_Title: String { return self._s[584]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[585]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[586]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[587]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[588]! } + public var NotificationsSound_Telegraph: String { return self._s[589]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[590]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[591]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[593]!, self._r[593]!, [_0]) + return formatWithArgumentRanges(self._s[592]!, self._r[592]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[594]! } - public var Conversation_ForwardTitle: String { return self._s[595]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[596]! } + public var Stickers_SuggestAll: String { return self._s[593]! } + public var Conversation_ForwardTitle: String { return self._s[594]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[597]!, self._r[597]!, [_0]) + return formatWithArgumentRanges(self._s[595]!, self._r[595]!, [_0]) } - public var Calls_NewCall: String { return self._s[598]! } - public var Call_StatusEnded: String { return self._s[599]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[600]! } - public var Settings_ProxyConnected: String { return self._s[601]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[602]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[603]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[604]! } - public var Passport_PasswordPlaceholder: String { return self._s[605]! } - public var Message_PinnedInvoice: String { return self._s[606]! } - public var Passport_Identity_IssueDate: String { return self._s[607]! } - public var Passport_Language_pl: String { return self._s[608]! } + public var Calls_NewCall: String { return self._s[596]! } + public var Call_StatusEnded: String { return self._s[597]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[598]! } + public var Settings_ProxyConnected: String { return self._s[599]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[600]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[601]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[602]! } + public var Passport_PasswordPlaceholder: String { return self._s[603]! } + public var Message_PinnedInvoice: String { return self._s[604]! } + public var Passport_Identity_IssueDate: String { return self._s[605]! } + public var Passport_Language_pl: String { return self._s[606]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[609]!, self._r[609]!, [_0]) + return formatWithArgumentRanges(self._s[607]!, self._r[607]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[610]! } - public var Call_StatusConnecting: String { return self._s[611]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[608]! } + public var Call_StatusConnecting: String { return self._s[609]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[612]!, self._r[612]!, [_0]) + return formatWithArgumentRanges(self._s[610]!, self._r[610]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[614]! } - public var Common_Edit: String { return self._s[615]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[616]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[612]! } + public var Common_Edit: String { return self._s[613]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[614]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[617]!, self._r[617]!, [_0]) + return formatWithArgumentRanges(self._s[615]!, self._r[615]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[618]! } - public var PrivateDataSettings_Title: String { return self._s[619]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[620]! } - public var ChatList_Read: String { return self._s[621]! } - public var Undo_ChatClearedForBothSides: String { return self._s[622]! } - public var GroupPermission_SectionTitle: String { return self._s[623]! } + public var GroupInfo_ChatAdmins: String { return self._s[616]! } + public var PrivateDataSettings_Title: String { return self._s[617]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[618]! } + public var ChatList_Read: String { return self._s[619]! } + public var Undo_ChatClearedForBothSides: String { return self._s[620]! } + public var GroupPermission_SectionTitle: String { return self._s[621]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[625]!, self._r[625]!, [_1, _2]) + return formatWithArgumentRanges(self._s[623]!, self._r[623]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[626]! } - public var Update_UpdateApp: String { return self._s[627]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[628]! } - public var Settings_Appearance: String { return self._s[629]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[631]! } - public var Watch_Location_Access: String { return self._s[632]! } - public var ShareMenu_CopyShareLink: String { return self._s[634]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[635]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[624]! } + public var Update_UpdateApp: String { return self._s[625]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[626]! } + public var Settings_Appearance: String { return self._s[627]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[629]! } + public var Watch_Location_Access: String { return self._s[630]! } + public var ShareMenu_CopyShareLink: String { return self._s[632]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[633]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[637]!, self._r[637]!, [_0]) + return formatWithArgumentRanges(self._s[635]!, self._r[635]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[638]! } - public var Weekday_ShortWednesday: String { return self._s[639]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[640]! } - public var Undo_LeftGroup: String { return self._s[643]! } - public var Conversation_LinkDialogCopy: String { return self._s[644]! } - public var KeyCommand_FocusOnInputField: String { return self._s[646]! } - public var Contacts_SelectAll: String { return self._s[647]! } - public var Preview_SaveToCameraRoll: String { return self._s[648]! } - public var PrivacySettings_PasscodeOff: String { return self._s[649]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[650]! } - public var Wallpaper_Title: String { return self._s[651]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[652]! } - public var AccessDenied_Camera: String { return self._s[653]! } - public var Watch_Compose_CurrentLocation: String { return self._s[654]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[656]! } + public var Notifications_ClassicTones: String { return self._s[636]! } + public var Weekday_ShortWednesday: String { return self._s[637]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[638]! } + public var Undo_LeftGroup: String { return self._s[641]! } + public var Conversation_LinkDialogCopy: String { return self._s[642]! } + public var KeyCommand_FocusOnInputField: String { return self._s[644]! } + public var Contacts_SelectAll: String { return self._s[645]! } + public var Preview_SaveToCameraRoll: String { return self._s[646]! } + public var PrivacySettings_PasscodeOff: String { return self._s[647]! } + public var Wallpaper_Title: String { return self._s[648]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[649]! } + public var AccessDenied_Camera: String { return self._s[650]! } + public var Watch_Compose_CurrentLocation: String { return self._s[651]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[653]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[657]!, self._r[657]!, [_0]) + return formatWithArgumentRanges(self._s[654]!, self._r[654]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[658]! } - public var Passport_Language_ro: String { return self._s[659]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[660]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[655]! } + public var Passport_Language_ro: String { return self._s[656]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[657]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[661]!, self._r[661]!, [_0]) + return formatWithArgumentRanges(self._s[658]!, self._r[658]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[662]! } - public var State_ConnectingToProxy: String { return self._s[663]! } - public var Calls_RatingTitle: String { return self._s[664]! } - public var Generic_ErrorMoreInfo: String { return self._s[665]! } - public var Appearance_PreviewReplyText: String { return self._s[666]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[667]! } - public var SharedMedia_CategoryLinks: String { return self._s[668]! } - public var Calls_Missed: String { return self._s[669]! } - public var Cache_Photos: String { return self._s[673]! } - public var GroupPermission_NoAddMembers: String { return self._s[674]! } + public var Login_CancelPhoneVerification: String { return self._s[659]! } + public var State_ConnectingToProxy: String { return self._s[660]! } + public var Calls_RatingTitle: String { return self._s[661]! } + public var Generic_ErrorMoreInfo: String { return self._s[662]! } + public var Appearance_PreviewReplyText: String { return self._s[663]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[664]! } + public var SharedMedia_CategoryLinks: String { return self._s[665]! } + public var Calls_Missed: String { return self._s[666]! } + public var Cache_Photos: String { return self._s[670]! } + public var GroupPermission_NoAddMembers: String { return self._s[671]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[675]!, self._r[675]!, [_0]) + return formatWithArgumentRanges(self._s[672]!, self._r[672]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[676]! } - public var Settings_ProxyDisabled: String { return self._s[677]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[673]! } + public var Settings_ProxyDisabled: String { return self._s[674]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[678]!, self._r[678]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[675]!, self._r[675]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[676]!, self._r[676]!, [_0]) + } + public var Appearance_Title: String { return self._s[677]! } + public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[679]!, self._r[679]!, [_0]) } - public var Appearance_Title: String { return self._s[680]! } - public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[682]!, self._r[682]!, [_0]) - } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[683]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[684]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[685]! } - public var Preview_DeletePhoto: String { return self._s[686]! } - public var Appearance_AppIconFilledX: String { return self._s[687]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[688]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[680]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[681]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[682]! } + public var Preview_DeletePhoto: String { return self._s[683]! } + public var Appearance_AppIconFilledX: String { return self._s[684]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[685]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[689]!, self._r[689]!, [_0]) + return formatWithArgumentRanges(self._s[686]!, self._r[686]!, [_0]) } - public var Appearance_ThemePreview_Chat_1_ReplyText: String { return self._s[691]! } - public var Coub_TapForSound: String { return self._s[692]! } - public var Map_LocatingError: String { return self._s[693]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[695]! } - public var Passport_ForgottenPassword: String { return self._s[696]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[697]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[698]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[700]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[701]! } - public var Message_Location: String { return self._s[702]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[703]! } - public var Channel_Management_Title: String { return self._s[704]! } - public var DialogList_SearchSectionDialogs: String { return self._s[706]! } - public var Compose_NewChannel_Members: String { return self._s[707]! } + public var Coub_TapForSound: String { return self._s[688]! } + public var Map_LocatingError: String { return self._s[689]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[691]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[692]! } + public var Passport_ForgottenPassword: String { return self._s[693]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[694]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[695]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[697]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[698]! } + public var Message_Location: String { return self._s[699]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[700]! } + public var Channel_Management_Title: String { return self._s[701]! } + public var DialogList_SearchSectionDialogs: String { return self._s[703]! } + public var Compose_NewChannel_Members: String { return self._s[704]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[708]!, self._r[708]!, [_0]) + return formatWithArgumentRanges(self._s[705]!, self._r[705]!, [_0]) } - public var GroupInfo_Location: String { return self._s[709]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[710]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[711]! } - public var PhotoEditor_WarmthTool: String { return self._s[712]! } - public var Passport_Language_tr: String { return self._s[713]! } + public var GroupInfo_Location: String { return self._s[706]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[707]! } + public var PhotoEditor_WarmthTool: String { return self._s[708]! } + public var Passport_Language_tr: String { return self._s[709]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[714]!, self._r[714]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[710]!, self._r[710]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[716]! } - public var Watch_PhotoView_Title: String { return self._s[717]! } - public var Passport_Phone_Delete: String { return self._s[718]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[719]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[720]! } - public var GroupInfo_Permissions: String { return self._s[721]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[722]! } - public var Profile_ShareContactButton: String { return self._s[723]! } - public var ChatSettings_Other: String { return self._s[724]! } - public var UserInfo_NotificationsDisabled: String { return self._s[725]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[726]! } - public var LastSeen_WithinAMonth: String { return self._s[727]! } - public var Conversation_ReportGroupLocation: String { return self._s[728]! } - public var Conversation_EncryptionCanceled: String { return self._s[729]! } - public var MediaPicker_GroupDescription: String { return self._s[730]! } - public var WebSearch_Images: String { return self._s[731]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[712]! } + public var Watch_PhotoView_Title: String { return self._s[713]! } + public var Passport_Phone_Delete: String { return self._s[714]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[715]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[716]! } + public var GroupInfo_Permissions: String { return self._s[717]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[718]! } + public var Profile_ShareContactButton: String { return self._s[719]! } + public var ChatSettings_Other: String { return self._s[720]! } + public var UserInfo_NotificationsDisabled: String { return self._s[721]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[722]! } + public var LastSeen_WithinAMonth: String { return self._s[723]! } + public var Conversation_ReportGroupLocation: String { return self._s[724]! } + public var Conversation_EncryptionCanceled: String { return self._s[725]! } + public var MediaPicker_GroupDescription: String { return self._s[726]! } + public var WebSearch_Images: String { return self._s[727]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[732]!, self._r[732]!, [_0]) + return formatWithArgumentRanges(self._s[728]!, self._r[728]!, [_0]) } - public var Message_Photo: String { return self._s[733]! } - public var PasscodeSettings_HelpBottom: String { return self._s[734]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[735]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[736]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[737]! } - public var NotificationsSound_Calypso: String { return self._s[738]! } - public var Map_Map: String { return self._s[739]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[741]! } - public var ChatSettings_TextSizeUnits: String { return self._s[742]! } - public var Common_of: String { return self._s[743]! } - public var Conversation_ForwardContacts: String { return self._s[745]! } + public var Message_Photo: String { return self._s[729]! } + public var PasscodeSettings_HelpBottom: String { return self._s[730]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[731]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[732]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[733]! } + public var NotificationsSound_Calypso: String { return self._s[734]! } + public var Map_Map: String { return self._s[735]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[737]! } + public var ChatSettings_TextSizeUnits: String { return self._s[738]! } + public var Common_of: String { return self._s[739]! } + public var Conversation_ForwardContacts: String { return self._s[741]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[747]!, self._r[747]!, [_0]) + return formatWithArgumentRanges(self._s[743]!, self._r[743]!, [_0]) } - public var Passport_Language_hy: String { return self._s[748]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[749]! } - public var AutoDownloadSettings_Reset: String { return self._s[750]! } - public var Paint_ClearConfirm: String { return self._s[751]! } - public var Camera_VideoMode: String { return self._s[752]! } + public var Passport_Language_hy: String { return self._s[744]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[745]! } + public var AutoDownloadSettings_Reset: String { return self._s[746]! } + public var Paint_ClearConfirm: String { return self._s[747]! } + public var Camera_VideoMode: String { return self._s[748]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[753]!, self._r[753]!, [_0]) + return formatWithArgumentRanges(self._s[749]!, self._r[749]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[754]! } - public var Conversation_ViewBackground: String { return self._s[755]! } - public var Passport_Language_el: String { return self._s[756]! } - public var PhotoEditor_Original: String { return self._s[757]! } - public var Settings_FAQ_Button: String { return self._s[759]! } - public var Channel_Setup_PublicNoLink: String { return self._s[761]! } - public var Conversation_UnsupportedMedia: String { return self._s[762]! } - public var Conversation_SlideToCancel: String { return self._s[763]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[764]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[765]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[766]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[767]! } - public var AutoNightTheme_NotAvailable: String { return self._s[768]! } - public var Conversation_Owner: String { return self._s[769]! } - public var Common_Create: String { return self._s[770]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[771]! } - public var Localization_ChooseLanguage: String { return self._s[773]! } - public var Settings_Proxy: String { return self._s[776]! } - public var Privacy_TopPeersHelp: String { return self._s[777]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[778]! } - public var Chat_UnsendMyMessages: String { return self._s[779]! } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[780]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[750]! } + public var Conversation_ViewBackground: String { return self._s[751]! } + public var Passport_Language_el: String { return self._s[752]! } + public var PhotoEditor_Original: String { return self._s[753]! } + public var Settings_FAQ_Button: String { return self._s[755]! } + public var Channel_Setup_PublicNoLink: String { return self._s[757]! } + public var Conversation_UnsupportedMedia: String { return self._s[758]! } + public var Conversation_SlideToCancel: String { return self._s[759]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[760]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[761]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[762]! } + public var AutoNightTheme_NotAvailable: String { return self._s[763]! } + public var Conversation_Owner: String { return self._s[764]! } + public var Common_Create: String { return self._s[765]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[766]! } + public var Localization_ChooseLanguage: String { return self._s[768]! } + public var Settings_Proxy: String { return self._s[771]! } + public var Privacy_TopPeersHelp: String { return self._s[772]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[773]! } + public var Chat_UnsendMyMessages: String { return self._s[774]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[775]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[782]!, self._r[782]!, [_0]) + return formatWithArgumentRanges(self._s[777]!, self._r[777]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[783]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[784]! } - public var Cache_Title: String { return self._s[785]! } + public var Contacts_SortedByPresence: String { return self._s[778]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[779]! } + public var Cache_Title: String { return self._s[780]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[786]!, self._r[786]!, [_0]) + return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[787]! } - public var Channel_Moderator_Title: String { return self._s[788]! } - public var InstantPage_AutoNightTheme: String { return self._s[790]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[782]! } + public var Channel_Moderator_Title: String { return self._s[783]! } + public var InstantPage_AutoNightTheme: String { return self._s[785]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[793]!, self._r[793]!, [_1]) + return formatWithArgumentRanges(self._s[788]!, self._r[788]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[794]! } - public var Undo_Undo: String { return self._s[796]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[797]! } - public var TwoStepAuth_RemovePassword: String { return self._s[798]! } - public var Common_Delete: String { return self._s[799]! } - public var Contacts_AddPeopleNearby: String { return self._s[801]! } - public var Conversation_ContextMenuDelete: String { return self._s[802]! } - public var SocksProxySetup_Credentials: String { return self._s[803]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[805]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[808]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[809]! } - public var Passport_Language_id: String { return self._s[811]! } - public var WallpaperSearch_ColorTeal: String { return self._s[812]! } - public var ChannelIntro_Title: String { return self._s[813]! } + public var Passport_Scans_Upload: String { return self._s[789]! } + public var Undo_Undo: String { return self._s[791]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[792]! } + public var TwoStepAuth_RemovePassword: String { return self._s[793]! } + public var Common_Delete: String { return self._s[794]! } + public var Contacts_AddPeopleNearby: String { return self._s[796]! } + public var Conversation_ContextMenuDelete: String { return self._s[797]! } + public var SocksProxySetup_Credentials: String { return self._s[798]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[800]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[803]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[804]! } + public var Passport_Language_id: String { return self._s[806]! } + public var WallpaperSearch_ColorTeal: String { return self._s[807]! } + public var ChannelIntro_Title: String { return self._s[808]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_0]) + return formatWithArgumentRanges(self._s[809]!, self._r[809]!, [_0]) } - public var Channel_Info_Description: String { return self._s[816]! } - public var Stickers_FavoriteStickers: String { return self._s[817]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[818]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[819]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[820]! } - public var Group_PublicLink_Placeholder: String { return self._s[821]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[822]! } + public var Channel_Info_Description: String { return self._s[811]! } + public var Stickers_FavoriteStickers: String { return self._s[812]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[813]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[814]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[815]! } + public var Group_PublicLink_Placeholder: String { return self._s[816]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[817]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[823]!, self._r[823]!, [_1]) + return formatWithArgumentRanges(self._s[818]!, self._r[818]!, [_1]) } - public var TextFormat_Underline: String { return self._s[824]! } + public var TextFormat_Underline: String { return self._s[819]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[825]!, self._r[825]!, [_1, _2]) + return formatWithArgumentRanges(self._s[820]!, self._r[820]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[826]!, self._r[826]!, [_0]) + return formatWithArgumentRanges(self._s[821]!, self._r[821]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[827]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[822]!, self._r[822]!, [_1, _2]) + } + public var GroupPermission_Delete: String { return self._s[823]! } + public var Passport_Language_uk: String { return self._s[824]! } + public var StickerPack_HideStickers: String { return self._s[826]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[827]! } + public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[828]!, self._r[828]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[829]! } - public var Passport_Language_uk: String { return self._s[830]! } - public var StickerPack_HideStickers: String { return self._s[832]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[833]! } - public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[834]!, self._r[834]!, [_1, _2]) - } - public var Activity_UploadingVideoMessage: String { return self._s[835]! } + public var Activity_UploadingVideoMessage: String { return self._s[829]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[836]!, self._r[836]!, [_0]) + return formatWithArgumentRanges(self._s[830]!, self._r[830]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[837]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[838]! } - public var Settings_CallSettings: String { return self._s[839]! } - public var Camera_SquareMode: String { return self._s[840]! } - public var GroupInfo_SharedMediaNone: String { return self._s[841]! } + public var Channel_TitleInfo: String { return self._s[831]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[832]! } + public var Settings_CallSettings: String { return self._s[833]! } + public var Camera_SquareMode: String { return self._s[834]! } + public var GroupInfo_SharedMediaNone: String { return self._s[835]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[842]!, self._r[842]!, [_1]) + return formatWithArgumentRanges(self._s[836]!, self._r[836]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[843]! } - public var Application_Update: String { return self._s[845]! } - public var Month_ShortJanuary: String { return self._s[846]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[847]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[848]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[849]! } - public var Passport_Address_Street2Placeholder: String { return self._s[850]! } + public var Bot_GenericBotStatus: String { return self._s[837]! } + public var Application_Update: String { return self._s[839]! } + public var Month_ShortJanuary: String { return self._s[840]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[841]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[842]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[843]! } + public var Passport_Address_Street2Placeholder: String { return self._s[844]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[851]!, self._r[851]!, [_0]) + return formatWithArgumentRanges(self._s[845]!, self._r[845]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[852]! } - public var Appearance_PreviewOutgoingText: String { return self._s[853]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[854]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[856]! } - public var Map_Directions: String { return self._s[857]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[859]! } - public var Appearance_ThemeDay: String { return self._s[860]! } - public var LogoutOptions_LogOut: String { return self._s[861]! } - public var Group_PublicLink_Title: String { return self._s[863]! } - public var Channel_AddBotErrorNoRights: String { return self._s[864]! } - public var Passport_Identity_AddPassport: String { return self._s[865]! } - public var LocalGroup_ButtonTitle: String { return self._s[866]! } - public var Call_Message: String { return self._s[867]! } - public var PhotoEditor_ExposureTool: String { return self._s[868]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[870]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[872]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[873]! } - public var Appearance_Preview: String { return self._s[874]! } - public var Compose_ChannelMembers: String { return self._s[875]! } - public var Conversation_DeleteManyMessages: String { return self._s[876]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[877]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[878]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[879]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[882]! } - public var Conversation_UpdateTelegram: String { return self._s[883]! } + public var NetworkUsageSettings_Cellular: String { return self._s[846]! } + public var Appearance_PreviewOutgoingText: String { return self._s[847]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[848]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[850]! } + public var Map_Directions: String { return self._s[851]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[853]! } + public var Appearance_ThemeDay: String { return self._s[854]! } + public var LogoutOptions_LogOut: String { return self._s[855]! } + public var Group_PublicLink_Title: String { return self._s[857]! } + public var Channel_AddBotErrorNoRights: String { return self._s[858]! } + public var Passport_Identity_AddPassport: String { return self._s[859]! } + public var LocalGroup_ButtonTitle: String { return self._s[860]! } + public var Call_Message: String { return self._s[861]! } + public var PhotoEditor_ExposureTool: String { return self._s[862]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[864]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[866]! } + public var Appearance_Preview: String { return self._s[867]! } + public var Compose_ChannelMembers: String { return self._s[868]! } + public var Conversation_DeleteManyMessages: String { return self._s[869]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[870]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[871]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[872]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[875]! } + public var Conversation_UpdateTelegram: String { return self._s[876]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_0]) + return formatWithArgumentRanges(self._s[877]!, self._r[877]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[885]!, self._r[885]!, [_1]) + return formatWithArgumentRanges(self._s[878]!, self._r[878]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[886]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[887]! } + public var GroupInfo_Administrators_Title: String { return self._s[879]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[880]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[888]!, self._r[888]!, [_0]) + return formatWithArgumentRanges(self._s[881]!, self._r[881]!, [_0]) } - public var Tour_Title3: String { return self._s[889]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[890]! } - public var Clipboard_SendPhoto: String { return self._s[894]! } - public var MediaPicker_Videos: String { return self._s[895]! } - public var Passport_Email_Title: String { return self._s[896]! } + public var Tour_Title3: String { return self._s[882]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[883]! } + public var Clipboard_SendPhoto: String { return self._s[887]! } + public var MediaPicker_Videos: String { return self._s[888]! } + public var Passport_Email_Title: String { return self._s[889]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[897]!, self._r[897]!, [_0]) + return formatWithArgumentRanges(self._s[890]!, self._r[890]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[898]! } - public var Conversation_MessageDialogDelete: String { return self._s[899]! } - public var Privacy_Calls_CustomHelp: String { return self._s[901]! } - public var Message_Wallpaper: String { return self._s[902]! } - public var MemberSearch_BotSection: String { return self._s[903]! } - public var GroupInfo_SetSound: String { return self._s[904]! } - public var Core_ServiceUserStatus: String { return self._s[905]! } - public var LiveLocationUpdated_JustNow: String { return self._s[906]! } - public var Call_StatusFailed: String { return self._s[907]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[908]! } - public var TwoStepAuth_SetPassword: String { return self._s[909]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[910]! } + public var StickerPacksSettings_Title: String { return self._s[891]! } + public var Conversation_MessageDialogDelete: String { return self._s[892]! } + public var Privacy_Calls_CustomHelp: String { return self._s[894]! } + public var Message_Wallpaper: String { return self._s[895]! } + public var MemberSearch_BotSection: String { return self._s[896]! } + public var GroupInfo_SetSound: String { return self._s[897]! } + public var Core_ServiceUserStatus: String { return self._s[898]! } + public var LiveLocationUpdated_JustNow: String { return self._s[899]! } + public var Call_StatusFailed: String { return self._s[900]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[901]! } + public var TwoStepAuth_SetPassword: String { return self._s[902]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[903]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[912]!, self._r[912]!, [_0]) + return formatWithArgumentRanges(self._s[905]!, self._r[905]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[913]! } - public var Profile_Username: String { return self._s[914]! } - public var Bot_DescriptionTitle: String { return self._s[915]! } - public var MaskStickerSettings_Title: String { return self._s[916]! } - public var SharedMedia_CategoryOther: String { return self._s[917]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[918]! } - public var Common_NotNow: String { return self._s[919]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[920]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[921]! } - public var Map_Location: String { return self._s[922]! } - public var Invitation_JoinGroup: String { return self._s[923]! } - public var AutoDownloadSettings_Title: String { return self._s[925]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[926]! } - public var Channel_ErrorAddBlocked: String { return self._s[927]! } - public var Conversation_UnblockUser: String { return self._s[928]! } - public var Watch_Bot_Restart: String { return self._s[929]! } - public var TwoStepAuth_Title: String { return self._s[930]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[931]! } - public var Checkout_ShippingMethod: String { return self._s[932]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[933]! } + public var Calls_SubmitRating: String { return self._s[906]! } + public var Profile_Username: String { return self._s[907]! } + public var Bot_DescriptionTitle: String { return self._s[908]! } + public var MaskStickerSettings_Title: String { return self._s[909]! } + public var SharedMedia_CategoryOther: String { return self._s[910]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[911]! } + public var Common_NotNow: String { return self._s[912]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[913]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[914]! } + public var Map_Location: String { return self._s[915]! } + public var Invitation_JoinGroup: String { return self._s[916]! } + public var AutoDownloadSettings_Title: String { return self._s[918]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[919]! } + public var Channel_ErrorAddBlocked: String { return self._s[920]! } + public var Conversation_UnblockUser: String { return self._s[921]! } + public var Watch_Bot_Restart: String { return self._s[922]! } + public var TwoStepAuth_Title: String { return self._s[923]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[924]! } + public var Checkout_ShippingMethod: String { return self._s[925]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[926]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[934]!, self._r[934]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[927]!, self._r[927]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[936]!, self._r[936]!, [_0]) + return formatWithArgumentRanges(self._s[929]!, self._r[929]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[937]!, self._r[937]!, [_0]) + return formatWithArgumentRanges(self._s[930]!, self._r[930]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[938]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[939]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[940]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[941]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[942]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[943]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[944]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[945]! } - public var Checkout_PaymentMethod_Title: String { return self._s[946]! } - public var SocksProxySetup_Connection: String { return self._s[947]! } - public var Group_MessagePhotoRemoved: String { return self._s[948]! } - public var Channel_Stickers_NotFound: String { return self._s[950]! } - public var Group_About_Help: String { return self._s[951]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[952]! } - public var PeopleNearby_Title: String { return self._s[954]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[931]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[932]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[933]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[934]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[935]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[936]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[937]! } + public var Checkout_PaymentMethod_Title: String { return self._s[938]! } + public var SocksProxySetup_Connection: String { return self._s[939]! } + public var Group_MessagePhotoRemoved: String { return self._s[940]! } + public var Channel_Stickers_NotFound: String { return self._s[942]! } + public var Group_About_Help: String { return self._s[943]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[944]! } + public var PeopleNearby_Title: String { return self._s[946]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[947]!, self._r[947]!, [_1]) + } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[949]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[950]! } + public var SocksProxySetup_Password: String { return self._s[951]! } + public var Notifications_PermissionsEnable: String { return self._s[952]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[954]! } + public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[955]!, self._r[955]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[957]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[958]! } - public var SocksProxySetup_Password: String { return self._s[959]! } - public var Notifications_PermissionsEnable: String { return self._s[960]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[962]! } - public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[963]!, self._r[963]!, [_1]) - } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[965]!, self._r[965]!, [_0]) + return formatWithArgumentRanges(self._s[957]!, self._r[957]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[966]! } - public var ArchivedPacksAlert_Title: String { return self._s[967]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[958]! } + public var ArchivedPacksAlert_Title: String { return self._s[959]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[968]!, self._r[968]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[960]!, self._r[960]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[969]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[971]! } - public var Conversation_StatusTyping: String { return self._s[972]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[973]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[974]! } - public var UserInfo_CreateNewContact: String { return self._s[975]! } - public var Passport_Identity_FrontSide: String { return self._s[976]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[977]! } - public var Calls_CallTabTitle: String { return self._s[978]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[979]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[961]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[963]! } + public var Conversation_StatusTyping: String { return self._s[964]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[965]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[966]! } + public var UserInfo_CreateNewContact: String { return self._s[967]! } + public var Passport_Identity_FrontSide: String { return self._s[968]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[969]! } + public var Calls_CallTabTitle: String { return self._s[970]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[971]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[980]!, self._r[980]!, [_0]) + return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[981]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[982]! } - public var SharedMedia_EmptyMusicText: String { return self._s[983]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[984]! } - public var Paint_Stickers: String { return self._s[985]! } - public var Privacy_GroupsAndChannels: String { return self._s[986]! } - public var UserInfo_AddContact: String { return self._s[988]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[973]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[974]! } + public var SharedMedia_EmptyMusicText: String { return self._s[975]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[976]! } + public var Paint_Stickers: String { return self._s[977]! } + public var Privacy_GroupsAndChannels: String { return self._s[978]! } + public var UserInfo_AddContact: String { return self._s[980]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[989]!, self._r[989]!, [_0]) + return formatWithArgumentRanges(self._s[981]!, self._r[981]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[991]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[983]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[993]!, self._r[993]!, [_0]) + return formatWithArgumentRanges(self._s[985]!, self._r[985]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[994]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[995]! } - public var BlockedUsers_BlockUser: String { return self._s[996]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[997]! } - public var MediaPicker_UngroupDescription: String { return self._s[998]! } - public var Watch_NoConnection: String { return self._s[999]! } - public var Month_GenSeptember: String { return self._s[1000]! } - public var Conversation_ViewGroup: String { return self._s[1001]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1004]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1005]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1006]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1007]! } - public var MediaPicker_CameraRoll: String { return self._s[1009]! } - public var Month_GenAugust: String { return self._s[1010]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1011]! } - public var SharedMedia_EmptyText: String { return self._s[1012]! } - public var Map_ShareLiveLocation: String { return self._s[1013]! } - public var Calls_All: String { return self._s[1014]! } - public var Appearance_ThemeNight: String { return self._s[1017]! } - public var Conversation_HoldForAudio: String { return self._s[1018]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1021]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1022]! } - public var SocksProxySetup_Secret: String { return self._s[1023]! } + public var DialogList_NoMessagesTitle: String { return self._s[986]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[987]! } + public var BlockedUsers_BlockUser: String { return self._s[988]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[989]! } + public var MediaPicker_UngroupDescription: String { return self._s[990]! } + public var Watch_NoConnection: String { return self._s[991]! } + public var Month_GenSeptember: String { return self._s[992]! } + public var Conversation_ViewGroup: String { return self._s[993]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[996]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[997]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[998]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[999]! } + public var MediaPicker_CameraRoll: String { return self._s[1001]! } + public var Month_GenAugust: String { return self._s[1002]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1003]! } + public var SharedMedia_EmptyText: String { return self._s[1004]! } + public var Map_ShareLiveLocation: String { return self._s[1005]! } + public var Calls_All: String { return self._s[1006]! } + public var Appearance_ThemeNight: String { return self._s[1009]! } + public var Conversation_HoldForAudio: String { return self._s[1010]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1013]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1014]! } + public var SocksProxySetup_Secret: String { return self._s[1015]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1024]!, self._r[1024]!, [_0]) + return formatWithArgumentRanges(self._s[1016]!, self._r[1016]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1026]! } - public var Conversation_Location: String { return self._s[1027]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1018]! } + public var Conversation_Location: String { return self._s[1019]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1028]!, self._r[1028]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1020]!, self._r[1020]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1030]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1031]! } - public var Notifications_PermissionsText: String { return self._s[1032]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1033]! } - public var Call_Flip: String { return self._s[1034]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1035]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1037]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1039]! } - public var Channel_TooMuchBots: String { return self._s[1041]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1042]! } - public var Login_InvalidCodeError: String { return self._s[1043]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1044]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1022]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1023]! } + public var Notifications_PermissionsText: String { return self._s[1024]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1025]! } + public var Call_Flip: String { return self._s[1026]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1027]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1029]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1031]! } + public var Channel_TooMuchBots: String { return self._s[1033]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1034]! } + public var Login_InvalidCodeError: String { return self._s[1035]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1036]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1045]!, self._r[1045]!, [_0]) + return formatWithArgumentRanges(self._s[1037]!, self._r[1037]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1046]!, self._r[1046]!, [_0]) + return formatWithArgumentRanges(self._s[1038]!, self._r[1038]!, [_0]) } - public var Call_CallInProgressTitle: String { return self._s[1047]! } - public var Month_ShortSeptember: String { return self._s[1048]! } - public var Watch_ChannelInfo_Title: String { return self._s[1049]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1052]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1053]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1054]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1055]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1056]! } - public var PhotoEditor_CropReset: String { return self._s[1057]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1059]! } - public var Channel_Management_LabelEditor: String { return self._s[1060]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1062]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1063]! } - public var UserInfo_Title: String { return self._s[1064]! } - public var ChatList_HideAction: String { return self._s[1065]! } - public var AccessDenied_Title: String { return self._s[1066]! } - public var DialogList_SearchLabel: String { return self._s[1067]! } - public var Group_Setup_HistoryHidden: String { return self._s[1068]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1069]! } - public var State_Updating: String { return self._s[1071]! } - public var Contacts_TabTitle: String { return self._s[1072]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1074]! } - public var GroupInfo_GroupHistory: String { return self._s[1075]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1076]! } - public var Wallpaper_SetColor: String { return self._s[1077]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1078]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1079]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1080]! } - public var Contacts_NotRegisteredSection: String { return self._s[1081]! } + public var Call_CallInProgressTitle: String { return self._s[1039]! } + public var Month_ShortSeptember: String { return self._s[1040]! } + public var Watch_ChannelInfo_Title: String { return self._s[1041]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1044]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1045]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1046]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1047]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1048]! } + public var PhotoEditor_CropReset: String { return self._s[1049]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1051]! } + public var Channel_Management_LabelEditor: String { return self._s[1052]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1054]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1055]! } + public var UserInfo_Title: String { return self._s[1056]! } + public var ChatList_HideAction: String { return self._s[1057]! } + public var AccessDenied_Title: String { return self._s[1058]! } + public var DialogList_SearchLabel: String { return self._s[1059]! } + public var Group_Setup_HistoryHidden: String { return self._s[1060]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1061]! } + public var State_Updating: String { return self._s[1063]! } + public var Contacts_TabTitle: String { return self._s[1064]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1066]! } + public var GroupInfo_GroupHistory: String { return self._s[1067]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1068]! } + public var Wallpaper_SetColor: String { return self._s[1069]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1070]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1071]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1072]! } + public var Contacts_NotRegisteredSection: String { return self._s[1073]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1082]!, self._r[1082]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1074]!, self._r[1074]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1083]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1084]! } - public var SocksProxySetup_Connecting: String { return self._s[1085]! } - public var ExplicitContent_AlertChannel: String { return self._s[1086]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1087]! } - public var Conversation_Contact: String { return self._s[1088]! } - public var Login_CodeExpired: String { return self._s[1089]! } - public var Passport_DiscardMessageAction: String { return self._s[1090]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1091]! } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1092]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1093]! } + public var Paint_Clear: String { return self._s[1075]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1076]! } + public var SocksProxySetup_Connecting: String { return self._s[1077]! } + public var ExplicitContent_AlertChannel: String { return self._s[1078]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1079]! } + public var Conversation_Contact: String { return self._s[1080]! } + public var Login_CodeExpired: String { return self._s[1081]! } + public var Passport_DiscardMessageAction: String { return self._s[1082]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1083]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1084]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1085]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1094]!, self._r[1094]!, [_0]) + return formatWithArgumentRanges(self._s[1086]!, self._r[1086]!, [_0]) } - public var Month_ShortApril: String { return self._s[1095]! } - public var AuthSessions_CurrentSession: String { return self._s[1096]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1099]! } - public var WallpaperPreview_CropTopText: String { return self._s[1101]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1102]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1103]! } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1104]! } - public var Channel_Setup_TypePrivate: String { return self._s[1106]! } - public var Forward_ChannelReadOnly: String { return self._s[1109]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1110]! } - public var AddContact_SharedContactException: String { return self._s[1111]! } - public var UserInfo_BotPrivacy: String { return self._s[1112]! } - public var Notification_PassportValueEmail: String { return self._s[1113]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1114]! } - public var GroupPermission_NewTitle: String { return self._s[1115]! } - public var CallFeedback_ReasonDropped: String { return self._s[1116]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1117]! } - public var Channel_SignMessages_Help: String { return self._s[1119]! } - public var Undo_ChatDeleted: String { return self._s[1121]! } - public var Conversation_ChatBackground: String { return self._s[1122]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1123]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1124]! } - public var Passport_Language_pt: String { return self._s[1125]! } - public var NotificationsSound_Popcorn: String { return self._s[1128]! } - public var AutoNightTheme_Disabled: String { return self._s[1129]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1130]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1131]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1132]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1133]! } + public var Month_ShortApril: String { return self._s[1087]! } + public var AuthSessions_CurrentSession: String { return self._s[1088]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1091]! } + public var WallpaperPreview_CropTopText: String { return self._s[1093]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1094]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1095]! } + public var Channel_Setup_TypePrivate: String { return self._s[1097]! } + public var Forward_ChannelReadOnly: String { return self._s[1100]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1101]! } + public var AddContact_SharedContactException: String { return self._s[1102]! } + public var UserInfo_BotPrivacy: String { return self._s[1103]! } + public var Notification_PassportValueEmail: String { return self._s[1104]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1105]! } + public var GroupPermission_NewTitle: String { return self._s[1106]! } + public var CallFeedback_ReasonDropped: String { return self._s[1107]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1108]! } + public var Channel_SignMessages_Help: String { return self._s[1110]! } + public var Undo_ChatDeleted: String { return self._s[1112]! } + public var Conversation_ChatBackground: String { return self._s[1113]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1114]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1115]! } + public var Passport_Language_pt: String { return self._s[1116]! } + public var NotificationsSound_Popcorn: String { return self._s[1119]! } + public var AutoNightTheme_Disabled: String { return self._s[1120]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1121]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1122]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1123]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1124]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1134]!, self._r[1134]!, [_0]) + return formatWithArgumentRanges(self._s[1125]!, self._r[1125]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1135]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1136]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1138]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1126]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1127]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1129]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1139]!, self._r[1139]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1130]!, self._r[1130]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1142]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1143]! } - public var Compose_NewEncryptedChat: String { return self._s[1144]! } - public var Login_CodeFloodError: String { return self._s[1145]! } - public var Calls_TabTitle: String { return self._s[1146]! } - public var Privacy_ProfilePhoto: String { return self._s[1147]! } - public var Passport_Language_he: String { return self._s[1148]! } - public var GroupPermission_Title: String { return self._s[1149]! } + public var SocksProxySetup_Hostname: String { return self._s[1133]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1134]! } + public var Compose_NewEncryptedChat: String { return self._s[1135]! } + public var Login_CodeFloodError: String { return self._s[1136]! } + public var Calls_TabTitle: String { return self._s[1137]! } + public var Privacy_ProfilePhoto: String { return self._s[1138]! } + public var Passport_Language_he: String { return self._s[1139]! } + public var GroupPermission_Title: String { return self._s[1140]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1150]!, self._r[1150]!, [_0]) + return formatWithArgumentRanges(self._s[1141]!, self._r[1141]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1151]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1152]! } - public var Tour_Text1: String { return self._s[1153]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1154]! } - public var Month_ShortFebruary: String { return self._s[1155]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1156]! } - public var NotificationsSound_Glass: String { return self._s[1157]! } - public var Appearance_ThemeNightBlue: String { return self._s[1158]! } - public var CheckoutInfo_Pay: String { return self._s[1159]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1161]! } - public var Call_CallAgain: String { return self._s[1163]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1164]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1165]! } - public var Passport_InvalidPasswordError: String { return self._s[1166]! } - public var Watch_Message_Game: String { return self._s[1167]! } - public var Stickers_Install: String { return self._s[1168]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1169]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1171]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1172]! } - public var AuthSessions_OtherSessions: String { return self._s[1173]! } - public var Channel_Username_Help: String { return self._s[1174]! } - public var Camera_Title: String { return self._s[1175]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1177]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1178]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1179]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1180]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1181]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1182]! } - public var Conversation_RestrictedStickers: String { return self._s[1183]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1185]! } - public var UserInfo_TelegramCall: String { return self._s[1187]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1188]! } - public var CreatePoll_OptionsHeader: String { return self._s[1189]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1190]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1191]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1192]! } - public var Appearance_ThemePreview_Chat_1_ReplyName: String { return self._s[1193]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1194]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1142]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1143]! } + public var Tour_Text1: String { return self._s[1144]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1145]! } + public var Month_ShortFebruary: String { return self._s[1146]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1147]! } + public var NotificationsSound_Glass: String { return self._s[1148]! } + public var Appearance_ThemeNightBlue: String { return self._s[1149]! } + public var CheckoutInfo_Pay: String { return self._s[1150]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1152]! } + public var Call_CallAgain: String { return self._s[1154]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1155]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1156]! } + public var Passport_InvalidPasswordError: String { return self._s[1157]! } + public var Watch_Message_Game: String { return self._s[1158]! } + public var Stickers_Install: String { return self._s[1159]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1160]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1162]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1163]! } + public var AuthSessions_OtherSessions: String { return self._s[1164]! } + public var Channel_Username_Help: String { return self._s[1165]! } + public var Camera_Title: String { return self._s[1166]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1168]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1169]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1170]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1171]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1172]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1173]! } + public var Conversation_RestrictedStickers: String { return self._s[1174]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1176]! } + public var UserInfo_TelegramCall: String { return self._s[1178]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1179]! } + public var CreatePoll_OptionsHeader: String { return self._s[1180]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1181]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1182]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1183]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1184]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1195]!, self._r[1195]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1185]!, self._r[1185]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1196]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1197]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1198]! } - public var Conversation_MessageDialogRetry: String { return self._s[1199]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1200]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1201]! } - public var Group_Setup_TypeHeader: String { return self._s[1202]! } - public var Paint_RecentStickers: String { return self._s[1203]! } - public var PhotoEditor_GrainTool: String { return self._s[1204]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1205]! } - public var EmptyGroupInfo_Line4: String { return self._s[1206]! } - public var Watch_AuthRequired: String { return self._s[1208]! } + public var Settings_SaveEditedPhotos: String { return self._s[1186]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1187]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1188]! } + public var Conversation_MessageDialogRetry: String { return self._s[1189]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1190]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1191]! } + public var Group_Setup_TypeHeader: String { return self._s[1192]! } + public var Paint_RecentStickers: String { return self._s[1193]! } + public var PhotoEditor_GrainTool: String { return self._s[1194]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1195]! } + public var EmptyGroupInfo_Line4: String { return self._s[1196]! } + public var Watch_AuthRequired: String { return self._s[1198]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1209]!, self._r[1209]!, [_0]) + return formatWithArgumentRanges(self._s[1199]!, self._r[1199]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1210]! } - public var ChannelIntro_Text: String { return self._s[1211]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1212]! } - public var GroupPermission_NoSendMedia: String { return self._s[1213]! } - public var Calls_AddTab: String { return self._s[1214]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1215]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1216]! } - public var Notification_MessageLifetime1d: String { return self._s[1217]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1218]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1219]! } - public var Passport_Identity_GenderFemale: String { return self._s[1220]! } - public var BlockedUsers_BlockTitle: String { return self._s[1221]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1200]! } + public var ChannelIntro_Text: String { return self._s[1201]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1202]! } + public var GroupPermission_NoSendMedia: String { return self._s[1203]! } + public var Calls_AddTab: String { return self._s[1204]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1205]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1206]! } + public var Notification_MessageLifetime1d: String { return self._s[1207]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1208]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1209]! } + public var Passport_Identity_GenderFemale: String { return self._s[1210]! } + public var BlockedUsers_BlockTitle: String { return self._s[1211]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1222]!, self._r[1222]!, [_1]) + return formatWithArgumentRanges(self._s[1212]!, self._r[1212]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1223]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1224]! } - public var ChatList_ArchiveAction: String { return self._s[1225]! } - public var AutoNightTheme_Scheduled: String { return self._s[1226]! } + public var Weekday_Yesterday: String { return self._s[1213]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1214]! } + public var ChatList_ArchiveAction: String { return self._s[1215]! } + public var AutoNightTheme_Scheduled: String { return self._s[1216]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1227]!, self._r[1227]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1217]!, self._r[1217]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1228]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1218]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1229]!, self._r[1229]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1219]!, self._r[1219]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1230]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1231]! } + public var CreatePoll_Create: String { return self._s[1220]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1221]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1232]!, self._r[1232]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1222]!, self._r[1222]!, [_1, _2]) } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1233]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1235]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1223]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1225]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1236]!, self._r[1236]!, [_1]) + return formatWithArgumentRanges(self._s[1226]!, self._r[1226]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1237]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1238]! } + public var Preview_OpenInInstagram: String { return self._s[1227]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1228]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1239]!, self._r[1239]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1229]!, self._r[1229]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1240]!, self._r[1240]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1230]!, self._r[1230]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1241]! } - public var ArchivedChats_IntroText3: String { return self._s[1242]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1243]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1244]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1245]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1231]! } + public var ArchivedChats_IntroText3: String { return self._s[1232]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1233]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1234]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1235]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1246]!, self._r[1246]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1236]!, self._r[1236]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1248]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1249]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1250]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1251]! } - public var Gif_NoGifsFound: String { return self._s[1252]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1253]! } - public var GroupInfo_ActionPromote: String { return self._s[1254]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1255]! } - public var GroupInfo_Permissions_Title: String { return self._s[1256]! } - public var Permissions_ContactsText_v0: String { return self._s[1257]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1258]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1261]! } - public var Passport_FieldEmailHelp: String { return self._s[1262]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1238]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1239]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1240]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1241]! } + public var Gif_NoGifsFound: String { return self._s[1242]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1243]! } + public var GroupInfo_ActionPromote: String { return self._s[1244]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1245]! } + public var GroupInfo_Permissions_Title: String { return self._s[1246]! } + public var Permissions_ContactsText_v0: String { return self._s[1247]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1248]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1251]! } + public var Passport_FieldEmailHelp: String { return self._s[1252]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1263]!, self._r[1263]!, [_0]) + return formatWithArgumentRanges(self._s[1253]!, self._r[1253]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1264]! } - public var Weekday_ShortSaturday: String { return self._s[1265]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1266]! } - public var Watch_Conversation_UserInfo: String { return self._s[1267]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1268]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1269]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1270]! } - public var PhotoEditor_VignetteTool: String { return self._s[1271]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1272]! } - public var Passport_Language_et: String { return self._s[1273]! } - public var AppUpgrade_Running: String { return self._s[1274]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1276]! } - public var Passport_Language_bg: String { return self._s[1277]! } - public var Stickers_NoStickersFound: String { return self._s[1279]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1254]! } + public var Weekday_ShortSaturday: String { return self._s[1255]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1256]! } + public var Watch_Conversation_UserInfo: String { return self._s[1257]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1258]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1259]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1260]! } + public var PhotoEditor_VignetteTool: String { return self._s[1261]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1262]! } + public var Passport_Language_et: String { return self._s[1263]! } + public var AppUpgrade_Running: String { return self._s[1264]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1266]! } + public var Passport_Language_bg: String { return self._s[1267]! } + public var Stickers_NoStickersFound: String { return self._s[1269]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_1, _2]) } - public var Settings_About: String { return self._s[1282]! } + public var Settings_About: String { return self._s[1272]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1283]!, self._r[1283]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1273]!, self._r[1273]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1285]! } - public var Group_ErrorAddBlocked: String { return self._s[1286]! } + public var KeyCommand_NewMessage: String { return self._s[1275]! } + public var Group_ErrorAddBlocked: String { return self._s[1276]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_0]) + return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1288]! } - public var ReportGroupLocation_Title: String { return self._s[1289]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1290]! } - public var Cache_ClearProgress: String { return self._s[1291]! } + public var Map_LocationTitle: String { return self._s[1278]! } + public var ReportGroupLocation_Title: String { return self._s[1279]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1280]! } + public var Cache_ClearProgress: String { return self._s[1281]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1292]!, self._r[1292]!, [_0]) + return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1293]! } - public var Passport_UpdateRequiredError: String { return self._s[1294]! } + public var GroupRemoved_AddToGroup: String { return self._s[1283]! } + public var Passport_UpdateRequiredError: String { return self._s[1284]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1295]!, self._r[1295]!, [_1]) + return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1297]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1298]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1299]! } - public var Passport_Language_ka: String { return self._s[1300]! } - public var Call_Decline: String { return self._s[1301]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1302]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1287]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1288]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1289]! } + public var Passport_Language_ka: String { return self._s[1290]! } + public var Call_Decline: String { return self._s[1291]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1292]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1305]!, self._r[1305]!, [_0]) + return formatWithArgumentRanges(self._s[1295]!, self._r[1295]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1306]! } + public var CallFeedback_Send: String { return self._s[1296]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1307]!, self._r[1307]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1297]!, self._r[1297]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1308]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1310]! } - public var Passport_DeletePassport: String { return self._s[1311]! } - public var Appearance_AppIconFilled: String { return self._s[1312]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1313]! } - public var Month_ShortDecember: String { return self._s[1314]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1316]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1298]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1300]! } + public var Passport_DeletePassport: String { return self._s[1301]! } + public var Appearance_AppIconFilled: String { return self._s[1302]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1303]! } + public var Month_ShortDecember: String { return self._s[1304]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1306]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1317]!, self._r[1317]!, [_0]) + return formatWithArgumentRanges(self._s[1307]!, self._r[1307]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1318]! } - public var Conversation_EncryptedDescription1: String { return self._s[1319]! } - public var Conversation_EncryptedDescription2: String { return self._s[1320]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1321]! } - public var Conversation_EncryptedDescription3: String { return self._s[1322]! } - public var PhotoEditor_SharpenTool: String { return self._s[1323]! } + public var Channel_Stickers_Searching: String { return self._s[1308]! } + public var Conversation_EncryptedDescription1: String { return self._s[1309]! } + public var Conversation_EncryptedDescription2: String { return self._s[1310]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1311]! } + public var Conversation_EncryptedDescription3: String { return self._s[1312]! } + public var PhotoEditor_SharpenTool: String { return self._s[1313]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1324]!, self._r[1324]!, [_0]) + return formatWithArgumentRanges(self._s[1314]!, self._r[1314]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1326]! } - public var Channel_Members_AddMembers: String { return self._s[1327]! } - public var Wallpaper_Search: String { return self._s[1328]! } - public var Weekday_Friday: String { return self._s[1329]! } - public var Privacy_ContactsSync: String { return self._s[1330]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1331]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1332]! } + public var Conversation_EncryptedDescription4: String { return self._s[1316]! } + public var Channel_Members_AddMembers: String { return self._s[1317]! } + public var Wallpaper_Search: String { return self._s[1318]! } + public var Weekday_Friday: String { return self._s[1319]! } + public var Privacy_ContactsSync: String { return self._s[1320]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1321]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1322]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_0]) + return formatWithArgumentRanges(self._s[1323]!, self._r[1323]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1334]! } - public var Passport_Identity_GenderMale: String { return self._s[1335]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1324]! } + public var Passport_Identity_GenderMale: String { return self._s[1325]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1336]!, self._r[1336]!, [_0]) + return formatWithArgumentRanges(self._s[1326]!, self._r[1326]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1337]! } - public var Conversation_JumpToDate: String { return self._s[1338]! } - public var Contacts_GlobalSearch: String { return self._s[1339]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1340]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1341]! } - public var Profile_MessageLifetime1d: String { return self._s[1342]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1327]! } + public var Conversation_JumpToDate: String { return self._s[1328]! } + public var Contacts_GlobalSearch: String { return self._s[1329]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1330]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1331]! } + public var Profile_MessageLifetime1d: String { return self._s[1332]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1343]!, self._r[1343]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1346]! } + public var StickerPack_BuiltinPackName: String { return self._s[1336]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1337]!, self._r[1337]!, [_1, _2]) } - public var Passport_InfoTitle: String { return self._s[1349]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1350]! } + public var Passport_InfoTitle: String { return self._s[1339]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1340]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_0]) + return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1355]!, self._r[1355]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1345]!, self._r[1345]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1356]! } - public var Profile_BotInfo: String { return self._s[1357]! } - public var Watch_Compose_CreateMessage: String { return self._s[1358]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1359]! } - public var Month_ShortNovember: String { return self._s[1360]! } - public var Conversation_ScamWarning: String { return self._s[1361]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1362]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1363]! } - public var NotificationsSound_Chime: String { return self._s[1364]! } - public var Passport_Language_ko: String { return self._s[1366]! } - public var InviteText_URL: String { return self._s[1367]! } - public var TextFormat_Monospace: String { return self._s[1368]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1346]! } + public var Profile_BotInfo: String { return self._s[1347]! } + public var Watch_Compose_CreateMessage: String { return self._s[1348]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1349]! } + public var Month_ShortNovember: String { return self._s[1350]! } + public var Conversation_ScamWarning: String { return self._s[1351]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1352]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1353]! } + public var NotificationsSound_Chime: String { return self._s[1354]! } + public var Passport_Language_ko: String { return self._s[1356]! } + public var InviteText_URL: String { return self._s[1357]! } + public var TextFormat_Monospace: String { return self._s[1358]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1359]!, self._r[1359]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1370]!, self._r[1370]!, [_0]) + return formatWithArgumentRanges(self._s[1360]!, self._r[1360]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1371]!, self._r[1371]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1361]!, self._r[1361]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1373]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1374]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1375]! } - public var Your_card_has_expired: String { return self._s[1376]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1377]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1378]! } - public var Conversation_Report: String { return self._s[1382]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1383]! } - public var Notification_MessageLifetime1m: String { return self._s[1384]! } - public var Privacy_ContactsTitle: String { return self._s[1385]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1386]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1387]! } - public var Channel_Members_Title: String { return self._s[1388]! } - public var Map_OpenInWaze: String { return self._s[1389]! } - public var Login_PhoneBannedError: String { return self._s[1390]! } + public var Passport_InfoLearnMore: String { return self._s[1363]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1364]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1365]! } + public var Your_card_has_expired: String { return self._s[1366]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1367]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1368]! } + public var Conversation_Report: String { return self._s[1372]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1373]! } + public var Notification_MessageLifetime1m: String { return self._s[1374]! } + public var Privacy_ContactsTitle: String { return self._s[1375]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1376]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1377]! } + public var Channel_Members_Title: String { return self._s[1378]! } + public var Map_OpenInWaze: String { return self._s[1379]! } + public var Login_PhoneBannedError: String { return self._s[1380]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1391]!, self._r[1391]!, [_0]) + return formatWithArgumentRanges(self._s[1381]!, self._r[1381]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1392]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1393]! } - public var Common_OK: String { return self._s[1394]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1395]! } - public var Cache_Music: String { return self._s[1396]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1397]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1398]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1399]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1382]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1383]! } + public var Common_OK: String { return self._s[1384]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1385]! } + public var Cache_Music: String { return self._s[1386]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1387]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1388]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1389]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1400]!, self._r[1400]!, [_1]) + return formatWithArgumentRanges(self._s[1390]!, self._r[1390]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1401]!, self._r[1401]!, [_0]) + return formatWithArgumentRanges(self._s[1391]!, self._r[1391]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1403]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1404]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1406]! } - public var State_ConnectingToProxyInfo: String { return self._s[1407]! } - public var Message_VideoMessage: String { return self._s[1409]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1410]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1411]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1412]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1413]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1414]! } - public var Activity_RecordingAudio: String { return self._s[1415]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1416]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1417]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1393]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1394]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1396]! } + public var State_ConnectingToProxyInfo: String { return self._s[1397]! } + public var Message_VideoMessage: String { return self._s[1399]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1400]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1401]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1402]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1403]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1404]! } + public var Activity_RecordingAudio: String { return self._s[1405]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1406]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1407]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1419]!, self._r[1419]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1409]!, self._r[1409]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0]) + return formatWithArgumentRanges(self._s[1413]!, self._r[1413]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1424]! } - public var UserInfo_AddPhone: String { return self._s[1425]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1426]! } + public var Conversation_ApplyLocalization: String { return self._s[1414]! } + public var UserInfo_AddPhone: String { return self._s[1415]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1416]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_0]) + return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_0]) } - public var Passport_Scans: String { return self._s[1429]! } - public var BlockedUsers_Unblock: String { return self._s[1430]! } + public var Passport_Scans: String { return self._s[1419]! } + public var BlockedUsers_Unblock: String { return self._s[1420]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1431]!, self._r[1431]!, [_1]) + return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1432]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1433]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1434]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1435]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1436]! } + public var Channel_Management_LabelCreator: String { return self._s[1422]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1423]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1424]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1425]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1426]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1437]!, self._r[1437]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1438]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1439]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1440]! } - public var ChannelIntro_CreateChannel: String { return self._s[1441]! } - public var Conversation_UnreadMessages: String { return self._s[1442]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1443]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1444]! } - public var Notification_GroupActivated: String { return self._s[1445]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1446]! } + public var Login_PhoneNumberHelp: String { return self._s[1428]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1429]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1430]! } + public var ChannelIntro_CreateChannel: String { return self._s[1431]! } + public var Conversation_UnreadMessages: String { return self._s[1432]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1433]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1434]! } + public var Notification_GroupActivated: String { return self._s[1435]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1436]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_0]) + return formatWithArgumentRanges(self._s[1437]!, self._r[1437]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1438]!, self._r[1438]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1450]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1440]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_0]) + return formatWithArgumentRanges(self._s[1441]!, self._r[1441]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1452]! } - public var CallFeedback_AddComment: String { return self._s[1453]! } + public var Undo_DeletedChannel: String { return self._s[1442]! } + public var CallFeedback_AddComment: String { return self._s[1443]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1454]!, self._r[1454]!, [_0]) + return formatWithArgumentRanges(self._s[1444]!, self._r[1444]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1455]! } + public var Document_TargetConfirmationFormat: String { return self._s[1445]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1456]!, self._r[1456]!, [_0]) + return formatWithArgumentRanges(self._s[1446]!, self._r[1446]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1457]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1447]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1458]!, self._r[1458]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1459]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1460]! } + public var Contacts_SortByName: String { return self._s[1449]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1450]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1462]!, self._r[1462]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1452]!, self._r[1452]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1463]! } - public var Conversation_ClearSelfHistory: String { return self._s[1464]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1465]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1466]! } - public var Stickers_SuggestNone: String { return self._s[1467]! } - public var ChatSettings_Cache: String { return self._s[1468]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1469]! } - public var Media_ShareThisPhoto: String { return self._s[1470]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1471]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1472]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1473]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1474]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1475]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1476]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1477]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1479]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1480]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1481]! } - public var Map_OpenIn: String { return self._s[1482]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1453]! } + public var Conversation_ClearSelfHistory: String { return self._s[1454]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1455]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1456]! } + public var Stickers_SuggestNone: String { return self._s[1457]! } + public var ChatSettings_Cache: String { return self._s[1458]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1459]! } + public var Media_ShareThisPhoto: String { return self._s[1460]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1461]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1462]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1463]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1464]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1465]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1466]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1467]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1469]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1470]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1471]! } + public var Map_OpenIn: String { return self._s[1472]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1485]!, self._r[1485]!, [_1]) + return formatWithArgumentRanges(self._s[1475]!, self._r[1475]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1486]!, self._r[1486]!, [_0]) + return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1487]! } - public var MessagePoll_LabelClosed: String { return self._s[1488]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1490]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1491]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1492]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1493]! } - public var Login_SelectCountry_Title: String { return self._s[1494]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1495]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1477]! } + public var MessagePoll_LabelClosed: String { return self._s[1478]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1480]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1481]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1482]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1483]! } + public var Login_SelectCountry_Title: String { return self._s[1484]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1485]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1496]!, self._r[1496]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1486]!, self._r[1486]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1497]! } - public var Watch_Suggestion_BRB: String { return self._s[1498]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1499]! } - public var Contacts_PermissionsTitle: String { return self._s[1500]! } - public var Conversation_RestrictedInline: String { return self._s[1501]! } - public var StickerPack_ViewPack: String { return self._s[1503]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1487]! } + public var Watch_Suggestion_BRB: String { return self._s[1488]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1489]! } + public var Contacts_PermissionsTitle: String { return self._s[1490]! } + public var Conversation_RestrictedInline: String { return self._s[1491]! } + public var StickerPack_ViewPack: String { return self._s[1493]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_0]) + return formatWithArgumentRanges(self._s[1494]!, self._r[1494]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1506]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1509]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1511]! } - public var Channel_Info_Stickers: String { return self._s[1512]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1513]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1514]! } - public var Passport_DeletePersonalDetails: String { return self._s[1515]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1516]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1517]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1518]! } - public var Conversation_SearchNoResults: String { return self._s[1520]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1521]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1522]! } - public var Login_Code: String { return self._s[1523]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1524]! } - public var Weekday_ShortThursday: String { return self._s[1525]! } - public var Resolve_ErrorNotFound: String { return self._s[1527]! } - public var LastSeen_Offline: String { return self._s[1528]! } - public var PeopleNearby_NoMembers: String { return self._s[1529]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1530]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1531]! } - public var GroupInfo_Title: String { return self._s[1532]! } - public var NotificationsSound_Note: String { return self._s[1533]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1534]! } - public var Watch_Message_Poll: String { return self._s[1535]! } - public var Privacy_Calls: String { return self._s[1536]! } - public var Month_ShortAugust: String { return self._s[1537]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1538]! } - public var Notifications_Reset: String { return self._s[1539]! } - public var Conversation_Pin: String { return self._s[1540]! } - public var Passport_Language_lv: String { return self._s[1541]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1542]! } - public var BlockedUsers_Info: String { return self._s[1543]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1545]! } - public var Watch_Conversation_Unblock: String { return self._s[1547]! } + public var Compose_NewChannel: String { return self._s[1496]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1499]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1501]! } + public var Channel_Info_Stickers: String { return self._s[1502]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1503]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1504]! } + public var Passport_DeletePersonalDetails: String { return self._s[1505]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1506]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1507]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1508]! } + public var Conversation_SearchNoResults: String { return self._s[1510]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1511]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1512]! } + public var Login_Code: String { return self._s[1513]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1514]! } + public var Weekday_ShortThursday: String { return self._s[1515]! } + public var Resolve_ErrorNotFound: String { return self._s[1517]! } + public var LastSeen_Offline: String { return self._s[1518]! } + public var PeopleNearby_NoMembers: String { return self._s[1519]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1520]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1521]! } + public var GroupInfo_Title: String { return self._s[1522]! } + public var NotificationsSound_Note: String { return self._s[1523]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1524]! } + public var Watch_Message_Poll: String { return self._s[1525]! } + public var Privacy_Calls: String { return self._s[1526]! } + public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1527]!, self._r[1527]!, [_1, _2, _3]) + } + public var Month_ShortAugust: String { return self._s[1528]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1529]! } + public var Notifications_Reset: String { return self._s[1530]! } + public var Conversation_Pin: String { return self._s[1531]! } + public var Passport_Language_lv: String { return self._s[1532]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1533]! } + public var BlockedUsers_Info: String { return self._s[1534]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1536]! } + public var Watch_Conversation_Unblock: String { return self._s[1538]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1548]!, self._r[1548]!, [_0]) + return formatWithArgumentRanges(self._s[1539]!, self._r[1539]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1549]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1550]! } + public var CloudStorage_Title: String { return self._s[1540]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1541]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1551]!, self._r[1551]!, [_0]) + return formatWithArgumentRanges(self._s[1542]!, self._r[1542]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1552]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1553]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1554]! } - public var Passport_Address_EditBankStatement: String { return self._s[1555]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1543]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1544]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1545]! } + public var Passport_Address_EditBankStatement: String { return self._s[1546]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1556]!, self._r[1556]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1547]!, self._r[1547]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1557]! } - public var ShareMenu_Comment: String { return self._s[1558]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1559]! } - public var Notifications_PermissionsTitle: String { return self._s[1560]! } - public var GroupPermission_NoSendLinks: String { return self._s[1561]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1562]! } - public var Settings_Support: String { return self._s[1563]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1564]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1565]! } - public var Privacy_Forwards_Preview: String { return self._s[1566]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1567]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1568]! } - public var Common_Select: String { return self._s[1570]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1571]! } - public var WallpaperSearch_ColorGray: String { return self._s[1573]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1574]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1575]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1576]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1577]! } - public var Widget_AuthRequired: String { return self._s[1578]! } - public var Camera_FlashOn: String { return self._s[1579]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1580]! } - public var Watch_Suggestion_OK: String { return self._s[1581]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1548]! } + public var ShareMenu_Comment: String { return self._s[1549]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1550]! } + public var Notifications_PermissionsTitle: String { return self._s[1551]! } + public var GroupPermission_NoSendLinks: String { return self._s[1552]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1553]! } + public var Settings_Support: String { return self._s[1554]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1555]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1556]! } + public var Privacy_Forwards_Preview: String { return self._s[1557]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1558]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1559]! } + public var Common_Select: String { return self._s[1561]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1562]! } + public var WallpaperSearch_ColorGray: String { return self._s[1564]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1565]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1566]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1567]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1568]! } + public var Widget_AuthRequired: String { return self._s[1569]! } + public var Camera_FlashOn: String { return self._s[1570]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1571]! } + public var Watch_Suggestion_OK: String { return self._s[1572]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1583]!, self._r[1583]!, [_0]) + return formatWithArgumentRanges(self._s[1574]!, self._r[1574]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1585]!, self._r[1585]!, [_0]) + return formatWithArgumentRanges(self._s[1576]!, self._r[1576]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1586]! } - public var DialogList_AdLabel: String { return self._s[1587]! } - public var WatchRemote_NotificationText: String { return self._s[1588]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1589]! } - public var Conversation_ReportSpam: String { return self._s[1590]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1591]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1593]! } - public var PhoneLabel_Title: String { return self._s[1594]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1595]! } - public var Settings_ChangePhoneNumber: String { return self._s[1596]! } - public var Notifications_ExceptionsTitle: String { return self._s[1597]! } - public var Notifications_AlertTones: String { return self._s[1598]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1599]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1600]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1601]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1603]! } - public var ReportPeer_ReasonOther: String { return self._s[1604]! } - public var KeyCommand_ScrollDown: String { return self._s[1606]! } + public var TextFormat_Strikethrough: String { return self._s[1577]! } + public var DialogList_AdLabel: String { return self._s[1578]! } + public var WatchRemote_NotificationText: String { return self._s[1579]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1580]! } + public var Conversation_ReportSpam: String { return self._s[1581]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1582]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1584]! } + public var PhoneLabel_Title: String { return self._s[1585]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1586]! } + public var Settings_ChangePhoneNumber: String { return self._s[1587]! } + public var Notifications_ExceptionsTitle: String { return self._s[1588]! } + public var Notifications_AlertTones: String { return self._s[1589]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1590]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1591]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1592]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1594]! } + public var ReportPeer_ReasonOther: String { return self._s[1595]! } + public var KeyCommand_ScrollDown: String { return self._s[1597]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_0]) + return formatWithArgumentRanges(self._s[1598]!, self._r[1598]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1608]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1609]! } - public var AuthSessions_LogOut: String { return self._s[1610]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1611]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1612]! } - public var Passport_Phone_Title: String { return self._s[1613]! } - public var Settings_PhoneNumber: String { return self._s[1614]! } - public var NotificationsSound_Alert: String { return self._s[1615]! } - public var WebSearch_SearchNoResults: String { return self._s[1616]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1618]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1619]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1620]! } - public var PhotoEditor_CurvesTool: String { return self._s[1621]! } - public var Checkout_PaymentMethod: String { return self._s[1623]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1599]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1600]! } + public var AuthSessions_LogOut: String { return self._s[1601]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1602]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1603]! } + public var Passport_Phone_Title: String { return self._s[1604]! } + public var Settings_PhoneNumber: String { return self._s[1605]! } + public var NotificationsSound_Alert: String { return self._s[1606]! } + public var WebSearch_SearchNoResults: String { return self._s[1607]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1609]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1610]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1611]! } + public var PhotoEditor_CurvesTool: String { return self._s[1612]! } + public var Checkout_PaymentMethod: String { return self._s[1614]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1624]!, self._r[1624]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1615]!, self._r[1615]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1625]! } - public var Camera_PhotoMode: String { return self._s[1628]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1629]! } - public var CallSettings_OnMobile: String { return self._s[1630]! } - public var Tour_Text2: String { return self._s[1631]! } + public var Contacts_AccessDeniedError: String { return self._s[1616]! } + public var Camera_PhotoMode: String { return self._s[1619]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1620]! } + public var CallSettings_OnMobile: String { return self._s[1621]! } + public var Tour_Text2: String { return self._s[1622]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1632]!, self._r[1632]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1623]!, self._r[1623]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1634]! } - public var Permissions_Skip: String { return self._s[1635]! } - public var SecretImage_Title: String { return self._s[1636]! } - public var Watch_MessageView_Title: String { return self._s[1637]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1638]! } - public var AttachmentMenu_Poll: String { return self._s[1639]! } + public var DialogList_EncryptionProcessing: String { return self._s[1625]! } + public var Permissions_Skip: String { return self._s[1626]! } + public var SecretImage_Title: String { return self._s[1627]! } + public var Watch_MessageView_Title: String { return self._s[1628]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1629]! } + public var AttachmentMenu_Poll: String { return self._s[1630]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1640]!, self._r[1640]!, [_0]) + return formatWithArgumentRanges(self._s[1631]!, self._r[1631]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1641]!, self._r[1641]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1632]!, self._r[1632]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1642]! } - public var WallpaperPreview_Title: String { return self._s[1643]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1644]! } - public var Settings_ProxyConnecting: String { return self._s[1645]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1647]! } - public var Profile_MessageLifetime5s: String { return self._s[1648]! } - public var Username_InvalidCharacters: String { return self._s[1649]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1650]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1651]! } - public var Settings_AddAccount: String { return self._s[1652]! } - public var Notification_CreatedChannel: String { return self._s[1655]! } + public var Notification_CallCanceled: String { return self._s[1633]! } + public var WallpaperPreview_Title: String { return self._s[1634]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1635]! } + public var Settings_ProxyConnecting: String { return self._s[1636]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1638]! } + public var Profile_MessageLifetime5s: String { return self._s[1639]! } + public var Username_InvalidCharacters: String { return self._s[1640]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1641]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1642]! } + public var Settings_AddAccount: String { return self._s[1643]! } + public var Notification_CreatedChannel: String { return self._s[1646]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1656]!, self._r[1656]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1647]!, self._r[1647]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1658]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1659]! } - public var Contacts_TopSection: String { return self._s[1660]! } + public var Passcode_AppLockedAlert: String { return self._s[1649]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1650]! } + public var Contacts_TopSection: String { return self._s[1651]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1661]!, self._r[1661]!, [_0]) + return formatWithArgumentRanges(self._s[1652]!, self._r[1652]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1662]! } - public var UserInfo_TapToCall: String { return self._s[1663]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1665]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1666]! } - public var Common_Search: String { return self._s[1667]! } + public var ReportPeer_ReasonSpam: String { return self._s[1653]! } + public var UserInfo_TapToCall: String { return self._s[1654]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1656]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1657]! } + public var Common_Search: String { return self._s[1658]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1668]!, self._r[1668]!, [_0]) + return formatWithArgumentRanges(self._s[1659]!, self._r[1659]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1669]! } - public var Message_InvoiceLabel: String { return self._s[1670]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1671]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1672]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1660]! } + public var Message_InvoiceLabel: String { return self._s[1661]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1662]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1663]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1673]!, self._r[1673]!, [_0]) + return formatWithArgumentRanges(self._s[1664]!, self._r[1664]!, [_0]) } - public var Conversation_Info: String { return self._s[1674]! } - public var Login_InfoDeletePhoto: String { return self._s[1675]! } - public var Passport_Language_vi: String { return self._s[1677]! } - public var UserInfo_ScamUserWarning: String { return self._s[1678]! } - public var Conversation_Search: String { return self._s[1679]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1680]! } - public var ReportPeer_ReasonPornography: String { return self._s[1681]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1682]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1683]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1684]! } - public var Channel_Setup_TypeHeader: String { return self._s[1685]! } - public var AuthSessions_LoggedIn: String { return self._s[1686]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1687]! } - public var Login_SmsRequestState3: String { return self._s[1688]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1689]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1690]! } - public var Join_ChannelsTooMuch: String { return self._s[1691]! } - public var Channel_Edit_LinkItem: String { return self._s[1692]! } - public var Privacy_Calls_P2PNever: String { return self._s[1693]! } - public var Conversation_AddToReadingList: String { return self._s[1695]! } - public var Message_Animation: String { return self._s[1696]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1697]! } - public var Map_Unknown: String { return self._s[1698]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1699]! } + public var Conversation_Info: String { return self._s[1665]! } + public var Login_InfoDeletePhoto: String { return self._s[1666]! } + public var Passport_Language_vi: String { return self._s[1668]! } + public var UserInfo_ScamUserWarning: String { return self._s[1669]! } + public var Conversation_Search: String { return self._s[1670]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1671]! } + public var ReportPeer_ReasonPornography: String { return self._s[1672]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1673]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1674]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1675]! } + public var Channel_Setup_TypeHeader: String { return self._s[1676]! } + public var AuthSessions_LoggedIn: String { return self._s[1677]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1678]! } + public var Login_SmsRequestState3: String { return self._s[1679]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1680]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1681]! } + public var Join_ChannelsTooMuch: String { return self._s[1682]! } + public var Channel_Edit_LinkItem: String { return self._s[1683]! } + public var Privacy_Calls_P2PNever: String { return self._s[1684]! } + public var Conversation_AddToReadingList: String { return self._s[1686]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1687]! } + public var Message_Animation: String { return self._s[1688]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1689]! } + public var Map_Unknown: String { return self._s[1690]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1691]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1700]!, self._r[1700]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1692]!, self._r[1692]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1702]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1703]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1704]! } + public var Call_StatusRequesting: String { return self._s[1694]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1695]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1696]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1697]!, self._r[1697]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_0]) + return formatWithArgumentRanges(self._s[1698]!, self._r[1698]!, [_0]) } - public var Update_Skip: String { return self._s[1707]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1708]! } - public var Message_PinnedPollMessage: String { return self._s[1709]! } - public var BlockedUsers_Title: String { return self._s[1710]! } + public var Update_Skip: String { return self._s[1699]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1700]! } + public var Message_PinnedPollMessage: String { return self._s[1701]! } + public var BlockedUsers_Title: String { return self._s[1702]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1711]!, self._r[1711]!, [_1]) + return formatWithArgumentRanges(self._s[1703]!, self._r[1703]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1712]! } - public var NotificationsSound_Bell: String { return self._s[1713]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1714]! } - public var Weekday_Monday: String { return self._s[1715]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1716]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1717]! } - public var ChatSettings_Groups: String { return self._s[1718]! } - public var Your_card_was_declined: String { return self._s[1719]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1721]! } - public var ChatList_Unmute: String { return self._s[1722]! } - public var PhotoEditor_CurvesAll: String { return self._s[1723]! } - public var Weekday_ShortTuesday: String { return self._s[1724]! } - public var DialogList_Read: String { return self._s[1725]! } - public var Appearance_AppIconClassic: String { return self._s[1726]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1727]! } - public var Passport_Identity_Gender: String { return self._s[1728]! } + public var Username_CheckingUsername: String { return self._s[1704]! } + public var NotificationsSound_Bell: String { return self._s[1705]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1706]! } + public var Weekday_Monday: String { return self._s[1707]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1708]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1709]! } + public var ChatSettings_Groups: String { return self._s[1710]! } + public var Your_card_was_declined: String { return self._s[1711]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1713]! } + public var ChatList_Unmute: String { return self._s[1714]! } + public var PhotoEditor_CurvesAll: String { return self._s[1715]! } + public var Weekday_ShortTuesday: String { return self._s[1716]! } + public var DialogList_Read: String { return self._s[1717]! } + public var Appearance_AppIconClassic: String { return self._s[1718]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1719]! } + public var Passport_Identity_Gender: String { return self._s[1720]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1729]!, self._r[1729]!, [_0]) + return formatWithArgumentRanges(self._s[1721]!, self._r[1721]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1730]! } + public var Target_SelectGroup: String { return self._s[1722]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1732]!, self._r[1732]!, [_0]) + return formatWithArgumentRanges(self._s[1724]!, self._r[1724]!, [_0]) } - public var Passport_Language_en: String { return self._s[1733]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1734]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1735]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1736]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1738]! } - public var Login_InfoHelp: String { return self._s[1739]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1740]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1741]! } + public var Passport_Language_en: String { return self._s[1725]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1726]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1727]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1728]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1730]! } + public var Login_InfoHelp: String { return self._s[1731]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1732]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1733]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1742]!, self._r[1742]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1745]! } - public var CreatePoll_Title: String { return self._s[1746]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1747]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1748]! } - public var UserInfo_GroupsInCommon: String { return self._s[1749]! } - public var Call_AudioRouteHide: String { return self._s[1750]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1752]! } + public var SocksProxySetup_AddProxy: String { return self._s[1737]! } + public var CreatePoll_Title: String { return self._s[1738]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1739]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1740]! } + public var UserInfo_GroupsInCommon: String { return self._s[1741]! } + public var Call_AudioRouteHide: String { return self._s[1742]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1744]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1753]!, self._r[1753]!, [_0]) + return formatWithArgumentRanges(self._s[1745]!, self._r[1745]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1754]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1755]! } - public var Notifications_Title: String { return self._s[1756]! } - public var Group_Username_InvalidTooShort: String { return self._s[1757]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1758]! } + public var TextFormat_Bold: String { return self._s[1746]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1747]! } + public var Notifications_Title: String { return self._s[1748]! } + public var Group_Username_InvalidTooShort: String { return self._s[1749]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1750]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1759]!, self._r[1759]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1751]!, self._r[1751]!, ["\(_0)"]) } - public var Stickers_SuggestAdded: String { return self._s[1761]! } - public var Login_CountryCode: String { return self._s[1762]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1763]! } - public var Map_GetDirections: String { return self._s[1764]! } - public var Login_PhoneFloodError: String { return self._s[1765]! } + public var Stickers_SuggestAdded: String { return self._s[1753]! } + public var Login_CountryCode: String { return self._s[1754]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1755]! } + public var Map_GetDirections: String { return self._s[1756]! } + public var Login_PhoneFloodError: String { return self._s[1757]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1766]!, self._r[1766]!, [_0]) + return formatWithArgumentRanges(self._s[1758]!, self._r[1758]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1768]! } - public var Group_Location_ChangeLocation: String { return self._s[1769]! } - public var Notification_GroupInviterSelf: String { return self._s[1770]! } - public var InstantPage_TapToOpenLink: String { return self._s[1771]! } + public var Settings_SetUsername: String { return self._s[1760]! } + public var Group_Location_ChangeLocation: String { return self._s[1761]! } + public var Notification_GroupInviterSelf: String { return self._s[1762]! } + public var InstantPage_TapToOpenLink: String { return self._s[1763]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_0]) + return formatWithArgumentRanges(self._s[1764]!, self._r[1764]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1773]! } - public var SecretChat_Title: String { return self._s[1774]! } - public var Group_UpgradeNoticeText1: String { return self._s[1775]! } - public var AuthSessions_Title: String { return self._s[1776]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1765]! } + public var SecretChat_Title: String { return self._s[1766]! } + public var Group_UpgradeNoticeText1: String { return self._s[1767]! } + public var AuthSessions_Title: String { return self._s[1768]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_0]) + return formatWithArgumentRanges(self._s[1769]!, self._r[1769]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1778]! } - public var Channel_About_Title: String { return self._s[1779]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1780]! } + public var PhotoEditor_CropAuto: String { return self._s[1770]! } + public var Channel_About_Title: String { return self._s[1771]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1772]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, ["\(_0)"]) } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1784]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1785]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1776]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1777]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1786]!, self._r[1786]!, [_1]) + return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1788]!, self._r[1788]!, [_0]) + return formatWithArgumentRanges(self._s[1780]!, self._r[1780]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1789]!, self._r[1789]!, [_0]) + return formatWithArgumentRanges(self._s[1781]!, self._r[1781]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1790]! } - public var Presence_online: String { return self._s[1792]! } - public var PasscodeSettings_Title: String { return self._s[1793]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1794]! } - public var Web_OpenExternal: String { return self._s[1795]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1797]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1798]! } - public var LocalGroup_Title: String { return self._s[1799]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1782]! } + public var Presence_online: String { return self._s[1784]! } + public var PasscodeSettings_Title: String { return self._s[1785]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1786]! } + public var Web_OpenExternal: String { return self._s[1787]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1789]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1790]! } + public var LocalGroup_Title: String { return self._s[1791]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_0]) + return formatWithArgumentRanges(self._s[1792]!, self._r[1792]!, [_0]) } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1801]! } - public var Map_YouAreHere: String { return self._s[1802]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1793]! } + public var Map_YouAreHere: String { return self._s[1794]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1803]!, self._r[1803]!, [_0]) + return formatWithArgumentRanges(self._s[1795]!, self._r[1795]!, [_0]) } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1804]!, self._r[1804]!, [_0]) + return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1805]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1806]! } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1797]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1798]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1807]!, self._r[1807]!, [_0]) + return formatWithArgumentRanges(self._s[1799]!, self._r[1799]!, [_0]) } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1808]!, self._r[1808]!, [_0]) + return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1809]! } - public var Bot_Start: String { return self._s[1810]! } + public var SocksProxySetup_Username: String { return self._s[1801]! } + public var Bot_Start: String { return self._s[1802]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1811]!, self._r[1811]!, [_0]) + return formatWithArgumentRanges(self._s[1803]!, self._r[1803]!, [_0]) } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1812]!, self._r[1812]!, [_0]) + return formatWithArgumentRanges(self._s[1804]!, self._r[1804]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1813]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1815]! } + public var Contacts_SortByPresence: String { return self._s[1805]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1807]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1816]!, self._r[1816]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1808]!, self._r[1808]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1817]!, self._r[1817]!, [_0]) + return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1818]!, self._r[1818]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1810]!, self._r[1810]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1819]! } - public var Login_InfoAvatarPhoto: String { return self._s[1820]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1821]! } - public var Tour_Title4: String { return self._s[1822]! } - public var Passport_Identity_Translation: String { return self._s[1823]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1824]! } - public var Login_TermsOfServiceLabel: String { return self._s[1826]! } - public var Passport_Language_it: String { return self._s[1827]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1828]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1829]! } - public var Conversation_ClearAll: String { return self._s[1831]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1833]! } - public var TwoStepAuth_FloodError: String { return self._s[1834]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1811]! } + public var Login_InfoAvatarPhoto: String { return self._s[1812]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1813]! } + public var Tour_Title4: String { return self._s[1814]! } + public var Passport_Identity_Translation: String { return self._s[1815]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1816]! } + public var Login_TermsOfServiceLabel: String { return self._s[1818]! } + public var Passport_Language_it: String { return self._s[1819]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1820]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1821]! } + public var Conversation_ClearAll: String { return self._s[1823]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1825]! } + public var TwoStepAuth_FloodError: String { return self._s[1826]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1835]!, self._r[1835]!, [_1]) + return formatWithArgumentRanges(self._s[1827]!, self._r[1827]!, [_1]) } - public var Paint_Delete: String { return self._s[1836]! } - public var Privacy_AddNewPeer: String { return self._s[1837]! } - public var LogoutOptions_SetPasscodeText: String { return self._s[1838]! } + public var Paint_Delete: String { return self._s[1828]! } + public var Privacy_AddNewPeer: String { return self._s[1829]! } + public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1830]!, self._r[1830]!, [_1]) + } + public var LogoutOptions_SetPasscodeText: String { return self._s[1831]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1839]!, self._r[1839]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1832]!, self._r[1832]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1840]! } + public var Message_PinnedAudioMessage: String { return self._s[1833]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1841]!, self._r[1841]!, [_0]) + return formatWithArgumentRanges(self._s[1834]!, self._r[1834]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1842]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1843]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1844]! } - public var Conversation_MessageEditedLabel: String { return self._s[1845]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1846]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1847]! } + public var Notification_Mute1hMin: String { return self._s[1835]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1836]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1837]! } + public var Conversation_MessageEditedLabel: String { return self._s[1838]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1839]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1840]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1841]!, self._r[1841]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1849]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1842]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1850]!, self._r[1850]!, [_1]) + return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1851]! } - public var Month_GenOctober: String { return self._s[1852]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1853]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1854]! } - public var MediaPicker_TimerTooltip: String { return self._s[1856]! } - public var SharedMedia_TitleAll: String { return self._s[1857]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1860]! } - public var Conversation_RestrictedMedia: String { return self._s[1861]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1862]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1864]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1865]! } + public var AccessDenied_LocationTracking: String { return self._s[1844]! } + public var Month_GenOctober: String { return self._s[1845]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1846]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1847]! } + public var MediaPicker_TimerTooltip: String { return self._s[1849]! } + public var SharedMedia_TitleAll: String { return self._s[1850]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1853]! } + public var Conversation_RestrictedMedia: String { return self._s[1854]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1855]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1857]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1858]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1866]!, self._r[1866]!, [_0]) + return formatWithArgumentRanges(self._s[1859]!, self._r[1859]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1869]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1871]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1872]! } + public var Conversation_SavedMessages: String { return self._s[1862]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1864]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1865]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1874]!, self._r[1874]!, [_0]) + return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1875]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1876]! } + public var ReportPeer_AlertSuccess: String { return self._s[1868]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1869]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1878]! } - public var PhotoEditor_FadeTool: String { return self._s[1879]! } - public var Privacy_ContactsReset: String { return self._s[1880]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1871]! } + public var PhotoEditor_FadeTool: String { return self._s[1872]! } + public var Privacy_ContactsReset: String { return self._s[1873]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_0]) + return formatWithArgumentRanges(self._s[1875]!, self._r[1875]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1883]! } - public var ChatList_Mute: String { return self._s[1884]! } - public var Permissions_CellularDataText_v0: String { return self._s[1885]! } - public var ShareMenu_SelectChats: String { return self._s[1887]! } - public var MusicPlayer_VoiceNote: String { return self._s[1888]! } - public var Conversation_RestrictedText: String { return self._s[1889]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1890]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1891]! } - public var Cache_Videos: String { return self._s[1892]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1893]! } - public var FeatureDisabled_Oops: String { return self._s[1895]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1896]! } + public var Message_PinnedVideoMessage: String { return self._s[1876]! } + public var ChatList_Mute: String { return self._s[1877]! } + public var Permissions_CellularDataText_v0: String { return self._s[1878]! } + public var ShareMenu_SelectChats: String { return self._s[1880]! } + public var MusicPlayer_VoiceNote: String { return self._s[1881]! } + public var Conversation_RestrictedText: String { return self._s[1882]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1883]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1884]! } + public var Cache_Videos: String { return self._s[1885]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1886]! } + public var FeatureDisabled_Oops: String { return self._s[1888]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1889]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1897]!, self._r[1897]!, [_0]) + return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1898]! } - public var GroupPermission_NoSendPolls: String { return self._s[1899]! } - public var Message_VideoExpired: String { return self._s[1901]! } - public var Notifications_Badge: String { return self._s[1902]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1903]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1904]! } - public var Username_InvalidTooShort: String { return self._s[1905]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1906]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1907]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1908]! } + public var Stickers_GroupStickersHelp: String { return self._s[1891]! } + public var GroupPermission_NoSendPolls: String { return self._s[1892]! } + public var Message_VideoExpired: String { return self._s[1894]! } + public var Notifications_Badge: String { return self._s[1895]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1896]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1897]! } + public var Username_InvalidTooShort: String { return self._s[1898]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1899]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1900]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1901]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1909]!, self._r[1909]!, [_1]) + return formatWithArgumentRanges(self._s[1902]!, self._r[1902]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1910]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1911]! } - public var SharedMedia_CategoryDocs: String { return self._s[1914]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1903]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1904]! } + public var SharedMedia_CategoryDocs: String { return self._s[1907]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1915]!, self._r[1915]!, [_1]) + return formatWithArgumentRanges(self._s[1908]!, self._r[1908]!, [_1]) } - public var Privacy_Forwards_NeverLink: String { return self._s[1917]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1910]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1918]!, self._r[1918]!, [_1]) + return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1919]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1912]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0]) + return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1921]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1922]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1923]! } - public var Channel_UpdatePhotoItem: String { return self._s[1924]! } - public var GroupInfo_LeftStatus: String { return self._s[1925]! } - public var Watch_MessageView_Forward: String { return self._s[1927]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[1928]! } - public var Cache_ClearEmpty: String { return self._s[1930]! } - public var Localization_LanguageName: String { return self._s[1931]! } - public var WebSearch_GIFs: String { return self._s[1932]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1933]! } - public var Username_InvalidStartsWithNumber: String { return self._s[1934]! } - public var Common_Back: String { return self._s[1935]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[1936]! } + public var ChatSettings_PrivateChats: String { return self._s[1914]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1915]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1916]! } + public var Channel_UpdatePhotoItem: String { return self._s[1917]! } + public var GroupInfo_LeftStatus: String { return self._s[1918]! } + public var Watch_MessageView_Forward: String { return self._s[1920]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[1921]! } + public var Cache_ClearEmpty: String { return self._s[1923]! } + public var Localization_LanguageName: String { return self._s[1924]! } + public var WebSearch_GIFs: String { return self._s[1925]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1926]! } + public var Username_InvalidStartsWithNumber: String { return self._s[1927]! } + public var Common_Back: String { return self._s[1928]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[1929]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1937]!, self._r[1937]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1930]!, self._r[1930]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[1938]! } - public var Watch_Conversation_Reply: String { return self._s[1940]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[1942]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[1943]! } - public var Channel_BanUser_Unban: String { return self._s[1945]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[1946]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[1947]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[1949]! } - public var Passport_Identity_Name: String { return self._s[1950]! } + public var Passport_Email_Help: String { return self._s[1931]! } + public var Watch_Conversation_Reply: String { return self._s[1933]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[1935]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[1936]! } + public var Channel_BanUser_Unban: String { return self._s[1938]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[1939]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[1940]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[1942]! } + public var Passport_Identity_Name: String { return self._s[1943]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1951]!, self._r[1951]!, [_0]) + return formatWithArgumentRanges(self._s[1944]!, self._r[1944]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[1952]! } - public var Conversation_BlockUser: String { return self._s[1953]! } - public var Month_GenJanuary: String { return self._s[1954]! } - public var ChatSettings_TextSize: String { return self._s[1955]! } - public var Notification_PassportValuePhone: String { return self._s[1956]! } - public var Passport_Language_ne: String { return self._s[1957]! } - public var Notification_CallBack: String { return self._s[1958]! } - public var TwoStepAuth_EmailHelp: String { return self._s[1959]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[1945]! } + public var Conversation_BlockUser: String { return self._s[1946]! } + public var Month_GenJanuary: String { return self._s[1947]! } + public var ChatSettings_TextSize: String { return self._s[1948]! } + public var Notification_PassportValuePhone: String { return self._s[1949]! } + public var Passport_Language_ne: String { return self._s[1950]! } + public var Notification_CallBack: String { return self._s[1951]! } + public var TwoStepAuth_EmailHelp: String { return self._s[1952]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1960]!, self._r[1960]!, [_0]) + return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_0]) } - public var Channel_Info_Management: String { return self._s[1961]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[1962]! } - public var Stickers_FrequentlyUsed: String { return self._s[1963]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[1964]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1966]! } + public var Channel_Info_Management: String { return self._s[1954]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[1955]! } + public var Stickers_FrequentlyUsed: String { return self._s[1956]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[1957]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1959]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1967]!, self._r[1967]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[1960]!, self._r[1960]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[1968]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[1969]! } - public var CreatePoll_TextHeader: String { return self._s[1970]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[1961]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[1962]! } + public var CreatePoll_TextHeader: String { return self._s[1963]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1964]!, self._r[1964]!, [_0]) + } + public var PhotoEditor_QualityMedium: String { return self._s[1965]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[1966]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[1968]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[1969]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[1970]! } + public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1971]!, self._r[1971]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[1972]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[1973]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[1975]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[1976]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[1977]! } - public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, [_0]) - } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1979]!, self._r[1979]!, [_1]) + return formatWithArgumentRanges(self._s[1972]!, self._r[1972]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[1981]! } - public var Settings_Username: String { return self._s[1982]! } - public var Conversation_Block: String { return self._s[1984]! } - public var Wallpaper_Wallpaper: String { return self._s[1985]! } - public var SocksProxySetup_UseProxy: String { return self._s[1987]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[1988]! } - public var MessageTimer_Forever: String { return self._s[1989]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[1990]! } - public var PhotoEditor_DiscardChanges: String { return self._s[1991]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1992]! } - public var Passport_Language_da: String { return self._s[1993]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[1994]! } + public var Conversation_LinkDialogOpen: String { return self._s[1974]! } + public var Settings_Username: String { return self._s[1975]! } + public var Conversation_Block: String { return self._s[1977]! } + public var Wallpaper_Wallpaper: String { return self._s[1978]! } + public var SocksProxySetup_UseProxy: String { return self._s[1980]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[1981]! } + public var MessageTimer_Forever: String { return self._s[1982]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[1983]! } + public var PhotoEditor_DiscardChanges: String { return self._s[1984]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1985]! } + public var Passport_Language_da: String { return self._s[1986]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[1987]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1995]!, self._r[1995]!, [_0]) + return formatWithArgumentRanges(self._s[1988]!, self._r[1988]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[1996]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[1989]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1998]!, self._r[1998]!, [_0]) + return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2000]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2001]! } - public var Conversation_PinnedPoll: String { return self._s[2002]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2003]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[1993]! } + public var Conversation_SearchByName_Prefix: String { return self._s[1994]! } + public var Conversation_PinnedPoll: String { return self._s[1995]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[1996]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2004]!, self._r[2004]!, [_1]) + return formatWithArgumentRanges(self._s[1997]!, self._r[1997]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2005]! } - public var Cache_ByPeerHeader: String { return self._s[2006]! } + public var WallpaperSearch_ColorPurple: String { return self._s[1998]! } + public var Cache_ByPeerHeader: String { return self._s[1999]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_0]) + return formatWithArgumentRanges(self._s[2000]!, self._r[2000]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2008]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2011]! } - public var Notification_PinnedMessage: String { return self._s[2012]! } - public var Contacts_SortBy: String { return self._s[2014]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2001]! } + public var Notification_PinnedMessage: String { return self._s[2004]! } + public var Contacts_SortBy: String { return self._s[2006]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2015]!, self._r[2015]!, [_1]) + return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2017]!, self._r[2017]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2018]! } - public var Watch_UserInfo_Service: String { return self._s[2019]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2021]! } - public var Conversation_Unpin: String { return self._s[2023]! } - public var CancelResetAccount_Title: String { return self._s[2024]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2025]! } + public var Call_EncryptionKey_Title: String { return self._s[2010]! } + public var Watch_UserInfo_Service: String { return self._s[2011]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2013]! } + public var Conversation_Unpin: String { return self._s[2015]! } + public var CancelResetAccount_Title: String { return self._s[2016]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2017]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2027]!, self._r[2027]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2019]!, self._r[2019]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2028]! } - public var CallSettings_Title: String { return self._s[2029]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2030]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2032]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2033]! } - public var Passport_Identity_DocumentDetails: String { return self._s[2034]! } - public var LoginPassword_PasswordHelp: String { return self._s[2035]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2036]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2037]! } - public var Checkout_TotalPaidAmount: String { return self._s[2038]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2020]! } + public var CallSettings_Title: String { return self._s[2021]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2022]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2024]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2025]! } + public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2026]!, self._r[2026]!, [_1, _2]) + } + public var Passport_Identity_DocumentDetails: String { return self._s[2027]! } + public var LoginPassword_PasswordHelp: String { return self._s[2028]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2029]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2030]! } + public var Checkout_TotalPaidAmount: String { return self._s[2031]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2039]!, self._r[2039]!, [_0]) + return formatWithArgumentRanges(self._s[2032]!, self._r[2032]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2040]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2042]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2043]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2033]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2035]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2036]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2044]!, self._r[2044]!, [_1]) + return formatWithArgumentRanges(self._s[2037]!, self._r[2037]!, [_1]) } - public var Contacts_InviteFriends: String { return self._s[2046]! } - public var Map_ChooseLocationTitle: String { return self._s[2047]! } - public var Conversation_StopPoll: String { return self._s[2049]! } + public var Contacts_InviteFriends: String { return self._s[2039]! } + public var Map_ChooseLocationTitle: String { return self._s[2040]! } + public var Conversation_StopPoll: String { return self._s[2042]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2050]!, self._r[2050]!, [_0]) + return formatWithArgumentRanges(self._s[2043]!, self._r[2043]!, [_0]) } - public var Call_Camera: String { return self._s[2051]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2052]! } - public var Calls_RatingFeedback: String { return self._s[2053]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2054]! } - public var NotificationsSound_Pulse: String { return self._s[2055]! } - public var Watch_LastSeen_Lately: String { return self._s[2056]! } - public var ReportGroupLocation_Report: String { return self._s[2059]! } - public var Widget_NoUsers: String { return self._s[2060]! } - public var Conversation_UnvotePoll: String { return self._s[2061]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2063]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2064]! } - public var NotificationsSound_Circles: String { return self._s[2065]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2067]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2068]! } - public var Proxy_TooltipUnavailable: String { return self._s[2069]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2071]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2073]! } - public var Conversation_FileDropbox: String { return self._s[2074]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2075]! } - public var Tour_Text3: String { return self._s[2077]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2079]! } - public var GroupPermission_NoSendMessages: String { return self._s[2080]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2081]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2082]! } + public var Call_Camera: String { return self._s[2044]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2045]! } + public var Calls_RatingFeedback: String { return self._s[2046]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2047]! } + public var NotificationsSound_Pulse: String { return self._s[2048]! } + public var Watch_LastSeen_Lately: String { return self._s[2049]! } + public var ReportGroupLocation_Report: String { return self._s[2052]! } + public var Widget_NoUsers: String { return self._s[2053]! } + public var Conversation_UnvotePoll: String { return self._s[2054]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2056]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2057]! } + public var NotificationsSound_Circles: String { return self._s[2058]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2060]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2061]! } + public var Proxy_TooltipUnavailable: String { return self._s[2062]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2064]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2066]! } + public var Conversation_FileDropbox: String { return self._s[2067]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2068]! } + public var Tour_Text3: String { return self._s[2070]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2072]! } + public var GroupPermission_NoSendMessages: String { return self._s[2073]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2074]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2075]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2084]!, self._r[2084]!, [_0]) + return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2085]! } - public var Checkout_ShippingOption_Title: String { return self._s[2086]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2087]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2078]! } + public var Checkout_ShippingOption_Title: String { return self._s[2079]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2080]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2088]!, self._r[2088]!, [_0]) + return formatWithArgumentRanges(self._s[2081]!, self._r[2081]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_0]) + return formatWithArgumentRanges(self._s[2082]!, self._r[2082]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2090]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2091]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2092]! } - public var AutoDownloadSettings_Photos: String { return self._s[2094]! } - public var Appearance_PreviewIncomingText: String { return self._s[2095]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2096]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2097]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2098]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2099]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2100]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2101]! } - public var Notification_SecretChatScreenshot: String { return self._s[2102]! } - public var AccessDenied_Wallpapers: String { return self._s[2103]! } - public var Passport_Address_City: String { return self._s[2105]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2106]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2107]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2108]! } - public var AccessDenied_LocationDisabled: String { return self._s[2109]! } - public var Group_Location_Title: String { return self._s[2110]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2112]! } - public var GroupInfo_Sound: String { return self._s[2113]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2114]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2115]! } - public var Contacts_Title: String { return self._s[2116]! } - public var Passport_Language_fr: String { return self._s[2117]! } - public var Notifications_ResetAllNotifications: String { return self._s[2118]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2121]! } - public var Checkout_NewCard_Title: String { return self._s[2122]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2123]! } - public var Conversation_ForwardChats: String { return self._s[2124]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2126]! } - public var Settings_FAQ: String { return self._s[2128]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2129]! } - public var Conversation_ContextMenuForward: String { return self._s[2130]! } - public var PrivacyPolicy_Title: String { return self._s[2135]! } - public var Notifications_TextTone: String { return self._s[2136]! } - public var Profile_CreateNewContact: String { return self._s[2137]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2138]! } - public var Call_Speaker: String { return self._s[2140]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2141]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2143]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2144]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2083]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2084]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2085]! } + public var AutoDownloadSettings_Photos: String { return self._s[2087]! } + public var Appearance_PreviewIncomingText: String { return self._s[2088]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2089]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2090]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2091]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2092]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2093]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2094]! } + public var Notification_SecretChatScreenshot: String { return self._s[2095]! } + public var AccessDenied_Wallpapers: String { return self._s[2096]! } + public var Passport_Address_City: String { return self._s[2098]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2099]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2100]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2101]! } + public var AccessDenied_LocationDisabled: String { return self._s[2102]! } + public var Group_Location_Title: String { return self._s[2103]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2105]! } + public var GroupInfo_Sound: String { return self._s[2106]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2107]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2108]! } + public var Contacts_Title: String { return self._s[2109]! } + public var Passport_Language_fr: String { return self._s[2110]! } + public var Notifications_ResetAllNotifications: String { return self._s[2111]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2114]! } + public var Checkout_NewCard_Title: String { return self._s[2115]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2116]! } + public var Conversation_ForwardChats: String { return self._s[2117]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2119]! } + public var Settings_FAQ: String { return self._s[2121]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2122]! } + public var Conversation_ContextMenuForward: String { return self._s[2123]! } + public var PrivacyPolicy_Title: String { return self._s[2128]! } + public var Notifications_TextTone: String { return self._s[2129]! } + public var Profile_CreateNewContact: String { return self._s[2130]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2131]! } + public var Call_Speaker: String { return self._s[2133]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2134]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2136]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2137]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2145]!, self._r[2145]!, [_0]) + return formatWithArgumentRanges(self._s[2138]!, self._r[2138]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2146]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2147]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2148]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2149]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2150]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2151]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2152]! } - public var Bot_Unblock: String { return self._s[2153]! } - public var TextFormat_Italic: String { return self._s[2154]! } - public var WallpaperSearch_ColorPink: String { return self._s[2155]! } - public var Settings_About_Help: String { return self._s[2156]! } - public var SearchImages_Title: String { return self._s[2157]! } - public var Weekday_Wednesday: String { return self._s[2158]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2159]! } - public var ExplicitContent_AlertTitle: String { return self._s[2160]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2139]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2140]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2141]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2142]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2143]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2144]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2145]! } + public var Bot_Unblock: String { return self._s[2146]! } + public var TextFormat_Italic: String { return self._s[2147]! } + public var WallpaperSearch_ColorPink: String { return self._s[2148]! } + public var Settings_About_Help: String { return self._s[2149]! } + public var SearchImages_Title: String { return self._s[2150]! } + public var Weekday_Wednesday: String { return self._s[2151]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2152]! } + public var ExplicitContent_AlertTitle: String { return self._s[2153]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2161]!, self._r[2161]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2154]!, self._r[2154]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2162]! } - public var Weekday_Thursday: String { return self._s[2163]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2164]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2165]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2155]! } + public var Weekday_Thursday: String { return self._s[2156]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2157]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2158]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2166]!, self._r[2166]!, [_0]) + return formatWithArgumentRanges(self._s[2159]!, self._r[2159]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2167]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2168]! } - public var Passport_RequestedInformation: String { return self._s[2169]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2170]! } - public var Conversation_EncryptionProcessing: String { return self._s[2172]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2173]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2175]! } - public var Channel_Setup_Title: String { return self._s[2176]! } - public var Conversation_SearchPlaceholder: String { return self._s[2177]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2178]! } - public var Checkout_ErrorGeneric: String { return self._s[2179]! } - public var Passport_Language_hu: String { return self._s[2180]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2160]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2161]! } + public var Passport_RequestedInformation: String { return self._s[2162]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2163]! } + public var Conversation_EncryptionProcessing: String { return self._s[2165]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2166]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2168]! } + public var Channel_Setup_Title: String { return self._s[2169]! } + public var Conversation_SearchPlaceholder: String { return self._s[2170]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2171]! } + public var Checkout_ErrorGeneric: String { return self._s[2172]! } + public var Passport_Language_hu: String { return self._s[2173]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2182]!, self._r[2182]!, [_0]) + return formatWithArgumentRanges(self._s[2175]!, self._r[2175]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2185]!, self._r[2185]!, [_1]) + return formatWithArgumentRanges(self._s[2178]!, self._r[2178]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2186]!, self._r[2186]!, [_0]) + return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_0]) } - public var Group_Location_Info: String { return self._s[2187]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2188]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2189]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2190]! } + public var Group_Location_Info: String { return self._s[2180]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2181]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2182]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2183]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2191]!, self._r[2191]!, [_0]) + return formatWithArgumentRanges(self._s[2184]!, self._r[2184]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2192]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2193]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2194]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2185]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2186]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2187]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2195]!, self._r[2195]!, [_0]) + return formatWithArgumentRanges(self._s[2188]!, self._r[2188]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2196]! } - public var Message_PinnedAnimationMessage: String { return self._s[2198]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2200]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2201]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2203]! } - public var Embed_PlayingInPIP: String { return self._s[2204]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2205]! } + public var Passport_Language_cs: String { return self._s[2189]! } + public var Message_PinnedAnimationMessage: String { return self._s[2191]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2193]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2194]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2196]! } + public var Embed_PlayingInPIP: String { return self._s[2197]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2198]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2206]!, self._r[2206]!, [_0]) + return formatWithArgumentRanges(self._s[2199]!, self._r[2199]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2207]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2200]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2208]!, self._r[2208]!, [_1]) + return formatWithArgumentRanges(self._s[2201]!, self._r[2201]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2209]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2210]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2211]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2212]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2213]! } + public var Notification_PaymentSent: String { return self._s[2202]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2203]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2204]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2205]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2206]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2216]!, self._r[2216]!, [_1]) + return formatWithArgumentRanges(self._s[2209]!, self._r[2209]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2217]!, self._r[2217]!, [_1]) + return formatWithArgumentRanges(self._s[2210]!, self._r[2210]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2218]!, self._r[2218]!, [_1]) + return formatWithArgumentRanges(self._s[2211]!, self._r[2211]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2220]! } - public var PasscodeSettings_HelpTop: String { return self._s[2221]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2222]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2223]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2224]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2225]! } - public var Call_Accept: String { return self._s[2227]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2228]! } - public var Month_GenMarch: String { return self._s[2230]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2231]! } - public var LoginPassword_Title: String { return self._s[2232]! } - public var Call_End: String { return self._s[2233]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2234]! } - public var CallSettings_Always: String { return self._s[2235]! } - public var CallFeedback_Success: String { return self._s[2236]! } - public var TwoStepAuth_SetupHint: String { return self._s[2237]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2213]! } + public var PasscodeSettings_HelpTop: String { return self._s[2214]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2215]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2216]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2217]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2218]! } + public var Call_Accept: String { return self._s[2220]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2221]! } + public var Month_GenMarch: String { return self._s[2223]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2224]! } + public var LoginPassword_Title: String { return self._s[2225]! } + public var Call_End: String { return self._s[2226]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2227]! } + public var CallSettings_Always: String { return self._s[2228]! } + public var CallFeedback_Success: String { return self._s[2229]! } + public var TwoStepAuth_SetupHint: String { return self._s[2230]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2238]!, self._r[2238]!, [_1]) + return formatWithArgumentRanges(self._s[2231]!, self._r[2231]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2239]! } - public var Login_PhoneTitle: String { return self._s[2240]! } - public var Passport_FieldPhoneHelp: String { return self._s[2241]! } - public var Weekday_ShortSunday: String { return self._s[2242]! } - public var Passport_InfoFAQ_URL: String { return self._s[2243]! } - public var ContactInfo_Job: String { return self._s[2245]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2246]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2247]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2248]! } - public var Invite_ChannelsTooMuch: String { return self._s[2249]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2250]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2251]! } - public var CallFeedback_ReasonNoise: String { return self._s[2252]! } - public var Appearance_AppIconDefault: String { return self._s[2254]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2255]! } - public var MediaPicker_AddCaption: String { return self._s[2256]! } - public var CallSettings_TabIconDescription: String { return self._s[2257]! } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2258]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2259]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2260]! } - public var DialogList_SearchSectionRecent: String { return self._s[2261]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2262]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2265]! } - public var LastSeen_WithinAWeek: String { return self._s[2266]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2267]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2269]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2232]! } + public var Login_PhoneTitle: String { return self._s[2233]! } + public var Passport_FieldPhoneHelp: String { return self._s[2234]! } + public var Weekday_ShortSunday: String { return self._s[2235]! } + public var Passport_InfoFAQ_URL: String { return self._s[2236]! } + public var ContactInfo_Job: String { return self._s[2238]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2239]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2240]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2241]! } + public var Invite_ChannelsTooMuch: String { return self._s[2242]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2243]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2244]! } + public var CallFeedback_ReasonNoise: String { return self._s[2245]! } + public var Appearance_AppIconDefault: String { return self._s[2247]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2248]! } + public var MediaPicker_AddCaption: String { return self._s[2249]! } + public var CallSettings_TabIconDescription: String { return self._s[2250]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2251]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2252]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2253]! } + public var DialogList_SearchSectionRecent: String { return self._s[2254]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2255]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2258]! } + public var LastSeen_WithinAWeek: String { return self._s[2259]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2260]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2262]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2270]!, self._r[2270]!, [_0]) + return formatWithArgumentRanges(self._s[2263]!, self._r[2263]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2271]! } - public var Conversation_StatusLeftGroup: String { return self._s[2272]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2273]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2275]! } - public var GroupPermission_AddSuccess: String { return self._s[2276]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2278]! } - public var Conversation_ContextMenuCopy: String { return self._s[2279]! } - public var AccessDenied_CallMicrophone: String { return self._s[2280]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2264]! } + public var Conversation_StatusLeftGroup: String { return self._s[2265]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2266]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2268]! } + public var GroupPermission_AddSuccess: String { return self._s[2269]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2271]! } + public var Conversation_ContextMenuCopy: String { return self._s[2272]! } + public var AccessDenied_CallMicrophone: String { return self._s[2273]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2281]!, self._r[2281]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2274]!, self._r[2274]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2282]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2283]! } - public var Checkout_PaymentMethod_New: String { return self._s[2284]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2285]! } - public var PhotoEditor_QualityTool: String { return self._s[2286]! } - public var Login_SendCodeViaSms: String { return self._s[2287]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2288]! } - public var Login_EmailNotConfiguredError: String { return self._s[2289]! } - public var SocksProxySetup_Status: String { return self._s[2290]! } - public var PrivacyPolicy_Accept: String { return self._s[2291]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2292]! } - public var Appearance_AppIconClassicX: String { return self._s[2293]! } + public var Login_InvalidFirstNameError: String { return self._s[2275]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2276]! } + public var Checkout_PaymentMethod_New: String { return self._s[2277]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2278]! } + public var PhotoEditor_QualityTool: String { return self._s[2279]! } + public var Login_SendCodeViaSms: String { return self._s[2280]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2281]! } + public var Login_EmailNotConfiguredError: String { return self._s[2282]! } + public var SocksProxySetup_Status: String { return self._s[2283]! } + public var PrivacyPolicy_Accept: String { return self._s[2284]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2285]! } + public var Appearance_AppIconClassicX: String { return self._s[2286]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2294]!, self._r[2294]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2287]!, self._r[2287]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2295]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2296]! } - public var AutoNightTheme_Automatic: String { return self._s[2297]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2298]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2299]! } - public var Cache_Help: String { return self._s[2300]! } - public var Group_ErrorAccessDenied: String { return self._s[2301]! } - public var Passport_Language_fa: String { return self._s[2302]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2303]! } - public var PrivacySettings_LastSeen: String { return self._s[2304]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2288]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2289]! } + public var AutoNightTheme_Automatic: String { return self._s[2290]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2291]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2292]! } + public var Cache_Help: String { return self._s[2293]! } + public var Group_ErrorAccessDenied: String { return self._s[2294]! } + public var Passport_Language_fa: String { return self._s[2295]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2296]! } + public var PrivacySettings_LastSeen: String { return self._s[2297]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2305]!, self._r[2305]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2298]!, self._r[2298]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2309]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2310]! } - public var Profile_About: String { return self._s[2311]! } - public var Channel_About_Placeholder: String { return self._s[2312]! } - public var Login_InfoTitle: String { return self._s[2313]! } + public var Preview_SaveGif: String { return self._s[2302]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2303]! } + public var Profile_About: String { return self._s[2304]! } + public var Channel_About_Placeholder: String { return self._s[2305]! } + public var Login_InfoTitle: String { return self._s[2306]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2314]!, self._r[2314]!, [_0]) + return formatWithArgumentRanges(self._s[2307]!, self._r[2307]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2316]! } - public var ContactInfo_Title: String { return self._s[2317]! } - public var Media_ShareThisVideo: String { return self._s[2318]! } - public var Weekday_ShortFriday: String { return self._s[2319]! } - public var AccessDenied_Contacts: String { return self._s[2320]! } - public var Notification_CallIncomingShort: String { return self._s[2321]! } - public var Group_Setup_TypePublic: String { return self._s[2322]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2323]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2324]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2327]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2328]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2329]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2330]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2331]! } - public var DialogList_Typing: String { return self._s[2332]! } - public var CallFeedback_IncludeLogs: String { return self._s[2334]! } - public var Checkout_Phone: String { return self._s[2336]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2339]! } - public var Privacy_Calls_Integration: String { return self._s[2340]! } - public var Notifications_PermissionsAllow: String { return self._s[2341]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2345]! } - public var Settings_ChatSettings: String { return self._s[2346]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2309]! } + public var ContactInfo_Title: String { return self._s[2310]! } + public var Media_ShareThisVideo: String { return self._s[2311]! } + public var Weekday_ShortFriday: String { return self._s[2312]! } + public var AccessDenied_Contacts: String { return self._s[2313]! } + public var Notification_CallIncomingShort: String { return self._s[2314]! } + public var Group_Setup_TypePublic: String { return self._s[2315]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2316]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2317]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2320]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2321]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2322]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2323]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2324]! } + public var DialogList_Typing: String { return self._s[2325]! } + public var CallFeedback_IncludeLogs: String { return self._s[2327]! } + public var Checkout_Phone: String { return self._s[2329]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2332]! } + public var Privacy_Calls_Integration: String { return self._s[2333]! } + public var Notifications_PermissionsAllow: String { return self._s[2334]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2338]! } + public var Settings_ChatSettings: String { return self._s[2339]! } public func PUSH_MESSAGE_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2347]!, self._r[2347]!, [_1]) + return formatWithArgumentRanges(self._s[2340]!, self._r[2340]!, [_1]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2348]!, self._r[2348]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2341]!, self._r[2341]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2350]! } + public var GroupRemoved_DeleteUser: String { return self._s[2343]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2351]!, self._r[2351]!, [_0]) + return formatWithArgumentRanges(self._s[2344]!, self._r[2344]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2352]!, self._r[2352]!, [_1]) + return formatWithArgumentRanges(self._s[2345]!, self._r[2345]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2353]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2354]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2356]! } - public var Conversation_Unblock: String { return self._s[2357]! } - public var PrivacySettings_DataSettings: String { return self._s[2358]! } - public var Group_PublicLink_Info: String { return self._s[2359]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2360]! } + public var Login_ContinueWithLocalization: String { return self._s[2346]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2347]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2349]! } + public var Conversation_Unblock: String { return self._s[2350]! } + public var PrivacySettings_DataSettings: String { return self._s[2351]! } + public var Group_PublicLink_Info: String { return self._s[2352]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2353]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2361]!, self._r[2361]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2354]!, self._r[2354]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2364]! } - public var Call_Mute: String { return self._s[2365]! } - public var Passport_Language_dz: String { return self._s[2366]! } - public var Passport_Language_tk: String { return self._s[2367]! } + public var PrivacySettings_Passcode: String { return self._s[2357]! } + public var Call_Mute: String { return self._s[2358]! } + public var Passport_Language_dz: String { return self._s[2359]! } + public var Passport_Language_tk: String { return self._s[2360]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2368]!, self._r[2368]!, [_0]) + return formatWithArgumentRanges(self._s[2361]!, self._r[2361]!, [_0]) } - public var Settings_Search: String { return self._s[2369]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2370]! } - public var Conversation_ContextMenuReply: String { return self._s[2371]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2372]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2373]! } - public var Tour_Title1: String { return self._s[2374]! } - public var Conversation_ClearGroupHistory: String { return self._s[2376]! } - public var WallpaperPreview_Motion: String { return self._s[2377]! } + public var Settings_Search: String { return self._s[2362]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2363]! } + public var Conversation_ContextMenuReply: String { return self._s[2364]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2365]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2366]! } + public var Tour_Title1: String { return self._s[2367]! } + public var Conversation_ClearGroupHistory: String { return self._s[2369]! } + public var WallpaperPreview_Motion: String { return self._s[2370]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2378]!, self._r[2378]!, [_0]) + return formatWithArgumentRanges(self._s[2371]!, self._r[2371]!, [_0]) } - public var Call_RateCall: String { return self._s[2379]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2380]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2381]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2382]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2384]! } + public var Call_RateCall: String { return self._s[2372]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2373]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2374]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2375]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2377]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2386]!, self._r[2386]!, [_0]) + return formatWithArgumentRanges(self._s[2379]!, self._r[2379]!, [_0]) } - public var Compose_Create: String { return self._s[2387]! } - public var Contacts_InviteToTelegram: String { return self._s[2388]! } - public var GroupInfo_Notifications: String { return self._s[2389]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2391]! } - public var Month_GenApril: String { return self._s[2392]! } - public var Appearance_AutoNightTheme: String { return self._s[2393]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2395]! } - public var Login_CodeSentSms: String { return self._s[2397]! } + public var Compose_Create: String { return self._s[2380]! } + public var Contacts_InviteToTelegram: String { return self._s[2381]! } + public var GroupInfo_Notifications: String { return self._s[2382]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2384]! } + public var Month_GenApril: String { return self._s[2385]! } + public var Appearance_AutoNightTheme: String { return self._s[2386]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2388]! } + public var Login_CodeSentSms: String { return self._s[2390]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2398]!, self._r[2398]!, [_0]) + return formatWithArgumentRanges(self._s[2391]!, self._r[2391]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2399]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2400]! } - public var Passport_Language_hr: String { return self._s[2401]! } - public var Common_ActionNotAllowedError: String { return self._s[2402]! } + public var EmptyGroupInfo_Line3: String { return self._s[2392]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2393]! } + public var Passport_Language_hr: String { return self._s[2394]! } + public var Common_ActionNotAllowedError: String { return self._s[2395]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2403]!, self._r[2403]!, [_0]) + return formatWithArgumentRanges(self._s[2396]!, self._r[2396]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2404]! } - public var Appearance_ThemePreview_ChatList_8_Text: String { return self._s[2405]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2406]! } - public var Privacy_SecretChatsTitle: String { return self._s[2407]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2409]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2410]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2411]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2412]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2413]! } - public var Preview_DeleteGif: String { return self._s[2414]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2415]! } - public var Group_ErrorNotMutualContact: String { return self._s[2416]! } - public var Notification_MessageLifetime5s: String { return self._s[2417]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2397]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2398]! } + public var Privacy_SecretChatsTitle: String { return self._s[2399]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2401]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2402]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2403]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2404]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2405]! } + public var Preview_DeleteGif: String { return self._s[2406]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2407]! } + public var Group_ErrorNotMutualContact: String { return self._s[2408]! } + public var Notification_MessageLifetime5s: String { return self._s[2409]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2418]!, self._r[2418]!, [_0]) + return formatWithArgumentRanges(self._s[2410]!, self._r[2410]!, [_0]) } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2420]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2421]! } - public var Passport_Address_AddBankStatement: String { return self._s[2422]! } - public var Notification_CallIncoming: String { return self._s[2423]! } - public var Compose_NewGroupTitle: String { return self._s[2424]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2426]! } - public var Passport_Address_Postcode: String { return self._s[2428]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2412]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2413]! } + public var Passport_Address_AddBankStatement: String { return self._s[2414]! } + public var Notification_CallIncoming: String { return self._s[2415]! } + public var Compose_NewGroupTitle: String { return self._s[2416]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2418]! } + public var Passport_Address_Postcode: String { return self._s[2420]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2429]!, self._r[2429]!, [_0]) + return formatWithArgumentRanges(self._s[2421]!, self._r[2421]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2430]! } - public var WallpaperColors_Title: String { return self._s[2431]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2432]! } - public var GroupPermission_Duration: String { return self._s[2433]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2422]! } + public var WallpaperColors_Title: String { return self._s[2423]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2424]! } + public var GroupPermission_Duration: String { return self._s[2425]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2434]!, self._r[2434]!, [_0]) + return formatWithArgumentRanges(self._s[2426]!, self._r[2426]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2435]! } - public var Username_Placeholder: String { return self._s[2436]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2437]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2438]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2439]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2427]! } + public var Username_Placeholder: String { return self._s[2428]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2429]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2430]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2431]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2441]!, self._r[2441]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2442]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2443]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2444]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2445]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2446]! } - public var Conversation_ContextMenuMore: String { return self._s[2447]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2448]! } - public var CallSettings_TabIcon: String { return self._s[2449]! } - public var KeyCommand_Find: String { return self._s[2450]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2451]! } - public var Message_PinnedGame: String { return self._s[2452]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2454]! } - public var Login_CallRequestState2: String { return self._s[2456]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2458]! } + public var Passport_PasswordDescription: String { return self._s[2434]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2435]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2436]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2437]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2438]! } + public var Conversation_ContextMenuMore: String { return self._s[2439]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2440]! } + public var CallSettings_TabIcon: String { return self._s[2441]! } + public var KeyCommand_Find: String { return self._s[2442]! } + public var Message_PinnedGame: String { return self._s[2443]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2445]! } + public var Login_CallRequestState2: String { return self._s[2447]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2449]! } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2460]!, self._r[2460]!, [_0]) + return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2461]! } - public var Conversation_InstantPagePreview: String { return self._s[2462]! } + public var WallpaperPreview_Blurred: String { return self._s[2452]! } + public var Conversation_InstantPagePreview: String { return self._s[2453]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) + return formatWithArgumentRanges(self._s[2454]!, self._r[2454]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2466]! } - public var WallpaperSearch_ColorRed: String { return self._s[2467]! } - public var GroupPermission_NoPinMessages: String { return self._s[2468]! } - public var Passport_Language_es: String { return self._s[2469]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2471]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2472]! } + public var SecretTimer_VideoDescription: String { return self._s[2457]! } + public var WallpaperSearch_ColorRed: String { return self._s[2458]! } + public var GroupPermission_NoPinMessages: String { return self._s[2459]! } + public var Passport_Language_es: String { return self._s[2460]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2462]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2463]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2464]!, self._r[2464]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2474]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2475]! } - public var Watch_UserInfo_Unmute: String { return self._s[2476]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2477]! } - public var AccessDenied_CameraRestricted: String { return self._s[2479]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2465]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2466]! } + public var Watch_UserInfo_Unmute: String { return self._s[2467]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2468]! } + public var AccessDenied_CameraRestricted: String { return self._s[2470]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2480]!, self._r[2480]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2471]!, self._r[2471]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2482]! } - public var Settings_CopyUsername: String { return self._s[2483]! } - public var Contacts_SearchLabel: String { return self._s[2484]! } - public var Map_OpenInYandexNavigator: String { return self._s[2486]! } - public var PasscodeSettings_EncryptData: String { return self._s[2487]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2488]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2489]! } - public var DialogList_AdNoticeAlert: String { return self._s[2490]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2492]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2493]! } - public var Localization_LanguageCustom: String { return self._s[2494]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2495]! } - public var CallFeedback_Title: String { return self._s[2496]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2499]! } - public var Conversation_InfoGroup: String { return self._s[2500]! } - public var Compose_NewMessage: String { return self._s[2501]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2502]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2503]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2504]! } + public var ChatList_ReadAll: String { return self._s[2473]! } + public var Settings_CopyUsername: String { return self._s[2474]! } + public var Contacts_SearchLabel: String { return self._s[2475]! } + public var Map_OpenInYandexNavigator: String { return self._s[2477]! } + public var PasscodeSettings_EncryptData: String { return self._s[2478]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2479]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2480]! } + public var DialogList_AdNoticeAlert: String { return self._s[2481]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2483]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2484]! } + public var Localization_LanguageCustom: String { return self._s[2485]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2486]! } + public var CallFeedback_Title: String { return self._s[2487]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2490]! } + public var Conversation_InfoGroup: String { return self._s[2491]! } + public var Compose_NewMessage: String { return self._s[2492]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2493]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2494]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2495]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2505]!, self._r[2505]!, [_0]) + return formatWithArgumentRanges(self._s[2496]!, self._r[2496]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2506]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2507]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2508]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2509]! } - public var Channel_BlackList_Title: String { return self._s[2510]! } - public var UserInfo_PhoneCall: String { return self._s[2511]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2513]! } - public var State_connecting: String { return self._s[2514]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2515]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2497]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2498]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2499]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2500]! } + public var Channel_BlackList_Title: String { return self._s[2501]! } + public var UserInfo_PhoneCall: String { return self._s[2502]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2504]! } + public var State_connecting: String { return self._s[2505]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2516]!, self._r[2516]!, [_0]) + return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2517]! } - public var Passport_Identity_EditPassport: String { return self._s[2518]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2520]! } - public var Localization_EnglishLanguageName: String { return self._s[2521]! } - public var Share_AuthDescription: String { return self._s[2522]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2523]! } - public var Passport_Identity_Surname: String { return self._s[2524]! } - public var Compose_TokenListPlaceholder: String { return self._s[2525]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2526]! } - public var Settings_AboutEmpty: String { return self._s[2527]! } - public var Conversation_Unmute: String { return self._s[2528]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2530]! } + public var Notifications_GroupNotifications: String { return self._s[2507]! } + public var Passport_Identity_EditPassport: String { return self._s[2508]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2510]! } + public var Localization_EnglishLanguageName: String { return self._s[2511]! } + public var Share_AuthDescription: String { return self._s[2512]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2513]! } + public var Passport_Identity_Surname: String { return self._s[2514]! } + public var Compose_TokenListPlaceholder: String { return self._s[2515]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2516]! } + public var Settings_AboutEmpty: String { return self._s[2517]! } + public var Conversation_Unmute: String { return self._s[2518]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2520]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2531]!, self._r[2531]!, [_1]) + return formatWithArgumentRanges(self._s[2521]!, self._r[2521]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2532]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2534]! } - public var ChatSettings_Appearance: String { return self._s[2535]! } - public var Appearance_PickAccentColor: String { return self._s[2536]! } + public var Login_CodeSentCall: String { return self._s[2522]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2524]! } + public var ChatSettings_Appearance: String { return self._s[2525]! } + public var Appearance_PickAccentColor: String { return self._s[2526]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2537]!, self._r[2537]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2527]!, self._r[2527]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_1]) + return formatWithArgumentRanges(self._s[2528]!, self._r[2528]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2539]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2540]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2541]! } - public var ChatAdmins_AdminLabel: String { return self._s[2543]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2544]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2546]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2547]! } - public var Month_GenJune: String { return self._s[2548]! } - public var Watch_Location_Current: String { return self._s[2549]! } - public var Conversation_TitleMute: String { return self._s[2550]! } + public var Notification_CallMissed: String { return self._s[2529]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2530]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2531]! } + public var ChatAdmins_AdminLabel: String { return self._s[2533]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2534]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2536]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2537]! } + public var Month_GenJune: String { return self._s[2538]! } + public var Watch_Location_Current: String { return self._s[2539]! } + public var Conversation_TitleMute: String { return self._s[2540]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2551]!, self._r[2551]!, [_1]) + return formatWithArgumentRanges(self._s[2541]!, self._r[2541]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2552]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2542]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_0]) + return formatWithArgumentRanges(self._s[2543]!, self._r[2543]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2554]! } - public var MaskStickerSettings_Info: String { return self._s[2555]! } + public var Call_ReportPlaceholder: String { return self._s[2544]! } + public var Chat_SlowmodeSendError: String { return self._s[2545]! } + public var MaskStickerSettings_Info: String { return self._s[2546]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2556]!, self._r[2556]!, [_0]) + return formatWithArgumentRanges(self._s[2547]!, self._r[2547]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2557]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2559]! } - public var Contacts_ShareTelegram: String { return self._s[2560]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2561]! } - public var Channel_ErrorAccessDenied: String { return self._s[2562]! } - public var UserInfo_ScamBotWarning: String { return self._s[2564]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2565]! } - public var Call_ConnectionErrorTitle: String { return self._s[2566]! } - public var UserInfo_NotificationsEnable: String { return self._s[2567]! } - public var ArchivedChats_IntroText1: String { return self._s[2568]! } - public var Tour_Text4: String { return self._s[2571]! } - public var WallpaperSearch_Recent: String { return self._s[2572]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2573]! } - public var Profile_MessageLifetime2s: String { return self._s[2575]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2576]! } - public var Notification_MessageLifetime2s: String { return self._s[2577]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2548]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2550]! } + public var Contacts_ShareTelegram: String { return self._s[2551]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2552]! } + public var Channel_ErrorAccessDenied: String { return self._s[2553]! } + public var UserInfo_ScamBotWarning: String { return self._s[2555]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2556]! } + public var Call_ConnectionErrorTitle: String { return self._s[2557]! } + public var UserInfo_NotificationsEnable: String { return self._s[2558]! } + public var ArchivedChats_IntroText1: String { return self._s[2559]! } + public var Tour_Text4: String { return self._s[2562]! } + public var WallpaperSearch_Recent: String { return self._s[2563]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2564]! } + public var Profile_MessageLifetime2s: String { return self._s[2566]! } + public var Notification_MessageLifetime2s: String { return self._s[2567]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2578]!, self._r[2578]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2568]!, self._r[2568]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2579]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2580]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2581]! } + public var Cache_ClearCache: String { return self._s[2569]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2570]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2571]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_0]) + return formatWithArgumentRanges(self._s[2575]!, self._r[2575]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2587]!, self._r[2587]!, [_0]) + return formatWithArgumentRanges(self._s[2577]!, self._r[2577]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2588]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2589]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2590]! } - public var ChatList_UnarchiveAction: String { return self._s[2591]! } - public var AutoNightTheme_Title: String { return self._s[2592]! } - public var InstantPage_FeedbackButton: String { return self._s[2593]! } - public var Passport_FieldAddress: String { return self._s[2594]! } + public var LocalGroup_Text: String { return self._s[2578]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2579]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2580]! } + public var ChatList_UnarchiveAction: String { return self._s[2581]! } + public var AutoNightTheme_Title: String { return self._s[2582]! } + public var InstantPage_FeedbackButton: String { return self._s[2583]! } + public var Passport_FieldAddress: String { return self._s[2584]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2595]!, self._r[2595]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2596]! } + public var Month_ShortMarch: String { return self._s[2586]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2597]!, self._r[2597]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2587]!, self._r[2587]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2598]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2599]! } - public var Passport_FloodError: String { return self._s[2600]! } - public var SecretGif_Title: String { return self._s[2601]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2602]! } - public var Passport_Language_th: String { return self._s[2604]! } - public var Passport_Address_Address: String { return self._s[2605]! } - public var Login_InvalidLastNameError: String { return self._s[2606]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2607]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2608]! } - public var SettingsSearch_FAQ: String { return self._s[2609]! } - public var ShareMenu_Send: String { return self._s[2610]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2612]! } - public var Month_GenNovember: String { return self._s[2614]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2616]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2588]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2589]! } + public var Passport_FloodError: String { return self._s[2590]! } + public var SecretGif_Title: String { return self._s[2591]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2592]! } + public var Passport_Language_th: String { return self._s[2594]! } + public var Passport_Address_Address: String { return self._s[2595]! } + public var Login_InvalidLastNameError: String { return self._s[2596]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2597]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2598]! } + public var SettingsSearch_FAQ: String { return self._s[2599]! } + public var ShareMenu_Send: String { return self._s[2600]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2602]! } + public var Month_GenNovember: String { return self._s[2604]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2606]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2617]!, self._r[2617]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2607]!, self._r[2607]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2618]! } - public var NotificationsSound_Tritone: String { return self._s[2619]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2621]! } + public var Checkout_Email: String { return self._s[2608]! } + public var NotificationsSound_Tritone: String { return self._s[2609]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2611]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_1]) + return formatWithArgumentRanges(self._s[2614]!, self._r[2614]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2625]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2615]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2616]!, self._r[2616]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2627]! } - public var Notification_Exceptions_Add: String { return self._s[2628]! } - public var DialogList_You: String { return self._s[2629]! } - public var MediaPicker_Send: String { return self._s[2632]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2633]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2634]! } - public var Call_AudioRouteSpeaker: String { return self._s[2635]! } - public var Watch_UserInfo_Title: String { return self._s[2636]! } - public var Appearance_AccentColor: String { return self._s[2637]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2617]! } + public var Notification_Exceptions_Add: String { return self._s[2618]! } + public var DialogList_You: String { return self._s[2619]! } + public var MediaPicker_Send: String { return self._s[2622]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2623]! } + public var Call_AudioRouteSpeaker: String { return self._s[2624]! } + public var Watch_UserInfo_Title: String { return self._s[2625]! } + public var Appearance_AccentColor: String { return self._s[2626]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2638]!, self._r[2638]!, [_0]) + return formatWithArgumentRanges(self._s[2627]!, self._r[2627]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2639]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2628]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2640]!, self._r[2640]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2641]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2642]! } - public var Notification_CallOutgoing: String { return self._s[2643]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2644]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2645]! } - public var Call_RecordingDisabledMessage: String { return self._s[2646]! } - public var Message_Game: String { return self._s[2647]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2648]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2649]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2650]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2651]! } - public var Date_DialogDateFormat: String { return self._s[2652]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2653]! } - public var Notifications_InAppNotifications: String { return self._s[2654]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2630]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2631]! } + public var Notification_CallOutgoing: String { return self._s[2632]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2633]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2634]! } + public var Call_RecordingDisabledMessage: String { return self._s[2635]! } + public var Message_Game: String { return self._s[2636]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2637]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2638]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2639]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2640]! } + public var Date_DialogDateFormat: String { return self._s[2641]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2642]! } + public var Notifications_InAppNotifications: String { return self._s[2643]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2655]!, self._r[2655]!, [_0]) + return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2656]!, self._r[2656]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2657]! } + public var NewContact_Title: String { return self._s[2646]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2658]!, self._r[2658]!, [_0]) + return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2659]! } + public var Conversation_ViewContactDetails: String { return self._s[2648]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2661]!, self._r[2661]!, [_1]) + return formatWithArgumentRanges(self._s[2650]!, self._r[2650]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2662]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2663]! } - public var PrivacySettings_Title: String { return self._s[2664]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2667]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2668]! } - public var Contacts_PhoneNumber: String { return self._s[2669]! } - public var Map_ShowPlaces: String { return self._s[2671]! } - public var ChatAdmins_Title: String { return self._s[2672]! } - public var InstantPage_Reference: String { return self._s[2674]! } - public var ReportGroupLocation_Text: String { return self._s[2675]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2651]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2652]! } + public var PrivacySettings_Title: String { return self._s[2653]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2656]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2657]! } + public var Contacts_PhoneNumber: String { return self._s[2658]! } + public var Map_ShowPlaces: String { return self._s[2660]! } + public var ChatAdmins_Title: String { return self._s[2661]! } + public var InstantPage_Reference: String { return self._s[2663]! } + public var ReportGroupLocation_Text: String { return self._s[2664]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2676]!, self._r[2676]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2665]!, self._r[2665]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2677]! } - public var Watch_UserInfo_Block: String { return self._s[2678]! } - public var ChatSettings_Stickers: String { return self._s[2679]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2680]! } + public var Camera_FlashOff: String { return self._s[2666]! } + public var Watch_UserInfo_Block: String { return self._s[2667]! } + public var ChatSettings_Stickers: String { return self._s[2668]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2669]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2670]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2681]!, self._r[2681]!, [_0]) + return formatWithArgumentRanges(self._s[2671]!, self._r[2671]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2682]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2683]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2684]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2685]! } + public var Settings_ViewPhoto: String { return self._s[2672]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2673]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2674]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2675]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_0]) + return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2688]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2689]! } + public var Privacy_DeleteDrafts: String { return self._s[2678]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2679]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2690]!, self._r[2690]!, [_0]) + return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2691]! } - public var DialogList_SavedMessages: String { return self._s[2692]! } - public var GroupInfo_UpgradeButton: String { return self._s[2693]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2695]! } - public var DialogList_Pin: String { return self._s[2696]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2681]! } + public var DialogList_SavedMessages: String { return self._s[2682]! } + public var GroupInfo_UpgradeButton: String { return self._s[2683]! } + public var DialogList_Pin: String { return self._s[2685]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2697]!, self._r[2697]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2686]!, self._r[2686]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2698]!, self._r[2698]!, [_0]) + return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2699]! } - public var UserInfo_NotificationsDisable: String { return self._s[2700]! } - public var Paint_Outlined: String { return self._s[2701]! } - public var Activity_PlayingGame: String { return self._s[2702]! } - public var SearchImages_NoImagesFound: String { return self._s[2703]! } - public var SocksProxySetup_ProxyType: String { return self._s[2704]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2706]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2707]! } - public var Settings_AppLanguage: String { return self._s[2708]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2709]! } - public var Common_ChoosePhoto: String { return self._s[2710]! } - public var CallFeedback_ReasonEcho: String { return self._s[2711]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2688]! } + public var UserInfo_NotificationsDisable: String { return self._s[2689]! } + public var Paint_Outlined: String { return self._s[2690]! } + public var Activity_PlayingGame: String { return self._s[2691]! } + public var SearchImages_NoImagesFound: String { return self._s[2692]! } + public var SocksProxySetup_ProxyType: String { return self._s[2693]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2695]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2696]! } + public var Settings_AppLanguage: String { return self._s[2697]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2698]! } + public var Common_ChoosePhoto: String { return self._s[2699]! } + public var CallFeedback_ReasonEcho: String { return self._s[2700]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2712]!, self._r[2712]!, [_1]) + return formatWithArgumentRanges(self._s[2701]!, self._r[2701]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2713]! } - public var Activity_UploadingVideo: String { return self._s[2714]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2715]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2716]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2717]! } - public var Checkout_PayWithTouchId: String { return self._s[2718]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2719]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2702]! } + public var Activity_UploadingVideo: String { return self._s[2703]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2704]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2705]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2706]! } + public var Checkout_PayWithTouchId: String { return self._s[2707]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2708]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_1]) + return formatWithArgumentRanges(self._s[2710]!, self._r[2710]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2722]! } + public var Notifications_ExceptionsNone: String { return self._s[2711]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2723]!, self._r[2723]!, [_0]) + return formatWithArgumentRanges(self._s[2712]!, self._r[2712]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2724]!, self._r[2724]!, [_1]) + return formatWithArgumentRanges(self._s[2713]!, self._r[2713]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2726]! } - public var Passport_Address_Region: String { return self._s[2729]! } - public var ChatList_DeleteChat: String { return self._s[2730]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2731]! } - public var PhotoEditor_TiltShift: String { return self._s[2732]! } - public var Settings_FAQ_URL: String { return self._s[2733]! } - public var Passport_Language_sl: String { return self._s[2734]! } - public var Settings_PrivacySettings: String { return self._s[2736]! } - public var SharedMedia_TitleLink: String { return self._s[2737]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2738]! } - public var Settings_SetProfilePhoto: String { return self._s[2739]! } - public var Channel_About_Help: String { return self._s[2740]! } - public var Contacts_PermissionsEnable: String { return self._s[2741]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2742]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2743]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2745]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2746]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2747]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2748]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2749]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2751]! } - public var Map_OpenInYandexMaps: String { return self._s[2753]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2754]! } - public var PhotoEditor_SaturationTool: String { return self._s[2755]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2715]! } + public var Passport_Address_Region: String { return self._s[2718]! } + public var ChatList_DeleteChat: String { return self._s[2719]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2720]! } + public var PhotoEditor_TiltShift: String { return self._s[2721]! } + public var Settings_FAQ_URL: String { return self._s[2722]! } + public var Passport_Language_sl: String { return self._s[2723]! } + public var Settings_PrivacySettings: String { return self._s[2725]! } + public var SharedMedia_TitleLink: String { return self._s[2726]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2727]! } + public var Settings_SetProfilePhoto: String { return self._s[2728]! } + public var Channel_About_Help: String { return self._s[2729]! } + public var Contacts_PermissionsEnable: String { return self._s[2730]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2731]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2732]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2734]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2735]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2736]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2737]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2738]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2740]! } + public var Map_OpenInYandexMaps: String { return self._s[2742]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2743]! } + public var PhotoEditor_SaturationTool: String { return self._s[2744]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2756]!, self._r[2756]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2745]!, self._r[2745]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2757]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2758]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2759]! } - public var Appearance_TextSize: String { return self._s[2760]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2746]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2747]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2748]! } + public var Appearance_TextSize: String { return self._s[2749]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2761]!, self._r[2761]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2750]!, self._r[2750]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2762]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2764]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2752]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2765]!, self._r[2765]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2766]!, self._r[2766]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2767]! } - public var Passport_PassportInformation: String { return self._s[2770]! } - public var WatchRemote_AlertTitle: String { return self._s[2771]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2772]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2774]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2755]! } + public var Passport_PassportInformation: String { return self._s[2758]! } + public var WatchRemote_AlertTitle: String { return self._s[2759]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2760]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2762]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2775]!, self._r[2775]!, [_0]) + return formatWithArgumentRanges(self._s[2763]!, self._r[2763]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2776]!, self._r[2776]!, [_1]) + return formatWithArgumentRanges(self._s[2764]!, self._r[2764]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2777]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2779]! } - public var AccessDenied_CameraDisabled: String { return self._s[2780]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2765]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2767]! } + public var AccessDenied_CameraDisabled: String { return self._s[2768]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_0]) + return formatWithArgumentRanges(self._s[2769]!, self._r[2769]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2784]! } + public var PhotoEditor_ContrastTool: String { return self._s[2772]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2785]!, self._r[2785]!, [_1]) + return formatWithArgumentRanges(self._s[2773]!, self._r[2773]!, [_1]) } - public var DialogList_Draft: String { return self._s[2786]! } - public var Privacy_TopPeersDelete: String { return self._s[2788]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2789]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2790]! } - public var WebSearch_RecentSectionClear: String { return self._s[2791]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2793]! } - public var Common_Done: String { return self._s[2795]! } - public var AuthSessions_EmptyText: String { return self._s[2796]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2797]! } - public var Tour_Title5: String { return self._s[2798]! } + public var DialogList_Draft: String { return self._s[2774]! } + public var Privacy_TopPeersDelete: String { return self._s[2776]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2777]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2778]! } + public var WebSearch_RecentSectionClear: String { return self._s[2779]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2781]! } + public var Common_Done: String { return self._s[2783]! } + public var AuthSessions_EmptyText: String { return self._s[2784]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2785]! } + public var Tour_Title5: String { return self._s[2786]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2799]!, self._r[2799]!, [_0]) + return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2800]! } - public var Conversation_LinkDialogSave: String { return self._s[2801]! } - public var GroupInfo_ActionRestrict: String { return self._s[2802]! } - public var Checkout_Title: String { return self._s[2803]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2805]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2807]! } - public var Notification_RenamedGroup: String { return self._s[2808]! } - public var PeopleNearby_Groups: String { return self._s[2809]! } - public var Checkout_PayWithFaceId: String { return self._s[2810]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2811]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2813]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2814]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2815]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2788]! } + public var Conversation_LinkDialogSave: String { return self._s[2789]! } + public var GroupInfo_ActionRestrict: String { return self._s[2790]! } + public var Checkout_Title: String { return self._s[2791]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2793]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2795]! } + public var Notification_RenamedGroup: String { return self._s[2796]! } + public var PeopleNearby_Groups: String { return self._s[2797]! } + public var Checkout_PayWithFaceId: String { return self._s[2798]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2799]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2801]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2802]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2803]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2816]!, self._r[2816]!, [_0]) + return formatWithArgumentRanges(self._s[2804]!, self._r[2804]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2818]! } + public var Profile_AddToExisting: String { return self._s[2806]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2819]!, self._r[2819]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2807]!, self._r[2807]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2821]! } - public var Permissions_PrivacyPolicy: String { return self._s[2822]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2823]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2824]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2826]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2828]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2829]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2830]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2832]! } + public var Cache_Files: String { return self._s[2809]! } + public var Permissions_PrivacyPolicy: String { return self._s[2810]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2811]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2812]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2814]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2816]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2817]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2819]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2833]!, self._r[2833]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2820]!, self._r[2820]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2834]! } - public var Passport_FieldAddressHelp: String { return self._s[2835]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2836]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2821]! } + public var Passport_FieldAddressHelp: String { return self._s[2822]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2823]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) + return formatWithArgumentRanges(self._s[2824]!, self._r[2824]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2838]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2840]! } - public var Login_UnknownError: String { return self._s[2841]! } - public var Group_UpgradeNoticeText2: String { return self._s[2843]! } - public var Watch_Compose_AddContact: String { return self._s[2844]! } - public var Web_Error: String { return self._s[2845]! } - public var Gif_Search: String { return self._s[2846]! } - public var Profile_MessageLifetime1h: String { return self._s[2847]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2848]! } - public var Channel_Username_CheckingUsername: String { return self._s[2849]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2850]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2851]! } - public var Channel_AboutItem: String { return self._s[2852]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2854]! } - public var GroupInfo_SharedMedia: String { return self._s[2855]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2825]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2827]! } + public var Login_UnknownError: String { return self._s[2828]! } + public var Group_UpgradeNoticeText2: String { return self._s[2830]! } + public var Watch_Compose_AddContact: String { return self._s[2831]! } + public var Web_Error: String { return self._s[2832]! } + public var Gif_Search: String { return self._s[2833]! } + public var Profile_MessageLifetime1h: String { return self._s[2834]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2835]! } + public var Channel_Username_CheckingUsername: String { return self._s[2836]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2837]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2838]! } + public var Channel_AboutItem: String { return self._s[2839]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2841]! } + public var GroupInfo_SharedMedia: String { return self._s[2842]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2856]!, self._r[2856]!, [_1]) + return formatWithArgumentRanges(self._s[2843]!, self._r[2843]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[2857]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2844]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2858]!, self._r[2858]!, [_1]) + return formatWithArgumentRanges(self._s[2845]!, self._r[2845]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2859]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2860]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2861]! } - public var CreatePoll_AddOption: String { return self._s[2862]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2863]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2864]! } - public var Channel_Management_AddModerator: String { return self._s[2865]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2866]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2867]! } - public var NotificationsSound_Hello: String { return self._s[2868]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2869]! } - public var Channel_Stickers_Placeholder: String { return self._s[2871]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2846]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2847]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2848]! } + public var CreatePoll_AddOption: String { return self._s[2849]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2850]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2851]! } + public var Channel_Management_AddModerator: String { return self._s[2852]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2853]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2854]! } + public var NotificationsSound_Hello: String { return self._s[2855]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2856]! } + public var Channel_Stickers_Placeholder: String { return self._s[2858]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2872]!, self._r[2872]!, [_0]) + return formatWithArgumentRanges(self._s[2859]!, self._r[2859]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2873]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2874]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2875]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2876]! } - public var AutoDownloadSettings_Channels: String { return self._s[2877]! } - public var Passport_Language_mn: String { return self._s[2878]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2881]! } - public var Passport_Language_ja: String { return self._s[2883]! } - public var Settings_About_Title: String { return self._s[2884]! } - public var Settings_NotificationsAndSounds: String { return self._s[2885]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2886]! } - public var Settings_BlockedUsers: String { return self._s[2887]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2860]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2861]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2862]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2863]! } + public var AutoDownloadSettings_Channels: String { return self._s[2864]! } + public var Passport_Language_mn: String { return self._s[2865]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2868]! } + public var Passport_Language_ja: String { return self._s[2870]! } + public var Settings_About_Title: String { return self._s[2871]! } + public var Settings_NotificationsAndSounds: String { return self._s[2872]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2873]! } + public var Settings_BlockedUsers: String { return self._s[2874]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2888]!, self._r[2888]!, [_0]) + return formatWithArgumentRanges(self._s[2875]!, self._r[2875]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2889]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2890]! } - public var Channel_Username_Title: String { return self._s[2891]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[2876]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[2877]! } + public var Channel_Username_Title: String { return self._s[2878]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2892]!, self._r[2892]!, [_0]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[2894]! } - public var AppleWatch_Title: String { return self._s[2895]! } - public var Activity_RecordingVideoMessage: String { return self._s[2896]! } + public var AttachmentMenu_File: String { return self._s[2881]! } + public var AppleWatch_Title: String { return self._s[2882]! } + public var Activity_RecordingVideoMessage: String { return self._s[2883]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2884]!, self._r[2884]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[2898]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[2899]! } - public var Profile_CreateEncryptedChatError: String { return self._s[2900]! } - public var Common_Next: String { return self._s[2902]! } - public var Channel_Stickers_YourStickers: String { return self._s[2904]! } - public var Call_AudioRouteHeadphones: String { return self._s[2905]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[2907]! } - public var Watch_Contacts_NoResults: String { return self._s[2909]! } - public var PhotoEditor_TintTool: String { return self._s[2912]! } - public var LoginPassword_ResetAccount: String { return self._s[2914]! } - public var Settings_SavedMessages: String { return self._s[2915]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[2916]! } - public var Bot_GenericSupportStatus: String { return self._s[2917]! } - public var StickerPack_Add: String { return self._s[2918]! } - public var Checkout_TotalAmount: String { return self._s[2919]! } - public var Your_cards_number_is_invalid: String { return self._s[2920]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[2921]! } + public var Weekday_Saturday: String { return self._s[2885]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[2886]! } + public var Profile_CreateEncryptedChatError: String { return self._s[2887]! } + public var Common_Next: String { return self._s[2889]! } + public var Channel_Stickers_YourStickers: String { return self._s[2891]! } + public var Call_AudioRouteHeadphones: String { return self._s[2892]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[2894]! } + public var Watch_Contacts_NoResults: String { return self._s[2896]! } + public var PhotoEditor_TintTool: String { return self._s[2899]! } + public var LoginPassword_ResetAccount: String { return self._s[2901]! } + public var Settings_SavedMessages: String { return self._s[2902]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[2903]! } + public var Bot_GenericSupportStatus: String { return self._s[2904]! } + public var StickerPack_Add: String { return self._s[2905]! } + public var Checkout_TotalAmount: String { return self._s[2906]! } + public var Your_cards_number_is_invalid: String { return self._s[2907]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[2908]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_0]) + return formatWithArgumentRanges(self._s[2909]!, self._r[2909]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2910]!, self._r[2910]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2924]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2911]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2926]!, self._r[2926]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2913]!, self._r[2913]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2927]!, self._r[2927]!, [_0]) + return formatWithArgumentRanges(self._s[2914]!, self._r[2914]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[2928]! } - public var StickerPack_Share: String { return self._s[2929]! } - public var Passport_DeleteAddress: String { return self._s[2930]! } - public var Settings_Passport: String { return self._s[2931]! } - public var SharedMedia_EmptyFilesText: String { return self._s[2932]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[2933]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[2934]! } - public var Contacts_PermissionsText: String { return self._s[2935]! } - public var Group_Setup_HistoryVisible: String { return self._s[2936]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[2938]! } - public var SocksProxySetup_Title: String { return self._s[2939]! } - public var Notification_Mute1h: String { return self._s[2940]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[2915]! } + public var StickerPack_Share: String { return self._s[2916]! } + public var Passport_DeleteAddress: String { return self._s[2917]! } + public var Settings_Passport: String { return self._s[2918]! } + public var SharedMedia_EmptyFilesText: String { return self._s[2919]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[2920]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[2921]! } + public var Contacts_PermissionsText: String { return self._s[2922]! } + public var Group_Setup_HistoryVisible: String { return self._s[2923]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[2925]! } + public var SocksProxySetup_Title: String { return self._s[2926]! } + public var Notification_Mute1h: String { return self._s[2927]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2941]!, self._r[2941]!, [_0]) + return formatWithArgumentRanges(self._s[2928]!, self._r[2928]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[2942]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[2929]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2943]!, self._r[2943]!, [_1]) + return formatWithArgumentRanges(self._s[2930]!, self._r[2930]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[2944]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2947]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[2949]! } - public var DialogList_NoMessagesText: String { return self._s[2950]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[2951]! } - public var Privacy_Calls_P2PHelp: String { return self._s[2952]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[2954]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[2955]! } - public var Common_TakePhotoOrVideo: String { return self._s[2956]! } - public var Call_StatusBusy: String { return self._s[2957]! } - public var Conversation_PinnedMessage: String { return self._s[2958]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[2959]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[2960]! } - public var Undo_ChatCleared: String { return self._s[2961]! } - public var AppleWatch_ReplyPresets: String { return self._s[2962]! } - public var Passport_DiscardMessageDescription: String { return self._s[2964]! } - public var Login_NetworkError: String { return self._s[2965]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[2931]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2934]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[2936]! } + public var DialogList_NoMessagesText: String { return self._s[2937]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[2938]! } + public var Privacy_Calls_P2PHelp: String { return self._s[2939]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[2941]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[2942]! } + public var Common_TakePhotoOrVideo: String { return self._s[2943]! } + public var Call_StatusBusy: String { return self._s[2944]! } + public var Conversation_PinnedMessage: String { return self._s[2945]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[2946]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[2947]! } + public var Undo_ChatCleared: String { return self._s[2948]! } + public var AppleWatch_ReplyPresets: String { return self._s[2949]! } + public var Passport_DiscardMessageDescription: String { return self._s[2951]! } + public var Login_NetworkError: String { return self._s[2952]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2966]!, self._r[2966]!, [_0]) + return formatWithArgumentRanges(self._s[2953]!, self._r[2953]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2967]!, self._r[2967]!, [_0]) + return formatWithArgumentRanges(self._s[2954]!, self._r[2954]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[2968]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2970]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[2955]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2957]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2972]!, self._r[2972]!, [_0]) + return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[2973]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[2974]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[2976]! } - public var ConversationMedia_Title: String { return self._s[2977]! } - public var EncryptionKey_Title: String { return self._s[2979]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[2980]! } - public var Notification_Exceptions_AddException: String { return self._s[2981]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[2982]! } - public var Profile_MessageLifetime1m: String { return self._s[2983]! } + public var Call_ConnectionErrorMessage: String { return self._s[2960]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[2961]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[2963]! } + public var ConversationMedia_Title: String { return self._s[2964]! } + public var EncryptionKey_Title: String { return self._s[2966]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[2967]! } + public var Notification_Exceptions_AddException: String { return self._s[2968]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[2969]! } + public var Profile_MessageLifetime1m: String { return self._s[2970]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2984]!, self._r[2984]!, [_1]) + return formatWithArgumentRanges(self._s[2971]!, self._r[2971]!, [_1]) } - public var Month_GenMay: String { return self._s[2985]! } + public var Month_GenMay: String { return self._s[2972]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2986]!, self._r[2986]!, [_0]) + return formatWithArgumentRanges(self._s[2973]!, self._r[2973]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[2987]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2988]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[2989]! } - public var Conversation_EmptyPlaceholder: String { return self._s[2991]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[2992]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[2993]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2994]! } - public var Camera_TapAndHoldForVideo: String { return self._s[2995]! } - public var Channel_JoinChannel: String { return self._s[2997]! } - public var Appearance_Animations: String { return self._s[3000]! } + public var PeopleNearby_Users: String { return self._s[2974]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2975]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[2976]! } + public var Conversation_EmptyPlaceholder: String { return self._s[2978]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[2979]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[2980]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2981]! } + public var Camera_TapAndHoldForVideo: String { return self._s[2982]! } + public var Channel_JoinChannel: String { return self._s[2984]! } + public var Appearance_Animations: String { return self._s[2987]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3001]!, self._r[3001]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2988]!, self._r[2988]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3003]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3005]! } - public var Passport_Address_Street: String { return self._s[3006]! } - public var Conversation_AddContact: String { return self._s[3007]! } - public var Login_PhonePlaceholder: String { return self._s[3008]! } - public var Channel_Members_InviteLink: String { return self._s[3010]! } - public var Bot_Stop: String { return self._s[3011]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3013]! } - public var Notification_PassportValueAddress: String { return self._s[3014]! } - public var Month_ShortJuly: String { return self._s[3015]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3016]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3017]! } - public var Passport_Identity_ReverseSide: String { return self._s[3018]! } - public var Watch_Stickers_Recents: String { return self._s[3021]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3023]! } - public var Map_SendThisLocation: String { return self._s[3024]! } + public var Stickers_GroupStickers: String { return self._s[2990]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[2992]! } + public var Passport_Address_Street: String { return self._s[2993]! } + public var Conversation_AddContact: String { return self._s[2994]! } + public var Login_PhonePlaceholder: String { return self._s[2995]! } + public var Channel_Members_InviteLink: String { return self._s[2997]! } + public var Bot_Stop: String { return self._s[2998]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3000]! } + public var Notification_PassportValueAddress: String { return self._s[3001]! } + public var Month_ShortJuly: String { return self._s[3002]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3003]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3004]! } + public var Passport_Identity_ReverseSide: String { return self._s[3005]! } + public var Watch_Stickers_Recents: String { return self._s[3008]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3010]! } + public var Map_SendThisLocation: String { return self._s[3011]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3025]!, self._r[3025]!, [_0]) + return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3026]!, self._r[3026]!, [_0]) + return formatWithArgumentRanges(self._s[3013]!, self._r[3013]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3027]! } + public var ConvertToSupergroup_Note: String { return self._s[3014]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3028]!, self._r[3028]!, [_0]) + return formatWithArgumentRanges(self._s[3015]!, self._r[3015]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3029]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3016]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3017]!, self._r[3017]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3032]! } - public var Wallpaper_SearchShort: String { return self._s[3033]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3035]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3036]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3037]! } + public var Login_CallRequestState3: String { return self._s[3019]! } + public var Wallpaper_SearchShort: String { return self._s[3020]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3022]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3023]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3024]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3025]!, self._r[3025]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3039]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3041]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3044]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3026]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3030]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_0]) + } + public var Passport_CorrectErrors: String { return self._s[3032]! } + public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3033]!, self._r[3033]!, [_0]) + } + public var Map_SendMyCurrentLocation: String { return self._s[3034]! } + public var Channel_DiscussionGroup: String { return self._s[3035]! } + public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3036]!, self._r[3036]!, [_1, _2]) + } + public var SharedMedia_SearchNoResults: String { return self._s[3037]! } + public var Permissions_NotificationsText_v0: String { return self._s[3038]! } + public var Appearance_AppIcon: String { return self._s[3039]! } + public var LoginPassword_FloodError: String { return self._s[3040]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3042]! } + public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3043]!, self._r[3043]!, [_0]) + } + public var Passport_Language_bn: String { return self._s[3044]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3045]!, self._r[3045]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3046]! } - public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3047]!, self._r[3047]!, [_0]) - } - public var Map_SendMyCurrentLocation: String { return self._s[3048]! } - public var Channel_DiscussionGroup: String { return self._s[3049]! } - public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3050]!, self._r[3050]!, [_1, _2]) - } - public var SharedMedia_SearchNoResults: String { return self._s[3051]! } - public var Permissions_NotificationsText_v0: String { return self._s[3052]! } - public var Appearance_AppIcon: String { return self._s[3053]! } - public var LoginPassword_FloodError: String { return self._s[3054]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3056]! } - public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3057]!, self._r[3057]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[3058]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3059]!, self._r[3059]!, [_0]) - } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3060]!, self._r[3060]!, [_0]) + return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_0]) } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3061]!, self._r[3061]!, [_0]) + return formatWithArgumentRanges(self._s[3047]!, self._r[3047]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3064]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3066]! } - public var Contacts_PermissionsAllow: String { return self._s[3067]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3068]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3069]! } - public var WallpaperPreview_Pattern: String { return self._s[3070]! } - public var Paint_Duplicate: String { return self._s[3071]! } - public var Passport_Address_Country: String { return self._s[3072]! } - public var Notification_RenamedChannel: String { return self._s[3074]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3075]! } - public var Group_MessagePhotoUpdated: String { return self._s[3076]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3077]! } - public var Conversation_ContextMenuBan: String { return self._s[3078]! } - public var TwoStepAuth_EmailSent: String { return self._s[3079]! } - public var MessagePoll_NoVotes: String { return self._s[3080]! } - public var Passport_Language_is: String { return self._s[3081]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3083]! } - public var Tour_Text5: String { return self._s[3084]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3050]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3052]! } + public var Contacts_PermissionsAllow: String { return self._s[3053]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3054]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3055]! } + public var WallpaperPreview_Pattern: String { return self._s[3056]! } + public var Paint_Duplicate: String { return self._s[3057]! } + public var Passport_Address_Country: String { return self._s[3058]! } + public var Notification_RenamedChannel: String { return self._s[3060]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3061]! } + public var Group_MessagePhotoUpdated: String { return self._s[3062]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3063]! } + public var Conversation_ContextMenuBan: String { return self._s[3064]! } + public var TwoStepAuth_EmailSent: String { return self._s[3065]! } + public var MessagePoll_NoVotes: String { return self._s[3066]! } + public var Passport_Language_is: String { return self._s[3067]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3069]! } + public var Tour_Text5: String { return self._s[3070]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3086]!, self._r[3086]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3072]!, self._r[3072]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3087]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3088]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3089]! } - public var Paint_Edit: String { return self._s[3091]! } - public var Undo_DeletedGroup: String { return self._s[3094]! } - public var LoginPassword_ForgotPassword: String { return self._s[3095]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3096]! } + public var Undo_SecretChatDeleted: String { return self._s[3073]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3074]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3075]! } + public var Paint_Edit: String { return self._s[3077]! } + public var Undo_DeletedGroup: String { return self._s[3080]! } + public var LoginPassword_ForgotPassword: String { return self._s[3081]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3082]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3097]!, self._r[3097]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3083]!, self._r[3083]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3098]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3099]! } - public var Passport_Language_uz: String { return self._s[3100]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3101]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3102]! } - public var Map_StopLiveLocation: String { return self._s[3104]! } - public var PasscodeSettings_Help: String { return self._s[3106]! } - public var NotificationsSound_Input: String { return self._s[3107]! } - public var Share_Title: String { return self._s[3110]! } - public var LogoutOptions_Title: String { return self._s[3111]! } - public var Login_TermsOfServiceAgree: String { return self._s[3112]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3113]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3114]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3115]! } - public var EnterPasscode_EnterTitle: String { return self._s[3116]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3084]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3085]! } + public var Passport_Language_uz: String { return self._s[3086]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3087]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3088]! } + public var Map_StopLiveLocation: String { return self._s[3090]! } + public var PasscodeSettings_Help: String { return self._s[3092]! } + public var NotificationsSound_Input: String { return self._s[3093]! } + public var Share_Title: String { return self._s[3096]! } + public var LogoutOptions_Title: String { return self._s[3097]! } + public var Login_TermsOfServiceAgree: String { return self._s[3098]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3099]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3100]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3101]! } + public var EnterPasscode_EnterTitle: String { return self._s[3102]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3117]!, self._r[3117]!, [_0]) + return formatWithArgumentRanges(self._s[3103]!, self._r[3103]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3118]! } - public var Conversation_AddToContacts: String { return self._s[3119]! } - public var NotificationsSound_Keys: String { return self._s[3120]! } + public var Settings_CopyPhoneNumber: String { return self._s[3104]! } + public var Conversation_AddToContacts: String { return self._s[3105]! } + public var NotificationsSound_Keys: String { return self._s[3106]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3121]!, self._r[3121]!, [_0]) + return formatWithArgumentRanges(self._s[3107]!, self._r[3107]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3122]! } - public var Message_Video: String { return self._s[3123]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3124]! } + public var Notification_MessageLifetime1w: String { return self._s[3108]! } + public var Message_Video: String { return self._s[3109]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3110]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3125]!, self._r[3125]!, [_1]) + return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3128]!, self._r[3128]!, [_0]) + return formatWithArgumentRanges(self._s[3114]!, self._r[3114]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3129]!, self._r[3129]!, [_0]) + return formatWithArgumentRanges(self._s[3115]!, self._r[3115]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3130]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3131]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3133]! } - public var PrivacyPolicy_Decline: String { return self._s[3134]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3135]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3136]! } - public var Permissions_SiriAllow_v0: String { return self._s[3138]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3139]! } + public var Passport_Language_mk: String { return self._s[3116]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3117]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3119]! } + public var PrivacyPolicy_Decline: String { return self._s[3120]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3121]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3122]! } + public var Permissions_SiriAllow_v0: String { return self._s[3124]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3125]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3141]!, self._r[3141]!, [_0]) + return formatWithArgumentRanges(self._s[3127]!, self._r[3127]!, [_0]) } - public var Paint_Regular: String { return self._s[3142]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3143]! } - public var SocksProxySetup_ShareLink: String { return self._s[3144]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3145]! } - public var GroupInfo_InviteByLink: String { return self._s[3147]! } - public var MessageTimer_Custom: String { return self._s[3148]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3149]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3151]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3152]! } - public var Channel_Username_InvalidTaken: String { return self._s[3153]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3154]! } - public var Settings_ChatBackground: String { return self._s[3155]! } - public var Channel_Subscribers_Title: String { return self._s[3156]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3157]! } - public var Watch_ConnectionDescription: String { return self._s[3158]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3162]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3163]! } - public var EditProfile_Title: String { return self._s[3164]! } - public var NotificationsSound_Bamboo: String { return self._s[3166]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3168]! } - public var Login_SmsRequestState2: String { return self._s[3169]! } - public var Passport_Language_ar: String { return self._s[3170]! } + public var Paint_Regular: String { return self._s[3128]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3129]! } + public var SocksProxySetup_ShareLink: String { return self._s[3130]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3131]! } + public var GroupInfo_InviteByLink: String { return self._s[3133]! } + public var MessageTimer_Custom: String { return self._s[3134]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3135]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3137]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3138]! } + public var Channel_Username_InvalidTaken: String { return self._s[3139]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3140]! } + public var Settings_ChatBackground: String { return self._s[3141]! } + public var Channel_Subscribers_Title: String { return self._s[3142]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3143]! } + public var Watch_ConnectionDescription: String { return self._s[3144]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3148]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3149]! } + public var EditProfile_Title: String { return self._s[3150]! } + public var NotificationsSound_Bamboo: String { return self._s[3152]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3154]! } + public var Login_SmsRequestState2: String { return self._s[3155]! } + public var Passport_Language_ar: String { return self._s[3156]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_0]) + return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3172]! } - public var Conversation_MessageDialogEdit: String { return self._s[3173]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3158]! } + public var Conversation_MessageDialogEdit: String { return self._s[3159]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3174]!, self._r[3174]!, [_1]) + return formatWithArgumentRanges(self._s[3160]!, self._r[3160]!, [_1]) } - public var Common_Close: String { return self._s[3175]! } - public var GroupInfo_PublicLink: String { return self._s[3176]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3177]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3178]! } + public var Common_Close: String { return self._s[3161]! } + public var GroupInfo_PublicLink: String { return self._s[3162]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3163]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3164]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3182]!, self._r[3182]!, [_0]) + return formatWithArgumentRanges(self._s[3168]!, self._r[3168]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3183]! } + public var UserInfo_About_Placeholder: String { return self._s[3169]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3184]!, self._r[3184]!, [_0]) + return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3185]! } - public var Channel_Info_Banned: String { return self._s[3187]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3171]! } + public var Channel_Info_Banned: String { return self._s[3173]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_0]) + return formatWithArgumentRanges(self._s[3174]!, self._r[3174]!, [_0]) } - public var Appearance_Other: String { return self._s[3189]! } - public var Passport_Language_my: String { return self._s[3190]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3191]! } + public var Appearance_Other: String { return self._s[3175]! } + public var Passport_Language_my: String { return self._s[3176]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3177]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3192]!, self._r[3192]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3178]!, self._r[3178]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3193]! } - public var Preview_CopyAddress: String { return self._s[3194]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3179]! } + public var Preview_CopyAddress: String { return self._s[3180]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3195]!, self._r[3195]!, [_0]) + return formatWithArgumentRanges(self._s[3181]!, self._r[3181]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3196]! } - public var UserInfo_BotSettings: String { return self._s[3197]! } - public var LiveLocation_MenuStopAll: String { return self._s[3199]! } - public var Passport_PasswordCreate: String { return self._s[3200]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3201]! } - public var Message_PinnedLocationMessage: String { return self._s[3202]! } - public var Map_Satellite: String { return self._s[3203]! } - public var Watch_Message_Unsupported: String { return self._s[3204]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3205]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3206]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3182]! } + public var UserInfo_BotSettings: String { return self._s[3183]! } + public var LiveLocation_MenuStopAll: String { return self._s[3185]! } + public var Passport_PasswordCreate: String { return self._s[3186]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3187]! } + public var Message_PinnedLocationMessage: String { return self._s[3188]! } + public var Map_Satellite: String { return self._s[3189]! } + public var Watch_Message_Unsupported: String { return self._s[3190]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3191]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3192]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3193]!, self._r[3193]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_0]) + return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3209]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3210]! } - public var NotificationsSound_None: String { return self._s[3211]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3213]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3214]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3195]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3196]! } + public var NotificationsSound_None: String { return self._s[3197]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3199]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3200]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3215]!, self._r[3215]!, [_1]) + return formatWithArgumentRanges(self._s[3201]!, self._r[3201]!, [_1]) } - public var Cache_Indexing: String { return self._s[3216]! } - public var DialogList_RecentTitlePeople: String { return self._s[3218]! } - public var DialogList_EncryptionRejected: String { return self._s[3219]! } - public var GroupInfo_Administrators: String { return self._s[3220]! } - public var Passport_ScanPassportHelp: String { return self._s[3221]! } - public var Application_Name: String { return self._s[3222]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3223]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3225]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3226]! } + public var Cache_Indexing: String { return self._s[3202]! } + public var DialogList_RecentTitlePeople: String { return self._s[3204]! } + public var DialogList_EncryptionRejected: String { return self._s[3205]! } + public var GroupInfo_Administrators: String { return self._s[3206]! } + public var Passport_ScanPassportHelp: String { return self._s[3207]! } + public var Application_Name: String { return self._s[3208]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3209]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3211]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3212]! } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_0]) + return formatWithArgumentRanges(self._s[3213]!, self._r[3213]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3214]!, self._r[3214]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3215]! } + public var Privacy_ChatsTitle: String { return self._s[3216]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3217]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3218]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3219]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3220]! } + public var Group_LinkedChannel: String { return self._s[3221]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3222]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3223]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3224]! } + public var Channel_Setup_TypePublic: String { return self._s[3227]! } + public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3228]!, self._r[3228]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3229]! } - public var Privacy_ChatsTitle: String { return self._s[3230]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3231]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3232]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3233]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3234]! } - public var Group_LinkedChannel: String { return self._s[3235]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3236]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3237]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3238]! } - public var Channel_Setup_TypePublic: String { return self._s[3241]! } - public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3242]!, self._r[3242]!, [_0]) - } - public var Channel_TypeSetup_Title: String { return self._s[3244]! } - public var Map_OpenInMaps: String { return self._s[3246]! } + public var Channel_TypeSetup_Title: String { return self._s[3230]! } + public var Map_OpenInMaps: String { return self._s[3232]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_1]) + return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3249]! } + public var NotificationsSound_Tremolo: String { return self._s[3235]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3250]!, self._r[3250]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3251]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3252]! } - public var Passport_PasswordHelp: String { return self._s[3253]! } - public var Login_CodeExpiredError: String { return self._s[3254]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3255]! } - public var Conversation_TitleUnmute: String { return self._s[3256]! } - public var Passport_Identity_ScansHelp: String { return self._s[3257]! } - public var Passport_Language_lo: String { return self._s[3258]! } - public var Camera_FlashAuto: String { return self._s[3259]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3260]! } - public var Common_Cancel: String { return self._s[3261]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3262]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3263]! } - public var Appearance_TintAllColors: String { return self._s[3264]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3237]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3238]! } + public var Passport_PasswordHelp: String { return self._s[3239]! } + public var Login_CodeExpiredError: String { return self._s[3240]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3241]! } + public var Conversation_TitleUnmute: String { return self._s[3242]! } + public var Passport_Identity_ScansHelp: String { return self._s[3243]! } + public var Passport_Language_lo: String { return self._s[3244]! } + public var Camera_FlashAuto: String { return self._s[3245]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3246]! } + public var Common_Cancel: String { return self._s[3247]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3248]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3249]! } + public var Appearance_TintAllColors: String { return self._s[3250]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3265]!, self._r[3265]!, [_1]) + return formatWithArgumentRanges(self._s[3251]!, self._r[3251]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3266]! } - public var ChatSettings_Title: String { return self._s[3268]! } - public var Passport_PasswordReset: String { return self._s[3269]! } - public var SocksProxySetup_TypeNone: String { return self._s[3270]! } - public var PhoneNumberHelp_Help: String { return self._s[3272]! } - public var Checkout_EnterPassword: String { return self._s[3273]! } - public var Share_AuthTitle: String { return self._s[3275]! } - public var Activity_UploadingDocument: String { return self._s[3276]! } - public var State_Connecting: String { return self._s[3277]! } - public var Profile_MessageLifetime1w: String { return self._s[3278]! } - public var Conversation_ContextMenuReport: String { return self._s[3279]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3280]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3281]! } - public var AuthSessions_Terminate: String { return self._s[3282]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3283]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3284]! } - public var PhotoEditor_Set: String { return self._s[3285]! } - public var EmptyGroupInfo_Title: String { return self._s[3286]! } - public var Login_PadPhoneHelp: String { return self._s[3287]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3289]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3291]! } - public var NotificationsSound_Complete: String { return self._s[3292]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3293]! } - public var Group_Info_AdminLog: String { return self._s[3294]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3295]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3296]! } - public var Conversation_Admin: String { return self._s[3298]! } - public var Conversation_GifTooltip: String { return self._s[3299]! } - public var Passport_NotLoggedInMessage: String { return self._s[3300]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3252]! } + public var ChatSettings_Title: String { return self._s[3254]! } + public var Passport_PasswordReset: String { return self._s[3255]! } + public var SocksProxySetup_TypeNone: String { return self._s[3256]! } + public var PhoneNumberHelp_Help: String { return self._s[3258]! } + public var Checkout_EnterPassword: String { return self._s[3259]! } + public var Share_AuthTitle: String { return self._s[3261]! } + public var Activity_UploadingDocument: String { return self._s[3262]! } + public var State_Connecting: String { return self._s[3263]! } + public var Profile_MessageLifetime1w: String { return self._s[3264]! } + public var Conversation_ContextMenuReport: String { return self._s[3265]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3266]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3267]! } + public var AuthSessions_Terminate: String { return self._s[3268]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3269]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3270]! } + public var PhotoEditor_Set: String { return self._s[3271]! } + public var EmptyGroupInfo_Title: String { return self._s[3272]! } + public var Login_PadPhoneHelp: String { return self._s[3273]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3275]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3277]! } + public var NotificationsSound_Complete: String { return self._s[3278]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3279]! } + public var Group_Info_AdminLog: String { return self._s[3280]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3281]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3282]! } + public var Conversation_Admin: String { return self._s[3284]! } + public var Conversation_GifTooltip: String { return self._s[3285]! } + public var Passport_NotLoggedInMessage: String { return self._s[3286]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3301]!, self._r[3301]!, [_0]) + return formatWithArgumentRanges(self._s[3287]!, self._r[3287]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3302]! } - public var SharedMedia_EmptyTitle: String { return self._s[3304]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3306]! } - public var Username_Help: String { return self._s[3307]! } - public var DialogList_LanguageTooltip: String { return self._s[3309]! } - public var Map_LoadError: String { return self._s[3310]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3311]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3312]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3313]! } - public var Notification_Exceptions_NewException: String { return self._s[3314]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3315]! } - public var WatchRemote_AlertText: String { return self._s[3316]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3319]! } + public var Profile_MessageLifetimeForever: String { return self._s[3288]! } + public var SharedMedia_EmptyTitle: String { return self._s[3290]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3292]! } + public var Username_Help: String { return self._s[3293]! } + public var DialogList_LanguageTooltip: String { return self._s[3295]! } + public var Map_LoadError: String { return self._s[3296]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3297]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3298]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3299]! } + public var Notification_Exceptions_NewException: String { return self._s[3300]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3301]! } + public var WatchRemote_AlertText: String { return self._s[3302]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3305]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) + return formatWithArgumentRanges(self._s[3306]!, self._r[3306]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3321]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3322]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3307]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3308]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3323]!, self._r[3323]!, [_0]) + return formatWithArgumentRanges(self._s[3309]!, self._r[3309]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3324]!, self._r[3324]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3310]!, self._r[3310]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3325]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3326]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3328]! } - public var ChatList_UndoArchiveText1: String { return self._s[3329]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3330]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3331]! } - public var Cache_ClearNone: String { return self._s[3332]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3333]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3334]! } + public var Group_AdminLog_EmptyText: String { return self._s[3311]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3312]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3314]! } + public var ChatList_UndoArchiveText1: String { return self._s[3315]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3316]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3317]! } + public var Cache_ClearNone: String { return self._s[3318]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3319]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3320]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3335]!, self._r[3335]!, [_0]) + return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3336]! } + public var Passport_Identity_Country: String { return self._s[3322]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3337]!, self._r[3337]!, [_0]) + return formatWithArgumentRanges(self._s[3323]!, self._r[3323]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3338]!, self._r[3338]!, [_0]) + return formatWithArgumentRanges(self._s[3324]!, self._r[3324]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3339]! } - public var AccessDenied_Settings: String { return self._s[3340]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3341]! } - public var Month_ShortMay: String { return self._s[3342]! } - public var Compose_NewGroup: String { return self._s[3343]! } - public var Group_Setup_TypePrivate: String { return self._s[3345]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3347]! } - public var Appearance_ThemeDayClassic: String { return self._s[3348]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3349]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3350]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3351]! } - public var Conversation_typing: String { return self._s[3353]! } - public var Paint_Masks: String { return self._s[3354]! } - public var Contacts_DeselectAll: String { return self._s[3355]! } - public var Username_InvalidTaken: String { return self._s[3356]! } - public var Call_StatusNoAnswer: String { return self._s[3357]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3358]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3359]! } - public var Passport_Identity_Selfie: String { return self._s[3360]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3361]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3362]! } - public var Conversation_ClearSecretHistory: String { return self._s[3363]! } - public var PeopleNearby_Description: String { return self._s[3365]! } - public var NetworkUsageSettings_Title: String { return self._s[3366]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3368]! } + public var Exceptions_AddToExceptions: String { return self._s[3325]! } + public var AccessDenied_Settings: String { return self._s[3326]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3327]! } + public var Month_ShortMay: String { return self._s[3328]! } + public var Compose_NewGroup: String { return self._s[3329]! } + public var Group_Setup_TypePrivate: String { return self._s[3331]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3333]! } + public var Appearance_ThemeDayClassic: String { return self._s[3334]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3335]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3336]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3337]! } + public var Conversation_typing: String { return self._s[3339]! } + public var Paint_Masks: String { return self._s[3340]! } + public var Contacts_DeselectAll: String { return self._s[3341]! } + public var Username_InvalidTaken: String { return self._s[3342]! } + public var Call_StatusNoAnswer: String { return self._s[3343]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3344]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3345]! } + public var Passport_Identity_Selfie: String { return self._s[3346]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3347]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3348]! } + public var Conversation_ClearSecretHistory: String { return self._s[3349]! } + public var PeopleNearby_Description: String { return self._s[3351]! } + public var NetworkUsageSettings_Title: String { return self._s[3352]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3354]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3370]!, self._r[3370]!, [_0]) + return formatWithArgumentRanges(self._s[3356]!, self._r[3356]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3371]!, self._r[3371]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3373]! } - public var Map_LiveLocationTitle: String { return self._s[3374]! } - public var Login_InfoAvatarAdd: String { return self._s[3375]! } - public var Passport_Identity_FilesView: String { return self._s[3376]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3377]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3378]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3359]! } + public var Map_LiveLocationTitle: String { return self._s[3360]! } + public var Login_InfoAvatarAdd: String { return self._s[3361]! } + public var Passport_Identity_FilesView: String { return self._s[3362]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3363]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3364]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3379]!, self._r[3379]!, [_0]) + return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3380]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3381]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3382]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3366]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3367]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3368]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3383]!, self._r[3383]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3369]!, self._r[3369]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3384]! } - public var Tour_Title2: String { return self._s[3385]! } - public var Conversation_FileOpenIn: String { return self._s[3386]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3387]! } - public var Wallpaper_Set: String { return self._s[3388]! } - public var Passport_Identity_Translations: String { return self._s[3390]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3370]! } + public var Tour_Title2: String { return self._s[3371]! } + public var Conversation_FileOpenIn: String { return self._s[3372]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3373]! } + public var Wallpaper_Set: String { return self._s[3374]! } + public var Passport_Identity_Translations: String { return self._s[3376]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3391]!, self._r[3391]!, [_0]) + return formatWithArgumentRanges(self._s[3377]!, self._r[3377]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3392]! } + public var Channel_LeaveChannel: String { return self._s[3378]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3393]!, self._r[3393]!, [_1]) + return formatWithArgumentRanges(self._s[3379]!, self._r[3379]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3394]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3395]! } - public var Passport_Email_Delete: String { return self._s[3396]! } - public var Conversation_Mute: String { return self._s[3398]! } - public var Channel_AddBotAsAdmin: String { return self._s[3399]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3401]! } - public var Channel_Management_LabelOwner: String { return self._s[3403]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3380]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3381]! } + public var Passport_Email_Delete: String { return self._s[3382]! } + public var Conversation_Mute: String { return self._s[3384]! } + public var Channel_AddBotAsAdmin: String { return self._s[3385]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3387]! } + public var Channel_Management_LabelOwner: String { return self._s[3389]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3404]!, self._r[3404]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3390]!, self._r[3390]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3405]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3406]! } - public var Common_No: String { return self._s[3407]! } - public var Weekday_Sunday: String { return self._s[3408]! } - public var Notification_Reply: String { return self._s[3409]! } - public var Conversation_ViewMessage: String { return self._s[3410]! } + public var Calls_CallTabDescription: String { return self._s[3391]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3392]! } + public var Common_No: String { return self._s[3393]! } + public var Weekday_Sunday: String { return self._s[3394]! } + public var Notification_Reply: String { return self._s[3395]! } + public var Conversation_ViewMessage: String { return self._s[3396]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3411]!, self._r[3411]!, [_0]) + return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_0]) + return formatWithArgumentRanges(self._s[3398]!, self._r[3398]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3413]! } - public var Message_PinnedDocumentMessage: String { return self._s[3414]! } - public var DialogList_TabTitle: String { return self._s[3416]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3417]! } - public var Passport_FieldEmail: String { return self._s[3418]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3419]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3420]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3421]! } - public var Privacy_Calls_P2P: String { return self._s[3422]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3399]! } + public var Message_PinnedDocumentMessage: String { return self._s[3400]! } + public var DialogList_TabTitle: String { return self._s[3402]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3403]! } + public var Passport_FieldEmail: String { return self._s[3404]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3405]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3406]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3407]! } + public var Privacy_Calls_P2P: String { return self._s[3408]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3424]!, self._r[3424]!, [_0]) + return formatWithArgumentRanges(self._s[3410]!, self._r[3410]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3425]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3411]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3427]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3428]! } - public var Passport_InfoText: String { return self._s[3429]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3430]! } + public var Stickers_ClearRecent: String { return self._s[3413]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3414]! } + public var Passport_InfoText: String { return self._s[3415]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3416]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3431]!, self._r[3431]!, [_0]) + return formatWithArgumentRanges(self._s[3417]!, self._r[3417]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3432]!, self._r[3432]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3418]!, self._r[3418]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3433]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3434]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3436]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3437]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3419]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3420]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3422]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3423]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3438]!, self._r[3438]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3424]!, self._r[3424]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3440]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3426]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3442]!, self._r[3442]!, [_0]) + return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_0]) } - public var DialogList_Unread: String { return self._s[3443]! } + public var DialogList_Unread: String { return self._s[3429]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3430]!, self._r[3430]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3445]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3446]! } + public var User_DeletedAccount: String { return self._s[3431]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3432]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3447]!, self._r[3447]!, [_0]) + return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3448]! } - public var SharedMedia_CategoryMedia: String { return self._s[3449]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3450]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3451]! } - public var Watch_ChatList_Compose: String { return self._s[3452]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3453]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3454]! } - public var Watch_Microphone_Access: String { return self._s[3455]! } - public var Group_Setup_HistoryHeader: String { return self._s[3456]! } - public var Map_SetThisLocation: String { return self._s[3457]! } - public var Activity_UploadingPhoto: String { return self._s[3458]! } - public var Conversation_Edit: String { return self._s[3460]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3461]! } - public var Login_TermsOfServiceDecline: String { return self._s[3462]! } - public var Message_PinnedContactMessage: String { return self._s[3463]! } + public var UserInfo_NotificationsDefault: String { return self._s[3434]! } + public var SharedMedia_CategoryMedia: String { return self._s[3435]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3436]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3437]! } + public var Watch_ChatList_Compose: String { return self._s[3438]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3439]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3440]! } + public var Watch_Microphone_Access: String { return self._s[3441]! } + public var Group_Setup_HistoryHeader: String { return self._s[3442]! } + public var Map_SetThisLocation: String { return self._s[3443]! } + public var Activity_UploadingPhoto: String { return self._s[3444]! } + public var Conversation_Edit: String { return self._s[3446]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3447]! } + public var Login_TermsOfServiceDecline: String { return self._s[3448]! } + public var Message_PinnedContactMessage: String { return self._s[3449]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3464]!, self._r[3464]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3450]!, self._r[3450]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3465]!, self._r[3465]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3466]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3468]! } + public var Appearance_LargeEmoji: String { return self._s[3452]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3454]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3469]!, self._r[3469]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3470]! } - public var Message_PinnedPhotoMessage: String { return self._s[3471]! } - public var Passport_FieldPhone: String { return self._s[3472]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3473]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3474]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3476]! } - public var Conversation_Call: String { return self._s[3477]! } - public var Common_TakePhoto: String { return self._s[3479]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3480]! } - public var Channel_NotificationLoading: String { return self._s[3481]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3456]! } + public var Message_PinnedPhotoMessage: String { return self._s[3457]! } + public var Passport_FieldPhone: String { return self._s[3458]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3459]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3460]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3462]! } + public var Conversation_Call: String { return self._s[3463]! } + public var Common_TakePhoto: String { return self._s[3465]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3466]! } + public var Channel_NotificationLoading: String { return self._s[3467]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3482]!, self._r[3482]!, [_0]) + return formatWithArgumentRanges(self._s[3468]!, self._r[3468]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3483]!, self._r[3483]!, [_1]) + return formatWithArgumentRanges(self._s[3469]!, self._r[3469]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3484]! } + public var Permissions_SiriTitle_v0: String { return self._s[3470]! } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3485]!, self._r[3485]!, [_0]) + return formatWithArgumentRanges(self._s[3471]!, self._r[3471]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3486]! } - public var Common_edit: String { return self._s[3487]! } - public var PrivacySettings_AuthSessions: String { return self._s[3488]! } - public var Month_ShortJune: String { return self._s[3489]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3490]! } - public var Call_ReportSend: String { return self._s[3491]! } - public var Watch_LastSeen_JustNow: String { return self._s[3492]! } - public var Notifications_MessageNotifications: String { return self._s[3493]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3494]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3496]! } - public var Group_Status: String { return self._s[3497]! } + public var Channel_MessagePhotoRemoved: String { return self._s[3472]! } + public var Common_edit: String { return self._s[3473]! } + public var PrivacySettings_AuthSessions: String { return self._s[3474]! } + public var Month_ShortJune: String { return self._s[3475]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3476]! } + public var Call_ReportSend: String { return self._s[3477]! } + public var Watch_LastSeen_JustNow: String { return self._s[3478]! } + public var Notifications_MessageNotifications: String { return self._s[3479]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3480]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3482]! } + public var Group_Status: String { return self._s[3483]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3484]!, self._r[3484]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3499]! } - public var ShareMenu_ShareTo: String { return self._s[3500]! } - public var Conversation_Moderate_Ban: String { return self._s[3501]! } + public var TextFormat_AddLinkTitle: String { return self._s[3485]! } + public var ShareMenu_ShareTo: String { return self._s[3486]! } + public var Conversation_Moderate_Ban: String { return self._s[3487]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_0]) + return formatWithArgumentRanges(self._s[3488]!, self._r[3488]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3503]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3504]! } + public var SharedMedia_ViewInChat: String { return self._s[3489]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3490]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3505]!, self._r[3505]!, [_1]) + return formatWithArgumentRanges(self._s[3491]!, self._r[3491]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3506]!, self._r[3506]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3492]!, self._r[3492]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3508]!, self._r[3508]!, [_0]) + return formatWithArgumentRanges(self._s[3494]!, self._r[3494]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3509]! } - public var Appearance_ReduceMotion: String { return self._s[3510]! } + public var Map_OpenInHereMaps: String { return self._s[3495]! } + public var Appearance_ReduceMotion: String { return self._s[3496]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3497]!, self._r[3497]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3512]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3513]! } - public var PhotoEditor_Skip: String { return self._s[3514]! } - public func QuickSend_Photos(_ 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 MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) + public var Channel_Setup_TypePublicHelp: String { return self._s[3498]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3499]! } + public var PhotoEditor_Skip: String { return self._s[3500]! } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[0 * 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[2 * 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[3 * 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[4 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func SharedMedia_Photo(_ 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 ForwardedMessages(_ 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 MessageTimer_Days(_ 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 Contacts_ImportersCount(_ 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_MESSAGES(_ 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 Forward_ConfirmMultipleFiles(_ 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 Conversation_StatusMembers(_ 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 MessagePoll_VotedCount(_ 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 StickerPack_StickerCount(_ 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 PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ChatList_DeleteConfirmation(_ 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 StickerPack_AddStickerCount(_ 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 UserCount(_ 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) + return String(format: self._ps[1 * 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[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ 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 Call_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 Media_ShareVideo(_ 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 PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func AttachmentMenu_SendVideo(_ 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 LastSeen_HoursAgo(_ 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 Conversation_StatusOnline(_ 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 MessageTimer_Years(_ 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 SharedMedia_File(_ 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 DialogList_LiveLocationChatsCount(_ 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 PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Months(_ 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 Call_Seconds(_ 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) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedContacts(_ 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 ChatList_SelectedChats(_ 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[2 * 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[36 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[3 * 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[37 * 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[38 * 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[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ 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 ForwardedVideos(_ 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 Notifications_ExceptionMuteExpires_Hours(_ 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 PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + 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[43 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func CreatePoll_AddMoreOptions(_ 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 ForwardedStickers(_ 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 Notification_GameScoreSelfExtended(_ 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 Notifications_ExceptionMuteExpires_Days(_ 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 MessageTimer_Weeks(_ 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 SharedMedia_Generic(_ 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 Notification_GameScoreSimple(_ 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 PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ForwardedAudios(_ 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 MessageTimer_ShortDays(_ 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 Wallpaper_DeleteConfirmation(_ 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 PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Minutes(_ 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 LastSeen_MinutesAgo(_ 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_CHANNEL_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 MuteFor_Days(_ 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 StickerPack_AddMaskCount(_ 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 Notifications_Exceptions(_ 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 SharedMedia_DeleteItemsConfirmation(_ 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 MessageTimer_ShortSeconds(_ 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 Notifications_ExceptionMuteExpires_Minutes(_ 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 ServiceMessage_GameScoreSelfExtended(_ 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 Map_ETAHours(_ 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 AttachmentMenu_SendItem(_ 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 SharedMedia_Link(_ 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_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func LiveLocationUpdated_MinutesAgo(_ 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 Notification_GameScoreExtended(_ 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 StickerPack_RemoveStickerCount(_ 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 Invitation_Members(_ 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 ForwardedPolls(_ 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 AttachmentMenu_SendGif(_ 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_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 MuteExpires_Minutes(_ 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 AttachmentMenu_SendPhoto(_ 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) + return String(format: self._ps[4 * 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[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ 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 Conversation_StatusSubscribers(_ 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_MESSAGE_PHOTOS(_ 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 PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func LiveLocation_MenuChatsCount(_ 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 Conversation_LiveLocationMembersCount(_ 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 PrivacyLastSeenSettings_AddUsers(_ 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 SharedMedia_Video(_ 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[5 * 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[88 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ 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 StickerPack_RemoveStickerCount(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 Media_ShareItem(_ 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 ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func AttachmentMenu_SendPhoto(_ 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 MessageTimer_ShortWeeks(_ 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 Invitation_Members(_ 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 PasscodeSettings_FailedAttempts(_ 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 Notification_GameScoreSelfSimple(_ 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 QuickSend_Photos(_ 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 ForwardedMessages(_ 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 Conversation_StatusMembers(_ 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 ChatList_DeleteConfirmation(_ 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 Notification_GameScoreExtended(_ 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 LastSeen_MinutesAgo(_ 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 MessageTimer_ShortSeconds(_ 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 PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Notification_GameScoreSimple(_ 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 SharedMedia_Link(_ 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 MessageTimer_Weeks(_ 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 Map_ETAHours(_ 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 Contacts_ImportersCount(_ 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 MessageTimer_Days(_ 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 MessageTimer_Seconds(_ 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 MuteExpires_Minutes(_ 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) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatList_SelectedChats(_ 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 Media_SharePhoto(_ 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 Notifications_ExceptionMuteExpires_Hours(_ 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 Passport_Scans(_ 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 MessageTimer_ShortDays(_ 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 Notifications_ExceptionMuteExpires_Minutes(_ 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 Chat_DeleteMessagesConfirmation(_ 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 StickerPack_AddStickerCount(_ 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 MessageTimer_ShortMinutes(_ 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 ForwardedPolls(_ 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 MessageTimer_Minutes(_ 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 Wallpaper_DeleteConfirmation(_ 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 ForwardedLocations(_ 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 ForwardedStickers(_ 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 PrivacyLastSeenSettings_AddUsers(_ 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 PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[50 * 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[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ 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 ServiceMessage_GameScoreSelfExtended(_ 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 ForwardedPhotos(_ 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 ForwardedVideos(_ 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 MuteExpires_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 ForwardedAudios(_ 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 SharedMedia_File(_ 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 Call_ShortMinutes(_ 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 LiveLocation_MenuChatsCount(_ 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 AttachmentMenu_SendItem(_ 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 PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func StickerPack_RemoveMaskCount(_ 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 Conversation_StatusSubscribers(_ 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 Watch_LastSeen_HoursAgo(_ 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 AttachmentMenu_SendVideo(_ 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 StickerPack_StickerCount(_ 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 ServiceMessage_GameScoreExtended(_ 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 MessageTimer_Years(_ 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 PUSH_CHAT_MESSAGES(_ 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 InviteText_ContactsCountText(_ 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 Call_Minutes(_ 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 PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notifications_Exceptions(_ 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_Months(_ 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_ShareVideo(_ 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 Forward_ConfirmMultipleFiles(_ 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 MuteExpires_Hours(_ 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 Call_Seconds(_ 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 Notifications_ExceptionMuteExpires_Days(_ 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 SharedMedia_Video(_ 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 AttachmentMenu_SendGif(_ 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 Watch_UserInfo_Mute(_ 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 LastSeen_HoursAgo(_ 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_AddMaskCount(_ 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 SharedMedia_Generic(_ 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) + } + public func MessagePoll_VotedCount(_ 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 DialogList_LiveLocationChatsCount(_ 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 MessageTimer_Seconds(_ value: Int32) -> String { + public func MessageTimer_ShortHours(_ 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) @@ -4421,83 +4416,80 @@ public final class PresentationStrings { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_SharePhoto(_ value: Int32) -> String { + public func ForwardedGifs(_ 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 PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Call_ShortSeconds(_ 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[94 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreExtended(_ 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[94 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Notification_GameScoreSelfExtended(_ 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 Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 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[96 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ForwardedLocations(_ 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[97 * 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[98 * 6 + Int(form.rawValue)]!, _0, _1) + public func Conversation_LiveLocationMembersCount(_ 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 ForwardedGifs(_ 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[99 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { + 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[100 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + public func ForwardedContacts(_ 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 Watch_LastSeen_HoursAgo(_ 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[102 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortHours(_ 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[103 * 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[104 * 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[104 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + public func MessageTimer_Hours(_ 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) } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 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[106 * 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[107 * 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[107 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { diff --git a/submodules/TelegramPresentationData/Sources/PresentationTheme.swift b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift index d4418a6310..513bb96c03 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift @@ -906,6 +906,7 @@ public final class PresentationTheme: Equatable { public let name: PresentationThemeName public let author: String? public let overallDarkAppearance: Bool + public let baseColor: PresentationThemeBaseColor? public let intro: PresentationThemeIntro public let passcode: PresentationThemePasscode public let rootController: PresentationThemeRootController @@ -914,13 +915,15 @@ public final class PresentationTheme: Equatable { public let chat: PresentationThemeChat public let actionSheet: PresentationThemeActionSheet public let inAppNotification: PresentationThemeInAppNotification + public let preview: Bool public let resourceCache: PresentationsResourceCache = PresentationsResourceCache() - public init(name: PresentationThemeName, author: String?, overallDarkAppearance: Bool, intro: PresentationThemeIntro, passcode: PresentationThemePasscode, rootController: PresentationThemeRootController, list: PresentationThemeList, chatList: PresentationThemeChatList, chat: PresentationThemeChat, actionSheet: PresentationThemeActionSheet, inAppNotification: PresentationThemeInAppNotification) { + public init(name: PresentationThemeName, author: String?, overallDarkAppearance: Bool, baseColor: PresentationThemeBaseColor?, intro: PresentationThemeIntro, passcode: PresentationThemePasscode, rootController: PresentationThemeRootController, list: PresentationThemeList, chatList: PresentationThemeChatList, chat: PresentationThemeChat, actionSheet: PresentationThemeActionSheet, inAppNotification: PresentationThemeInAppNotification, preview: Bool = false) { self.name = name self.author = author self.overallDarkAppearance = overallDarkAppearance + self.baseColor = baseColor self.intro = intro self.passcode = passcode self.rootController = rootController @@ -929,6 +932,7 @@ public final class PresentationTheme: Equatable { self.chat = chat self.actionSheet = actionSheet self.inAppNotification = inAppNotification + self.preview = preview } public func image(_ key: Int32, _ generate: (PresentationTheme) -> UIImage?) -> UIImage? { diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift index 90e07d2ccc..4f7dca040a 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift @@ -1428,17 +1428,20 @@ extension PresentationTheme: Codable { public convenience init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) - self.init(name: try values.decode(PresentationThemeName.self, forKey: .name), - author: (try? values.decode(String.self, forKey: .author)) ?? nil, - overallDarkAppearance: (try? values.decode(Bool.self, forKey: .dark)) ?? false, - intro: try values.decode(PresentationThemeIntro.self, forKey: .intro), - passcode: try values.decode(PresentationThemePasscode.self, forKey: .passcode), - rootController: try values.decode(PresentationThemeRootController.self, forKey: .root), - list: try values.decode(PresentationThemeList.self, forKey: .list), - chatList: try values.decode(PresentationThemeChatList.self, forKey: .chatList), - chat: try values.decode(PresentationThemeChat.self, forKey: .chat), - actionSheet: try values.decode(PresentationThemeActionSheet.self, forKey: .actionSheet), - inAppNotification: try values.decode(PresentationThemeInAppNotification.self, forKey: .notification)) + self.init( + name: try values.decode(PresentationThemeName.self, forKey: .name), + author: (try? values.decode(String.self, forKey: .author)) ?? nil, + overallDarkAppearance: (try? values.decode(Bool.self, forKey: .dark)) ?? false, + baseColor: nil, + intro: try values.decode(PresentationThemeIntro.self, forKey: .intro), + passcode: try values.decode(PresentationThemePasscode.self, forKey: .passcode), + rootController: try values.decode(PresentationThemeRootController.self, forKey: .root), + list: try values.decode(PresentationThemeList.self, forKey: .list), + chatList: try values.decode(PresentationThemeChatList.self, forKey: .chatList), + chat: try values.decode(PresentationThemeChat.self, forKey: .chat), + actionSheet: try values.decode(PresentationThemeActionSheet.self, forKey: .actionSheet), + inAppNotification: try values.decode(PresentationThemeInAppNotification.self, forKey: .notification) + ) } public func encode(to encoder: Encoder) throws { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/Contents.json new file mode 100644 index 0000000000..38f0c81fc2 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "provides-namespace" : true + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Contents.json new file mode 100644 index 0000000000..13746b9a96 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Mute@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Mute@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Mute@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Mute@2x.png new file mode 100644 index 0000000000..036c06a6d1 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Mute@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Mute@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Mute@3x.png new file mode 100644 index 0000000000..a79ac3bd68 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat/Input/Menu/SilentIcon.imageset/Mute@3x.png differ diff --git a/submodules/TelegramUI/TelegramUI/AnimatedStickerNode.swift b/submodules/TelegramUI/TelegramUI/AnimatedStickerNode.swift index 20c389bf1d..733e2374a5 100644 --- a/submodules/TelegramUI/TelegramUI/AnimatedStickerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AnimatedStickerNode.swift @@ -72,6 +72,11 @@ enum AnimatedStickerMode { case direct } +enum AnimatedStickerPlaybackMode { + case once + case loop +} + private final class AnimatedStickerFrame { let data: Data let type: AnimationRendererFrameType @@ -214,7 +219,7 @@ private final class AnimatedStickerDirectFrameSource: AnimatedStickerFrameSource self.width = width self.height = height self.currentFrame = 0 - guard let rawData = TGGUnzipData(data, 2 * 1024 * 1024) else { + guard let rawData = TGGUnzipData(data, 8 * 1024 * 1024) else { return nil } guard let animation = LottieInstance(data: rawData, cacheKey: "") else { @@ -292,6 +297,7 @@ final class AnimatedStickerNode: ASDisplayNode { private var renderer: (AnimationRenderer & ASDisplayNode)? private var isPlaying: Bool = false + private var playbackMode: AnimatedStickerPlaybackMode = .loop var visibility = false { didSet { @@ -342,8 +348,9 @@ final class AnimatedStickerNode: ASDisplayNode { self.renderer?.frame = CGRect(origin: CGPoint(), size: self.bounds.size) self.addSubnode(self.renderer!) } - - func setup(account: Account, resource: MediaResource, width: Int, height: Int, mode: AnimatedStickerMode) { + + func setup(account: Account, resource: MediaResource, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) { + self.playbackMode = playbackMode switch mode { case .direct: self.disposable.set((account.postbox.mediaBox.resourceData(resource) @@ -411,7 +418,7 @@ final class AnimatedStickerNode: ASDisplayNode { timerHolder.swap(nil)?.invalidate() let timer = SwiftSignalKit.Timer(timeout: 1.0 / Double(frameSource.frameRate), repeat: true, completion: { - let maybeFrame = frameQueue.syncWith { frameQueue in + let maybeFrame = frameQueue.syncWith { frameQueue in return frameQueue.take() } if let maybeFrame = maybeFrame, let frame = maybeFrame { diff --git a/submodules/TelegramUI/TelegramUI/AnimatedStickerUtils.swift b/submodules/TelegramUI/TelegramUI/AnimatedStickerUtils.swift index dad91d548a..10c14c80bc 100644 --- a/submodules/TelegramUI/TelegramUI/AnimatedStickerUtils.swift +++ b/submodules/TelegramUI/TelegramUI/AnimatedStickerUtils.swift @@ -3,6 +3,7 @@ import UIKit import SwiftSignalKit import Postbox import Display +import TelegramCore import AVFoundation import Lottie import TelegramUIPrivateModule @@ -11,6 +12,59 @@ import GZip import RLottie import MobileCoreServices +public struct LocalBundleResourceId: MediaResourceId { + public let name: String + public let ext: String + + public var uniqueId: String { + return "local-bundle-\(self.name)-\(self.ext)" + } + + public var hashValue: Int { + return self.name.hashValue + } + + public func isEqual(to: MediaResourceId) -> Bool { + if let to = to as? LocalBundleResourceId { + return self.name == to.name && self.ext == to.ext + } else { + return false + } + } +} + +public class LocalBundleResource: TelegramMediaResource { + public let name: String + public let ext: String + + public init(name: String, ext: String) { + self.name = name + self.ext = ext + } + + public required init(decoder: PostboxDecoder) { + self.name = decoder.decodeStringForKey("n", orElse: "") + self.ext = decoder.decodeStringForKey("e", orElse: "") + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeString(self.name, forKey: "n") + encoder.encodeString(self.ext, forKey: "e") + } + + public var id: MediaResourceId { + return LocalBundleResourceId(name: self.name, ext: self.ext) + } + + public func isEqual(to: MediaResource) -> Bool { + if let to = to as? LocalBundleResource { + return self.name == to.name && self.ext == to.ext + } else { + return false + } + } +} + func fetchCompressedLottieFirstFrameAJpeg(data: Data, size: CGSize, cacheKey: String) -> Signal { return Signal({ subscriber in let queue = Queue() @@ -22,7 +76,7 @@ func fetchCompressedLottieFirstFrameAJpeg(data: Data, size: CGSize, cacheKey: St return } - let decompressedData = TGGUnzipData(data, 2 * 1024 * 1024) + let decompressedData = TGGUnzipData(data, 8 * 1024 * 1024) if let decompressedData = decompressedData, let player = LottieInstance(data: decompressedData, cacheKey: cacheKey) { if cancelled.with({ $0 }) { return @@ -117,7 +171,7 @@ func experimentalConvertCompressedLottieToCombinedMp4(data: Data, size: CGSize, var deltaTime: Double = 0 var compressionTime: Double = 0 - let decompressedData = TGGUnzipData(data, 2 * 1024 * 1024) + let decompressedData = TGGUnzipData(data, 8 * 1024 * 1024) if let decompressedData = decompressedData, let player = LottieInstance(data: decompressedData, cacheKey: cacheKey) { let endFrame = Int(player.frameCount) @@ -231,3 +285,45 @@ func experimentalConvertCompressedLottieToCombinedMp4(data: Data, size: CGSize, } }) } + +private final class LocalBundleResourceCopyFile : MediaResourceDataFetchCopyLocalItem { + let path: String + init(path: String) { + self.path = path + } + func copyTo(url: URL) -> Bool { + do { + try FileManager.default.copyItem(at: URL(fileURLWithPath: self.path), to: url) + return true + } catch { + return false + } + } +} + +func fetchLocalBundleResource(postbox: Postbox, resource: LocalBundleResource) -> Signal { + return Signal { subscriber in + if let path = frameworkBundle.path(forResource: resource.name, ofType: resource.ext), let _ = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { + subscriber.putNext(.copyLocalItem(LocalBundleResourceCopyFile(path: path))) + subscriber.putCompletion() + } + return EmptyDisposable + } +} + +private let emojis: [String: String] = [ + "👍": "thumbsup", + "😂": "lol", + "😒": "meh", + "❤️": "heart", + "🥳": "celeb", + "😳": "confused" +] + +func animatedEmojiResource(emoji: String) -> LocalBundleResource? { + if let name = emojis[emoji] { + return LocalBundleResource(name: name, ext: "tgs") + } else { + return nil + } +} diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index aabd122420..d80e22de31 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -1843,7 +1843,7 @@ final class SharedApplicationContext { notificationCenter.getNotificationSettings(completionHandler: { settings in switch (settings.authorizationStatus, authorize) { case (.authorized, _), (.notDetermined, true): - notificationCenter.requestAuthorization(options: [.badge, .sound, .alert], completionHandler: { result, _ in + notificationCenter.requestAuthorization(options: [.badge, .sound, .alert, .carPlay], completionHandler: { result, _ in completion(result) if result { Queue.mainQueue().async { @@ -1857,26 +1857,32 @@ final class SharedApplicationContext { let legacyChannelMessageCategory: UNNotificationCategory let muteMessageCategory: UNNotificationCategory let muteMediaMessageCategory: UNNotificationCategory + if #available(iOS 11.0, *) { var options: UNNotificationCategoryOptions = [] if includeNames { options.insert(.hiddenPreviewsShowTitle) } + var carPlayOptions = options + carPlayOptions.insert(.allowInCarPlay) + unknownMessageCategory = UNNotificationCategory(identifier: "unknown", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) - replyMessageCategory = UNNotificationCategory(identifier: "withReply", actions: [reply], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) - replyLegacyMessageCategory = UNNotificationCategory(identifier: "r", actions: [reply], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) - replyLegacyMediaMessageCategory = UNNotificationCategory(identifier: "m", actions: [reply], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) - replyMediaMessageCategory = UNNotificationCategory(identifier: "withReplyMedia", actions: [reply], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) + replyMessageCategory = UNNotificationCategory(identifier: "withReply", actions: [reply], intentIdentifiers: [INSearchForMessagesIntentIdentifier], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: carPlayOptions) + replyLegacyMessageCategory = UNNotificationCategory(identifier: "r", actions: [reply], intentIdentifiers: [INSearchForMessagesIntentIdentifier], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: carPlayOptions) + replyLegacyMediaMessageCategory = UNNotificationCategory(identifier: "m", actions: [reply], intentIdentifiers: [INSearchForMessagesIntentIdentifier], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) + replyMediaMessageCategory = UNNotificationCategory(identifier: "withReplyMedia", actions: [reply], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: carPlayOptions) legacyChannelMessageCategory = UNNotificationCategory(identifier: "c", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) muteMessageCategory = UNNotificationCategory(identifier: "withMute", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) muteMediaMessageCategory = UNNotificationCategory(identifier: "withMuteMedia", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options) } else { + let carPlayOptions: UNNotificationCategoryOptions = [.allowInCarPlay] + unknownMessageCategory = UNNotificationCategory(identifier: "unknown", actions: [], intentIdentifiers: [], options: []) - replyMessageCategory = UNNotificationCategory(identifier: "withReply", actions: [reply], intentIdentifiers: [], options: []) - replyLegacyMessageCategory = UNNotificationCategory(identifier: "r", actions: [reply], intentIdentifiers: [], options: []) + replyMessageCategory = UNNotificationCategory(identifier: "withReply", actions: [reply], intentIdentifiers: [INSearchForMessagesIntentIdentifier], options: carPlayOptions) + replyLegacyMessageCategory = UNNotificationCategory(identifier: "r", actions: [reply], intentIdentifiers: [INSearchForMessagesIntentIdentifier], options: carPlayOptions) replyLegacyMediaMessageCategory = UNNotificationCategory(identifier: "m", actions: [reply], intentIdentifiers: [], options: []) - replyMediaMessageCategory = UNNotificationCategory(identifier: "withReplyMedia", actions: [reply], intentIdentifiers: [], options: []) + replyMediaMessageCategory = UNNotificationCategory(identifier: "withReplyMedia", actions: [reply], intentIdentifiers: [], options: carPlayOptions) legacyChannelMessageCategory = UNNotificationCategory(identifier: "c", actions: [], intentIdentifiers: [], options: []) muteMessageCategory = UNNotificationCategory(identifier: "withMute", actions: [], intentIdentifiers: [], options: []) muteMediaMessageCategory = UNNotificationCategory(identifier: "withMuteMedia", actions: [], intentIdentifiers: [], options: []) diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionControllerNode.swift index 950f210572..35c1b147d7 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionControllerNode.swift @@ -165,7 +165,7 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode, self.searchTableView.reloadData() self.searchTableView.isHidden = true } else { - let normalizedQuery = query.lowercased().trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + let normalizedQuery = query.lowercased().trimmingCharacters(in: .whitespacesAndNewlines) var results: [((String, String), String, Int)] = [] for (_, items) in self.sections { diff --git a/submodules/TelegramUI/TelegramUI/CallController.swift b/submodules/TelegramUI/TelegramUI/CallController.swift index d92fa09336..3bf30fc5fb 100644 --- a/submodules/TelegramUI/TelegramUI/CallController.swift +++ b/submodules/TelegramUI/TelegramUI/CallController.swift @@ -26,7 +26,7 @@ public final class CallController: ViewController { public let call: PresentationCall private var presentationData: PresentationData - private var animatedAppearance = false + private var didPlayPresentationAnimation = false private var peer: Peer? @@ -217,7 +217,7 @@ public final class CallController: ViewController { } self.controllerNode.dismissedInteractively = { [weak self] in - self?.animatedAppearance = false + self?.didPlayPresentationAnimation = false self?.presentingViewController?.dismiss(animated: false, completion: nil) } @@ -242,8 +242,8 @@ public final class CallController: ViewController { override public func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - if !self.animatedAppearance { - self.animatedAppearance = true + if !self.didPlayPresentationAnimation { + self.didPlayPresentationAnimation = true self.controllerNode.animateIn() } @@ -257,7 +257,7 @@ public final class CallController: ViewController { override public func dismiss(completion: (() -> Void)? = nil) { self.controllerNode.animateOut(completion: { [weak self] in - self?.animatedAppearance = false + self?.didPlayPresentationAnimation = false self?.presentingViewController?.dismiss(animated: false, completion: nil) completion?() diff --git a/submodules/TelegramUI/TelegramUI/ChannelAdminController.swift b/submodules/TelegramUI/TelegramUI/ChannelAdminController.swift index af9865b0a3..d61b285553 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelAdminController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelAdminController.swift @@ -13,16 +13,20 @@ private final class ChannelAdminControllerArguments { let toggleRight: (TelegramChatAdminRightsFlags, TelegramChatAdminRightsFlags) -> Void let transferOwnership: () -> Void let updateRank: (String, String) -> Void + let updateFocusedOnRank: (Bool) -> Void let dismissAdmin: () -> Void let dismissInput: () -> Void + let animateError: () -> Void - init(account: Account, toggleRight: @escaping (TelegramChatAdminRightsFlags, TelegramChatAdminRightsFlags) -> Void, transferOwnership: @escaping () -> Void, updateRank: @escaping (String, String) -> Void, dismissAdmin: @escaping () -> Void, dismissInput: @escaping () -> Void) { + init(account: Account, toggleRight: @escaping (TelegramChatAdminRightsFlags, TelegramChatAdminRightsFlags) -> Void, transferOwnership: @escaping () -> Void, updateRank: @escaping (String, String) -> Void, updateFocusedOnRank: @escaping (Bool) -> Void, dismissAdmin: @escaping () -> Void, dismissInput: @escaping () -> Void, animateError: @escaping () -> Void) { self.account = account self.toggleRight = toggleRight self.transferOwnership = transferOwnership self.updateRank = updateRank + self.updateFocusedOnRank = updateFocusedOnRank self.dismissAdmin = dismissAdmin self.dismissInput = dismissInput + self.animateError = animateError } } @@ -142,7 +146,7 @@ private enum ChannelAdminEntryStableId: Hashable { private enum ChannelAdminEntry: ItemListNodeEntry { case info(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, Peer, TelegramUserPresence?) - case rankTitle(PresentationTheme, String, Int32, Int32) + case rankTitle(PresentationTheme, String, Int32?, Int32) case rank(PresentationTheme, String, String, Bool) case rankInfo(PresentationTheme, String) case rightsTitle(PresentationTheme, String) @@ -294,37 +298,16 @@ private enum ChannelAdminEntry: ItemListNodeEntry { default: return true } - case .rankTitle: - switch rhs { - case .info, .rankTitle: - return false - default: - return true - } - case .rank: - switch rhs { - case .info, .rankTitle, .rank: - return false - default: - return true - } - case .rankInfo: - switch rhs { - case .info, .rankTitle, .rank, .rankInfo: - return false - default: - return true - } case .rightsTitle: switch rhs { - case .info, .rankTitle, .rank, .rankInfo, .rightsTitle: + case .info, .rightsTitle: return false default: return true } case let .rightItem(_, lhsIndex, _, _, _, _, _): switch rhs { - case .info, .rankTitle, .rank, .rankInfo, .rightsTitle: + case .info, .rightsTitle: return false case let .rightItem(_, rhsIndex, _, _, _, _, _): return lhsIndex < rhsIndex @@ -333,14 +316,35 @@ private enum ChannelAdminEntry: ItemListNodeEntry { } case .addAdminsInfo: switch rhs { - case .info, .rankTitle, .rank, .rankInfo, .rightsTitle, .rightItem, .addAdminsInfo: + case .info, .rightsTitle, .rightItem, .addAdminsInfo: return false default: return true } case .transfer: switch rhs { - case .info, .rankTitle, .rank, .rankInfo, .rightsTitle, .rightItem, .addAdminsInfo, .transfer: + case .info, .rightsTitle, .rightItem, .addAdminsInfo, .transfer: + return false + default: + return true + } + case .rankTitle: + switch rhs { + case .info, .rightsTitle, .rightItem, .addAdminsInfo, .transfer, .rankTitle: + return false + default: + return true + } + case .rank: + switch rhs { + case .info, .rightsTitle, .rightItem, .addAdminsInfo, .transfer, .rankTitle, .rank: + return false + default: + return true + } + case .rankInfo: + switch rhs { + case .info, .rightsTitle, .rightItem, .addAdminsInfo, .transfer, .rankTitle, .rank, .rankInfo: return false default: return true @@ -357,11 +361,22 @@ private enum ChannelAdminEntry: ItemListNodeEntry { }, avatarTapped: { }) case let .rankTitle(theme, text, count, limit): - let accessoryText = count > 0 ? ItemListSectionHeaderAccessoryText(value: "\(limit - count)", color: count > limit ? .destructive : .generic) : nil + var accessoryText: ItemListSectionHeaderAccessoryText? + if let count = count { + accessoryText = ItemListSectionHeaderAccessoryText(value: "\(limit - count)", color: count > limit ? .destructive : .generic) + } return ItemListSectionHeaderItem(theme: theme, text: text, accessoryText: accessoryText, sectionId: self.section) case let .rank(theme, placeholder, text, enabled): return ItemListSingleLineInputItem(theme: theme, title: NSAttributedString(string: "", textColor: .black), text: text, placeholder: placeholder, type: .regular(capitalization: false, autocorrection: true), spacing: 0.0, clearButton: enabled, enabled: enabled, tag: ChannelAdminEntryTag.rank, sectionId: self.section, textUpdated: { updatedText in arguments.updateRank(text, updatedText) + }, shouldUpdateText: { text in + if text.containsEmoji { + arguments.animateError() + return false + } + return true + }, updatedFocus: { focus in + arguments.updateFocusedOnRank(focus) }, action: { arguments.dismissInput() }) @@ -391,11 +406,13 @@ private struct ChannelAdminControllerState: Equatable { let updatedFlags: TelegramChatAdminRightsFlags? let updatedRank: String? let updating: Bool + let focusedOnRank: Bool - init(updatedFlags: TelegramChatAdminRightsFlags? = nil, updatedRank: String? = nil, updating: Bool = false) { + init(updatedFlags: TelegramChatAdminRightsFlags? = nil, updatedRank: String? = nil, updating: Bool = false, focusedOnRank: Bool = false) { self.updatedFlags = updatedFlags self.updatedRank = updatedRank self.updating = updating + self.focusedOnRank = focusedOnRank } static func ==(lhs: ChannelAdminControllerState, rhs: ChannelAdminControllerState) -> Bool { @@ -408,19 +425,26 @@ private struct ChannelAdminControllerState: Equatable { if lhs.updating != rhs.updating { return false } + if lhs.focusedOnRank != rhs.focusedOnRank { + return false + } return true } func withUpdatedUpdatedFlags(_ updatedFlags: TelegramChatAdminRightsFlags?) -> ChannelAdminControllerState { - return ChannelAdminControllerState(updatedFlags: updatedFlags, updatedRank: self.updatedRank, updating: self.updating) + return ChannelAdminControllerState(updatedFlags: updatedFlags, updatedRank: self.updatedRank, updating: self.updating, focusedOnRank: self.focusedOnRank) } func withUpdatedUpdatedRank(_ updatedRank: String?) -> ChannelAdminControllerState { - return ChannelAdminControllerState(updatedFlags: self.updatedFlags, updatedRank: updatedRank, updating: self.updating) + return ChannelAdminControllerState(updatedFlags: self.updatedFlags, updatedRank: updatedRank, updating: self.updating, focusedOnRank: self.focusedOnRank) } func withUpdatedUpdating(_ updating: Bool) -> ChannelAdminControllerState { - return ChannelAdminControllerState(updatedFlags: self.updatedFlags, updatedRank: self.updatedRank, updating: updating) + return ChannelAdminControllerState(updatedFlags: self.updatedFlags, updatedRank: self.updatedRank, updating: updating, focusedOnRank: self.focusedOnRank) + } + + func withUpdatedFocusedOnRank(_ focusedOnRank: Bool) -> ChannelAdminControllerState { + return ChannelAdminControllerState(updatedFlags: self.updatedFlags, updatedRank: self.updatedRank, updating: self.updating, focusedOnRank: focusedOnRank) } } @@ -513,7 +537,7 @@ private func areAllAdminRightsEnabled(_ flags: TelegramChatAdminRightsFlags, gro } } -private func channelAdminControllerEntries(presentationData: PresentationData, state: ChannelAdminControllerState, accountPeerId: PeerId, channelView: PeerView, adminView: PeerView, initialParticipant: ChannelParticipant?) -> [ChannelAdminEntry] { +private func channelAdminControllerEntries(presentationData: PresentationData, state: ChannelAdminControllerState, accountPeerId: PeerId, channelView: PeerView, adminView: PeerView, initialParticipant: ChannelParticipant?, canEdit: Bool) -> [ChannelAdminEntry] { var entries: [ChannelAdminEntry] = [] if let channel = channelView.peers[channelView.peerId] as? TelegramChannel, let admin = adminView.peers[adminView.peerId] { @@ -524,57 +548,42 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s isCreator = true } - if case .group = channel.info { - let placeholder = isCreator ? presentationData.strings.Group_EditAdmin_RankOwnerPlaceholder : presentationData.strings.Group_EditAdmin_RankAdminPlaceholder - - let currentRank: String? - if let updatedRank = state.updatedRank { - currentRank = updatedRank - } else if let initialParticipant = initialParticipant { - currentRank = initialParticipant.rank - } else { - currentRank = nil - } - - let enabled = !state.updating && (admin.id != accountPeerId || isCreator) - entries.append(.rankTitle(presentationData.theme, presentationData.strings.Group_EditAdmin_RankTitle.uppercased(), enabled ? Int32(currentRank?.count ?? 0) : 0, rankMaxLength)) - entries.append(.rank(presentationData.theme, isCreator ? presentationData.strings.Group_EditAdmin_RankOwnerPlaceholder : presentationData.strings.Group_EditAdmin_RankAdminPlaceholder, currentRank ?? "", enabled)) - entries.append(.rankInfo(presentationData.theme, presentationData.strings.Group_EditAdmin_RankInfo(placeholder).0)) + var canTransfer = false + var canDismiss = false + + let isGroup: Bool + let maskRightsFlags: TelegramChatAdminRightsFlags + let rightsOrder: [TelegramChatAdminRightsFlags] + + switch channel.info { + case .broadcast: + isGroup = false + maskRightsFlags = .broadcastSpecific + rightsOrder = [ + .canChangeInfo, + .canPostMessages, + .canEditMessages, + .canDeleteMessages, + .canInviteUsers, + .canAddAdmins + ] + case .group: + isGroup = true + maskRightsFlags = .groupSpecific + rightsOrder = [ + .canChangeInfo, + .canDeleteMessages, + .canBanUsers, + .canInviteUsers, + .canPinMessages, + .canAddAdmins + ] } if isCreator { } else { entries.append(.rightsTitle(presentationData.theme, presentationData.strings.Channel_EditAdmin_PermissionsHeader)) - let isGroup: Bool - let maskRightsFlags: TelegramChatAdminRightsFlags - let rightsOrder: [TelegramChatAdminRightsFlags] - - switch channel.info { - case .broadcast: - isGroup = false - maskRightsFlags = .broadcastSpecific - rightsOrder = [ - .canChangeInfo, - .canPostMessages, - .canEditMessages, - .canDeleteMessages, - .canInviteUsers, - .canAddAdmins - ] - case .group: - isGroup = true - maskRightsFlags = .groupSpecific - rightsOrder = [ - .canChangeInfo, - .canDeleteMessages, - .canBanUsers, - .canInviteUsers, - .canPinMessages, - .canAddAdmins - ] - } - if canEditAdminRights(accountPeerId: accountPeerId, channelView: channelView, initialParticipant: initialParticipant) { let accountUserRightsFlags: TelegramChatAdminRightsFlags if channel.flags.contains(.isCreator) { @@ -607,11 +616,10 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s } if let admin = admin as? TelegramUser, admin.botInfo == nil && !admin.isDeleted && channel.flags.contains(.isCreator) && areAllAdminRightsEnabled(currentRightsFlags, group: isGroup) { - entries.append(.transfer(presentationData.theme, isGroup ? presentationData.strings.Group_EditAdmin_TransferOwnership : presentationData.strings.Channel_EditAdmin_TransferOwnership)) + canTransfer = true } if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, !adminInfo.rights.flags.isEmpty && admin.id != accountPeerId { - var canDismiss = false if channel.flags.contains(.isCreator) { canDismiss = true } else { @@ -626,9 +634,6 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s } } } - if canDismiss { - entries.append(.dismiss(presentationData.theme, presentationData.strings.Channel_Moderator_AccessLevelRevoke)) - } } } else if let initialParticipant = initialParticipant, case let .member(_, _, maybeAdminInfo, _, _) = initialParticipant, let adminInfo = maybeAdminInfo { var index = 0 @@ -638,6 +643,32 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s } } } + + if canTransfer { + entries.append(.transfer(presentationData.theme, isGroup ? presentationData.strings.Group_EditAdmin_TransferOwnership : presentationData.strings.Channel_EditAdmin_TransferOwnership)) + } + + if case .group = channel.info { + let placeholder = isCreator ? presentationData.strings.Group_EditAdmin_RankOwnerPlaceholder : presentationData.strings.Group_EditAdmin_RankAdminPlaceholder + + let currentRank: String? + if let updatedRank = state.updatedRank { + currentRank = updatedRank + } else if let initialParticipant = initialParticipant { + currentRank = initialParticipant.rank + } else { + currentRank = nil + } + + let rankEnabled = !state.updating && canEdit + entries.append(.rankTitle(presentationData.theme, presentationData.strings.Group_EditAdmin_RankTitle.uppercased(), rankEnabled && state.focusedOnRank ? Int32(currentRank?.count ?? 0) : nil, rankMaxLength)) + entries.append(.rank(presentationData.theme, isCreator ? presentationData.strings.Group_EditAdmin_RankOwnerPlaceholder : presentationData.strings.Group_EditAdmin_RankAdminPlaceholder, currentRank ?? "", rankEnabled)) + entries.append(.rankInfo(presentationData.theme, presentationData.strings.Group_EditAdmin_RankInfo(placeholder).0)) + } + + if canDismiss { + entries.append(.dismiss(presentationData.theme, presentationData.strings.Channel_Moderator_AccessLevelRevoke)) + } } else if let group = channelView.peers[channelView.peerId] as? TelegramGroup, let admin = adminView.peers[adminView.peerId] { entries.append(.info(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, admin, adminView.peerPresences[admin.id] as? TelegramUserPresence)) @@ -653,11 +684,11 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s currentRank = nil } - let enabled = !state.updating && (admin.id != accountPeerId || isCreator) - entries.append(.rankTitle(presentationData.theme, presentationData.strings.Group_EditAdmin_RankTitle.uppercased(), enabled ? Int32(currentRank?.count ?? 0) : 0, rankMaxLength)) - entries.append(.rank(presentationData.theme, isCreator ? presentationData.strings.Group_EditAdmin_RankOwnerPlaceholder : presentationData.strings.Group_EditAdmin_RankAdminPlaceholder, currentRank ?? "", enabled)) + let rankEnabled = !state.updating && canEdit if isCreator { + entries.append(.rankTitle(presentationData.theme, presentationData.strings.Group_EditAdmin_RankTitle.uppercased(), rankEnabled && state.focusedOnRank ? Int32(currentRank?.count ?? 0) : nil, rankMaxLength)) + entries.append(.rank(presentationData.theme, isCreator ? presentationData.strings.Group_EditAdmin_RankOwnerPlaceholder : presentationData.strings.Group_EditAdmin_RankAdminPlaceholder, currentRank ?? "", rankEnabled)) } else { entries.append(.rightsTitle(presentationData.theme, presentationData.strings.Channel_EditAdmin_PermissionsHeader)) @@ -699,6 +730,9 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s entries.append(.transfer(presentationData.theme, presentationData.strings.Group_EditAdmin_TransferOwnership)) } + entries.append(.rankTitle(presentationData.theme, presentationData.strings.Group_EditAdmin_RankTitle.uppercased(), rankEnabled && state.focusedOnRank ? Int32(currentRank?.count ?? 0) : nil, rankMaxLength)) + entries.append(.rank(presentationData.theme, isCreator ? presentationData.strings.Group_EditAdmin_RankOwnerPlaceholder : presentationData.strings.Group_EditAdmin_RankAdminPlaceholder, currentRank ?? "", rankEnabled)) + if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, !adminInfo.rights.flags.isEmpty && admin.id != accountPeerId { entries.append(.dismiss(presentationData.theme, presentationData.strings.Channel_Moderator_AccessLevelRevoke)) } @@ -727,6 +761,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi var dismissInputImpl: (() -> Void)? var presentControllerImpl: ((ViewController, Any?) -> Void)? var errorImpl: (() -> Void)? + var scrollToRankImpl: (() -> Void)? let actualPeerId = Atomic(value: peerId) let upgradedToSupergroupImpl: (PeerId, @escaping () -> Void) -> Void = { peerId, completion in @@ -773,6 +808,12 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi if updatedRank != previousRank { updateState { $0.withUpdatedUpdatedRank(updatedRank) } } + }, updateFocusedOnRank: { focusedOnRank in + updateState { $0.withUpdatedFocusedOnRank(focusedOnRank) } + + if focusedOnRank { + scrollToRankImpl?() + } }, dismissAdmin: { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) @@ -807,6 +848,8 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi presentControllerImpl?(actionSheet, nil) }, dismissInput: { dismissInputImpl?() + }, animateError: { + errorImpl?() }) let combinedView = context.account.postbox.combinedView(keys: [.peer(peerId: peerId, components: .all), .peer(peerId: adminId, components: .all)]) @@ -830,7 +873,6 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi } var focusItemTag: ItemListItemTag? - var isCreator = false if let initialParticipant = initialParticipant, case .creator = initialParticipant { focusItemTag = ChannelAdminEntryTag.rank } @@ -846,7 +888,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi var updateRank: String? updateState { current in updateFlags = current.updatedFlags - updateRank = current.updatedRank + updateRank = current.updatedRank?.trimmingCharacters(in: .whitespacesAndNewlines) return current } @@ -915,7 +957,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi var updateRank: String? updateState { current in updateFlags = current.updatedFlags - updateRank = current.updatedRank + updateRank = current.updatedRank?.trimmingCharacters(in: .whitespacesAndNewlines) return current } @@ -946,7 +988,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi updateState { current in return current.withUpdatedUpdating(true) } - updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: updateFlags), rank: "") |> deliverOnMainQueue).start(error: { error in + updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: updateFlags), rank: updateRank) |> deliverOnMainQueue).start(error: { error in if case let .addMemberError(error) = error, case .restricted = error, let admin = adminView.peers[adminView.peerId] { var text = presentationData.strings.Privacy_GroupsAndChannels_InviteToChannelError(admin.compactDisplayTitle, admin.compactDisplayTitle).0 if case .group = channel.info { @@ -967,7 +1009,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi updateState { current in updateFlags = current.updatedFlags if let updatedRank = current.updatedRank, !updatedRank.isEmpty { - updateRank = updatedRank + updateRank = updatedRank.trimmingCharacters(in: .whitespacesAndNewlines) } return current } @@ -1045,7 +1087,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Channel_Management_LabelEditor), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) - let listState = ItemListNodeState(entries: channelAdminControllerEntries(presentationData: presentationData, state: state, accountPeerId: context.account.peerId, channelView: channelView, adminView: adminView, initialParticipant: initialParticipant), style: .blocks, focusItemTag: focusItemTag, emptyStateItem: nil, animateChanges: true) + let listState = ItemListNodeState(entries: channelAdminControllerEntries(presentationData: presentationData, state: state, accountPeerId: context.account.peerId, channelView: channelView, adminView: adminView, initialParticipant: initialParticipant, canEdit: canEdit), style: .blocks, focusItemTag: focusItemTag, ensureVisibleItemTag: nil, emptyStateItem: nil, animateChanges: true) return (controllerState, (listState, arguments)) } @@ -1054,6 +1096,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi } let controller = ItemListController(context: context, state: signal) + controller.experimentalSnapScrollToItem = true dismissImpl = { [weak controller] in controller?.view.endEditing(true) controller?.dismiss() @@ -1074,6 +1117,27 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi } } } + scrollToRankImpl = { [weak controller] in + controller?.afterLayout({ + guard let controller = controller else { + return + } + + var resultItemNode: ListViewItemNode? + let _ = controller.frameForItemNode({ itemNode in + if let itemNode = itemNode as? ItemListSingleLineInputItemNode { + if let tag = itemNode.tag as? ChannelAdminEntryTag, tag == .rank { + resultItemNode = itemNode + return true + } + } + return false + }) + if let resultItemNode = resultItemNode { + controller.ensureItemNodeVisible(resultItemNode) + } + }) + } return controller } diff --git a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchContainerNode.swift index 94f4a13a21..77d57c7bf3 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchContainerNode.swift @@ -317,8 +317,9 @@ final class ChannelMembersSearchContainerNode: SearchDisplayControllerContentNod } let removeMemberDisposable = self.removeMemberDisposable - let interaction = ChannelMembersSearchContainerInteraction(peerSelected: { peer, participant in + let interaction = ChannelMembersSearchContainerInteraction(peerSelected: { [weak self] peer, participant in openPeer(peer, participant) + self?.listNode.clearHighlightAnimated(true) }, setPeerIdWithRevealedOptions: { peerId, fromPeerId in updateState { state in var state = state diff --git a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchControllerNode.swift index def0095055..8df872bf6f 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchControllerNode.swift @@ -129,6 +129,7 @@ class ChannelMembersSearchControllerNode: ASDisplayNode { let interaction = ChannelMembersSearchInteraction(openPeer: { [weak self] peer, participant in self?.requestOpenPeerFromSearch?(peer, participant) + self?.listNode.clearHighlightAnimated(true) }) let previousEntries = Atomic<[ChannelMembersSearchEntry]?>(value: nil) diff --git a/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift b/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift index 753c31f8df..b01007f86f 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift @@ -282,8 +282,10 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { case let .editablePublicLink(theme, placeholder, currentText): return ItemListSingleLineInputItem(theme: theme, title: NSAttributedString(string: "t.me/", textColor: theme.list.itemPrimaryTextColor), text: currentText, placeholder: placeholder, type: .regular(capitalization: false, autocorrection: false), clearButton: true, tag: ChannelVisibilityEntryTag.publicLink, sectionId: self.section, textUpdated: { updatedText in arguments.updatePublicLinkText(currentText, updatedText) - }, receivedFocus: { - arguments.scrollToPublicLinkText() + }, updatedFocus: { focus in + if focus { + arguments.scrollToPublicLinkText() + } }, action: { }) case let .privateLinkInfo(theme, text): diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index ee12c0cafa..ca63d082e3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -559,6 +559,10 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, text as NSString) }) } + }, sendCurrentMessage: { [weak self] silentPosting in + if let strongSelf = self { + strongSelf.chatDisplayNode.sendCurrentMessage(silentPosting: silentPosting) + } }, sendMessage: { [weak self] text in guard let strongSelf = self, canSendMessagesToChat(strongSelf.presentationInterfaceState) else { return @@ -2391,7 +2395,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } } - self.chatDisplayNode.sendMessages = { [weak self] messages, isAnyMessageTextPartitioned in + self.chatDisplayNode.sendMessages = { [weak self] messages, silentPosting, isAnyMessageTextPartitioned in if let strongSelf = self, case let .peer(peerId) = strongSelf.chatLocation { strongSelf.commitPurposefulAction() @@ -2417,7 +2421,14 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } } - let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: strongSelf.transformEnqueueMessages(messages)) + let transformedMessages: [EnqueueMessage] + if let silentPosting = silentPosting { + transformedMessages = strongSelf.transformEnqueueMessages(messages, silentPosting: silentPosting) + } else { + transformedMessages = strongSelf.transformEnqueueMessages(messages) + } + + let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: transformedMessages) |> deliverOnMainQueue).start(next: { _ in if let strongSelf = self { strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory() @@ -3631,6 +3642,21 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, strongSelf.slowmodeTooltipController = slowmodeTooltipController strongSelf.window?.presentInGlobalOverlay(slowmodeTooltipController) + }, displaySendMessageOptions: { [weak self] in + if let strongSelf = self, let sendButtonFrame = strongSelf.chatDisplayNode.sendButtonFrame(), let textInputNode = strongSelf.chatDisplayNode.textInputNode(), let layout = strongSelf.validLayout { + if layout.size.width > layout.size.height { + strongSelf.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .landscape) + } else { + strongSelf.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) + } + + let controller = ChatSendMessageActionSheetController(context: strongSelf.context, controllerInteraction: strongSelf.controllerInteraction, interfaceState: strongSelf.presentationInterfaceState, sendButtonFrame: sendButtonFrame, textInputNode: textInputNode, completion: { [weak self] in + if let strongSelf = self { + strongSelf.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .all) + } + }) + strongSelf.presentInGlobalOverlay(controller, with: nil) + } }, 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 { @@ -3733,20 +3759,21 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, self.failedMessageEventsDisposable.set((self.context.account.pendingMessageManager.failedMessageEvents(peerId: peerId) |> deliverOnMainQueue).start(next: { [weak self] reason in if let strongSelf = self { - let subjectFlags: TelegramChatBannedRightsFlags = .banSendMedia - let text: String let moreInfo: Bool switch reason { - case .flood: - text = strongSelf.presentationData.strings.Conversation_SendMessageErrorFlood - moreInfo = true - case .publicBan: - text = strongSelf.presentationData.strings.Conversation_SendMessageErrorGroupRestricted - moreInfo = true - case .mediaRestricted: - strongSelf.interfaceInteraction?.displayRestrictedInfo(.mediaRecording, .alert) - return + case .flood: + text = strongSelf.presentationData.strings.Conversation_SendMessageErrorFlood + moreInfo = true + case .publicBan: + text = strongSelf.presentationData.strings.Conversation_SendMessageErrorGroupRestricted + moreInfo = true + case .mediaRestricted: + strongSelf.interfaceInteraction?.displayRestrictedInfo(.mediaRecording, .alert) + return + case .slowmodeActive: + text = strongSelf.presentationData.strings.Chat_SlowmodeSendError + moreInfo = false } let actions: [TextAlertAction] if moreInfo { @@ -4648,14 +4675,14 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, let inputText = strongSelf.presentationInterfaceState.interfaceState.effectiveInputState.inputText let controller = legacyAttachmentMenu(context: strongSelf.context, peer: peer, editMediaOptions: editMediaOptions, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, parentController: legacyController, recentlyUsedInlineBots: strongSelf.recentlyUsedInlineBotsValue, initialCaption: inputText.string, openGallery: { - self?.presentMediaPicker(fileMode: false, editingMedia: editMediaOptions != nil, completion: { signals in + self?.presentMediaPicker(fileMode: false, editingMedia: editMediaOptions != nil, completion: { signals, silentPosting in if !inputText.string.isEmpty { //strongSelf.clearInputText() } if editMediaOptions != nil { self?.editMessageMediaWithLegacySignals(signals) } else { - self?.enqueueMediaMessages(signals: signals) + self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) } }) }, openCamera: { [weak self] cameraView, menuController in @@ -4665,7 +4692,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, if editMediaOptions != nil { strongSelf.editMessageMediaWithLegacySignals(signals!) } else { - strongSelf.enqueueMediaMessages(signals: signals) + strongSelf.enqueueMediaMessages(signals: signals, silentPosting: false) } if !inputText.string.isEmpty { //strongSelf.clearInputText() @@ -4697,14 +4724,14 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return } strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Chat_AttachmentMultipleFilesDisabled, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - }, sendMessagesWithSignals: { [weak self] signals in + }, sendMessagesWithSignals: { [weak self] signals, silentPosting in if !inputText.string.isEmpty { //strongSelf.clearInputText() } if editMediaOptions != nil { self?.editMessageMediaWithLegacySignals(signals!) } else { - self?.enqueueMediaMessages(signals: signals) + self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) } }, selectRecentlyUsedInlineBot: { [weak self] peer in if let strongSelf = self, let addressName = peer.addressName { @@ -4740,11 +4767,11 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, ActionSheetButtonItem(title: self.presentationData.strings.Conversation_FilePhotoOrVideo, action: { [weak self, weak actionSheet] in actionSheet?.dismissAnimated() if let strongSelf = self { - strongSelf.presentMediaPicker(fileMode: true, editingMedia: editingMessage, completion: { signals in + strongSelf.presentMediaPicker(fileMode: true, editingMedia: editingMessage, completion: { signals, silentPosting in if editingMessage { self?.editMessageMediaWithLegacySignals(signals) } else { - self?.enqueueMediaMessages(signals: signals) + self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) } }) } @@ -4808,7 +4835,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, self.present(actionSheet, in: .window(.root)) } - private func presentMediaPicker(fileMode: Bool, editingMedia: Bool, completion: @escaping ([Any]) -> Void) { + private func presentMediaPicker(fileMode: Bool, editingMedia: Bool, completion: @escaping ([Any], Bool) -> Void) { let postbox = self.context.account.postbox let _ = (self.context.sharedContext.accountManager.transaction { transaction -> Signal<(GeneratedMediaStoreSettings, SearchBotsConfiguration), NoError> in let entry = transaction.getSharedData(ApplicationSpecificSharedDataKeys.generatedMediaStoreSettings) as? GeneratedMediaStoreSettings @@ -4841,7 +4868,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, configureLegacyAssetPicker(controller, context: strongSelf.context, peer: peer, initialCaption: inputText.string, presentWebSearch: { [weak self, weak legacyController] in if let strongSelf = self { - let controller = WebSearchController(context: strongSelf.context, peer: peer, configuration: searchBotsConfiguration, mode: .media(completion: { results, selectionState, editingState in + let controller = WebSearchController(context: strongSelf.context, peer: peer, configuration: searchBotsConfiguration, mode: .media(completion: { results, selectionState, editingState, silentPosting in if let legacyController = legacyController { legacyController.dismiss() } @@ -4851,7 +4878,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } }, enqueueMediaMessages: { signals in if let strongSelf = self { - strongSelf.enqueueMediaMessages(signals: signals) + strongSelf.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) } }) })) @@ -4864,10 +4891,10 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Chat_AttachmentLimitExceeded, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) }) controller.descriptionGenerator = legacyAssetPickerItemGenerator() - controller.completionBlock = { [weak legacyController, weak self] signals in + controller.completionBlock = { [weak legacyController] signals, silentPosting in if let legacyController = legacyController { legacyController.dismiss() - completion(signals!) + completion(signals!, silentPosting) } } controller.dismissalBlock = { [weak legacyController] in @@ -4896,14 +4923,14 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } |> deliverOnMainQueue).start(next: { [weak self] configuration in if let strongSelf = self { - let controller = WebSearchController(context: strongSelf.context, peer: peer, configuration: configuration, mode: .media(completion: { [weak self] results, selectionState, editingState in + let controller = WebSearchController(context: strongSelf.context, peer: peer, configuration: configuration, mode: .media(completion: { [weak self] results, selectionState, editingState, silentPosting in legacyEnqueueWebSearchMessages(selectionState, editingState, enqueueChatContextResult: { [weak self] result in if let strongSelf = self { strongSelf.enqueueChatContextResult(results, result, hideVia: true) } }, enqueueMediaMessages: { [weak self] signals in if let strongSelf = self { - strongSelf.enqueueMediaMessages(signals: signals) + strongSelf.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) } }) })) @@ -5081,8 +5108,12 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } } - private func transformEnqueueMessages(_ messages: [EnqueueMessage]) -> [EnqueueMessage] { + func transformEnqueueMessages(_ messages: [EnqueueMessage]) -> [EnqueueMessage] { let silentPosting = self.presentationInterfaceState.interfaceState.silentPosting + return transformEnqueueMessages(messages, silentPosting: silentPosting) + } + + private func transformEnqueueMessages(_ messages: [EnqueueMessage], silentPosting: Bool) -> [EnqueueMessage] { return messages.map { message in if silentPosting { return message.withUpdatedAttributes { attributes in @@ -5115,11 +5146,12 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } } - private func enqueueMediaMessages(signals: [Any]?) { + private func enqueueMediaMessages(signals: [Any]?, silentPosting: Bool) { if case .peer = self.chatLocation { self.enqueueMediaMessageDisposable.set((legacyAssetPickerEnqueueMessages(account: self.context.account, signals: signals!) |> deliverOnMainQueue).start(next: { [weak self] messages in if let strongSelf = self { + let messages = strongSelf.transformEnqueueMessages(messages, silentPosting: silentPosting) let replyMessageId = strongSelf.presentationInterfaceState.interfaceState.replyMessageId strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({ if let strongSelf = self { @@ -5143,7 +5175,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, if let strongSelf = self, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer { strongSelf.chatDisplayNode.dismissInput() let _ = presentLegacyPasteMenu(context: strongSelf.context, peer: peer, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, images: images, sendMessagesWithSignals: { signals in - self?.enqueueMediaMessages(signals: signals) + self?.enqueueMediaMessages(signals: signals, silentPosting: false) }, present: { [weak self] controller, arguments in if let strongSelf = self { strongSelf.present(controller, in: .window(.root), with: arguments) @@ -5797,7 +5829,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, strongController.dismiss() } else if peerId == strongSelf.context.account.peerId { let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: messageIds.map { id -> EnqueueMessage in - return .forward(source: id, grouping: .auto) + return .forward(source: id, grouping: .auto, attributes: []) }) |> deliverOnMainQueue).start(next: { messageIds in if let strongSelf = self { @@ -5806,7 +5838,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return nil } return strongSelf.context.account.pendingMessageManager.pendingMessageStatus(id) - |> mapToSignal { status -> Signal in + |> mapToSignal { status, _ -> Signal in if status != nil { return .never() } else { @@ -6455,7 +6487,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, let sourceRect = rect.insetBy(dx: -2.0, dy: -2.0) gallery.containerLayoutUpdated(ContainerViewLayout(size: CGSize(width: self.view.bounds.size.width, height: self.view.bounds.size.height), metrics: LayoutMetrics(), intrinsicInsets: UIEdgeInsets(), safeInsets: UIEdgeInsets(), statusBarHeight: nil, inputHeight: nil, standardInputHeight: 216.0, inputHeightIsInteractivellyChanging: false, inVoiceOver: false), transition: .immediate) return (gallery, sourceRect) - case let .instantPage(gallery, centralIndex, galleryMedia): + case .instantPage: break } } diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerBackgroundNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerBackgroundNode.swift index aea76c3698..47c2109d5a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerBackgroundNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerBackgroundNode.swift @@ -5,11 +5,26 @@ import TelegramCore import Display import SwiftSignalKit import Postbox - +import TelegramPresentationData private var backgroundImageForWallpaper: (TelegramWallpaper, Bool, UIImage)? -func chatControllerBackgroundImage(wallpaper: TelegramWallpaper, mediaBox: MediaBox, composed: Bool = true) -> UIImage? { +func chatControllerBackgroundImage(theme: PresentationTheme, wallpaper initialWallpaper: TelegramWallpaper, mediaBox: MediaBox, composed: Bool = true, knockoutMode: Bool) -> UIImage? { + var wallpaper = initialWallpaper + if knockoutMode { + switch theme.name { + case let .builtin(name): + switch name { + case .day, .night, .nightAccent: + wallpaper = theme.chat.defaultWallpaper + case .dayClassic: + break + } + case .custom: + break + } + } + var backgroundImage: UIImage? if composed && wallpaper == backgroundImageForWallpaper?.0, (wallpaper.settings?.blur ?? false) == backgroundImageForWallpaper?.1 { backgroundImage = backgroundImageForWallpaper?.2 diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift index ea46d00fb4..3fdd99985b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift @@ -77,6 +77,7 @@ public final class ChatControllerInteraction { let navigateToMessage: (MessageId, MessageId) -> Void let clickThroughMessage: () -> Void let toggleMessagesSelection: ([MessageId], Bool) -> Void + let sendCurrentMessage: (Bool) -> Void let sendMessage: (String) -> Void let sendSticker: (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool let sendGif: (FileMediaReference, ASDisplayNode, CGRect) -> Bool @@ -123,7 +124,7 @@ public final class ChatControllerInteraction { var stickerSettings: ChatInterfaceStickerSettings var searchTextHighightState: String? - init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOption: @escaping (MessageId, Data) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { + init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOption: @escaping (MessageId, Data) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { self.openMessage = openMessage self.openPeer = openPeer self.openPeerMention = openPeerMention @@ -131,6 +132,7 @@ public final class ChatControllerInteraction { self.navigateToMessage = navigateToMessage self.clickThroughMessage = clickThroughMessage self.toggleMessagesSelection = toggleMessagesSelection + self.sendCurrentMessage = sendCurrentMessage self.sendMessage = sendMessage self.sendSticker = sendSticker self.sendGif = sendGif @@ -176,7 +178,7 @@ public final class ChatControllerInteraction { static var `default`: ChatControllerInteraction { return ChatControllerInteraction(openMessage: { _, _ in - return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _ in }, navigateToMessage: { _, _ in }, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _ in }, navigateToMessage: { _, _ in }, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, presentGlobalOverlayController: { _, _ in }, callPeer: { _ in }, longTap: { _, _ in }, openCheckoutOrReceipt: { _ in }, openSearch: { }, setupReply: { _ in diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index c8930a7a5b..563dbb583e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -127,7 +127,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { var requestUpdateChatInterfaceState: (Bool, Bool, (ChatInterfaceState) -> ChatInterfaceState) -> Void = { _, _, _ in } var requestUpdateInterfaceState: (ContainedViewLayoutTransition, Bool, (ChatPresentationInterfaceState) -> ChatPresentationInterfaceState) -> Void = { _, _, _ in } - var sendMessages: ([EnqueueMessage], Bool) -> Void = { _, _ in } + var sendMessages: ([EnqueueMessage], Bool?, Bool) -> Void = { _, _, _ in } var displayAttachmentMenu: () -> Void = { } var paste: (ChatTextInputPanelPasteData) -> Void = { _ in } var updateTypingActivity: (Bool) -> Void = { _ in } @@ -172,6 +172,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } + private var lastSendTimestamp = 0.0 + private var openStickersDisposable: Disposable? private var displayVideoUnmuteTipDisposable: Disposable? @@ -252,7 +254,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } - self.backgroundNode.image = chatControllerBackgroundImage(wallpaper: chatPresentationInterfaceState.chatWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox) + self.backgroundNode.image = chatControllerBackgroundImage(theme: chatPresentationInterfaceState.theme, wallpaper: chatPresentationInterfaceState.chatWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) self.backgroundNode.motionEnabled = chatPresentationInterfaceState.chatWallpaper.settings?.motion ?? false self.historyNode.verticalScrollIndicatorColor = UIColor(white: 0.5, alpha: 0.8) @@ -277,78 +279,10 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { strongSelf.requestLayout(.animated(duration: 0.1, curve: .easeInOut)) } } - var lastSendTimestamp = 0.0 + self.textInputPanelNode?.sendMessage = { [weak self] in - if let strongSelf = self, let textInputPanelNode = strongSelf.inputPanelNode as? ChatTextInputPanelNode { - if textInputPanelNode.textInputNode?.isFirstResponder() ?? false { - Keyboard.applyAutocorrection() - } - - var effectivePresentationInterfaceState = strongSelf.chatPresentationInterfaceState - if let textInputPanelNode = strongSelf.textInputPanelNode { - effectivePresentationInterfaceState = effectivePresentationInterfaceState.updatedInterfaceState { $0.withUpdatedEffectiveInputState(textInputPanelNode.inputTextState) } - } - - if let _ = effectivePresentationInterfaceState.interfaceState.editMessage { - strongSelf.interfaceInteraction?.editMessage() - } else { - if let _ = effectivePresentationInterfaceState.slowmodeState { - if let rect = strongSelf.frameForInputActionButton() { - strongSelf.interfaceInteraction?.displaySlowmodeTooltip(strongSelf, rect) - } - return - } - - let timestamp = CACurrentMediaTime() - if lastSendTimestamp + 0.15 > timestamp { - return - } - lastSendTimestamp = timestamp - - strongSelf.updateTypingActivity(false) - - var messages: [EnqueueMessage] = [] - - let inputText = convertMarkdownToAttributes(effectivePresentationInterfaceState.interfaceState.composeInputState.inputText) - - for text in breakChatInputText(trimChatInputText(inputText)) { - if text.length != 0 { - var attributes: [MessageAttribute] = [] - let entities = generateTextEntities(text.string, enabledTypes: .all, currentEntities: generateChatInputTextEntities(text)) - if !entities.isEmpty { - attributes.append(TextEntitiesMessageAttribute(entities: entities)) - } - var webpage: TelegramMediaWebpage? - if strongSelf.chatPresentationInterfaceState.interfaceState.composeDisableUrlPreview != nil { - attributes.append(OutgoingContentInfoMessageAttribute(flags: [.disableLinkPreviews])) - } else { - webpage = strongSelf.chatPresentationInterfaceState.urlPreview?.1 - } - messages.append(.message(text: text.string, attributes: attributes, mediaReference: webpage.flatMap(AnyMediaReference.standalone), replyToMessageId: strongSelf.chatPresentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil)) - } - } - - if !messages.isEmpty || strongSelf.chatPresentationInterfaceState.interfaceState.forwardMessageIds != nil { - strongSelf.setupSendActionOnViewUpdate({ [weak strongSelf] in - if let strongSelf = strongSelf, let textInputPanelNode = strongSelf.inputPanelNode as? ChatTextInputPanelNode { - strongSelf.ignoreUpdateHeight = true - textInputPanelNode.text = "" - strongSelf.requestUpdateChatInterfaceState(false, true, { $0.withUpdatedReplyMessageId(nil).withUpdatedForwardMessageIds(nil).withUpdatedComposeDisableUrlPreview(nil) }) - strongSelf.ignoreUpdateHeight = false - } - }) - - if let forwardMessageIds = strongSelf.chatPresentationInterfaceState.interfaceState.forwardMessageIds { - for id in forwardMessageIds { - messages.append(.forward(source: id, grouping: .auto)) - } - } - - if case .peer = strongSelf.chatLocation { - strongSelf.sendMessages(messages, messages.count > 1) - } - } - } + if let strongSelf = self { + strongSelf.sendCurrentMessage() } } @@ -1357,7 +1291,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { let themeUpdated = self.chatPresentationInterfaceState.theme !== chatPresentationInterfaceState.theme if self.chatPresentationInterfaceState.chatWallpaper != chatPresentationInterfaceState.chatWallpaper { - self.backgroundNode.image = chatControllerBackgroundImage(wallpaper: chatPresentationInterfaceState.chatWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox) + self.backgroundNode.image = chatControllerBackgroundImage(theme: chatPresentationInterfaceState.theme, wallpaper: chatPresentationInterfaceState.chatWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: self.context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) self.backgroundNode.motionEnabled = chatPresentationInterfaceState.chatWallpaper.settings?.motion ?? false } @@ -1602,6 +1536,18 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { return self.inputPanelNode?.frame } + func sendButtonFrame() -> CGRect? { + if let frame = self.textInputPanelNode?.actionButtons.frame { + return self.textInputPanelNode?.convert(frame, to: self) + } else { + return nil + } + } + + func textInputNode() -> EditableTextNode? { + return self.textInputPanelNode?.textInputNode + } + func frameForInputPanelAccessoryButton(_ item: ChatTextInputAccessoryItem) -> CGRect? { if let textInputPanelNode = self.textInputPanelNode, self.inputPanelNode === textInputPanelNode { return textInputPanelNode.frameForAccessoryButton(item).flatMap { @@ -2053,4 +1999,78 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { }) } } + + func sendCurrentMessage(silentPosting: Bool? = nil) { + if let textInputPanelNode = self.inputPanelNode as? ChatTextInputPanelNode { + if textInputPanelNode.textInputNode?.isFirstResponder() ?? false { + Keyboard.applyAutocorrection() + } + + var effectivePresentationInterfaceState = self.chatPresentationInterfaceState + if let textInputPanelNode = self.textInputPanelNode { + effectivePresentationInterfaceState = effectivePresentationInterfaceState.updatedInterfaceState { $0.withUpdatedEffectiveInputState(textInputPanelNode.inputTextState) } + } + + if let _ = effectivePresentationInterfaceState.interfaceState.editMessage { + self.interfaceInteraction?.editMessage() + } else { + if let _ = effectivePresentationInterfaceState.slowmodeState { + if let rect = self.frameForInputActionButton() { + self.interfaceInteraction?.displaySlowmodeTooltip(self, rect) + } + return + } + + let timestamp = CACurrentMediaTime() + if self.lastSendTimestamp + 0.15 > timestamp { + return + } + self.lastSendTimestamp = timestamp + + self.updateTypingActivity(false) + + var messages: [EnqueueMessage] = [] + + let inputText = convertMarkdownToAttributes(effectivePresentationInterfaceState.interfaceState.composeInputState.inputText) + + for text in breakChatInputText(trimChatInputText(inputText)) { + if text.length != 0 { + var attributes: [MessageAttribute] = [] + let entities = generateTextEntities(text.string, enabledTypes: .all, currentEntities: generateChatInputTextEntities(text)) + if !entities.isEmpty { + attributes.append(TextEntitiesMessageAttribute(entities: entities)) + } + var webpage: TelegramMediaWebpage? + if self.chatPresentationInterfaceState.interfaceState.composeDisableUrlPreview != nil { + attributes.append(OutgoingContentInfoMessageAttribute(flags: [.disableLinkPreviews])) + } else { + webpage = self.chatPresentationInterfaceState.urlPreview?.1 + } + messages.append(.message(text: text.string, attributes: attributes, mediaReference: webpage.flatMap(AnyMediaReference.standalone), replyToMessageId: self.chatPresentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil)) + } + } + + if !messages.isEmpty || self.chatPresentationInterfaceState.interfaceState.forwardMessageIds != nil { + self.setupSendActionOnViewUpdate({ [weak self] in + if let strongSelf = self, let textInputPanelNode = strongSelf.inputPanelNode as? ChatTextInputPanelNode { + strongSelf.ignoreUpdateHeight = true + textInputPanelNode.text = "" + strongSelf.requestUpdateChatInterfaceState(false, true, { $0.withUpdatedReplyMessageId(nil).withUpdatedForwardMessageIds(nil).withUpdatedComposeDisableUrlPreview(nil) }) + strongSelf.ignoreUpdateHeight = false + } + }) + + if let forwardMessageIds = self.chatPresentationInterfaceState.interfaceState.forwardMessageIds { + for id in forwardMessageIds { + messages.append(.forward(source: id, grouping: .auto, attributes: [])) + } + } + + if case .peer = self.chatLocation { + self.sendMessages(messages, silentPosting, messages.count > 1) + } + } + } + } + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryEntry.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryEntry.swift index f52567fa65..f6e80d0e50 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryEntry.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryEntry.swift @@ -40,8 +40,12 @@ enum ChatHistoryEntry: Identifiable, Comparable { switch self { case let .MessageEntry(message, presentationData, _, _, _, _): var type = 2 - if presentationData.largeEmoji && message.elligibleForLargeEmoji && messageTextIsElligibleForLargeEmoji(message.text) { - type = 3 + if presentationData.largeEmoji && message.elligibleForLargeEmoji && messageIsElligibleForLargeEmoji(message) { + if animatedEmojiResource(emoji: message.text) != nil { + type = 3 + } else { + type = 4 + } } return UInt64(message.stableId) | ((UInt64(type) << 40)) case let .MessageGroupEntry(groupInfo, _, _): diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift index 3a3c40bfea..8002461b2d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -196,7 +196,7 @@ private func mappedInsertEntries(context: AccountContext, chatLocation: ChatLoca } return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: item, directionHint: entry.directionHint) case let .UnreadEntry(_, presentationData): - return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatUnreadItem(index: entry.entry.index, presentationData: presentationData), directionHint: entry.directionHint) + return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatUnreadItem(index: entry.entry.index, presentationData: presentationData, context: context), directionHint: entry.directionHint) case let .ChatInfoEntry(text, presentationData): return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatBotInfoItem(text: text, controllerInteraction: controllerInteraction, presentationData: presentationData), directionHint: entry.directionHint) case let .SearchEntry(theme, strings): @@ -230,7 +230,7 @@ private func mappedUpdateEntries(context: AccountContext, chatLocation: ChatLoca } return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: item, directionHint: entry.directionHint) case let .UnreadEntry(_, presentationData): - return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatUnreadItem(index: entry.entry.index, presentationData: presentationData), directionHint: entry.directionHint) + return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatUnreadItem(index: entry.entry.index, presentationData: presentationData, context: context), directionHint: entry.directionHint) case let .ChatInfoEntry(text, presentationData): return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatBotInfoItem(text: text, controllerInteraction: controllerInteraction, presentationData: presentationData), directionHint: entry.directionHint) case let .SearchEntry(theme, strings): @@ -737,7 +737,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { strongSelf.forEachItemHeaderNode { itemHeaderNode in if let dateNode = itemHeaderNode as? ChatMessageDateHeaderNode { - dateNode.updatePresentationData(chatPresentationData) + dateNode.updatePresentationData(chatPresentationData, context: context) } else if let dateNode = itemHeaderNode as? ListMessageDateHeaderNode { dateNode.updateThemeAndStrings(theme: presentationData.theme, strings: presentationData.strings) } diff --git a/submodules/TelegramUI/TelegramUI/ChatListControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatListControllerNode.swift index cabf08c318..711fab8cce 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListControllerNode.swift @@ -112,7 +112,7 @@ final class ChatListControllerNode: ASDisplayNode { switch isEmptyState { case .empty(true): if strongSelf.chatListEmptyIndicator == nil { - let chatListEmptyIndicator = ActivityIndicator(type: .custom(strongSelf.presentationData.theme.list.itemAccentColor, 22.0, 1.0, false)) + let chatListEmptyIndicator = ActivityIndicator(type: .custom(strongSelf.presentationData.theme.list.itemSecondaryTextColor, 22.0, 1.0, false)) strongSelf.chatListEmptyIndicator = chatListEmptyIndicator strongSelf.insertSubnode(chatListEmptyIndicator, belowSubnode: strongSelf.chatListNode) if let (layout, navigationHeight, visualNavigationHeight) = strongSelf.containerLayout { diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputPeerSpecificItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputPeerSpecificItem.swift index d4c0d125d5..9544895a55 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputPeerSpecificItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputPeerSpecificItem.swift @@ -58,7 +58,7 @@ final class ChatMediaInputPeerSpecificItem: ListViewItem { } } -private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 10.0)! +private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 12.0)! private let boundingSize = CGSize(width: 41.0, height: 41.0) private let boundingImageSize = CGSize(width: 28.0, height: 28.0) private let highlightSize = CGSize(width: 35.0, height: 35.0) @@ -83,7 +83,7 @@ final class ChatMediaInputPeerSpecificItemNode: ListViewItemNode { self.avatarNode.isLayerBacked = !smartInvertColorsEnabled() self.avatarNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) - let imageSize = CGSize(width: 32.0, height: 32.0) + let imageSize = CGSize(width: 26.0, height: 26.0) self.avatarNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - imageSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - imageSize.height) / 2.0)), size: imageSize) self.highlightNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - highlightSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - highlightSize.height) / 2.0)), size: highlightSize) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index b1feb4f240..f4d6a8b46c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -27,6 +27,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { private var shareButtonNode: HighlightableButtonNode? var telegramFile: TelegramMediaFile? + var emojiResource: LocalBundleResource? private let disposable = MetaDisposable() private var viaBotNode: TextNode? @@ -74,6 +75,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if let shareButtonNode = strongSelf.shareButtonNode, shareButtonNode.frame.contains(point) { return .fail } + + if strongSelf.telegramFile == nil { + if strongSelf.animationNode.frame.contains(point) { + return .waitForDoubleTap + } + } } return .waitForSingleTap } @@ -120,15 +127,23 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { self.telegramFile = telegramFile self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.context.account.postbox, file: telegramFile, small: false, size: CGSize(width: 384.0, height: 384.0), thumbnail: false)) self.updateVisibility() - if self.visibilityStatus && false { - self.didSetUpAnimationNode = true - self.animationNode.setup(account: item.context.account, resource: telegramFile.resource, width: 384, height: 384, mode: .cached) - } self.disposable.set(freeMediaFileInteractiveFetched(account: item.context.account, fileReference: .message(message: MessageReference(item.message), media: telegramFile)).start()) } break } } + + if self.telegramFile == nil { + self.emojiResource = animatedEmojiResource(emoji: item.message.text) + + if let emojiResource = self.emojiResource { + let dummyFile = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: emojiResource, previewRepresentations: [], immediateThumbnailData: nil, mimeType: "", size: 0, attributes: []) + self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.context.account.postbox, file: dummyFile, small: false, size: CGSize(width: 384.0, height: 384.0), thumbnail: false)) + self.disposable.set(freeMediaFileInteractiveFetched(account: item.context.account, fileReference: .message(message: MessageReference(item.message), media: dummyFile)).start()) + } + + self.updateVisibility() + } } func updateVisibility() { @@ -142,12 +157,19 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { self.animationNode.visibility = isPlaying if let item = self.item, isPlaying, !self.didSetUpAnimationNode { self.didSetUpAnimationNode = true + var telegramFile: TelegramMediaFile? for media in item.message.media { - if let telegramFile = media as? TelegramMediaFile { - self.animationNode.setup(account: item.context.account, resource: telegramFile.resource, width: 384, height: 384, mode: .cached) + if let file = media as? TelegramMediaFile { + telegramFile = file break } } + + if let telegramFile = telegramFile { + self.animationNode.setup(account: item.context.account, resource: telegramFile.resource, width: 384, height: 384, mode: .cached) + } else if let emojiResource = self.emojiResource { + self.animationNode.setup(account: item.context.account, resource: emojiResource, width: 384, height: 384, mode: .cached) + } } } } @@ -174,11 +196,26 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let incoming = item.message.effectivelyIncoming(item.context.account.peerId) var imageSize: CGSize = CGSize(width: 200.0, height: 200.0) if let telegramFile = telegramFile { + var displaySize = displaySize + if !GlobalExperimentalSettings.isAppStoreBuild, let fileName = telegramFile.fileName { + let components = fileName.components(separatedBy: "_size") + if let size = components.last?.lowercased() { + var size = size + size.removeLast(4) + if let sizeValue = Int(size), sizeValue > 0 && sizeValue < 512 { + let side: CGFloat = floor(displaySize.width * CGFloat(sizeValue) / 512.0) + displaySize = CGSize(width: side, height: side) + } + } + } + if let dimensions = telegramFile.dimensions { imageSize = dimensions.aspectFitted(displaySize) } else if let thumbnailSize = telegramFile.previewRepresentations.first?.dimensions { imageSize = thumbnailSize.aspectFitted(displaySize) } + } else { + imageSize = CGSize(width: floor(displaySize.width * 0.683), height: floor(displaySize.height * 0.683)) } let avatarInset: CGFloat @@ -292,7 +329,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let dateText = stringForMessageTimestampStatus(accountPeerId: item.context.account.peerId, message: item.message, dateTimeFormat: item.presentationData.dateTimeFormat, nameDisplayOrder: item.presentationData.nameDisplayOrder, strings: item.presentationData.strings, format: .minimal) - let (dateAndStatusSize, dateAndStatusApply) = makeDateAndStatusLayout(item.presentationData, false, viewCount, dateText, statusType, CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude)) + let (dateAndStatusSize, dateAndStatusApply) = makeDateAndStatusLayout(item.context, item.presentationData, false, viewCount, dateText, statusType, CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude)) var viaBotApply: (TextNodeLayout, () -> TextNode)? var replyInfoApply: (CGSize, () -> ChatMessageReplyInfoNode)? diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift index a418e9b723..b55c7b9324 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift @@ -536,7 +536,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { } } - statusSizeAndApply = statusLayout(presentationData, edited && !sentViaBot, viewCount, dateText, statusType, textConstrainedSize) + statusSizeAndApply = statusLayout(context, presentationData, edited && !sentViaBot, viewCount, dateText, statusType, textConstrainedSize) } default: break diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleBackdrop.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleBackdrop.swift index 69e07fe8d2..2fefc5c632 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleBackdrop.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleBackdrop.swift @@ -3,32 +3,11 @@ import AsyncDisplayKit import Display import Postbox -private let backgroundContentImage = generateImage(CGSize(width: 1.0, height: 1000.0), rotatedContext: { size, context in - var locations: [CGFloat] = [0.0, 1.0] - let colors = [UIColor(rgb: 0x018CFE).cgColor, UIColor(rgb: 0x0A51A1).cgColor] as NSArray - - let colorSpace = deviceColorSpace - let gradient = CGGradient(colorsSpace: colorSpace, colors: colors, locations: &locations)! - - context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: size.height), options: CGGradientDrawingOptions()) -}) - -private let backgroundContentIncomingImage = generateImage(CGSize(width: 1.0, height: 1000.0), rotatedContext: { size, context in - var locations: [CGFloat] = [0.0, 1.0] - let colors = [UIColor(rgb: 0x39393C).cgColor, UIColor(rgb: 0x222224).cgColor] as NSArray - - let colorSpace = deviceColorSpace - let gradient = CGGradient(colorsSpace: colorSpace, colors: colors, locations: &locations)! - - context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: size.height), options: CGGradientDrawingOptions()) -}) - -private let blurredImage = UIImage(contentsOfFile: "/Users/peter/Library/Developer/CoreSimulator/Devices/5D789082-637B-493D-8CD3-32E59577B64D/data/Containers/Shared/AppGroup/AA2C1D1D-BD42-4662-8003-A4DDC118839F/telegram-data/account-8200745692227124259/postbox/media/telegram-cloud-document-1-5033031402610753634")?.precomposed() - final class ChatMessageBubbleBackdrop: ASDisplayNode { private let backgroundContent: ASDisplayNode - private var currentType: Bool? + private var currentType: ChatMessageBackgroundType? + private var theme: ChatPresentationThemeData? override init() { self.backgroundContent = ASDisplayNode() @@ -40,17 +19,28 @@ final class ChatMessageBubbleBackdrop: ASDisplayNode { self.addSubnode(self.backgroundContent) } - func setType(incoming: Bool, theme: ChatPresentationThemeData, mediaBox: MediaBox) { - if self.currentType != incoming { - self.currentType = incoming + func setType(type: ChatMessageBackgroundType, theme: ChatPresentationThemeData, mediaBox: MediaBox, essentialGraphics: PrincipalThemeEssentialGraphics) { + if self.currentType != type || self.theme != theme { + self.currentType = type + self.theme = theme - //self.backgroundContent.contents = blurredImage?.cgImage - - self.backgroundContent.contents = incoming ? backgroundContentIncomingImage?.cgImage : backgroundContentImage?.cgImage + switch type { + case .none: + self.backgroundContent.contents = nil + case .incoming: + self.backgroundContent.contents = essentialGraphics.incomingBubbleGradientImage?.cgImage + case .outgoing: + self.backgroundContent.contents = essentialGraphics.outgoingBubbleGradientImage?.cgImage + } } } func update(rect: CGRect, within containerSize: CGSize) { self.backgroundContent.frame = CGRect(origin: CGPoint(x: -rect.minX, y: -rect.minY), size: containerSize) } + + func offset(value: CGFloat, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { + let transition: ContainedViewLayoutTransition = .animated(duration: duration, curve: animationCurve) + transition.animatePositionAdditive(node: self.backgroundContent, offset: CGPoint(x: 0.0, y: -value)) + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleImages.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleImages.swift index 2f04369ec2..afa6cacbf4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleImages.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleImages.swift @@ -26,13 +26,13 @@ func messageSingleBubbleLikeImage(fillColor: UIColor, strokeColor: UIColor) -> U })!.stretchableImage(withLeftCapWidth: Int(diameter / 2.0), topCapHeight: Int(diameter / 2.0)) } -func messageBubbleImage(incoming: Bool, fillColor: UIColor, strokeColor: UIColor, neighbors: MessageBubbleImageNeighbors, theme: PresentationThemeChat, wallpaper: TelegramWallpaper) -> UIImage { +func messageBubbleImage(incoming: Bool, fillColor: UIColor, strokeColor: UIColor, neighbors: MessageBubbleImageNeighbors, theme: PresentationThemeChat, wallpaper: TelegramWallpaper, knockout: Bool) -> UIImage { let diameter: CGFloat = 36.0 let corner: CGFloat = 7.0 return generateImage(CGSize(width: 42.0, height: diameter), contextGenerator: { size, context in var drawWithClearColor = false - if case let .color(color) = wallpaper { + if knockout, case let .color(color) = wallpaper { drawWithClearColor = true context.setFillColor(UIColor(rgb: UInt32(color)).cgColor) context.fill(CGRect(origin: CGPoint(), size: size)) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index b0a2b94344..d0c9feecef 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -213,13 +213,21 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { override func animateRemoved(_ currentTimestamp: Double, duration: Double) { super.animateRemoved(currentTimestamp, duration: duration) - self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.allowsGroupOpacity = true + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false, completion: { [weak self] _ in + self?.allowsGroupOpacity = false + }) + self.layer.animateScale(from: 1.0, to: 0.1, duration: 0.15, removeOnCompletion: false) + self.layer.animatePosition(from: CGPoint(), to: CGPoint(x: self.bounds.width / 2.0 - self.backgroundNode.frame.midX, y: self.backgroundNode.frame.midY), duration: 0.15, timingFunction: kCAMediaTimingFunctionEaseInEaseOut, removeOnCompletion: false, additive: true) } override func animateAdded(_ currentTimestamp: Double, duration: Double) { super.animateAdded(currentTimestamp, duration: duration) - self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.allowsGroupOpacity = true + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, completion: { [weak self] _ in + self?.allowsGroupOpacity = false + }) } override func didLoad() { @@ -361,7 +369,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { forwardInfoLayout: (ChatPresentationData, PresentationStrings, ChatMessageForwardInfoType, Peer?, String?, CGSize) -> (CGSize, () -> ChatMessageForwardInfoNode), replyInfoLayout: (ChatPresentationData, PresentationStrings, AccountContext, ChatMessageReplyInfoType, Message, CGSize) -> (CGSize, () -> ChatMessageReplyInfoNode), actionButtonsLayout: (AccountContext, ChatPresentationThemeData, PresentationStrings, ReplyMarkupMessageAttribute, Message, CGFloat) -> (minWidth: CGFloat, layout: (CGFloat) -> (CGSize, (Bool) -> ChatMessageActionButtonsNode)), - mosaicStatusLayout: (ChatPresentationData, Bool, Int?, String, ChatMessageDateAndStatusType, CGSize) -> (CGSize, (Bool) -> ChatMessageDateAndStatusNode), + mosaicStatusLayout: (AccountContext, ChatPresentationData, Bool, Int?, String, ChatMessageDateAndStatusType, CGSize) -> (CGSize, (Bool) -> ChatMessageDateAndStatusNode), currentShareButtonNode: HighlightableButtonNode?, layoutConstants: ChatMessageItemLayoutConstants, currentItem: ChatMessageItem?, @@ -826,7 +834,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { } } - mosaicStatusSizeAndApply = mosaicStatusLayout(item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: 200.0, height: CGFloat.greatestFiniteMagnitude)) + mosaicStatusSizeAndApply = mosaicStatusLayout(item.context, item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: 200.0, height: CGFloat.greatestFiniteMagnitude)) } } @@ -863,7 +871,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { case .admin: string = item.presentationData.strings.Conversation_Admin case let .custom(rank): - string = rank + string = rank.trimmingEmojis } adminBadgeString = NSAttributedString(string: " \(string)", font: inlineBotPrefixFont, textColor: messageTheme.secondaryTextColor) } else if authorIsChannel { @@ -1246,7 +1254,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { let layout = ListViewItemNodeLayout(contentSize: layoutSize, insets: layoutInsets) - let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(context: item.context, theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) var updatedMergedTop = mergedBottom var updatedMergedBottom = mergedTop @@ -1364,7 +1372,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { backgroundType = .incoming(mergeType) } strongSelf.backgroundNode.setType(type: backgroundType, highlighted: strongSelf.highlightedState, graphics: graphics, transition: transition) - strongSelf.backgroundWallpaperNode.setType(incoming: incoming, theme: item.presentationData.theme, mediaBox: item.context.account.postbox.mediaBox) + strongSelf.backgroundWallpaperNode.setType(type: backgroundType, theme: item.presentationData.theme, mediaBox: item.context.account.postbox.mediaBox, essentialGraphics: graphics) strongSelf.backgroundType = backgroundType @@ -2344,7 +2352,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { if self.highlightedState != highlighted { self.highlightedState = highlighted if let backgroundType = self.backgroundType { - let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(context: item.context, theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) if highlighted { self.backgroundNode.setType(type: backgroundType, highlighted: true, graphics: graphics, transition: .immediate) @@ -2448,4 +2456,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { let mappedRect = CGRect(origin: CGPoint(x: rect.minX + self.backgroundWallpaperNode.frame.minX, y: containerSize.height - rect.maxY + self.backgroundWallpaperNode.frame.minY), size: rect.size) self.backgroundWallpaperNode.update(rect: mappedRect, within: containerSize) } + + override func applyAbsoluteOffset(value: CGFloat, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { + self.backgroundWallpaperNode.offset(value: -value, animationCurve: animationCurve, duration: duration) + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageContactBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageContactBubbleContentNode.swift index 5cef4e0201..eea254f241 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageContactBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageContactBubbleContentNode.swift @@ -177,7 +177,7 @@ class ChatMessageContactBubbleContentNode: ChatMessageBubbleContentNode { var statusApply: ((Bool) -> Void)? if let statusType = statusType { - let (size, apply) = statusLayout(item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: constrainedSize.width, height: CGFloat.greatestFiniteMagnitude)) + let (size, apply) = statusLayout(item.context, item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: constrainedSize.width, height: CGFloat.greatestFiniteMagnitude)) statusSize = size statusApply = apply } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift index f407cc4fdc..302a685e50 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift @@ -127,7 +127,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { self.addSubnode(self.dateNode) } - func asyncLayout() -> (_ presentationData: ChatPresentationData, _ edited: Bool, _ impressionCount: Int?, _ dateText: String, _ type: ChatMessageDateAndStatusType, _ constrainedSize: CGSize) -> (CGSize, (Bool) -> Void) { + func asyncLayout() -> (_ context: AccountContext, _ presentationData: ChatPresentationData, _ edited: Bool, _ impressionCount: Int?, _ dateText: String, _ type: ChatMessageDateAndStatusType, _ constrainedSize: CGSize) -> (CGSize, (Bool) -> Void) { let dateLayout = TextNode.asyncLayout(self.dateNode) var checkReadNode = self.checkReadNode @@ -141,7 +141,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { let currentType = self.type let currentTheme = self.theme - return { presentationData, edited, impressionCount, dateText, type, constrainedSize in + return { context, presentationData, edited, impressionCount, dateText, type, constrainedSize in let dateColor: UIColor var backgroundImage: UIImage? var outgoingStatus: ChatMessageDateAndStatusOutgoingType? @@ -155,7 +155,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { let themeUpdated = presentationData.theme != currentTheme || type != currentType - let graphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(context: context, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) let offset: CGFloat = -UIScreenPixel switch type { @@ -506,17 +506,17 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { } } - static func asyncLayout(_ node: ChatMessageDateAndStatusNode?) -> (_ presentationData: ChatPresentationData, _ edited: Bool, _ impressionCount: Int?, _ dateText: String, _ type: ChatMessageDateAndStatusType, _ constrainedSize: CGSize) -> (CGSize, (Bool) -> ChatMessageDateAndStatusNode) { + static func asyncLayout(_ node: ChatMessageDateAndStatusNode?) -> (_ context: AccountContext, _ presentationData: ChatPresentationData, _ edited: Bool, _ impressionCount: Int?, _ dateText: String, _ type: ChatMessageDateAndStatusType, _ constrainedSize: CGSize) -> (CGSize, (Bool) -> ChatMessageDateAndStatusNode) { let currentLayout = node?.asyncLayout() - return { presentationData, edited, impressionCount, dateText, type, constrainedSize in + return { context, presentationData, edited, impressionCount, dateText, type, constrainedSize in let resultNode: ChatMessageDateAndStatusNode let resultSizeAndApply: (CGSize, (Bool) -> Void) if let node = node, let currentLayout = currentLayout { resultNode = node - resultSizeAndApply = currentLayout(presentationData, edited, impressionCount, dateText, type, constrainedSize) + resultSizeAndApply = currentLayout(context, presentationData, edited, impressionCount, dateText, type, constrainedSize) } else { resultNode = ChatMessageDateAndStatusNode() - resultSizeAndApply = resultNode.asyncLayout()(presentationData, edited, impressionCount, dateText, type, constrainedSize) + resultSizeAndApply = resultNode.asyncLayout()(context, presentationData, edited, impressionCount, dateText, type, constrainedSize) } return (resultSizeAndApply.0, { animated in diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift index f4a9f54141..69b8359dbf 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import TelegramPresentationData +import Postbox private let timezoneOffset: Int32 = { let nowTimestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) @@ -20,11 +21,13 @@ final class ChatMessageDateHeader: ListViewItemHeader { let id: Int64 let presentationData: ChatPresentationData + let context: AccountContext let action: ((Int32) -> Void)? - init(timestamp: Int32, presentationData: ChatPresentationData, action:((Int32) -> Void)? = nil) { + init(timestamp: Int32, presentationData: ChatPresentationData, context: AccountContext, action: ((Int32) -> Void)? = nil) { self.timestamp = timestamp self.presentationData = presentationData + self.context = context self.action = action if timestamp == Int32.max { self.roundedTimestamp = timestamp / (granularity) * (granularity) @@ -39,7 +42,7 @@ final class ChatMessageDateHeader: ListViewItemHeader { let height: CGFloat = 34.0 func node() -> ListViewItemHeaderNode { - return ChatMessageDateHeaderNode(localTimestamp: self.roundedTimestamp, presentationData: self.presentationData, action: self.action) + return ChatMessageDateHeaderNode(localTimestamp: self.roundedTimestamp, presentationData: self.presentationData, context: self.context, action: self.action) } } @@ -83,13 +86,15 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { private let localTimestamp: Int32 private var presentationData: ChatPresentationData + private let context: AccountContext private var flashingOnScrolling = false private var stickDistanceFactor: CGFloat = 0.0 private var action: ((Int32) -> Void)? = nil - init(localTimestamp: Int32, presentationData: ChatPresentationData, action:((Int32) -> Void)? = nil) { + init(localTimestamp: Int32, presentationData: ChatPresentationData, context: AccountContext, action: ((Int32) -> Void)? = nil) { self.presentationData = presentationData + self.context = context self.localTimestamp = localTimestamp self.action = action @@ -112,7 +117,7 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { self.transform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) - let graphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(context: context, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) self.backgroundNode.image = graphics.dateStaticBackground self.stickBackgroundNode.image = graphics.dateFloatingBackground @@ -156,8 +161,8 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { self.view.addGestureRecognizer(ListViewTapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:)))) } - func updatePresentationData(_ presentationData: ChatPresentationData) { - let graphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + func updatePresentationData(_ presentationData: ChatPresentationData, context: AccountContext) { + let graphics = PresentationResourcesChat.principalGraphics(context: context, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) self.backgroundNode.image = graphics.dateStaticBackground self.stickBackgroundNode.image = graphics.dateFloatingBackground diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift index 1c66d9ceb9..61836b469a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift @@ -280,7 +280,7 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode { let dateText = stringForMessageTimestampStatus(accountPeerId: context.account.peerId, message: message, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, strings: presentationData.strings) - let (size, apply) = statusLayout(presentationData, edited && !sentViaBot, viewCount, dateText, statusType, constrainedSize) + let (size, apply) = statusLayout(context, presentationData, edited && !sentViaBot, viewCount, dateText, statusType, constrainedSize) statusSize = size statusApply = apply } @@ -423,7 +423,7 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode { if hasThumbnail { fileIconImage = nil } else { - let principalGraphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + let principalGraphics = PresentationResourcesChat.principalGraphics(context: context, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) fileIconImage = incoming ? principalGraphics.radialIndicatorFileIconIncoming : principalGraphics.radialIndicatorFileIconOutgoing } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift index a14ea83239..ab9c101940 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift @@ -195,7 +195,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { var updatedPlaybackStatus: Signal? if let updatedFile = updatedFile, updatedMedia || updatedMessageId { - updatedPlaybackStatus = combineLatest(messageFileMediaResourceStatus(context: item.context, file: updatedFile, message: item.message, isRecentActions: item.associatedData.isRecentActions), item.context.account.pendingMessageManager.pendingMessageStatus(item.message.id)) + updatedPlaybackStatus = combineLatest(messageFileMediaResourceStatus(context: item.context, file: updatedFile, message: item.message, isRecentActions: item.associatedData.isRecentActions), item.context.account.pendingMessageManager.pendingMessageStatus(item.message.id) |> map { $0.0 }) |> map { resourceStatus, pendingStatus -> FileMediaResourceStatus in if let pendingStatus = pendingStatus { var progress = pendingStatus.progress @@ -266,7 +266,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { } else { maxDateAndStatusWidth = width - videoFrame.midX - 85.0 } - let (dateAndStatusSize, dateAndStatusApply) = makeDateAndStatusLayout(item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: max(1.0, maxDateAndStatusWidth), height: CGFloat.greatestFiniteMagnitude)) + let (dateAndStatusSize, dateAndStatusApply) = makeDateAndStatusLayout(item.context, item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: max(1.0, maxDateAndStatusWidth), height: CGFloat.greatestFiniteMagnitude)) var contentSize = imageSize var dateAndStatusOverflow = false diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 074ffc7141..c0f9be3518 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -555,7 +555,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode { if statusUpdated { if let image = media as? TelegramMediaImage { if message.flags.isSending { - updatedStatusSignal = combineLatest(chatMessagePhotoStatus(context: context, messageId: message.id, photoReference: .message(message: MessageReference(message), media: image)), context.account.pendingMessageManager.pendingMessageStatus(message.id)) + updatedStatusSignal = combineLatest(chatMessagePhotoStatus(context: context, messageId: message.id, photoReference: .message(message: MessageReference(message), media: image)), context.account.pendingMessageManager.pendingMessageStatus(message.id) |> map { $0.0 }) |> map { resourceStatus, pendingStatus -> (MediaResourceStatus, MediaResourceStatus?) in if let pendingStatus = pendingStatus { let adjustedProgress = max(pendingStatus.progress, 0.027) @@ -571,7 +571,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode { } } } else if let file = media as? TelegramMediaFile { - updatedStatusSignal = combineLatest(messageMediaFileStatus(context: context, messageId: message.id, file: file), context.account.pendingMessageManager.pendingMessageStatus(message.id)) + updatedStatusSignal = combineLatest(messageMediaFileStatus(context: context, messageId: message.id, file: file), context.account.pendingMessageManager.pendingMessageStatus(message.id) |> map { $0.0 }) |> map { resourceStatus, pendingStatus -> (MediaResourceStatus, MediaResourceStatus?) in if let pendingStatus = pendingStatus { let adjustedProgress = max(pendingStatus.progress, 0.027) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift index 8eb3903b6e..c3382ec3ba 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift @@ -317,8 +317,7 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible { self.effectiveAuthorId = effectiveAuthor?.id - - self.header = ChatMessageDateHeader(timestamp: content.index.timestamp, presentationData: presentationData, action: { timestamp in + self.header = ChatMessageDateHeader(timestamp: content.index.timestamp, presentationData: presentationData, context: context, action: { timestamp in var calendar = NSCalendar.current calendar.timeZone = TimeZone(abbreviation: "UTC")! let date = Date(timeIntervalSince1970: TimeInterval(timestamp)) @@ -385,8 +384,12 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible { } } - if viewClassName == ChatMessageBubbleItemNode.self && self.presentationData.largeEmoji && self.message.elligibleForLargeEmoji && messageTextIsElligibleForLargeEmoji(message.text) { - viewClassName = ChatMessageStickerItemNode.self + if viewClassName == ChatMessageBubbleItemNode.self && self.presentationData.largeEmoji && self.message.elligibleForLargeEmoji && messageIsElligibleForLargeEmoji(self.message) { + if let _ = animatedEmojiResource(emoji: self.message.text) { + viewClassName = ChatMessageAnimatedStickerItemNode.self + } else { + viewClassName = ChatMessageStickerItemNode.self + } } let configure = { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageMapBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageMapBubbleContentNode.swift index 151b6668b4..d6b9423015 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageMapBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageMapBubbleContentNode.swift @@ -227,7 +227,7 @@ class ChatMessageMapBubbleContentNode: ChatMessageBubbleContentNode { var statusApply: ((Bool) -> Void)? if let statusType = statusType { - let (size, apply) = statusLayout(item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: constrainedSize.width, height: CGFloat.greatestFiniteMagnitude)) + let (size, apply) = statusLayout(item.context, item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: constrainedSize.width, height: CGFloat.greatestFiniteMagnitude)) statusSize = size statusApply = apply } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift index 26e323799d..78ae58ebcf 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift @@ -197,7 +197,7 @@ class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { var statusApply: ((Bool) -> Void)? if let statusType = statusType { - let (size, apply) = statusLayout(item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: imageSize.width - 30.0, height: CGFloat.greatestFiniteMagnitude)) + let (size, apply) = statusLayout(item.context, item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: imageSize.width - 30.0, height: CGFloat.greatestFiniteMagnitude)) statusSize = size statusApply = apply } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessagePhoneNumberRequestContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessagePhoneNumberRequestContentNode.swift index 14a5826ed4..3465a9b9c2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessagePhoneNumberRequestContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessagePhoneNumberRequestContentNode.swift @@ -100,7 +100,7 @@ class ChatMessagePhoneNumberRequestContentNode: ChatMessageBubbleContentNode { var statusApply: ((Bool) -> Void)? if let statusType = statusType { - let (size, apply) = statusLayout(item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: constrainedSize.width, height: CGFloat.greatestFiniteMagnitude)) + let (size, apply) = statusLayout(item.context, item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, CGSize(width: constrainedSize.width, height: CGFloat.greatestFiniteMagnitude)) statusSize = size statusApply = apply } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessagePollBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessagePollBubbleContentNode.swift index acd97cd28c..af030305be 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessagePollBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessagePollBubbleContentNode.swift @@ -622,7 +622,7 @@ class ChatMessagePollBubbleContentNode: ChatMessageBubbleContentNode { var statusApply: ((Bool) -> Void)? if let statusType = statusType { - let (size, apply) = statusLayout(item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, textConstrainedSize) + let (size, apply) = statusLayout(item.context, item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, textConstrainedSize) statusSize = size statusApply = apply } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift index 35b8a0d58e..9358661601 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift @@ -260,7 +260,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { let dateText = stringForMessageTimestampStatus(accountPeerId: item.context.account.peerId, message: item.message, dateTimeFormat: item.presentationData.dateTimeFormat, nameDisplayOrder: item.presentationData.nameDisplayOrder, strings: item.presentationData.strings, format: .regular) - let (dateAndStatusSize, dateAndStatusApply) = makeDateAndStatusLayout(item.presentationData, edited, viewCount, dateText, statusType, CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude)) + let (dateAndStatusSize, dateAndStatusApply) = makeDateAndStatusLayout(item.context, item.presentationData, edited, viewCount, dateText, statusType, CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude)) var viaBotApply: (TextNodeLayout, () -> TextNode)? var replyInfoApply: (CGSize, () -> ChatMessageReplyInfoNode)? diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index e33571fb75..983c58305e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -131,7 +131,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { var statusApply: ((Bool) -> Void)? if let statusType = statusType { - let (size, apply) = statusLayout(item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, textConstrainedSize) + let (size, apply) = statusLayout(item.context, item.presentationData, edited && !sentViaBot, viewCount, dateText, statusType, textConstrainedSize) statusSize = size statusApply = apply } diff --git a/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift index b12f365da9..e041698ced 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift @@ -106,9 +106,10 @@ final class ChatPanelInterfaceInteraction { let openLinkEditing: () -> Void let reportPeerIrrelevantGeoLocation: () -> Void let displaySlowmodeTooltip: (ASDisplayNode, CGRect) -> Void + let displaySendMessageOptions: () -> Void let statuses: ChatPanelInterfaceInteractionStatuses? - init(setupReplyMessage: @escaping (MessageId) -> Void, setupEditMessage: @escaping (MessageId?) -> Void, beginMessageSelection: @escaping ([MessageId]) -> Void, deleteSelectedMessages: @escaping () -> Void, reportSelectedMessages: @escaping () -> Void, reportMessages: @escaping ([Message]) -> Void, deleteMessages: @escaping ([Message]) -> Void, forwardSelectedMessages: @escaping () -> Void, forwardCurrentForwardMessages: @escaping () -> Void, forwardMessages: @escaping ([Message]) -> Void, shareSelectedMessages: @escaping () -> Void, updateTextInputStateAndMode: @escaping ((ChatTextInputState, ChatInputMode) -> (ChatTextInputState, ChatInputMode)) -> Void, updateInputModeAndDismissedButtonKeyboardMessageId: @escaping ((ChatPresentationInterfaceState) -> (ChatInputMode, MessageId?)) -> Void, openStickers: @escaping () -> Void, editMessage: @escaping () -> Void, beginMessageSearch: @escaping (ChatSearchDomain, String) -> Void, dismissMessageSearch: @escaping () -> Void, updateMessageSearch: @escaping (String) -> Void, navigateMessageSearch: @escaping (ChatPanelSearchNavigationAction) -> Void, openCalendarSearch: @escaping () -> Void, toggleMembersSearch: @escaping (Bool) -> Void, navigateToMessage: @escaping (MessageId) -> Void, navigateToChat: @escaping (PeerId) -> Void, openPeerInfo: @escaping () -> Void, togglePeerNotifications: @escaping () -> Void, sendContextResult: @escaping (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool, sendBotCommand: @escaping (Peer, String) -> Void, sendBotStart: @escaping (String?) -> Void, botSwitchChatWithPayload: @escaping (PeerId, String) -> Void, beginMediaRecording: @escaping (Bool) -> Void, finishMediaRecording: @escaping (ChatFinishMediaRecordingAction) -> Void, stopMediaRecording: @escaping () -> Void, lockMediaRecording: @escaping () -> Void, deleteRecordedMedia: @escaping () -> Void, sendRecordedMedia: @escaping () -> Void, displayRestrictedInfo: @escaping (ChatPanelRestrictionInfoSubject, ChatPanelRestrictionInfoDisplayType) -> Void, displayVideoUnmuteTip: @escaping (CGPoint?) -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, sendSticker: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, unblockPeer: @escaping () -> Void, pinMessage: @escaping (MessageId) -> Void, unpinMessage: @escaping () -> Void, shareAccountContact: @escaping () -> Void, reportPeer: @escaping () -> Void, presentPeerContact: @escaping () -> Void, dismissReportPeer: @escaping () -> Void, deleteChat: @escaping () -> Void, beginCall: @escaping () -> Void, toggleMessageStickerStarred: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, getNavigationController: @escaping () -> NavigationController?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, navigateFeed: @escaping () -> Void, openGrouping: @escaping () -> Void, toggleSilentPost: @escaping () -> Void, requestUnvoteInMessage: @escaping (MessageId) -> Void, requestStopPollInMessage: @escaping (MessageId) -> Void, updateInputLanguage: @escaping ((String?) -> String?) -> Void, unarchiveChat: @escaping () -> Void, openLinkEditing: @escaping () -> Void, reportPeerIrrelevantGeoLocation: @escaping () -> Void, displaySlowmodeTooltip: @escaping (ASDisplayNode, CGRect) -> Void, statuses: ChatPanelInterfaceInteractionStatuses?) { + init(setupReplyMessage: @escaping (MessageId) -> Void, setupEditMessage: @escaping (MessageId?) -> Void, beginMessageSelection: @escaping ([MessageId]) -> Void, deleteSelectedMessages: @escaping () -> Void, reportSelectedMessages: @escaping () -> Void, reportMessages: @escaping ([Message]) -> Void, deleteMessages: @escaping ([Message]) -> Void, forwardSelectedMessages: @escaping () -> Void, forwardCurrentForwardMessages: @escaping () -> Void, forwardMessages: @escaping ([Message]) -> Void, shareSelectedMessages: @escaping () -> Void, updateTextInputStateAndMode: @escaping ((ChatTextInputState, ChatInputMode) -> (ChatTextInputState, ChatInputMode)) -> Void, updateInputModeAndDismissedButtonKeyboardMessageId: @escaping ((ChatPresentationInterfaceState) -> (ChatInputMode, MessageId?)) -> Void, openStickers: @escaping () -> Void, editMessage: @escaping () -> Void, beginMessageSearch: @escaping (ChatSearchDomain, String) -> Void, dismissMessageSearch: @escaping () -> Void, updateMessageSearch: @escaping (String) -> Void, navigateMessageSearch: @escaping (ChatPanelSearchNavigationAction) -> Void, openCalendarSearch: @escaping () -> Void, toggleMembersSearch: @escaping (Bool) -> Void, navigateToMessage: @escaping (MessageId) -> Void, navigateToChat: @escaping (PeerId) -> Void, openPeerInfo: @escaping () -> Void, togglePeerNotifications: @escaping () -> Void, sendContextResult: @escaping (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool, sendBotCommand: @escaping (Peer, String) -> Void, sendBotStart: @escaping (String?) -> Void, botSwitchChatWithPayload: @escaping (PeerId, String) -> Void, beginMediaRecording: @escaping (Bool) -> Void, finishMediaRecording: @escaping (ChatFinishMediaRecordingAction) -> Void, stopMediaRecording: @escaping () -> Void, lockMediaRecording: @escaping () -> Void, deleteRecordedMedia: @escaping () -> Void, sendRecordedMedia: @escaping () -> Void, displayRestrictedInfo: @escaping (ChatPanelRestrictionInfoSubject, ChatPanelRestrictionInfoDisplayType) -> Void, displayVideoUnmuteTip: @escaping (CGPoint?) -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, sendSticker: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, unblockPeer: @escaping () -> Void, pinMessage: @escaping (MessageId) -> Void, unpinMessage: @escaping () -> Void, shareAccountContact: @escaping () -> Void, reportPeer: @escaping () -> Void, presentPeerContact: @escaping () -> Void, dismissReportPeer: @escaping () -> Void, deleteChat: @escaping () -> Void, beginCall: @escaping () -> Void, toggleMessageStickerStarred: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, getNavigationController: @escaping () -> NavigationController?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, navigateFeed: @escaping () -> Void, openGrouping: @escaping () -> Void, toggleSilentPost: @escaping () -> Void, requestUnvoteInMessage: @escaping (MessageId) -> Void, requestStopPollInMessage: @escaping (MessageId) -> Void, updateInputLanguage: @escaping ((String?) -> String?) -> Void, unarchiveChat: @escaping () -> Void, openLinkEditing: @escaping () -> Void, reportPeerIrrelevantGeoLocation: @escaping () -> Void, displaySlowmodeTooltip: @escaping (ASDisplayNode, CGRect) -> Void, displaySendMessageOptions: @escaping () -> Void, statuses: ChatPanelInterfaceInteractionStatuses?) { self.setupReplyMessage = setupReplyMessage self.setupEditMessage = setupEditMessage self.beginMessageSelection = beginMessageSelection @@ -172,6 +173,7 @@ final class ChatPanelInterfaceInteraction { self.openLinkEditing = openLinkEditing self.reportPeerIrrelevantGeoLocation = reportPeerIrrelevantGeoLocation self.displaySlowmodeTooltip = displaySlowmodeTooltip + self.displaySendMessageOptions = displaySendMessageOptions self.statuses = statuses } } diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift index 6a5ead4a26..b2854d262b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift @@ -105,6 +105,7 @@ final class ChatRecentActionsController: TelegramController { }, openLinkEditing: { }, reportPeerIrrelevantGeoLocation: { }, displaySlowmodeTooltip: { _, _ in + }, displaySendMessageOptions: { }, statuses: nil) self.navigationItem.titleView = self.titleView diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index cf3ff4e4ed..d611b8527f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -93,6 +93,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { self.panelButtonNode.setTitle(self.presentationData.strings.Channel_AdminLog_InfoPanelTitle, with: Font.regular(17.0), with: self.presentationData.theme.chat.inputPanel.panelControlAccentColor, for: []) self.listNode = ListView() + self.listNode.dynamicBounceEnabled = !self.presentationData.disableAnimations self.listNode.transform = CATransform3DMakeRotation(CGFloat(Double.pi), 0.0, 0.0, 1.0) self.loadingNode = ChatLoadingNode(theme: self.presentationData.theme, chatWallpaper: self.presentationData.chatWallpaper) self.emptyNode = ChatRecentActionsEmptyNode(theme: self.presentationData.theme, chatWallpaper: self.presentationData.chatWallpaper) @@ -106,7 +107,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { super.init() - self.backgroundNode.contents = chatControllerBackgroundImage(wallpaper: self.state.chatWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox)?.cgImage + self.backgroundNode.contents = chatControllerBackgroundImage(theme: self.state.theme, wallpaper: self.state.chatWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper)?.cgImage self.addSubnode(self.backgroundNode) self.addSubnode(self.listNode) @@ -181,7 +182,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { self?.openPeerMention(name) }, openMessageContextMenu: { [weak self] message, selectAll, node, frame in self?.openMessageContextMenu(message: message, selectAll: selectAll, node: node, frame: frame) - }, navigateToMessage: { _, _ in }, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _ in + }, navigateToMessage: { _, _ in }, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _ in self?.openUrl(url) }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { [weak self] message, associatedData in if let strongSelf = self, let navigationController = strongSelf.getNavigationController() { @@ -441,7 +442,6 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { self.historyDisposable = appliedTransition.start() - let mediaManager = self.context.sharedContext.mediaManager self.galleryHiddenMesageAndMediaDisposable.set(mediaManager.galleryHiddenMediaManager.hiddenIds().start(next: { [weak self] ids in if let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction { diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift index 7bfc5a009a..1134668b78 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift @@ -643,19 +643,22 @@ struct ChatRecentActionsEntry: Comparable, Identifiable { return result }, to: &text, entities: &entities) } else { - appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessagePromotedName(new.peer.displayTitle) : self.presentationData.strings.Channel_AdminLog_MessagePromotedNameUsername(new.peer.displayTitle, "@" + new.peer.addressName!), generateEntities: { index in - var result: [MessageTextEntityType] = [] - if index == 0 { - result.append(.TextMention(peerId: new.peer.id)) - } else if index == 1 { - result.append(.Mention) - } - return result - }, to: &text, entities: &entities) - text += "\n" + var appendedRightsHeader = false - if case let .member(_, _, prevAdminRights, _, _) = prev.participant { - if case let .member(_, _, newAdminRights, _, _) = new.participant { + if case let .creator(_, prevRank) = prev.participant, case let .creator(_, newRank) = new.participant, prevRank != newRank { + appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessageRankName(new.peer.displayTitle, newRank ?? "") : self.presentationData.strings.Channel_AdminLog_MessageRankUsername(new.peer.displayTitle, "@" + new.peer.addressName!, newRank ?? ""), generateEntities: { index in + var result: [MessageTextEntityType] = [] + if index == 0 { + result.append(.TextMention(peerId: new.peer.id)) + } else if index == 1 { + result.append(.Mention) + } else if index == 2 { + result.append(.Bold) + } + return result + }, to: &text, entities: &entities) + } else if case let .member(_, _, prevAdminRights, _, prevRank) = prev.participant { + if case let .member(_, _, newAdminRights, _, newRank) = new.participant { let prevFlags = prevAdminRights?.rights.flags ?? [] let newFlags = newAdminRights?.rights.flags ?? [] @@ -684,6 +687,22 @@ struct ChatRecentActionsEntry: Comparable, Identifiable { for (flag, string) in order { if prevFlags.contains(flag) != newFlags.contains(flag) { + if !appendedRightsHeader { + appendedRightsHeader = true + appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessagePromotedName(new.peer.displayTitle) : self.presentationData.strings.Channel_AdminLog_MessagePromotedNameUsername(new.peer.displayTitle, "@" + new.peer.addressName!), generateEntities: { index in + var result: [MessageTextEntityType] = [] + if index == 0 { + result.append(.TextMention(peerId: new.peer.id)) + } else if index == 1 { + result.append(.Mention) + } else if index == 2 { + result.append(.Bold) + } + return result + }, to: &text, entities: &entities) + text += "\n" + } + text += "\n" if !prevFlags.contains(flag) { text += "+" @@ -693,6 +712,31 @@ struct ChatRecentActionsEntry: Comparable, Identifiable { appendAttributedText(text: string, withEntities: [.Italic], to: &text, entities: &entities) } } + + if prevRank != newRank { + if appendedRightsHeader { + text += "\n\n" + appendAttributedText(text: self.presentationData.strings.Channel_AdminLog_MessageRank(newRank ?? ""), generateEntities: { index in + var result: [MessageTextEntityType] = [] + if index == 0 { + result.append(.Bold) + } + return result + }, to: &text, entities: &entities) + } else { + appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessageRankName(new.peer.displayTitle, newRank ?? "") : self.presentationData.strings.Channel_AdminLog_MessageRankUsername(new.peer.displayTitle, "@" + new.peer.addressName!, newRank ?? ""), generateEntities: { index in + var result: [MessageTextEntityType] = [] + if index == 0 { + result.append(.TextMention(peerId: new.peer.id)) + } else if index == 1 { + result.append(.Mention) + } else if index == 2 { + result.append(.Bold) + } + return result + }, to: &text, entities: &entities) + } + } } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetController.swift b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetController.swift new file mode 100644 index 0000000000..8727b58c20 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetController.swift @@ -0,0 +1,105 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit +import TelegramPresentationData + +final class ChatSendMessageActionSheetController: ViewController { + var controllerNode: ChatSendMessageActionSheetControllerNode { + return self.displayNode as! ChatSendMessageActionSheetControllerNode + } + + private let context: AccountContext + private let controllerInteraction: ChatControllerInteraction? + private let interfaceState: ChatPresentationInterfaceState + private let sendButtonFrame: CGRect + private let textInputNode: EditableTextNode + private let completion: () -> Void + + private var presentationDataDisposable: Disposable? + + private var didPlayPresentationAnimation = false + + private var validLayout: ContainerViewLayout? + + private let hapticFeedback = HapticFeedback() + + init(context: AccountContext, controllerInteraction: ChatControllerInteraction?, interfaceState: ChatPresentationInterfaceState, sendButtonFrame: CGRect, textInputNode: EditableTextNode, completion: @escaping () -> Void) { + self.context = context + self.controllerInteraction = controllerInteraction + self.interfaceState = interfaceState + self.sendButtonFrame = sendButtonFrame + self.textInputNode = textInputNode + self.completion = completion + + super.init(navigationBarPresentationData: nil) + + self.presentationDataDisposable = (context.sharedContext.presentationData + |> deliverOnMainQueue).start(next: { [weak self] presentationData in + if let strongSelf = self { + strongSelf.controllerNode.updatePresentationData(presentationData) + } + }) + + self.statusBar.statusBarStyle = .Hide + self.statusBar.ignoreInCall = true + } + + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + self.presentationDataDisposable?.dispose() + } + + override func loadDisplayNode() { + var accessoryPanelNode: AccessoryPanelNode? + if let panel = accessoryPanelForChatPresentationIntefaceState(self.interfaceState, context: self.context, currentPanel: nil, interfaceInteraction: nil), panel is ReplyAccessoryPanelNode || panel is ForwardAccessoryPanelNode { + accessoryPanelNode = panel + } + + self.displayNode = ChatSendMessageActionSheetControllerNode(context: self.context, sendButtonFrame: self.sendButtonFrame, textInputNode: self.textInputNode, accessoryPanelNode: accessoryPanelNode, send: { [weak self] in + self?.controllerInteraction?.sendCurrentMessage(false) + self?.dismiss(cancel: false) + }, sendSilently: { [weak self] in + self?.controllerInteraction?.sendCurrentMessage(true) + self?.dismiss(cancel: false) + }, cancel: { [weak self] in + self?.dismiss(cancel: true) + }) + self.displayNodeDidLoad() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + if !self.didPlayPresentationAnimation { + self.didPlayPresentationAnimation = true + + self.hapticFeedback.impact() + self.controllerNode.animateIn() + } + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + self.validLayout = layout + + super.containerLayoutUpdated(layout, transition: transition) + + self.controllerNode.containerLayoutUpdated(layout, transition: transition) + } + + override public func dismiss(completion: (() -> Void)? = nil) { + self.dismiss(cancel: true) + } + + private func dismiss(cancel: Bool) { + self.controllerNode.animateOut(cancel: cancel, completion: { [weak self] in + self?.completion() + self?.didPlayPresentationAnimation = false + self?.presentingViewController?.dismiss(animated: false, completion: nil) + }) + } +} diff --git a/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift new file mode 100644 index 0000000000..a58ab4ba21 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift @@ -0,0 +1,547 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display +import Postbox +import TelegramCore +import TelegramPresentationData + +private let leftInset: CGFloat = 16.0 +private let rightInset: CGFloat = 46.0 + +private final class ActionSheetItemNode: ASDisplayNode { + private let title: String + private let action: () -> Void + + private let separatorNode: ASDisplayNode + private let highlightedBackgroundNode: ASDisplayNode + private let buttonNode: HighlightTrackingButtonNode + private let iconNode: ASImageNode + private let titleNode: ImmediateTextNode + + private var maxWidth: CGFloat? + + init(theme: PresentationTheme, title: String, action: @escaping () -> Void) { + self.title = title + self.action = action + + self.separatorNode = ASDisplayNode() + self.separatorNode.backgroundColor = theme.actionSheet.opaqueItemSeparatorColor + + self.highlightedBackgroundNode = ASDisplayNode() + self.highlightedBackgroundNode.backgroundColor = theme.actionSheet.opaqueItemHighlightedBackgroundColor + self.highlightedBackgroundNode.alpha = 0.0 + + self.buttonNode = HighlightTrackingButtonNode() + + self.titleNode = ImmediateTextNode() + self.titleNode.maximumNumberOfLines = 1 + self.titleNode.attributedText = NSAttributedString(string: title, font: Font.regular(17.0), textColor: theme.actionSheet.primaryTextColor) + + self.iconNode = ASImageNode() + self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Menu/SilentIcon"), color: theme.actionSheet.primaryTextColor) + self.iconNode.contentMode = .center + + super.init() + + self.addSubnode(self.separatorNode) + self.addSubnode(self.highlightedBackgroundNode) + self.addSubnode(self.titleNode) + self.addSubnode(self.iconNode) + self.addSubnode(self.buttonNode) + + self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside) + self.buttonNode.highligthedChanged = { [weak self] highlighted in + if let strongSelf = self { + if highlighted { + strongSelf.highlightedBackgroundNode.layer.removeAnimation(forKey: "opacity") + strongSelf.highlightedBackgroundNode.alpha = 1.0 + } else { + strongSelf.highlightedBackgroundNode.alpha = 0.0 + strongSelf.highlightedBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3) + } + } + } + } + + func updateTheme(_ theme: PresentationTheme) { + self.separatorNode.backgroundColor = theme.actionSheet.opaqueItemSeparatorColor + self.highlightedBackgroundNode.backgroundColor = theme.actionSheet.opaqueItemHighlightedBackgroundColor + self.titleNode.attributedText = NSAttributedString(string: self.title, font: Font.regular(17.0), textColor: theme.actionSheet.primaryTextColor) + self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Menu/SilentIcon"), color: theme.actionSheet.primaryTextColor) + + if let maxWidth = self.maxWidth { + let _ = self.titleNode.updateLayout(CGSize(width: maxWidth - leftInset - rightInset, height: .greatestFiniteMagnitude)) + } + } + + func updateLayout(maxWidth: CGFloat) -> (CGFloat, CGFloat, (CGFloat) -> Void) { + self.maxWidth = maxWidth + + let titleSize = self.titleNode.updateLayout(CGSize(width: maxWidth - leftInset - rightInset, height: .greatestFiniteMagnitude)) + let height: CGFloat = 44.0 + + return (titleSize.width + leftInset + rightInset, height, { width in + self.titleNode.frame = CGRect(origin: CGPoint(x: leftInset, y: floor((height - titleSize.height) / 2.0)), size: titleSize) + + if let image = self.iconNode.image { + self.iconNode.frame = CGRect(origin: CGPoint(x: width - image.size.width - 12.0, y: floor((height - image.size.height) / 2.0)), size: image.size) + } + + self.separatorNode.frame = CGRect(origin: CGPoint(x: 0.0, y: height - UIScreenPixel), size: CGSize(width: width, height: UIScreenPixel)) + self.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: width, height: height)) + self.buttonNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: width, height: height)) + }) + } + + @objc private func buttonPressed() { + self.action() + } +} + +final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, UIScrollViewDelegate { + private let context: AccountContext + private var presentationData: PresentationData + private let sendButtonFrame: CGRect + private let textFieldFrame: CGRect + private let textInputNode: EditableTextNode + private let accessoryPanelNode: AccessoryPanelNode? + + private let send: (() -> Void)? + private let cancel: (() -> Void)? + + private let textCoverNode: ASDisplayNode + private let buttonCoverNode: ASDisplayNode + + private let effectView: UIVisualEffectView + private let dimNode: ASDisplayNode + + private let contentContainerNode: ASDisplayNode + private let contentNodes: [ActionSheetItemNode] + private let sendButtonNode: HighlightableButtonNode + + private let messageClipNode: ASDisplayNode + private let messageBackgroundNode: ASImageNode + private let fromMessageTextNode: EditableTextNode + private let toMessageTextNode: EditableTextNode + private let scrollNode: ASScrollNode + + private var validLayout: ContainerViewLayout? + + init(context: AccountContext, sendButtonFrame: CGRect, textInputNode: EditableTextNode, accessoryPanelNode: AccessoryPanelNode?, send: (() -> Void)?, sendSilently: (() -> Void)?, cancel: (() -> Void)?) { + self.context = context + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.sendButtonFrame = sendButtonFrame + self.textFieldFrame = textInputNode.convert(textInputNode.bounds, to: nil) + self.textInputNode = textInputNode + self.accessoryPanelNode = accessoryPanelNode + self.send = send + self.cancel = cancel + + self.textCoverNode = ASDisplayNode() + self.buttonCoverNode = ASDisplayNode() + + self.effectView = UIVisualEffectView() + if #available(iOS 9.0, *) { + } else { + if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + self.effectView.effect = UIBlurEffect(style: .dark) + } else { + self.effectView.effect = UIBlurEffect(style: .light) + } + self.effectView.alpha = 0.0 + } + + self.dimNode = ASDisplayNode() + self.dimNode.alpha = 1.0 + if self.presentationData.theme.chatList.searchBarKeyboardColor == .light { + self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.04) + } else { + self.dimNode.backgroundColor = presentationData.theme.chatList.backgroundColor.withAlphaComponent(0.2) + } + + self.sendButtonNode = HighlightableButtonNode() + self.sendButtonNode.imageNode.displayWithoutProcessing = false + self.sendButtonNode.imageNode.displaysAsynchronously = false + + self.messageClipNode = ASDisplayNode() + self.messageClipNode.clipsToBounds = true + self.messageClipNode.transform = CATransform3DMakeScale(1.0, -1.0, 1.0) + self.messageBackgroundNode = ASImageNode() + self.messageBackgroundNode.isUserInteractionEnabled = true + self.fromMessageTextNode = EditableTextNode() + self.fromMessageTextNode.isUserInteractionEnabled = false + self.toMessageTextNode = EditableTextNode() + self.toMessageTextNode.alpha = 0.0 + self.toMessageTextNode.isUserInteractionEnabled = false + + self.scrollNode = ASScrollNode() + self.scrollNode.transform = CATransform3DMakeScale(1.0, -1.0, 1.0) + + self.contentContainerNode = ASDisplayNode() + self.contentContainerNode.backgroundColor = self.presentationData.theme.actionSheet.opaqueItemBackgroundColor + self.contentContainerNode.cornerRadius = 12.0 + self.contentContainerNode.clipsToBounds = true + + var contentNodes: [ActionSheetItemNode] = [] + contentNodes.append(ActionSheetItemNode(theme: self.presentationData.theme, title: self.presentationData.strings.Conversation_SendMessage_SendSilently, action: { + sendSilently?() + })) + self.contentNodes = contentNodes + + super.init() + + self.textCoverNode.backgroundColor = self.presentationData.theme.chat.inputPanel.inputBackgroundColor + self.addSubnode(self.textCoverNode) + + self.buttonCoverNode.backgroundColor = self.presentationData.theme.chat.inputPanel.panelBackgroundColor + self.addSubnode(self.buttonCoverNode) + + self.sendButtonNode.setImage(PresentationResourcesChat.chatInputPanelSendButtonImage(self.presentationData.theme), for: []) + self.sendButtonNode.addTarget(self, action: #selector(sendButtonPressed), forControlEvents: .touchUpInside) + + self.fromMessageTextNode.attributedText = textInputNode.attributedText + + if let toAttributedText = textInputNode.attributedText?.mutableCopy() as? NSMutableAttributedString { + toAttributedText.addAttribute(NSAttributedStringKey.foregroundColor, value: self.presentationData.theme.chat.message.outgoing.primaryTextColor, range: NSMakeRange(0, (toAttributedText.string as NSString).length)) + self.toMessageTextNode.attributedText = toAttributedText + } + self.messageBackgroundNode.contentMode = .scaleToFill + + let graphics = PresentationResourcesChat.principalGraphics(context: self.context, theme: self.presentationData.theme, wallpaper: self.presentationData.chatWallpaper) + self.messageBackgroundNode.image = graphics.chatMessageBackgroundOutgoingImage + + self.view.addSubview(self.effectView) + self.addSubnode(self.dimNode) + + self.addSubnode(self.contentContainerNode) + self.addSubnode(self.scrollNode) + + self.addSubnode(self.sendButtonNode) + self.scrollNode.addSubnode(self.messageClipNode) + self.messageClipNode.addSubnode(self.messageBackgroundNode) + self.messageClipNode.addSubnode(self.fromMessageTextNode) + self.messageClipNode.addSubnode(self.toMessageTextNode) + + if let accessoryPanelNode = self.accessoryPanelNode { + self.messageClipNode.addSubnode(accessoryPanelNode) + } + + self.contentNodes.forEach(self.contentContainerNode.addSubnode) + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + let result = super.hitTest(point, with: event) + if result != self.scrollNode.view { + return result + } else { + return self.dimNode.view + } + } + + override func didLoad() { + super.didLoad() + + self.dimNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dimTapGesture(_:)))) + + self.scrollNode.view.showsVerticalScrollIndicator = false + self.scrollNode.view.delaysContentTouches = false + self.scrollNode.view.delegate = self + self.scrollNode.view.alwaysBounceVertical = true + if #available(iOSApplicationExtension 11.0, iOS 11.0, *) { + self.scrollNode.view.contentInsetAdjustmentBehavior = .never + } + } + + func updatePresentationData(_ presentationData: PresentationData) { + self.presentationData = presentationData + + if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + self.effectView.effect = UIBlurEffect(style: .dark) + } else { + self.effectView.effect = UIBlurEffect(style: .light) + } + + if self.presentationData.theme.chatList.searchBarKeyboardColor == .light { + self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.04) + } else { + self.dimNode.backgroundColor = presentationData.theme.chatList.backgroundColor.withAlphaComponent(0.2) + } + + self.contentContainerNode.backgroundColor = self.presentationData.theme.actionSheet.opaqueItemBackgroundColor + self.textCoverNode.backgroundColor = self.presentationData.theme.chat.inputPanel.inputBackgroundColor + self.buttonCoverNode.backgroundColor = self.presentationData.theme.chat.inputPanel.panelBackgroundColor + self.sendButtonNode.setImage(PresentationResourcesChat.chatInputPanelSendButtonImage(self.presentationData.theme), for: []) + + if let toAttributedText = self.textInputNode.attributedText?.mutableCopy() as? NSMutableAttributedString { + toAttributedText.addAttribute(NSAttributedStringKey.foregroundColor, value: self.presentationData.theme.chat.message.outgoing.primaryTextColor, range: NSMakeRange(0, (toAttributedText.string as NSString).length)) + self.toMessageTextNode.attributedText = toAttributedText + } + + let graphics = PresentationResourcesChat.principalGraphics(context: self.context, theme: self.presentationData.theme, wallpaper: self.presentationData.chatWallpaper) + self.messageBackgroundNode.image = graphics.chatMessageBackgroundOutgoingImage + + for node in self.contentNodes { + node.updateTheme(presentationData.theme) + } + } + + func animateIn() { + self.textInputNode.textView.setContentOffset(self.textInputNode.textView.contentOffset, animated: false) + + UIView.animate(withDuration: 0.4, animations: { + if #available(iOS 9.0, *) { + if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { + self.effectView.effect = UIBlurEffect(style: .regular) + if self.effectView.subviews.count == 2 { + self.effectView.subviews[1].isHidden = true + } + } else { + self.effectView.effect = UIBlurEffect(style: .dark) + } + } else { + if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { + self.effectView.effect = UIBlurEffect(style: .regular) + } else { + self.effectView.effect = UIBlurEffect(style: .light) + } + } + } else { + self.effectView.alpha = 1.0 + } + }, completion: { [weak self] _ in + guard let strongSelf = self else { + return + } + if strongSelf.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + if strongSelf.effectView.subviews.count == 2 { + strongSelf.effectView.subviews[1].isHidden = true + } + } + }) + self.effectView.subviews[1].layer.removeAnimation(forKey: "backgroundColor") + self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + self.contentContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.messageBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) + + self.fromMessageTextNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) + self.toMessageTextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, removeOnCompletion: false) + + if let layout = self.validLayout { + let duration = 0.4 + + self.sendButtonNode.layer.animateScale(from: 0.75, to: 1.0, duration: 0.2, timingFunction: kCAMediaTimingFunctionLinear) + self.sendButtonNode.layer.animatePosition(from: self.sendButtonFrame.center, to: self.sendButtonNode.position, duration: duration, timingFunction: kCAMediaTimingFunctionSpring) + + let initialWidth = self.textFieldFrame.width + 32.0 + let fromFrame = CGRect(origin: CGPoint(), size: CGSize(width: initialWidth, height: self.textFieldFrame.height + 2.0)) + let delta = (fromFrame.height - self.messageClipNode.bounds.height) / 2.0 + + let inputHeight = layout.inputHeight ?? 0.0 + var clipDelta = delta + if inputHeight.isZero { + clipDelta -= 60.0 + } + + self.messageClipNode.layer.animateBounds(from: fromFrame, to: self.messageClipNode.bounds, duration: duration, timingFunction: kCAMediaTimingFunctionSpring) + self.messageClipNode.layer.animatePosition(from: CGPoint(x: (self.messageClipNode.bounds.width - initialWidth) / 2.0, y: clipDelta), to: CGPoint(), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, additive: true, completion: { [weak self] _ in + if let strongSelf = self { + strongSelf.insertSubnode(strongSelf.contentContainerNode, aboveSubnode: strongSelf.scrollNode) + } + }) + + self.messageBackgroundNode.layer.animateBounds(from: fromFrame, to: self.messageBackgroundNode.bounds, duration: duration, timingFunction: kCAMediaTimingFunctionSpring) + self.messageBackgroundNode.layer.animatePosition(from: CGPoint(x: (initialWidth - self.messageClipNode.bounds.width) / 2.0, y: delta), to: CGPoint(), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, additive: true) + + let textOffset = self.textInputNode.textView.contentSize.height - self.textInputNode.textView.contentOffset.y - self.textInputNode.textView.frame.height + self.fromMessageTextNode.layer.animatePosition(from: CGPoint(x: 0.0, y: delta * 2.0 + textOffset), to: CGPoint(), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, additive: true) + self.toMessageTextNode.layer.animatePosition(from: CGPoint(x: 0.0, y: delta * 2.0 + textOffset), to: CGPoint(), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, additive: true) + + self.contentContainerNode.layer.animatePosition(from: CGPoint(x: 160.0, y: 0.0), to: CGPoint(), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, additive: true) + self.contentContainerNode.layer.animateScale(from: 0.45, to: 1.0, duration: duration, timingFunction: kCAMediaTimingFunctionSpring) + } + } + + func animateOut(cancel: Bool, completion: @escaping () -> Void) { + self.isUserInteractionEnabled = false + + self.scrollNode.view.setContentOffset(self.scrollNode.view.contentOffset, animated: false) + + var completedEffect = false + var completedButton = false + var completedBubble = false + var completedAlpha = false + + let intermediateCompletion: () -> Void = { [weak self] in + if completedEffect && completedButton && completedBubble && completedAlpha { + self?.textCoverNode.isHidden = true + self?.buttonCoverNode.isHidden = true + completion() + } + } + + UIView.animate(withDuration: 0.4, animations: { + if #available(iOS 9.0, *) { + self.effectView.effect = nil + } else { + self.effectView.alpha = 0.0 + } + }, completion: { _ in + completedEffect = true + intermediateCompletion() + }) + self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) + self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in }) + + if cancel { + self.fromMessageTextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, delay: 0.15, removeOnCompletion: false) + self.toMessageTextNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, delay: 0.15, removeOnCompletion: false) + self.messageBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, delay: 0.15, removeOnCompletion: false, completion: { _ in + completedAlpha = true + intermediateCompletion() + }) + } else { + self.textCoverNode.isHidden = true + self.messageClipNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { _ in + completedAlpha = true + intermediateCompletion() + }) + } + + if let layout = self.validLayout { + let duration = 0.4 + + self.sendButtonNode.layer.animatePosition(from: self.sendButtonNode.position, to: self.sendButtonFrame.center, duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in + completedButton = true + intermediateCompletion() + }) + + if !cancel { + self.buttonCoverNode.isHidden = true + self.sendButtonNode.layer.animateScale(from: 1.0, to: 0.2, duration: 0.2, timingFunction: kCAMediaTimingFunctionLinear, removeOnCompletion: false) + self.sendButtonNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, timingFunction: kCAMediaTimingFunctionLinear, removeOnCompletion: false) + } + + let initialWidth = self.textFieldFrame.width + 32.0 + let toFrame = CGRect(origin: CGPoint(), size: CGSize(width: initialWidth, height: self.textFieldFrame.height + 1.0)) + let delta = (toFrame.height - self.messageClipNode.bounds.height) / 2.0 + + let inputHeight = layout.inputHeight ?? 0.0 + var clipDelta = delta + if inputHeight.isZero { + clipDelta -= 60.0 + } + + if cancel { + self.messageClipNode.layer.animateBounds(from: self.messageClipNode.bounds, to: toFrame, duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in + completedBubble = true + intermediateCompletion() + }) + self.messageClipNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: (self.messageClipNode.bounds.width - initialWidth) / 2.0, y: clipDelta + self.scrollNode.view.contentOffset.y), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, additive: true) + + self.messageBackgroundNode.layer.animateBounds(from: self.messageBackgroundNode.bounds, to: toFrame, duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + self.messageBackgroundNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: (initialWidth - self.messageClipNode.bounds.width) / 2.0, y: delta), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, additive: true) + + let textOffset = self.textInputNode.textView.contentSize.height - self.textInputNode.textView.contentOffset.y - self.textInputNode.textView.frame.height + self.fromMessageTextNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: 0.0, y: delta * 2.0 + textOffset), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, additive: true) + self.toMessageTextNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: 0.0, y: delta * 2.0 + textOffset), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, additive: true) + } + + self.contentContainerNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: 160.0, y: 0.0), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, additive: true) + self.contentContainerNode.layer.animateScale(from: 1.0, to: 0.4, duration: duration, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + } + } + + func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + self.validLayout = layout + + transition.updateFrame(node: self.textCoverNode, frame: self.textFieldFrame) + transition.updateFrame(node: self.buttonCoverNode, frame: self.sendButtonFrame.offsetBy(dx: 1.0, dy: 0.0)) + + transition.updateFrame(view: self.effectView, frame: CGRect(origin: CGPoint(), size: layout.size)) + transition.updateFrame(node: self.dimNode, frame: CGRect(origin: CGPoint(), size: layout.size)) + + let sideInset: CGFloat = 43.0 + + var contentSize = CGSize() + contentSize.width = min(layout.size.width - 40.0, 240.0) + var applyNodes: [(ASDisplayNode, CGFloat, (CGFloat) -> Void)] = [] + for itemNode in self.contentNodes { + let (width, height, apply) = itemNode.updateLayout(maxWidth: layout.size.width - sideInset * 2.0) + applyNodes.append((itemNode, height, apply)) + contentSize.width = max(contentSize.width, width) + contentSize.height += height + } + + let insets = layout.insets(options: [.statusBar, .input]) + let inputHeight = layout.inputHeight ?? 0.0 + + var contentOrigin = CGPoint(x: layout.size.width - sideInset - contentSize.width - layout.safeInsets.right, y: layout.size.height - 6.0 - insets.bottom - contentSize.height) + if inputHeight > 0.0 { + contentOrigin.y += 60.0 + } + + transition.updateFrame(node: self.contentContainerNode, frame: CGRect(origin: contentOrigin, size: contentSize)) + var nextY: CGFloat = 0.0 + for (itemNode, height, apply) in applyNodes { + transition.updateFrame(node: itemNode, frame: CGRect(origin: CGPoint(x: 0.0, y: nextY), size: CGSize(width: contentSize.width, height: height))) + apply(contentSize.width) + nextY += height + } + + let initialSendButtonFrame = self.sendButtonFrame + var sendButtonFrame = CGRect(origin: CGPoint(x: layout.size.width - initialSendButtonFrame.width + 1.0 - UIScreenPixel - layout.safeInsets.right, y: layout.size.height - insets.bottom - initialSendButtonFrame.height), size: initialSendButtonFrame.size) + if inputHeight.isZero { + sendButtonFrame.origin.y -= 60.0 + } + transition.updateFrame(node: self.sendButtonNode, frame: sendButtonFrame) + + var messageFrame = self.textFieldFrame + messageFrame.size.width += 32.0 + messageFrame.origin.x -= 13.0 + messageFrame.origin.y = layout.size.height - messageFrame.origin.y - messageFrame.size.height - 1.0 + if inputHeight.isZero { + messageFrame.origin.y += 60.0 + } + + if self.textInputNode.textView.numberOfLines == 1 { + let textWidth = min(self.textInputNode.textView.sizeThatFits(layout.size).width + 36.0, messageFrame.width) + messageFrame.origin.x += messageFrame.width - textWidth + messageFrame.size.width = textWidth + } + + let messageHeight = max(messageFrame.size.height, self.textInputNode.textView.contentSize.height + 2.0) + messageFrame.size.height = messageHeight + + transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(), size: layout.size)) + + var scrollContentSize = CGSize(width: layout.size.width, height: messageHeight + max(0.0, messageFrame.origin.y)) + if messageHeight > layout.size.height - messageFrame.origin.y { + scrollContentSize.height += insets.top + 16.0 + } + self.scrollNode.view.contentSize = scrollContentSize + + let clipFrame = messageFrame + transition.updateFrame(node: self.messageClipNode, frame: clipFrame) + + let backgroundFrame = CGRect(origin: CGPoint(), size: messageFrame.size) + transition.updateFrame(node: self.messageBackgroundNode, frame: backgroundFrame) + + var textFrame = self.textFieldFrame + textFrame.origin = CGPoint(x: 13.0, y: 6.0 - UIScreenPixel) + textFrame.size.height = self.textInputNode.textView.contentSize.height + self.fromMessageTextNode.frame = textFrame + self.toMessageTextNode.frame = textFrame + } + + @objc private func dimTapGesture(_ recognizer: UITapGestureRecognizer) { + if case .ended = recognizer.state { + self.cancel?() + } + } + + @objc private func sendButtonPressed() { + self.send?() + } +} diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift index 435b7172fe..ac8302d487 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift @@ -6,15 +6,27 @@ import TelegramPresentationData final class ChatTextInputActionButtonsNode: ASDisplayNode { let micButton: ChatTextInputMediaRecordingButton - let sendButton: HighlightableButton + let sendButton: HighlightTrackingButton var sendButtonRadialStatusNode: ChatSendButtonRadialStatusNode? var sendButtonHasApplyIcon = false var animatingSendButton = false let expandMediaInputButton: HighlightableButtonNode + var sendButtonLongPressed: (() -> Void)? + + private var gestureRecognizer: UILongPressGestureRecognizer? + var sendButtonLongPressEnabled = false { + didSet { + self.gestureRecognizer?.isEnabled = self.sendButtonLongPressEnabled + } + } + init(theme: PresentationTheme, presentController: @escaping (ViewController) -> Void) { self.micButton = ChatTextInputMediaRecordingButton(theme: theme, presentController: presentController) - self.sendButton = HighlightableButton() + self.sendButton = HighlightTrackingButton() + self.sendButton.adjustsImageWhenHighlighted = false + self.sendButton.adjustsImageWhenDisabled = false + self.expandMediaInputButton = HighlightableButtonNode() super.init() @@ -22,11 +34,46 @@ final class ChatTextInputActionButtonsNode: ASDisplayNode { self.isAccessibilityElement = true self.accessibilityTraits = UIAccessibilityTraitButton | UIAccessibilityTraitNotEnabled + self.sendButton.highligthedChanged = { [weak self] highlighted in + if let strongSelf = self { + if strongSelf.sendButtonHasApplyIcon || !strongSelf.sendButtonLongPressEnabled { + if highlighted { + strongSelf.layer.removeAnimation(forKey: "opacity") + strongSelf.alpha = 0.4 + } else { + strongSelf.alpha = 1.0 + strongSelf.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) + } + } else { + if highlighted { + strongSelf.sendButton.layer.animateScale(from: 1.0, to: 0.75, duration: 0.4, removeOnCompletion: false) + } else if let presentationLayer = strongSelf.sendButton.layer.presentation() { + strongSelf.sendButton.layer.animateScale(from: CGFloat((presentationLayer.value(forKeyPath: "transform.scale.y") as? NSNumber)?.floatValue ?? 1.0), to: 1.0, duration: 0.25, removeOnCompletion: false) + } + } + } + } + self.view.addSubview(self.micButton) self.view.addSubview(self.sendButton) self.addSubnode(self.expandMediaInputButton) } + override func didLoad() { + super.didLoad() + + let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.handleLongPress(_:))) + gestureRecognizer.minimumPressDuration = 0.4 + self.gestureRecognizer = gestureRecognizer + self.sendButton.addGestureRecognizer(gestureRecognizer) + } + + @objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) { + if !self.sendButtonHasApplyIcon && gestureRecognizer.state == .began { + self.sendButtonLongPressed?() + } + } + func updateTheme(theme: PresentationTheme) { self.micButton.updateTheme(theme: theme) self.expandMediaInputButton.setImage(PresentationResourcesChat.chatInputPanelExpandButtonImage(theme), for: []) diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift index 78c4725b98..d6b3972a63 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift @@ -352,6 +352,10 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { self.addSubnode(self.actionButtons) + self.actionButtons.sendButtonLongPressed = { [weak self] in + self?.interfaceInteraction?.displaySendMessageOptions() + } + self.actionButtons.micButton.recordingDisabled = { [weak self] in self?.interfaceInteraction?.displayRestrictedInfo(.mediaRecording, .tooltip) } @@ -728,6 +732,8 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } self.textPlaceholderNode.frame = CGRect(origin: self.textPlaceholderNode.frame.origin, size: placeholderSize) } + + self.actionButtons.sendButtonLongPressEnabled = peer.id != interfaceState.accountPeerId && peer.id.namespace != Namespaces.Peer.SecretChat } let sendButtonHasApplyIcon = interfaceState.interfaceState.editMessage != nil diff --git a/submodules/TelegramUI/TelegramUI/ChatUnreadItem.swift b/submodules/TelegramUI/TelegramUI/ChatUnreadItem.swift index 25fd8fe719..d46d7ba798 100644 --- a/submodules/TelegramUI/TelegramUI/ChatUnreadItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatUnreadItem.swift @@ -12,10 +12,10 @@ class ChatUnreadItem: ListViewItem { let presentationData: ChatPresentationData let header: ChatMessageDateHeader - init(index: MessageIndex, presentationData: ChatPresentationData) { + init(index: MessageIndex, presentationData: ChatPresentationData, context: AccountContext) { self.index = index self.presentationData = presentationData - self.header = ChatMessageDateHeader(timestamp: index.timestamp, presentationData: presentationData) + self.header = ChatMessageDateHeader(timestamp: index.timestamp, presentationData: presentationData, context: context) } func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { diff --git a/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift b/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift index 47d2b991c8..f4ae858259 100644 --- a/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift +++ b/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift @@ -150,7 +150,7 @@ func uploadCustomWallpaper(context: AccountContext, wallpaper: WallpaperGalleryE let _ = (updatePresentationThemeSettingsInteractively(accountManager: accountManager, { current in var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers themeSpecificChatWallpapers[current.theme.index] = wallpaper - return PresentationThemeSettings(chatWallpaper: wallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: wallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) })).start() } diff --git a/submodules/TelegramUI/TelegramUI/DebugController.swift b/submodules/TelegramUI/TelegramUI/DebugController.swift index 819efdbc99..33b3ed6386 100644 --- a/submodules/TelegramUI/TelegramUI/DebugController.swift +++ b/submodules/TelegramUI/TelegramUI/DebugController.swift @@ -57,6 +57,8 @@ private enum DebugControllerEntry: ItemListNodeEntry { case resetBiometricsData(PresentationTheme) case optimizeDatabase(PresentationTheme) case photoPreview(PresentationTheme, Bool) + case playAnimatedEmojiOnce(PresentationTheme, Bool) + case knockoutWallpaper(PresentationTheme, Bool) case exportTheme(PresentationTheme) case versionInfo(PresentationTheme) @@ -70,7 +72,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return DebugControllerSection.logging.rawValue case .enableRaiseToSpeak, .keepChatNavigationStack, .skipReadHistory, .crashOnSlowQueries: return DebugControllerSection.experiments.rawValue - case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .optimizeDatabase, .photoPreview, .exportTheme: + case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .optimizeDatabase, .photoPreview, .playAnimatedEmojiOnce, .knockoutWallpaper, .exportTheme: return DebugControllerSection.experiments.rawValue case .versionInfo: return DebugControllerSection.info.rawValue @@ -119,10 +121,14 @@ private enum DebugControllerEntry: ItemListNodeEntry { return 18 case .photoPreview: return 19 - case .exportTheme: + case .playAnimatedEmojiOnce: return 20 - case .versionInfo: + case .knockoutWallpaper: return 21 + case .exportTheme: + return 22 + case .versionInfo: + return 23 } } @@ -469,6 +475,26 @@ private enum DebugControllerEntry: ItemListNodeEntry { }) }).start() }) + case let .playAnimatedEmojiOnce(theme, value): + return ItemListSwitchItem(theme: theme, title: "Play Emoji Once", value: value, sectionId: self.section, style: .blocks, updated: { value in + let _ = arguments.sharedContext.accountManager.transaction ({ transaction in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalUISettings, { settings in + var settings = settings as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings + settings.playAnimatedEmojiOnce = value + return settings + }) + }).start() + }) + case let .knockoutWallpaper(theme, value): + return ItemListSwitchItem(theme: theme, title: "Knockout Wallpaper", value: value, sectionId: self.section, style: .blocks, updated: { value in + let _ = arguments.sharedContext.accountManager.transaction ({ transaction in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalUISettings, { settings in + var settings = settings as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings + settings.knockoutWallpaper = value + return settings + }) + }).start() + }) case let .exportTheme(theme): return ItemListActionItem(theme: theme, title: "Export Theme", kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { guard let context = arguments.context else { @@ -483,11 +509,6 @@ private enum DebugControllerEntry: ItemListNodeEntry { guard let strings = try? encoder.encode(theme), let _ = try? strings.write(toFile: path, atomically: true, encoding: .utf8) else { return } - -// let encoder = JSONEncoder() -// guard let data = try? encoder.encode(theme), let _ = try? data.write(to: URL(fileURLWithPath: path)) else { -// return -// } let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled]) controller.peerSelected = { [weak controller] peerId in @@ -541,6 +562,8 @@ private func debugControllerEntries(presentationData: PresentationData, loggingS entries.append(.resetHoles(presentationData.theme)) entries.append(.optimizeDatabase(presentationData.theme)) entries.append(.photoPreview(presentationData.theme, experimentalSettings.chatListPhotos)) + entries.append(.playAnimatedEmojiOnce(presentationData.theme, experimentalSettings.playAnimatedEmojiOnce)) + entries.append(.knockoutWallpaper(presentationData.theme, experimentalSettings.knockoutWallpaper)) entries.append(.versionInfo(presentationData.theme)) diff --git a/submodules/TelegramUI/TelegramUI/EmojiResources.swift b/submodules/TelegramUI/TelegramUI/EmojiResources.swift index 6f304f8400..e908b3f2f4 100644 --- a/submodules/TelegramUI/TelegramUI/EmojiResources.swift +++ b/submodules/TelegramUI/TelegramUI/EmojiResources.swift @@ -197,8 +197,20 @@ private func matchingEmojiEntry(_ emoji: String) -> (UInt8, UInt8, UInt8)? { return nil } -func messageTextIsElligibleForLargeEmoji(_ emoji: String) -> Bool { - for emoji in emoji.emojis { +func messageIsElligibleForLargeEmoji(_ message: Message) -> Bool { + var messageEntities: [MessageTextEntity]? + for attribute in message.attributes { + if let attribute = attribute as? TextEntitiesMessageAttribute { + messageEntities = attribute.entities + break + } + } + + if !(messageEntities?.isEmpty ?? true) { + return false + } + + for emoji in message.text.emojis { if let _ = matchingEmojiEntry(emoji) { } else { return false @@ -286,49 +298,49 @@ func fetchEmojiSpriteResource(postbox: Postbox, network: Network, resource: Emoj let buffer = Atomic(value: Buffer()) let disposable = fetch.start(next: { result in switch result { - case .reset: - let _ = buffer.with { buffer in - buffer.data.count = 0 - } - case .resourceSizeUpdated: - break - case .progressUpdated: - break - case let .moveLocalFile(path): - if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) { + case .reset: let _ = buffer.with { buffer in - buffer.data = data + buffer.data.count = 0 } - let _ = try? FileManager.default.removeItem(atPath: path) - } - case let .moveTempFile(file): - if let data = try? Data(contentsOf: URL(fileURLWithPath: file.path)) { + case .resourceSizeUpdated: + break + case .progressUpdated: + break + case let .moveLocalFile(path): + if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) { + let _ = buffer.with { buffer in + buffer.data = data + } + let _ = try? FileManager.default.removeItem(atPath: path) + } + case let .moveTempFile(file): + if let data = try? Data(contentsOf: URL(fileURLWithPath: file.path)) { + let _ = buffer.with { buffer in + buffer.data = data + } + } + TempBox.shared.dispose(file) + case .copyLocalItem: + assertionFailure() + break + case let .replaceHeader(data, range): let _ = buffer.with { buffer in - buffer.data = data + if buffer.data.count < range.count { + buffer.data.count = range.count + } + buffer.data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in + data.copyBytes(to: bytes, from: range) + } } - } - TempBox.shared.dispose(file) - case .copyLocalItem: - assertionFailure() - break - case let .replaceHeader(data, range): - let _ = buffer.with { buffer in - if buffer.data.count < range.count { - buffer.data.count = range.count + case let .dataPart(resourceOffset, data, range, _): + let _ = buffer.with { buffer in + if buffer.data.count < resourceOffset + range.count { + buffer.data.count = resourceOffset + range.count + } + buffer.data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in + data.copyBytes(to: bytes.advanced(by: resourceOffset), from: range) + } } - buffer.data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in - data.copyBytes(to: bytes, from: range) - } - } - case let .dataPart(resourceOffset, data, range, _): - let _ = buffer.with { buffer in - if buffer.data.count < resourceOffset + range.count { - buffer.data.count = resourceOffset + range.count - } - buffer.data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in - data.copyBytes(to: bytes.advanced(by: resourceOffset), from: range) - } - } } }, completed: { let image = buffer.with { buffer -> UIImage? in diff --git a/submodules/TelegramUI/TelegramUI/EmojiUtils.swift b/submodules/TelegramUI/TelegramUI/EmojiUtils.swift index 6cd4d4144a..5da3ef8e68 100644 --- a/submodules/TelegramUI/TelegramUI/EmojiUtils.swift +++ b/submodules/TelegramUI/TelegramUI/EmojiUtils.swift @@ -93,6 +93,16 @@ extension String { return emojis } + var trimmingEmojis: String { + var string: String = "" + self.enumerateSubstrings(in: self.startIndex ..< self.endIndex, options: .byComposedCharacterSequences) { substring, _, _, _ in + if let substring = substring, !substring.containsEmoji { + string.append(substring) + } + } + return string + } + var normalizedEmoji: String { var string = "" diff --git a/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift b/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift index 785671d0ae..ffafc8e884 100644 --- a/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift +++ b/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift @@ -112,7 +112,19 @@ public func fetchCachedResourceRepresentation(account: Account, resource: MediaR } else if let representation = representation as? CachedEmojiRepresentation { return fetchEmojiRepresentation(account: account, resource: resource, representation: representation) } else if let representation = representation as? CachedAnimatedStickerRepresentation { - return account.postbox.mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false)) + let data: Signal +// if let resource = resource as? LocalBundleResource { +// data = Signal { subscriber in +// if let path = frameworkBundle.path(forResource: resource.name, ofType: resource.ext), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { +// subscriber.putNext(MediaResourceData(path: path, offset: 0, size: data.count, complete: true)) +// subscriber.putCompletion() +// } +// return EmptyDisposable +// } +// } else { + data = account.postbox.mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false)) +// } + return data |> mapToSignal { data -> Signal in if !data.complete { return .complete() @@ -924,3 +936,4 @@ private func fetchAnimatedStickerRepresentation(account: Account, resource: Medi }) |> runOn(Queue.concurrentDefaultQueue()) } + diff --git a/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift b/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift index 7e332a5a4b..c148f57a0b 100644 --- a/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift +++ b/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift @@ -52,7 +52,7 @@ func messageFileMediaResourceStatus(context: AccountContext, file: TelegramMedia } if message.flags.isSending { - return combineLatest(messageMediaFileStatus(context: context, messageId: message.id, file: file), context.account.pendingMessageManager.pendingMessageStatus(message.id), playbackStatus) + return combineLatest(messageMediaFileStatus(context: context, messageId: message.id, file: file), context.account.pendingMessageManager.pendingMessageStatus(message.id) |> map { $0.0 }, playbackStatus) |> map { resourceStatus, pendingStatus, playbackStatus -> FileMediaResourceStatus in let mediaStatus: FileMediaResourceMediaStatus if let playbackStatus = playbackStatus { diff --git a/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift b/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift index a4434d9d4c..fbf5e725d4 100644 --- a/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift +++ b/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift @@ -133,7 +133,7 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode { return { item, params, neighbors in var updatedBackgroundImage: UIImage? if currentItem?.wallpaper != item.wallpaper { - updatedBackgroundImage = chatControllerBackgroundImage(wallpaper: item.wallpaper, mediaBox: item.context.sharedContext.accountManager.mediaBox) + updatedBackgroundImage = chatControllerBackgroundImage(theme: item.theme, wallpaper: item.wallpaper, mediaBox: item.context.sharedContext.accountManager.mediaBox, knockoutMode: item.context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) } let insets: UIEdgeInsets @@ -216,7 +216,7 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode { if node.supernode == nil { strongSelf.containerNode.addSubnode(node) } - node.frame = CGRect(origin: CGPoint(x: 0.0, y: topOffset), size: node.frame.size) + node.updateFrame(CGRect(origin: CGPoint(x: 0.0, y: topOffset), size: node.frame.size), within: layout.contentSize) topOffset += node.frame.size.height } diff --git a/submodules/TelegramUI/TelegramUI/GroupInfoController.swift b/submodules/TelegramUI/TelegramUI/GroupInfoController.swift index a03f91afb9..364eb5f7bd 100644 --- a/submodules/TelegramUI/TelegramUI/GroupInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/GroupInfoController.swift @@ -531,9 +531,9 @@ private enum GroupInfoEntry: ItemListNodeEntry { let label: String? switch memberStatus { case let .owner(rank): - label = rank ?? strings.GroupInfo_LabelOwner + label = rank?.trimmingEmojis ?? strings.GroupInfo_LabelOwner case let .admin(rank): - label = rank ?? strings.GroupInfo_LabelAdmin + label = rank?.trimmingEmojis ?? strings.GroupInfo_LabelAdmin case .member: label = nil } @@ -1823,6 +1823,8 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: default: break } + } else if case .tooMuchJoined = error { + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.Invite_ChannelsTooMuch, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: {})]), nil) } contactsController?.dismiss() diff --git a/submodules/TelegramUI/TelegramUI/ItemListController.swift b/submodules/TelegramUI/TelegramUI/ItemListController.swift index 8dd5727153..c6b9121d25 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListController.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListController.swift @@ -178,6 +178,14 @@ class ItemListController: ViewController, KeyShortcutR } } + var alwaysSynchronous = false { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).alwaysSynchronous = self.alwaysSynchronous + } + } + } + var visibleEntriesUpdated: ((ItemListNodeVisibleEntries) -> Void)? { didSet { if self.isNodeLoaded { @@ -443,6 +451,7 @@ class ItemListController: ViewController, KeyShortcutR self?.presentingViewController?.dismiss(animated: true, completion: nil) } displayNode.enableInteractiveDismiss = self.enableInteractiveDismiss + displayNode.alwaysSynchronous = self.alwaysSynchronous displayNode.visibleEntriesUpdated = self.visibleEntriesUpdated displayNode.visibleBottomContentOffsetChanged = self.visibleBottomContentOffsetChanged displayNode.contentOffsetChanged = self.contentOffsetChanged diff --git a/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift b/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift index 6d0b25e53c..d639890251 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift @@ -196,6 +196,8 @@ class ItemListControllerNode: ASDisplayNode, UIScrollV } } + var alwaysSynchronous = false + init(controller: ItemListController?, navigationBar: NavigationBar, updateNavigationOffset: @escaping (CGFloat) -> Void, state: Signal<(PresentationTheme, (ItemListNodeState, Entry.ItemGenerationArguments)), NoError>) { self.navigationBar = navigationBar self.updateNavigationOffset = updateNavigationOffset @@ -438,6 +440,10 @@ class ItemListControllerNode: ASDisplayNode, UIScrollV options.insert(.Synchronous) options.insert(.PreferSynchronousDrawing) } + if self.alwaysSynchronous { + options.insert(.Synchronous) + options.insert(.LowLatency) + } let focusItemTag = transition.focusItemTag let ensureVisibleItemTag = transition.ensureVisibleItemTag var scrollToItem: ListViewScrollToItem? diff --git a/submodules/TelegramUI/TelegramUI/ItemListPeerItem.swift b/submodules/TelegramUI/TelegramUI/ItemListPeerItem.swift index 7901c9617f..0d9130d3c4 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListPeerItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListPeerItem.swift @@ -181,7 +181,7 @@ private let titleBoldFont = Font.medium(17.0) private let statusFont = Font.regular(14.0) private let labelFont = Font.regular(13.0) private let labelDisclosureFont = Font.regular(17.0) -private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 17.0)! +private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 15.0)! private let badgeFont = Font.regular(15.0) class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNode { diff --git a/submodules/TelegramUI/TelegramUI/ItemListSingleLineInputItem.swift b/submodules/TelegramUI/TelegramUI/ItemListSingleLineInputItem.swift index 5ddb945d7b..b897f85320 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListSingleLineInputItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListSingleLineInputItem.swift @@ -26,11 +26,12 @@ class ItemListSingleLineInputItem: ListViewItem, ItemListItem { let sectionId: ItemListSectionId let action: () -> Void let textUpdated: (String) -> Void + let shouldUpdateText: (String) -> Bool let processPaste: ((String) -> String)? - let receivedFocus: (() -> Void)? + let updatedFocus: ((Bool) -> Void)? let tag: ItemListItemTag? - init(theme: PresentationTheme, title: NSAttributedString, text: String, placeholder: String, type: ItemListSingleLineInputItemType = .regular(capitalization: true, autocorrection: true), returnKeyType: UIReturnKeyType = .`default`, spacing: CGFloat = 0.0, clearButton: Bool = false, enabled: Bool = true, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId, textUpdated: @escaping (String) -> Void, processPaste: ((String) -> String)? = nil, receivedFocus: (() -> Void)? = nil, action: @escaping () -> Void) { + init(theme: PresentationTheme, title: NSAttributedString, text: String, placeholder: String, type: ItemListSingleLineInputItemType = .regular(capitalization: true, autocorrection: true), returnKeyType: UIReturnKeyType = .`default`, spacing: CGFloat = 0.0, clearButton: Bool = false, enabled: Bool = true, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId, textUpdated: @escaping (String) -> Void, shouldUpdateText: @escaping (String) -> Bool = { _ in return true }, processPaste: ((String) -> String)? = nil, updatedFocus: ((Bool) -> Void)? = nil, action: @escaping () -> Void) { self.theme = theme self.title = title self.text = text @@ -43,8 +44,9 @@ class ItemListSingleLineInputItem: ListViewItem, ItemListItem { self.tag = tag self.sectionId = sectionId self.textUpdated = textUpdated + self.shouldUpdateText = shouldUpdateText self.processPaste = processPaste - self.receivedFocus = receivedFocus + self.updatedFocus = updatedFocus self.action = action } @@ -351,6 +353,10 @@ class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDelegate, It } @objc internal func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + if let item = self.item, !item.shouldUpdateText(string) { + return false + } + if string.count > 1, let item = self.item, let processPaste = item.processPaste { let result = processPaste(string) if result != string { @@ -376,7 +382,11 @@ class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDelegate, It } @objc internal func textFieldDidBeginEditing(_ textField: UITextField) { - self.item?.receivedFocus?() + self.item?.updatedFocus?(true) + } + + @objc internal func textFieldDidEndEditing(_ textField: UITextField) { + self.item?.updatedFocus?(false) } func animateError() { diff --git a/submodules/TelegramUI/TelegramUI/LegacyAttachmentMenu.swift b/submodules/TelegramUI/TelegramUI/LegacyAttachmentMenu.swift index b2d39c2f63..1ed4712949 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyAttachmentMenu.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyAttachmentMenu.swift @@ -8,7 +8,7 @@ import TelegramCore import TelegramPresentationData import DeviceAccess -func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: MessageMediaEditingOptions?, saveEditedPhotos: Bool, allowGrouping: Bool, theme: PresentationTheme, strings: PresentationStrings, parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: String, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, sendMessagesWithSignals: @escaping ([Any]?) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController { +func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: MessageMediaEditingOptions?, saveEditedPhotos: Bool, allowGrouping: Bool, theme: PresentationTheme, strings: PresentationStrings, parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: String, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController { let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat let controller = TGMenuSheetController(context: parentController.context, dark: false)! @@ -58,10 +58,13 @@ func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: carouselItem.selectionLimitExceeded = { presentSelectionLimitExceeded() } - if (peer is TelegramUser) && peer.id != context.account.peerId { - carouselItem.hasTimer = true + if peer.id != context.account.peerId { + if peer is TelegramUser { + carouselItem.hasTimer = true + } + carouselItem.hasSilentPosting = !isSecretChat } - carouselItem.sendPressed = { [weak controller, weak carouselItem] currentItem, asFiles in + carouselItem.sendPressed = { [weak controller, weak carouselItem] currentItem, asFiles, silentPosting in if let controller = controller, let carouselItem = carouselItem { let intent: TGMediaAssetsControllerIntent = asFiles ? TGMediaAssetsControllerSendFileIntent : TGMediaAssetsControllerSendMediaIntent let signals = TGMediaAssetsController.resultSignals(for: carouselItem.selectionContext, editingContext: carouselItem.editingContext, intent: intent, currentItem: currentItem, storeAssets: true, useMediaCache: false, descriptionGenerator: legacyAssetPickerItemGenerator(), saveEditedPhotos: saveEditedPhotos) @@ -69,7 +72,7 @@ func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: presentCantSendMultipleFiles() } else { controller.dismiss(animated: true) - sendMessagesWithSignals(signals) + sendMessagesWithSignals(signals, silentPosting) } } }; @@ -181,8 +184,12 @@ func presentLegacyPasteMenu(context: AccountContext, peer: Peer, saveEditedPhoto legacyController.bind(controller: navigationController) var hasTimer = false - if (peer is TelegramUser) && peer.id != context.account.peerId { - hasTimer = true + var hasSilentPosting = false + if peer.id != context.account.peerId { + if peer is TelegramUser { + hasTimer = true + } + hasSilentPosting = true } let recipientName = peer.displayTitle diff --git a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift index 309ecdb5f3..1983295f52 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift @@ -55,8 +55,11 @@ func presentedLegacyCamera(context: AccountContext, peer: Peer, cameraView: TGAt controller.inhibitDocumentCaptions = false controller.suggestionContext = legacySuggestionContext(account: context.account, peerId: peer.id) controller.recipientName = peer.displayTitle - if (peer is TelegramUser) && peer.id != context.account.peerId { - controller.hasTimer = true + if peer.id != context.account.peerId { + if peer is TelegramUser { + controller.hasTimer = true + } + controller.hasSilentPosting = true } let screenSize = parentController.view.bounds.size diff --git a/submodules/TelegramUI/TelegramUI/LegacyController.swift b/submodules/TelegramUI/TelegramUI/LegacyController.swift index 0eabda2dc2..565e1724a1 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyController.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyController.swift @@ -53,15 +53,19 @@ private final class LegacyComponentsOverlayWindowManagerImpl: NSObject, LegacyCo func bindController(_ controller: UIViewController!) { self.contentController = controller + if controller.prefersStatusBarHidden { + self.controller?.statusBar.statusBarStyle = .Hide + } + controller.state_setNeedsStatusBarAppearanceUpdate({ [weak self, weak controller] in if let parentController = self?.parentController, let controller = controller { - if parentController.statusBar.statusBarStyle != .Hide { + if parentController.statusBar.statusBarStyle != .Hide && !controller.prefersStatusBarHidden { self?.controller?.statusBar.statusBarStyle = StatusBarStyle(systemStyle: controller.preferredStatusBarStyle) } } }) if let parentController = self.parentController { - if parentController.statusBar.statusBarStyle != .Hide { + if parentController.statusBar.statusBarStyle != .Hide && !controller.prefersStatusBarHidden { self.controller?.statusBar.statusBarStyle = StatusBarStyle(systemStyle: controller.preferredStatusBarStyle) } } diff --git a/submodules/TelegramUI/TelegramUI/LegacyMediaPickers.swift b/submodules/TelegramUI/TelegramUI/LegacyMediaPickers.swift index bf2916a252..3b8a7f0b84 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyMediaPickers.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyMediaPickers.swift @@ -15,11 +15,16 @@ func guessMimeTypeByFileExtension(_ ext: String) -> String { } func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, context: AccountContext, peer: Peer, captionsEnabled: Bool = true, storeCreatedAssets: Bool = true, showFileTooltip: Bool = false, initialCaption: String, presentWebSearch: (() -> Void)?, presentSelectionLimitExceeded: @escaping () -> Void) { + let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat + controller.captionsEnabled = captionsEnabled controller.inhibitDocumentCaptions = false controller.suggestionContext = legacySuggestionContext(account: context.account, peerId: peer.id) - if (peer is TelegramUser) && peer.id != context.account.peerId { - controller.hasTimer = true + if peer.id != context.account.peerId { + if peer is TelegramUser { + controller.hasTimer = true + } + controller.hasSilentPosting = !isSecretChat } controller.dismissalBlock = { } diff --git a/submodules/TelegramUI/TelegramUI/NavigationBarSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/NavigationBarSearchContentNode.swift index 3f09c011ba..cfda4fccc3 100644 --- a/submodules/TelegramUI/TelegramUI/NavigationBarSearchContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/NavigationBarSearchContentNode.swift @@ -75,7 +75,7 @@ class NavigationBarSearchContentNode: NavigationBarContentNode { func updateExpansionProgress(_ progress: CGFloat, animated: Bool = false) { let newProgress = max(0.0, min(10.0, progress)) - if abs(newProgress - self.expansionProgress) > 0.0001 && (progress <= 1.0 || self.expansionProgress != 1.0) { + if abs(newProgress - self.expansionProgress) > 0.0001 { self.expansionProgress = newProgress let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.3, curve: ContainedViewLayoutTransitionCurve.slide) : .immediate diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index 3fe2ffa1f4..e711262de2 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -130,10 +130,7 @@ private func chatMessageGalleryControllerData(context: AccountContext, message: if let file = galleryMedia as? TelegramMediaFile { if let fileName = file.fileName { let ext = (fileName as NSString).pathExtension.lowercased() - if ext == "tgios-theme" { - return .theme(file) - } - else if ext == "wav" || ext == "opus" { + if ext == "wav" || ext == "opus" { return .audio(file) } else if ext == "json", let fileSize = file.size, fileSize < 1024 * 1024 { if let path = context.account.postbox.mediaBox.completedResourcePath(file.resource), let _ = LOTComposition(filePath: path) { @@ -356,7 +353,7 @@ func openChatMessage(context: AccountContext, message: Message, standalone: Bool return nil })) case let .theme(media): - let controller = ThemePreviewController(context: context, previewTheme: makeDefaultDayPresentationTheme(accentColor: nil, serviceBackgroundColor: .black, day: true), media: .message(message: MessageReference(message), media: media)) + let controller = ThemePreviewController(context: context, previewTheme: makeDefaultDayPresentationTheme(accentColor: nil, serviceBackgroundColor: .black, baseColor: nil, day: true, preview: false), media: .message(message: MessageReference(message), media: media)) present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) } } diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift index 4932026c3c..a06a008712 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift @@ -64,6 +64,7 @@ final class OverlayPlayerControllerNode: ViewControllerTracingNode, UIGestureRec }, navigateToMessage: { _, _ in }, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in + }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false diff --git a/submodules/TelegramUI/TelegramUI/PasscodeEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/PasscodeEntryControllerNode.swift index 5f40b7e5e9..d200e08c1c 100644 --- a/submodules/TelegramUI/TelegramUI/PasscodeEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PasscodeEntryControllerNode.swift @@ -173,7 +173,7 @@ final class PasscodeEntryControllerNode: ASDisplayNode { switch self.wallpaper { case .image, .file: - if let image = chatControllerBackgroundImage(wallpaper: self.wallpaper, mediaBox: self.context.sharedContext.accountManager.mediaBox, composed: false) { + if let image = chatControllerBackgroundImage(theme: self.theme, wallpaper: self.wallpaper, mediaBox: self.context.sharedContext.accountManager.mediaBox, composed: false, knockoutMode: false) { self.background = ImageBasedPasscodeBackground(image: image, size: size) } else { self.background = GradientPasscodeBackground(size: size, backgroundColors: self.theme.passcode.backgroundColors.colors, buttonColor: self.theme.passcode.buttonColor) diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index 7e6ed99eda..dd29d44265 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -180,6 +180,7 @@ public class PeerMediaCollectionController: TelegramController { if let strongSelf = self, strongSelf.isNodeLoaded { strongSelf.updateInterfaceState(animated: true, { $0.withToggledSelectedMessages(ids, value: value) }) } + }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false @@ -379,6 +380,7 @@ public class PeerMediaCollectionController: TelegramController { }, openLinkEditing: { }, reportPeerIrrelevantGeoLocation: { }, displaySlowmodeTooltip: { _, _ in + }, displaySendMessageOptions: { }, statuses: nil) self.updateInterfaceState(animated: false, { return $0 }) @@ -652,7 +654,7 @@ public class PeerMediaCollectionController: TelegramController { if peerId == strongSelf.context.account.peerId { let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: messageIds.map { id -> EnqueueMessage in - return .forward(source: id, grouping: .auto) + return .forward(source: id, grouping: .auto, attributes: []) }) |> deliverOnMainQueue).start(next: { [weak self] messageIds in if let strongSelf = self { @@ -661,7 +663,7 @@ public class PeerMediaCollectionController: TelegramController { return nil } return strongSelf.context.account.pendingMessageManager.pendingMessageStatus(id) - |> mapToSignal { status -> Signal in + |> mapToSignal { status, _ -> Signal in if status != nil { return .never() } else { diff --git a/submodules/TelegramUI/TelegramUI/PhoneInputNode.swift b/submodules/TelegramUI/TelegramUI/PhoneInputNode.swift index ea5ba00b55..ee04b51f7b 100644 --- a/submodules/TelegramUI/TelegramUI/PhoneInputNode.swift +++ b/submodules/TelegramUI/TelegramUI/PhoneInputNode.swift @@ -241,7 +241,7 @@ final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { } if self.previousCountryCodeText != realRegionPrefix || forceNotifyCountryCodeUpdated { self.previousCountryCodeText = realRegionPrefix - let code = removePlus(realRegionPrefix).trimmingCharacters(in: CharacterSet.whitespaces) + let code = removePlus(realRegionPrefix).trimmingCharacters(in: .whitespaces) var countryName: String? if self.countryNameForCode?.0 == Int32(code) { countryName = self.countryNameForCode?.1 diff --git a/submodules/TelegramUI/TelegramUI/PresentationResourcesChat.swift b/submodules/TelegramUI/TelegramUI/PresentationResourcesChat.swift index 1ea782f96c..53bfed76ef 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationResourcesChat.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationResourcesChat.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import Display +import Postbox import TelegramCore import TelegramPresentationData @@ -67,11 +68,11 @@ struct PresentationResourcesChat { }) } - static func principalGraphics(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> PrincipalThemeEssentialGraphics { + static func principalGraphics(context: AccountContext, theme: PresentationTheme, wallpaper: TelegramWallpaper) -> PrincipalThemeEssentialGraphics { let hasWallpaper = !wallpaper.isEmpty let key: PresentationResourceKey = !hasWallpaper ? PresentationResourceKey.chatPrincipalThemeEssentialGraphicsWithoutWallpaper : PresentationResourceKey.chatPrincipalThemeEssentialGraphicsWithWallpaper return theme.object(key.rawValue, { theme in - return PrincipalThemeEssentialGraphics(theme.chat, wallpaper: wallpaper) + return PrincipalThemeEssentialGraphics(mediaBox: context.account.postbox.mediaBox, presentationTheme: theme, wallpaper: wallpaper, preview: theme.preview, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) }) as! PrincipalThemeEssentialGraphics } diff --git a/submodules/TelegramUI/TelegramUI/PresentationThemeEssentialGraphics.swift b/submodules/TelegramUI/TelegramUI/PresentationThemeEssentialGraphics.swift index d38be39677..9592574c38 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationThemeEssentialGraphics.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationThemeEssentialGraphics.swift @@ -1,8 +1,10 @@ import Foundation import UIKit import Display +import Postbox import TelegramCore import TelegramPresentationData +import TelegramUIPreferences private func generateCheckImage(partial: Bool, color: UIColor) -> UIImage? { return generateImage(CGSize(width: 11.0, height: 9.0), rotatedContext: { size, context in @@ -127,82 +129,201 @@ public final class PrincipalThemeEssentialGraphics { public let radialIndicatorFileIconIncoming: UIImage public let radialIndicatorFileIconOutgoing: UIImage - init(_ theme: PresentationThemeChat, wallpaper: TelegramWallpaper) { + public let incomingBubbleGradientImage: UIImage? + public let outgoingBubbleGradientImage: UIImage? + + init(mediaBox: MediaBox, presentationTheme: PresentationTheme, wallpaper initialWallpaper: TelegramWallpaper, preview: Bool = false, knockoutMode: Bool) { + let theme = presentationTheme.chat + var wallpaper = initialWallpaper + + if knockoutMode { + let wallpaperImage = chatControllerBackgroundImage(theme: presentationTheme, wallpaper: wallpaper, mediaBox: mediaBox, knockoutMode: false) + self.incomingBubbleGradientImage = wallpaperImage + self.outgoingBubbleGradientImage = wallpaperImage + wallpaper = presentationTheme.chat.defaultWallpaper + } else if case .color = wallpaper { + switch presentationTheme.name { + case let .builtin(name): + switch name { + case .day, .night, .nightAccent: + var incomingGradientColors: (UIColor, UIColor)? + if let incomingGradientColors = incomingGradientColors { + self.incomingBubbleGradientImage = generateImage(CGSize(width: 1.0, height: 512.0), opaque: true, scale: 1.0, rotatedContext: { size, context in + var locations: [CGFloat] = [0.0, 1.0] + let colors = [incomingGradientColors.0.cgColor, incomingGradientColors.1.cgColor] as NSArray + + let colorSpace = deviceColorSpace + let gradient = CGGradient(colorsSpace: colorSpace, colors: colors, locations: &locations)! + + context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: size.height), options: CGGradientDrawingOptions()) + }) + } else { + self.incomingBubbleGradientImage = nil + } + + var outgoingGradientColors: (UIColor, UIColor)? + if let baseColor = presentationTheme.baseColor { + let colors = baseColor.outgoingGradientColors + if !colors.0.isEqual(colors.1) { + outgoingGradientColors = colors + } + } + if let outgoingGradientColors = outgoingGradientColors { + self.outgoingBubbleGradientImage = generateImage(CGSize(width: 1.0, height: 512.0), opaque: true, scale: 1.0, rotatedContext: { size, context in + var locations: [CGFloat] = [0.0, 1.0] + let colors = [outgoingGradientColors.0.cgColor, outgoingGradientColors.1.cgColor] as NSArray + + let colorSpace = deviceColorSpace + let gradient = CGGradient(colorsSpace: colorSpace, colors: colors, locations: &locations)! + + context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: size.height), options: CGGradientDrawingOptions()) + }) + } else { + self.outgoingBubbleGradientImage = nil + } + case .dayClassic: + self.incomingBubbleGradientImage = nil + self.outgoingBubbleGradientImage = nil + } + case .custom: + self.incomingBubbleGradientImage = nil + self.outgoingBubbleGradientImage = nil + } + } else { + self.incomingBubbleGradientImage = nil + self.outgoingBubbleGradientImage = nil + } + let incoming: PresentationThemeBubbleColorComponents = wallpaper.isEmpty ? theme.message.incoming.bubble.withoutWallpaper : theme.message.incoming.bubble.withWallpaper let outgoing: PresentationThemeBubbleColorComponents = wallpaper.isEmpty ? theme.message.outgoing.bubble.withoutWallpaper : theme.message.outgoing.bubble.withWallpaper - self.chatMessageBackgroundIncomingImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedTopImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedTopHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedTopSideImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .top(side: true), theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedTopSideHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .top(side: true), theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedBottomImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedBottomHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedBothImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedBothHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper) + let incomingKnockout = self.incomingBubbleGradientImage != nil + let outgoingKnockout = self.outgoingBubbleGradientImage != nil - self.chatMessageBackgroundOutgoingImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedTopImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedTopHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedTopSideImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .top(side: true), theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedTopSideHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .top(side: true), theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedBottomImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedBottomHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedBothImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedBothHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper) + let emptyImage = UIImage() + if preview { + self.chatMessageBackgroundIncomingImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingHighlightedImage = emptyImage + self.chatMessageBackgroundIncomingMergedTopImage = emptyImage + self.chatMessageBackgroundIncomingMergedTopHighlightedImage = emptyImage + self.chatMessageBackgroundIncomingMergedTopSideImage = emptyImage + self.chatMessageBackgroundIncomingMergedTopSideHighlightedImage = emptyImage + self.chatMessageBackgroundIncomingMergedBottomImage = emptyImage + self.chatMessageBackgroundIncomingMergedBottomHighlightedImage = emptyImage + self.chatMessageBackgroundIncomingMergedBothImage = emptyImage + self.chatMessageBackgroundIncomingMergedBothHighlightedImage = emptyImage + self.chatMessageBackgroundIncomingMergedSideImage = emptyImage + self.chatMessageBackgroundIncomingMergedSideHighlightedImage = emptyImage + self.chatMessageBackgroundOutgoingImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingHighlightedImage = emptyImage + self.chatMessageBackgroundOutgoingMergedTopImage = emptyImage + self.chatMessageBackgroundOutgoingMergedTopHighlightedImage = emptyImage + self.chatMessageBackgroundOutgoingMergedTopSideImage = emptyImage + self.chatMessageBackgroundOutgoingMergedTopSideHighlightedImage = emptyImage + self.chatMessageBackgroundOutgoingMergedBottomImage = emptyImage + self.chatMessageBackgroundOutgoingMergedBottomHighlightedImage = emptyImage + self.chatMessageBackgroundOutgoingMergedBothImage = emptyImage + self.chatMessageBackgroundOutgoingMergedBothHighlightedImage = emptyImage + self.chatMessageBackgroundOutgoingMergedSideImage = emptyImage + self.chatMessageBackgroundOutgoingMergedSideHighlightedImage = emptyImage + self.checkBubbleFullImage = emptyImage + self.checkBubblePartialImage = emptyImage + self.checkMediaFullImage = emptyImage + self.checkMediaPartialImage = emptyImage + self.checkFreeFullImage = emptyImage + self.checkFreePartialImage = emptyImage + self.clockBubbleIncomingFrameImage = emptyImage + self.clockBubbleIncomingMinImage = emptyImage + self.clockBubbleOutgoingFrameImage = emptyImage + self.clockBubbleOutgoingMinImage = emptyImage + self.clockMediaFrameImage = emptyImage + self.clockMediaMinImage = emptyImage + self.clockFreeFrameImage = emptyImage + self.clockFreeMinImage = emptyImage + self.dateAndStatusMediaBackground = emptyImage + self.dateAndStatusFreeBackground = emptyImage + self.incomingDateAndStatusImpressionIcon = emptyImage + self.outgoingDateAndStatusImpressionIcon = emptyImage + self.mediaImpressionIcon = emptyImage + self.freeImpressionIcon = emptyImage + self.dateStaticBackground = emptyImage + self.dateFloatingBackground = emptyImage + self.radialIndicatorFileIconIncoming = emptyImage + self.radialIndicatorFileIconOutgoing = emptyImage + } else { + self.chatMessageBackgroundIncomingImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingMergedTopImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingMergedTopHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingMergedTopSideImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .top(side: true), theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingMergedTopSideHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .top(side: true), theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingMergedBottomImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingMergedBottomHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingMergedBothImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + self.chatMessageBackgroundIncomingMergedBothHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) + + self.chatMessageBackgroundOutgoingImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedTopImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedTopHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedTopSideImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .top(side: true), theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedTopSideHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .top(side: true), theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedBottomImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedBottomHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedBothImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedBothHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) - self.chatMessageBackgroundIncomingMergedSideImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .side, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedSideImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .side, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundIncomingMergedSideHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .side, theme: theme, wallpaper: wallpaper) - self.chatMessageBackgroundOutgoingMergedSideHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .side, theme: theme, wallpaper: wallpaper) - - self.checkBubbleFullImage = generateCheckImage(partial: false, color: theme.message.outgoingCheckColor)! - self.checkBubblePartialImage = generateCheckImage(partial: true, color: theme.message.outgoingCheckColor)! - - self.checkMediaFullImage = generateCheckImage(partial: false, color: .white)! - self.checkMediaPartialImage = generateCheckImage(partial: true, color: .white)! - - let serviceColor = serviceMessageColorComponents(chatTheme: theme, wallpaper: wallpaper) - self.checkFreeFullImage = generateCheckImage(partial: false, color: serviceColor.primaryText)! - self.checkFreePartialImage = generateCheckImage(partial: true, color: serviceColor.primaryText)! - - self.clockBubbleIncomingFrameImage = generateClockFrameImage(color: theme.message.incoming.pendingActivityColor)! - self.clockBubbleIncomingMinImage = generateClockMinImage(color: theme.message.incoming.pendingActivityColor)! - self.clockBubbleOutgoingFrameImage = generateClockFrameImage(color: theme.message.outgoing.pendingActivityColor)! - self.clockBubbleOutgoingMinImage = generateClockMinImage(color: theme.message.outgoing.pendingActivityColor)! - - self.clockMediaFrameImage = generateClockFrameImage(color: .white)! - self.clockMediaMinImage = generateClockMinImage(color: .white)! - - self.clockFreeFrameImage = generateClockFrameImage(color: serviceColor.primaryText)! - self.clockFreeMinImage = generateClockMinImage(color: serviceColor.primaryText)! - - self.dateAndStatusMediaBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: theme.message.mediaDateAndStatusFillColor)! - self.dateAndStatusFreeBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: serviceColor.dateFillStatic)! - - let impressionCountImage = UIImage(bundleImageName: "Chat/Message/ImpressionCount")! - self.incomingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.message.incoming.secondaryTextColor)! - self.outgoingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.message.outgoing.secondaryTextColor)! - self.mediaImpressionIcon = generateTintedImage(image: impressionCountImage, color: .white)! - self.freeImpressionIcon = generateTintedImage(image: impressionCountImage, color: serviceColor.primaryText)! - - let chatDateSize: CGFloat = 20.0 - self.dateStaticBackground = generateImage(CGSize(width: chatDateSize, height: chatDateSize), contextGenerator: { size, context -> Void in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(serviceColor.dateFillStatic.cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) - })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2) - - self.dateFloatingBackground = generateImage(CGSize(width: chatDateSize, height: chatDateSize), contextGenerator: { size, context -> Void in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(serviceColor.dateFillFloating.cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) - })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2) - - self.radialIndicatorFileIconIncoming = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocumentIncoming"), color: incoming.fill)! - self.radialIndicatorFileIconOutgoing = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocumentIncoming"), color: outgoing.fill)! + self.chatMessageBackgroundIncomingMergedSideImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .side, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedSideImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .side, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundIncomingMergedSideHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .side, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + self.chatMessageBackgroundOutgoingMergedSideHighlightedImage = messageBubbleImage(incoming: false, fillColor: outgoing.highlightedFill, strokeColor: outgoing.stroke, neighbors: .side, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) + + self.checkBubbleFullImage = generateCheckImage(partial: false, color: theme.message.outgoingCheckColor)! + self.checkBubblePartialImage = generateCheckImage(partial: true, color: theme.message.outgoingCheckColor)! + + self.checkMediaFullImage = generateCheckImage(partial: false, color: .white)! + self.checkMediaPartialImage = generateCheckImage(partial: true, color: .white)! + + let serviceColor = serviceMessageColorComponents(chatTheme: theme, wallpaper: wallpaper) + self.checkFreeFullImage = generateCheckImage(partial: false, color: serviceColor.primaryText)! + self.checkFreePartialImage = generateCheckImage(partial: true, color: serviceColor.primaryText)! + + self.clockBubbleIncomingFrameImage = generateClockFrameImage(color: theme.message.incoming.pendingActivityColor)! + self.clockBubbleIncomingMinImage = generateClockMinImage(color: theme.message.incoming.pendingActivityColor)! + self.clockBubbleOutgoingFrameImage = generateClockFrameImage(color: theme.message.outgoing.pendingActivityColor)! + self.clockBubbleOutgoingMinImage = generateClockMinImage(color: theme.message.outgoing.pendingActivityColor)! + + self.clockMediaFrameImage = generateClockFrameImage(color: .white)! + self.clockMediaMinImage = generateClockMinImage(color: .white)! + + self.clockFreeFrameImage = generateClockFrameImage(color: serviceColor.primaryText)! + self.clockFreeMinImage = generateClockMinImage(color: serviceColor.primaryText)! + + self.dateAndStatusMediaBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: theme.message.mediaDateAndStatusFillColor)! + self.dateAndStatusFreeBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: serviceColor.dateFillStatic)! + + let impressionCountImage = UIImage(bundleImageName: "Chat/Message/ImpressionCount")! + self.incomingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.message.incoming.secondaryTextColor)! + self.outgoingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.message.outgoing.secondaryTextColor)! + self.mediaImpressionIcon = generateTintedImage(image: impressionCountImage, color: .white)! + self.freeImpressionIcon = generateTintedImage(image: impressionCountImage, color: serviceColor.primaryText)! + + let chatDateSize: CGFloat = 20.0 + self.dateStaticBackground = generateImage(CGSize(width: chatDateSize, height: chatDateSize), contextGenerator: { size, context -> Void in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(serviceColor.dateFillStatic.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2) + + self.dateFloatingBackground = generateImage(CGSize(width: chatDateSize, height: chatDateSize), contextGenerator: { size, context -> Void in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(serviceColor.dateFillFloating.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2) + + self.radialIndicatorFileIconIncoming = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocumentIncoming"), color: incoming.fill)! + self.radialIndicatorFileIconOutgoing = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocumentIncoming"), color: outgoing.fill)! + } } } diff --git a/submodules/TelegramUI/TelegramUI/Resources/Emoji/celeb.tgs b/submodules/TelegramUI/TelegramUI/Resources/Emoji/celeb.tgs new file mode 100644 index 0000000000..973c6be963 Binary files /dev/null and b/submodules/TelegramUI/TelegramUI/Resources/Emoji/celeb.tgs differ diff --git a/submodules/TelegramUI/TelegramUI/Resources/Emoji/confused.tgs b/submodules/TelegramUI/TelegramUI/Resources/Emoji/confused.tgs new file mode 100644 index 0000000000..4abce8d46a Binary files /dev/null and b/submodules/TelegramUI/TelegramUI/Resources/Emoji/confused.tgs differ diff --git a/submodules/TelegramUI/TelegramUI/Resources/Emoji/heart.tgs b/submodules/TelegramUI/TelegramUI/Resources/Emoji/heart.tgs new file mode 100644 index 0000000000..5cf76fd2ab Binary files /dev/null and b/submodules/TelegramUI/TelegramUI/Resources/Emoji/heart.tgs differ diff --git a/submodules/TelegramUI/TelegramUI/Resources/Emoji/lol.tgs b/submodules/TelegramUI/TelegramUI/Resources/Emoji/lol.tgs new file mode 100644 index 0000000000..46938c7364 Binary files /dev/null and b/submodules/TelegramUI/TelegramUI/Resources/Emoji/lol.tgs differ diff --git a/submodules/TelegramUI/TelegramUI/Resources/Emoji/meh.tgs b/submodules/TelegramUI/TelegramUI/Resources/Emoji/meh.tgs new file mode 100644 index 0000000000..011e2dfa02 Binary files /dev/null and b/submodules/TelegramUI/TelegramUI/Resources/Emoji/meh.tgs differ diff --git a/submodules/TelegramUI/TelegramUI/Resources/Emoji/thumbsup.tgs b/submodules/TelegramUI/TelegramUI/Resources/Emoji/thumbsup.tgs new file mode 100644 index 0000000000..5e7f63778c Binary files /dev/null and b/submodules/TelegramUI/TelegramUI/Resources/Emoji/thumbsup.tgs differ diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 18be63993d..28e8c9c27d 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/SettingsController.swift b/submodules/TelegramUI/TelegramUI/SettingsController.swift index e65b896358..ace72d9478 100644 --- a/submodules/TelegramUI/TelegramUI/SettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/SettingsController.swift @@ -1378,7 +1378,6 @@ public func settingsController(context: AccountContext, accountManager: AccountM let accountContext = AccountContext(sharedContext: sharedContext, account: selectedAccount, limitsConfiguration: LimitsConfiguration.defaultValue) let chatListController = ChatListController(context: accountContext, groupId: .root, controlsHistoryPreload: false, hideNetworkActivityStatus: true) return chatListController - } } return nil diff --git a/submodules/TelegramUI/TelegramUI/ShareController.swift b/submodules/TelegramUI/TelegramUI/ShareController.swift index 047436bf87..55c526dee1 100644 --- a/submodules/TelegramUI/TelegramUI/ShareController.swift +++ b/submodules/TelegramUI/TelegramUI/ShareController.swift @@ -340,6 +340,11 @@ public final class ShareController: ViewController { override public func loadDisplayNode() { self.displayNode = ShareControllerNode(sharedContext: self.sharedContext, defaultAction: self.defaultAction, requestLayout: { [weak self] transition in self?.requestLayout(transition: transition) + }, presentError: { [weak self] title, text in + guard let strongSelf = self else { + return + } + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: title, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) }, externalShare: self.externalShare, immediateExternalShare: self.immediateExternalShare) self.controllerNode.dismiss = { [weak self] shared in self?.presentingViewController?.dismiss(animated: false, completion: nil) @@ -353,98 +358,141 @@ public final class ShareController: ViewController { }) } self.controllerNode.share = { [weak self] text, peerIds in - if let strongSelf = self { - switch strongSelf.subject { - case let .url(url): - for peerId in peerIds { - var messages: [EnqueueMessage] = [] - if !text.isEmpty { - messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - } - messages.append(.message(text: url, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - let _ = enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages).start() - } - return .complete() - case let .text(string): - for peerId in peerIds { - var messages: [EnqueueMessage] = [] - if !text.isEmpty { - messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - } - messages.append(.message(text: string, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - let _ = enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages).start() - } - return .complete() - case let .quote(string, url): - for peerId in peerIds { - var messages: [EnqueueMessage] = [] - if !text.isEmpty { - messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - } - let attributedText = NSMutableAttributedString(string: string, attributes: [ChatTextInputAttributes.italic: true as NSNumber]) - attributedText.append(NSAttributedString(string: "\n\n\(url)")) - let entities = generateChatInputTextEntities(attributedText) - messages.append(.message(text: attributedText.string, attributes: [TextEntitiesMessageAttribute(entities: entities)], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - let _ = enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages).start() - } - return .complete() - case let .image(representations): - for peerId in peerIds { - var messages: [EnqueueMessage] = [] - if !text.isEmpty { - messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - } - messages.append(.message(text: "", attributes: [], mediaReference: .standalone(media: TelegramMediaImage(imageId: MediaId(namespace: Namespaces.Media.LocalImage, id: arc4random64()), representations: representations.map({ $0.representation }), immediateThumbnailData: nil, reference: nil, partialReference: nil)), replyToMessageId: nil, localGroupingKey: nil)) - let _ = enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages).start() - } - return .complete() - case let .media(mediaReference): - for peerId in peerIds { - var messages: [EnqueueMessage] = [] - if !text.isEmpty { - messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - } - messages.append(.message(text: "", attributes: [], mediaReference: mediaReference, replyToMessageId: nil, localGroupingKey: nil)) - let _ = enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages).start() - } - return .complete() - case let .mapMedia(media): - for peerId in peerIds { - var messages: [EnqueueMessage] = [] - if !text.isEmpty { - messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - } - messages.append(.message(text: "", attributes: [], mediaReference: .standalone(media: media), replyToMessageId: nil, localGroupingKey: nil)) - let _ = enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages).start() - } - return .complete() - case let .messages(messages): - for peerId in peerIds { - var messagesToEnqueue: [EnqueueMessage] = [] - if !text.isEmpty { - messagesToEnqueue.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) - } - for message in messages { - messagesToEnqueue.append(.forward(source: message.id, grouping: .auto)) - } - let _ = enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messagesToEnqueue).start() - } - return .single(.done) - case let .fromExternal(f): - return f(peerIds, text, strongSelf.currentAccount) - |> map { state -> ShareState in - switch state { - case .preparing: - return .preparing - case let .progress(value): - return .progress(value) - case .done: - return .done - } - } + guard let strongSelf = self else { + return .complete() + } + var shareSignals: [Signal<[MessageId?], NoError>] = [] + switch strongSelf.subject { + case let .url(url): + for peerId in peerIds { + var messages: [EnqueueMessage] = [] + if !text.isEmpty { + messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + } + messages.append(.message(text: url, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + shareSignals.append(enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages)) + } + case let .text(string): + for peerId in peerIds { + var messages: [EnqueueMessage] = [] + if !text.isEmpty { + messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + } + messages.append(.message(text: string, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + shareSignals.append(enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages)) + } + case let .quote(string, url): + for peerId in peerIds { + var messages: [EnqueueMessage] = [] + if !text.isEmpty { + messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + } + let attributedText = NSMutableAttributedString(string: string, attributes: [ChatTextInputAttributes.italic: true as NSNumber]) + attributedText.append(NSAttributedString(string: "\n\n\(url)")) + let entities = generateChatInputTextEntities(attributedText) + messages.append(.message(text: attributedText.string, attributes: [TextEntitiesMessageAttribute(entities: entities)], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + shareSignals.append(enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages)) + } + case let .image(representations): + for peerId in peerIds { + var messages: [EnqueueMessage] = [] + if !text.isEmpty { + messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + } + messages.append(.message(text: "", attributes: [], mediaReference: .standalone(media: TelegramMediaImage(imageId: MediaId(namespace: Namespaces.Media.LocalImage, id: arc4random64()), representations: representations.map({ $0.representation }), immediateThumbnailData: nil, reference: nil, partialReference: nil)), replyToMessageId: nil, localGroupingKey: nil)) + shareSignals.append(enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages)) + } + case let .media(mediaReference): + for peerId in peerIds { + var messages: [EnqueueMessage] = [] + if !text.isEmpty { + messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + } + messages.append(.message(text: "", attributes: [], mediaReference: mediaReference, replyToMessageId: nil, localGroupingKey: nil)) + shareSignals.append(enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages)) + } + case let .mapMedia(media): + for peerId in peerIds { + var messages: [EnqueueMessage] = [] + if !text.isEmpty { + messages.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + } + messages.append(.message(text: "", attributes: [], mediaReference: .standalone(media: media), replyToMessageId: nil, localGroupingKey: nil)) + shareSignals.append(enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messages)) + } + case let .messages(messages): + for peerId in peerIds { + var messagesToEnqueue: [EnqueueMessage] = [] + if !text.isEmpty { + messagesToEnqueue.append(.message(text: text, attributes: [], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil)) + } + for message in messages { + messagesToEnqueue.append(.forward(source: message.id, grouping: .auto, attributes: [])) + } + shareSignals.append(enqueueMessages(account: strongSelf.currentAccount, peerId: peerId, messages: messagesToEnqueue)) + } + case let .fromExternal(f): + return f(peerIds, text, strongSelf.currentAccount) + |> map { state -> ShareState in + switch state { + case .preparing: + return .preparing + case let .progress(value): + return .progress(value) + case .done: + return .done + } } } - return .complete() + let account = strongSelf.currentAccount + let queue = Queue.mainQueue() + var displayedError = false + return combineLatest(queue: queue, shareSignals) + |> mapToSignal { messageIdSets -> Signal in + var statuses: [Signal<(MessageId, PendingMessageStatus?, PendingMessageFailureReason?), NoError>] = [] + for messageIds in messageIdSets { + for case let id? in messageIds { + statuses.append(account.pendingMessageManager.pendingMessageStatus(id) + |> map { status, error -> (MessageId, PendingMessageStatus?, PendingMessageFailureReason?) in + return (id, status, error) + }) + } + } + return combineLatest(queue: queue, statuses) + |> mapToSignal { statuses -> Signal in + var hasStatuses = false + for (id, status, error) in statuses { + if let error = error { + Queue.mainQueue().async { + let _ = (account.postbox.transaction { transaction -> Peer? in + transaction.deleteMessages([id]) + return transaction.getPeer(id.peerId) + } + |> deliverOnMainQueue).start(next: { peer in + guard let strongSelf = self, let peer = peer else { + return + } + if !displayedError, case .slowmodeActive = error { + displayedError = true + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: peer.displayTitle, text: strongSelf.presentationData.strings.Chat_SlowmodeSendError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + } + }) + } + } + let _ = account.postbox.transaction({ transaction in + + }).start() + if status != nil { + hasStatuses = true + } + } + if !hasStatuses { + return .single(.done) + } + return .complete() + } + |> take(1) + } } self.controllerNode.shareExternal = { [weak self] in if let strongSelf = self { diff --git a/submodules/TelegramUI/TelegramUI/ShareControllerNode.swift b/submodules/TelegramUI/TelegramUI/ShareControllerNode.swift index 257ba16385..2c513d1eff 100644 --- a/submodules/TelegramUI/TelegramUI/ShareControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ShareControllerNode.swift @@ -30,6 +30,7 @@ final class ShareControllerNode: ViewControllerTracingNode, UIScrollViewDelegate private let defaultAction: ShareControllerAction? private let requestLayout: (ContainedViewLayoutTransition) -> Void + private let presentError: (String?, String) -> Void private var containerLayout: (ContainerViewLayout, CGFloat, CGFloat)? @@ -70,11 +71,12 @@ final class ShareControllerNode: ViewControllerTracingNode, UIScrollViewDelegate private var hapticFeedback: HapticFeedback? - init(sharedContext: SharedAccountContext, defaultAction: ShareControllerAction?, requestLayout: @escaping (ContainedViewLayoutTransition) -> Void, externalShare: Bool, immediateExternalShare: Bool) { + init(sharedContext: SharedAccountContext, defaultAction: ShareControllerAction?, requestLayout: @escaping (ContainedViewLayoutTransition) -> Void, presentError: @escaping (String?, String) -> Void, externalShare: Bool, immediateExternalShare: Bool) { self.sharedContext = sharedContext self.presentationData = sharedContext.currentPresentationData.with { $0 } self.externalShare = externalShare self.immediateExternalShare = immediateExternalShare + self.presentError = presentError self.defaultAction = defaultAction self.requestLayout = requestLayout @@ -500,6 +502,15 @@ final class ShareControllerNode: ViewControllerTracingNode, UIScrollViewDelegate defaultAction.action() } } else { + if !self.inputFieldNode.text.isEmpty { + for peer in self.controllerInteraction!.selectedPeers { + if let channel = peer.peer as? TelegramChannel, channel.isRestrictedBySlowmode { + self.presentError(channel.title, self.presentationData.strings.Share_MultipleMessagesDisabled) + return + } + } + } + self.inputFieldNode.deactivateInput() let transition = ContainedViewLayoutTransition.animated(duration: 0.12, curve: .easeInOut) transition.updateAlpha(node: self.actionButtonNode, alpha: 0.0) diff --git a/submodules/TelegramUI/TelegramUI/ShareControllerPeerGridItem.swift b/submodules/TelegramUI/TelegramUI/ShareControllerPeerGridItem.swift index 1bb990c5d1..447842c54c 100644 --- a/submodules/TelegramUI/TelegramUI/ShareControllerPeerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ShareControllerPeerGridItem.swift @@ -111,7 +111,7 @@ final class ShareControllerPeerGridItem: GridItem { func node(layout: GridNodeLayout, synchronousLoad: Bool) -> GridItemNode { let node = ShareControllerPeerGridItemNode() node.controllerInteraction = self.controllerInteraction - node.setup(account: self.account, theme: self.theme, strings: self.strings, peer: self.peer, presence: self.presence, search: self.search, synchronousLoad: synchronousLoad) + node.setup(account: self.account, theme: self.theme, strings: self.strings, peer: self.peer, presence: self.presence, search: self.search, synchronousLoad: synchronousLoad, force: false) return node } @@ -121,13 +121,14 @@ final class ShareControllerPeerGridItem: GridItem { return } node.controllerInteraction = self.controllerInteraction - node.setup(account: self.account, theme: self.theme, strings: self.strings, peer: self.peer, presence: self.presence, search: self.search, synchronousLoad: false) + node.setup(account: self.account, theme: self.theme, strings: self.strings, peer: self.peer, presence: self.presence, search: self.search, synchronousLoad: false, force: false) } } final class ShareControllerPeerGridItemNode: GridItemNode { - private var currentState: (Account, RenderedPeer, Bool, PeerPresence?)? + private var currentState: (Account, PresentationTheme, PresentationStrings, RenderedPeer, Bool, PeerPresence?)? private let peerNode: SelectablePeerNode + private var presenceManager: PeerPresenceStatusManager? var controllerInteraction: ShareControllerInteraction? @@ -138,7 +139,7 @@ final class ShareControllerPeerGridItemNode: GridItemNode { self.peerNode.toggleSelection = { [weak self] in if let strongSelf = self { - if let (_, peer, search, _) = strongSelf.currentState { + if let (_, _, _, peer, search, _) = strongSelf.currentState { if let _ = peer.peers[peer.peerId] { strongSelf.controllerInteraction?.togglePeer(peer, search) } @@ -146,10 +147,16 @@ final class ShareControllerPeerGridItemNode: GridItemNode { } } self.addSubnode(self.peerNode) + self.presenceManager = PeerPresenceStatusManager(update: { [weak self] in + guard let strongSelf = self, let currentState = strongSelf.currentState else { + return + } + strongSelf.setup(account: currentState.0, theme: currentState.1, strings: currentState.2, peer: currentState.3, presence: currentState.5, search: currentState.4, synchronousLoad: false, force: true) + }) } - func setup(account: Account, theme: PresentationTheme, strings: PresentationStrings, peer: RenderedPeer, presence: PeerPresence?, search: Bool, synchronousLoad: Bool) { - if self.currentState == nil || self.currentState!.0 !== account || self.currentState!.1 != peer || !arePeerPresencesEqual(self.currentState!.3, presence) { + func setup(account: Account, theme: PresentationTheme, strings: PresentationStrings, peer: RenderedPeer, presence: PeerPresence?, search: Bool, synchronousLoad: Bool, force: Bool) { + if force || self.currentState == nil || self.currentState!.0 !== account || self.currentState!.3 != peer || !arePeerPresencesEqual(self.currentState!.5, presence) { let itemTheme = SelectablePeerNodeTheme(textColor: theme.actionSheet.primaryTextColor, secretTextColor: theme.chatList.secretTitleColor, selectedTextColor: theme.actionSheet.controlAccentColor, checkBackgroundColor: theme.actionSheet.opaqueItemBackgroundColor, checkFillColor: theme.actionSheet.controlAccentColor, checkColor: theme.actionSheet.checkContentColor, avatarPlaceholderColor: theme.list.mediaPlaceholderColor) let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) @@ -163,15 +170,18 @@ final class ShareControllerPeerGridItemNode: GridItemNode { self.peerNode.theme = itemTheme self.peerNode.setup(account: account, theme: theme, strings: strings, peer: peer, online: online, synchronousLoad: synchronousLoad) - self.currentState = (account, peer, search, presence) + self.currentState = (account, theme, strings, peer, search, presence) self.setNeedsLayout() + if let presence = presence as? TelegramUserPresence { + self.presenceManager?.reset(presence: presence) + } } self.updateSelection(animated: false) } func updateSelection(animated: Bool) { var selected = false - if let controllerInteraction = self.controllerInteraction, let (_, peer, _, _) = self.currentState { + if let controllerInteraction = self.controllerInteraction, let (_, _, _, peer, _, _) = self.currentState { selected = controllerInteraction.selectedPeerIds.contains(peer.peerId) } diff --git a/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift b/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift index d78ce5dd23..ab19dc1b29 100644 --- a/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift +++ b/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift @@ -25,7 +25,7 @@ public final class TabBarAccountSwitchController: ViewController { private let sourceNodes: [ASDisplayNode] private var presentationData: PresentationData - private var animatedAppearance = false + private var didPlayPresentationAnimation = false private var changedAccount = false private let hapticFeedback = HapticFeedback() @@ -76,8 +76,8 @@ public final class TabBarAccountSwitchController: ViewController { override public func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - if !self.animatedAppearance { - self.animatedAppearance = true + if !self.didPlayPresentationAnimation { + self.didPlayPresentationAnimation = true self.hapticFeedback.impact() self.controllerNode.animateIn() @@ -97,7 +97,7 @@ public final class TabBarAccountSwitchController: ViewController { public func dismiss(sourceNodes: [ASDisplayNode]) { self.controllerNode.animateOut(sourceNodes: sourceNodes, changedAccount: self.changedAccount, completion: { [weak self] in - self?.animatedAppearance = false + self?.didPlayPresentationAnimation = false self?.presentingViewController?.dismiss(animated: false, completion: nil) }) } diff --git a/submodules/TelegramUI/TelegramUI/TelegramAccountAuxiliaryMethods.swift b/submodules/TelegramUI/TelegramUI/TelegramAccountAuxiliaryMethods.swift index d828e90039..c399d31c5e 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramAccountAuxiliaryMethods.swift +++ b/submodules/TelegramUI/TelegramUI/TelegramAccountAuxiliaryMethods.swift @@ -31,6 +31,8 @@ public let telegramAccountAuxiliaryMethods = AccountAuxiliaryMethods(updatePeerC return fetchOpenInAppIconResource(resource: resource) } else if let resource = resource as? EmojiSpriteResource { return fetchEmojiSpriteResource(postbox: account.postbox, network: account.network, resource: resource) + } else if let resource = resource as? LocalBundleResource { + return fetchLocalBundleResource(postbox: account.postbox, resource: resource) } return nil }, fetchResourceMediaReferenceHash: { resource in diff --git a/submodules/TelegramUI/TelegramUI/TelegramRootController.swift b/submodules/TelegramUI/TelegramUI/TelegramRootController.swift index 52d0cb1b3f..2d4b93296e 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramRootController.swift +++ b/submodules/TelegramUI/TelegramUI/TelegramRootController.swift @@ -32,7 +32,7 @@ public final class TelegramRootController: NavigationController { let image = generateTintedImage(image: UIImage(bundleImageName: "Chat List/EmptyMasterDetailIcon"), color: presentationData.theme.chatList.messageTextColor.withAlphaComponent(0.2)) navigationDetailsBackgroundMode = image != nil ? .image(image!) : nil default: - let image = chatControllerBackgroundImage(wallpaper: presentationData.chatWallpaper, mediaBox: context.account.postbox.mediaBox) + let image = chatControllerBackgroundImage(theme: presentationData.theme, wallpaper: presentationData.chatWallpaper, mediaBox: context.account.postbox.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) navigationDetailsBackgroundMode = image != nil ? .wallpaper(image!) : nil } @@ -49,7 +49,7 @@ public final class TelegramRootController: NavigationController { let image = generateTintedImage(image: UIImage(bundleImageName: "Chat List/EmptyMasterDetailIcon"), color: presentationData.theme.chatList.messageTextColor.withAlphaComponent(0.2)) navigationDetailsBackgroundMode = image != nil ? .image(image!) : nil default: - let image = chatControllerBackgroundImage(wallpaper: presentationData.chatWallpaper, mediaBox: strongSelf.context.account.postbox.mediaBox) + let image = chatControllerBackgroundImage(theme: presentationData.theme, wallpaper: presentationData.chatWallpaper, mediaBox: strongSelf.context.account.postbox.mediaBox, knockoutMode: strongSelf.context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) navigationDetailsBackgroundMode = image != nil ? .wallpaper(image!) : nil } strongSelf.updateBackgroundDetailsMode(navigationDetailsBackgroundMode, transition: .immediate) diff --git a/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift b/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift index a4f3740141..abddfbde77 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift @@ -288,6 +288,15 @@ private func themeAutoNightSettingsControllerEntries(theme: PresentationTheme, s entries.append(.settingInfo(theme, strings.AutoNightTheme_AutomaticHelp("\(Int(threshold * 100.0))").0.replacingOccurrences(of: "%%", with: "%"))) } + switch switchSetting.trigger { + case .none: + break + case .timeBased, .brightness: + entries.append(.themeHeader(theme, strings.AutoNightTheme_PreferredTheme)) + entries.append(.themeNightBlue(theme, strings.Appearance_ThemeCarouselTintedNight, switchSetting.theme == .nightAccent)) + entries.append(.themeNight(theme, strings.Appearance_ThemeCarouselNewNight, switchSetting.theme == .night)) + } + return entries } diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridController.swift b/submodules/TelegramUI/TelegramUI/ThemeGridController.swift index ce084deb64..d1b50721f2 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeGridController.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeGridController.swift @@ -189,7 +189,7 @@ final class ThemeGridController: ViewController { var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers themeSpecificChatWallpapers[current.theme.index] = fallbackWallpaper - return PresentationThemeSettings(chatWallpaper: fallbackWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: fallbackWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) })).start() break } @@ -261,7 +261,7 @@ final class ThemeGridController: ViewController { } else { wallpaper = .builtin(WallpaperSettings()) } - return PresentationThemeSettings(chatWallpaper: wallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: [:], themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: wallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: [:], fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) }).start() diff --git a/submodules/TelegramUI/TelegramUI/ThemePreviewController.swift b/submodules/TelegramUI/TelegramUI/ThemePreviewController.swift index 0ddd09631a..1d348832d5 100644 --- a/submodules/TelegramUI/TelegramUI/ThemePreviewController.swift +++ b/submodules/TelegramUI/TelegramUI/ThemePreviewController.swift @@ -89,7 +89,7 @@ final class ThemePreviewController: ViewController { current = PresentationThemeSettings.defaultSettings } - return PresentationThemeSettings(chatWallpaper: .color(0xffffff), theme: .builtin(.day), themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: .color(0xffffff), theme: .builtin(.day), themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) }).start(completed: { [weak self] in if let strongSelf = self { diff --git a/submodules/TelegramUI/TelegramUI/ThemePreviewControllerNode.swift b/submodules/TelegramUI/TelegramUI/ThemePreviewControllerNode.swift index f7b43a032a..8a5435c418 100644 --- a/submodules/TelegramUI/TelegramUI/ThemePreviewControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ThemePreviewControllerNode.swift @@ -130,16 +130,13 @@ class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let peers = SimpleDictionary() let messages = SimpleDictionary() let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: 1) - let peer1 = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer1 = TelegramUser(id: peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer2 = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer2 = TelegramUser(id: peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 1), namespace: 0, id: 0), timestamp: 66003)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer1), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) - // - - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 1), namespace: 0, id: 0), timestamp: 66003)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer1), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) - - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 2), namespace: 0, id: 0), timestamp: 66000)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 2), namespace: 0, id: 0), timestamp: 66000)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let chatNodes = self.chatNodes { @@ -189,27 +186,27 @@ class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let otherPeerId = self.context.account.peerId var peers = SimpleDictionary() var messages = SimpleDictionary() - peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3) - messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyText, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) + messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) let controllerInteraction = ChatControllerInteraction.default let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.previewTheme, wallpaper: self.previewTheme.chat.defaultWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false) - items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) + items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) - items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) + items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) - items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) + items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 14, title: nil, performer: nil, waveform: MemoryBuffer())] let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: nil, attributes: voiceAttributes) items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) - items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) + items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes(rank: nil, isContact: false)), disableDate: false)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let messageNodes = self.messageNodes { @@ -249,6 +246,7 @@ class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { for itemNode in messageNodes { transition.updateFrame(node: itemNode, frame: CGRect(origin: CGPoint(x: 0.0, y: bottomOffset - itemNode.frame.height), size: itemNode.frame.size)) bottomOffset -= itemNode.frame.height + itemNode.updateFrame(itemNode.frame, within: layout.size) } } } diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift index 8ee8b8fbb1..b49f43fc07 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift @@ -24,10 +24,12 @@ private func generateSwatchImage(color: PresentationThemeAccentColor, selected: context.fillEllipse(in: bounds.insetBy(dx: 4.0, dy: 4.0)) context.strokeEllipse(in: bounds.insetBy(dx: 1.0, dy: 1.0)) - context.setFillColor(UIColor.white.cgColor) - context.fillEllipse(in: CGRect(x: 11.0, y: 18.0, width: 4.0, height: 4.0)) - context.fillEllipse(in: CGRect(x: 18.0, y: 18.0, width: 4.0, height: 4.0)) - context.fillEllipse(in: CGRect(x: 25.0, y: 18.0, width: 4.0, height: 4.0)) + if color.baseColor != .white && color.baseColor != .black { + context.setFillColor(UIColor.white.cgColor) + context.fillEllipse(in: CGRect(x: 11.0, y: 18.0, width: 4.0, height: 4.0)) + context.fillEllipse(in: CGRect(x: 18.0, y: 18.0, width: 4.0, height: 4.0)) + context.fillEllipse(in: CGRect(x: 25.0, y: 18.0, width: 4.0, height: 4.0)) + } } else { context.fillEllipse(in: bounds) } diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift index 8f0365f202..7d00d9436d 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift @@ -112,7 +112,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode { return { item, params, neighbors in var updatedBackgroundImage: UIImage? if currentItem?.wallpaper != item.wallpaper { - updatedBackgroundImage = chatControllerBackgroundImage(wallpaper: item.wallpaper, mediaBox: item.context.sharedContext.accountManager.mediaBox) + updatedBackgroundImage = chatControllerBackgroundImage(theme: item.theme, wallpaper: item.wallpaper, mediaBox: item.context.sharedContext.accountManager.mediaBox, knockoutMode: item.context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) } let insets: UIEdgeInsets @@ -145,7 +145,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode { apply(ListViewItemApply(isOnScreen: true)) }) } else { - item1.nodeConfiguredForParams(async: { $0() }, params: params, synchronousLoads: false, previousItem: nil, nextItem: nil, completion: { node, apply in + item1.nodeConfiguredForParams(async: { $0() }, params: params, synchronousLoads: true, previousItem: nil, nextItem: nil, completion: { node, apply in node1 = node apply().1(ListViewItemApply(isOnScreen: true)) }) @@ -164,7 +164,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode { apply(ListViewItemApply(isOnScreen: true)) }) } else { - item2.nodeConfiguredForParams(async: { $0() }, params: params, synchronousLoads: false, previousItem: nil, nextItem: nil, completion: { node, apply in + item2.nodeConfiguredForParams(async: { $0() }, params: params, synchronousLoads: true, previousItem: nil, nextItem: nil, completion: { node, apply in node2 = node apply().1(ListViewItemApply(isOnScreen: true)) }) @@ -194,7 +194,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode { if node1.supernode == nil { strongSelf.containerNode.addSubnode(node1) } - node1.frame = CGRect(origin: CGPoint(x: 0.0, y: topOffset), size: node1.frame.size) + node1.updateFrame(CGRect(origin: CGPoint(x: 0.0, y: topOffset), size: node1.frame.size), within: layoutSize) topOffset += node1.frame.size.height } @@ -203,7 +203,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode { if node2.supernode == nil { strongSelf.containerNode.addSubnode(node2) } - node2.frame = CGRect(origin: CGPoint(x: 0.0, y: topOffset), size: node2.frame.size) + node2.updateFrame(CGRect(origin: CGPoint(x: 0.0, y: topOffset), size: node2.frame.size), within: layoutSize) topOffset += node2.frame.size.height } diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsColorSliderNode.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsColorSliderNode.swift index 7cb291d85a..3cbee0c775 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsColorSliderNode.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsColorSliderNode.swift @@ -131,6 +131,7 @@ final class ThemeSettingsColorSliderNode: ASDisplayNode { private let brightnessKnobNode: ThemeSettingsColorKnobNode private var validLayout: CGSize? + private var panning = false var valueChanged: ((CGFloat) -> Void)? @@ -143,6 +144,7 @@ final class ThemeSettingsColorSliderNode: ASDisplayNode { } var _value: CGFloat = 0.5 + var lastReportedValue: CGFloat? var value: CGFloat { get { @@ -196,7 +198,9 @@ final class ThemeSettingsColorSliderNode: ASDisplayNode { let inset: CGFloat = 16.0 transition.updateFrame(node: self.brightnessNode, frame: CGRect(x: inset, y: floor((size.height - 30.0) / 2.0), width: size.width - inset * 2.0, height: 30.0)) - self.updateKnobLayout(size: size, transition: .immediate) + if !self.panning { + self.updateKnobLayout(size: size, transition: .immediate) + } } @objc private func brightnessPan(_ recognizer: UIPanGestureRecognizer) { @@ -213,18 +217,27 @@ final class ThemeSettingsColorSliderNode: ASDisplayNode { var ended = false switch recognizer.state { case .changed: + self.panning = true self.updateKnobLayout(size: size, transition: .immediate) recognizer.setTranslation(CGPoint(), in: recognizer.view) case .ended: self.updateKnobLayout(size: size, transition: .immediate) + self.panning = false ended = true default: break } - if self.value != previousValue || ended { + var update = true + if let lastReportedValue = self.lastReportedValue, abs(self.value - lastReportedValue) < 0.05 { + update = false + } + + if update || ended { self.update() self.valueChanged?(self.value) + self.lastReportedValue = self.value + print("upda") } } } diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift index 184ec16af6..703288c859 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift @@ -67,7 +67,6 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { case wallpaper(PresentationTheme, String) case accentColor(PresentationTheme, String, PresentationThemeAccentColor?) case autoNightTheme(PresentationTheme, String, String) - case themeTint(PresentationTheme, String, Bool) case themeItem(PresentationTheme, PresentationStrings, [PresentationThemeReference], PresentationThemeReference, [Int64: PresentationThemeAccentColor], PresentationThemeAccentColor?, Bool) case iconHeader(PresentationTheme, String) case iconItem(PresentationTheme, PresentationStrings, [PresentationAppIcon], String?) @@ -78,7 +77,7 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { var section: ItemListSectionId { switch self { - case .themeListHeader, .chatPreview, .themeItem, .themeTint, .accentColor: + case .themeListHeader, .chatPreview, .themeItem, .accentColor: return ThemeSettingsControllerSection.chatPreview.rawValue case .fontSizeHeader, .fontSize: return ThemeSettingsControllerSection.fontSize.rawValue @@ -99,8 +98,6 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { return 1 case .themeItem: return 2 - case .themeTint: - return 3 case .accentColor: return 4 case .wallpaper: @@ -140,12 +137,6 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { } else { return false } - case let .themeTint(lhsTheme, lhsTitle, lhsValue): - if case let .themeTint(rhsTheme, rhsTitle, rhsValue) = rhs, lhsTheme === rhsTheme, lhsTitle == rhsTitle, lhsValue == rhsValue { - return true - } else { - return false - } case let .accentColor(lhsTheme, lhsText, lhsColor): if case let .accentColor(rhsTheme, rhsText, rhsColor) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsColor == rhsColor { return true @@ -239,10 +230,6 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { return ItemListDisclosureItem(theme: theme, title: text, label: "", sectionId: self.section, style: .blocks, action: { arguments.openWallpaperSettings() }) - case let .themeTint(theme, title, value): - return ItemListSwitchItem(theme: theme, title: title, value: value, sectionId: self.section, style: .blocks, updated: { value in - arguments.toggleLargeEmoji(value) - }, tag: ThemeSettingsEntryTag.tint) case let .accentColor(theme, _, color): var colors = PresentationThemeBaseColor.allCases if theme.overallDarkAppearance { @@ -257,7 +244,7 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { return ThemeSettingsAccentColorItem(theme: theme, sectionId: self.section, colors: colors, currentColor: color ?? PresentationThemeAccentColor(baseColor: .blue, value: 0.5), updated: { color in arguments.selectAccentColor(color) }, toggleSlider: { baseColor in - arguments.toggleColorSlider(baseColor == .white) + arguments.toggleColorSlider(baseColor == .white || baseColor == .black) }, tag: ThemeSettingsEntryTag.accentColor) case let .autoNightTheme(theme, text, value): return ItemListDisclosureItem(theme: theme, icon: nil, title: text, label: value, labelStyle: .text, sectionId: self.section, style: .blocks, disclosureStyle: .arrow, action: { @@ -388,16 +375,16 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The chatWallpaper = themeSpecificWallpaper } else { let accentColor = current.themeSpecificAccentColors[theme.index]?.color ?? defaultDayAccentColor - let theme = makePresentationTheme(themeReference: theme, accentColor: accentColor, serviceBackgroundColor: defaultServiceBackgroundColor) + let theme = makePresentationTheme(themeReference: theme, accentColor: accentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: current.themeSpecificAccentColors[theme.index]?.baseColor ?? .blue) chatWallpaper = theme.chat.defaultWallpaper } - return PresentationThemeSettings(chatWallpaper: chatWallpaper, theme: theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: chatWallpaper, theme: theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) }).start() }, selectFontSize: { size in let _ = updatePresentationThemeSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in - return PresentationThemeSettings(chatWallpaper: current.chatWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: size, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: current.chatWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: size, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }).start() }, openWallpaperSettings: { pushControllerImpl?(ThemeGridController(context: context)) @@ -408,7 +395,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers - let theme = makePresentationTheme(themeReference: current.theme, accentColor: color.color, serviceBackgroundColor: defaultServiceBackgroundColor) + let theme = makePresentationTheme(themeReference: current.theme, accentColor: color.color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: color.baseColor) var chatWallpaper = current.chatWallpaper if let wallpaper = current.themeSpecificChatWallpapers[current.theme.index], wallpaper.hasWallpaper { } else { @@ -416,11 +403,11 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The themeSpecificChatWallpapers[current.theme.index] = chatWallpaper } - if color.baseColor == .white { + if color.baseColor == .white || color.baseColor == .black { updateState { $0.withDisplayColorSlider(false) } } - return PresentationThemeSettings(chatWallpaper: chatWallpaper, theme: current.theme, themeSpecificAccentColors: themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: chatWallpaper, theme: current.theme, themeSpecificAccentColors: themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }).start() }, toggleColorSlider: { forceHidden in updateState { $0.withDisplayColorSlider(forceHidden ? false : !$0.displayColorSlider) } @@ -428,11 +415,11 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The pushControllerImpl?(themeAutoNightSettingsController(context: context)) }, toggleLargeEmoji: { largeEmoji in let _ = updatePresentationThemeSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in - return PresentationThemeSettings(chatWallpaper: current.chatWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: current.chatWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: largeEmoji, disableAnimations: current.disableAnimations) }).start() }, disableAnimations: { value in let _ = updatePresentationThemeSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in - return PresentationThemeSettings(chatWallpaper: current.chatWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: value) + return PresentationThemeSettings(chatWallpaper: current.chatWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: value) }).start() }, selectAppIcon: { name in currentAppIconName.set(name) @@ -440,7 +427,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The }) }) - let signal = combineLatest(context.sharedContext.presentationData |> deliverOnMainQueue, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]) |> deliverOnMainQueue, availableAppIcons, currentAppIconName.get() |> deliverOnMainQueue, statePromise.get() |> deliverOnMainQueue) + let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]), availableAppIcons, currentAppIconName.get(), statePromise.get()) |> map { presentationData, sharedData, availableAppIcons, currentAppIconName, state -> (ItemListControllerState, (ItemListNodeState, ThemeSettingsControllerEntry.ItemGenerationArguments)) in let settings = (sharedData.entries[ApplicationSpecificSharedDataKeys.presentationThemeSettings] as? PresentationThemeSettings) ?? PresentationThemeSettings.defaultSettings @@ -450,7 +437,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The let disableAnimations = settings.disableAnimations let accentColor = settings.themeSpecificAccentColors[settings.theme.index]?.color ?? defaultDayAccentColor - let theme = makePresentationTheme(themeReference: settings.theme, accentColor: accentColor, serviceBackgroundColor: defaultServiceBackgroundColor) + let theme = makePresentationTheme(themeReference: settings.theme, accentColor: accentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: settings.themeSpecificAccentColors[settings.theme.index]?.baseColor ?? .blue, preview: true) let wallpaper: TelegramWallpaper if let themeSpecificWallpaper = settings.themeSpecificChatWallpapers[settings.theme.index] { @@ -466,6 +453,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The } let controller = ItemListController(context: context, state: signal) + controller.alwaysSynchronous = true pushControllerImpl = { [weak controller] c in (controller?.navigationController as? NavigationController)?.pushViewController(c) } diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift index d080c1d16e..14a1f7c4aa 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift @@ -359,9 +359,9 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { case .day: name = item.strings.Appearance_ThemeCarouselDay case .night: - name = "Night" //item.strings.Appearance_ThemeCarouselNight + name = item.strings.Appearance_ThemeCarouselNewNight case .nightAccent: - name = "Tinted Night" //item.strings.Appearance_ThemeCarouselNightBlue + name = item.strings.Appearance_ThemeCarouselTintedNight } } else { name = nil diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift b/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift index 7353772c59..3ee92900cb 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift @@ -380,7 +380,7 @@ class WallpaperGalleryController: ViewController { let _ = (updatePresentationThemeSettingsInteractively(accountManager: strongSelf.context.sharedContext.accountManager, { current in var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers themeSpecificChatWallpapers[current.theme.index] = wallpaper - return PresentationThemeSettings(chatWallpaper: wallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: wallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) |> deliverOnMainQueue).start(completed: { self?.dismiss(forceAway: true) }) @@ -655,6 +655,7 @@ class WallpaperGalleryController: ViewController { for itemNode in messageNodes { transition.updateFrame(node: itemNode, frame: CGRect(origin: CGPoint(x: 0.0, y: bottomOffset - itemNode.frame.height), size: itemNode.frame.size)) bottomOffset -= itemNode.frame.height + itemNode.updateFrame(itemNode.frame, within: layout.size) } } } diff --git a/submodules/TelegramUI/TelegramUI/WallpaperUploadManager.swift b/submodules/TelegramUI/TelegramUI/WallpaperUploadManager.swift index a61f51f4e1..4677124776 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperUploadManager.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperUploadManager.swift @@ -139,7 +139,7 @@ final class WallpaperUploadManager { var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers themeSpecificChatWallpapers[current.theme.index] = updatedWallpaper - return PresentationThemeSettings(chatWallpaper: updatedWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, themeTintColors: current.themeTintColors, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: updatedWallpaper, theme: current.theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) })).start() } } diff --git a/submodules/TelegramUI/TelegramUI/WatchRequestHandlers.swift b/submodules/TelegramUI/TelegramUI/WatchRequestHandlers.swift index 6cd3bb247a..bf16a14cbc 100644 --- a/submodules/TelegramUI/TelegramUI/WatchRequestHandlers.swift +++ b/submodules/TelegramUI/TelegramUI/WatchRequestHandlers.swift @@ -212,7 +212,7 @@ final class WatchSendMessageHandler: WatchRequestHandler { } else if let args = subscription as? TGBridgeSendForwardedMessageSubscription { let peerId = makePeerIdFromBridgeIdentifier(args.targetPeerId) if let forwardPeerId = makePeerIdFromBridgeIdentifier(args.peerId) { - messageSignal = .single((.forward(source: MessageId(peerId: forwardPeerId, namespace: Namespaces.Message.Cloud, id: args.messageId), grouping: .none), peerId)) + messageSignal = .single((.forward(source: MessageId(peerId: forwardPeerId, namespace: Namespaces.Message.Cloud, id: args.messageId), grouping: .none, attributes: []), peerId)) } } diff --git a/submodules/TelegramUI/TelegramUI/WebSearchController.swift b/submodules/TelegramUI/TelegramUI/WebSearchController.swift index 7f3ee1b254..1505a37826 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchController.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchController.swift @@ -55,7 +55,7 @@ enum WebSearchMode { } enum WebSearchControllerMode { - case media(completion: (ChatContextResultCollection, TGMediaSelectionContext, TGMediaEditingContext) -> Void) + case media(completion: (ChatContextResultCollection, TGMediaSelectionContext, TGMediaEditingContext, Bool) -> Void) case avatar(initialQuery: String?, completion: (UIImage) -> Void) var mode: WebSearchMode { @@ -231,7 +231,7 @@ final class WebSearchController: ViewController { selectionState.setItem(currentItem, selected: true) } if case let .media(sendSelected) = mode { - sendSelected(results, selectionState, editingState) + sendSelected(results, selectionState, editingState, false) } } }, avatarCompleted: { result in diff --git a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj index d306ee29c2..f709e7065b 100644 --- a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj @@ -34,10 +34,18 @@ 091BEAB3214552D9003AEA30 /* Vision.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D02DADBE2138D76F00116225 /* Vision.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 0921F60B228C8765001A13D7 /* ItemListPlaceholderItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0921F60A228C8765001A13D7 /* ItemListPlaceholderItem.swift */; }; 0921F60E228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0921F60D228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift */; }; + 092A65DB22EF16900032E20C /* lol.tgs in Resources */ = {isa = PBXBuildFile; fileRef = 092A65D522EF16900032E20C /* lol.tgs */; }; + 092A65DC22EF16900032E20C /* thumbsup.tgs in Resources */ = {isa = PBXBuildFile; fileRef = 092A65D622EF16900032E20C /* thumbsup.tgs */; }; + 092A65DD22EF16900032E20C /* meh.tgs in Resources */ = {isa = PBXBuildFile; fileRef = 092A65D722EF16900032E20C /* meh.tgs */; }; + 092A65DE22EF16900032E20C /* confused.tgs in Resources */ = {isa = PBXBuildFile; fileRef = 092A65D822EF16900032E20C /* confused.tgs */; }; + 092A65DF22EF16900032E20C /* celeb.tgs in Resources */ = {isa = PBXBuildFile; fileRef = 092A65D922EF16900032E20C /* celeb.tgs */; }; + 092A65E022EF16900032E20C /* heart.tgs in Resources */ = {isa = PBXBuildFile; fileRef = 092A65DA22EF16900032E20C /* heart.tgs */; }; 092F368D2154AAEA001A9F49 /* SFCompactRounded-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 092F368C2154AAE9001A9F49 /* SFCompactRounded-Semibold.otf */; }; 092F36902157AB46001A9F49 /* ItemListCallListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F368F2157AB46001A9F49 /* ItemListCallListItem.swift */; }; 09310D32213ED5FC0020033A /* anim_ungroup.json in Resources */ = {isa = PBXBuildFile; fileRef = 09310D1A213BC5DE0020033A /* anim_ungroup.json */; }; 09310D33213ED5FC0020033A /* anim_group.json in Resources */ = {isa = PBXBuildFile; fileRef = 09310D1B213BC5DE0020033A /* anim_group.json */; }; + 0940932422E73DFB003846A3 /* ChatSendMessageActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0940932322E73DFB003846A3 /* ChatSendMessageActionSheetController.swift */; }; + 0940932622E73E12003846A3 /* ChatSendMessageActionSheetControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0940932522E73E12003846A3 /* ChatSendMessageActionSheetControllerNode.swift */; }; 0941A9A0210B057200EBE194 /* OpenInActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A99F210B057200EBE194 /* OpenInActionSheetController.swift */; }; 0941A9A4210B0E2E00EBE194 /* OpenInAppIconResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A9A3210B0E2E00EBE194 /* OpenInAppIconResources.swift */; }; 0941A9A6210B822D00EBE194 /* OpenInOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A9A5210B822D00EBE194 /* OpenInOptions.swift */; }; @@ -1265,10 +1273,18 @@ 091954782294754E00E11046 /* AnimatedStickerUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimatedStickerUtils.swift; sourceTree = ""; }; 0921F60A228C8765001A13D7 /* ItemListPlaceholderItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListPlaceholderItem.swift; sourceTree = ""; }; 0921F60D228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageActionUrlAuthController.swift; sourceTree = ""; }; + 092A65D522EF16900032E20C /* lol.tgs */ = {isa = PBXFileReference; lastKnownFileType = file; path = lol.tgs; sourceTree = ""; }; + 092A65D622EF16900032E20C /* thumbsup.tgs */ = {isa = PBXFileReference; lastKnownFileType = file; path = thumbsup.tgs; sourceTree = ""; }; + 092A65D722EF16900032E20C /* meh.tgs */ = {isa = PBXFileReference; lastKnownFileType = file; path = meh.tgs; sourceTree = ""; }; + 092A65D822EF16900032E20C /* confused.tgs */ = {isa = PBXFileReference; lastKnownFileType = file; path = confused.tgs; sourceTree = ""; }; + 092A65D922EF16900032E20C /* celeb.tgs */ = {isa = PBXFileReference; lastKnownFileType = file; path = celeb.tgs; sourceTree = ""; }; + 092A65DA22EF16900032E20C /* heart.tgs */ = {isa = PBXFileReference; lastKnownFileType = file; path = heart.tgs; sourceTree = ""; }; 092F368C2154AAE9001A9F49 /* SFCompactRounded-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SFCompactRounded-Semibold.otf"; sourceTree = ""; }; 092F368F2157AB46001A9F49 /* ItemListCallListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListCallListItem.swift; sourceTree = ""; }; 09310D1A213BC5DE0020033A /* anim_ungroup.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_ungroup.json; sourceTree = ""; }; 09310D1B213BC5DE0020033A /* anim_group.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_group.json; sourceTree = ""; }; + 0940932322E73DFB003846A3 /* ChatSendMessageActionSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatSendMessageActionSheetController.swift; sourceTree = ""; }; + 0940932522E73E12003846A3 /* ChatSendMessageActionSheetControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatSendMessageActionSheetControllerNode.swift; sourceTree = ""; }; 0941A99F210B057200EBE194 /* OpenInActionSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInActionSheetController.swift; sourceTree = ""; }; 0941A9A3210B0E2E00EBE194 /* OpenInAppIconResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInAppIconResources.swift; sourceTree = ""; }; 0941A9A5210B822D00EBE194 /* OpenInOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInOptions.swift; sourceTree = ""; }; @@ -2587,6 +2603,20 @@ name = "Animated Stickers"; sourceTree = ""; }; + 092A65D422EF16900032E20C /* Emoji */ = { + isa = PBXGroup; + children = ( + 092A65D522EF16900032E20C /* lol.tgs */, + 092A65D622EF16900032E20C /* thumbsup.tgs */, + 092A65D722EF16900032E20C /* meh.tgs */, + 092A65D822EF16900032E20C /* confused.tgs */, + 092A65D922EF16900032E20C /* celeb.tgs */, + 092A65DA22EF16900032E20C /* heart.tgs */, + ); + name = Emoji; + path = TelegramUI/Resources/Emoji; + sourceTree = ""; + }; 092F368B2154AAD6001A9F49 /* Fonts */ = { isa = PBXGroup; children = ( @@ -3241,6 +3271,7 @@ D0471B521EFD8EBC0074D609 /* Resources */ = { isa = PBXGroup; children = ( + 092A65D422EF16900032E20C /* Emoji */, 09E2D9ED226F1AF300EA0AA4 /* Emoji.mapping */, D0955FB32191278C00F89427 /* PresentationStrings.mapping */, 09310D13213BC5DE0020033A /* Animations */, @@ -4710,6 +4741,8 @@ D0AF32391FB1D8D60097362B /* ChatOverlayNavigationBar.swift */, D0BCC3D320404CC7008126C2 /* ChatMessageActionSheetController.swift */, D0BCC3D520404CD8008126C2 /* ChatMessageActionSheetControllerNode.swift */, + 0940932322E73DFB003846A3 /* ChatSendMessageActionSheetController.swift */, + 0940932522E73E12003846A3 /* ChatSendMessageActionSheetControllerNode.swift */, D0F69E181D6B8AD10046BCD6 /* Items */, D03ADB461D703250005A521C /* Interface State */, D03ADB491D704427005A521C /* Accessory Panels */, @@ -5267,6 +5300,7 @@ buildActionMask = 2147483647; files = ( 09874E4F21078FA100E190B8 /* Generic.html in Resources */, + 092A65E022EF16900032E20C /* heart.tgs in Resources */, 09874E5021078FA100E190B8 /* GenericUserScript.js in Resources */, 09874E5121078FA100E190B8 /* Instagram.html in Resources */, 09874E5221078FA100E190B8 /* Twitch.html in Resources */, @@ -5282,6 +5316,7 @@ D0EB42051F3143AB00838FE6 /* LegacyComponentsResources.bundle in Resources */, D0E9BAA21F056F4C00F079A4 /* stp_card_discover@3x.png in Resources */, D0E9BAB01F056F4C00F079A4 /* stp_card_mastercard@3x.png in Resources */, + 092A65DF22EF16900032E20C /* celeb.tgs in Resources */, 09310D32213ED5FC0020033A /* anim_ungroup.json in Resources */, 09E2D9EF226F1AFA00EA0AA4 /* Emoji.mapping in Resources */, D0955FB521912B6000F89427 /* PresentationStrings.mapping in Resources */, @@ -5304,12 +5339,14 @@ D0F972101FFE4BD5002595C8 /* MessageSent.caf in Resources */, D0E9BAB71F056F4C00F079A4 /* stp_card_visa_template@2x.png in Resources */, D0E9BA951F056F4C00F079A4 /* stp_card_applepay@2x.png in Resources */, + 092A65DB22EF16900032E20C /* lol.tgs in Resources */, D0E9BAA01F056F4C00F079A4 /* stp_card_diners_template@3x.png in Resources */, 094735132275D72100EA2312 /* anim_delete.json in Resources */, 094735192277483C00EA2312 /* anim_infotip.json in Resources */, 094735142275D72100EA2312 /* anim_unarchive.json in Resources */, D0E9BAAA1F056F4C00F079A4 /* stp_card_form_front@3x.png in Resources */, D0E9BA971F056F4C00F079A4 /* stp_card_applepay_template@2x.png in Resources */, + 092A65DD22EF16900032E20C /* meh.tgs in Resources */, D0E9BAB41F056F4C00F079A4 /* stp_card_placeholder_template@3x.png in Resources */, D0E9BAA71F056F4C00F079A4 /* stp_card_form_back@2x.png in Resources */, D0E9BAB11F056F4C00F079A4 /* stp_card_mastercard_template@2x.png in Resources */, @@ -5322,6 +5359,7 @@ D0E9BAA91F056F4C00F079A4 /* stp_card_form_front@2x.png in Resources */, D0E9BAA41F056F4C00F079A4 /* stp_card_discover_template@3x.png in Resources */, D0E9BAA81F056F4C00F079A4 /* stp_card_form_back@3x.png in Resources */, + 092A65DE22EF16900032E20C /* confused.tgs in Resources */, D0E9BAA11F056F4C00F079A4 /* stp_card_discover@2x.png in Resources */, D0E9B9EA1F00853C00F079A4 /* PhoneCountries.txt in Resources */, 094735152275D72100EA2312 /* anim_unpin.json in Resources */, @@ -5340,6 +5378,7 @@ D0AF797822C2E26500CECCB8 /* meson.build in Resources */, D0E9BA9B1F056F4C00F079A4 /* stp_card_cvc_amex@2x.png in Resources */, D0E9BAB61F056F4C00F079A4 /* stp_card_visa@3x.png in Resources */, + 092A65DC22EF16900032E20C /* thumbsup.tgs in Resources */, D0E9BAA61F056F4C00F079A4 /* stp_card_form_applepay@3x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -6187,6 +6226,7 @@ 09F215A422649C2200AEDF6D /* PasscodeEntryLabelNode.swift in Sources */, D099D74D1EEFEE1500A3128C /* GameController.swift in Sources */, 09749BCF21F236F2008FDDE9 /* ModernCheckNode.swift in Sources */, + 0940932422E73DFB003846A3 /* ChatSendMessageActionSheetController.swift in Sources */, D0EC6E2C1EB9F58900EBF1C3 /* ComposeControllerNode.swift in Sources */, D0EC6E2D1EB9F58900EBF1C3 /* CounterContollerTitleView.swift in Sources */, D0AEAE292080FD660013176E /* StickerPaneSearchGlobaltem.swift in Sources */, @@ -6226,6 +6266,7 @@ D0EC6E3F1EB9F58900EBF1C3 /* ItemListTextItem.swift in Sources */, D0EC6E401EB9F58900EBF1C3 /* ItemListActivityTextItem.swift in Sources */, 0958FBB9218AD6AF00E0CBD8 /* InstantPageFeedbackItem.swift in Sources */, + 0940932622E73E12003846A3 /* ChatSendMessageActionSheetControllerNode.swift in Sources */, D00817D022B47A14008A895F /* WakeupManager.swift in Sources */, D0AF798822C2E26500CECCB8 /* matrix.cc in Sources */, D0EC6E411EB9F58900EBF1C3 /* ItemListEditableItem.swift in Sources */, diff --git a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift index 37d8e96724..db4b0b83bc 100644 --- a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift @@ -7,16 +7,20 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { public var skipReadHistory: Bool public var crashOnLongQueries: Bool public var chatListPhotos: Bool + public var playAnimatedEmojiOnce: Bool + public var knockoutWallpaper: Bool public static var defaultSettings: ExperimentalUISettings { - return ExperimentalUISettings(keepChatNavigationStack: false, skipReadHistory: false, crashOnLongQueries: false, chatListPhotos: false) + return ExperimentalUISettings(keepChatNavigationStack: false, skipReadHistory: false, crashOnLongQueries: false, chatListPhotos: false, playAnimatedEmojiOnce: false, knockoutWallpaper: false) } - public init(keepChatNavigationStack: Bool, skipReadHistory: Bool, crashOnLongQueries: Bool, chatListPhotos: Bool) { + public init(keepChatNavigationStack: Bool, skipReadHistory: Bool, crashOnLongQueries: Bool, chatListPhotos: Bool, playAnimatedEmojiOnce: Bool, knockoutWallpaper: Bool) { self.keepChatNavigationStack = keepChatNavigationStack self.skipReadHistory = skipReadHistory self.crashOnLongQueries = crashOnLongQueries self.chatListPhotos = chatListPhotos + self.playAnimatedEmojiOnce = playAnimatedEmojiOnce + self.knockoutWallpaper = knockoutWallpaper } public init(decoder: PostboxDecoder) { @@ -24,6 +28,8 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { self.skipReadHistory = decoder.decodeInt32ForKey("skipReadHistory", orElse: 0) != 0 self.crashOnLongQueries = decoder.decodeInt32ForKey("crashOnLongQueries", orElse: 0) != 0 self.chatListPhotos = decoder.decodeInt32ForKey("chatListPhotos", orElse: 0) != 0 + self.playAnimatedEmojiOnce = decoder.decodeInt32ForKey("playAnimatedEmojiOnce", orElse: 0) != 0 + self.knockoutWallpaper = decoder.decodeInt32ForKey("knockoutWallpaper", orElse: 0) != 0 } public func encode(_ encoder: PostboxEncoder) { @@ -31,6 +37,8 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { encoder.encodeInt32(self.skipReadHistory ? 1 : 0, forKey: "skipReadHistory") encoder.encodeInt32(self.crashOnLongQueries ? 1 : 0, forKey: "crashOnLongQueries") encoder.encodeInt32(self.chatListPhotos ? 1 : 0, forKey: "chatListPhotos") + encoder.encodeInt32(self.playAnimatedEmojiOnce ? 1 : 0, forKey: "playAnimatedEmojiOnce") + encoder.encodeInt32(self.knockoutWallpaper ? 1 : 0, forKey: "knockoutWallpaper") } public func isEqual(to: PreferencesEntry) -> Bool { diff --git a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift index 1bfc720441..95605378f2 100644 --- a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift @@ -207,27 +207,54 @@ public enum PresentationThemeBaseColor: Int32, CaseIterable { return UIColor(rgb: value) } + public var outgoingGradientColors: (UIColor, UIColor) { + switch self { + case .blue: + return (UIColor(rgb: 0x63BFFB), UIColor(rgb: 0x007AFF)) + case .cyan: + return (UIColor(rgb: 0x5CE0E9), UIColor(rgb: 0x00C2ED)) + case .green: + return (UIColor(rgb: 0x93D374), UIColor(rgb: 0x29B327)) + case .pink: + return (UIColor(rgb: 0xE296C1), UIColor(rgb: 0xEB6CA4)) + case .orange: + return (UIColor(rgb: 0xF2A451), UIColor(rgb: 0xF08200)) + case .purple: + return (UIColor(rgb: 0xAC98E6), UIColor(rgb: 0x9472EE)) + case .red: + return (UIColor(rgb: 0xE06D54), UIColor(rgb: 0xD33213)) + case .yellow: + return (UIColor(rgb: 0xF7DA6B), UIColor(rgb: 0xEDB400)) + case .gray: + return (UIColor(rgb: 0x7D8E9A), UIColor(rgb: 0x6D839E)) + case .black: + return (UIColor(rgb: 0x000000), UIColor(rgb: 0x000000)) + case .white: + return (UIColor(rgb: 0xffffff), UIColor(rgb: 0xffffff)) + } + } + public var edgeColors: (UIColor, UIColor) { let values: (UIColor, UIColor) switch self { case .blue: - values = (UIColor(rgb: 0x003d80), UIColor(rgb: 0x66afff)) + values = (UIColor(rgb: 0x394cb5), UIColor(rgb: 0x7fd3fb)) case .cyan: - values = (UIColor(rgb: 0x00c2ed), UIColor(rgb: 0x00c2ed)) + values = (UIColor(rgb: 0x3472a8), UIColor(rgb: 0x76e8e8)) case .green: - values = (UIColor(rgb: 0x29b327), UIColor(rgb: 0x29b327)) + values = (UIColor(rgb: 0x608236), UIColor(rgb: 0xb1e786)) case .pink: - values = (UIColor(rgb: 0xeb6ca4), UIColor(rgb: 0xeb6ca4)) + values = (UIColor(rgb: 0xad4974), UIColor(rgb: 0xeca2d0)) case .orange: - values = (UIColor(rgb: 0xf08200), UIColor(rgb: 0xf08200)) + values = (UIColor(rgb: 0xbe5d29), UIColor(rgb: 0xf3ae68)) case .purple: - values = (UIColor(rgb: 0x9472ee), UIColor(rgb: 0x9472ee)) + values = (UIColor(rgb: 0x544292), UIColor(rgb: 0xb2a3e3)) case .red: - values = (UIColor(rgb: 0xd33213), UIColor(rgb: 0xd33213)) + values = (UIColor(rgb: 0x94211b), UIColor(rgb: 0xe47e66)) case .yellow: - values = (UIColor(rgb: 0xedb400), UIColor(rgb: 0xedb400)) + values = (UIColor(rgb: 0xdda23a), UIColor(rgb: 0xfbe589)) case .gray: - values = (UIColor(rgb: 0x6d839e), UIColor(rgb: 0x6d839e)) + values = (UIColor(rgb: 0x595b70), UIColor(rgb: 0x829199)) case .black: values = (UIColor(rgb: 0x000000), UIColor(rgb: 0x000000)) case .white: @@ -274,7 +301,6 @@ public struct PresentationThemeSettings: PreferencesEntry { public var theme: PresentationThemeReference public var themeSpecificAccentColors: [Int64: PresentationThemeAccentColor] public var themeSpecificChatWallpapers: [Int64: TelegramWallpaper] - public var themeTintColors: Bool public var fontSize: PresentationFontSize public var automaticThemeSwitchSetting: AutomaticThemeSwitchSetting public var largeEmoji: Bool @@ -304,15 +330,14 @@ public struct PresentationThemeSettings: PreferencesEntry { } public static var defaultSettings: PresentationThemeSettings { - return PresentationThemeSettings(chatWallpaper: .builtin(WallpaperSettings()), theme: .builtin(.dayClassic), themeSpecificAccentColors: [:], themeSpecificChatWallpapers: [:], themeTintColors: false, fontSize: .regular, automaticThemeSwitchSetting: AutomaticThemeSwitchSetting(trigger: .none, theme: .nightAccent), largeEmoji: true, disableAnimations: true) + return PresentationThemeSettings(chatWallpaper: .builtin(WallpaperSettings()), theme: .builtin(.dayClassic), themeSpecificAccentColors: [:], themeSpecificChatWallpapers: [:], fontSize: .regular, automaticThemeSwitchSetting: AutomaticThemeSwitchSetting(trigger: .none, theme: .nightAccent), largeEmoji: true, disableAnimations: true) } - public init(chatWallpaper: TelegramWallpaper, theme: PresentationThemeReference, themeSpecificAccentColors: [Int64: PresentationThemeAccentColor], themeSpecificChatWallpapers: [Int64: TelegramWallpaper], themeTintColors: Bool, fontSize: PresentationFontSize, automaticThemeSwitchSetting: AutomaticThemeSwitchSetting, largeEmoji: Bool, disableAnimations: Bool) { + public init(chatWallpaper: TelegramWallpaper, theme: PresentationThemeReference, themeSpecificAccentColors: [Int64: PresentationThemeAccentColor], themeSpecificChatWallpapers: [Int64: TelegramWallpaper], fontSize: PresentationFontSize, automaticThemeSwitchSetting: AutomaticThemeSwitchSetting, largeEmoji: Bool, disableAnimations: Bool) { self.chatWallpaper = chatWallpaper self.theme = theme self.themeSpecificAccentColors = themeSpecificAccentColors self.themeSpecificChatWallpapers = themeSpecificChatWallpapers - self.themeTintColors = themeTintColors self.fontSize = fontSize self.automaticThemeSwitchSetting = automaticThemeSwitchSetting self.largeEmoji = largeEmoji @@ -360,8 +385,6 @@ public struct PresentationThemeSettings: PreferencesEntry { self.themeSpecificAccentColors[PresentationThemeReference.builtin(.day).index] = PresentationThemeAccentColor(baseColor: baseColor, value: 0.5) } - self.themeTintColors = decoder.decodeBoolForKey("themeTintColors", orElse: false) - self.fontSize = PresentationFontSize(rawValue: decoder.decodeInt32ForKey("f", orElse: PresentationFontSize.regular.rawValue)) ?? .regular self.automaticThemeSwitchSetting = (decoder.decodeObjectForKey("automaticThemeSwitchSetting", decoder: { AutomaticThemeSwitchSetting(decoder: $0) }) as? AutomaticThemeSwitchSetting) ?? AutomaticThemeSwitchSetting(trigger: .none, theme: .nightAccent) self.largeEmoji = decoder.decodeBoolForKey("largeEmoji", orElse: true) @@ -377,7 +400,6 @@ public struct PresentationThemeSettings: PreferencesEntry { encoder.encodeObjectDictionary(self.themeSpecificChatWallpapers, forKey: "themeSpecificChatWallpapers", keyEncoder: { key, encoder in encoder.encodeInt64(key, forKey: "k") }) - encoder.encodeBool(self.themeTintColors, forKey: "themeTintColors") encoder.encodeInt32(self.fontSize.rawValue, forKey: "f") encoder.encodeObject(self.automaticThemeSwitchSetting, forKey: "automaticThemeSwitchSetting") encoder.encodeBool(self.largeEmoji, forKey: "largeEmoji") @@ -393,7 +415,7 @@ public struct PresentationThemeSettings: PreferencesEntry { } public static func ==(lhs: PresentationThemeSettings, rhs: PresentationThemeSettings) -> Bool { - return lhs.chatWallpaper == rhs.chatWallpaper && lhs.theme == rhs.theme && lhs.themeSpecificAccentColors == rhs.themeSpecificAccentColors && lhs.themeSpecificChatWallpapers == rhs.themeSpecificChatWallpapers && lhs.themeTintColors == rhs.themeTintColors && lhs.fontSize == rhs.fontSize && lhs.automaticThemeSwitchSetting == rhs.automaticThemeSwitchSetting && lhs.largeEmoji == rhs.largeEmoji && lhs.disableAnimations == rhs.disableAnimations + return lhs.chatWallpaper == rhs.chatWallpaper && lhs.theme == rhs.theme && lhs.themeSpecificAccentColors == rhs.themeSpecificAccentColors && lhs.themeSpecificChatWallpapers == rhs.themeSpecificChatWallpapers && lhs.fontSize == rhs.fontSize && lhs.automaticThemeSwitchSetting == rhs.automaticThemeSwitchSetting && lhs.largeEmoji == rhs.largeEmoji && lhs.disableAnimations == rhs.disableAnimations } } diff --git a/submodules/ffmpeg/FFMpeg/FFMpegAVFormatContext.m b/submodules/ffmpeg/FFMpeg/FFMpegAVFormatContext.m index 76c1987031..45b732b4ec 100644 --- a/submodules/ffmpeg/FFMpeg/FFMpegAVFormatContext.m +++ b/submodules/ffmpeg/FFMpeg/FFMpegAVFormatContext.m @@ -39,7 +39,7 @@ int FFMpegCodecIdMPEG4 = AV_CODEC_ID_MPEG4; - (bool)openInput { AVDictionary *options = nil; av_dict_set(&options, "usetoc", "1", 0); - int result = avformat_open_input(&_impl, "http://localhost/file", nil, &options); + int result = avformat_open_input(&_impl, "file", nil, &options); av_dict_free(&options); if (_impl != nil) { _impl->flags |= AVFMT_FLAG_FAST_SEEK;