diff --git a/Makefile b/Makefile
index 786164cc33..2bf1da1109 100644
--- a/Makefile
+++ b/Makefile
@@ -247,7 +247,6 @@ build_verbose: check_env
kill_xcode:
killall Xcode || true
- killall Simulator || true
clean: kill_xcode
sh clean.sh
diff --git a/NotificationService/NotificationService.m b/NotificationService/NotificationService.m
index 54ced01308..81ba2f0015 100644
--- a/NotificationService/NotificationService.m
+++ b/NotificationService/NotificationService.m
@@ -63,9 +63,20 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
return self;
}
+- (void)completeWithContent:(UNNotificationContent * _Nonnull)content {
+ /*NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"org.telegram.Telegram-iOS.background"];
+ NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
+ NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"https://telegram.org"]];
+ [task resume];*/
+
+ if (_contentHandler) {
+ _contentHandler(content);
+ }
+}
+
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
if (_rootPath == nil) {
- contentHandler(request.content);
+ [self completeWithContent:request.content];
return;
}
@@ -289,8 +300,8 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
_bestAttemptContent.attachments = @[attachment];
}
}
- if (_contentHandler && _bestAttemptContent != nil) {
- _contentHandler(_bestAttemptContent);
+ if (_bestAttemptContent != nil) {
+ [self completeWithContent:_bestAttemptContent];
}
} else {
BuildConfig *buildConfig = [[BuildConfig alloc] initWithBaseAppBundleId:_baseAppBundleId];
@@ -322,21 +333,21 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
}
}
- if (strongSelf->_contentHandler && strongSelf->_bestAttemptContent != nil) {
- strongSelf->_contentHandler(strongSelf->_bestAttemptContent);
+ if (strongSelf->_bestAttemptContent != nil) {
+ [strongSelf completeWithContent:strongSelf->_bestAttemptContent];
}
}
});
});
}
} else {
- if (_contentHandler && _bestAttemptContent != nil) {
- _contentHandler(_bestAttemptContent);
+ if (_bestAttemptContent != nil) {
+ [self completeWithContent:_bestAttemptContent];
}
}
} else {
- if (_contentHandler && _bestAttemptContent != nil) {
- _contentHandler(_bestAttemptContent);
+ if (_bestAttemptContent != nil) {
+ [self completeWithContent:_bestAttemptContent];
}
}
}
@@ -349,7 +360,7 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
if (_contentHandler) {
if(_bestAttemptContent) {
- _contentHandler(_bestAttemptContent);
+ [self completeWithContent:_bestAttemptContent];
_bestAttemptContent = nil;
}
_contentHandler = nil;
diff --git a/NotificationService/Serialization.m b/NotificationService/Serialization.m
index a10db76cba..6f6f9191a5 100644
--- a/NotificationService/Serialization.m
+++ b/NotificationService/Serialization.m
@@ -3,7 +3,7 @@
@implementation Serialization
- (NSUInteger)currentLayer {
- return 105;
+ return 106;
}
- (id _Nullable)parseMessage:(NSData * _Nullable)data {
diff --git a/Telegram-iOS.xcworkspace/contents.xcworkspacedata b/Telegram-iOS.xcworkspace/contents.xcworkspacedata
index 9e47100447..cc9df1aaff 100644
--- a/Telegram-iOS.xcworkspace/contents.xcworkspacedata
+++ b/Telegram-iOS.xcworkspace/contents.xcworkspacedata
@@ -277,6 +277,9 @@
+
+
diff --git a/Telegram-iOS.xcworkspace/xcshareddata/xcschemes/Telegram-iOS-Hockeyapp-Internal.xcscheme b/Telegram-iOS.xcworkspace/xcshareddata/xcschemes/Telegram-iOS-Hockeyapp-Internal.xcscheme
index 9eca0c5a86..2d8d12ccdf 100644
--- a/Telegram-iOS.xcworkspace/xcshareddata/xcschemes/Telegram-iOS-Hockeyapp-Internal.xcscheme
+++ b/Telegram-iOS.xcworkspace/xcshareddata/xcschemes/Telegram-iOS-Hockeyapp-Internal.xcscheme
@@ -1,7 +1,7 @@
+ version = "1.8">
@@ -41,15 +41,6 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
-
-
-
-
@@ -72,6 +63,17 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
+
\ No newline at end of file
diff --git a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme
index f7bbe0ae07..b2d194773a 100644
--- a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme
+++ b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme
@@ -706,6 +706,20 @@
ReferencedContainer = "container:submodules/ProgressNavigationButtonNode/ProgressNavigationButtonNode.xcodeproj">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Signal
func openResolvedUrl(_ resolvedUrl: ResolvedUrl, context: AccountContext, urlContext: OpenURLContext, navigationController: NavigationController?, openPeer: @escaping (PeerId, ChatControllerInteractionNavigateToPeer) -> Void, sendFile: ((FileMediaReference) -> Void)?, sendSticker: ((FileMediaReference, ASDisplayNode, CGRect) -> Bool)?, present: @escaping (ViewController, Any?) -> Void, dismissInput: @escaping () -> Void)
func openAddContact(context: AccountContext, firstName: String, lastName: String, phoneNumber: String, label: String, present: @escaping (ViewController, Any?) -> Void, pushController: @escaping (ViewController) -> Void, completed: @escaping () -> Void)
+ func openAddPersonContact(context: AccountContext, peerId: PeerId, present: @escaping (ViewController, Any?) -> Void)
func presentContactsWarningSuppression(context: AccountContext, present: (ViewController, Any?) -> Void)
func navigateToCurrentCall()
diff --git a/submodules/BotPaymentsUI/BotPaymentsUI.xcodeproj/project.pbxproj b/submodules/BotPaymentsUI/BotPaymentsUI.xcodeproj/project.pbxproj
index 3170cf34bc..6de24dd209 100644
--- a/submodules/BotPaymentsUI/BotPaymentsUI.xcodeproj/project.pbxproj
+++ b/submodules/BotPaymentsUI/BotPaymentsUI.xcodeproj/project.pbxproj
@@ -703,6 +703,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -930,6 +943,7 @@
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
1DD70E29EA9CBB5B00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -1379,6 +1393,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -1488,6 +1509,7 @@
E7A30F0497B4D6D800000000
E7A30F04C37F741500000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04A889192100000000
diff --git a/submodules/CallListUI/CallListUI.xcodeproj/project.pbxproj b/submodules/CallListUI/CallListUI.xcodeproj/project.pbxproj
index 796faba925..4ea4000369 100644
--- a/submodules/CallListUI/CallListUI.xcodeproj/project.pbxproj
+++ b/submodules/CallListUI/CallListUI.xcodeproj/project.pbxproj
@@ -422,6 +422,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -631,6 +644,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -935,6 +949,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -1002,6 +1023,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F042417E0B200000000
diff --git a/submodules/CallListUI/Sources/CallListController.swift b/submodules/CallListUI/Sources/CallListController.swift
index 17ac428fbb..b48ac95951 100644
--- a/submodules/CallListUI/Sources/CallListController.swift
+++ b/submodules/CallListUI/Sources/CallListController.swift
@@ -46,7 +46,7 @@ public final class CallListController: ViewController {
self.mode = mode
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
- self.segmentedTitleView = ItemListControllerSegmentedTitleView(segments: [self.presentationData.strings.Calls_All, self.presentationData.strings.Calls_Missed], index: 0, color: self.presentationData.theme.rootController.navigationBar.accentTextColor)
+ self.segmentedTitleView = ItemListControllerSegmentedTitleView(theme: self.presentationData.theme, segments: [self.presentationData.strings.Calls_All, self.presentationData.strings.Calls_Missed], selectedIndex: 0)
super.init(navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData))
@@ -102,7 +102,7 @@ public final class CallListController: ViewController {
private func updateThemeAndStrings() {
let index = self.segmentedTitleView.index
self.segmentedTitleView.segments = [self.presentationData.strings.Calls_All, self.presentationData.strings.Calls_Missed]
- self.segmentedTitleView.color = self.presentationData.theme.rootController.navigationBar.accentTextColor
+ self.segmentedTitleView.theme = self.presentationData.theme
self.segmentedTitleView.index = index
self.tabBarItem.title = self.presentationData.strings.Calls_TabTitle
diff --git a/submodules/ChatListUI/BUCK b/submodules/ChatListUI/BUCK
index 4543d32fe2..b430b2d0bd 100644
--- a/submodules/ChatListUI/BUCK
+++ b/submodules/ChatListUI/BUCK
@@ -37,6 +37,7 @@ static_library(
"//submodules/ContactListUI:ContactListUI",
"//submodules/PhotoResources:PhotoResources",
"//submodules/AppBundle:AppBundle",
+ "//submodules/ContextUI:ContextUI",
],
frameworks = [
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
diff --git a/submodules/ChatListUI/ChatListUI.xcodeproj/project.pbxproj b/submodules/ChatListUI/ChatListUI.xcodeproj/project.pbxproj
index 1390f46a28..2c7f634487 100644
--- a/submodules/ChatListUI/ChatListUI.xcodeproj/project.pbxproj
+++ b/submodules/ChatListUI/ChatListUI.xcodeproj/project.pbxproj
@@ -182,6 +182,17 @@
1DD70E29BE4AC65500000000
+ 1DD70E29308FEF0200000000
+
+ isa
+ PBXFileReference
+ name
+ ChatContextMenus.swift
+ path
+ Sources/ChatContextMenus.swift
+ sourceTree
+ SOURCE_ROOT
+
1DD70E29577C319700000000
isa
@@ -292,6 +303,7 @@
children
B401C9790025222200000000
+ 1DD70E29308FEF0200000000
1DD70E29577C319700000000
1DD70E2943B2E93900000000
1DD70E2906CA893E00000000
@@ -553,6 +565,19 @@
explicitFileType
archive.ar
+ 1DD70E296C9831F100000000
+
+ isa
+ PBXFileReference
+ name
+ libContextUI.a
+ path
+ libContextUI.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29CED1620500000000
isa
@@ -865,6 +890,19 @@
explicitFileType
archive.ar
+ 1DD70E29AD66967300000000
+
+ isa
+ PBXFileReference
+ name
+ libReactionSelectionNode.a
+ path
+ libReactionSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E291D58331200000000
isa
@@ -904,6 +942,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29097DBE9200000000
isa
@@ -1125,6 +1176,19 @@
explicitFileType
archive.ar
+ 1DD70E29F40A586F00000000
+
+ isa
+ PBXFileReference
+ name
+ libTextSelectionNode.a
+ path
+ libTextSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29B4B05B7A00000000
isa
@@ -1213,6 +1277,7 @@
1DD70E2997B4D6D800000000
1DD70E292F91702000000000
1DD70E2931752C6000000000
+ 1DD70E296C9831F100000000
1DD70E29CED1620500000000
1DD70E292417E0B200000000
1DD70E295915423000000000
@@ -1237,9 +1302,11 @@
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
1DD70E293E4DE92B00000000
+ 1DD70E29AD66967300000000
1DD70E291D58331200000000
1DD70E29EA9CBB5B00000000
1DD70E291328E99400000000
+ 1DD70E2957B5522500000000
1DD70E29097DBE9200000000
1DD70E2981AE180900000000
1DD70E29524F478E00000000
@@ -1257,6 +1324,7 @@
1DD70E292395015100000000
1DD70E29BA06E3A600000000
1DD70E29F0C15F9C00000000
+ 1DD70E29F40A586F00000000
1DD70E29B4B05B7A00000000
1DD70E29CD296A8300000000
1DD70E29AE67341000000000
@@ -1390,6 +1458,13 @@
fileRef
1DD70E29BE4AC65500000000
+ E7A30F04308FEF0200000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29308FEF0200000000
+
E7A30F04577C319700000000
isa
@@ -1471,6 +1546,7 @@
E7A30F0428E77D0F00000000
E7A30F04978C105400000000
E7A30F04BE4AC65500000000
+ E7A30F04308FEF0200000000
E7A30F04577C319700000000
E7A30F0443B2E93900000000
E7A30F0406CA893E00000000
@@ -1720,6 +1796,27 @@
fileRef
1DD70E2997B4D6D800000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F04CBE117ED00000000
isa
@@ -1727,6 +1824,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -1762,6 +1866,13 @@
fileRef
1DD70E2931752C6000000000
+ E7A30F04BBAF750C00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29BBAF750C00000000
+
E7A30F041328E99400000000
isa
@@ -1867,13 +1978,6 @@
fileRef
1DD70E29E220F5E800000000
- E7A30F04BBAF750C00000000
-
- isa
- PBXBuildFile
- fileRef
- 1DD70E29BBAF750C00000000
-
E7A30F04247D9AC100000000
isa
@@ -1956,12 +2060,17 @@
E7A30F047AB043C800000000
E7A30F04B6F47D1F00000000
E7A30F0497B4D6D800000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04D233F68C00000000
E7A30F049A24C4DE00000000
E7A30F0431752C6000000000
+ E7A30F04BBAF750C00000000
E7A30F041328E99400000000
E7A30F041E16CC6C00000000
E7A30F043E4DE92B00000000
@@ -1977,7 +2086,6 @@
E7A30F042F91702000000000
E7A30F04CED1620500000000
E7A30F04E220F5E800000000
- E7A30F04BBAF750C00000000
E7A30F04247D9AC100000000
E7A30F04B4B05B7A00000000
E7A30F04490601EB00000000
diff --git a/submodules/ChatListUI/Sources/ChatContextMenus.swift b/submodules/ChatListUI/Sources/ChatContextMenus.swift
new file mode 100644
index 0000000000..50be5f7c80
--- /dev/null
+++ b/submodules/ChatListUI/Sources/ChatContextMenus.swift
@@ -0,0 +1,229 @@
+import Foundation
+import UIKit
+import SwiftSignalKit
+import ContextUI
+import AccountContext
+import Postbox
+import TelegramCore
+import Display
+import TelegramUIPreferences
+import OverlayStatusController
+import AlertUI
+
+func archiveContextMenuItems(context: AccountContext, groupId: PeerGroupId, chatListController: ChatListControllerImpl?) -> Signal<[ContextMenuItem], NoError> {
+ let strings = context.sharedContext.currentPresentationData.with({ $0 }).strings
+ return context.account.postbox.transaction { [weak chatListController] transaction -> [ContextMenuItem] in
+ var items: [ContextMenuItem] = []
+
+ if !transaction.getUnreadChatListPeerIds(groupId: groupId).isEmpty {
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_MarkAllAsRead, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/MarkAsRead"), color: theme.contextMenu.primaryColor) }, action: { [weak chatListController] _, f in
+ let _ = (context.account.postbox.transaction { transaction in
+ markAllChatsAsReadInteractively(transaction: transaction, viewTracker: context.account.viewTracker, groupId: groupId)
+ }
+ |> deliverOnMainQueue).start(completed: {
+ f(.default)
+ })
+ })))
+ }
+
+ let settings = transaction.getPreferencesEntry(key: ApplicationSpecificPreferencesKeys.chatArchiveSettings) as? ChatArchiveSettings ?? ChatArchiveSettings.default
+ let isPinned = !settings.isHiddenByDefault
+ items.append(.action(ContextMenuActionItem(text: isPinned ? strings.ChatList_Context_HideArchive : strings.ChatList_Context_UnhideArchive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: isPinned ? "Chat/Context Menu/Unpin": "Chat/Context Menu/Pin"), color: theme.contextMenu.primaryColor) }, action: { [weak chatListController] _, f in
+ chatListController?.toggleArchivedFolderHiddenByDefault()
+ f(.default)
+ })))
+
+ return items
+ }
+}
+
+enum ChatContextMenuSource {
+ case chatList
+ case search(ChatListSearchContextActionSource)
+}
+
+func chatContextMenuItems(context: AccountContext, peerId: PeerId, source: ChatContextMenuSource, chatListController: ChatListControllerImpl?) -> Signal<[ContextMenuItem], NoError> {
+ let strings = context.sharedContext.currentPresentationData.with({ $0 }).strings
+ return context.account.postbox.transaction { [weak chatListController] transaction -> [ContextMenuItem] in
+ var items: [ContextMenuItem] = []
+
+ if case let .search(search) = source {
+ switch search {
+ case .recentPeers:
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_RemoveFromRecents, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { _, f in
+ let _ = (removeRecentPeer(account: context.account, peerId: peerId)
+ |> deliverOnMainQueue).start(completed: {
+ f(.default)
+ })
+ })))
+ items.append(.separator)
+ case .recentSearch:
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_RemoveFromRecents, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { _, f in
+ let _ = (removeRecentlySearchedPeer(postbox: context.account.postbox, peerId: peerId)
+ |> deliverOnMainQueue).start(completed: {
+ f(.default)
+ })
+ })))
+ items.append(.separator)
+ case .search:
+ break
+ }
+ }
+
+ let isSavedMessages = peerId == context.account.peerId
+
+ let chatPeer = transaction.getPeer(peerId)
+ var peer: Peer?
+ if let chatPeer = chatPeer {
+ if let chatPeer = chatPeer as? TelegramSecretChat {
+ peer = transaction.getPeer(chatPeer.regularPeerId)
+ } else {
+ peer = chatPeer
+ }
+ }
+ if !isSavedMessages, let peer = peer as? TelegramUser {
+ if !transaction.isPeerContact(peerId: peer.id) {
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_AddToContacts, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/AddUser"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ context.sharedContext.openAddPersonContact(context: context, peerId: peerId, present: { controller, arguments in
+ if let chatListController = chatListController {
+ chatListController.present(controller, in: .window(.root), with: arguments)
+ }
+ })
+ f(.default)
+ })))
+ items.append(.separator)
+ }
+ }
+
+ if case .chatList = source, !isSavedMessages {
+ if let readState = transaction.getCombinedPeerReadState(peerId), readState.isUnread {
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_MarkAsRead, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/MarkAsRead"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ let _ = togglePeerUnreadMarkInteractively(postbox: context.account.postbox, viewTracker: context.account.viewTracker, peerId: peerId).start()
+ f(.default)
+ })))
+ } else {
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_MarkAsUnread, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/MarkAsUnread"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ let _ = togglePeerUnreadMarkInteractively(postbox: context.account.postbox, viewTracker: context.account.viewTracker, peerId: peerId).start()
+ f(.default)
+ })))
+ }
+ }
+
+ let groupAndIndex = transaction.getPeerChatListIndex(peerId)
+
+ if let (group, index) = groupAndIndex {
+ if !isSavedMessages {
+ let isArchived = group == Namespaces.PeerGroup.archive
+ items.append(.action(ContextMenuActionItem(text: isArchived ? strings.ChatList_Context_Archive : strings.ChatList_Context_Unarchive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: isArchived ? "Chat/Context Menu/Unarchive" : "Chat/Context Menu/Archive"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ if isArchived {
+ let _ = (context.account.postbox.transaction { transaction -> Void in
+ updatePeerGroupIdInteractively(transaction: transaction, peerId: peerId, groupId: .root)
+ }
+ |> deliverOnMainQueue).start(completed: {
+ f(.default)
+ })
+ } else {
+ if let chatListController = chatListController {
+ chatListController.archiveChats(peerIds: [peerId])
+ f(.default)
+ } else {
+ let _ = (context.account.postbox.transaction { transaction -> Void in
+ updatePeerGroupIdInteractively(transaction: transaction, peerId: peerId, groupId: Namespaces.PeerGroup.archive)
+ }
+ |> deliverOnMainQueue).start(completed: {
+ f(.default)
+ })
+ }
+ }
+ })))
+ }
+
+ let isPinned = index.pinningIndex != nil
+ items.append(.action(ContextMenuActionItem(text: isPinned ? strings.ChatList_Context_Unpin : strings.ChatList_Context_Pin, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: isPinned ? "Chat/Context Menu/Unpin" : "Chat/Context Menu/Pin"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ let _ = (toggleItemPinned(postbox: context.account.postbox, groupId: group, itemId: .peer(peerId))
+ |> deliverOnMainQueue).start(next: { result in
+ switch result {
+ case .done:
+ break
+ case let .limitExceeded(maxCount):
+ break
+ //strongSelf.presentAlert?(strongSelf.currentState.presentationData.strings.DialogList_PinLimitError("\(maxCount)").0)
+ }
+ f(.default)
+ })
+ })))
+
+ if !isSavedMessages, let notificationSettings = transaction.getPeerNotificationSettings(peerId) as? TelegramPeerNotificationSettings {
+ var isMuted = false
+ if case .muted = notificationSettings.muteState {
+ isMuted = true
+ }
+ items.append(.action(ContextMenuActionItem(text: isMuted ? strings.ChatList_Context_Unmute : strings.ChatList_Context_Mute, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: isMuted ? "Chat/Context Menu/Unmute" : "Chat/Context Menu/Muted"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ let _ = (togglePeerMuted(account: context.account, peerId: peerId)
+ |> deliverOnMainQueue).start(completed: {
+ f(.default)
+ })
+ })))
+ }
+ } else {
+ if case .search = source {
+ if let channel = peer as? TelegramChannel {
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_JoinChannel, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Add"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ var createSignal = joinChannel(account: context.account, peerId: peerId)
+ var cancelImpl: (() -> Void)?
+ let progressSignal = Signal { subscriber in
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: {
+ cancelImpl?()
+ }))
+ chatListController?.present(controller, in: .window(.root))
+ return ActionDisposable { [weak controller] in
+ Queue.mainQueue().async() {
+ controller?.dismiss()
+ }
+ }
+ }
+ |> runOn(Queue.mainQueue())
+ |> delay(0.15, queue: Queue.mainQueue())
+ let progressDisposable = progressSignal.start()
+
+ createSignal = createSignal
+ |> afterDisposed {
+ Queue.mainQueue().async {
+ progressDisposable.dispose()
+ }
+ }
+ let joinChannelDisposable = MetaDisposable()
+ cancelImpl = {
+ joinChannelDisposable.set(nil)
+ }
+
+ joinChannelDisposable.set((createSignal
+ |> deliverOnMainQueue).start(next: { _ in
+ if let navigationController = (chatListController?.navigationController as? NavigationController) {
+ context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
+ }
+ }, error: { _ in
+ if let chatListController = chatListController {
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ chatListController.present(textAlertController(context: context, title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
+ }
+ }))
+ f(.default)
+ })))
+ }
+ }
+ }
+
+ if case .chatList = source, groupAndIndex != nil {
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_Delete, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { _, f in
+ if let chatListController = chatListController {
+ chatListController.deletePeerChat(peerId: peerId)
+ }
+ f(.default)
+ })))
+ }
+
+ return items
+ }
+}
diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift
index 8058f1e7ba..ce97d0e0b7 100644
--- a/submodules/ChatListUI/Sources/ChatListController.swift
+++ b/submodules/ChatListUI/Sources/ChatListController.swift
@@ -15,6 +15,7 @@ import TelegramNotices
import SearchUI
import DeleteChatPeerActionSheetItem
import LanguageSuggestionUI
+import ContextUI
import AppBundle
public func useSpecialTabBarIcons() -> Bool {
@@ -65,6 +66,27 @@ private func fixListNodeScrolling(_ listNode: ListView, searchNode: NavigationBa
return false
}
+private final class ContextControllerContentSourceImpl: ContextControllerContentSource {
+ let controller: ViewController
+ weak var sourceNode: ASDisplayNode?
+
+ init(controller: ViewController, sourceNode: ASDisplayNode?) {
+ self.controller = controller
+ self.sourceNode = sourceNode
+ }
+
+ func transitionInfo() -> ContextControllerTakeControllerInfo? {
+ let sourceNode = self.sourceNode
+ return ContextControllerTakeControllerInfo(contentAreaInScreenSpace: CGRect(origin: CGPoint(), size: CGSize(width: 10.0, height: 10.0)), sourceNode: { [weak sourceNode] in
+ if let sourceNode = sourceNode {
+ return (sourceNode, sourceNode.bounds)
+ } else {
+ return nil
+ }
+ })
+ }
+}
+
public class ChatListControllerImpl: TelegramBaseController, ChatListController, UIViewControllerPreviewingDelegate {
private var validLayout: ContainerViewLayout?
@@ -442,240 +464,14 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController,
guard let strongSelf = self else {
return
}
- let _ = (strongSelf.context.account.postbox.transaction { transaction -> Bool in
- var updatedValue = false
- updateChatArchiveSettings(transaction: transaction, { settings in
- var settings = settings
- settings.isHiddenByDefault = !settings.isHiddenByDefault
- updatedValue = settings.isHiddenByDefault
- return settings
- })
- return updatedValue
- }
- |> deliverOnMainQueue).start(next: { value in
- guard let strongSelf = self else {
- return
- }
- strongSelf.chatListDisplayNode.chatListNode.updateState { state in
- var state = state
- if value {
- state.archiveShouldBeTemporaryRevealed = false
- }
- state.peerIdWithRevealedOptions = nil
- return state
- }
- strongSelf.forEachController({ controller in
- if let controller = controller as? UndoOverlayController {
- controller.dismissWithCommitActionAndReplacementAnimation()
- }
- return true
- })
-
- if value {
- strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .hidArchive(title: strongSelf.presentationData.strings.ChatList_UndoArchiveHiddenTitle, text: strongSelf.presentationData.strings.ChatList_UndoArchiveHiddenText, undo: false), elevatedLayout: false, animateInAsReplacement: true, action: { [weak self] shouldCommit in
- guard let strongSelf = self else {
- return
- }
- if !shouldCommit {
- let _ = (strongSelf.context.account.postbox.transaction { transaction -> Bool in
- var updatedValue = false
- updateChatArchiveSettings(transaction: transaction, { settings in
- var settings = settings
- settings.isHiddenByDefault = false
- updatedValue = settings.isHiddenByDefault
- return settings
- })
- return updatedValue
- }).start()
- }
- }), in: .current)
- } else {
- strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .revealedArchive(title: strongSelf.presentationData.strings.ChatList_UndoArchiveRevealedTitle, text: strongSelf.presentationData.strings.ChatList_UndoArchiveRevealedText, undo: false), elevatedLayout: false, animateInAsReplacement: true, action: { _ in
- }), in: .current)
- }
- })
+ strongSelf.toggleArchivedFolderHiddenByDefault()
}
self.chatListDisplayNode.chatListNode.deletePeerChat = { [weak self] peerId in
guard let strongSelf = self else {
return
}
- let _ = (strongSelf.context.account.postbox.transaction { transaction -> RenderedPeer? in
- guard let peer = transaction.getPeer(peerId) else {
- return nil
- }
- if let associatedPeerId = peer.associatedPeerId {
- if let associatedPeer = transaction.getPeer(associatedPeerId) {
- return RenderedPeer(peerId: peerId, peers: SimpleDictionary([peer.id: peer, associatedPeer.id: associatedPeer]))
- } else {
- return nil
- }
- } else {
- return RenderedPeer(peer: peer)
- }
- }
- |> deliverOnMainQueue).start(next: { peer in
- guard let strongSelf = self, let peer = peer, let chatPeer = peer.peers[peer.peerId], let mainPeer = peer.chatMainPeer else {
- return
- }
-
- var canRemoveGlobally = false
- let limitsConfiguration = strongSelf.context.currentLimitsConfiguration.with { $0 }
- if peer.peerId.namespace == Namespaces.Peer.CloudUser && peer.peerId != strongSelf.context.account.peerId {
- if limitsConfiguration.maxMessageRevokeIntervalInPrivateChats == LimitsConfiguration.timeIntervalForever {
- canRemoveGlobally = true
- }
- }
-
- if let user = chatPeer as? TelegramUser, user.botInfo == nil, canRemoveGlobally {
- strongSelf.maybeAskForPeerChatRemoval(peer: peer, completion: { _ in }, removed: {})
- } else {
- let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme)
- var items: [ActionSheetItem] = []
- var canClear = true
- var canStop = false
-
- var deleteTitle = strongSelf.presentationData.strings.Common_Delete
- if let channel = chatPeer as? TelegramChannel {
- if case .broadcast = channel.info {
- canClear = false
- deleteTitle = strongSelf.presentationData.strings.Channel_LeaveChannel
- } else {
- deleteTitle = strongSelf.presentationData.strings.Group_LeaveGroup
- }
- if let addressName = channel.addressName, !addressName.isEmpty {
- canClear = false
- }
- } else if let user = chatPeer as? TelegramUser, user.botInfo != nil {
- canStop = !user.flags.contains(.isSupport)
- canClear = user.botInfo == nil
- deleteTitle = strongSelf.presentationData.strings.ChatList_DeleteChat
- } else if let _ = chatPeer as? TelegramSecretChat {
- deleteTitle = strongSelf.presentationData.strings.ChatList_DeleteChat
- }
-
- var canRemoveGlobally = false
- let limitsConfiguration = strongSelf.context.currentLimitsConfiguration.with { $0 }
- if chatPeer is TelegramUser && chatPeer.id != strongSelf.context.account.peerId {
- if limitsConfiguration.maxMessageRevokeIntervalInPrivateChats == LimitsConfiguration.timeIntervalForever {
- canRemoveGlobally = true
- }
- }
-
- items.append(DeleteChatPeerActionSheetItem(context: strongSelf.context, peer: mainPeer, chatPeer: chatPeer, action: .delete, strings: strongSelf.presentationData.strings))
- if canClear {
- items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.DialogList_ClearHistoryConfirmation, color: .accent, action: { [weak actionSheet] in
- actionSheet?.dismissAnimated()
-
- guard let strongSelf = self else {
- return
- }
-
- let beginClear: (InteractiveHistoryClearingType) -> Void = { type in
- guard let strongSelf = self else {
- return
- }
- strongSelf.chatListDisplayNode.chatListNode.updateState({ state in
- var state = state
- state.pendingClearHistoryPeerIds.insert(peer.peerId)
- return state
- })
- strongSelf.forEachController({ controller in
- if let controller = controller as? UndoOverlayController {
- controller.dismissWithCommitActionAndReplacementAnimation()
- }
- return true
- })
-
- strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .removedChat(text: strongSelf.presentationData.strings.Undo_ChatCleared), elevatedLayout: false, animateInAsReplacement: true, action: { shouldCommit in
- guard let strongSelf = self else {
- return
- }
- if shouldCommit {
- let _ = clearHistoryInteractively(postbox: strongSelf.context.account.postbox, peerId: peerId, type: type).start(completed: {
- guard let strongSelf = self else {
- return
- }
- strongSelf.chatListDisplayNode.chatListNode.updateState({ state in
- var state = state
- state.pendingClearHistoryPeerIds.remove(peer.peerId)
- return state
- })
- })
- } else {
- strongSelf.chatListDisplayNode.chatListNode.updateState({ state in
- var state = state
- state.pendingClearHistoryPeerIds.remove(peer.peerId)
- return state
- })
- }
- }), in: .current)
- }
-
- if canRemoveGlobally {
- let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme)
- var items: [ActionSheetItem] = []
-
- items.append(DeleteChatPeerActionSheetItem(context: strongSelf.context, peer: mainPeer, chatPeer: chatPeer, action: .clearHistory, strings: strongSelf.presentationData.strings))
- items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.ChatList_DeleteForEveryone(mainPeer.compactDisplayTitle).0, color: .destructive, action: { [weak actionSheet] in
- beginClear(.forEveryone)
- actionSheet?.dismissAnimated()
- }))
- items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.ChatList_DeleteForCurrentUser, color: .destructive, action: { [weak actionSheet] in
- beginClear(.forLocalPeer)
- actionSheet?.dismissAnimated()
- }))
-
- actionSheet.setItemGroups([
- ActionSheetItemGroup(items: items),
- ActionSheetItemGroup(items: [
- ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in
- actionSheet?.dismissAnimated()
- })
- ])
- ])
- strongSelf.present(actionSheet, in: .window(.root))
- } else {
- beginClear(.forLocalPeer)
- }
- }))
- }
-
- items.append(ActionSheetButtonItem(title: deleteTitle, color: .destructive, action: { [weak actionSheet] in
- actionSheet?.dismissAnimated()
- guard let strongSelf = self else {
- return
- }
-
- strongSelf.maybeAskForPeerChatRemoval(peer: peer, completion: { _ in }, removed: {})
- }))
-
- if canStop {
- items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.DialogList_DeleteBotConversationConfirmation, color: .destructive, action: { [weak actionSheet] in
- actionSheet?.dismissAnimated()
-
- if let strongSelf = self {
- strongSelf.maybeAskForPeerChatRemoval(peer: peer, completion: { _ in
- }, removed: {
- guard let strongSelf = self else {
- return
- }
- let _ = requestUpdatePeerIsBlocked(account: strongSelf.context.account, peerId: peer.peerId, isBlocked: true).start()
- })
- }
- }))
- }
-
- actionSheet.setItemGroups([ActionSheetItemGroup(items: items),
- ActionSheetItemGroup(items: [
- ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in
- actionSheet?.dismissAnimated()
- })
- ])
- ])
- strongSelf.present(actionSheet, in: .window(.root))
- }
- })
+ strongSelf.deletePeerChat(peerId: peerId)
}
self.chatListDisplayNode.chatListNode.peerSelected = { [weak self] peerId, animated, isAd in
@@ -860,6 +656,36 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController,
self?.toolbarActionSelected(action: action)
}
+ self.chatListDisplayNode.chatListNode.activateChatPreview = { [weak self] item, node, gesture in
+ guard let strongSelf = self else {
+ gesture?.cancel()
+ return
+ }
+ switch item.content {
+ case let .groupReference(groupReference):
+ let chatListController = ChatListControllerImpl(context: strongSelf.context, groupId: groupReference.groupId, controlsHistoryPreload: false, enableDebugActions: false)
+ let contextController = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: .controller(ContextControllerContentSourceImpl(controller: chatListController, sourceNode: node)), items: archiveContextMenuItems(context: strongSelf.context, groupId: groupReference.groupId, chatListController: strongSelf), reactionItems: [], gesture: gesture)
+ strongSelf.presentInGlobalOverlay(contextController)
+ case let .peer(peer):
+ let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peer.peer.peerId), subject: nil, botStart: nil, mode: .standard(previewing: true))
+ chatController.canReadHistory.set(false)
+ let contextController = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node)), items: chatContextMenuItems(context: strongSelf.context, peerId: peer.peer.peerId, source: .chatList, chatListController: strongSelf), reactionItems: [], gesture: gesture)
+ strongSelf.presentInGlobalOverlay(contextController)
+ }
+ }
+
+ self.chatListDisplayNode.peerContextAction = { [weak self] peer, source, node, gesture in
+ guard let strongSelf = self else {
+ gesture?.cancel()
+ return
+ }
+
+ let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peer.id), subject: nil, botStart: nil, mode: .standard(previewing: true))
+ chatController.canReadHistory.set(false)
+ let contextController = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node)), items: chatContextMenuItems(context: strongSelf.context, peerId: peer.id, source: .search(source), chatListController: strongSelf), reactionItems: [], gesture: gesture)
+ strongSelf.presentInGlobalOverlay(contextController)
+ }
+
let context = self.context
let peerIdsAndOptions: Signal<(ChatListSelectionOptions, Set)?, NoError> = self.chatListDisplayNode.chatListNode.state
|> map { state -> Set? in
@@ -951,7 +777,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController,
if #available(iOSApplicationExtension 9.0, iOS 9.0, *) {
if !self.didSetup3dTouch && self.traitCollection.forceTouchCapability != .unknown {
self.didSetup3dTouch = true
- self.registerForPreviewingNonNative(with: self, sourceView: self.view, theme: PeekControllerTheme(presentationTheme: self.presentationData.theme))
+ //self.registerForPreviewingNonNative(with: self, sourceView: self.view, theme: PeekControllerTheme(presentationTheme: self.presentationData.theme))
}
}
}
@@ -1069,6 +895,13 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController,
return true
})
}
+
+ if #available(iOSApplicationExtension 9.0, iOS 9.0, *) {
+ if !self.didSetup3dTouch {
+ self.didSetup3dTouch = true
+ //self.registerForPreviewingNonNative(with: self, sourceView: self.view, theme: PeekControllerTheme(presentationTheme: self.presentationData.theme))
+ }
+ }
}
override public func viewWillDisappear(_ animated: Bool) {
@@ -1448,6 +1281,240 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController,
}
}
+ func toggleArchivedFolderHiddenByDefault() {
+ let _ = (self.context.account.postbox.transaction { transaction -> Bool in
+ var updatedValue = false
+ updateChatArchiveSettings(transaction: transaction, { settings in
+ var settings = settings
+ settings.isHiddenByDefault = !settings.isHiddenByDefault
+ updatedValue = settings.isHiddenByDefault
+ return settings
+ })
+ return updatedValue
+ }
+ |> deliverOnMainQueue).start(next: { [weak self] value in
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.chatListDisplayNode.chatListNode.updateState { state in
+ var state = state
+ if value {
+ state.archiveShouldBeTemporaryRevealed = false
+ }
+ state.peerIdWithRevealedOptions = nil
+ return state
+ }
+ strongSelf.forEachController({ controller in
+ if let controller = controller as? UndoOverlayController {
+ controller.dismissWithCommitActionAndReplacementAnimation()
+ }
+ return true
+ })
+
+ if value {
+ strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .hidArchive(title: strongSelf.presentationData.strings.ChatList_UndoArchiveHiddenTitle, text: strongSelf.presentationData.strings.ChatList_UndoArchiveHiddenText, undo: false), elevatedLayout: false, animateInAsReplacement: true, action: { [weak self] shouldCommit in
+ guard let strongSelf = self else {
+ return
+ }
+ if !shouldCommit {
+ let _ = (strongSelf.context.account.postbox.transaction { transaction -> Bool in
+ var updatedValue = false
+ updateChatArchiveSettings(transaction: transaction, { settings in
+ var settings = settings
+ settings.isHiddenByDefault = false
+ updatedValue = settings.isHiddenByDefault
+ return settings
+ })
+ return updatedValue
+ }).start()
+ }
+ }), in: .current)
+ } else {
+ strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .revealedArchive(title: strongSelf.presentationData.strings.ChatList_UndoArchiveRevealedTitle, text: strongSelf.presentationData.strings.ChatList_UndoArchiveRevealedText, undo: false), elevatedLayout: false, animateInAsReplacement: true, action: { _ in
+ }), in: .current)
+ }
+ })
+ }
+
+ func deletePeerChat(peerId: PeerId) {
+ let _ = (self.context.account.postbox.transaction { transaction -> RenderedPeer? in
+ guard let peer = transaction.getPeer(peerId) else {
+ return nil
+ }
+ if let associatedPeerId = peer.associatedPeerId {
+ if let associatedPeer = transaction.getPeer(associatedPeerId) {
+ return RenderedPeer(peerId: peerId, peers: SimpleDictionary([peer.id: peer, associatedPeer.id: associatedPeer]))
+ } else {
+ return nil
+ }
+ } else {
+ return RenderedPeer(peer: peer)
+ }
+ }
+ |> deliverOnMainQueue).start(next: { [weak self] peer in
+ guard let strongSelf = self, let peer = peer, let chatPeer = peer.peers[peer.peerId], let mainPeer = peer.chatMainPeer else {
+ return
+ }
+
+ var canRemoveGlobally = false
+ let limitsConfiguration = strongSelf.context.currentLimitsConfiguration.with { $0 }
+ if peer.peerId.namespace == Namespaces.Peer.CloudUser && peer.peerId != strongSelf.context.account.peerId {
+ if limitsConfiguration.maxMessageRevokeIntervalInPrivateChats == LimitsConfiguration.timeIntervalForever {
+ canRemoveGlobally = true
+ }
+ }
+
+ if let user = chatPeer as? TelegramUser, user.botInfo == nil, canRemoveGlobally {
+ strongSelf.maybeAskForPeerChatRemoval(peer: peer, completion: { _ in }, removed: {})
+ } else {
+ let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme)
+ var items: [ActionSheetItem] = []
+ var canClear = true
+ var canStop = false
+
+ var deleteTitle = strongSelf.presentationData.strings.Common_Delete
+ if let channel = chatPeer as? TelegramChannel {
+ if case .broadcast = channel.info {
+ canClear = false
+ deleteTitle = strongSelf.presentationData.strings.Channel_LeaveChannel
+ } else {
+ deleteTitle = strongSelf.presentationData.strings.Group_LeaveGroup
+ }
+ if let addressName = channel.addressName, !addressName.isEmpty {
+ canClear = false
+ }
+ } else if let user = chatPeer as? TelegramUser, user.botInfo != nil {
+ canStop = !user.flags.contains(.isSupport)
+ canClear = user.botInfo == nil
+ deleteTitle = strongSelf.presentationData.strings.ChatList_DeleteChat
+ } else if let _ = chatPeer as? TelegramSecretChat {
+ deleteTitle = strongSelf.presentationData.strings.ChatList_DeleteChat
+ }
+
+ var canRemoveGlobally = false
+ let limitsConfiguration = strongSelf.context.currentLimitsConfiguration.with { $0 }
+ if chatPeer is TelegramUser && chatPeer.id != strongSelf.context.account.peerId {
+ if limitsConfiguration.maxMessageRevokeIntervalInPrivateChats == LimitsConfiguration.timeIntervalForever {
+ canRemoveGlobally = true
+ }
+ }
+
+ items.append(DeleteChatPeerActionSheetItem(context: strongSelf.context, peer: mainPeer, chatPeer: chatPeer, action: .delete, strings: strongSelf.presentationData.strings))
+ if canClear {
+ items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.DialogList_ClearHistoryConfirmation, color: .accent, action: { [weak actionSheet] in
+ actionSheet?.dismissAnimated()
+
+ guard let strongSelf = self else {
+ return
+ }
+
+ let beginClear: (InteractiveHistoryClearingType) -> Void = { type in
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.chatListDisplayNode.chatListNode.updateState({ state in
+ var state = state
+ state.pendingClearHistoryPeerIds.insert(peer.peerId)
+ return state
+ })
+ strongSelf.forEachController({ controller in
+ if let controller = controller as? UndoOverlayController {
+ controller.dismissWithCommitActionAndReplacementAnimation()
+ }
+ return true
+ })
+
+ strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .removedChat(text: strongSelf.presentationData.strings.Undo_ChatCleared), elevatedLayout: false, animateInAsReplacement: true, action: { shouldCommit in
+ guard let strongSelf = self else {
+ return
+ }
+ if shouldCommit {
+ let _ = clearHistoryInteractively(postbox: strongSelf.context.account.postbox, peerId: peerId, type: type).start(completed: {
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.chatListDisplayNode.chatListNode.updateState({ state in
+ var state = state
+ state.pendingClearHistoryPeerIds.remove(peer.peerId)
+ return state
+ })
+ })
+ } else {
+ strongSelf.chatListDisplayNode.chatListNode.updateState({ state in
+ var state = state
+ state.pendingClearHistoryPeerIds.remove(peer.peerId)
+ return state
+ })
+ }
+ }), in: .current)
+ }
+
+ if canRemoveGlobally {
+ let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme)
+ var items: [ActionSheetItem] = []
+
+ items.append(DeleteChatPeerActionSheetItem(context: strongSelf.context, peer: mainPeer, chatPeer: chatPeer, action: .clearHistory, strings: strongSelf.presentationData.strings))
+ items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.ChatList_DeleteForEveryone(mainPeer.compactDisplayTitle).0, color: .destructive, action: { [weak actionSheet] in
+ beginClear(.forEveryone)
+ actionSheet?.dismissAnimated()
+ }))
+ items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.ChatList_DeleteForCurrentUser, color: .destructive, action: { [weak actionSheet] in
+ beginClear(.forLocalPeer)
+ actionSheet?.dismissAnimated()
+ }))
+
+ actionSheet.setItemGroups([
+ ActionSheetItemGroup(items: items),
+ ActionSheetItemGroup(items: [
+ ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in
+ actionSheet?.dismissAnimated()
+ })
+ ])
+ ])
+ strongSelf.present(actionSheet, in: .window(.root))
+ } else {
+ beginClear(.forLocalPeer)
+ }
+ }))
+ }
+
+ items.append(ActionSheetButtonItem(title: deleteTitle, color: .destructive, action: { [weak actionSheet] in
+ actionSheet?.dismissAnimated()
+ guard let strongSelf = self else {
+ return
+ }
+
+ strongSelf.maybeAskForPeerChatRemoval(peer: peer, completion: { _ in }, removed: {})
+ }))
+
+ if canStop {
+ items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.DialogList_DeleteBotConversationConfirmation, color: .destructive, action: { [weak actionSheet] in
+ actionSheet?.dismissAnimated()
+
+ if let strongSelf = self {
+ strongSelf.maybeAskForPeerChatRemoval(peer: peer, completion: { _ in
+ }, removed: {
+ guard let strongSelf = self else {
+ return
+ }
+ let _ = requestUpdatePeerIsBlocked(account: strongSelf.context.account, peerId: peer.peerId, isBlocked: true).start()
+ })
+ }
+ }))
+ }
+
+ actionSheet.setItemGroups([ActionSheetItemGroup(items: items),
+ ActionSheetItemGroup(items: [
+ ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in
+ actionSheet?.dismissAnimated()
+ })
+ ])
+ ])
+ strongSelf.present(actionSheet, in: .window(.root))
+ }
+ })
+ }
+
public func maybeAskForPeerChatRemoval(peer: RenderedPeer, deleteGloballyIfPossible: Bool = false, completion: @escaping (Bool) -> Void, removed: @escaping () -> Void) {
guard let chatPeer = peer.peers[peer.peerId], let mainPeer = peer.chatMainPeer else {
completion(false)
@@ -1502,7 +1569,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController,
}
}
- private func archiveChats(peerIds: [PeerId]) {
+ func archiveChats(peerIds: [PeerId]) {
guard !peerIds.isEmpty else {
return
}
diff --git a/submodules/ChatListUI/Sources/ChatListControllerNode.swift b/submodules/ChatListUI/Sources/ChatListControllerNode.swift
index 348cbd8b6b..082ef5cb8f 100644
--- a/submodules/ChatListUI/Sources/ChatListControllerNode.swift
+++ b/submodules/ChatListUI/Sources/ChatListControllerNode.swift
@@ -11,6 +11,7 @@ import ActivityIndicator
import AccountContext
import SearchBarNode
import SearchUI
+import ContextUI
private final class ChatListControllerNodeView: UITracingLayerView, PreviewingHostView {
var previewingDelegate: PreviewingHostViewDelegate? {
@@ -64,6 +65,7 @@ final class ChatListControllerNode: ASDisplayNode {
var requestOpenRecentPeerOptions: ((Peer) -> Void)?
var requestOpenMessageFromSearch: ((Peer, MessageId) -> Void)?
var requestAddContact: ((String) -> Void)?
+ var peerContextAction: ((Peer, ChatListSearchContextActionSource, ASDisplayNode, ContextGesture?) -> Void)?
var dismissSelf: (() -> Void)?
var isEmptyUpdated: ((Bool) -> Void)?
@@ -272,7 +274,7 @@ final class ChatListControllerNode: ASDisplayNode {
if let requestAddContact = self?.requestAddContact {
requestAddContact(phoneNumber)
}
- }), cancel: { [weak self] in
+ }, peerContextAction: self.peerContextAction), cancel: { [weak self] in
if let requestDeactivateSearch = self?.requestDeactivateSearch {
requestDeactivateSearch()
}
diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift
index 31b9d455d2..3130901306 100644
--- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift
+++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift
@@ -13,6 +13,7 @@ import SearchUI
import ContactsPeerItem
import ChatListSearchItemHeader
import ContactListUI
+import ContextUI
private enum ChatListRecentEntryStableId: Hashable {
case topPeers
@@ -77,7 +78,7 @@ private enum ChatListRecentEntry: Comparable, Identifiable {
}
}
- func item(context: AccountContext, filter: ChatListNodePeersFilter, peerSelected: @escaping (Peer) -> Void, peerLongTapped: @escaping (Peer) -> Void, clearRecentlySearchedPeers: @escaping () -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, deletePeer: @escaping (PeerId) -> Void) -> ListViewItem {
+ func item(context: AccountContext, filter: ChatListNodePeersFilter, peerSelected: @escaping (Peer) -> Void, peerLongTapped: @escaping (Peer) -> Void, peerContextAction: ((Peer, ChatListSearchContextActionSource, ASDisplayNode, ContextGesture?) -> Void)?, clearRecentlySearchedPeers: @escaping () -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, deletePeer: @escaping (PeerId) -> Void) -> ListViewItem {
switch self {
case let .topPeers(peers, theme, strings):
return ChatListRecentPeersListItem(theme: theme, strings: strings, account: context.account, peers: peers, peerSelected: { peer in
@@ -173,7 +174,13 @@ private enum ChatListRecentEntry: Comparable, Identifiable {
if let chatPeer = peer.peer.peers[peer.peer.peerId] {
peerSelected(chatPeer)
}
- }, setPeerIdWithRevealedOptions: setPeerIdWithRevealedOptions, deletePeer: deletePeer)
+ }, setPeerIdWithRevealedOptions: setPeerIdWithRevealedOptions, deletePeer: deletePeer, contextAction: peerContextAction.flatMap { peerContextAction in
+ return { node, gesture in
+ if let chatPeer = peer.peer.peers[peer.peer.peerId] {
+ peerContextAction(chatPeer, .recentSearch, node, gesture)
+ }
+ }
+ })
}
}
}
@@ -316,7 +323,7 @@ public enum ChatListSearchEntry: Comparable, Identifiable {
}
}
- public func item(context: AccountContext, enableHeaders: Bool, filter: ChatListNodePeersFilter, interaction: ChatListNodeInteraction) -> ListViewItem {
+ public func item(context: AccountContext, enableHeaders: Bool, filter: ChatListNodePeersFilter, interaction: ChatListNodeInteraction, peerContextAction: ((Peer, ChatListSearchContextActionSource, ASDisplayNode, ContextGesture?) -> Void)?) -> ListViewItem {
switch self {
case let .localPeer(peer, associatedPeer, unreadBadge, _, theme, strings, nameSortOrder, nameDisplayOrder):
let primaryPeer: Peer
@@ -372,6 +379,14 @@ public enum ChatListSearchEntry: Comparable, Identifiable {
return ContactsPeerItem(theme: theme, strings: strings, sortOrder: nameSortOrder, displayOrder: nameDisplayOrder, account: context.account, peerMode: .generalSearch, peer: .peer(peer: primaryPeer, chatPeer: chatPeer), status: .none, badge: badge, enabled: enabled, selection: .none, editing: ContactsPeerItemEditing(editable: false, editing: false, revealed: false), index: nil, header: header, action: { _ in
interaction.peerSelected(peer)
+ }, contextAction: peerContextAction.flatMap { peerContextAction in
+ return { node, gesture in
+ if let chatPeer = chatPeer {
+ peerContextAction(chatPeer, .search, node, gesture)
+ } else {
+ gesture?.cancel()
+ }
+ }
})
case let .globalPeer(peer, unreadBadge, _, theme, strings, nameSortOrder, nameDisplayOrder):
var enabled = true
@@ -416,6 +431,10 @@ public enum ChatListSearchEntry: Comparable, Identifiable {
return ContactsPeerItem(theme: theme, strings: strings, sortOrder: nameSortOrder, displayOrder: nameDisplayOrder, account: context.account, peerMode: .generalSearch, peer: .peer(peer: peer.peer, chatPeer: peer.peer), status: .addressName(suffixString), badge: badge, enabled: enabled, selection: .none, editing: ContactsPeerItemEditing(editable: false, editing: false, revealed: false), index: nil, header: header, action: { _ in
interaction.peerSelected(peer.peer)
+ }, contextAction: peerContextAction.flatMap { peerContextAction in
+ return { node, gesture in
+ peerContextAction(peer.peer, .search, node, gesture)
+ }
})
case let .message(message, peer, readState, presentationData):
return ChatListItem(presentationData: presentationData, context: context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: message.index), content: .peer(message: message, peer: peer, combinedReadState: readState, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: true), editing: false, hasActiveRevealControls: false, selected: false, header: enableHeaders ? ChatListSearchItemHeader(type: .messages, theme: presentationData.theme, strings: presentationData.strings, actionTitle: nil, action: nil) : nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)
@@ -447,22 +466,22 @@ public struct ChatListSearchContainerTransition {
}
}
-private func chatListSearchContainerPreparedRecentTransition(from fromEntries: [ChatListRecentEntry], to toEntries: [ChatListRecentEntry], context: AccountContext, filter: ChatListNodePeersFilter, peerSelected: @escaping (Peer) -> Void, peerLongTapped: @escaping (Peer) -> Void, clearRecentlySearchedPeers: @escaping () -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, deletePeer: @escaping (PeerId) -> Void) -> ChatListSearchContainerRecentTransition {
+private func chatListSearchContainerPreparedRecentTransition(from fromEntries: [ChatListRecentEntry], to toEntries: [ChatListRecentEntry], context: AccountContext, filter: ChatListNodePeersFilter, peerSelected: @escaping (Peer) -> Void, peerLongTapped: @escaping (Peer) -> Void, peerContextAction: ((Peer, ChatListSearchContextActionSource, ASDisplayNode, ContextGesture?) -> Void)?, clearRecentlySearchedPeers: @escaping () -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, deletePeer: @escaping (PeerId) -> Void) -> ChatListSearchContainerRecentTransition {
let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdates(leftList: fromEntries, rightList: toEntries)
let deletions = deleteIndices.map { ListViewDeleteItem(index: $0, directionHint: nil) }
- let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, filter: filter, peerSelected: peerSelected, peerLongTapped: peerLongTapped, clearRecentlySearchedPeers: clearRecentlySearchedPeers, setPeerIdWithRevealedOptions: setPeerIdWithRevealedOptions, deletePeer: deletePeer), directionHint: nil) }
- let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, filter: filter, peerSelected: peerSelected, peerLongTapped: peerLongTapped, clearRecentlySearchedPeers: clearRecentlySearchedPeers, setPeerIdWithRevealedOptions: setPeerIdWithRevealedOptions, deletePeer: deletePeer), directionHint: nil) }
+ let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, filter: filter, peerSelected: peerSelected, peerLongTapped: peerLongTapped, peerContextAction: peerContextAction, clearRecentlySearchedPeers: clearRecentlySearchedPeers, setPeerIdWithRevealedOptions: setPeerIdWithRevealedOptions, deletePeer: deletePeer), directionHint: nil) }
+ let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, filter: filter, peerSelected: peerSelected, peerLongTapped: peerLongTapped, peerContextAction: peerContextAction, clearRecentlySearchedPeers: clearRecentlySearchedPeers, setPeerIdWithRevealedOptions: setPeerIdWithRevealedOptions, deletePeer: deletePeer), directionHint: nil) }
return ChatListSearchContainerRecentTransition(deletions: deletions, insertions: insertions, updates: updates)
}
-public func chatListSearchContainerPreparedTransition(from fromEntries: [ChatListSearchEntry], to toEntries: [ChatListSearchEntry], displayingResults: Bool, context: AccountContext, enableHeaders: Bool, filter: ChatListNodePeersFilter, interaction: ChatListNodeInteraction) -> ChatListSearchContainerTransition {
+public func chatListSearchContainerPreparedTransition(from fromEntries: [ChatListSearchEntry], to toEntries: [ChatListSearchEntry], displayingResults: Bool, context: AccountContext, enableHeaders: Bool, filter: ChatListNodePeersFilter, interaction: ChatListNodeInteraction, peerContextAction: ((Peer, ChatListSearchContextActionSource, ASDisplayNode, ContextGesture?) -> Void)?) -> ChatListSearchContainerTransition {
let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdates(leftList: fromEntries, rightList: toEntries)
let deletions = deleteIndices.map { ListViewDeleteItem(index: $0, directionHint: nil) }
- let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, enableHeaders: enableHeaders, filter: filter, interaction: interaction), directionHint: nil) }
- let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, enableHeaders: enableHeaders, filter: filter, interaction: interaction), directionHint: nil) }
+ let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, enableHeaders: enableHeaders, filter: filter, interaction: interaction, peerContextAction: peerContextAction), directionHint: nil) }
+ let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, enableHeaders: enableHeaders, filter: filter, interaction: interaction, peerContextAction: peerContextAction), directionHint: nil) }
return ChatListSearchContainerTransition(deletions: deletions, insertions: insertions, updates: updates, displayingResults: displayingResults)
}
@@ -517,6 +536,12 @@ private struct ChatListSearchMessagesContext {
let loadMoreIndex: MessageIndex?
}
+public enum ChatListSearchContextActionSource {
+ case recentPeers
+ case recentSearch
+ case search
+}
+
public final class ChatListSearchContainerNode: SearchDisplayControllerContentNode {
private let context: AccountContext
@@ -547,7 +572,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
private let filter: ChatListNodePeersFilter
- public init(context: AccountContext, filter: ChatListNodePeersFilter, groupId: PeerGroupId, openPeer: @escaping (Peer, Bool) -> Void, openRecentPeerOptions: @escaping (Peer) -> Void, openMessage: @escaping (Peer, MessageId) -> Void, addContact: ((String) -> Void)?) {
+ public init(context: AccountContext, filter: ChatListNodePeersFilter, groupId: PeerGroupId, openPeer: @escaping (Peer, Bool) -> Void, openRecentPeerOptions: @escaping (Peer) -> Void, openMessage: @escaping (Peer, MessageId) -> Void, addContact: ((String) -> Void)?, peerContextAction: ((Peer, ChatListSearchContextActionSource, ASDisplayNode, ContextGesture?) -> Void)?) {
self.context = context
self.filter = filter
self.dimNode = ASDisplayNode()
@@ -847,6 +872,19 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
}, updatePeerGrouping: { _, _ in
}, togglePeerMarkedUnread: { _, _ in
}, toggleArchivedFolderHiddenByDefault: {
+ }, activateChatPreview: { item, node, gesture in
+ guard let peerContextAction = peerContextAction else {
+ gesture?.cancel()
+ return
+ }
+ switch item.content {
+ case let .peer(peer):
+ if let peer = peer.peer.peer {
+ peerContextAction(peer, .search, node, gesture)
+ }
+ case .groupReference:
+ gesture?.cancel()
+ }
})
let previousRecentItems = Atomic<[ChatListRecentEntry]?>(value: nil)
@@ -933,7 +971,8 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
self?.recentListNode.clearHighlightAnimated(true)
}, peerLongTapped: { peer in
openRecentPeerOptions(peer)
- }, clearRecentlySearchedPeers: {
+ }, peerContextAction: peerContextAction,
+ clearRecentlySearchedPeers: {
self?.clearRecentSearch()
}, setPeerIdWithRevealedOptions: { peerId, fromPeerId in
interaction.setPeerIdWithRevealedOptions(peerId, fromPeerId)
@@ -954,7 +993,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
let previousEntries = previousSearchItems.swap(entriesAndFlags?.0)
let firstTime = previousEntries == nil
- let transition = chatListSearchContainerPreparedTransition(from: previousEntries ?? [], to: entriesAndFlags?.0 ?? [], displayingResults: entriesAndFlags?.0 != nil, context: context, enableHeaders: true, filter: filter, interaction: interaction)
+ let transition = chatListSearchContainerPreparedTransition(from: previousEntries ?? [], to: entriesAndFlags?.0 ?? [], displayingResults: entriesAndFlags?.0 != nil, context: context, enableHeaders: true, filter: filter, interaction: interaction, peerContextAction: peerContextAction)
strongSelf.enqueueTransition(transition, firstTime: firstTime)
}
}))
diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift
index b31dd70383..622f2f6bdd 100644
--- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift
+++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift
@@ -15,6 +15,7 @@ import LocalizedPeerData
import PeerPresenceStatusManager
import PhotoResources
import ChatListSearchItemNode
+import ContextUI
public enum ChatListItemContent {
case peer(message: Message?, peer: RenderedPeer, combinedReadState: CombinedPeerReadState?, notificationSettings: PeerNotificationSettings?, presence: PeerPresence?, summaryInfo: ChatListMessageTagSummaryInfo, embeddedState: PeerChatListEmbeddedInterfaceState?, inputActivities: [(Peer, PeerInputActivity)]?, isAd: Bool, ignoreUnreadBadge: Bool)
@@ -294,6 +295,8 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
private let backgroundNode: ASDisplayNode
private let highlightedBackgroundNode: ASDisplayNode
+ let contextContainer: ContextControllerSourceNode
+
let avatarNode: AvatarNode
let titleNode: TextNode
let authorNode: TextNode
@@ -410,6 +413,8 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
self.highlightedBackgroundNode = ASDisplayNode()
self.highlightedBackgroundNode.isLayerBacked = true
+ self.contextContainer = ContextControllerSourceNode()
+
self.titleNode = TextNode()
self.titleNode.isUserInteractionEnabled = false
self.titleNode.displaysAsynchronously = true
@@ -457,19 +462,22 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
self.addSubnode(self.backgroundNode)
self.addSubnode(self.separatorNode)
- self.addSubnode(self.avatarNode)
- self.addSubnode(self.onlineNode)
- self.addSubnode(self.titleNode)
- self.addSubnode(self.authorNode)
- self.addSubnode(self.textNode)
- self.addSubnode(self.contentImageNode)
- self.addSubnode(self.dateNode)
- self.addSubnode(self.statusNode)
- self.addSubnode(self.pinnedIconNode)
- self.addSubnode(self.badgeNode)
- self.addSubnode(self.mentionBadgeNode)
- self.addSubnode(self.mutedIconNode)
+ self.addSubnode(self.contextContainer)
+
+ self.contextContainer.addSubnode(self.avatarNode)
+ self.contextContainer.addSubnode(self.onlineNode)
+
+ self.contextContainer.addSubnode(self.titleNode)
+ self.contextContainer.addSubnode(self.authorNode)
+ self.contextContainer.addSubnode(self.textNode)
+ self.contextContainer.addSubnode(self.contentImageNode)
+ self.contextContainer.addSubnode(self.dateNode)
+ self.contextContainer.addSubnode(self.statusNode)
+ self.contextContainer.addSubnode(self.pinnedIconNode)
+ self.contextContainer.addSubnode(self.badgeNode)
+ self.contextContainer.addSubnode(self.mentionBadgeNode)
+ self.contextContainer.addSubnode(self.mutedIconNode)
self.peerPresenceManager = PeerPresenceStatusManager(update: { [weak self] in
if let strongSelf = self, let layoutParams = strongSelf.layoutParams {
@@ -477,6 +485,13 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
let _ = apply(false, false)
}
})
+
+ self.contextContainer.activated = { [weak self] gesture in
+ guard let strongSelf = self, let item = strongSelf.item else {
+ return
+ }
+ item.interaction.activateChatPreview(item, strongSelf, gesture)
+ }
}
func setupItem(item: ChatListItem, synchronousLoads: Bool) {
@@ -1110,6 +1125,8 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
strongSelf.layoutParams = (item, first, last, firstWithHeader, nextIsPinned, params, countersSize)
strongSelf.contentImageMedia = contentImageMedia
+ strongSelf.contextContainer.frame = CGRect(origin: CGPoint(), size: layout.contentSize)
+
var dimensions: CGSize?
if let contentImageMedia = contentImageMedia as? TelegramMediaImage {
dimensions = largestRepresentationForPhoto(contentImageMedia)?.dimensions
@@ -1293,7 +1310,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
iconNode.isLayerBacked = true
iconNode.displaysAsynchronously = false
iconNode.displayWithoutProcessing = true
- strongSelf.addSubnode(iconNode)
+ strongSelf.contextContainer.addSubnode(iconNode)
strongSelf.secretIconNode = iconNode
}
iconNode.image = currentSecretIconImage
@@ -1315,7 +1332,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
iconNode.isLayerBacked = true
iconNode.displaysAsynchronously = false
iconNode.displayWithoutProcessing = true
- strongSelf.addSubnode(iconNode)
+ strongSelf.contextContainer.addSubnode(iconNode)
strongSelf.credibilityIconNode = iconNode
}
iconNode.image = currentCredibilityIconImage
@@ -1352,7 +1369,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
var animateInputActivitiesFrame = false
if let inputActivities = inputActivities, !inputActivities.isEmpty {
if strongSelf.inputActivitiesNode.supernode == nil {
- strongSelf.addSubnode(strongSelf.inputActivitiesNode)
+ strongSelf.contextContainer.addSubnode(strongSelf.inputActivitiesNode)
} else {
animateInputActivitiesFrame = true
}
diff --git a/submodules/ChatListUI/Sources/Node/ChatListNode.swift b/submodules/ChatListUI/Sources/Node/ChatListNode.swift
index eb80cc1fb8..8a26d76ba0 100644
--- a/submodules/ChatListUI/Sources/Node/ChatListNode.swift
+++ b/submodules/ChatListUI/Sources/Node/ChatListNode.swift
@@ -10,6 +10,7 @@ import TelegramUIPreferences
import AccountContext
import TelegramNotices
import ContactsPeerItem
+import ContextUI
public enum ChatListNodeMode {
case chatList
@@ -54,10 +55,11 @@ public final class ChatListNodeInteraction {
let updatePeerGrouping: (PeerId, Bool) -> Void
let togglePeerMarkedUnread: (PeerId, Bool) -> Void
let toggleArchivedFolderHiddenByDefault: () -> Void
+ let activateChatPreview: (ChatListItem, ASDisplayNode, ContextGesture?) -> Void
var highlightedChatLocation: ChatListHighlightedLocation?
- public init(activateSearch: @escaping () -> Void, peerSelected: @escaping (Peer) -> Void, togglePeerSelected: @escaping (PeerId) -> Void, messageSelected: @escaping (Peer, Message, Bool) -> Void, groupSelected: @escaping (PeerGroupId) -> Void, addContact: @escaping (String) -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, setItemPinned: @escaping (PinnedItemId, Bool) -> Void, setPeerMuted: @escaping (PeerId, Bool) -> Void, deletePeer: @escaping (PeerId) -> Void, updatePeerGrouping: @escaping (PeerId, Bool) -> Void, togglePeerMarkedUnread: @escaping (PeerId, Bool) -> Void, toggleArchivedFolderHiddenByDefault: @escaping () -> Void) {
+ public init(activateSearch: @escaping () -> Void, peerSelected: @escaping (Peer) -> Void, togglePeerSelected: @escaping (PeerId) -> Void, messageSelected: @escaping (Peer, Message, Bool) -> Void, groupSelected: @escaping (PeerGroupId) -> Void, addContact: @escaping (String) -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, setItemPinned: @escaping (PinnedItemId, Bool) -> Void, setPeerMuted: @escaping (PeerId, Bool) -> Void, deletePeer: @escaping (PeerId) -> Void, updatePeerGrouping: @escaping (PeerId, Bool) -> Void, togglePeerMarkedUnread: @escaping (PeerId, Bool) -> Void, toggleArchivedFolderHiddenByDefault: @escaping () -> Void, activateChatPreview: @escaping (ChatListItem, ASDisplayNode, ContextGesture?) -> Void) {
self.activateSearch = activateSearch
self.peerSelected = peerSelected
self.togglePeerSelected = togglePeerSelected
@@ -71,6 +73,7 @@ public final class ChatListNodeInteraction {
self.updatePeerGrouping = updatePeerGrouping
self.togglePeerMarkedUnread = togglePeerMarkedUnread
self.toggleArchivedFolderHiddenByDefault = toggleArchivedFolderHiddenByDefault
+ self.activateChatPreview = activateChatPreview
}
}
@@ -313,6 +316,7 @@ public final class ChatListNode: ListView {
public var updatePeerGrouping: ((PeerId, Bool) -> Void)?
public var presentAlert: ((String) -> Void)?
public var toggleArchivedFolderHiddenByDefault: (() -> Void)?
+ public var activateChatPreview: ((ChatListItem, ASDisplayNode, ContextGesture?) -> Void)?
private var theme: PresentationTheme
@@ -469,6 +473,15 @@ public final class ChatListNode: ListView {
})
}, toggleArchivedFolderHiddenByDefault: { [weak self] in
self?.toggleArchivedFolderHiddenByDefault?()
+ }, activateChatPreview: { [weak self] item, node, gesture in
+ guard let strongSelf = self else {
+ return
+ }
+ if let activateChatPreview = strongSelf.activateChatPreview {
+ activateChatPreview(item, node, gesture)
+ } else {
+ gesture?.cancel()
+ }
})
let viewProcessingQueue = self.viewProcessingQueue
diff --git a/submodules/ComposePollUI/ComposePollUI.xcodeproj/project.pbxproj b/submodules/ComposePollUI/ComposePollUI.xcodeproj/project.pbxproj
index c23ba6b914..68eeae0a6c 100644
--- a/submodules/ComposePollUI/ComposePollUI.xcodeproj/project.pbxproj
+++ b/submodules/ComposePollUI/ComposePollUI.xcodeproj/project.pbxproj
@@ -348,6 +348,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -529,6 +542,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -792,6 +806,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -837,6 +858,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
diff --git a/submodules/ContactListUI/BUCK b/submodules/ContactListUI/BUCK
index 9b4477027d..f7fc812125 100644
--- a/submodules/ContactListUI/BUCK
+++ b/submodules/ContactListUI/BUCK
@@ -25,6 +25,7 @@ static_library(
"//submodules/AlertUI:AlertUI",
"//submodules/ShareController:ShareController",
"//submodules/AppBundle:AppBundle",
+ "//submodules/OverlayStatusController:OverlayStatusController",
],
frameworks = [
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
diff --git a/submodules/ContactListUI/ContactListUI.xcodeproj/project.pbxproj b/submodules/ContactListUI/ContactListUI.xcodeproj/project.pbxproj
index 6e19e03e6b..f4a63e789c 100644
--- a/submodules/ContactListUI/ContactListUI.xcodeproj/project.pbxproj
+++ b/submodules/ContactListUI/ContactListUI.xcodeproj/project.pbxproj
@@ -102,6 +102,17 @@
sourceTree
SOURCE_ROOT
+ 1DD70E2925DE918A00000000
+
+ isa
+ PBXFileReference
+ name
+ ContactContextMenus.swift
+ path
+ Sources/ContactContextMenus.swift
+ sourceTree
+ SOURCE_ROOT
+
1DD70E29CD71432C00000000
isa
@@ -212,6 +223,7 @@
children
1DD70E29C95D7ED900000000
+ 1DD70E2925DE918A00000000
1DD70E29CD71432C00000000
1DD70E29C8C4BFFB00000000
1DD70E29FD9D368500000000
@@ -380,6 +392,19 @@
explicitFileType
archive.ar
+ 1DD70E296C9831F100000000
+
+ isa
+ PBXFileReference
+ name
+ libContextUI.a
+ path
+ libContextUI.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E292417E0B200000000
isa
@@ -523,6 +548,19 @@
explicitFileType
archive.ar
+ 1DD70E29BBAF750C00000000
+
+ isa
+ PBXFileReference
+ name
+ libOverlayStatusController.a
+ path
+ libOverlayStatusController.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29928D142900000000
isa
@@ -614,6 +652,19 @@
explicitFileType
archive.ar
+ 1DD70E29AD66967300000000
+
+ isa
+ PBXFileReference
+ name
+ libReactionSelectionNode.a
+ path
+ libReactionSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E291D58331200000000
isa
@@ -653,6 +704,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29097DBE9200000000
isa
@@ -861,6 +925,19 @@
explicitFileType
archive.ar
+ 1DD70E29F40A586F00000000
+
+ isa
+ PBXFileReference
+ name
+ libTextSelectionNode.a
+ path
+ libTextSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29CD296A8300000000
isa
@@ -921,6 +998,7 @@
1DD70E297AB043C800000000
1DD70E2997B4D6D800000000
1DD70E2931752C6000000000
+ 1DD70E296C9831F100000000
1DD70E292417E0B200000000
1DD70E295915423000000000
1DD70E29FF334B1F00000000
@@ -932,6 +1010,7 @@
1DD70E29CE34063500000000
1DD70E2936DE2CF900000000
1DD70E29C37F741500000000
+ 1DD70E29BBAF750C00000000
1DD70E29928D142900000000
1DD70E29D233F68C00000000
1DD70E291631B91900000000
@@ -939,9 +1018,11 @@
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
1DD70E293E4DE92B00000000
+ 1DD70E29AD66967300000000
1DD70E291D58331200000000
1DD70E29EA9CBB5B00000000
1DD70E291328E99400000000
+ 1DD70E2957B5522500000000
1DD70E29097DBE9200000000
1DD70E2981AE180900000000
1DD70E29524F478E00000000
@@ -958,6 +1039,7 @@
1DD70E292395015100000000
1DD70E29BA06E3A600000000
1DD70E29F0C15F9C00000000
+ 1DD70E29F40A586F00000000
1DD70E29CD296A8300000000
1DD70E2951398CF200000000
1DD70E29597BAFBB00000000
@@ -1012,6 +1094,13 @@
fileRef
1DD70E29C95D7ED900000000
+ E7A30F0425DE918A00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2925DE918A00000000
+
E7A30F04CD71432C00000000
isa
@@ -1082,6 +1171,7 @@
files
E7A30F04C95D7ED900000000
+ E7A30F0425DE918A00000000
E7A30F04CD71432C00000000
E7A30F04C8C4BFFB00000000
E7A30F04FD9D368500000000
@@ -1289,6 +1379,27 @@
fileRef
1DD70E2997B4D6D800000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F04C37F741500000000
isa
@@ -1303,6 +1414,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -1338,6 +1456,13 @@
fileRef
1DD70E2931752C6000000000
+ E7A30F04BBAF750C00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29BBAF750C00000000
+
E7A30F041328E99400000000
isa
@@ -1484,13 +1609,18 @@
E7A30F042420028600000000
E7A30F04A54A195300000000
E7A30F0497B4D6D800000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F04C37F741500000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04D233F68C00000000
E7A30F049A24C4DE00000000
E7A30F0431752C6000000000
+ E7A30F04BBAF750C00000000
E7A30F041328E99400000000
E7A30F041E16CC6C00000000
E7A30F04928D142900000000
diff --git a/submodules/ContactListUI/Sources/ContactContextMenus.swift b/submodules/ContactListUI/Sources/ContactContextMenus.swift
new file mode 100644
index 0000000000..90b5d44218
--- /dev/null
+++ b/submodules/ContactListUI/Sources/ContactContextMenus.swift
@@ -0,0 +1,131 @@
+import Foundation
+import UIKit
+import SwiftSignalKit
+import ContextUI
+import AccountContext
+import Postbox
+import TelegramCore
+import Display
+import AlertUI
+import OverlayStatusController
+
+func contactContextMenuItems(context: AccountContext, peerId: PeerId, contactsController: ContactsController?) -> Signal<[ContextMenuItem], NoError> {
+ let strings = context.sharedContext.currentPresentationData.with({ $0 }).strings
+ return context.account.postbox.transaction { [weak contactsController] transaction -> [ContextMenuItem] in
+ var items: [ContextMenuItem] = []
+
+ items.append(.action(ContextMenuActionItem(text: strings.ContactList_Context_SendMessage, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Message"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ if let contactsController = contactsController, let navigationController = contactsController.navigationController as? NavigationController {
+ context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
+ }
+ f(.default)
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: strings.ContactList_Context_StartSecretChat, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Timer"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ let _ = (context.account.postbox.transaction { transaction -> PeerId? in
+ let filteredPeerIds = Array(transaction.getAssociatedPeerIds(peerId)).filter { $0.namespace == Namespaces.Peer.SecretChat }
+ var activeIndices: [ChatListIndex] = []
+ for associatedId in filteredPeerIds {
+ if let state = (transaction.getPeer(associatedId) as? TelegramSecretChat)?.embeddedState {
+ switch state {
+ case .active, .handshake:
+ if let (_, index) = transaction.getPeerChatListIndex(associatedId) {
+ activeIndices.append(index)
+ }
+ default:
+ break
+ }
+ }
+ }
+ activeIndices.sort()
+ if let index = activeIndices.last {
+ return index.messageIndex.id.peerId
+ } else {
+ return nil
+ }
+ }
+ |> deliverOnMainQueue).start(next: { currentPeerId in
+ if let currentPeerId = currentPeerId {
+ if let contactsController = contactsController, let navigationController = (contactsController.navigationController as? NavigationController) {
+ context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(currentPeerId)))
+ }
+ } else {
+ var createSignal = createSecretChat(account: context.account, peerId: peerId)
+ var cancelImpl: (() -> Void)?
+ let progressSignal = Signal { subscriber in
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: {
+ cancelImpl?()
+ }))
+ contactsController?.present(controller, in: .window(.root))
+ return ActionDisposable { [weak controller] in
+ Queue.mainQueue().async() {
+ controller?.dismiss()
+ }
+ }
+ }
+ |> runOn(Queue.mainQueue())
+ |> delay(0.15, queue: Queue.mainQueue())
+ let progressDisposable = progressSignal.start()
+
+ createSignal = createSignal
+ |> afterDisposed {
+ Queue.mainQueue().async {
+ progressDisposable.dispose()
+ }
+ }
+ let createSecretChatDisposable = MetaDisposable()
+ cancelImpl = {
+ createSecretChatDisposable.set(nil)
+ }
+
+ createSecretChatDisposable.set((createSignal
+ |> deliverOnMainQueue).start(next: { peerId in
+ if let navigationController = (contactsController?.navigationController as? NavigationController) {
+ context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
+ }
+ }, error: { _ in
+ if let contactsController = contactsController {
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ contactsController.present(textAlertController(context: context, title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
+ }
+ }))
+ }
+ })
+ f(.default)
+ })))
+
+ var canCall = true
+ if peerId.namespace == Namespaces.Peer.CloudUser, let cachedUserData = transaction.getPeerCachedData(peerId: peerId) as? CachedUserData, cachedUserData.callsPrivate {
+ canCall = false
+ }
+
+ if canCall {
+ items.append(.action(ContextMenuActionItem(text: strings.ContactList_Context_Call, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Call"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ if let contactsController = contactsController {
+ let callResult = context.sharedContext.callManager?.requestCall(account: context.account, peerId: peerId, endCurrentIfAny: false)
+ if let callResult = callResult, case let .alreadyInProgress(currentPeerId) = callResult {
+ if currentPeerId == peerId {
+ context.sharedContext.navigateToCurrentCall()
+ } else {
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ let _ = (context.account.postbox.transaction { transaction -> (Peer?, Peer?) in
+ return (transaction.getPeer(peerId), transaction.getPeer(currentPeerId))
+ }
+ |> deliverOnMainQueue).start(next: { [weak contactsController] peer, current in
+ if let contactsController = contactsController, let peer = peer, let current = current {
+ contactsController.present(textAlertController(context: context, title: presentationData.strings.Call_CallInProgressTitle, text: presentationData.strings.Call_CallInProgressMessage(current.compactDisplayTitle, peer.compactDisplayTitle).0, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: {
+ let _ = context.sharedContext.callManager?.requestCall(account: context.account, peerId: peerId, endCurrentIfAny: true)
+ })]), in: .window(.root))
+ }
+ })
+ }
+ }
+ }
+ f(.default)
+ })))
+ }
+
+ return items
+ }
+}
diff --git a/submodules/ContactListUI/Sources/ContactListNode.swift b/submodules/ContactListUI/Sources/ContactListNode.swift
index 59d795a9b1..0399dcf601 100644
--- a/submodules/ContactListUI/Sources/ContactListNode.swift
+++ b/submodules/ContactListUI/Sources/ContactListNode.swift
@@ -20,6 +20,7 @@ import ChatListSearchItemHeader
import SearchUI
import TelegramPermissionsUI
import AppBundle
+import ContextUI
private let dropDownIcon = { () -> UIImage in
UIGraphicsBeginImageContextWithOptions(CGSize(width: 12.0, height: 12.0), false, 0.0)
@@ -98,15 +99,17 @@ private final class ContactListNodeInteraction {
fileprivate let authorize: () -> Void
fileprivate let suppressWarning: () -> Void
fileprivate let openPeer: (ContactListPeer) -> Void
+ fileprivate let contextAction: ((Peer, ASDisplayNode, ContextGesture?) -> Void)?
let itemHighlighting = ContactItemHighlighting()
- init(activateSearch: @escaping () -> Void, openSortMenu: @escaping () -> Void, authorize: @escaping () -> Void, suppressWarning: @escaping () -> Void, openPeer: @escaping (ContactListPeer) -> Void) {
+ init(activateSearch: @escaping () -> Void, openSortMenu: @escaping () -> Void, authorize: @escaping () -> Void, suppressWarning: @escaping () -> Void, openPeer: @escaping (ContactListPeer) -> Void, contextAction: ((Peer, ASDisplayNode, ContextGesture?) -> Void)?) {
self.activateSearch = activateSearch
self.openSortMenu = openSortMenu
self.authorize = authorize
self.suppressWarning = suppressWarning
self.openPeer = openPeer
+ self.contextAction = contextAction
}
}
@@ -175,8 +178,10 @@ private enum ContactListNodeEntry: Comparable, Identifiable {
case let .peer(_, peer, presence, header, selection, theme, strings, dateTimeFormat, nameSortOrder, nameDisplayOrder, enabled):
let status: ContactsPeerItemStatus
let itemPeer: ContactsPeerItemPeer
+ var isContextActionEnabled = false
switch peer {
case let .peer(peer, isGlobal, participantCount):
+ isContextActionEnabled = true
if isGlobal, let _ = peer.addressName {
status = .addressName("")
} else {
@@ -200,9 +205,22 @@ private enum ContactListNodeEntry: Comparable, Identifiable {
status = .none
itemPeer = .deviceContact(stableId: id, contact: contact)
}
+ var itemContextAction: ((ASDisplayNode, ContextGesture?) -> Void)?
+ if isContextActionEnabled, let contextAction = interaction.contextAction {
+ itemContextAction = { node, gesture in
+ switch itemPeer {
+ case let .peer(peer, _):
+ if let peer = peer {
+ contextAction(peer, node, gesture)
+ }
+ case .deviceContact:
+ break
+ }
+ }
+ }
return ContactsPeerItem(theme: theme, strings: strings, sortOrder: nameSortOrder, displayOrder: nameDisplayOrder, account: account, peerMode: .peer, peer: itemPeer, status: status, enabled: enabled, selection: selection, editing: ContactsPeerItemEditing(editable: false, editing: false, revealed: false), index: nil, header: header, action: { _ in
interaction.openPeer(peer)
- }, itemHighlighting: interaction.itemHighlighting)
+ }, itemHighlighting: interaction.itemHighlighting, contextAction: itemContextAction)
}
}
@@ -744,6 +762,7 @@ public final class ContactListNode: ASDisplayNode {
public var openPeer: ((ContactListPeer) -> Void)?
public var openPrivacyPolicy: (() -> Void)?
public var suppressPermissionWarning: (() -> Void)?
+ private let contextAction: ((Peer, ASDisplayNode, ContextGesture?) -> Void)?
private let previousEntries = Atomic<[ContactListNodeEntry]?>(value: nil)
private let disposable = MetaDisposable()
@@ -755,10 +774,11 @@ public final class ContactListNode: ASDisplayNode {
private var authorizationNode: PermissionContentNode
private let displayPermissionPlaceholder: Bool
- public init(context: AccountContext, presentation: Signal, filters: [ContactListFilter] = [.excludeSelf], selectionState: ContactListNodeGroupSelectionState? = nil, displayPermissionPlaceholder: Bool = true, displaySortOptions: Bool = false) {
+ public init(context: AccountContext, presentation: Signal, filters: [ContactListFilter] = [.excludeSelf], selectionState: ContactListNodeGroupSelectionState? = nil, displayPermissionPlaceholder: Bool = true, displaySortOptions: Bool = false, contextAction: ((Peer, ASDisplayNode, ContextGesture?) -> Void)? = nil) {
self.context = context
self.filters = filters
self.displayPermissionPlaceholder = displayPermissionPlaceholder
+ self.contextAction = contextAction
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
@@ -826,7 +846,7 @@ public final class ContactListNode: ASDisplayNode {
self?.suppressPermissionWarning?()
}, openPeer: { [weak self] peer in
self?.openPeer?(peer)
- })
+ }, contextAction: contextAction)
self.indexNode.indexSelected = { [weak self] section in
guard let strongSelf = self, let layout = strongSelf.validLayout, let entries = previousEntries.with({ $0 }) else {
diff --git a/submodules/ContactListUI/Sources/ContactsControllerNode.swift b/submodules/ContactListUI/Sources/ContactsControllerNode.swift
index 10f988b75f..4295a9cb24 100644
--- a/submodules/ContactListUI/Sources/ContactsControllerNode.swift
+++ b/submodules/ContactListUI/Sources/ContactsControllerNode.swift
@@ -12,6 +12,7 @@ import AccountContext
import SearchBarNode
import SearchUI
import AppBundle
+import ContextUI
private final class ContactsControllerNodeView: UITracingLayerView, PreviewingHostView {
var previewingDelegate: PreviewingHostViewDelegate? {
@@ -25,6 +26,27 @@ private final class ContactsControllerNodeView: UITracingLayerView, PreviewingHo
weak var controller: ContactsController?
}
+private final class ContextControllerContentSourceImpl: ContextControllerContentSource {
+ let controller: ViewController
+ weak var sourceNode: ASDisplayNode?
+
+ init(controller: ViewController, sourceNode: ASDisplayNode?) {
+ self.controller = controller
+ self.sourceNode = sourceNode
+ }
+
+ func transitionInfo() -> ContextControllerTakeControllerInfo? {
+ let sourceNode = self.sourceNode
+ return ContextControllerTakeControllerInfo(contentAreaInScreenSpace: CGRect(origin: CGPoint(), size: CGSize(width: 10.0, height: 10.0)), sourceNode: { [weak sourceNode] in
+ if let sourceNode = sourceNode {
+ return (sourceNode, sourceNode.bounds)
+ } else {
+ return nil
+ }
+ })
+ }
+}
+
final class ContactsControllerNode: ASDisplayNode {
let contactListNode: ContactListNode
@@ -69,7 +91,11 @@ final class ContactsControllerNode: ASDisplayNode {
}
}
- self.contactListNode = ContactListNode(context: context, presentation: presentation, displaySortOptions: true)
+ var contextAction: ((Peer, ASDisplayNode, ContextGesture?) -> Void)?
+
+ self.contactListNode = ContactListNode(context: context, presentation: presentation, displaySortOptions: true, contextAction: { peer, node, gesture in
+ contextAction?(peer, node, gesture)
+ })
super.init()
@@ -106,6 +132,16 @@ final class ContactsControllerNode: ASDisplayNode {
strongSelf.openInvite?()
}
}
+
+ contextAction = { [weak self] peer, node, gesture in
+ guard let strongSelf = self, let contactsController = strongSelf.controller else {
+ return
+ }
+ let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peer.id), subject: nil, botStart: nil, mode: .standard(previewing: true))
+ chatController.canReadHistory.set(false)
+ let contextController = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node)), items: contactContextMenuItems(context: strongSelf.context, peerId: peer.id, contactsController: contactsController), reactionItems: [], gesture: gesture)
+ contactsController.presentInGlobalOverlay(contextController)
+ }
}
deinit {
diff --git a/submodules/ContactsPeerItem/BUCK b/submodules/ContactsPeerItem/BUCK
index dab23dcd85..52f3dd428a 100644
--- a/submodules/ContactsPeerItem/BUCK
+++ b/submodules/ContactsPeerItem/BUCK
@@ -21,6 +21,7 @@ static_library(
"//submodules/ItemListUI:ItemListUI",
"//submodules/TelegramUIPreferences:TelegramUIPreferences",
"//submodules/ListSectionHeaderNode:ListSectionHeaderNode",
+ "//submodules/ContextUI:ContextUI",
],
frameworks = [
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
diff --git a/submodules/ContactsPeerItem/ContactsPeerItem.xcodeproj/project.pbxproj b/submodules/ContactsPeerItem/ContactsPeerItem.xcodeproj/project.pbxproj
index 6a5a0aab20..dcd5a71ad5 100644
--- a/submodules/ContactsPeerItem/ContactsPeerItem.xcodeproj/project.pbxproj
+++ b/submodules/ContactsPeerItem/ContactsPeerItem.xcodeproj/project.pbxproj
@@ -206,6 +206,19 @@
explicitFileType
archive.ar
+ 1DD70E296C9831F100000000
+
+ isa
+ PBXFileReference
+ name
+ libContextUI.a
+ path
+ libContextUI.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E295915423000000000
isa
@@ -375,6 +388,32 @@
explicitFileType
archive.ar
+ 1DD70E29AD66967300000000
+
+ isa
+ PBXFileReference
+ name
+ libReactionSelectionNode.a
+ path
+ libReactionSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -505,6 +544,19 @@
explicitFileType
archive.ar
+ 1DD70E29F40A586F00000000
+
+ isa
+ PBXFileReference
+ name
+ libTextSelectionNode.a
+ path
+ libTextSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29CD296A8300000000
isa
@@ -546,6 +598,7 @@
1DD70E292420028600000000
1DD70E29A54A195300000000
1DD70E2997B4D6D800000000
+ 1DD70E296C9831F100000000
1DD70E295915423000000000
1DD70E29FF334B1F00000000
1DD70E29D6F14E1000000000
@@ -559,6 +612,8 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E29AD66967300000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -569,6 +624,7 @@
1DD70E292395015100000000
1DD70E29BA06E3A600000000
1DD70E29F0C15F9C00000000
+ 1DD70E29F40A586F00000000
1DD70E29CD296A8300000000
1DD70E2951398CF200000000
@@ -793,6 +849,27 @@
fileRef
1DD70E2997B4D6D800000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F04C37F741500000000
isa
@@ -814,6 +891,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -877,9 +961,13 @@
E7A30F042420028600000000
E7A30F04A54A195300000000
E7A30F0497B4D6D800000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04D233F68C00000000
diff --git a/submodules/ContactsPeerItem/Sources/ContactsPeerItem.swift b/submodules/ContactsPeerItem/Sources/ContactsPeerItem.swift
index a12d158d4b..ea5e22fd0f 100644
--- a/submodules/ContactsPeerItem/Sources/ContactsPeerItem.swift
+++ b/submodules/ContactsPeerItem/Sources/ContactsPeerItem.swift
@@ -14,6 +14,7 @@ import TelegramStringFormatting
import AccountContext
import PeerPresenceStatusManager
import ItemListPeerItem
+import ContextUI
public final class ContactItemHighlighting {
public var chatLocation: ChatLocation?
@@ -125,6 +126,7 @@ public class ContactsPeerItem: ListViewItem, ListViewItemWithHeader {
let setPeerIdWithRevealedOptions: ((PeerId?, PeerId?) -> Void)?
let deletePeer: ((PeerId) -> Void)?
let itemHighlighting: ContactItemHighlighting?
+ let contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?
public let selectable: Bool
@@ -132,7 +134,7 @@ public class ContactsPeerItem: ListViewItem, ListViewItemWithHeader {
public let header: ListViewItemHeader?
- public init(theme: PresentationTheme, strings: PresentationStrings, sortOrder: PresentationPersonNameOrder, displayOrder: PresentationPersonNameOrder, account: Account, peerMode: ContactsPeerItemPeerMode, peer: ContactsPeerItemPeer, status: ContactsPeerItemStatus, badge: ContactsPeerItemBadge? = nil, enabled: Bool, selection: ContactsPeerItemSelection, editing: ContactsPeerItemEditing, options: [ItemListPeerItemRevealOption] = [], actionIcon: ContactsPeerItemActionIcon = .none, index: PeerNameIndex?, header: ListViewItemHeader?, action: @escaping (ContactsPeerItemPeer) -> Void, setPeerIdWithRevealedOptions: ((PeerId?, PeerId?) -> Void)? = nil, deletePeer: ((PeerId) -> Void)? = nil, itemHighlighting: ContactItemHighlighting? = nil) {
+ public init(theme: PresentationTheme, strings: PresentationStrings, sortOrder: PresentationPersonNameOrder, displayOrder: PresentationPersonNameOrder, account: Account, peerMode: ContactsPeerItemPeerMode, peer: ContactsPeerItemPeer, status: ContactsPeerItemStatus, badge: ContactsPeerItemBadge? = nil, enabled: Bool, selection: ContactsPeerItemSelection, editing: ContactsPeerItemEditing, options: [ItemListPeerItemRevealOption] = [], actionIcon: ContactsPeerItemActionIcon = .none, index: PeerNameIndex?, header: ListViewItemHeader?, action: @escaping (ContactsPeerItemPeer) -> Void, setPeerIdWithRevealedOptions: ((PeerId?, PeerId?) -> Void)? = nil, deletePeer: ((PeerId) -> Void)? = nil, itemHighlighting: ContactItemHighlighting? = nil, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? = nil) {
self.theme = theme
self.strings = strings
self.sortOrder = sortOrder
@@ -153,6 +155,7 @@ public class ContactsPeerItem: ListViewItem, ListViewItemWithHeader {
self.header = header
self.itemHighlighting = itemHighlighting
self.selectable = enabled
+ self.contextAction = contextAction
if let index = index {
var letter: String = "#"
@@ -283,6 +286,8 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
private let separatorNode: ASDisplayNode
private let highlightedBackgroundNode: ASDisplayNode
+ private let containerNode: ContextControllerSourceNode
+
private let avatarNode: AvatarNode
private let titleNode: TextNode
private var verificationIconNode: ASImageNode?
@@ -325,6 +330,8 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
self.highlightedBackgroundNode = ASDisplayNode()
self.highlightedBackgroundNode.isLayerBacked = true
+ self.containerNode = ContextControllerSourceNode()
+
self.avatarNode = AvatarNode(font: avatarFont)
self.avatarNode.isLayerBacked = !smartInvertColorsEnabled()
@@ -337,9 +344,10 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
self.addSubnode(self.backgroundNode)
self.addSubnode(self.separatorNode)
- self.addSubnode(self.avatarNode)
- self.addSubnode(self.titleNode)
- self.addSubnode(self.statusNode)
+ self.addSubnode(self.containerNode)
+ self.containerNode.addSubnode(self.avatarNode)
+ self.containerNode.addSubnode(self.titleNode)
+ self.containerNode.addSubnode(self.statusNode)
self.peerPresenceManager = PeerPresenceStatusManager(update: { [weak self] in
if let strongSelf = self, let layoutParams = strongSelf.layoutParams {
@@ -347,6 +355,14 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
let _ = apply()
}
})
+
+ self.containerNode.activated = { [weak self] gesture in
+ guard let strongSelf = self, let item = strongSelf.item, let contextAction = item.contextAction else {
+ gesture.cancel()
+ return
+ }
+ contextAction(strongSelf.containerNode, gesture)
+ }
}
override public func layoutForParams(_ params: ListViewItemLayoutParams, item: ListViewItem, previousItem: ListViewItem?, nextItem: ListViewItem?) {
@@ -639,6 +655,9 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
strongSelf.accessibilityLabel = titleAttributedString?.string
strongSelf.accessibilityValue = statusAttributedString?.string
+ strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: nodeLayout.contentSize)
+ strongSelf.containerNode.isGestureEnabled = item.contextAction != nil
+
switch item.peer {
case let .peer(peer, _):
if let peer = peer {
@@ -701,7 +720,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
verificationIconNode.displayWithoutProcessing = true
verificationIconNode.displaysAsynchronously = false
strongSelf.verificationIconNode = verificationIconNode
- strongSelf.addSubnode(verificationIconNode)
+ strongSelf.containerNode.addSubnode(verificationIconNode)
}
if let verificationIconNode = strongSelf.verificationIconNode {
verificationIconNode.image = verificationIconImage
@@ -720,7 +739,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
actionIconNode.displayWithoutProcessing = true
actionIconNode.displaysAsynchronously = false
strongSelf.actionIconNode = actionIconNode
- strongSelf.addSubnode(actionIconNode)
+ strongSelf.containerNode.addSubnode(actionIconNode)
}
if let actionIconNode = strongSelf.actionIconNode {
actionIconNode.image = actionIconImage
@@ -744,7 +763,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
badgeBackgroundNode.isLayerBacked = true
badgeBackgroundNode.displaysAsynchronously = false
badgeBackgroundNode.displayWithoutProcessing = true
- strongSelf.addSubnode(badgeBackgroundNode)
+ strongSelf.containerNode.addSubnode(badgeBackgroundNode)
strongSelf.badgeBackgroundNode = badgeBackgroundNode
badgeTransition = .immediate
}
@@ -758,7 +777,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
let badgeTextNode = badgeTextApply()
if badgeTextNode !== strongSelf.badgeTextNode {
strongSelf.badgeTextNode?.removeFromSupernode()
- strongSelf.addSubnode(badgeTextNode)
+ strongSelf.containerNode.addSubnode(badgeTextNode)
strongSelf.badgeTextNode = badgeTextNode
}
diff --git a/submodules/ContextUI/BUCK b/submodules/ContextUI/BUCK
index 638b4d2a95..dd389963ff 100644
--- a/submodules/ContextUI/BUCK
+++ b/submodules/ContextUI/BUCK
@@ -6,6 +6,7 @@ static_library(
"Sources/**/*.swift",
]),
deps = [
+ "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared",
"//submodules/AsyncDisplayKit:AsyncDisplayKit#shared",
"//submodules/Display:Display#shared",
"//submodules/TelegramPresentationData:TelegramPresentationData",
diff --git a/submodules/ContextUI/ContextUI.xcodeproj/project.pbxproj b/submodules/ContextUI/ContextUI.xcodeproj/project.pbxproj
index 6124b875c6..1aeafe70f3 100644
--- a/submodules/ContextUI/ContextUI.xcodeproj/project.pbxproj
+++ b/submodules/ContextUI/ContextUI.xcodeproj/project.pbxproj
@@ -146,6 +146,28 @@
sourceTree
SOURCE_ROOT
+ 1DD70E293607624D00000000
+
+ isa
+ PBXFileReference
+ name
+ ContextControllerSourceNode.swift
+ path
+ Sources/ContextControllerSourceNode.swift
+ sourceTree
+ SOURCE_ROOT
+
+ 1DD70E2942A6CFDF00000000
+
+ isa
+ PBXFileReference
+ name
+ ContextGesture.swift
+ path
+ Sources/ContextGesture.swift
+ sourceTree
+ SOURCE_ROOT
+
B401C979EAB5339800000000
isa
@@ -161,6 +183,8 @@
1DD70E2984D0F63E00000000
1DD70E2972528DAC00000000
1DD70E298B1C7CF000000000
+ 1DD70E293607624D00000000
+ 1DD70E2942A6CFDF00000000
B401C9795F32B06300000000
@@ -448,6 +472,20 @@
fileRef
1DD70E298B1C7CF000000000
+ E7A30F043607624D00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E293607624D00000000
+
+ E7A30F0442A6CFDF00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2942A6CFDF00000000
+
1870857F0000000000000000
isa
@@ -459,6 +497,8 @@
E7A30F0484D0F63E00000000
E7A30F0472528DAC00000000
E7A30F048B1C7CF000000000
+ E7A30F043607624D00000000
+ E7A30F0442A6CFDF00000000
E7A30F04FF334B1F00000000
diff --git a/submodules/ContextUI/Sources/ContextContentContainerNode.swift b/submodules/ContextUI/Sources/ContextContentContainerNode.swift
index 014cb82458..ec77f46adb 100644
--- a/submodules/ContextUI/Sources/ContextContentContainerNode.swift
+++ b/submodules/ContextUI/Sources/ContextContentContainerNode.swift
@@ -9,6 +9,19 @@ final class ContextContentContainerNode: ASDisplayNode {
super.init()
}
- func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) {
+ func updateLayout(size: CGSize, scaledSize: CGSize, transition: ContainedViewLayoutTransition) {
+ guard let contentNode = self.contentNode else {
+ return
+ }
+ switch contentNode {
+ case .extracted:
+ break
+ case let .controller(controller):
+ transition.updatePosition(node: controller, position: CGPoint(x: scaledSize.width / 2.0, y: scaledSize.height / 2.0))
+ transition.updateBounds(node: controller, bounds: CGRect(origin: CGPoint(), size: size))
+ transition.updateTransformScale(node: controller, scale: scaledSize.width / size.width)
+ controller.updateLayout(size: size, transition: transition)
+ controller.controller.containerLayoutUpdated(ContainerViewLayout(size: size, metrics: LayoutMetrics(widthClass: .compact, heightClass: .compact), deviceMetrics: .iPhoneX, intrinsicInsets: UIEdgeInsets(), safeInsets: UIEdgeInsets(), statusBarHeight: nil, inputHeight: nil, inputHeightIsInteractivellyChanging: false, inVoiceOver: false), transition: transition)
+ }
}
}
diff --git a/submodules/ContextUI/Sources/ContextContentSourceNode.swift b/submodules/ContextUI/Sources/ContextContentSourceNode.swift
index a2f91e3cd3..80a93d9a56 100644
--- a/submodules/ContextUI/Sources/ContextContentSourceNode.swift
+++ b/submodules/ContextUI/Sources/ContextContentSourceNode.swift
@@ -2,8 +2,8 @@ import Foundation
import AsyncDisplayKit
import Display
-public final class ContextContentContainingNode: ASDisplayNode {
- public let contentNode: ContextContentNode
+public final class ContextExtractedContentContainingNode: ASDisplayNode {
+ public let contentNode: ContextExtractedContentNode
public var contentRect: CGRect = CGRect()
public var isExtractedToContextPreview: Bool = false
public var willUpdateIsExtractedToContextPreview: ((Bool) -> Void)?
@@ -15,7 +15,7 @@ public final class ContextContentContainingNode: ASDisplayNode {
public var updateDistractionFreeMode: ((Bool) -> Void)?
public override init() {
- self.contentNode = ContextContentNode()
+ self.contentNode = ContextExtractedContentNode()
super.init()
@@ -23,5 +23,26 @@ public final class ContextContentContainingNode: ASDisplayNode {
}
}
-public final class ContextContentNode: ASDisplayNode {
+public final class ContextExtractedContentNode: ASDisplayNode {
+}
+
+final class ContextControllerContentNode: ASDisplayNode {
+ let controller: ViewController
+
+ init(controller: ViewController) {
+ self.controller = controller
+
+ super.init()
+
+ self.addSubnode(controller.displayNode)
+ }
+
+ func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) {
+ transition.updateFrame(node: self.controller.displayNode, frame: CGRect(origin: CGPoint(), size: size))
+ }
+}
+
+enum ContextContentNode {
+ case extracted(ContextExtractedContentContainingNode)
+ case controller(ContextControllerContentNode)
}
diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift
index 9f27b28a6f..851071299c 100644
--- a/submodules/ContextUI/Sources/ContextController.swift
+++ b/submodules/ContextUI/Sources/ContextController.swift
@@ -6,6 +6,7 @@ import TelegramPresentationData
import TextSelectionNode
import ReactionSelectionNode
import TelegramCore
+import SwiftSignalKit
private let animationDurationFactor: Double = 1.0
@@ -60,10 +61,18 @@ private func convertFrame(_ frame: CGRect, from fromView: UIView, to toView: UIV
private final class ContextControllerNode: ViewControllerTracingNode, UIScrollViewDelegate {
private var theme: PresentationTheme
private var strings: PresentationStrings
- private let source: ContextControllerContentSource
- private var items: [ContextMenuItem]
+ private let source: ContextContentSource
+ private var items: Signal<[ContextMenuItem], NoError>
private let beginDismiss: (ContextMenuActionResult) -> Void
private let reactionSelected: (String) -> Void
+ private let getController: () -> ContextController?
+ private weak var gesture: ContextGesture?
+
+ private var didSetItemsReady = false
+ let itemsReady = Promise()
+ let contentReady = Promise()
+
+ private var currentItems: [ContextMenuItem]?
private var validLayout: ContainerViewLayout?
@@ -78,7 +87,6 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
private var originalProjectedContentViewFrame: (CGRect, CGRect)?
private var contentAreaInScreenSpace: CGRect?
- private var contentParentNode: ContextContentContainingNode?
private let contentContainerNode: ContextContentContainerNode
private var actionsContainerNode: ContextActionsContainerNode
private var reactionContextNode: ReactionContextNode?
@@ -94,13 +102,20 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
private var isAnimatingOut = false
- init(account: Account, controller: ContextController, theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], reactionItems: [ReactionContextItem], beginDismiss: @escaping (ContextMenuActionResult) -> Void, recognizer: TapLongTapOrDoubleTapGestureRecognizer?, reactionSelected: @escaping (String) -> Void) {
+ private let itemsDisposable = MetaDisposable()
+
+ init(account: Account, controller: ContextController, theme: PresentationTheme, strings: PresentationStrings, source: ContextContentSource, items: Signal<[ContextMenuItem], NoError>, reactionItems: [ReactionContextItem], beginDismiss: @escaping (ContextMenuActionResult) -> Void, recognizer: TapLongTapOrDoubleTapGestureRecognizer?, gesture: ContextGesture?, reactionSelected: @escaping (String) -> Void) {
self.theme = theme
self.strings = strings
self.source = source
self.items = items
self.beginDismiss = beginDismiss
self.reactionSelected = reactionSelected
+ self.gesture = gesture
+
+ self.getController = { [weak controller] in
+ return controller
+ }
self.effectView = UIVisualEffectView()
if #available(iOS 9.0, *) {
@@ -132,9 +147,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
self.contentContainerNode = ContextContentContainerNode()
- var getController: (() -> ContextController?)?
- self.actionsContainerNode = ContextActionsContainerNode(theme: theme, items: items, getController: {
- return getController?()
+ self.actionsContainerNode = ContextActionsContainerNode(theme: theme, items: [], getController: { [weak controller] in
+ return controller
}, actionSelected: { result in
beginDismiss(result)
})
@@ -162,10 +176,6 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
self.scrollNode.addSubnode(self.contentContainerNode)
self.reactionContextNode.flatMap(self.addSubnode)
- getController = { [weak controller] in
- return controller
- }
-
if let recognizer = recognizer {
recognizer.externalUpdated = { [weak self, weak recognizer] view, point in
guard let strongSelf = self, let _ = recognizer else {
@@ -246,6 +256,86 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
}
}
+ } else if let gesture = gesture {
+ gesture.externalUpdated = { [weak self, weak gesture] view, point in
+ guard let strongSelf = self, let _ = gesture else {
+ return
+ }
+ let localPoint = strongSelf.view.convert(point, from: view)
+ let initialPoint: CGPoint
+ if let current = strongSelf.initialContinueGesturePoint {
+ initialPoint = current
+ } else {
+ initialPoint = localPoint
+ strongSelf.initialContinueGesturePoint = localPoint
+ }
+ if strongSelf.didCompleteAnimationIn {
+ if !strongSelf.didMoveFromInitialGesturePoint {
+ let distance = abs(localPoint.y - initialPoint.y)
+ if distance > 4.0 {
+ strongSelf.didMoveFromInitialGesturePoint = true
+ }
+ }
+ if strongSelf.didMoveFromInitialGesturePoint {
+ let actionPoint = strongSelf.view.convert(localPoint, to: strongSelf.actionsContainerNode.view)
+ let actionNode = strongSelf.actionsContainerNode.actionNode(at: actionPoint)
+ if strongSelf.highlightedActionNode !== actionNode {
+ strongSelf.highlightedActionNode?.setIsHighlighted(false)
+ strongSelf.highlightedActionNode = actionNode
+ if let actionNode = actionNode {
+ actionNode.setIsHighlighted(true)
+ strongSelf.hapticFeedback.tap()
+ }
+ }
+
+ if let reactionContextNode = strongSelf.reactionContextNode {
+ let highlightedReaction = reactionContextNode.reaction(at: strongSelf.view.convert(localPoint, to: reactionContextNode.view)).flatMap { value -> String? in
+ switch value {
+ case let .reaction(reaction, _, _):
+ return reaction
+ default:
+ return nil
+ }
+ }
+ if strongSelf.highlightedReaction != highlightedReaction {
+ strongSelf.highlightedReaction = highlightedReaction
+ reactionContextNode.setHighlightedReaction(highlightedReaction)
+ if let _ = highlightedReaction {
+ strongSelf.hapticFeedback.tap()
+ }
+ }
+ }
+ }
+ }
+ }
+ gesture.externalEnded = { [weak self, weak gesture] viewAndPoint in
+ guard let strongSelf = self, let gesture = gesture else {
+ return
+ }
+ gesture.externalUpdated = nil
+ if strongSelf.didMoveFromInitialGesturePoint {
+ if let (_, _) = viewAndPoint {
+ if let highlightedActionNode = strongSelf.highlightedActionNode {
+ strongSelf.highlightedActionNode = nil
+ highlightedActionNode.performAction()
+ }
+ if let _ = strongSelf.reactionContextNode {
+ if let reaction = strongSelf.highlightedReaction {
+ strongSelf.reactionSelected(reaction)
+ }
+ }
+ } else {
+ if let highlightedActionNode = strongSelf.highlightedActionNode {
+ strongSelf.highlightedActionNode = nil
+ highlightedActionNode.setIsHighlighted(false)
+ }
+ if let reactionContextNode = strongSelf.reactionContextNode, let _ = strongSelf.highlightedReaction {
+ strongSelf.highlightedReaction = nil
+ reactionContextNode.setHighlightedReaction(nil)
+ }
+ }
+ }
+ }
}
if let reactionContextNode = self.reactionContextNode {
@@ -261,6 +351,20 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
}
}
+
+ self.itemsDisposable.set((items
+ |> deliverOnMainQueue).start(next: { [weak self] items in
+ self?.setItems(items: items)
+ }))
+
+ switch source {
+ case .extracted:
+ self.contentReady.set(.single(true))
+ case let .controller(source):
+ self.contentReady.set(source.controller.ready.get())
+ }
+
+ self.initializeContent()
}
deinit {
@@ -270,6 +374,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
propertyAnimator?.stopAnimation(true)
}
}
+
+ self.itemsDisposable.dispose()
}
override func didLoad() {
@@ -282,61 +388,95 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
self.beginDismiss(.default)
}
- func animateIn() {
- self.hapticFeedback.impact()
-
- let takenViewInfo = self.source.takeView()
-
- if let takenViewInfo = takenViewInfo, let parentSupernode = takenViewInfo.contentContainingNode.supernode {
- self.contentParentNode = takenViewInfo.contentContainingNode
- let contentParentNode = takenViewInfo.contentContainingNode
- takenViewInfo.contentContainingNode.layoutUpdated = { [weak contentParentNode, weak self] size in
- guard let strongSelf = self, let contentParentNode = contentParentNode, let parentSupernode = contentParentNode.supernode else {
- return
+ private func initializeContent() {
+ switch self.source {
+ case let .extracted(source):
+ let takenViewInfo = source.takeView()
+
+ if let takenViewInfo = takenViewInfo, let parentSupernode = takenViewInfo.contentContainingNode.supernode {
+ self.contentContainerNode.contentNode = .extracted(takenViewInfo.contentContainingNode)
+ let contentParentNode = takenViewInfo.contentContainingNode
+ takenViewInfo.contentContainingNode.layoutUpdated = { [weak contentParentNode, weak self] size in
+ guard let strongSelf = self, let contentParentNode = contentParentNode, let parentSupernode = contentParentNode.supernode else {
+ return
+ }
+ if strongSelf.isAnimatingOut {
+ return
+ }
+ strongSelf.originalProjectedContentViewFrame = (convertFrame(contentParentNode.frame, from: parentSupernode.view, to: strongSelf.view), convertFrame(contentParentNode.contentRect, from: contentParentNode.view, to: strongSelf.view))
+ if let validLayout = strongSelf.validLayout {
+ strongSelf.updateLayout(layout: validLayout, transition: .animated(duration: 0.2 * animationDurationFactor, curve: .easeInOut), previousActionsContainerNode: nil)
+ }
}
- if strongSelf.isAnimatingOut {
- return
- }
- strongSelf.originalProjectedContentViewFrame = (convertFrame(contentParentNode.frame, from: parentSupernode.view, to: strongSelf.view), convertFrame(contentParentNode.contentRect, from: contentParentNode.view, to: strongSelf.view))
- if let validLayout = strongSelf.validLayout {
- strongSelf.updateLayout(layout: validLayout, transition: .animated(duration: 0.2 * animationDurationFactor, curve: .easeInOut), previousActionsContainerNode: nil)
- }
- }
- takenViewInfo.contentContainingNode.updateDistractionFreeMode = { [weak self] value in
- guard let strongSelf = self, let reactionContextNode = strongSelf.reactionContextNode else {
- return
- }
- if value {
- if !reactionContextNode.alpha.isZero {
- reactionContextNode.alpha = 0.0
+ takenViewInfo.contentContainingNode.updateDistractionFreeMode = { [weak self] value in
+ guard let strongSelf = self, let reactionContextNode = strongSelf.reactionContextNode else {
+ return
+ }
+ if value {
+ if !reactionContextNode.alpha.isZero {
+ reactionContextNode.alpha = 0.0
+ reactionContextNode.allowsGroupOpacity = true
+ reactionContextNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3 * animationDurationFactor, completion: { [weak reactionContextNode] _ in
+ reactionContextNode?.allowsGroupOpacity = false
+ })
+ }
+ } else if reactionContextNode.alpha != 1.0 {
+ reactionContextNode.alpha = 1.0
reactionContextNode.allowsGroupOpacity = true
- reactionContextNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3 * animationDurationFactor, completion: { [weak reactionContextNode] _ in
+ reactionContextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3 * animationDurationFactor, completion: { [weak reactionContextNode] _ in
reactionContextNode?.allowsGroupOpacity = false
})
}
- } else if reactionContextNode.alpha != 1.0 {
- reactionContextNode.alpha = 1.0
- reactionContextNode.allowsGroupOpacity = true
- reactionContextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3 * animationDurationFactor, completion: { [weak reactionContextNode] _ in
- reactionContextNode?.allowsGroupOpacity = false
- })
}
+
+ self.contentAreaInScreenSpace = takenViewInfo.contentAreaInScreenSpace
+ self.contentContainerNode.addSubnode(takenViewInfo.contentContainingNode.contentNode)
+ takenViewInfo.contentContainingNode.isExtractedToContextPreview = true
+ takenViewInfo.contentContainingNode.isExtractedToContextPreviewUpdated?(true)
+
+ self.originalProjectedContentViewFrame = (convertFrame(takenViewInfo.contentContainingNode.frame, from: parentSupernode.view, to: self.view), convertFrame(takenViewInfo.contentContainingNode.contentRect, from: takenViewInfo.contentContainingNode.view, to: self.view))
}
- self.contentContainerNode.contentNode = takenViewInfo.contentContainingNode.contentNode
+ case let .controller(source):
+ let contentParentNode = ContextControllerContentNode(controller: source.controller)
+ self.contentContainerNode.contentNode = .controller(contentParentNode)
+ self.contentContainerNode.clipsToBounds = true
+ self.contentContainerNode.cornerRadius = 14.0
+ self.contentContainerNode.addSubnode(contentParentNode)
- self.contentAreaInScreenSpace = takenViewInfo.contentAreaInScreenSpace
- self.contentContainerNode.addSubnode(takenViewInfo.contentContainingNode.contentNode)
- takenViewInfo.contentContainingNode.isExtractedToContextPreview = true
- takenViewInfo.contentContainingNode.isExtractedToContextPreviewUpdated?(true)
-
- self.originalProjectedContentViewFrame = (convertFrame(takenViewInfo.contentContainingNode.frame, from: parentSupernode.view, to: self.view), convertFrame(takenViewInfo.contentContainingNode.contentRect, from: takenViewInfo.contentContainingNode.view, to: self.view))
-
- var updatedContentAreaInScreenSpace = takenViewInfo.contentAreaInScreenSpace
- updatedContentAreaInScreenSpace.origin.x = 0.0
- updatedContentAreaInScreenSpace.size.width = self.bounds.width
-
- self.clippingNode.layer.animateFrame(from: updatedContentAreaInScreenSpace, to: self.clippingNode.frame, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue)
- self.clippingNode.layer.animateBoundsOriginYAdditive(from: updatedContentAreaInScreenSpace.minY, to: 0.0, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue)
+ let transitionInfo = source.transitionInfo()
+ if let transitionInfo = transitionInfo, let (sourceNode, sourceNodeRect) = transitionInfo.sourceNode() {
+ let projectedFrame = convertFrame(sourceNodeRect, from: sourceNode.view, to: self.view)
+ self.originalProjectedContentViewFrame = (projectedFrame, projectedFrame)
+ }
+ }
+ }
+
+ func animateIn() {
+ self.gesture?.endPressedAppearance()
+
+ self.hapticFeedback.impact()
+
+ switch self.source {
+ case let .extracted(source):
+ if let contentAreaInScreenSpace = contentAreaInScreenSpace {
+ var updatedContentAreaInScreenSpace = contentAreaInScreenSpace
+ updatedContentAreaInScreenSpace.origin.x = 0.0
+ updatedContentAreaInScreenSpace.size.width = self.bounds.width
+
+ self.clippingNode.layer.animateFrame(from: updatedContentAreaInScreenSpace, to: self.clippingNode.frame, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue)
+ self.clippingNode.layer.animateBoundsOriginYAdditive(from: updatedContentAreaInScreenSpace.minY, to: 0.0, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue)
+ }
+ case let .controller(source):
+ let transitionInfo = source.transitionInfo()
+ if let transitionInfo = transitionInfo, let (sourceNode, sourceNodeRect) = transitionInfo.sourceNode() {
+ let projectedFrame = convertFrame(sourceNodeRect, from: sourceNode.view, to: self.view)
+ self.originalProjectedContentViewFrame = (projectedFrame, projectedFrame)
+
+ var updatedContentAreaInScreenSpace = transitionInfo.contentAreaInScreenSpace
+ updatedContentAreaInScreenSpace.origin.x = 0.0
+ updatedContentAreaInScreenSpace.size.width = self.bounds.width
+ self.contentAreaInScreenSpace = updatedContentAreaInScreenSpace
+ }
}
if let validLayout = self.validLayout {
@@ -351,14 +491,14 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
let propertyAnimator = propertyAnimator as? UIViewPropertyAnimator
propertyAnimator?.stopAnimation(true)
}
- self.propertyAnimator = UIViewPropertyAnimator(duration: 0.2 * animationDurationFactor, curve: .easeInOut, animations: { [weak self] in
+ self.propertyAnimator = UIViewPropertyAnimator(duration: 0.2 * animationDurationFactor * UIView.animationDurationFactor(), curve: .easeInOut, animations: { [weak self] in
self?.effectView.effect = makeCustomZoomBlurEffect()
})
}
if let _ = self.propertyAnimator {
if #available(iOSApplicationExtension 10.0, iOS 10.0, *) {
- self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor, from: 0.0, to: 1.0, update: { [weak self] value in
+ self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor * UIView.animationDurationFactor(), from: 0.0, to: 1.0, update: { [weak self] value in
(self?.propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete = value
}, completion: { [weak self] in
self?.didCompleteAnimationIn = true
@@ -372,22 +512,50 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
self?.didCompleteAnimationIn = true
})
}
- self.actionsContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2 * animationDurationFactor)
- let springDuration: Double = 0.42 * animationDurationFactor
- let springDamping: CGFloat = 104.0
- self.actionsContainerNode.layer.animateSpring(from: 0.1 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: springDuration, initialVelocity: 0.0, damping: springDamping)
- if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode {
- let localSourceFrame = self.view.convert(originalProjectedContentViewFrame.1, to: self.scrollNode.view)
-
- if let reactionContextNode = self.reactionContextNode {
- reactionContextNode.animateIn(from: CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: contentParentNode.contentRect.size))
+ if let contentNode = self.contentContainerNode.contentNode {
+ switch contentNode {
+ case let .extracted(extracted):
+ let springDuration: Double = 0.42 * animationDurationFactor
+ let springDamping: CGFloat = 104.0
+
+ self.actionsContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2 * animationDurationFactor)
+ self.actionsContainerNode.layer.animateSpring(from: 0.1 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: springDuration, initialVelocity: 0.0, damping: springDamping)
+
+ if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame {
+ let contentParentNode = extracted
+ let localSourceFrame = self.view.convert(originalProjectedContentViewFrame.1, to: self.scrollNode.view)
+
+ if let reactionContextNode = self.reactionContextNode {
+ reactionContextNode.animateIn(from: CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: contentParentNode.contentRect.size))
+ }
+
+ self.actionsContainerNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true)
+ let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y)
+ self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: contentContainerOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true)
+ contentParentNode.applyAbsoluteOffsetSpring?(-contentContainerOffset.y, springDuration, springDamping)
+ }
+ case .controller:
+ let springDuration: Double = 0.52 * animationDurationFactor
+ let springDamping: CGFloat = 110.0
+
+ self.actionsContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2 * animationDurationFactor)
+ self.actionsContainerNode.layer.animateSpring(from: 0.1 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: springDuration, initialVelocity: 0.0, damping: springDamping)
+ self.contentContainerNode.allowsGroupOpacity = true
+ self.contentContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2 * animationDurationFactor, completion: { [weak self] _ in
+ self?.contentContainerNode.allowsGroupOpacity = false
+ })
+ self.contentContainerNode.layer.animateSpring(from: 0.1 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: springDuration, initialVelocity: 0.0, damping: springDamping)
+
+ if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame {
+ let actionsSideInset: CGFloat = 11.0
+
+ let localSourceFrame = self.view.convert(CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: CGSize(width: originalProjectedContentViewFrame.1.width, height: originalProjectedContentViewFrame.1.height)), to: self.scrollNode.view)
+ self.actionsContainerNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true)
+ let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y)
+ self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: contentContainerOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true)
+ }
}
-
- self.actionsContainerNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true)
- let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y)
- self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: contentContainerOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true)
- contentParentNode.applyAbsoluteOffsetSpring?(-contentContainerOffset.y, springDuration, springDamping)
}
}
@@ -396,146 +564,284 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
var transitionCurve: ContainedViewLayoutTransitionCurve = .easeInOut
var result = initialResult
- let putBackInfo = self.source.putBack()
- if putBackInfo == nil {
- result = .dismissWithoutContent
- }
-
- switch result {
- case let .custom(value):
- switch value {
- case let .animated(duration, curve):
- transitionDuration = duration
- transitionCurve = curve
+ switch self.source {
+ case let .extracted(source):
+ guard let maybeContentNode = self.contentContainerNode.contentNode, case let .extracted(contentParentNode) = maybeContentNode else {
+ return
+ }
+
+ let putBackInfo = source.putBack()
+
+ if putBackInfo == nil {
+ result = .dismissWithoutContent
+ }
+
+ switch result {
+ case let .custom(value):
+ switch value {
+ case let .animated(duration, curve):
+ transitionDuration = duration
+ transitionCurve = curve
+ default:
+ break
+ }
default:
break
}
- default:
- break
- }
-
- self.isUserInteractionEnabled = false
- self.isAnimatingOut = true
-
- self.scrollNode.view.setContentOffset(self.scrollNode.view.contentOffset, animated: false)
-
- var completedEffect = false
- var completedContentNode = false
- var completedActionsNode = false
-
- if let putBackInfo = putBackInfo, let contentParentNode = self.contentParentNode, let parentSupernode = contentParentNode.supernode {
- self.originalProjectedContentViewFrame = (convertFrame(contentParentNode.frame, from: parentSupernode.view, to: self.view), convertFrame(contentParentNode.contentRect, from: contentParentNode.view, to: self.view))
- var updatedContentAreaInScreenSpace = putBackInfo.contentAreaInScreenSpace
- updatedContentAreaInScreenSpace.origin.x = 0.0
- updatedContentAreaInScreenSpace.size.width = self.bounds.width
+ self.isUserInteractionEnabled = false
+ self.isAnimatingOut = true
- self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: updatedContentAreaInScreenSpace, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false)
- self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: updatedContentAreaInScreenSpace.minY, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false)
- }
-
- let contentParentNode = self.contentParentNode
-
- contentParentNode?.willUpdateIsExtractedToContextPreview?(false)
-
- let intermediateCompletion: () -> Void = { [weak contentParentNode] in
- if completedEffect && completedContentNode && completedActionsNode {
- switch result {
- case .default, .custom:
- if let contentParentNode = contentParentNode {
- contentParentNode.addSubnode(contentParentNode.contentNode)
- contentParentNode.isExtractedToContextPreview = false
- contentParentNode.isExtractedToContextPreviewUpdated?(false)
- }
- case .dismissWithoutContent:
- break
- }
+ self.scrollNode.view.setContentOffset(self.scrollNode.view.contentOffset, animated: false)
+
+ var completedEffect = false
+ var completedContentNode = false
+ var completedActionsNode = false
+
+ if let putBackInfo = putBackInfo, let parentSupernode = contentParentNode.supernode {
+ self.originalProjectedContentViewFrame = (convertFrame(contentParentNode.frame, from: parentSupernode.view, to: self.view), convertFrame(contentParentNode.contentRect, from: contentParentNode.view, to: self.view))
- completion()
+ var updatedContentAreaInScreenSpace = putBackInfo.contentAreaInScreenSpace
+ updatedContentAreaInScreenSpace.origin.x = 0.0
+ updatedContentAreaInScreenSpace.size.width = self.bounds.width
+
+ self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: updatedContentAreaInScreenSpace, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false)
+ self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: updatedContentAreaInScreenSpace.minY, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false)
}
- }
-
- if #available(iOS 10.0, *) {
- if let propertyAnimator = self.propertyAnimator {
- let propertyAnimator = propertyAnimator as? UIViewPropertyAnimator
- propertyAnimator?.stopAnimation(true)
+
+ contentParentNode.willUpdateIsExtractedToContextPreview?(false)
+
+ let intermediateCompletion: () -> Void = { [weak contentParentNode] in
+ if completedEffect && completedContentNode && completedActionsNode {
+ switch result {
+ case .default, .custom:
+ if let contentParentNode = contentParentNode {
+ contentParentNode.addSubnode(contentParentNode.contentNode)
+ contentParentNode.isExtractedToContextPreview = false
+ contentParentNode.isExtractedToContextPreviewUpdated?(false)
+ }
+ case .dismissWithoutContent:
+ break
+ }
+
+ completion()
+ }
}
- self.propertyAnimator = UIViewPropertyAnimator(duration: transitionDuration, curve: .easeInOut, animations: { [weak self] in
- self?.effectView.effect = nil
- })
- }
-
- if let _ = self.propertyAnimator {
- if #available(iOSApplicationExtension 10.0, iOS 10.0, *) {
- self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor, from: 0.0, to: 0.999, update: { [weak self] value in
- (self?.propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete = value
- }, completion: {
+
+ if #available(iOS 10.0, *) {
+ if let propertyAnimator = self.propertyAnimator {
+ let propertyAnimator = propertyAnimator as? UIViewPropertyAnimator
+ propertyAnimator?.stopAnimation(true)
+ }
+ self.propertyAnimator = UIViewPropertyAnimator(duration: transitionDuration * UIView.animationDurationFactor(), curve: .easeInOut, animations: { [weak self] in
+ self?.effectView.effect = nil
+ })
+ }
+
+ if let _ = self.propertyAnimator {
+ if #available(iOSApplicationExtension 10.0, iOS 10.0, *) {
+ self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor * UIView.animationDurationFactor(), from: 0.0, to: 0.999, update: { [weak self] value in
+ (self?.propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete = value
+ }, completion: {
+ completedEffect = true
+ intermediateCompletion()
+ })
+ }
+ self.effectView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.05 * animationDurationFactor, delay: 0.15, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false)
+ } else {
+ UIView.animate(withDuration: 0.21 * animationDurationFactor, animations: {
+ if #available(iOS 9.0, *) {
+ self.effectView.effect = nil
+ } else {
+ self.effectView.alpha = 0.0
+ }
+ }, completion: { _ in
completedEffect = true
intermediateCompletion()
})
}
- self.effectView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.05 * animationDurationFactor, delay: 0.15, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false)
- } else {
- UIView.animate(withDuration: 0.21 * animationDurationFactor, animations: {
- if #available(iOS 9.0, *) {
- self.effectView.effect = nil
- } else {
- self.effectView.alpha = 0.0
+
+ self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false)
+ self.actionsContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in
+ completedActionsNode = true
+ intermediateCompletion()
+ })
+ self.actionsContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false)
+
+ let animateOutToItem: Bool
+ switch result {
+ case .default, .custom:
+ animateOutToItem = true
+ case .dismissWithoutContent:
+ animateOutToItem = false
+ }
+
+ if animateOutToItem, let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame {
+ let localSourceFrame = self.view.convert(originalProjectedContentViewFrame.1, to: self.scrollNode.view)
+ self.actionsContainerNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y), duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false, additive: true)
+ let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y - contentParentNode.contentRect.minY)
+ self.contentContainerNode.layer.animatePosition(from: CGPoint(), to: contentContainerOffset, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false, additive: true, completion: { _ in
+ completedContentNode = true
+ intermediateCompletion()
+ })
+ contentParentNode.updateAbsoluteRect?(self.contentContainerNode.frame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y + contentContainerOffset.y), self.bounds.size)
+ contentParentNode.applyAbsoluteOffset?(-contentContainerOffset.y, transitionCurve, transitionDuration)
+
+ if let reactionContextNode = self.reactionContextNode {
+ reactionContextNode.animateOut(to: CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: contentParentNode.contentRect.size), animatingOutToReaction: self.reactionContextNodeIsAnimatingOut)
+ }
+ } else {
+ if let snapshotView = contentParentNode.contentNode.view.snapshotContentTree() {
+ self.contentContainerNode.view.addSubview(snapshotView)
+ }
+
+ contentParentNode.addSubnode(contentParentNode.contentNode)
+ contentParentNode.isExtractedToContextPreview = false
+ contentParentNode.isExtractedToContextPreviewUpdated?(false)
+
+ self.contentContainerNode.allowsGroupOpacity = true
+ self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false, completion: { _ in
+ completedContentNode = true
+ intermediateCompletion()
+ })
+ //self.contentContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false)
+
+ if let reactionContextNode = self.reactionContextNode {
+ reactionContextNode.animateOut(to: nil, animatingOutToReaction: self.reactionContextNodeIsAnimatingOut)
}
- }, completion: { _ in
- completedEffect = true
- intermediateCompletion()
- })
- }
-
- self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false)
- self.actionsContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in
- completedActionsNode = true
- intermediateCompletion()
- })
- self.actionsContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false)
-
- let animateOutToItem: Bool
- switch result {
- case .default, .custom:
- animateOutToItem = true
- case .dismissWithoutContent:
- animateOutToItem = false
- }
-
- if animateOutToItem, let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode {
- let localSourceFrame = self.view.convert(originalProjectedContentViewFrame.1, to: self.scrollNode.view)
- self.actionsContainerNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y), duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false, additive: true)
- let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y - contentParentNode.contentRect.minY)
- self.contentContainerNode.layer.animatePosition(from: CGPoint(), to: contentContainerOffset, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false, additive: true, completion: { _ in
- completedContentNode = true
- intermediateCompletion()
- })
- contentParentNode.updateAbsoluteRect?(self.contentContainerNode.frame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y + contentContainerOffset.y), self.bounds.size)
- contentParentNode.applyAbsoluteOffset?(-contentContainerOffset.y, transitionCurve, transitionDuration)
-
- if let reactionContextNode = self.reactionContextNode {
- reactionContextNode.animateOut(to: CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: contentParentNode.contentRect.size), animatingOutToReaction: self.reactionContextNodeIsAnimatingOut)
}
- } else if let contentParentNode = self.contentParentNode {
- if let snapshotView = contentParentNode.contentNode.view.snapshotContentTree() {
- self.contentContainerNode.view.addSubview(snapshotView)
+ case let .controller(source):
+ guard let maybeContentNode = self.contentContainerNode.contentNode, case let .controller(controller) = maybeContentNode else {
+ return
}
- contentParentNode.addSubnode(contentParentNode.contentNode)
- contentParentNode.isExtractedToContextPreview = false
- contentParentNode.isExtractedToContextPreviewUpdated?(false)
+ let transitionInfo = source.transitionInfo()
- self.contentContainerNode.allowsGroupOpacity = true
- self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false, completion: { _ in
- completedContentNode = true
+ if transitionInfo == nil {
+ result = .dismissWithoutContent
+ }
+
+ switch result {
+ case let .custom(value):
+ switch value {
+ case let .animated(duration, curve):
+ transitionDuration = duration
+ transitionCurve = curve
+ default:
+ break
+ }
+ default:
+ break
+ }
+
+ self.isUserInteractionEnabled = false
+ self.isAnimatingOut = true
+
+ self.scrollNode.view.setContentOffset(self.scrollNode.view.contentOffset, animated: false)
+
+ var completedEffect = false
+ var completedContentNode = false
+ var completedActionsNode = false
+
+ if let transitionInfo = transitionInfo, let (sourceNode, sourceNodeRect) = transitionInfo.sourceNode() {
+ let projectedFrame = convertFrame(sourceNodeRect, from: sourceNode.view, to: self.view)
+ self.originalProjectedContentViewFrame = (projectedFrame, projectedFrame)
+
+ var updatedContentAreaInScreenSpace = transitionInfo.contentAreaInScreenSpace
+ updatedContentAreaInScreenSpace.origin.x = 0.0
+ updatedContentAreaInScreenSpace.size.width = self.bounds.width
+ }
+
+ let intermediateCompletion: () -> Void = {
+ if completedEffect && completedContentNode && completedActionsNode {
+ switch result {
+ case .default, .custom:
+ break
+ case .dismissWithoutContent:
+ break
+ }
+
+ completion()
+ }
+ }
+
+ if #available(iOS 10.0, *) {
+ if let propertyAnimator = self.propertyAnimator {
+ let propertyAnimator = propertyAnimator as? UIViewPropertyAnimator
+ propertyAnimator?.stopAnimation(true)
+ }
+ self.propertyAnimator = UIViewPropertyAnimator(duration: transitionDuration * UIView.animationDurationFactor(), curve: .easeInOut, animations: { [weak self] in
+ self?.effectView.effect = nil
+ })
+ }
+
+ if let _ = self.propertyAnimator {
+ if #available(iOSApplicationExtension 10.0, iOS 10.0, *) {
+ self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor * UIView.animationDurationFactor(), from: 0.0, to: 0.999, update: { [weak self] value in
+ (self?.propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete = value
+ }, completion: {
+ completedEffect = true
+ intermediateCompletion()
+ })
+ }
+ self.effectView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.05 * animationDurationFactor, delay: 0.15, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false)
+ } else {
+ UIView.animate(withDuration: 0.21 * animationDurationFactor, 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: transitionDuration * animationDurationFactor, removeOnCompletion: false)
+ self.actionsContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in
+ completedActionsNode = true
intermediateCompletion()
})
- //self.contentContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false)
+ self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in
+ })
+ self.actionsContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false)
+ self.contentContainerNode.layer.animateScale(from: 1.0, to: 0.01, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false)
- if let reactionContextNode = self.reactionContextNode {
- reactionContextNode.animateOut(to: nil, animatingOutToReaction: self.reactionContextNodeIsAnimatingOut)
+ let animateOutToItem: Bool
+ switch result {
+ case .default, .custom:
+ animateOutToItem = true
+ case .dismissWithoutContent:
+ animateOutToItem = false
+ }
+
+ if animateOutToItem, let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame {
+ let actionsSideInset: CGFloat = 11.0
+
+ let localSourceFrame = self.view.convert(CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: CGSize(width: originalProjectedContentViewFrame.1.width, height: originalProjectedContentViewFrame.1.height)), to: self.scrollNode.view)
+
+ self.actionsContainerNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y), duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false, additive: true)
+ let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y)
+ self.contentContainerNode.layer.animatePosition(from: CGPoint(), to: contentContainerOffset, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false, additive: true, completion: { _ in
+ completedContentNode = true
+ intermediateCompletion()
+ })
+ } else {
+ if let snapshotView = controller.view.snapshotContentTree() {
+ self.contentContainerNode.view.addSubview(snapshotView)
+ }
+
+ self.contentContainerNode.allowsGroupOpacity = true
+ self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false, completion: { _ in
+ completedContentNode = true
+ intermediateCompletion()
+ })
+
+ if let reactionContextNode = self.reactionContextNode {
+ reactionContextNode.animateOut(to: nil, animatingOutToReaction: self.reactionContextNodeIsAnimatingOut)
+ }
}
}
}
@@ -573,12 +879,23 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
})
}
- func setItems(controller: ContextController, items: [ContextMenuItem]) {
+ func setItemsSignal(items: Signal<[ContextMenuItem], NoError>) {
self.items = items
+ self.itemsDisposable.set((items
+ |> deliverOnMainQueue).start(next: { [weak self] items in
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.setItems(items: items)
+ }))
+ }
+
+ private func setItems(items: [ContextMenuItem]) {
+ self.currentItems = items
let previousActionsContainerNode = self.actionsContainerNode
- self.actionsContainerNode = ContextActionsContainerNode(theme: self.theme, items: items, getController: { [weak controller] in
- return controller
+ self.actionsContainerNode = ContextActionsContainerNode(theme: self.theme, items: items, getController: { [weak self] in
+ return self?.getController()
}, actionSelected: { [weak self] result in
self?.beginDismiss(result)
})
@@ -590,6 +907,11 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
} else {
previousActionsContainerNode.removeFromSupernode()
}
+
+ if !self.didSetItemsReady {
+ self.didSetItemsReady = true
+ self.itemsReady.set(.single(true))
+ }
}
func updateTheme(theme: PresentationTheme) {
@@ -621,7 +943,6 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(), size: layout.size))
- let contentActionsSpacing: CGFloat = 7.0
let actionsSideInset: CGFloat = 11.0
var contentTopInset: CGFloat = max(11.0, layout.statusBarHeight ?? 0.0)
if let _ = self.reactionContextNode {
@@ -629,55 +950,122 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
let actionsBottomInset: CGFloat = 11.0
- if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode {
- let isInitialLayout = self.actionsContainerNode.frame.size.width.isZero
- let previousContainerFrame = self.view.convert(self.contentContainerNode.frame, from: self.scrollNode.view)
-
- let actionsSize = self.actionsContainerNode.updateLayout(constrainedWidth: layout.size.width - actionsSideInset * 2.0, transition: actionsContainerTransition)
- let contentSize = originalProjectedContentViewFrame.1.size
- self.contentContainerNode.updateLayout(size: contentSize, transition: transition)
-
- let maximumActionsFrameOrigin = max(60.0, layout.size.height - layout.intrinsicInsets.bottom - actionsBottomInset - actionsSize.height)
- var originalActionsFrame = CGRect(origin: CGPoint(x: max(actionsSideInset, min(layout.size.width - actionsSize.width - actionsSideInset, originalProjectedContentViewFrame.1.minX)), y: min(originalProjectedContentViewFrame.1.maxY + contentActionsSpacing, maximumActionsFrameOrigin)), size: actionsSize)
- var originalContentFrame = CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalActionsFrame.minY - contentActionsSpacing - originalProjectedContentViewFrame.1.size.height), size: originalProjectedContentViewFrame.1.size)
- let topEdge = max(contentTopInset, self.contentAreaInScreenSpace?.minY ?? 0.0)
- if originalContentFrame.minY < topEdge {
- let requiredOffset = topEdge - originalContentFrame.minY
- let availableOffset = max(0.0, layout.size.height - layout.intrinsicInsets.bottom - actionsBottomInset - originalActionsFrame.maxY)
- let offset = min(requiredOffset, availableOffset)
- originalActionsFrame = originalActionsFrame.offsetBy(dx: 0.0, dy: offset)
- originalContentFrame = originalContentFrame.offsetBy(dx: 0.0, dy: offset)
- }
-
- let contentHeight = max(layout.size.height, max(layout.size.height, originalActionsFrame.maxY + actionsBottomInset) - originalContentFrame.minY + contentTopInset)
-
- let scrollContentSize = CGSize(width: layout.size.width, height: contentHeight)
- if self.scrollNode.view.contentSize != scrollContentSize {
- self.scrollNode.view.contentSize = scrollContentSize
- }
-
- let overflowOffset = min(0.0, originalContentFrame.minY - contentTopInset)
-
- let contentContainerFrame = originalContentFrame.offsetBy(dx: -contentParentNode.contentRect.minX, dy: -overflowOffset - contentParentNode.contentRect.minY)
- transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame)
- actionsContainerTransition.updateFrame(node: self.actionsContainerNode, frame: originalActionsFrame.offsetBy(dx: 0.0, dy: -overflowOffset))
-
- if isInitialLayout {
- self.scrollNode.view.contentOffset = CGPoint(x: 0.0, y: -overflowOffset)
- let currentContainerFrame = self.view.convert(self.contentContainerNode.frame, from: self.scrollNode.view)
- if overflowOffset < 0.0 {
- transition.animateOffsetAdditive(node: self.scrollNode, offset: currentContainerFrame.minY - previousContainerFrame.minY)
+ if let contentNode = self.contentContainerNode.contentNode {
+ switch contentNode {
+ case let .extracted(contentParentNode):
+ let contentActionsSpacing: CGFloat = 8.0
+ if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame {
+ let isInitialLayout = self.actionsContainerNode.frame.size.width.isZero
+ let previousContainerFrame = self.view.convert(self.contentContainerNode.frame, from: self.scrollNode.view)
+
+ let actionsSize = self.actionsContainerNode.updateLayout(constrainedWidth: layout.size.width - actionsSideInset * 2.0, transition: actionsContainerTransition)
+ let contentSize = originalProjectedContentViewFrame.1.size
+ self.contentContainerNode.updateLayout(size: contentSize, scaledSize: contentSize, transition: transition)
+
+ let maximumActionsFrameOrigin = max(60.0, layout.size.height - layout.intrinsicInsets.bottom - actionsBottomInset - actionsSize.height)
+ var originalActionsFrame = CGRect(origin: CGPoint(x: max(actionsSideInset, min(layout.size.width - actionsSize.width - actionsSideInset, originalProjectedContentViewFrame.1.minX)), y: min(originalProjectedContentViewFrame.1.maxY + contentActionsSpacing, maximumActionsFrameOrigin)), size: actionsSize)
+ var originalContentFrame = CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalActionsFrame.minY - contentActionsSpacing - originalProjectedContentViewFrame.1.size.height), size: originalProjectedContentViewFrame.1.size)
+ let topEdge = max(contentTopInset, self.contentAreaInScreenSpace?.minY ?? 0.0)
+ if originalContentFrame.minY < topEdge {
+ let requiredOffset = topEdge - originalContentFrame.minY
+ let availableOffset = max(0.0, layout.size.height - layout.intrinsicInsets.bottom - actionsBottomInset - originalActionsFrame.maxY)
+ let offset = min(requiredOffset, availableOffset)
+ originalActionsFrame = originalActionsFrame.offsetBy(dx: 0.0, dy: offset)
+ originalContentFrame = originalContentFrame.offsetBy(dx: 0.0, dy: offset)
+ }
+
+ let contentHeight = max(layout.size.height, max(layout.size.height, originalActionsFrame.maxY + actionsBottomInset) - originalContentFrame.minY + contentTopInset)
+
+ let scrollContentSize = CGSize(width: layout.size.width, height: contentHeight)
+ if self.scrollNode.view.contentSize != scrollContentSize {
+ self.scrollNode.view.contentSize = scrollContentSize
+ }
+
+ let overflowOffset = min(0.0, originalContentFrame.minY - contentTopInset)
+
+ let contentContainerFrame = originalContentFrame.offsetBy(dx: -contentParentNode.contentRect.minX, dy: -overflowOffset - contentParentNode.contentRect.minY)
+ transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame)
+ actionsContainerTransition.updateFrame(node: self.actionsContainerNode, frame: originalActionsFrame.offsetBy(dx: 0.0, dy: -overflowOffset))
+
+ if isInitialLayout {
+ self.scrollNode.view.contentOffset = CGPoint(x: 0.0, y: -overflowOffset)
+ let currentContainerFrame = self.view.convert(self.contentContainerNode.frame, from: self.scrollNode.view)
+ if overflowOffset < 0.0 {
+ transition.animateOffsetAdditive(node: self.scrollNode, offset: currentContainerFrame.minY - previousContainerFrame.minY)
+ }
+ }
+
+ let absoluteContentRect = contentContainerFrame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y)
+
+ contentParentNode.updateAbsoluteRect?(absoluteContentRect, layout.size)
+
+ if let reactionContextNode = self.reactionContextNode {
+ let insets = layout.insets(options: [.statusBar])
+ transition.updateFrame(node: reactionContextNode, frame: CGRect(origin: CGPoint(), size: layout.size))
+ reactionContextNode.updateLayout(size: layout.size, insets: insets, anchorRect: CGRect(origin: CGPoint(x: absoluteContentRect.minX + contentParentNode.contentRect.minX, y: absoluteContentRect.minY + contentParentNode.contentRect.minY), size: contentParentNode.contentRect.size), transition: transition)
+ }
+ }
+ case let .controller(contentParentNode):
+ let contentActionsSpacing: CGFloat = actionsSideInset
+ let topEdge = max(contentTopInset, self.contentAreaInScreenSpace?.minY ?? 0.0)
+
+ //contentParentNode.updateLayout(size: layout.size, transition: transition)
+
+ let isInitialLayout = self.actionsContainerNode.frame.size.width.isZero
+ let previousContainerFrame = self.view.convert(self.contentContainerNode.frame, from: self.scrollNode.view)
+
+ let actionsSize = self.actionsContainerNode.updateLayout(constrainedWidth: layout.size.width - actionsSideInset * 2.0, transition: actionsContainerTransition)
+ let contentScale = (layout.size.width - actionsSideInset * 2.0) / layout.size.width
+ let contentUnscaledSize: CGSize
+ if !contentParentNode.controller.preferredContentSize.width.isZero {
+ contentUnscaledSize = contentParentNode.controller.preferredContentSize
+ } else {
+ let proposedContentHeight = layout.size.height - topEdge - contentActionsSpacing - actionsSize.height - layout.intrinsicInsets.bottom - actionsBottomInset
+ contentUnscaledSize = CGSize(width: layout.size.width, height: max(400.0, proposedContentHeight))
+ }
+ let contentSize = CGSize(width: floor(contentUnscaledSize.width * contentScale), height: floor(contentUnscaledSize.height * contentScale))
+
+ self.contentContainerNode.updateLayout(size: contentUnscaledSize, scaledSize: contentSize, transition: transition)
+
+ let maximumActionsFrameOrigin = max(60.0, layout.size.height - layout.intrinsicInsets.bottom - actionsBottomInset - actionsSize.height)
+ var originalActionsFrame = CGRect(origin: CGPoint(x: actionsSideInset, y: min(maximumActionsFrameOrigin, floor((layout.size.height - contentActionsSpacing - contentSize.height) / 2.0) + contentSize.height + contentActionsSpacing)), size: actionsSize)
+ var originalContentFrame = CGRect(origin: CGPoint(x: actionsSideInset, y: originalActionsFrame.minY - contentActionsSpacing - contentSize.height), size: contentSize)
+ if originalContentFrame.minY < topEdge {
+ let requiredOffset = topEdge - originalContentFrame.minY
+ let availableOffset = max(0.0, layout.size.height - layout.intrinsicInsets.bottom - actionsBottomInset - originalActionsFrame.maxY)
+ let offset = min(requiredOffset, availableOffset)
+ originalActionsFrame = originalActionsFrame.offsetBy(dx: 0.0, dy: offset)
+ originalContentFrame = originalContentFrame.offsetBy(dx: 0.0, dy: offset)
+ }
+
+ let contentHeight = max(layout.size.height, max(layout.size.height, originalActionsFrame.maxY + actionsBottomInset) - originalContentFrame.minY + contentTopInset)
+
+ let scrollContentSize = CGSize(width: layout.size.width, height: contentHeight)
+ if self.scrollNode.view.contentSize != scrollContentSize {
+ self.scrollNode.view.contentSize = scrollContentSize
+ }
+
+ let overflowOffset = min(0.0, originalContentFrame.minY - contentTopInset)
+
+ let contentContainerFrame = originalContentFrame
+ transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame.offsetBy(dx: 0.0, dy: -overflowOffset))
+ actionsContainerTransition.updateFrame(node: self.actionsContainerNode, frame: originalActionsFrame.offsetBy(dx: 0.0, dy: -overflowOffset))
+
+ if isInitialLayout {
+ self.scrollNode.view.contentOffset = CGPoint(x: 0.0, y: -overflowOffset)
+ let currentContainerFrame = self.view.convert(self.contentContainerNode.frame, from: self.scrollNode.view)
+ if overflowOffset < 0.0 {
+ transition.animateOffsetAdditive(node: self.scrollNode, offset: currentContainerFrame.minY - previousContainerFrame.minY)
+ }
+ }
+
+ let absoluteContentRect = contentContainerFrame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y)
+
+ if let reactionContextNode = self.reactionContextNode {
+ let insets = layout.insets(options: [.statusBar])
+ transition.updateFrame(node: reactionContextNode, frame: CGRect(origin: CGPoint(), size: layout.size))
+ reactionContextNode.updateLayout(size: layout.size, insets: insets, anchorRect: CGRect(origin: CGPoint(x: absoluteContentRect.minX, y: absoluteContentRect.minY), size: contentSize), transition: transition)
}
- }
-
- let absoluteContentRect = contentContainerFrame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y)
-
- contentParentNode.updateAbsoluteRect?(absoluteContentRect, layout.size)
-
- if let reactionContextNode = self.reactionContextNode {
- let insets = layout.insets(options: [.statusBar])
- transition.updateFrame(node: reactionContextNode, frame: CGRect(origin: CGPoint(), size: layout.size))
- reactionContextNode.updateLayout(size: layout.size, insets: insets, anchorRect: CGRect(origin: CGPoint(x: absoluteContentRect.minX + contentParentNode.contentRect.minX, y: absoluteContentRect.minY + contentParentNode.contentRect.minY), size: contentParentNode.contentRect.size), transition: transition)
}
}
@@ -701,7 +1089,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
- if let contentParentNode = self.contentParentNode, let layout = self.validLayout {
+ guard let layout = self.validLayout else {
+ return
+ }
+ if let maybeContentNode = self.contentContainerNode.contentNode, case let .extracted(contentParentNode) = maybeContentNode {
let contentContainerFrame = self.contentContainerNode.frame
contentParentNode.updateAbsoluteRect?(contentContainerFrame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y), layout.size)
}
@@ -717,14 +1108,19 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
}
let mappedPoint = self.view.convert(point, to: self.scrollNode.view)
- if let contentParentNode = self.contentParentNode {
- let contentPoint = self.view.convert(point, to: contentParentNode.contentNode.view)
- if let result = contentParentNode.contentNode.hitTest(contentPoint, with: event) {
- if result is TextSelectionNodeView {
- return result
- } else if contentParentNode.contentRect.contains(contentPoint) {
- return contentParentNode.contentNode.view
+ if let maybeContentNode = self.contentContainerNode.contentNode {
+ switch maybeContentNode {
+ case let .extracted(contentParentNode):
+ let contentPoint = self.view.convert(point, to: contentParentNode.contentNode.view)
+ if let result = contentParentNode.contentNode.hitTest(contentPoint, with: event) {
+ if result is TextSelectionNodeView {
+ return result
+ } else if contentParentNode.contentRect.contains(contentPoint) {
+ return contentParentNode.contentNode.view
+ }
}
+ case let .controller(controller):
+ break
}
}
@@ -737,15 +1133,25 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
public final class ContextControllerTakeViewInfo {
- public let contentContainingNode: ContextContentContainingNode
+ public let contentContainingNode: ContextExtractedContentContainingNode
public let contentAreaInScreenSpace: CGRect
- public init(contentContainingNode: ContextContentContainingNode, contentAreaInScreenSpace: CGRect) {
+ public init(contentContainingNode: ContextExtractedContentContainingNode, contentAreaInScreenSpace: CGRect) {
self.contentContainingNode = contentContainingNode
self.contentAreaInScreenSpace = contentAreaInScreenSpace
}
}
+public final class ContextControllerTakeControllerInfo {
+ public let contentAreaInScreenSpace: CGRect
+ public let sourceNode: () -> (ASDisplayNode, CGRect)?
+
+ public init(contentAreaInScreenSpace: CGRect, sourceNode: @escaping () -> (ASDisplayNode, CGRect)?) {
+ self.contentAreaInScreenSpace = contentAreaInScreenSpace
+ self.sourceNode = sourceNode
+ }
+}
+
public final class ContextControllerPutBackViewInfo {
public let contentAreaInScreenSpace: CGRect
@@ -754,20 +1160,36 @@ public final class ContextControllerPutBackViewInfo {
}
}
-public protocol ContextControllerContentSource: class {
+public protocol ContextExtractedContentSource: class {
func takeView() -> ContextControllerTakeViewInfo?
func putBack() -> ContextControllerPutBackViewInfo?
}
+public protocol ContextControllerContentSource: class {
+ var controller: ViewController { get }
+ func transitionInfo() -> ContextControllerTakeControllerInfo?
+}
+
+public enum ContextContentSource {
+ case extracted(ContextExtractedContentSource)
+ case controller(ContextControllerContentSource)
+}
+
public final class ContextController: ViewController {
private let account: Account
private var theme: PresentationTheme
private var strings: PresentationStrings
- private let source: ContextControllerContentSource
- private var items: [ContextMenuItem]
+ private let source: ContextContentSource
+ private var items: Signal<[ContextMenuItem], NoError>
private var reactionItems: [ReactionContextItem]
+ private let _ready = Promise()
+ override public var ready: Promise {
+ return self._ready
+ }
+
private weak var recognizer: TapLongTapOrDoubleTapGestureRecognizer?
+ private weak var gesture: ContextGesture?
private var animatedDidAppear = false
private var wasDismissed = false
@@ -778,7 +1200,7 @@ public final class ContextController: ViewController {
public var reactionSelected: ((String) -> Void)?
- public init(account: Account, theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], reactionItems: [ReactionContextItem], recognizer: TapLongTapOrDoubleTapGestureRecognizer? = nil) {
+ public init(account: Account, theme: PresentationTheme, strings: PresentationStrings, source: ContextContentSource, items: Signal<[ContextMenuItem], NoError>, reactionItems: [ReactionContextItem], recognizer: TapLongTapOrDoubleTapGestureRecognizer? = nil, gesture: ContextGesture? = nil) {
self.account = account
self.theme = theme
self.strings = strings
@@ -786,6 +1208,7 @@ public final class ContextController: ViewController {
self.items = items
self.reactionItems = reactionItems
self.recognizer = recognizer
+ self.gesture = gesture
super.init(navigationBarPresentationData: nil)
@@ -799,7 +1222,7 @@ public final class ContextController: ViewController {
override public func loadDisplayNode() {
self.displayNode = ContextControllerNode(account: self.account, controller: self, theme: self.theme, strings: self.strings, source: self.source, items: self.items, reactionItems: self.reactionItems, beginDismiss: { [weak self] result in
self?.dismiss(result: result, completion: nil)
- }, recognizer: self.recognizer, reactionSelected: { [weak self] value in
+ }, recognizer: self.recognizer, gesture: self.gesture, reactionSelected: { [weak self] value in
guard let strongSelf = self else {
return
}
@@ -807,6 +1230,11 @@ public final class ContextController: ViewController {
})
self.displayNodeDidLoad()
+
+ self._ready.set(combineLatest(queue: .mainQueue(), self.controllerNode.itemsReady.get(), self.controllerNode.contentReady.get())
+ |> map { values in
+ return values.0 && values.1
+ })
}
override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
@@ -827,10 +1255,10 @@ public final class ContextController: ViewController {
}
}
- public func setItems(_ items: [ContextMenuItem]) {
+ public func setItems(_ items: Signal<[ContextMenuItem], NoError>) {
self.items = items
if self.isNodeLoaded {
- self.controllerNode.setItems(controller: self, items: items)
+ self.controllerNode.setItemsSignal(items: items)
}
}
diff --git a/submodules/ContextUI/Sources/ContextControllerSourceNode.swift b/submodules/ContextUI/Sources/ContextControllerSourceNode.swift
new file mode 100644
index 0000000000..18137bbe91
--- /dev/null
+++ b/submodules/ContextUI/Sources/ContextControllerSourceNode.swift
@@ -0,0 +1,52 @@
+import Foundation
+import AsyncDisplayKit
+import Display
+
+public final class ContextControllerSourceNode: ASDisplayNode {
+ private var contextGesture: ContextGesture?
+
+ public var isGestureEnabled: Bool = true {
+ didSet {
+ self.contextGesture?.isEnabled = self.isGestureEnabled
+ }
+ }
+ public var activated: ((ContextGesture) -> Void)?
+
+ override public func didLoad() {
+ super.didLoad()
+
+ let contextGesture = ContextGesture(target: self, action: nil)
+ self.contextGesture = contextGesture
+ self.view.addGestureRecognizer(contextGesture)
+
+ contextGesture.activationProgress = { [weak self] progress, update in
+ guard let strongSelf = self, !strongSelf.bounds.width.isZero else {
+ return
+ }
+ let minScale: CGFloat = (strongSelf.bounds.width - 20.0) / strongSelf.bounds.width
+ let currentScale = 1.0 * (1.0 - progress) + minScale * progress
+ switch update {
+ case .update:
+ strongSelf.layer.sublayerTransform = CATransform3DMakeScale(currentScale, currentScale, 1.0)
+ case .begin:
+ strongSelf.layer.sublayerTransform = CATransform3DMakeScale(currentScale, currentScale, 1.0)
+ /*let previousProgress: CGFloat = 0.0
+ let previousScale = 1.0 * (1.0 - previousProgress) + minScale * previousProgress
+ strongSelf.layer.sublayerTransform = CATransform3DMakeScale(currentScale, currentScale, 1.0)
+ strongSelf.layer.animate(from: previousScale as NSNumber, to: currentScale as NSNumber, keyPath: "sublayerTransform.scale", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.3, additive: false)*/
+ case let .ended(previousProgress):
+ let previousScale = 1.0 * (1.0 - previousProgress) + minScale * previousProgress
+ strongSelf.layer.sublayerTransform = CATransform3DMakeScale(currentScale, currentScale, 1.0)
+ strongSelf.layer.animate(from: previousScale as NSNumber, to: currentScale as NSNumber, keyPath: "sublayerTransform.scale", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.3)
+ }
+ }
+ contextGesture.activated = { [weak self] gesture in
+ if let activated = self?.activated {
+ activated(gesture)
+ } else {
+ gesture.cancel()
+ }
+ }
+ contextGesture.isEnabled = self.isGestureEnabled
+ }
+}
diff --git a/submodules/ContextUI/Sources/ContextGesture.swift b/submodules/ContextUI/Sources/ContextGesture.swift
new file mode 100644
index 0000000000..138ac07c79
--- /dev/null
+++ b/submodules/ContextUI/Sources/ContextGesture.swift
@@ -0,0 +1,170 @@
+import Foundation
+import UIKit
+import AsyncDisplayKit
+import Display
+
+public enum ContextGestureTransition {
+ case begin
+ case update
+ case ended(CGFloat)
+}
+
+private class TimerTargetWrapper: NSObject {
+ let f: () -> Void
+
+ init(_ f: @escaping () -> Void) {
+ self.f = f
+ }
+
+ @objc func timerEvent() {
+ self.f()
+ }
+}
+
+private let beginDelay: Double = 0.1
+
+private func cancelParentGestures(view: UIView) {
+ if let gestureRecognizers = view.gestureRecognizers {
+ for recognizer in gestureRecognizers {
+ recognizer.state = .failed
+ }
+ }
+ if let node = (view as? ListViewBackingView)?.target {
+ node.cancelSelection()
+ }
+ if let superview = view.superview {
+ cancelParentGestures(view: superview)
+ }
+}
+
+public final class ContextGesture: UIGestureRecognizer, UIGestureRecognizerDelegate {
+ private var currentProgress: CGFloat = 0.0
+ private var delayTimer: Timer?
+ private var isValidated: Bool = false
+
+ public var activationProgress: ((CGFloat, ContextGestureTransition) -> Void)?
+ public var activated: ((ContextGesture) -> Void)?
+ public var externalUpdated: ((UIView?, CGPoint) -> Void)?
+ public var externalEnded: (((UIView?, CGPoint)?) -> Void)?
+
+ override public init(target: Any?, action: Selector?) {
+ super.init(target: target, action: action)
+
+ self.delegate = self
+ }
+
+ override public func reset() {
+ super.reset()
+
+ self.currentProgress = 0.0
+ self.delayTimer?.invalidate()
+ self.delayTimer = nil
+ self.isValidated = false
+ self.externalUpdated = nil
+ self.externalEnded = nil
+ }
+
+ public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
+ if otherGestureRecognizer is UIPanGestureRecognizer {
+ return false
+ }
+ return true
+ }
+
+ override public func touchesBegan(_ touches: Set, with event: UIEvent) {
+ super.touchesBegan(touches, with: event)
+
+ if self.delayTimer == nil {
+ let delayTimer = Timer(timeInterval: beginDelay, target: TimerTargetWrapper { [weak self] in
+ guard let strongSelf = self, let _ = strongSelf.delayTimer else {
+ return
+ }
+ strongSelf.isValidated = true
+ strongSelf.activationProgress?(strongSelf.currentProgress, .begin)
+ }, selector: #selector(TimerTargetWrapper.timerEvent), userInfo: nil, repeats: false)
+ self.delayTimer = delayTimer
+ RunLoop.main.add(delayTimer, forMode: .common)
+ }
+ }
+
+ override public func touchesMoved(_ touches: Set, with event: UIEvent) {
+ super.touchesMoved(touches, with: event)
+
+ if let touch = touches.first {
+ if #available(iOS 9.0, *) {
+ let maxForce: CGFloat = min(3.0, touch.maximumPossibleForce)
+ let progress = touch.force / maxForce
+ self.currentProgress = progress
+ if self.isValidated {
+ self.activationProgress?(progress, .update)
+ }
+ if touch.force >= maxForce {
+ switch self.state {
+ case .possible:
+ self.delayTimer?.invalidate()
+ self.activated?(self)
+ if let view = self.view?.superview {
+ cancelParentGestures(view: view)
+ }
+ self.state = .began
+ default:
+ break
+ }
+ }
+ }
+
+ self.externalUpdated?(self.view, touch.location(in: self.view))
+ }
+ }
+
+ override public func touchesEnded(_ touches: Set, with event: UIEvent) {
+ super.touchesEnded(touches, with: event)
+
+ if let touch = touches.first {
+ if !self.currentProgress.isZero, self.isValidated {
+ if #available(iOS 9.0, *) {
+ self.activationProgress?(0.0, .ended(self.currentProgress))
+ }
+ }
+
+ self.externalEnded?((self.view, touch.location(in: self.view)))
+ }
+
+ self.delayTimer?.invalidate()
+
+ self.state = .failed
+ }
+
+ override public func touchesCancelled(_ touches: Set, with event: UIEvent) {
+ super.touchesCancelled(touches, with: event)
+
+ if let touch = touches.first, !self.currentProgress.isZero, self.isValidated {
+ if #available(iOS 9.0, *) {
+ self.activationProgress?(0.0, .ended(self.currentProgress))
+ }
+ }
+
+ self.delayTimer?.invalidate()
+
+ self.state = .failed
+ }
+
+ public func cancel() {
+ if !self.currentProgress.isZero, self.isValidated {
+ self.activationProgress?(0.0, .ended(self.currentProgress))
+
+ self.delayTimer?.invalidate()
+ self.state = .failed
+ }
+ }
+
+ public func endPressedAppearance() {
+ if !self.currentProgress.isZero, self.isValidated {
+ let previousProgress = self.currentProgress
+ self.currentProgress = 0.0
+ self.delayTimer?.invalidate()
+ self.isValidated = false
+ self.activationProgress?(0.0, .ended(previousProgress))
+ }
+ }
+}
diff --git a/submodules/Display/Display/GenerateImage.swift b/submodules/Display/Display/GenerateImage.swift
index 218ade29c5..0994683eb9 100644
--- a/submodules/Display/Display/GenerateImage.swift
+++ b/submodules/Display/Display/GenerateImage.swift
@@ -151,9 +151,8 @@ public func generateImage(_ size: CGSize, opaque: Bool = false, scale: CGFloat?
guard let provider = CGDataProvider(dataInfo: bytes, data: bytes, size: length, releaseData: { bytes, _, _ in
free(bytes)
- })
- else {
- return nil
+ }) else {
+ return nil
}
let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | (opaque ? CGImageAlphaInfo.noneSkipFirst.rawValue : CGImageAlphaInfo.premultipliedFirst.rawValue))
diff --git a/submodules/Display/Display/ListView.swift b/submodules/Display/Display/ListView.swift
index 809d44ad0e..8e628f723a 100644
--- a/submodules/Display/Display/ListView.swift
+++ b/submodules/Display/Display/ListView.swift
@@ -26,39 +26,39 @@ private final class ListViewBackingLayer: CALayer {
}
}
-final class ListViewBackingView: UIView {
- weak var target: ListView?
+public final class ListViewBackingView: UIView {
+ public fileprivate(set) weak var target: ListView?
- override class var layerClass: AnyClass {
+ override public class var layerClass: AnyClass {
return ListViewBackingLayer.self
}
- override func setNeedsLayout() {
+ override public func setNeedsLayout() {
}
- override func layoutSubviews() {
+ override public func layoutSubviews() {
}
- override func setNeedsDisplay() {
+ override public func setNeedsDisplay() {
}
- override func touchesBegan(_ touches: Set, with event: UIEvent?) {
+ override public func touchesBegan(_ touches: Set, with event: UIEvent?) {
self.target?.touchesBegan(touches, with: event)
}
- override func touchesCancelled(_ touches: Set?, with event: UIEvent?) {
+ override public func touchesCancelled(_ touches: Set?, with event: UIEvent?) {
self.target?.touchesCancelled(touches, with: event)
}
- override func touchesMoved(_ touches: Set, with event: UIEvent?) {
+ override public func touchesMoved(_ touches: Set, with event: UIEvent?) {
self.target?.touchesMoved(touches, with: event)
}
- override func touchesEnded(_ touches: Set, with event: UIEvent?) {
+ override public func touchesEnded(_ touches: Set, with event: UIEvent?) {
self.target?.touchesEnded(touches, with: event)
}
- override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+ override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if !self.isHidden, let target = self.target {
if target.limitHitTestToNodes, !target.internalHitTest(point, with: event) {
return nil
@@ -70,7 +70,7 @@ final class ListViewBackingView: UIView {
return super.hitTest(point, with: event)
}
- override func accessibilityScroll(_ direction: UIAccessibilityScrollDirection) -> Bool {
+ override public func accessibilityScroll(_ direction: UIAccessibilityScrollDirection) -> Bool {
return self.target?.accessibilityScroll(direction) ?? false
}
}
@@ -3744,6 +3744,13 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture
super.touchesMoved(touches, with: event)
}
+ public func cancelSelection() {
+ if let selectionTouchLocation = self.selectionTouchLocation {
+ self.clearHighlightAnimated(true)
+ self.selectionTouchLocation = nil
+ }
+ }
+
override open func touchesEnded(_ touches: Set, with event: UIEvent?) {
if let selectionTouchLocation = self.selectionTouchLocation {
let index = self.itemIndexAtPoint(selectionTouchLocation)
diff --git a/submodules/Display/Display/NativeWindowHostView.swift b/submodules/Display/Display/NativeWindowHostView.swift
index 8abad24c04..99f67a6a1b 100644
--- a/submodules/Display/Display/NativeWindowHostView.swift
+++ b/submodules/Display/Display/NativeWindowHostView.swift
@@ -166,6 +166,8 @@ private final class WindowRootViewController: UIViewController, UIViewController
shouldRegister = true
}
+ shouldRegister = false
+
if shouldRegister != self.registeredForPreviewing {
self.registeredForPreviewing = shouldRegister
if shouldRegister {
diff --git a/submodules/Display/Display/PeekControllerGestureRecognizer.swift b/submodules/Display/Display/PeekControllerGestureRecognizer.swift
index a13fe7a991..abaa6c0201 100644
--- a/submodules/Display/Display/PeekControllerGestureRecognizer.swift
+++ b/submodules/Display/Display/PeekControllerGestureRecognizer.swift
@@ -18,7 +18,7 @@ private func traceDeceleratingScrollView(_ view: UIView, at point: CGPoint) -> B
public final class PeekControllerGestureRecognizer: UIPanGestureRecognizer {
private let contentAtPoint: (CGPoint) -> Signal<(ASDisplayNode, PeekControllerContent)?, NoError>?
- private let present: (PeekControllerContent, ASDisplayNode) -> PeekController?
+ private let present: (PeekControllerContent, ASDisplayNode) -> ViewController?
private let updateContent: (PeekControllerContent?) -> Void
private let activateBySingleTap: Bool
@@ -36,7 +36,7 @@ public final class PeekControllerGestureRecognizer: UIPanGestureRecognizer {
private var menuActivation: PeerkControllerMenuActivation?
private weak var presentedController: PeekController?
- public init(contentAtPoint: @escaping (CGPoint) -> Signal<(ASDisplayNode, PeekControllerContent)?, NoError>?, present: @escaping (PeekControllerContent, ASDisplayNode) -> PeekController?, updateContent: @escaping (PeekControllerContent?) -> Void = { _ in }, activateBySingleTap: Bool = false) {
+ public init(contentAtPoint: @escaping (CGPoint) -> Signal<(ASDisplayNode, PeekControllerContent)?, NoError>?, present: @escaping (PeekControllerContent, ASDisplayNode) -> ViewController?, updateContent: @escaping (PeekControllerContent?) -> Void = { _ in }, activateBySingleTap: Bool = false) {
self.contentAtPoint = contentAtPoint
self.present = present
self.updateContent = updateContent
@@ -259,29 +259,35 @@ public final class PeekControllerGestureRecognizer: UIPanGestureRecognizer {
}
} else {
if let presentedController = strongSelf.present(content, sourceNode) {
- if forceActivate {
- strongSelf.candidateContent = nil
- if case .press = content.menuActivation() {
- (presentedController.displayNode as? PeekControllerNode)?.activateMenu()
- }
- } else {
- strongSelf.candidateContent = (sourceNode, content)
- strongSelf.menuActivation = content.menuActivation()
- strongSelf.presentedController = presentedController
-
- strongSelf.state = .began
-
- switch content.menuActivation() {
- case .drag:
- break
- case .press:
- if #available(iOSApplicationExtension 9.0, iOS 9.0, *) {
- if presentedController.traitCollection.forceTouchCapability != .available {
+ if let presentedController = presentedController as? PeekController {
+ if forceActivate {
+ strongSelf.candidateContent = nil
+ if case .press = content.menuActivation() {
+ (presentedController.displayNode as? PeekControllerNode)?.activateMenu()
+ }
+ } else {
+ strongSelf.candidateContent = (sourceNode, content)
+ strongSelf.menuActivation = content.menuActivation()
+ strongSelf.presentedController = presentedController
+
+ strongSelf.state = .began
+
+ switch content.menuActivation() {
+ case .drag:
+ break
+ case .press:
+ if #available(iOSApplicationExtension 9.0, iOS 9.0, *) {
+ if presentedController.traitCollection.forceTouchCapability != .available {
+ strongSelf.startPressTimer()
+ }
+ } else {
strongSelf.startPressTimer()
}
- } else {
- strongSelf.startPressTimer()
- }
+ }
+ }
+ } else {
+ if strongSelf.state != .ended {
+ strongSelf.state = .ended
}
}
}
diff --git a/submodules/Display/Display/ViewController.swift b/submodules/Display/Display/ViewController.swift
index 62b40bffab..923a40f8e8 100644
--- a/submodules/Display/Display/ViewController.swift
+++ b/submodules/Display/Display/ViewController.swift
@@ -220,6 +220,8 @@ open class ViewControllerPresentationArguments {
public var scrollToTopWithTabBar: (() -> Void)?
public var longTapWithTabBar: (() -> Void)?
+ public var customPresentPreviewingController: ((ViewController, ASDisplayNode) -> ViewController?)?
+
open func updateNavigationCustomData(_ data: Any?, progress: CGFloat, transition: ContainedViewLayoutTransition) {
}
@@ -487,12 +489,14 @@ open class ViewControllerPresentationArguments {
@available(iOSApplicationExtension 9.0, iOS 9.0, *)
open func registerForPreviewing(with delegate: UIViewControllerPreviewingDelegate, sourceView: UIView, theme: PeekControllerTheme, onlyNative: Bool) {
- if self.traitCollection.forceTouchCapability == .available {
+ if false, self.traitCollection.forceTouchCapability == .available {
let _ = super.registerForPreviewing(with: delegate, sourceView: sourceView)
} else if !onlyNative {
if self.previewingContext == nil {
let previewingContext = SimulatedViewControllerPreviewing(theme: theme, delegate: delegate, sourceView: sourceView, node: self.displayNode, present: { [weak self] c, a in
self?.presentInGlobalOverlay(c, with: a)
+ }, customPresent: { [weak self] c, n in
+ return self?.customPresentPreviewingController?(c, n)
})
self.previewingContext = previewingContext
}
@@ -501,10 +505,12 @@ open class ViewControllerPresentationArguments {
@available(iOSApplicationExtension 9.0, iOS 9.0, *)
public func registerForPreviewingNonNative(with delegate: UIViewControllerPreviewingDelegate, sourceView: UIView, theme: PeekControllerTheme) {
- if self.traitCollection.forceTouchCapability != .available {
+ if true || self.traitCollection.forceTouchCapability != .available {
if self.previewingContext == nil {
let previewingContext = SimulatedViewControllerPreviewing(theme: theme, delegate: delegate, sourceView: sourceView, node: self.displayNode, present: { [weak self] c, a in
self?.presentInGlobalOverlay(c, with: a)
+ }, customPresent: { [weak self] c, n in
+ return self?.customPresentPreviewingController?(c, n)
})
self.previewingContext = previewingContext
}
diff --git a/submodules/Display/Display/ViewControllerPreviewing.swift b/submodules/Display/Display/ViewControllerPreviewing.swift
index aa5c8e9937..508d0ef8b6 100644
--- a/submodules/Display/Display/ViewControllerPreviewing.swift
+++ b/submodules/Display/Display/ViewControllerPreviewing.swift
@@ -5,7 +5,7 @@ import SwiftSignalKit
@available(iOSApplicationExtension 9.0, iOS 9.0, *)
private final class ViewControllerPeekContent: PeekControllerContent {
- private let controller: ViewController
+ let controller: ViewController
private let menu: [PeekControllerMenuItem]
init(controller: ViewController) {
@@ -101,7 +101,7 @@ final class SimulatedViewControllerPreviewing: NSObject, UIViewControllerPreview
var sourceRect: CGRect = CGRect()
- init(theme: PeekControllerTheme, delegate: UIViewControllerPreviewingDelegate, sourceView: UIView, node: ASDisplayNode, present: @escaping (ViewController, Any?) -> Void) {
+ init(theme: PeekControllerTheme, delegate: UIViewControllerPreviewingDelegate, sourceView: UIView, node: ASDisplayNode, present: @escaping (ViewController, Any?) -> Void, customPresent: ((ViewController, ASDisplayNode) -> ViewController?)?) {
self.delegateImpl = delegate
self.sourceView = sourceView
self.node = node
@@ -109,11 +109,16 @@ final class SimulatedViewControllerPreviewing: NSObject, UIViewControllerPreview
self.recognizer = PeekControllerGestureRecognizer(contentAtPoint: { point in
return contentAtPointImpl?(point)
}, present: { content, sourceNode in
- let controller = PeekController(theme: theme, content: content, sourceNode: {
- return sourceNode
- })
- present(controller, nil)
- return controller
+ if let content = content as? ViewControllerPeekContent, let controller = customPresent?(content.controller, sourceNode) {
+ present(controller, nil)
+ return controller
+ } else {
+ let controller = PeekController(theme: theme, content: content, sourceNode: {
+ return sourceNode
+ })
+ present(controller, nil)
+ return controller
+ }
})
node.view.addGestureRecognizer(self.recognizer)
diff --git a/submodules/HashtagSearchUI/BUCK b/submodules/HashtagSearchUI/BUCK
index 88393dcdbd..4c97de6455 100644
--- a/submodules/HashtagSearchUI/BUCK
+++ b/submodules/HashtagSearchUI/BUCK
@@ -15,6 +15,7 @@ static_library(
"//submodules/AccountContext:AccountContext",
"//submodules/TelegramBaseController:TelegramBaseController",
"//submodules/ChatListUI:ChatListUI",
+ "//submodules/SegmentedControlNode:SegmentedControlNode",
],
frameworks = [
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
diff --git a/submodules/HashtagSearchUI/HashtagSearchUI.xcodeproj/project.pbxproj b/submodules/HashtagSearchUI/HashtagSearchUI.xcodeproj/project.pbxproj
index 0361099236..4aed4e65d1 100644
--- a/submodules/HashtagSearchUI/HashtagSearchUI.xcodeproj/project.pbxproj
+++ b/submodules/HashtagSearchUI/HashtagSearchUI.xcodeproj/project.pbxproj
@@ -260,6 +260,19 @@
explicitFileType
archive.ar
+ 1DD70E296C9831F100000000
+
+ isa
+ PBXFileReference
+ name
+ libContextUI.a
+ path
+ libContextUI.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29CED1620500000000
isa
@@ -572,6 +585,19 @@
explicitFileType
archive.ar
+ 1DD70E29AD66967300000000
+
+ isa
+ PBXFileReference
+ name
+ libReactionSelectionNode.a
+ path
+ libReactionSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E291D58331200000000
isa
@@ -611,6 +637,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29097DBE9200000000
isa
@@ -832,6 +871,19 @@
explicitFileType
archive.ar
+ 1DD70E29F40A586F00000000
+
+ isa
+ PBXFileReference
+ name
+ libTextSelectionNode.a
+ path
+ libTextSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29B4B05B7A00000000
isa
@@ -921,6 +973,7 @@
1DD70E2997B4D6D800000000
1DD70E292F91702000000000
1DD70E2931752C6000000000
+ 1DD70E296C9831F100000000
1DD70E29CED1620500000000
1DD70E292417E0B200000000
1DD70E295915423000000000
@@ -945,9 +998,11 @@
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
1DD70E293E4DE92B00000000
+ 1DD70E29AD66967300000000
1DD70E291D58331200000000
1DD70E29EA9CBB5B00000000
1DD70E291328E99400000000
+ 1DD70E2957B5522500000000
1DD70E29097DBE9200000000
1DD70E2981AE180900000000
1DD70E29524F478E00000000
@@ -965,6 +1020,7 @@
1DD70E292395015100000000
1DD70E29BA06E3A600000000
1DD70E29F0C15F9C00000000
+ 1DD70E29F40A586F00000000
1DD70E29B4B05B7A00000000
1DD70E29CD296A8300000000
1DD70E29AE67341000000000
@@ -1339,6 +1395,27 @@
fileRef
1DD70E2997B4D6D800000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F04CBE117ED00000000
isa
@@ -1346,6 +1423,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -1381,6 +1465,13 @@
fileRef
1DD70E2931752C6000000000
+ E7A30F04BBAF750C00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29BBAF750C00000000
+
E7A30F041328E99400000000
isa
@@ -1486,13 +1577,6 @@
fileRef
1DD70E29E220F5E800000000
- E7A30F04BBAF750C00000000
-
- isa
- PBXBuildFile
- fileRef
- 1DD70E29BBAF750C00000000
-
E7A30F04247D9AC100000000
isa
@@ -1582,12 +1666,17 @@
E7A30F047AB043C800000000
E7A30F04B6F47D1F00000000
E7A30F0497B4D6D800000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04D233F68C00000000
E7A30F049A24C4DE00000000
E7A30F0431752C6000000000
+ E7A30F04BBAF750C00000000
E7A30F041328E99400000000
E7A30F041E16CC6C00000000
E7A30F043E4DE92B00000000
@@ -1603,7 +1692,6 @@
E7A30F042F91702000000000
E7A30F04CED1620500000000
E7A30F04E220F5E800000000
- E7A30F04BBAF750C00000000
E7A30F04247D9AC100000000
E7A30F04B4B05B7A00000000
E7A30F04490601EB00000000
diff --git a/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift b/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift
index 150ce02736..d8d3b41df0 100644
--- a/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift
+++ b/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift
@@ -67,6 +67,8 @@ public final class HashtagSearchController: TelegramBaseController {
}, updatePeerGrouping: { _, _ in
}, togglePeerMarkedUnread: { _, _ in
}, toggleArchivedFolderHiddenByDefault: {
+ }, activateChatPreview: { _, _, gesture in
+ gesture?.cancel()
})
let previousSearchItems = Atomic<[ChatListSearchEntry]?>(value: nil)
@@ -76,7 +78,7 @@ public final class HashtagSearchController: TelegramBaseController {
let previousEntries = previousSearchItems.swap(entries)
let firstTime = previousEntries == nil
- let transition = chatListSearchContainerPreparedTransition(from: previousEntries ?? [], to: entries, displayingResults: true, context: strongSelf.context, enableHeaders: false, filter: [], interaction: interaction)
+ let transition = chatListSearchContainerPreparedTransition(from: previousEntries ?? [], to: entries, displayingResults: true, context: strongSelf.context, enableHeaders: false, filter: [], interaction: interaction, peerContextAction: nil)
strongSelf.controllerNode.enqueueTransition(transition, firstTime: firstTime)
}
})
diff --git a/submodules/HashtagSearchUI/Sources/HashtagSearchControllerNode.swift b/submodules/HashtagSearchUI/Sources/HashtagSearchControllerNode.swift
index ced8219be9..fe3f6e5fe5 100644
--- a/submodules/HashtagSearchUI/Sources/HashtagSearchControllerNode.swift
+++ b/submodules/HashtagSearchUI/Sources/HashtagSearchControllerNode.swift
@@ -6,11 +6,12 @@ import TelegramCore
import TelegramPresentationData
import AccountContext
import ChatListUI
+import SegmentedControlNode
final class HashtagSearchControllerNode: ASDisplayNode {
private let toolbarBackgroundNode: ASDisplayNode
private let toolbarSeparatorNode: ASDisplayNode
- private let segmentedControl: UISegmentedControl
+ private let segmentedControlNode: SegmentedControlNode
let listNode: ListView
var chatController: ChatController?
@@ -35,9 +36,11 @@ final class HashtagSearchControllerNode: ASDisplayNode {
self.toolbarSeparatorNode = ASDisplayNode()
self.toolbarSeparatorNode.backgroundColor = theme.rootController.navigationBar.separatorColor
- self.segmentedControl = UISegmentedControl(items: [peer?.displayTitle ?? "", strings.HashtagSearch_AllChats])
- self.segmentedControl.tintColor = theme.rootController.navigationBar.accentTextColor
- self.segmentedControl.selectedSegmentIndex = 0
+ let items = [
+ peer?.displayTitle ?? "",
+ strings.HashtagSearch_AllChats
+ ]
+ self.segmentedControlNode = SegmentedControlNode(theme: SegmentedControlTheme(theme: theme), items: items.map { SegmentedControlItem(title: $0) }, selectedIndex: 0)
if let peer = peer {
self.chatController = context.sharedContext.makeChatController(context: context, chatLocation: .peer(peer.id), subject: nil, botStart: nil, mode: .inline)
@@ -56,7 +59,17 @@ final class HashtagSearchControllerNode: ASDisplayNode {
self.addSubnode(self.listNode)
self.listNode.isHidden = true
- self.segmentedControl.addTarget(self, action: #selector(self.indexChanged), for: .valueChanged)
+ self.segmentedControlNode.selectedIndexChanged = { [weak self] index in
+ if let strongSelf = self {
+ if index == 0 {
+ strongSelf.chatController?.displayNode.isHidden = false
+ strongSelf.listNode.isHidden = true
+ } else {
+ strongSelf.chatController?.displayNode.isHidden = true
+ strongSelf.listNode.isHidden = false
+ }
+ }
+ }
}
func enqueueTransition(_ transition: ChatListSearchContainerTransition, firstTime: Bool) {
@@ -84,8 +97,7 @@ final class HashtagSearchControllerNode: ASDisplayNode {
if self.chatController != nil && self.toolbarBackgroundNode.supernode == nil {
self.addSubnode(self.toolbarBackgroundNode)
self.addSubnode(self.toolbarSeparatorNode)
-
- self.view.addSubview(self.segmentedControl)
+ self.addSubnode(self.segmentedControlNode)
}
var insets = layout.insets(options: [.input])
@@ -97,10 +109,8 @@ final class HashtagSearchControllerNode: ASDisplayNode {
transition.updateFrame(node: self.toolbarBackgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelY), size: CGSize(width: layout.size.width, height: toolbarHeight)))
transition.updateFrame(node: self.toolbarSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelY + toolbarHeight), size: CGSize(width: layout.size.width, height: UIScreenPixel)))
- var controlSize = self.segmentedControl.sizeThatFits(layout.size)
- controlSize.width = layout.size.width - 14.0 * 2.0
-
- transition.updateFrame(view: self.segmentedControl, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - controlSize.width) / 2.0), y: panelY + floor((toolbarHeight - controlSize.height) / 2.0)), size: controlSize))
+ let controlSize = self.segmentedControlNode.updateLayout(.stretchToFill(width: layout.size.width - 14.0 * 2.0), transition: transition)
+ transition.updateFrame(node: self.segmentedControlNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - controlSize.width) / 2.0), y: panelY + floor((toolbarHeight - controlSize.height) / 2.0)), size: controlSize))
if let chatController = self.chatController {
insets.top += toolbarHeight - 4.0
@@ -146,21 +156,11 @@ final class HashtagSearchControllerNode: ASDisplayNode {
self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: nil, updateSizeAndInsets: updateSizeAndInsets, stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in })
- if !hasValidLayout {
- hasValidLayout = true
+ if !self.hasValidLayout {
+ self.hasValidLayout = true
while !self.enqueuedTransitions.isEmpty {
self.dequeueTransition()
}
}
}
-
- @objc private func indexChanged() {
- if self.segmentedControl.selectedSegmentIndex == 0 {
- self.chatController?.displayNode.isHidden = false
- self.listNode.isHidden = true
- } else {
- self.chatController?.displayNode.isHidden = true
- self.listNode.isHidden = false
- }
- }
}
diff --git a/submodules/ItemListAddressItem/ItemListAddressItem.xcodeproj/project.pbxproj b/submodules/ItemListAddressItem/ItemListAddressItem.xcodeproj/project.pbxproj
index 455bc5af13..b7075da0bc 100644
--- a/submodules/ItemListAddressItem/ItemListAddressItem.xcodeproj/project.pbxproj
+++ b/submodules/ItemListAddressItem/ItemListAddressItem.xcodeproj/project.pbxproj
@@ -260,6 +260,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -440,6 +453,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -731,6 +745,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -775,6 +796,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
diff --git a/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem.xcodeproj/project.pbxproj b/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem.xcodeproj/project.pbxproj
index cc0befc30a..9ec46c34c4 100644
--- a/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem.xcodeproj/project.pbxproj
+++ b/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem.xcodeproj/project.pbxproj
@@ -286,6 +286,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -468,6 +481,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -766,6 +780,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -818,6 +839,7 @@
E7A30F0497B4D6D800000000
E7A30F04C37F741500000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04D233F68C00000000
diff --git a/submodules/ItemListPeerActionItem/ItemListPeerActionItem.xcodeproj/project.pbxproj b/submodules/ItemListPeerActionItem/ItemListPeerActionItem.xcodeproj/project.pbxproj
index 11b9670cbe..990e2c0201 100644
--- a/submodules/ItemListPeerActionItem/ItemListPeerActionItem.xcodeproj/project.pbxproj
+++ b/submodules/ItemListPeerActionItem/ItemListPeerActionItem.xcodeproj/project.pbxproj
@@ -260,6 +260,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -440,6 +453,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -731,6 +745,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -775,6 +796,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
diff --git a/submodules/ItemListPeerItem/BUCK b/submodules/ItemListPeerItem/BUCK
index e81414f23c..d634f0c766 100644
--- a/submodules/ItemListPeerItem/BUCK
+++ b/submodules/ItemListPeerItem/BUCK
@@ -17,6 +17,7 @@ static_library(
"//submodules/PeerPresenceStatusManager:PeerPresenceStatusManager",
"//submodules/ItemListUI:ItemListUI",
"//submodules/TelegramUIPreferences:TelegramUIPreferences",
+ "//submodules/ContextUI:ContextUI",
],
frameworks = [
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
diff --git a/submodules/ItemListPeerItem/ItemListPeerItem.xcodeproj/project.pbxproj b/submodules/ItemListPeerItem/ItemListPeerItem.xcodeproj/project.pbxproj
index 0ac777cc51..a7ef9f9552 100644
--- a/submodules/ItemListPeerItem/ItemListPeerItem.xcodeproj/project.pbxproj
+++ b/submodules/ItemListPeerItem/ItemListPeerItem.xcodeproj/project.pbxproj
@@ -143,6 +143,19 @@
explicitFileType
archive.ar
+ 1DD70E296C9831F100000000
+
+ isa
+ PBXFileReference
+ name
+ libContextUI.a
+ path
+ libContextUI.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E295915423000000000
isa
@@ -286,6 +299,32 @@
explicitFileType
archive.ar
+ 1DD70E29AD66967300000000
+
+ isa
+ PBXFileReference
+ name
+ libReactionSelectionNode.a
+ path
+ libReactionSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -416,6 +455,19 @@
explicitFileType
archive.ar
+ 1DD70E29F40A586F00000000
+
+ isa
+ PBXFileReference
+ name
+ libTextSelectionNode.a
+ path
+ libTextSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29CD296A8300000000
isa
@@ -457,6 +509,7 @@
1DD70E292420028600000000
1DD70E29A54A195300000000
1DD70E2997B4D6D800000000
+ 1DD70E296C9831F100000000
1DD70E295915423000000000
1DD70E29FF334B1F00000000
1DD70E29D6F14E1000000000
@@ -468,6 +521,8 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E29AD66967300000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -478,6 +533,7 @@
1DD70E292395015100000000
1DD70E29BA06E3A600000000
1DD70E29F0C15F9C00000000
+ 1DD70E29F40A586F00000000
1DD70E29CD296A8300000000
1DD70E2951398CF200000000
@@ -675,6 +731,27 @@
fileRef
1DD70E29A54A195300000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F045915423000000000
isa
@@ -766,6 +843,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -805,6 +889,9 @@
E7A30F042420028600000000
E7A30F0484A59C1D00000000
E7A30F04A54A195300000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F045915423000000000
E7A30F04F33FDAC300000000
E7A30F0451398CF200000000
@@ -818,6 +905,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04D233F68C00000000
diff --git a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift
index e06d4c5d21..d20bd104a6 100644
--- a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift
+++ b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift
@@ -11,6 +11,7 @@ import ItemListUI
import AvatarNode
import TelegramStringFormatting
import PeerPresenceStatusManager
+import ContextUI
public struct ItemListPeerItemEditing: Equatable {
public var editable: Bool
@@ -127,12 +128,13 @@ public final class ItemListPeerItem: ListViewItem, ItemListItem {
let setPeerIdWithRevealedOptions: (PeerId?, PeerId?) -> Void
let removePeer: (PeerId) -> Void
let toggleUpdated: ((Bool) -> Void)?
+ let contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?
let hasTopStripe: Bool
let hasTopGroupInset: Bool
let noInsets: Bool
public let tag: ItemListItemTag?
- public init(theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, account: Account, peer: Peer, height: ItemListPeerItemHeight = .peerList, aliasHandling: ItemListPeerItemAliasHandling = .standard, nameColor: ItemListPeerItemNameColor = .primary, nameStyle: ItemListPeerItemNameStyle = .distinctBold, presence: PeerPresence?, text: ItemListPeerItemText, label: ItemListPeerItemLabel, editing: ItemListPeerItemEditing, revealOptions: ItemListPeerItemRevealOptions? = nil, switchValue: ItemListPeerItemSwitch?, enabled: Bool, selectable: Bool, sectionId: ItemListSectionId, action: (() -> Void)?, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, removePeer: @escaping (PeerId) -> Void, toggleUpdated: ((Bool) -> Void)? = nil, hasTopStripe: Bool = true, hasTopGroupInset: Bool = true, noInsets: Bool = false, tag: ItemListItemTag? = nil) {
+ public init(theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, account: Account, peer: Peer, height: ItemListPeerItemHeight = .peerList, aliasHandling: ItemListPeerItemAliasHandling = .standard, nameColor: ItemListPeerItemNameColor = .primary, nameStyle: ItemListPeerItemNameStyle = .distinctBold, presence: PeerPresence?, text: ItemListPeerItemText, label: ItemListPeerItemLabel, editing: ItemListPeerItemEditing, revealOptions: ItemListPeerItemRevealOptions? = nil, switchValue: ItemListPeerItemSwitch?, enabled: Bool, selectable: Bool, sectionId: ItemListSectionId, action: (() -> Void)?, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, removePeer: @escaping (PeerId) -> Void, toggleUpdated: ((Bool) -> Void)? = nil, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? = nil, hasTopStripe: Bool = true, hasTopGroupInset: Bool = true, noInsets: Bool = false, tag: ItemListItemTag? = nil) {
self.theme = theme
self.strings = strings
self.dateTimeFormat = dateTimeFormat
@@ -156,6 +158,7 @@ public final class ItemListPeerItem: ListViewItem, ItemListItem {
self.setPeerIdWithRevealedOptions = setPeerIdWithRevealedOptions
self.removePeer = removePeer
self.toggleUpdated = toggleUpdated
+ self.contextAction = contextAction
self.hasTopStripe = hasTopStripe
self.hasTopGroupInset = hasTopGroupInset
self.noInsets = noInsets
@@ -221,6 +224,8 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
private let highlightedBackgroundNode: ASDisplayNode
private var disabledOverlayNode: ASDisplayNode?
+ private let containerNode: ContextControllerSourceNode
+
fileprivate let avatarNode: AvatarNode
private let titleNode: TextNode
private let labelNode: TextNode
@@ -260,6 +265,8 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
self.bottomStripeNode = ASDisplayNode()
self.bottomStripeNode.isLayerBacked = true
+ self.containerNode = ContextControllerSourceNode()
+
self.avatarNode = AvatarNode(font: avatarFont)
self.avatarNode.isLayerBacked = !smartInvertColorsEnabled()
@@ -290,10 +297,11 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
self.isAccessibilityElement = true
- self.addSubnode(self.avatarNode)
- self.addSubnode(self.titleNode)
- self.addSubnode(self.statusNode)
- self.addSubnode(self.labelNode)
+ self.addSubnode(self.containerNode)
+ self.containerNode.addSubnode(self.avatarNode)
+ self.containerNode.addSubnode(self.titleNode)
+ self.containerNode.addSubnode(self.statusNode)
+ self.containerNode.addSubnode(self.labelNode)
self.peerPresenceManager = PeerPresenceStatusManager(update: { [weak self] in
if let strongSelf = self, let layoutParams = strongSelf.layoutParams {
@@ -301,6 +309,14 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
apply(false, true)
}
})
+
+ self.containerNode.activated = { [weak self] gesture in
+ guard let strongSelf = self, let item = strongSelf.layoutParams?.0, let contextAction = item.contextAction else {
+ gesture.cancel()
+ return
+ }
+ contextAction(strongSelf.containerNode, gesture)
+ }
}
public func asyncLayout() -> (_ item: ItemListPeerItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, (Bool, Bool) -> Void) {
@@ -568,6 +584,9 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
if let strongSelf = self {
strongSelf.layoutParams = (item, params, neighbors)
+ strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: layout.contentSize)
+ strongSelf.containerNode.isGestureEnabled = item.contextAction != nil
+
strongSelf.accessibilityLabel = titleAttributedString?.string
var combinedValueString = ""
if let statusString = statusAttributedString?.string, !statusString.isEmpty {
@@ -627,7 +646,7 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
}
}
strongSelf.editableControlNode = editableControlNode
- strongSelf.insertSubnode(editableControlNode, aboveSubnode: strongSelf.avatarNode)
+ strongSelf.addSubnode(editableControlNode)
editableControlNode.frame = editableControlFrame
transition.animatePosition(node: editableControlNode, from: CGPoint(x: -editableControlFrame.size.width / 2.0, y: editableControlFrame.midY))
editableControlNode.alpha = 0.0
@@ -687,11 +706,7 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
if let currentSwitchNode = currentSwitchNode {
if currentSwitchNode !== strongSelf.switchNode {
strongSelf.switchNode = currentSwitchNode
- if let disabledOverlayNode = strongSelf.disabledOverlayNode, disabledOverlayNode.supernode != nil {
- strongSelf.insertSubnode(currentSwitchNode, belowSubnode: disabledOverlayNode)
- } else {
- strongSelf.addSubnode(currentSwitchNode)
- }
+ strongSelf.containerNode.addSubnode(currentSwitchNode)
currentSwitchNode.valueUpdated = { value in
if let strongSelf = self {
strongSelf.toggleUpdated(value)
@@ -710,11 +725,7 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
if let currentCheckNode = currentCheckNode {
if currentCheckNode !== strongSelf.checkNode {
strongSelf.checkNode = currentCheckNode
- if let disabledOverlayNode = strongSelf.disabledOverlayNode, disabledOverlayNode.supernode != nil {
- strongSelf.insertSubnode(currentCheckNode, belowSubnode: disabledOverlayNode)
- } else {
- strongSelf.addSubnode(currentCheckNode)
- }
+ strongSelf.containerNode.addSubnode(currentCheckNode)
}
if let checkImage = checkImage {
currentCheckNode.image = checkImage
@@ -732,7 +743,7 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
if let updatedLabelArrowNode = updatedLabelArrowNode {
strongSelf.labelArrowNode = updatedLabelArrowNode
- strongSelf.addSubnode(updatedLabelArrowNode)
+ strongSelf.containerNode.addSubnode(updatedLabelArrowNode)
if let image = updatedLabelArrowNode.image {
let labelArrowNodeFrame = CGRect(origin: CGPoint(x: params.width - params.rightInset - rightLabelInset - image.size.width, y: floor((contentSize.height - image.size.height) / 2.0)), size: image.size)
transition.updateFrame(node: updatedLabelArrowNode, frame: labelArrowNodeFrame)
@@ -755,7 +766,7 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo
if let updateBadgeImage = updatedLabelBadgeImage {
if strongSelf.labelBadgeNode.supernode == nil {
- strongSelf.insertSubnode(strongSelf.labelBadgeNode, belowSubnode: strongSelf.labelNode)
+ strongSelf.containerNode.insertSubnode(strongSelf.labelBadgeNode, belowSubnode: strongSelf.labelNode)
}
strongSelf.labelBadgeNode.image = updateBadgeImage
}
diff --git a/submodules/ItemListStickerPackItem/ItemListStickerPackItem.xcodeproj/project.pbxproj b/submodules/ItemListStickerPackItem/ItemListStickerPackItem.xcodeproj/project.pbxproj
index 1bcb58653d..d87a63e1b0 100644
--- a/submodules/ItemListStickerPackItem/ItemListStickerPackItem.xcodeproj/project.pbxproj
+++ b/submodules/ItemListStickerPackItem/ItemListStickerPackItem.xcodeproj/project.pbxproj
@@ -260,6 +260,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -440,6 +453,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -731,6 +745,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -775,6 +796,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
diff --git a/submodules/ItemListUI/BUCK b/submodules/ItemListUI/BUCK
index 36f6b4954c..fb4db9fd5d 100644
--- a/submodules/ItemListUI/BUCK
+++ b/submodules/ItemListUI/BUCK
@@ -17,6 +17,7 @@ static_library(
"//submodules/SwitchNode:SwitchNode",
"//submodules/AnimationUI:AnimationUI",
"//submodules/CheckNode:CheckNode",
+ "//submodules/SegmentedControlNode:SegmentedControlNode",
],
frameworks = [
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
diff --git a/submodules/ItemListUI/ItemListUI.xcodeproj/project.pbxproj b/submodules/ItemListUI/ItemListUI.xcodeproj/project.pbxproj
index dbf9227619..0b3f9fd97f 100644
--- a/submodules/ItemListUI/ItemListUI.xcodeproj/project.pbxproj
+++ b/submodules/ItemListUI/ItemListUI.xcodeproj/project.pbxproj
@@ -247,6 +247,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -426,6 +439,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -746,6 +760,17 @@
sourceTree
SOURCE_ROOT
+ 1DD70E294080C57A00000000
+
+ isa
+ PBXFileReference
+ name
+ ItemListMaskAccessory.swift
+ path
+ Sources/ItemListMaskAccessory.swift
+ sourceTree
+ SOURCE_ROOT
+
1DD70E29613EB66700000000
isa
@@ -799,6 +824,7 @@
1DD70E29AD71BDBE00000000
1DD70E29586B50C900000000
1DD70E2939FE48C000000000
+ 1DD70E294080C57A00000000
1DD70E29613EB66700000000
1DD70E2978C1317D00000000
1DD70E2989E0026900000000
@@ -1028,6 +1054,13 @@
fileRef
1DD70E2939FE48C000000000
+ E7A30F044080C57A00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E294080C57A00000000
+
E7A30F04613EB66700000000
isa
@@ -1079,6 +1112,7 @@
E7A30F04AD71BDBE00000000
E7A30F04586B50C900000000
E7A30F0439FE48C000000000
+ E7A30F044080C57A00000000
E7A30F04613EB66700000000
E7A30F0478C1317D00000000
E7A30F0489E0026900000000
@@ -1252,6 +1286,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -1289,6 +1330,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
name
diff --git a/submodules/ItemListUI/ItemListUI_Xcode.xcodeproj/project.pbxproj b/submodules/ItemListUI/ItemListUI_Xcode.xcodeproj/project.pbxproj
index 6a0b9a1c24..7bafe259fc 100644
--- a/submodules/ItemListUI/ItemListUI_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/ItemListUI/ItemListUI_Xcode.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
+ 09CE5B922322985500743FF4 /* ItemListMaskAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE5B912322985500743FF4 /* ItemListMaskAccessory.swift */; };
D060182122F35C2300796784 /* ProgressNavigationButtonNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D060182022F35C2300796784 /* ProgressNavigationButtonNode.framework */; };
D060185322F35E1F00796784 /* ItemListMultilineInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D060184922F35E1E00796784 /* ItemListMultilineInputItem.swift */; };
D060185422F35E1F00796784 /* ItemListTextWithLabelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D060184A22F35E1E00796784 /* ItemListTextWithLabelItem.swift */; };
@@ -50,6 +51,7 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
+ 09CE5B912322985500743FF4 /* ItemListMaskAccessory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListMaskAccessory.swift; sourceTree = ""; };
D060182022F35C2300796784 /* ProgressNavigationButtonNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ProgressNavigationButtonNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D060184922F35E1E00796784 /* ItemListMultilineInputItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListMultilineInputItem.swift; sourceTree = ""; };
D060184A22F35E1E00796784 /* ItemListTextWithLabelItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListTextWithLabelItem.swift; sourceTree = ""; };
@@ -168,6 +170,7 @@
D0D3286322F3366500D07EE2 /* ItemListControllerSearch.swift */,
D0D3286122F3366500D07EE2 /* ItemListControllerSegmentedTitleView.swift */,
D0D3289922F345C500D07EE2 /* ItemListItem.swift */,
+ 09CE5B912322985500743FF4 /* ItemListMaskAccessory.swift */,
D060186022F35F6B00796784 /* ItemListRevealOptionsNode.swift */,
D06018BA22F3663900796784 /* ItemListEditableDeleteControlNode.swift */,
D06018B822F3663800796784 /* ItemListEditableReorderControlNode.swift */,
@@ -294,6 +297,7 @@
D060185422F35E1F00796784 /* ItemListTextWithLabelItem.swift in Sources */,
D0C9BFB222FE327700FAB518 /* ItemListPlaceholderItem.swift in Sources */,
D0D3286722F3366600D07EE2 /* ItemListController.swift in Sources */,
+ 09CE5B922322985500743FF4 /* ItemListMaskAccessory.swift in Sources */,
D0D3286822F3366600D07EE2 /* ItemListControllerSearch.swift in Sources */,
D060185722F35E1F00796784 /* ItemListSwitchItem.swift in Sources */,
D0D3286622F3366600D07EE2 /* ItemListControllerSegmentedTitleView.swift in Sources */,
diff --git a/submodules/ItemListUI/Sources/ItemListController.swift b/submodules/ItemListUI/Sources/ItemListController.swift
index 6efc7cfd66..c338291667 100644
--- a/submodules/ItemListUI/Sources/ItemListController.swift
+++ b/submodules/ItemListUI/Sources/ItemListController.swift
@@ -283,7 +283,7 @@ open class ItemListController: ViewController, KeyShor
if let segmentedTitleView = strongSelf.segmentedTitleView, segmentedTitleView.segments == sections {
segmentedTitleView.index = index
} else {
- let segmentedTitleView = ItemListControllerSegmentedTitleView(segments: sections, index: index, color: controllerState.theme.rootController.navigationBar.accentTextColor)
+ let segmentedTitleView = ItemListControllerSegmentedTitleView(theme: controllerState.theme, segments: sections, selectedIndex: index)
strongSelf.segmentedTitleView = segmentedTitleView
strongSelf.navigationItem.titleView = strongSelf.segmentedTitleView
segmentedTitleView.indexUpdated = { index in
@@ -406,7 +406,7 @@ open class ItemListController: ViewController, KeyShor
strongSelf.navigationBar?.updatePresentationData(NavigationBarPresentationData(theme: NavigationBarTheme(rootControllerTheme: strongSelf.theme), strings: NavigationBarStrings(presentationStrings: strongSelf.strings)))
strongSelf.statusBar.statusBarStyle = strongSelf.theme.rootController.statusBarStyle.style
- strongSelf.segmentedTitleView?.color = controllerState.theme.rootController.navigationBar.accentTextColor
+ strongSelf.segmentedTitleView?.theme = controllerState.theme
var items = strongSelf.navigationItem.rightBarButtonItems ?? []
for i in 0 ..< strongSelf.rightNavigationButtonTitleAndStyle.count {
diff --git a/submodules/ItemListUI/Sources/ItemListControllerNode.swift b/submodules/ItemListUI/Sources/ItemListControllerNode.swift
index 358ad954c3..5524d79f49 100644
--- a/submodules/ItemListUI/Sources/ItemListControllerNode.swift
+++ b/submodules/ItemListUI/Sources/ItemListControllerNode.swift
@@ -162,6 +162,8 @@ open class ItemListControllerNode: ASDisplayNode, UISc
private let navigationBar: NavigationBar
public let listNode: ListView
+ private let leftOverlayNode: ASDisplayNode
+ private let rightOverlayNode: ASDisplayNode
private var emptyStateItem: ItemListControllerEmptyStateItem?
private var emptyStateNode: ItemListControllerEmptyStateItemNode?
@@ -204,6 +206,8 @@ open class ItemListControllerNode: ASDisplayNode, UISc
self.updateNavigationOffset = updateNavigationOffset
self.listNode = ListView()
+ self.leftOverlayNode = ASDisplayNode()
+ self.rightOverlayNode = ASDisplayNode()
super.init()
@@ -351,15 +355,45 @@ open class ItemListControllerNode: ASDisplayNode, UISc
var insets = layout.insets(options: [.input])
insets.top += navigationBarHeight
- insets.left += layout.safeInsets.left
- insets.right += layout.safeInsets.right
+
+ var addedInsets: UIEdgeInsets?
+ if case .tablet = layout.deviceMetrics.type, layout.size.width > 460.0 {
+ let inset = max(20.0, floor((layout.size.width - 674.0) / 2.0))
+ insets.left += inset
+ insets.right += inset
+ addedInsets = UIEdgeInsets(top: 0.0, left: inset, bottom: 0.0, right: inset)
+
+ if self.leftOverlayNode.supernode == nil {
+ self.addSubnode(self.leftOverlayNode)
+ }
+ if self.rightOverlayNode.supernode == nil {
+ self.addSubnode(self.rightOverlayNode)
+ }
+ } else {
+ insets.left += layout.safeInsets.left
+ insets.right += layout.safeInsets.right
+
+ if self.leftOverlayNode.supernode != nil {
+ self.leftOverlayNode.removeFromSupernode()
+ }
+ if self.rightOverlayNode.supernode != nil {
+ self.rightOverlayNode.removeFromSupernode()
+ }
+ }
self.listNode.bounds = CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: layout.size.height)
self.listNode.position = CGPoint(x: layout.size.width / 2.0, y: layout.size.height / 2.0)
self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: nil, updateSizeAndInsets: ListViewUpdateSizeAndInsets(size: layout.size, insets: insets, duration: duration, curve: listViewCurve), stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in })
+ self.leftOverlayNode.frame = CGRect(x: 0.0, y: insets.top + 1.0, width: insets.left, height: layout.size.height - insets.top)
+ self.rightOverlayNode.frame = CGRect(x: layout.size.width - insets.right, y: insets.top + 1.0, width: insets.right, height: layout.size.height - insets.top)
+
if let emptyStateNode = self.emptyStateNode {
+ var layout = layout
+ if let addedInsets = addedInsets {
+ layout = layout.addedInsets(insets: addedInsets)
+ }
emptyStateNode.updateLayout(layout: layout, navigationBarHeight: navigationBarHeight, transition: transition)
}
@@ -401,9 +435,13 @@ open class ItemListControllerNode: ASDisplayNode, UISc
case .plain:
self.backgroundColor = transition.theme.list.plainBackgroundColor
self.listNode.backgroundColor = transition.theme.list.plainBackgroundColor
+ self.leftOverlayNode.backgroundColor = transition.theme.list.plainBackgroundColor
+ self.rightOverlayNode.backgroundColor = transition.theme.list.plainBackgroundColor
case .blocks:
self.backgroundColor = transition.theme.list.blocksBackgroundColor
self.listNode.backgroundColor = transition.theme.list.blocksBackgroundColor
+ self.leftOverlayNode.backgroundColor = transition.theme.list.blocksBackgroundColor
+ self.rightOverlayNode.backgroundColor = transition.theme.list.blocksBackgroundColor
}
}
}
@@ -416,9 +454,13 @@ open class ItemListControllerNode: ASDisplayNode, UISc
case .plain:
self.backgroundColor = transition.theme.list.plainBackgroundColor
self.listNode.backgroundColor = transition.theme.list.plainBackgroundColor
+ self.leftOverlayNode.backgroundColor = transition.theme.list.plainBackgroundColor
+ self.rightOverlayNode.backgroundColor = transition.theme.list.plainBackgroundColor
case .blocks:
self.backgroundColor = transition.theme.list.blocksBackgroundColor
self.listNode.backgroundColor = transition.theme.list.blocksBackgroundColor
+ self.leftOverlayNode.backgroundColor = transition.theme.list.blocksBackgroundColor
+ self.rightOverlayNode.backgroundColor = transition.theme.list.blocksBackgroundColor
}
}
}
@@ -553,10 +595,6 @@ open class ItemListControllerNode: ASDisplayNode, UISc
if itemTag.isEqual(to: ensureVisibleItemTag) {
if let itemNode = itemNode as? ListViewItemNode {
strongSelf.listNode.ensureItemNodeVisible(itemNode)
- /*itemNode.setHighlighted(true, at: CGPoint(), animated: false)
- Queue.mainQueue().after(1.0, {
- itemNode.setHighlighted(false, at: CGPoint(), animated: true)
- })*/
applied = true
}
}
@@ -613,21 +651,13 @@ open class ItemListControllerNode: ASDisplayNode, UISc
open func scrollViewDidScroll(_ scrollView: UIScrollView) {
let distanceFromEquilibrium = scrollView.contentOffset.y - scrollView.contentSize.height / 3.0
-
- //let transition = 1.0 - min(1.0, max(0.0, abs(distanceFromEquilibrium) / 50.0))
-
self.updateNavigationOffset(-distanceFromEquilibrium)
-
- /*if let toolbarNode = toolbarNode {
- toolbarNode.layer.position = CGPoint(x: toolbarNode.layer.position.x, y: self.bounds.size.height - toolbarNode.bounds.size.height / 2.0 + (1.0 - transition) * toolbarNode.bounds.size.height)
- }*/
}
open func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) {
targetContentOffset.pointee = scrollView.contentOffset
let scrollVelocity = scrollView.panGestureRecognizer.velocity(in: scrollView)
-
if abs(scrollVelocity.y) > 200.0 {
self.animateOut()
}
diff --git a/submodules/ItemListUI/Sources/ItemListControllerSegmentedTitleView.swift b/submodules/ItemListUI/Sources/ItemListControllerSegmentedTitleView.swift
index 1cff70bd53..b9efd223e2 100644
--- a/submodules/ItemListUI/Sources/ItemListControllerSegmentedTitleView.swift
+++ b/submodules/ItemListUI/Sources/ItemListControllerSegmentedTitleView.swift
@@ -1,50 +1,49 @@
import Foundation
import UIKit
+import SegmentedControlNode
+import TelegramPresentationData
public final class ItemListControllerSegmentedTitleView: UIView {
+ private let segmentedControlNode: SegmentedControlNode
+
+ public var theme: PresentationTheme {
+ didSet {
+ self.segmentedControlNode.updateTheme(SegmentedControlTheme(theme: self.theme))
+ }
+ }
public var segments: [String] {
didSet {
if self.segments != oldValue {
- self.control.removeAllSegments()
- var index = 0
- for segment in self.segments {
- self.control.insertSegment(withTitle: segment, at: index, animated: false)
- index += 1
- }
+ self.segmentedControlNode.items = self.segments.map { SegmentedControlItem(title: $0) }
self.setNeedsLayout()
}
}
}
public var index: Int {
- didSet {
- self.control.selectedSegmentIndex = self.index
+ get {
+ return self.segmentedControlNode.selectedIndex
+ }
+ set {
+ self.segmentedControlNode.selectedIndex = newValue
}
}
- private let control: UISegmentedControl
-
public var indexUpdated: ((Int) -> Void)?
- public var color: UIColor {
- didSet {
- self.control.tintColor = self.color
- }
- }
-
- public init(segments: [String], index: Int, color: UIColor) {
+ public init(theme: PresentationTheme, segments: [String], selectedIndex: Int) {
+ self.theme = theme
self.segments = segments
- self.index = index
- self.color = color
- self.control = UISegmentedControl(items: segments)
- self.control.selectedSegmentIndex = index
- self.control.tintColor = color
+ self.segmentedControlNode = SegmentedControlNode(theme: SegmentedControlTheme(theme: theme), items: segments.map { SegmentedControlItem(title: $0) }, selectedIndex: selectedIndex)
super.init(frame: CGRect())
- self.addSubview(self.control)
- self.control.addTarget(self, action: #selector(indexChanged), for: .valueChanged)
+ self.segmentedControlNode.selectedIndexChanged = { [weak self] index in
+ self?.indexUpdated?(index)
+ }
+
+ self.addSubnode(self.segmentedControlNode)
}
required public init?(coder aDecoder: NSCoder) {
@@ -55,13 +54,7 @@ public final class ItemListControllerSegmentedTitleView: UIView {
super.layoutSubviews()
let size = self.bounds.size
-
- var controlSize = self.control.sizeThatFits(size)
- controlSize.width = min(size.width, max(160.0, controlSize.width))
- self.control.frame = CGRect(origin: CGPoint(x: floor((size.width - controlSize.width) / 2.0), y: floor((size.height - controlSize.height) / 2.0)), size: controlSize)
- }
-
- @objc private func indexChanged() {
- self.indexUpdated?(self.control.selectedSegmentIndex)
+ let controlSize = self.segmentedControlNode.updateLayout(.sizeToFit(maximumWidth: size.width, minimumWidth: 160.0), transition: .immediate)
+ self.segmentedControlNode.frame = CGRect(origin: CGPoint(x: floor((size.width - controlSize.width) / 2.0), y: floor((size.height - controlSize.height) / 2.0)), size: controlSize)
}
}
diff --git a/submodules/ItemListUI/Sources/ItemListItem.swift b/submodules/ItemListUI/Sources/ItemListItem.swift
index 78e49e9e3c..40e2ea4161 100644
--- a/submodules/ItemListUI/Sources/ItemListItem.swift
+++ b/submodules/ItemListUI/Sources/ItemListItem.swift
@@ -14,6 +14,8 @@ public protocol ItemListItem {
}
public extension ItemListItem {
+ //let accessoryItem: ListViewAccessoryItem?
+
var isAlwaysPlain: Bool {
return false
}
diff --git a/submodules/ItemListUI/Sources/ItemListMaskAccessory.swift b/submodules/ItemListUI/Sources/ItemListMaskAccessory.swift
new file mode 100644
index 0000000000..8d6f0c3862
--- /dev/null
+++ b/submodules/ItemListUI/Sources/ItemListMaskAccessory.swift
@@ -0,0 +1,38 @@
+import Foundation
+import UIKit
+import Display
+
+final class ItemListMaskAccessoryItem: ListViewAccessoryItem {
+ private let sectionId: Int32
+
+ init(sectionId: Int32) {
+ self.sectionId = sectionId
+ }
+
+ func isEqualToItem(_ other: ListViewAccessoryItem) -> Bool {
+ if case let other as ItemListMaskAccessoryItem = other {
+ return self.sectionId == other.sectionId
+ }
+
+ return false
+ }
+
+ func node(synchronous: Bool) -> ListViewAccessoryItemNode {
+ let node = ItemListMaskAccessoryItemItemNode()
+ node.frame = CGRect(origin: CGPoint(), size: CGSize(width: 38.0, height: 38.0))
+ return node
+ }
+}
+
+final class ItemListMaskAccessoryItemItemNode: ListViewAccessoryItemNode {
+ let node: ASDisplayNode
+
+ override init() {
+ self.node = ASDisplayNode()
+ self.node.backgroundColor = .red
+
+ super.init()
+
+ self.addSubnode(self.node)
+ }
+}
diff --git a/submodules/ItemListUI/Sources/Items/ItemListActionItem.swift b/submodules/ItemListUI/Sources/Items/ItemListActionItem.swift
index b29cbafe1b..d85e67ed42 100644
--- a/submodules/ItemListUI/Sources/Items/ItemListActionItem.swift
+++ b/submodules/ItemListUI/Sources/Items/ItemListActionItem.swift
@@ -92,6 +92,7 @@ public class ItemListActionItemNode: ListViewItemNode, ItemListItemNode {
private let topStripeNode: ASDisplayNode
private let bottomStripeNode: ASDisplayNode
private let highlightedBackgroundNode: ASDisplayNode
+ private let maskNode: ASImageNode
private let titleNode: TextNode
@@ -107,7 +108,7 @@ public class ItemListActionItemNode: ListViewItemNode, ItemListItemNode {
self.backgroundNode = ASDisplayNode()
self.backgroundNode.isLayerBacked = true
self.backgroundNode.backgroundColor = .white
-
+ self.maskNode = ASImageNode()
self.topStripeNode = ASDisplayNode()
self.topStripeNode.isLayerBacked = true
@@ -216,7 +217,9 @@ public class ItemListActionItemNode: ListViewItemNode, ItemListItemNode {
if strongSelf.bottomStripeNode.supernode == nil {
strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0)
}
-
+ if strongSelf.maskNode.supernode != nil {
+ strongSelf.maskNode.removeFromSupernode()
+ }
strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight))
case .blocks:
if strongSelf.backgroundNode.supernode == nil {
@@ -228,11 +231,19 @@ public class ItemListActionItemNode: ListViewItemNode, ItemListItemNode {
if strongSelf.bottomStripeNode.supernode == nil {
strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2)
}
+ if strongSelf.maskNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
+ }
+
+ let hasCorners = params.width > 480
+ var hasTopCorners = false
+ var hasBottomCorners = false
switch neighbors.top {
case .sameSection(false):
strongSelf.topStripeNode.isHidden = true
default:
- strongSelf.topStripeNode.isHidden = false
+ hasTopCorners = true
+ strongSelf.topStripeNode.isHidden = hasCorners
}
let bottomStripeInset: CGFloat
let bottomStripeOffset: CGFloat
@@ -243,8 +254,14 @@ public class ItemListActionItemNode: ListViewItemNode, ItemListItemNode {
default:
bottomStripeInset = 0.0
bottomStripeOffset = 0.0
+ hasBottomCorners = true
+ strongSelf.bottomStripeNode.isHidden = hasCorners
}
+
+ strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
+
strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
+ strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight))
strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height + bottomStripeOffset), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight))
}
diff --git a/submodules/ItemListUI/Sources/Items/ItemListDisclosureItem.swift b/submodules/ItemListUI/Sources/Items/ItemListDisclosureItem.swift
index 6986cf2537..abc9581317 100644
--- a/submodules/ItemListUI/Sources/Items/ItemListDisclosureItem.swift
+++ b/submodules/ItemListUI/Sources/Items/ItemListDisclosureItem.swift
@@ -108,6 +108,7 @@ public class ItemListDisclosureItemNode: ListViewItemNode, ItemListItemNode {
private let topStripeNode: ASDisplayNode
private let bottomStripeNode: ASDisplayNode
private let highlightedBackgroundNode: ASDisplayNode
+ private let maskNode: ASImageNode
let iconNode: ASImageNode
let titleNode: TextNode
@@ -137,6 +138,8 @@ public class ItemListDisclosureItemNode: ListViewItemNode, ItemListItemNode {
self.backgroundNode.isLayerBacked = true
self.backgroundNode.backgroundColor = .white
+ self.maskNode = ASImageNode()
+
self.topStripeNode = ASDisplayNode()
self.topStripeNode.isLayerBacked = true
@@ -357,7 +360,9 @@ public class ItemListDisclosureItemNode: ListViewItemNode, ItemListItemNode {
if strongSelf.bottomStripeNode.supernode == nil {
strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0)
}
-
+ if strongSelf.maskNode.supernode != nil {
+ strongSelf.maskNode.removeFromSupernode()
+ }
strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight))
case .blocks:
if strongSelf.backgroundNode.supernode == nil {
@@ -369,11 +374,19 @@ public class ItemListDisclosureItemNode: ListViewItemNode, ItemListItemNode {
if strongSelf.bottomStripeNode.supernode == nil {
strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2)
}
+ if strongSelf.maskNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
+ }
+
+ let hasCorners = params.width > 480
+ var hasTopCorners = false
+ var hasBottomCorners = false
switch neighbors.top {
case .sameSection(false):
strongSelf.topStripeNode.isHidden = true
default:
- strongSelf.topStripeNode.isHidden = false
+ hasTopCorners = true
+ strongSelf.topStripeNode.isHidden = hasCorners
}
let bottomStripeInset: CGFloat
switch neighbors.bottom {
@@ -381,10 +394,15 @@ public class ItemListDisclosureItemNode: ListViewItemNode, ItemListItemNode {
bottomStripeInset = leftInset
default:
bottomStripeInset = 0.0
+ hasBottomCorners = true
+ strongSelf.bottomStripeNode.isHidden = hasCorners
}
+ strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
+
strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
- strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight))
+ strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
+ strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight))
strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight))
}
diff --git a/submodules/ItemListUI/Sources/Items/ItemListSwitchItem.swift b/submodules/ItemListUI/Sources/Items/ItemListSwitchItem.swift
index a7113d6474..d01ded7159 100644
--- a/submodules/ItemListUI/Sources/Items/ItemListSwitchItem.swift
+++ b/submodules/ItemListUI/Sources/Items/ItemListSwitchItem.swift
@@ -114,6 +114,7 @@ public class ItemListSwitchItemNode: ListViewItemNode, ItemListItemNode {
private let topStripeNode: ASDisplayNode
private let bottomStripeNode: ASDisplayNode
private let highlightedBackgroundNode: ASDisplayNode
+ private let maskNode: ASImageNode
private let titleNode: TextNode
private var switchNode: ASDisplayNode & ItemListSwitchNodeImpl
@@ -133,6 +134,8 @@ public class ItemListSwitchItemNode: ListViewItemNode, ItemListItemNode {
self.backgroundNode.isLayerBacked = true
self.backgroundNode.backgroundColor = .white
+ self.maskNode = ASImageNode()
+
self.topStripeNode = ASDisplayNode()
self.topStripeNode.isLayerBacked = true
@@ -299,7 +302,9 @@ public class ItemListSwitchItemNode: ListViewItemNode, ItemListItemNode {
if strongSelf.bottomStripeNode.supernode == nil {
strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0)
}
-
+ if strongSelf.maskNode.supernode != nil {
+ strongSelf.maskNode.removeFromSupernode()
+ }
strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight))
case .blocks:
if strongSelf.backgroundNode.supernode == nil {
@@ -311,11 +316,19 @@ public class ItemListSwitchItemNode: ListViewItemNode, ItemListItemNode {
if strongSelf.bottomStripeNode.supernode == nil {
strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2)
}
+ if strongSelf.maskNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
+ }
+
+ let hasCorners = params.width > 480
+ var hasTopCorners = false
+ var hasBottomCorners = false
switch neighbors.top {
case .sameSection(false):
strongSelf.topStripeNode.isHidden = true
default:
- strongSelf.topStripeNode.isHidden = false
+ hasTopCorners = true
+ strongSelf.topStripeNode.isHidden = hasCorners
}
let bottomStripeInset: CGFloat
switch neighbors.bottom {
@@ -323,9 +336,14 @@ public class ItemListSwitchItemNode: ListViewItemNode, ItemListItemNode {
bottomStripeInset = 16.0 + params.leftInset
default:
bottomStripeInset = 0.0
+ hasBottomCorners = true
+ strongSelf.bottomStripeNode.isHidden = hasCorners
}
+ strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
+
strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
+ strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight))
strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight))
}
diff --git a/submodules/ItemListUI/Sources/Items/ItemListTextEmptyStateItem.swift b/submodules/ItemListUI/Sources/Items/ItemListTextEmptyStateItem.swift
index 425235c863..ea4c91925a 100644
--- a/submodules/ItemListUI/Sources/Items/ItemListTextEmptyStateItem.swift
+++ b/submodules/ItemListUI/Sources/Items/ItemListTextEmptyStateItem.swift
@@ -60,7 +60,7 @@ public final class ItemListTextEmptyStateItemNode: ItemListControllerEmptyStateI
self.validLayout = (layout, navigationBarHeight)
var insets = layout.insets(options: [.statusBar])
insets.top += navigationBarHeight
- let textSize = self.textNode.measure(CGSize(width: layout.size.width - 40.0 - layout.safeInsets.left - layout.safeInsets.right, height: max(1.0, layout.size.height - insets.top - insets.bottom)))
- self.textNode.frame = CGRect(origin: CGPoint(x: layout.safeInsets.left + floor((layout.size.width - layout.safeInsets.left - layout.safeInsets.right - textSize.width) / 2.0), y: insets.top + floor((layout.size.height - insets.top - insets.bottom - textSize.height) / 2.0)), size: textSize)
+ let textSize = self.textNode.measure(CGSize(width: layout.size.width - 40.0 - layout.safeInsets.left - layout.safeInsets.right - layout.intrinsicInsets.left - layout.intrinsicInsets.right, height: max(1.0, layout.size.height - insets.top - insets.bottom)))
+ self.textNode.frame = CGRect(origin: CGPoint(x: layout.safeInsets.left + layout.intrinsicInsets.left + floor((layout.size.width - layout.safeInsets.left - layout.safeInsets.right - layout.intrinsicInsets.left - layout.intrinsicInsets.right - textSize.width) / 2.0), y: insets.top + floor((layout.size.height - insets.top - insets.bottom - textSize.height) / 2.0)), size: textSize)
}
}
diff --git a/submodules/MessageReactionListUI/MessageReactionListUI.xcodeproj/project.pbxproj b/submodules/MessageReactionListUI/MessageReactionListUI.xcodeproj/project.pbxproj
index f7fe13fca9..436c007781 100644
--- a/submodules/MessageReactionListUI/MessageReactionListUI.xcodeproj/project.pbxproj
+++ b/submodules/MessageReactionListUI/MessageReactionListUI.xcodeproj/project.pbxproj
@@ -143,6 +143,19 @@
explicitFileType
archive.ar
+ 1DD70E296C9831F100000000
+
+ isa
+ PBXFileReference
+ name
+ libContextUI.a
+ path
+ libContextUI.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E295915423000000000
isa
@@ -299,6 +312,32 @@
explicitFileType
archive.ar
+ 1DD70E29AD66967300000000
+
+ isa
+ PBXFileReference
+ name
+ libReactionSelectionNode.a
+ path
+ libReactionSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -429,6 +468,19 @@
explicitFileType
archive.ar
+ 1DD70E29F40A586F00000000
+
+ isa
+ PBXFileReference
+ name
+ libTextSelectionNode.a
+ path
+ libTextSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29CD296A8300000000
isa
@@ -470,6 +522,7 @@
1DD70E292420028600000000
1DD70E29A54A195300000000
1DD70E2997B4D6D800000000
+ 1DD70E296C9831F100000000
1DD70E295915423000000000
1DD70E29FF334B1F00000000
1DD70E29D6F14E1000000000
@@ -482,6 +535,8 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E29AD66967300000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -492,6 +547,7 @@
1DD70E292395015100000000
1DD70E29BA06E3A600000000
1DD70E29F0C15F9C00000000
+ 1DD70E29F40A586F00000000
1DD70E29CD296A8300000000
1DD70E2951398CF200000000
@@ -772,6 +828,27 @@
fileRef
1DD70E29A54A195300000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F0497B4D6D800000000
isa
@@ -800,6 +877,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -855,10 +939,14 @@
E7A30F043594DCC000000000
E7A30F042420028600000000
E7A30F04A54A195300000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F0497B4D6D800000000
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04D233F68C00000000
diff --git a/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI.xcodeproj/project.pbxproj b/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI.xcodeproj/project.pbxproj
index 5ca0d0bd9f..0cf4ba8c51 100644
--- a/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI.xcodeproj/project.pbxproj
+++ b/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI.xcodeproj/project.pbxproj
@@ -260,6 +260,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -440,6 +453,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -731,6 +745,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -775,6 +796,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
diff --git a/submodules/OpusBinding/Sources/OggOpusReader.m b/submodules/OpusBinding/Sources/OggOpusReader.m
index bf569da19f..5e8bd5af53 100644
--- a/submodules/OpusBinding/Sources/OggOpusReader.m
+++ b/submodules/OpusBinding/Sources/OggOpusReader.m
@@ -10,7 +10,7 @@
@implementation OggOpusReader
-- (instancetype _Nullable)init:(NSString *)path {
+- (instancetype _Nullable)initWithPath:(NSString *)path {
self = [super init];
if (self != nil) {
int error = OPUS_OK;
diff --git a/submodules/PassportUI/PassportUI.xcodeproj/project.pbxproj b/submodules/PassportUI/PassportUI.xcodeproj/project.pbxproj
index dd6be374f8..f3d555fe0b 100644
--- a/submodules/PassportUI/PassportUI.xcodeproj/project.pbxproj
+++ b/submodules/PassportUI/PassportUI.xcodeproj/project.pbxproj
@@ -572,6 +572,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29097DBE9200000000
isa
@@ -867,6 +880,7 @@
1DD70E291D58331200000000
1DD70E29CF967D4300000000
1DD70E29EA9CBB5B00000000
+ 1DD70E2957B5522500000000
1DD70E29097DBE9200000000
1DD70E2981AE180900000000
1DD70E293594DCC000000000
@@ -2163,6 +2177,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -2250,6 +2271,7 @@
E7A30F04BBAF750C00000000
E7A30F04F523B9DE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F049856EB2400000000
diff --git a/submodules/PasswordSetupUI/PasswordSetupUI.xcodeproj/project.pbxproj b/submodules/PasswordSetupUI/PasswordSetupUI.xcodeproj/project.pbxproj
index abff3f17f0..01f071d98f 100644
--- a/submodules/PasswordSetupUI/PasswordSetupUI.xcodeproj/project.pbxproj
+++ b/submodules/PasswordSetupUI/PasswordSetupUI.xcodeproj/project.pbxproj
@@ -273,6 +273,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -454,6 +467,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -812,6 +826,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -857,6 +878,7 @@
E7A30F0497B4D6D800000000
E7A30F04C37F741500000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
diff --git a/submodules/PeerInfoUI/PeerInfoUI.xcodeproj/project.pbxproj b/submodules/PeerInfoUI/PeerInfoUI.xcodeproj/project.pbxproj
index ec96b618b7..ba48521aec 100644
--- a/submodules/PeerInfoUI/PeerInfoUI.xcodeproj/project.pbxproj
+++ b/submodules/PeerInfoUI/PeerInfoUI.xcodeproj/project.pbxproj
@@ -832,6 +832,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29097DBE9200000000
isa
@@ -1264,6 +1277,7 @@
1DD70E29CF967D4300000000
1DD70E29EA9CBB5B00000000
1DD70E291328E99400000000
+ 1DD70E2957B5522500000000
1DD70E29097DBE9200000000
1DD70E2981AE180900000000
1DD70E29135DFEDE00000000
@@ -2379,6 +2393,27 @@
fileRef
1DD70E2997B4D6D800000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F04C37F741500000000
isa
@@ -2393,6 +2428,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -2428,6 +2470,13 @@
fileRef
1DD70E2931752C6000000000
+ E7A30F04BBAF750C00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29BBAF750C00000000
+
E7A30F041328E99400000000
isa
@@ -2547,27 +2596,6 @@
fileRef
1DD70E292F91702000000000
- E7A30F04AD66967300000000
-
- isa
- PBXBuildFile
- fileRef
- 1DD70E29AD66967300000000
-
- E7A30F04F40A586F00000000
-
- isa
- PBXBuildFile
- fileRef
- 1DD70E29F40A586F00000000
-
- E7A30F046C9831F100000000
-
- isa
- PBXBuildFile
- fileRef
- 1DD70E296C9831F100000000
-
E7A30F04A59C927400000000
isa
@@ -2715,13 +2743,6 @@
fileRef
1DD70E2937C1167400000000
- E7A30F04BBAF750C00000000
-
- isa
- PBXBuildFile
- fileRef
- 1DD70E29BBAF750C00000000
-
E7A30F049856EB2400000000
isa
@@ -2819,13 +2840,18 @@
E7A30F042420028600000000
E7A30F04A54A195300000000
E7A30F0497B4D6D800000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F04C37F741500000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04D233F68C00000000
E7A30F049A24C4DE00000000
E7A30F0431752C6000000000
+ E7A30F04BBAF750C00000000
E7A30F041328E99400000000
E7A30F041E16CC6C00000000
E7A30F04928D142900000000
@@ -2843,9 +2869,6 @@
E7A30F04524F478E00000000
E7A30F04DF758A8500000000
E7A30F042F91702000000000
- E7A30F04AD66967300000000
- E7A30F04F40A586F00000000
- E7A30F046C9831F100000000
E7A30F04A59C927400000000
E7A30F04AE190FC000000000
E7A30F04247D9AC100000000
@@ -2867,7 +2890,6 @@
E7A30F04A3994F2C00000000
E7A30F048ED1FB1300000000
E7A30F0437C1167400000000
- E7A30F04BBAF750C00000000
E7A30F049856EB2400000000
E7A30F04C7165FF900000000
E7A30F04135DFEDE00000000
diff --git a/submodules/PeerInfoUI/Sources/PeerReportController.swift b/submodules/PeerInfoUI/Sources/PeerReportController.swift
index e827dff690..db0614a5bb 100644
--- a/submodules/PeerInfoUI/Sources/PeerReportController.swift
+++ b/submodules/PeerInfoUI/Sources/PeerReportController.swift
@@ -94,7 +94,7 @@ public func presentPeerReportOptions(context: AccountContext, parent: ViewContro
f(.dismissWithoutContent)
})))
}
- contextController.setItems(items)
+ contextController.setItems(.single(items))
} else {
contextController?.dismiss()
parent.view.endEditing(true)
diff --git a/submodules/PeerInfoUI/Sources/UserInfoController.swift b/submodules/PeerInfoUI/Sources/UserInfoController.swift
index 9e93dc7bb2..5ef6d36001 100644
--- a/submodules/PeerInfoUI/Sources/UserInfoController.swift
+++ b/submodules/PeerInfoUI/Sources/UserInfoController.swift
@@ -766,6 +766,30 @@ private func getUserPeer(postbox: Postbox, peerId: PeerId) -> Signal<(Peer?, Cac
}
}
+public func openAddPersonContactImpl(context: AccountContext, peerId: PeerId, present: @escaping (ViewController, Any?) -> Void) {
+ let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId)
+ |> deliverOnMainQueue).start(next: { peer, cachedData in
+ guard let user = peer as? TelegramUser, let contactData = DeviceContactExtendedData(peer: user) else {
+ return
+ }
+
+ var shareViaException = false
+ if let cachedData = cachedData as? CachedUserData, let peerStatusSettings = cachedData.peerStatusSettings {
+ shareViaException = peerStatusSettings.contains(.addExceptionWhenAddingContact)
+ }
+
+ present(deviceContactInfoController(context: context, subject: .create(peer: user, contactData: contactData, isSharing: true, shareViaException: shareViaException, completion: { peer, stableId, contactData in
+ if let peer = peer as? TelegramUser {
+ if let phone = peer.phone, !phone.isEmpty {
+ }
+
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ present(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.AddContact_StatusSuccess(peer.compactDisplayTitle).0, true)), nil)
+ }
+ }), completed: nil, cancelled: nil), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ })
+}
+
public func userInfoController(context: AccountContext, peerId: PeerId, mode: PeerInfoControllerMode = .generic) -> ViewController {
let statePromise = ValuePromise(UserInfoState(), ignoreRepeated: true)
let stateValue = Atomic(value: UserInfoState())
@@ -892,26 +916,8 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Pe
}, openChat: {
openChatImpl?()
}, addContact: {
- let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId)
- |> deliverOnMainQueue).start(next: { peer, cachedData in
- guard let user = peer as? TelegramUser, let contactData = DeviceContactExtendedData(peer: user) else {
- return
- }
-
- var shareViaException = false
- if let cachedData = cachedData as? CachedUserData, let peerStatusSettings = cachedData.peerStatusSettings {
- shareViaException = peerStatusSettings.contains(.addExceptionWhenAddingContact)
- }
-
- presentControllerImpl?(deviceContactInfoController(context: context, subject: .create(peer: user, contactData: contactData, isSharing: true, shareViaException: shareViaException, completion: { peer, stableId, contactData in
- if let peer = peer as? TelegramUser {
- if let phone = peer.phone, !phone.isEmpty {
- }
-
- let presentationData = context.sharedContext.currentPresentationData.with { $0 }
- presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.AddContact_StatusSuccess(peer.compactDisplayTitle).0, true)), nil)
- }
- }), completed: nil, cancelled: nil), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ openAddPersonContactImpl(context: context, peerId: peerId, present: { c, a in
+ presentControllerImpl?(c, a)
})
}, shareContact: {
shareContactImpl?()
diff --git a/submodules/PeersNearbyUI/PeersNearbyUI.xcodeproj/project.pbxproj b/submodules/PeersNearbyUI/PeersNearbyUI.xcodeproj/project.pbxproj
index a1c4fa5ad1..376b6f5396 100644
--- a/submodules/PeersNearbyUI/PeersNearbyUI.xcodeproj/project.pbxproj
+++ b/submodules/PeersNearbyUI/PeersNearbyUI.xcodeproj/project.pbxproj
@@ -156,6 +156,19 @@
explicitFileType
archive.ar
+ 1DD70E296C9831F100000000
+
+ isa
+ PBXFileReference
+ name
+ libContextUI.a
+ path
+ libContextUI.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E292417E0B200000000
isa
@@ -377,6 +390,32 @@
explicitFileType
archive.ar
+ 1DD70E29AD66967300000000
+
+ isa
+ PBXFileReference
+ name
+ libReactionSelectionNode.a
+ path
+ libReactionSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29524F478E00000000
isa
@@ -546,6 +585,19 @@
explicitFileType
archive.ar
+ 1DD70E29F40A586F00000000
+
+ isa
+ PBXFileReference
+ name
+ libTextSelectionNode.a
+ path
+ libTextSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29CD296A8300000000
isa
@@ -588,6 +640,7 @@
1DD70E292420028600000000
1DD70E29A54A195300000000
1DD70E2997B4D6D800000000
+ 1DD70E296C9831F100000000
1DD70E292417E0B200000000
1DD70E295915423000000000
1DD70E29FF334B1F00000000
@@ -605,6 +658,8 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E29AD66967300000000
+ 1DD70E2957B5522500000000
1DD70E29524F478E00000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
@@ -618,6 +673,7 @@
1DD70E292395015100000000
1DD70E29BA06E3A600000000
1DD70E29F0C15F9C00000000
+ 1DD70E29F40A586F00000000
1DD70E29CD296A8300000000
1DD70E2951398CF200000000
@@ -933,6 +989,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -961,6 +1024,27 @@
fileRef
1DD70E29A54A195300000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F04D233F68C00000000
isa
@@ -1049,10 +1133,14 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F0405A95CB400000000
E7A30F04A54A195300000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F04D233F68C00000000
E7A30F049A24C4DE00000000
E7A30F04BBAF750C00000000
diff --git a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift
index d86a58791b..a0ecc2de81 100644
--- a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift
+++ b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift
@@ -34,7 +34,7 @@ private func generateBackgroundImage(foreground: UIColor, diameter: CGFloat, sha
private func generateBackgroundShadowImage(shadow: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? {
return generateImage(CGSize(width: diameter * 2.0 + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
- context.setFillColor(UIColor.white.cgColor)
+ context.setFillColor(shadow.cgColor)
context.setShadow(offset: CGSize(), blur: shadowBlur, color: shadow.cgColor)
context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
@@ -61,7 +61,7 @@ private func generateBubbleImage(foreground: UIColor, diameter: CGFloat, shadowB
private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? {
return generateImage(CGSize(width: diameter + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
- context.setFillColor(UIColor.white.cgColor)
+ context.setFillColor(shadow.cgColor)
context.setShadow(offset: CGSize(), blur: shadowBlur, color: shadow.cgColor)
context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
context.setShadow(offset: CGSize(), blur: 1.0, color: shadow.cgColor)
diff --git a/submodules/SegmentedControlNode/BUCK b/submodules/SegmentedControlNode/BUCK
new file mode 100644
index 0000000000..f5b679832c
--- /dev/null
+++ b/submodules/SegmentedControlNode/BUCK
@@ -0,0 +1,17 @@
+load("//Config:buck_rule_macros.bzl", "static_library")
+
+static_library(
+ name = "SegmentedControlNode",
+ srcs = glob([
+ "Sources/**/*.swift",
+ ]),
+ deps = [
+ "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared",
+ "//submodules/Display:Display#shared",
+ "//submodules/TelegramPresentationData:TelegramPresentationData",
+ ],
+ frameworks = [
+ "$SDKROOT/System/Library/Frameworks/Foundation.framework",
+ "$SDKROOT/System/Library/Frameworks/UIKit.framework",
+ ],
+)
diff --git a/submodules/SegmentedControlNode/Info.plist b/submodules/SegmentedControlNode/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/SegmentedControlNode/Info.plist
@@ -0,0 +1,22 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ $(CURRENT_PROJECT_VERSION)
+
+
diff --git a/submodules/SegmentedControlNode/SegmentedControlNode.xcodeproj/project.pbxproj b/submodules/SegmentedControlNode/SegmentedControlNode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..ee7188ef04
--- /dev/null
+++ b/submodules/SegmentedControlNode/SegmentedControlNode.xcodeproj/project.pbxproj
@@ -0,0 +1,511 @@
+
+
+
+
+ archiveVersion
+ 1
+ classes
+
+
+ objectVersion
+ 46
+ objects
+
+ 1DD70E299315E66800000000
+
+ isa
+ PBXFileReference
+ name
+ SegmentedControlNode-Debug.xcconfig
+ path
+ ../../buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Debug.xcconfig
+ sourceTree
+ SOURCE_ROOT
+ explicitFileType
+ text.xcconfig
+
+ 1DD70E290A5883D200000000
+
+ isa
+ PBXFileReference
+ name
+ SegmentedControlNode-Profile.xcconfig
+ path
+ ../../buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Profile.xcconfig
+ sourceTree
+ SOURCE_ROOT
+ explicitFileType
+ text.xcconfig
+
+ 1DD70E297DEF2F3400000000
+
+ isa
+ PBXFileReference
+ name
+ SegmentedControlNode-Release.xcconfig
+ path
+ ../../buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Release.xcconfig
+ sourceTree
+ SOURCE_ROOT
+ explicitFileType
+ text.xcconfig
+
+ B401C9792F7F325000000000
+
+ isa
+ PBXGroup
+ name
+ Buck (Do Not Modify)
+ sourceTree
+ ]]>
+ children
+
+ 1DD70E299315E66800000000
+ 1DD70E290A5883D200000000
+ 1DD70E297DEF2F3400000000
+
+
+ B401C979B781F65D00000000
+
+ isa
+ PBXGroup
+ name
+ Configurations
+ sourceTree
+ ]]>
+ children
+
+ B401C9792F7F325000000000
+
+
+ 1DD70E29FF334B1F00000000
+
+ isa
+ PBXFileReference
+ name
+ libDisplay.dylib
+ path
+ libDisplay.dylib
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ compiled.mach-o.dylib
+
+ 1DD70E2936DE2CF900000000
+
+ isa
+ PBXFileReference
+ name
+ libMediaResources.a
+ path
+ libMediaResources.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
+ 1DD70E29DB6520C800000000
+
+ isa
+ PBXFileReference
+ name
+ libPostbox.dylib
+ path
+ libPostbox.dylib
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ compiled.mach-o.dylib
+
+ 1DD70E29D65BA68200000000
+
+ isa
+ PBXFileReference
+ name
+ libSwiftSignalKit.dylib
+ path
+ libSwiftSignalKit.dylib
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ compiled.mach-o.dylib
+
+ 1DD70E29119CDA0700000000
+
+ isa
+ PBXFileReference
+ name
+ libTelegramCore.dylib
+ path
+ libTelegramCore.dylib
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ compiled.mach-o.dylib
+
+ 1DD70E2984A59C1D00000000
+
+ isa
+ PBXFileReference
+ name
+ libTelegramPresentationData.a
+ path
+ libTelegramPresentationData.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
+ 1DD70E292395015100000000
+
+ isa
+ PBXFileReference
+ name
+ libTelegramUIPreferences.a
+ path
+ libTelegramUIPreferences.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
+ B401C97968022A5500000000
+
+ isa
+ PBXGroup
+ name
+ Frameworks
+ sourceTree
+ ]]>
+ children
+
+ 1DD70E29FF334B1F00000000
+ 1DD70E2936DE2CF900000000
+ 1DD70E29DB6520C800000000
+ 1DD70E29D65BA68200000000
+ 1DD70E29119CDA0700000000
+ 1DD70E2984A59C1D00000000
+ 1DD70E292395015100000000
+
+
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
+ B401C979C806358400000000
+
+ isa
+ PBXGroup
+ name
+ Products
+ sourceTree
+ ]]>
+ children
+
+ 1DD70E2957B5522500000000
+
+
+ 1DD70E29001F47FB00000000
+
+ isa
+ PBXFileReference
+ name
+ BUCK
+ path
+ BUCK
+ sourceTree
+ SOURCE_ROOT
+ explicitFileType
+ text.script.python
+
+ 1DD70E29D782379200000000
+
+ isa
+ PBXFileReference
+ name
+ SegmentedControlNode.swift
+ path
+ Sources/SegmentedControlNode.swift
+ sourceTree
+ SOURCE_ROOT
+
+ B401C979EAB5339800000000
+
+ isa
+ PBXGroup
+ name
+ Sources
+ sourceTree
+ ]]>
+ children
+
+ 1DD70E29D782379200000000
+
+
+ B401C979B84A82AD00000000
+
+ isa
+ PBXGroup
+ name
+ SegmentedControlNode
+ sourceTree
+ ]]>
+ children
+
+ 1DD70E29001F47FB00000000
+ B401C979EAB5339800000000
+
+
+ B401C979EFB6AC4600000000
+
+ isa
+ PBXGroup
+ name
+ mainGroup
+ sourceTree
+ ]]>
+ children
+
+ B401C979B781F65D00000000
+ B401C97968022A5500000000
+ B401C979C806358400000000
+ B401C979B84A82AD00000000
+
+
+ E7A30F04D782379200000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29D782379200000000
+
+ 1870857F0000000000000000
+
+ isa
+ PBXSourcesBuildPhase
+ files
+
+ E7A30F04D782379200000000
+
+
+ E7A30F04FF334B1F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29FF334B1F00000000
+
+ E7A30F04DB6520C800000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29DB6520C800000000
+
+ E7A30F04D65BA68200000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29D65BA68200000000
+
+ E7A30F04119CDA0700000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29119CDA0700000000
+
+ E7A30F0436DE2CF900000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2936DE2CF900000000
+
+ E7A30F042395015100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E292395015100000000
+
+ E7A30F0484A59C1D00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2984A59C1D00000000
+
+ FAF5FAC90000000000000000
+
+ isa
+ PBXCopyFilesBuildPhase
+ files
+
+ E7A30F04FF334B1F00000000
+ E7A30F04DB6520C800000000
+ E7A30F04D65BA68200000000
+ E7A30F04119CDA0700000000
+ E7A30F0436DE2CF900000000
+ E7A30F042395015100000000
+ E7A30F0484A59C1D00000000
+
+ name
+ Fake Swift Dependencies (Copy Files Phase)
+ runOnlyForDeploymentPostprocessing
+ 1
+ dstSubfolderSpec
+ 16
+ dstPath
+
+
+ 4952437303EDA63300000000
+
+ isa
+ XCBuildConfiguration
+ name
+ Debug
+ buildSettings
+
+
+ baseConfigurationReference
+ 1DD70E299315E66800000000
+
+ 4952437350C7218900000000
+
+ isa
+ XCBuildConfiguration
+ name
+ Profile
+ buildSettings
+
+
+ baseConfigurationReference
+ 1DD70E290A5883D200000000
+
+ 49524373A439BFE700000000
+
+ isa
+ XCBuildConfiguration
+ name
+ Release
+ buildSettings
+
+
+ baseConfigurationReference
+ 1DD70E297DEF2F3400000000
+
+ 218C37090000000000000000
+
+ isa
+ XCConfigurationList
+ buildConfigurations
+
+ 4952437303EDA63300000000
+ 4952437350C7218900000000
+ 49524373A439BFE700000000
+
+ defaultConfigurationIsVisible
+
+
+ E66DC04EB84A82AD00000000
+
+ isa
+ PBXNativeTarget
+ name
+ SegmentedControlNode
+ productName
+ SegmentedControlNode
+ productReference
+ 1DD70E2957B5522500000000
+ productType
+ com.apple.product-type.library.static
+ dependencies
+
+
+ buildPhases
+
+ 1870857F0000000000000000
+ FAF5FAC90000000000000000
+
+ buildConfigurationList
+ 218C37090000000000000000
+
+ 4952437303EDA63300000001
+
+ isa
+ XCBuildConfiguration
+ name
+ Debug
+ buildSettings
+
+
+
+ 4952437350C7218900000001
+
+ isa
+ XCBuildConfiguration
+ name
+ Profile
+ buildSettings
+
+
+
+ 49524373A439BFE700000001
+
+ isa
+ XCBuildConfiguration
+ name
+ Release
+ buildSettings
+
+
+
+ 218C37090000000000000001
+
+ isa
+ XCConfigurationList
+ buildConfigurations
+
+ 4952437303EDA63300000001
+ 4952437350C7218900000001
+ 49524373A439BFE700000001
+
+ defaultConfigurationIsVisible
+
+
+ 96C84793B84A82AD00000000
+
+ isa
+ PBXProject
+ mainGroup
+ B401C979EFB6AC4600000000
+ targets
+
+ E66DC04EB84A82AD00000000
+
+ buildConfigurationList
+ 218C37090000000000000001
+ compatibilityVersion
+ Xcode 3.2
+ attributes
+
+ LastUpgradeCheck
+ 9999
+
+
+
+ rootObject
+ 96C84793B84A82AD00000000
+
+
\ No newline at end of file
diff --git a/submodules/SegmentedControlNode/SegmentedControlNode.xcodeproj/xcshareddata/xcschemes/SegmentedControlNode.xcscheme b/submodules/SegmentedControlNode/SegmentedControlNode.xcodeproj/xcshareddata/xcschemes/SegmentedControlNode.xcscheme
new file mode 100644
index 0000000000..297d534bb6
--- /dev/null
+++ b/submodules/SegmentedControlNode/SegmentedControlNode.xcodeproj/xcshareddata/xcschemes/SegmentedControlNode.xcscheme
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.pbxproj b/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..d4d9d0812c
--- /dev/null
+++ b/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,563 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 09CE5B9023225AC200743FF4 /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09CE5B8F23225AC200743FF4 /* TelegramPresentationData.framework */; };
+ D060188A22F3604000796784 /* SegmentedControlNode.h in Headers */ = {isa = PBXBuildFile; fileRef = D060188822F3604000796784 /* SegmentedControlNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D060189522F3615800796784 /* SegmentedControlNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D060189422F3615800796784 /* SegmentedControlNode.swift */; };
+ D060189822F3616300796784 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D060189722F3616300796784 /* Foundation.framework */; };
+ D060189A22F3616600796784 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D060189922F3616600796784 /* UIKit.framework */; };
+ D060189C22F3616A00796784 /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D060189B22F3616A00796784 /* AsyncDisplayKit.framework */; };
+ D060189E22F3616E00796784 /* LegacyComponents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D060189D22F3616E00796784 /* LegacyComponents.framework */; };
+ D0A0B53922F370DF00628AF3 /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0A0B53822F370DF00628AF3 /* Display.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 09CE5B8F23225AC200743FF4 /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D060188522F3604000796784 /* SegmentedControlNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SegmentedControlNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D060188822F3604000796784 /* SegmentedControlNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SegmentedControlNode.h; sourceTree = ""; };
+ D060188922F3604000796784 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D060189422F3615800796784 /* SegmentedControlNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SegmentedControlNode.swift; sourceTree = ""; };
+ D060189722F3616300796784 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D060189922F3616600796784 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ D060189B22F3616A00796784 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D060189D22F3616E00796784 /* LegacyComponents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LegacyComponents.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D0A0B53822F370DF00628AF3 /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D060188222F3604000796784 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 09CE5B9023225AC200743FF4 /* TelegramPresentationData.framework in Frameworks */,
+ D0A0B53922F370DF00628AF3 /* Display.framework in Frameworks */,
+ D060189E22F3616E00796784 /* LegacyComponents.framework in Frameworks */,
+ D060189C22F3616A00796784 /* AsyncDisplayKit.framework in Frameworks */,
+ D060189A22F3616600796784 /* UIKit.framework in Frameworks */,
+ D060189822F3616300796784 /* Foundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D060187B22F3604000796784 = {
+ isa = PBXGroup;
+ children = (
+ D060188922F3604000796784 /* Info.plist */,
+ D060188722F3604000796784 /* Sources */,
+ D060188622F3604000796784 /* Products */,
+ D060189622F3616300796784 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D060188622F3604000796784 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D060188522F3604000796784 /* SegmentedControlNode.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D060188722F3604000796784 /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D060189422F3615800796784 /* SegmentedControlNode.swift */,
+ D060188822F3604000796784 /* SegmentedControlNode.h */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D060189622F3616300796784 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 09CE5B8F23225AC200743FF4 /* TelegramPresentationData.framework */,
+ D0A0B53822F370DF00628AF3 /* Display.framework */,
+ D060189D22F3616E00796784 /* LegacyComponents.framework */,
+ D060189B22F3616A00796784 /* AsyncDisplayKit.framework */,
+ D060189922F3616600796784 /* UIKit.framework */,
+ D060189722F3616300796784 /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D060188022F3604000796784 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D060188A22F3604000796784 /* SegmentedControlNode.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D060188422F3604000796784 /* SegmentedControlNode */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D060188D22F3604000796784 /* Build configuration list for PBXNativeTarget "SegmentedControlNode" */;
+ buildPhases = (
+ D060188022F3604000796784 /* Headers */,
+ D060188122F3604000796784 /* Sources */,
+ D060188222F3604000796784 /* Frameworks */,
+ D060188322F3604000796784 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SegmentedControlNode;
+ productName = SegmentedControlNode;
+ productReference = D060188522F3604000796784 /* SegmentedControlNode.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D060187C22F3604000796784 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1010;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D060188422F3604000796784 = {
+ CreatedOnToolsVersion = 10.1;
+ LastSwiftMigration = 1010;
+ };
+ };
+ };
+ buildConfigurationList = D060187F22F3604000796784 /* Build configuration list for PBXProject "SegmentedControlNode_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D060187B22F3604000796784;
+ productRefGroup = D060188622F3604000796784 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D060188422F3604000796784 /* SegmentedControlNode */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D060188322F3604000796784 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D060188122F3604000796784 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D060189522F3615800796784 /* SegmentedControlNode.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D060188B22F3604000796784 /* DebugAppStoreLLC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = DebugAppStoreLLC;
+ };
+ D060188C22F3604000796784 /* ReleaseAppStoreLLC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D060188E22F3604000796784 /* DebugAppStoreLLC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Manual;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.SegmentedControlNode;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = DebugAppStoreLLC;
+ };
+ D060188F22F3604000796784 /* ReleaseAppStoreLLC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Manual;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.SegmentedControlNode;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D060189022F360BF00796784 /* DebugHockeyapp */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = DebugHockeyapp;
+ };
+ D060189122F360BF00796784 /* DebugHockeyapp */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Manual;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.SegmentedControlNode;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = DebugHockeyapp;
+ };
+ D060189222F360CA00796784 /* ReleaseHockeyappInternal */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = ReleaseHockeyappInternal;
+ };
+ D060189322F360CA00796784 /* ReleaseHockeyappInternal */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Manual;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.SegmentedControlNode;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseHockeyappInternal;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ D060187F22F3604000796784 /* Build configuration list for PBXProject "SegmentedControlNode_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D060188B22F3604000796784 /* DebugAppStoreLLC */,
+ D060189022F360BF00796784 /* DebugHockeyapp */,
+ D060188C22F3604000796784 /* ReleaseAppStoreLLC */,
+ D060189222F360CA00796784 /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D060188D22F3604000796784 /* Build configuration list for PBXNativeTarget "SegmentedControlNode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D060188E22F3604000796784 /* DebugAppStoreLLC */,
+ D060189122F360BF00796784 /* DebugHockeyapp */,
+ D060188F22F3604000796784 /* ReleaseAppStoreLLC */,
+ D060189322F360CA00796784 /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D060187C22F3604000796784 /* Project object */;
+}
diff --git a/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000..919434a625
--- /dev/null
+++ b/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000..18d981003d
--- /dev/null
+++ b/submodules/SegmentedControlNode/SegmentedControlNode_Xcode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/submodules/SegmentedControlNode/Sources/SegmentedControlNode.h b/submodules/SegmentedControlNode/Sources/SegmentedControlNode.h
new file mode 100644
index 0000000000..a0347abfa0
--- /dev/null
+++ b/submodules/SegmentedControlNode/Sources/SegmentedControlNode.h
@@ -0,0 +1,11 @@
+#import
+
+//! Project version number for SegmentedControlNode.
+FOUNDATION_EXPORT double SegmentedControlNodeVersionNumber;
+
+//! Project version string for SegmentedControlNode.
+FOUNDATION_EXPORT const unsigned char SegmentedControlNodeVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/SegmentedControlNode/Sources/SegmentedControlNode.swift b/submodules/SegmentedControlNode/Sources/SegmentedControlNode.swift
new file mode 100644
index 0000000000..29e33f9d36
--- /dev/null
+++ b/submodules/SegmentedControlNode/Sources/SegmentedControlNode.swift
@@ -0,0 +1,381 @@
+import Foundation
+import Display
+import UIKit
+import AsyncDisplayKit
+import TelegramPresentationData
+
+private let textFont = Font.regular(13.0)
+private let selectedTextFont = Font.bold(13.0)
+
+public enum SegmentedControlLayout {
+ case stretchToFill(width: CGFloat)
+ case sizeToFit(maximumWidth: CGFloat, minimumWidth: CGFloat)
+}
+
+public final class SegmentedControlTheme: Equatable {
+ public let backgroundColor: UIColor
+ public let foregroundColor: UIColor
+ public let shadowColor: UIColor
+ public let textColor: UIColor
+ public let dividerColor: UIColor
+
+ public init(backgroundColor: UIColor, foregroundColor: UIColor, shadowColor: UIColor, textColor: UIColor, dividerColor: UIColor) {
+ self.backgroundColor = backgroundColor
+ self.foregroundColor = foregroundColor
+ self.shadowColor = shadowColor
+ self.textColor = textColor
+ self.dividerColor = dividerColor
+ }
+
+ public static func ==(lhs: SegmentedControlTheme, rhs: SegmentedControlTheme) -> Bool {
+ if lhs.backgroundColor != rhs.backgroundColor {
+ return false
+ }
+ if lhs.foregroundColor != rhs.foregroundColor {
+ return false
+ }
+ if lhs.shadowColor != rhs.shadowColor {
+ return false
+ }
+ if lhs.textColor != rhs.textColor {
+ return false
+ }
+ if lhs.dividerColor != rhs.dividerColor {
+ return false
+ }
+ return true
+ }
+}
+
+public extension SegmentedControlTheme {
+ convenience init(theme: PresentationTheme) {
+ self.init(backgroundColor: theme.rootController.navigationSearchBar.inputFillColor, foregroundColor: theme.rootController.navigationBar.backgroundColor, shadowColor: .black, textColor: theme.rootController.navigationBar.primaryTextColor, dividerColor: theme.list.freeInputField.strokeColor)
+ }
+}
+
+private func generateSelectionImage(theme: SegmentedControlTheme) -> UIImage? {
+ return generateImage(CGSize(width: 20.0, height: 20.0), rotatedContext: { size, context in
+ let bounds = CGRect(origin: CGPoint(), size: size)
+ context.clear(bounds)
+
+ if theme.shadowColor != .clear {
+ context.setShadow(offset: CGSize(width: 0.0, height: -3.0), blur: 6.0, color: theme.shadowColor.withAlphaComponent(0.12).cgColor)
+ }
+ context.setFillColor(theme.foregroundColor.cgColor)
+ context.fillEllipse(in: CGRect(x: 2.0, y: 2.0, width: 16.0, height: 16.0))
+ })?.stretchableImage(withLeftCapWidth: 10, topCapHeight: 10)
+}
+
+public struct SegmentedControlItem: Equatable {
+ public let title: String
+
+ public init(title: String) {
+ self.title = title
+ }
+}
+
+public final class SegmentedControlNode: ASDisplayNode, UIGestureRecognizerDelegate {
+ private var theme: SegmentedControlTheme
+ private var _items: [SegmentedControlItem]
+ private var _selectedIndex: Int = 0
+
+ private var validLayout: SegmentedControlLayout?
+
+ private let selectionNode: ASImageNode
+ private var itemNodes: [HighlightTrackingButtonNode]
+ private var dividerNodes: [ASDisplayNode]
+
+ private var gestureRecognizer: UIPanGestureRecognizer?
+ private var gestureSelectedIndex: Int?
+
+ public var items: [SegmentedControlItem] {
+ get {
+ return self._items
+ }
+ set {
+ let previousItems = self._items
+ self._items = newValue
+ guard previousItems != newValue else {
+ return
+ }
+
+ self.itemNodes.forEach { $0.removeFromSupernode() }
+ self.itemNodes = self._items.map { item in
+ let itemNode = HighlightTrackingButtonNode()
+ itemNode.setTitle(item.title, with: textFont, with: self.theme.textColor, for: .normal)
+ itemNode.setTitle(item.title, with: selectedTextFont, with: self.theme.textColor, for: .selected)
+ itemNode.setTitle(item.title, with: selectedTextFont, with: self.theme.textColor, for: [.selected, .highlighted])
+ return itemNode
+ }
+ self.setupButtons()
+ self.itemNodes.forEach(self.addSubnode(_:))
+
+ let dividersCount = self._items.count > 2 ? self._items.count - 1 : 0
+ if self.dividerNodes.count != dividersCount {
+ self.dividerNodes.forEach { $0.removeFromSupernode() }
+ self.dividerNodes = (0 ..< dividersCount).map { _ in ASDisplayNode() }
+ }
+
+ if let layout = self.validLayout {
+ let _ = self.updateLayout(layout, transition: .immediate)
+ }
+ }
+ }
+
+ public var selectedIndex: Int {
+ get {
+ return self._selectedIndex
+ }
+ set {
+ guard newValue != self._selectedIndex else {
+ return
+ }
+ self._selectedIndex = newValue
+ if let layout = self.validLayout {
+ let _ = self.updateLayout(layout, transition: .immediate)
+ }
+ }
+ }
+
+ public var selectedIndexChanged: (Int) -> Void = { _ in }
+
+ public init(theme: SegmentedControlTheme, items: [SegmentedControlItem], selectedIndex: Int) {
+ self.theme = theme
+ self._items = items
+ self._selectedIndex = selectedIndex
+
+ self.selectionNode = ASImageNode()
+ self.selectionNode.displaysAsynchronously = false
+ self.selectionNode.displayWithoutProcessing = true
+
+ self.itemNodes = items.map { item in
+ let itemNode = HighlightTrackingButtonNode()
+ itemNode.setTitle(item.title, with: textFont, with: theme.textColor, for: .normal)
+ itemNode.setTitle(item.title, with: selectedTextFont, with: theme.textColor, for: .selected)
+ itemNode.setTitle(item.title, with: selectedTextFont, with: theme.textColor, for: [.selected, .highlighted])
+ return itemNode
+ }
+
+ let dividersCount = items.count > 2 ? items.count - 1 : 0
+ self.dividerNodes = (0 ..< dividersCount).map { _ in
+ let node = ASDisplayNode()
+ node.backgroundColor = theme.dividerColor
+ return node
+ }
+
+ super.init()
+
+ self.clipsToBounds = true
+ self.cornerRadius = 9.0
+
+ self.addSubnode(self.selectionNode)
+ self.itemNodes.forEach(self.addSubnode(_:))
+ self.setupButtons()
+ self.dividerNodes.forEach(self.addSubnode(_:))
+
+ self.backgroundColor = self.theme.backgroundColor
+ self.selectionNode.image = generateSelectionImage(theme: self.theme)
+ }
+
+ override public func didLoad() {
+ super.didLoad()
+
+ self.view.disablesInteractiveTransitionGestureRecognizer = true
+
+ let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:)))
+ gestureRecognizer.delegate = self
+ self.view.addGestureRecognizer(gestureRecognizer)
+ self.gestureRecognizer = gestureRecognizer
+ }
+
+ private func setupButtons() {
+ for i in 0 ..< self.itemNodes.count {
+ let itemNode = self.itemNodes[i]
+ itemNode.addTarget(self, action: #selector(self.buttonPressed(_:)), forControlEvents: .touchUpInside)
+ itemNode.highligthedChanged = { [weak self, weak itemNode] highlighted in
+ if let strongSelf = self, let itemNode = itemNode {
+ let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut)
+ if strongSelf.selectedIndex == i {
+ if let gestureRecognizer = strongSelf.gestureRecognizer, case .began = gestureRecognizer.state {
+ } else {
+ strongSelf.updateButtonsHighlights(highlightedIndex: highlighted ? i : nil, gestureSelectedIndex: strongSelf.gestureSelectedIndex)
+ }
+ } else if highlighted {
+ transition.updateAlpha(node: itemNode, alpha: 0.4)
+ }
+ if !highlighted {
+ transition.updateAlpha(node: itemNode, alpha: 1.0)
+ }
+ }
+ }
+ }
+ }
+
+ private func updateButtonsHighlights(highlightedIndex: Int?, gestureSelectedIndex: Int?) {
+ let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut)
+ if highlightedIndex == nil && gestureSelectedIndex == nil {
+ transition.updateTransformScale(node: self.selectionNode, scale: 1.0)
+ } else {
+ transition.updateTransformScale(node: self.selectionNode, scale: 0.92)
+ }
+ for i in 0 ..< self.itemNodes.count {
+ let itemNode = self.itemNodes[i]
+ if i == highlightedIndex || i == gestureSelectedIndex {
+ transition.updateTransformScale(node: itemNode, scale: 0.92)
+ } else {
+ transition.updateTransformScale(node: itemNode, scale: 1.0)
+ }
+ }
+ }
+
+ private func updateButtonsHighlights() {
+ let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut)
+ if let gestureSelectedIndex = self.gestureSelectedIndex {
+ for i in 0 ..< self.itemNodes.count {
+ let itemNode = self.itemNodes[i]
+ transition.updateTransformScale(node: itemNode, scale: i == gestureSelectedIndex ? 0.92 : 1.0)
+ }
+ } else {
+ for itemNode in self.itemNodes {
+ transition.updateTransformScale(node: itemNode, scale: 1.0)
+ }
+ }
+ }
+
+ public func updateTheme(_ theme: SegmentedControlTheme) {
+ guard theme != self.theme else {
+ return
+ }
+ self.theme = theme
+
+ self.backgroundColor = self.theme.backgroundColor
+ self.selectionNode.image = generateSelectionImage(theme: self.theme)
+
+ for itemNode in self.itemNodes {
+ if let title = itemNode.attributedTitle(for: .normal)?.string {
+ itemNode.setTitle(title, with: textFont, with: self.theme.textColor, for: .normal)
+ itemNode.setTitle(title, with: selectedTextFont, with: self.theme.textColor, for: .selected)
+ itemNode.setTitle(title, with: selectedTextFont, with: self.theme.textColor, for: [.selected, .highlighted])
+ }
+ }
+
+ for dividerNode in self.dividerNodes {
+ dividerNode.backgroundColor = theme.dividerColor
+ }
+ }
+
+ public func updateLayout(_ layout: SegmentedControlLayout, transition: ContainedViewLayoutTransition) -> CGSize {
+ self.validLayout = layout
+
+ let calculatedWidth: CGFloat = 0.0
+
+ let width: CGFloat
+ switch layout {
+ case let .stretchToFill(targetWidth):
+ width = targetWidth
+ case let .sizeToFit(maximumWidth, minimumWidth):
+ width = max(minimumWidth, min(maximumWidth, calculatedWidth))
+ }
+
+ let size = CGSize(width: width, height: 32.0)
+ if !self.itemNodes.isEmpty {
+ let itemSize = CGSize(width: floorToScreenPixels(size.width / CGFloat(self.itemNodes.count)), height: size.height)
+
+ let selectedIndex: Int
+ if let gestureSelectedIndex = self.gestureSelectedIndex {
+ selectedIndex = gestureSelectedIndex
+ } else {
+ selectedIndex = self.selectedIndex
+ }
+
+ transition.updateBounds(node: self.selectionNode, bounds: CGRect(origin: CGPoint(), size: itemSize))
+ transition.updatePosition(node: self.selectionNode, position: CGPoint(x: itemSize.width / 2.0 + itemSize.width * CGFloat(selectedIndex), y: size.height / 2.0))
+
+ for i in 0 ..< self.itemNodes.count {
+ let itemNode = self.itemNodes[i]
+ transition.updateFrame(node: itemNode, frame: CGRect(origin: CGPoint(x: itemSize.width * CGFloat(i), y: (size.height - itemSize.height) / 2.0), size: itemSize))
+
+ let isSelected = selectedIndex == i
+ if itemNode.isSelected != isSelected {
+ if case .animated = transition {
+ UIView.transition(with: itemNode.view, duration: 0.2, options: .transitionCrossDissolve, animations: {
+ itemNode.isSelected = isSelected
+ }, completion: nil)
+ } else {
+ itemNode.isSelected = isSelected
+ }
+ }
+ }
+ }
+
+ if !self.dividerNodes.isEmpty {
+ let dividerSize = CGSize(width: 1.0, height: 16.0)
+ let delta: CGFloat = size.width / CGFloat(self.dividerNodes.count + 1)
+ for i in 0 ..< self.dividerNodes.count {
+ let dividerNode = self.dividerNodes[i]
+ transition.updateFrame(node: dividerNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels(delta * CGFloat(i + 1) - dividerSize.width / 2.0), y: (size.height - dividerSize.height) / 2.0), size: dividerSize))
+
+ let dividerAlpha: CGFloat
+ if (self.selectedIndex - 1 ... self.selectedIndex).contains(i) {
+ dividerAlpha = 0.0
+ } else {
+ dividerAlpha = 1.0
+ }
+ transition.updateAlpha(node: dividerNode, alpha: dividerAlpha)
+ }
+ }
+
+ return size
+ }
+
+ @objc private func buttonPressed(_ button: HighlightTrackingButtonNode) {
+ guard let index = self.itemNodes.firstIndex(of: button) else {
+ return
+ }
+
+ self._selectedIndex = index
+ self.selectedIndexChanged(index)
+ if let layout = self.validLayout {
+ let _ = self.updateLayout(layout, transition: .animated(duration: 0.2, curve: .slide))
+ }
+ }
+
+ public override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
+ let location = gestureRecognizer.location(in: self.view)
+ return self.selectionNode.frame.contains(location)
+ }
+
+ @objc private func panGesture(_ recognizer: UIPanGestureRecognizer) {
+ let location = recognizer.location(in: self.view)
+ switch recognizer.state {
+ case .changed:
+ if !self.selectionNode.frame.contains(location) {
+ let point = CGPoint(x: max(0.0, min(self.bounds.width, location.x)), y: 1.0)
+ for i in 0 ..< self.itemNodes.count {
+ let itemNode = self.itemNodes[i]
+ if itemNode.frame.contains(point) {
+ if i != self.gestureSelectedIndex {
+ self.gestureSelectedIndex = i
+ self.updateButtonsHighlights(highlightedIndex: nil, gestureSelectedIndex: i)
+ if let layout = self.validLayout {
+ let _ = self.updateLayout(layout, transition: .animated(duration: 0.35, curve: .slide))
+ }
+ }
+ break
+ }
+ }
+ }
+ case .ended:
+ if let gestureSelectedIndex = self.gestureSelectedIndex {
+ if gestureSelectedIndex != self.selectedIndex {
+ self._selectedIndex = gestureSelectedIndex
+ self.selectedIndexChanged(self._selectedIndex)
+ }
+ self.gestureSelectedIndex = nil
+ self.updateButtonsHighlights(highlightedIndex: nil, gestureSelectedIndex: nil)
+ }
+ default:
+ break
+ }
+ }
+}
diff --git a/submodules/SettingsUI/BUCK b/submodules/SettingsUI/BUCK
index 793d024e10..385f179e24 100644
--- a/submodules/SettingsUI/BUCK
+++ b/submodules/SettingsUI/BUCK
@@ -75,6 +75,7 @@ static_library(
"//submodules/GridMessageSelectionNode:GridMessageSelectionNode",
"//submodules/InstantPageCache:InstantPageCache",
"//submodules/AppBundle:AppBundle",
+ "//submodules/ContextUI:ContextUI",
],
frameworks = [
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
diff --git a/submodules/SettingsUI/SettingsUI.xcodeproj/project.pbxproj b/submodules/SettingsUI/SettingsUI.xcodeproj/project.pbxproj
index b4f5706330..940822a87b 100644
--- a/submodules/SettingsUI/SettingsUI.xcodeproj/project.pbxproj
+++ b/submodules/SettingsUI/SettingsUI.xcodeproj/project.pbxproj
@@ -286,6 +286,19 @@
explicitFileType
archive.ar
+ 1DD70E296C9831F100000000
+
+ isa
+ PBXFileReference
+ name
+ libContextUI.a
+ path
+ libContextUI.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E2915F6A49D00000000
isa
@@ -1001,6 +1014,19 @@
explicitFileType
archive.ar
+ 1DD70E29AD66967300000000
+
+ isa
+ PBXFileReference
+ name
+ libReactionSelectionNode.a
+ path
+ libReactionSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E291D58331200000000
isa
@@ -1053,6 +1079,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29097DBE9200000000
isa
@@ -1339,6 +1378,19 @@
explicitFileType
archive.ar
+ 1DD70E29F40A586F00000000
+
+ isa
+ PBXFileReference
+ name
+ libTextSelectionNode.a
+ path
+ libTextSelectionNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29B4B05B7A00000000
isa
@@ -1482,6 +1534,7 @@
1DD70E2997B4D6D800000000
1DD70E292F91702000000000
1DD70E2931752C6000000000
+ 1DD70E296C9831F100000000
1DD70E2915F6A49D00000000
1DD70E29016F454200000000
1DD70E2979E58A0000000000
@@ -1537,10 +1590,12 @@
1DD70E29CBE117ED00000000
1DD70E29AA32BBC600000000
1DD70E293E4DE92B00000000
+ 1DD70E29AD66967300000000
1DD70E291D58331200000000
1DD70E29CF967D4300000000
1DD70E29EA9CBB5B00000000
1DD70E291328E99400000000
+ 1DD70E2957B5522500000000
1DD70E29097DBE9200000000
1DD70E2981AE180900000000
1DD70E29524F478E00000000
@@ -1563,6 +1618,7 @@
1DD70E29F18DE1D900000000
1DD70E29BA06E3A600000000
1DD70E29F0C15F9C00000000
+ 1DD70E29F40A586F00000000
1DD70E29B4B05B7A00000000
1DD70E29CD296A8300000000
1DD70E29AE67341000000000
@@ -4117,6 +4173,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -4222,6 +4285,27 @@
fileRef
1DD70E29B6F47D1F00000000
+ E7A30F04AD66967300000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29AD66967300000000
+
+ E7A30F04F40A586F00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29F40A586F00000000
+
+ E7A30F046C9831F100000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E296C9831F100000000
+
E7A30F04D233F68C00000000
isa
@@ -4243,6 +4327,13 @@
fileRef
1DD70E2931752C6000000000
+ E7A30F04BBAF750C00000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E29BBAF750C00000000
+
E7A30F041328E99400000000
isa
@@ -4327,13 +4418,6 @@
fileRef
1DD70E29E220F5E800000000
- E7A30F04BBAF750C00000000
-
- isa
- PBXBuildFile
- fileRef
- 1DD70E29BBAF750C00000000
-
E7A30F04247D9AC100000000
isa
@@ -4703,6 +4787,7 @@
E7A30F0497B4D6D800000000
E7A30F04C37F741500000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F042417E0B200000000
@@ -4718,9 +4803,13 @@
E7A30F0471ED41B100000000
E7A30F047AB043C800000000
E7A30F04B6F47D1F00000000
+ E7A30F04AD66967300000000
+ E7A30F04F40A586F00000000
+ E7A30F046C9831F100000000
E7A30F04D233F68C00000000
E7A30F049A24C4DE00000000
E7A30F0431752C6000000000
+ E7A30F04BBAF750C00000000
E7A30F041328E99400000000
E7A30F041E16CC6C00000000
E7A30F043E4DE92B00000000
@@ -4733,7 +4822,6 @@
E7A30F042F91702000000000
E7A30F04CED1620500000000
E7A30F04E220F5E800000000
- E7A30F04BBAF750C00000000
E7A30F04247D9AC100000000
E7A30F04B4B05B7A00000000
E7A30F04490601EB00000000
diff --git a/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj
index 408af44cce..e9d0d16635 100644
--- a/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj
@@ -9,6 +9,7 @@
/* Begin PBXBuildFile section */
091EABA5231DAC7500A0EC14 /* ThemeNameGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091EABA4231DAC7500A0EC14 /* ThemeNameGenerator.swift */; };
09B4A9B823102B7A005C2E08 /* EditThemeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B723102B7A005C2E08 /* EditThemeController.swift */; };
+ 09CE5B8E2322154400743FF4 /* SegmentedControlNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09CE5B8D2322154400743FF4 /* SegmentedControlNode.framework */; };
D03E465223075D930049C28B /* SettingsUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E465023075D930049C28B /* SettingsUI.h */; settings = {ATTRIBUTES = (Public, ); }; };
D03E466823075E660049C28B /* TabBarAccountSwitchControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465C23075E630049C28B /* TabBarAccountSwitchControllerNode.swift */; };
D03E466923075E660049C28B /* LogoutOptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465D23075E630049C28B /* LogoutOptionsController.swift */; };
@@ -194,6 +195,7 @@
/* Begin PBXFileReference section */
091EABA4231DAC7500A0EC14 /* ThemeNameGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeNameGenerator.swift; sourceTree = ""; };
09B4A9B723102B7A005C2E08 /* EditThemeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditThemeController.swift; sourceTree = ""; };
+ 09CE5B8D2322154400743FF4 /* SegmentedControlNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SegmentedControlNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D03E464D23075D930049C28B /* SettingsUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SettingsUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D03E465023075D930049C28B /* SettingsUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsUI.h; sourceTree = ""; };
D03E465123075D930049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
@@ -384,6 +386,7 @@
buildActionMask = 2147483647;
files = (
D0EFF26A2319825B00CF5164 /* AppBundle.framework in Frameworks */,
+ 09CE5B8E2322154400743FF4 /* SegmentedControlNode.framework in Frameworks */,
D03E493A2308678D0049C28B /* InstantPageCache.framework in Frameworks */,
D03E490E2308661A0049C28B /* GridMessageSelectionNode.framework in Frameworks */,
D03E48E22308649C0049C28B /* CounterContollerTitleView.framework in Frameworks */,
@@ -688,6 +691,7 @@
isa = PBXGroup;
children = (
D0EFF2692319825B00CF5164 /* AppBundle.framework */,
+ 09CE5B8D2322154400743FF4 /* SegmentedControlNode.framework */,
D03E49392308678D0049C28B /* InstantPageCache.framework */,
D03E490D2308661A0049C28B /* GridMessageSelectionNode.framework */,
D03E48E12308649C0049C28B /* CounterContollerTitleView.framework */,
diff --git a/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj.orig b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj.orig
new file mode 100644
index 0000000000..703a1d8b2f
--- /dev/null
+++ b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj.orig
@@ -0,0 +1,1357 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 091EABA5231DAC7500A0EC14 /* ThemeNameGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091EABA4231DAC7500A0EC14 /* ThemeNameGenerator.swift */; };
+ 09B4A9B823102B7A005C2E08 /* EditThemeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B723102B7A005C2E08 /* EditThemeController.swift */; };
+ 09CE5B8E2322154400743FF4 /* SegmentedControlNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09CE5B8D2322154400743FF4 /* SegmentedControlNode.framework */; };
+ D03E465223075D930049C28B /* SettingsUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E465023075D930049C28B /* SettingsUI.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D03E466823075E660049C28B /* TabBarAccountSwitchControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465C23075E630049C28B /* TabBarAccountSwitchControllerNode.swift */; };
+ D03E466923075E660049C28B /* LogoutOptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465D23075E630049C28B /* LogoutOptionsController.swift */; };
+ D03E466A23075E660049C28B /* DebugController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465E23075E640049C28B /* DebugController.swift */; };
+ D03E466B23075E660049C28B /* ChangePhoneNumberControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465F23075E640049C28B /* ChangePhoneNumberControllerNode.swift */; };
+ D03E466C23075E660049C28B /* ChangePhoneNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E466023075E640049C28B /* ChangePhoneNumberController.swift */; };
+ D03E466D23075E660049C28B /* EditSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E466123075E640049C28B /* EditSettingsController.swift */; };
+ D03E466E23075E660049C28B /* TabBarAccountSwitchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E466223075E640049C28B /* TabBarAccountSwitchController.swift */; };
+ D03E466F23075E660049C28B /* UsernameSetupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E466323075E650049C28B /* UsernameSetupController.swift */; };
+ D03E467023075E660049C28B /* DebugAccountsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E466423075E650049C28B /* DebugAccountsController.swift */; };
+ D03E467123075E660049C28B /* SettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E466523075E650049C28B /* SettingsController.swift */; };
+ D03E467223075E660049C28B /* ChangePhoneNumberCodeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E466623075E660049C28B /* ChangePhoneNumberCodeController.swift */; };
+ D03E467323075E660049C28B /* ChangePhoneNumberIntroController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E466723075E660049C28B /* ChangePhoneNumberIntroController.swift */; };
+ D03E467923075EC70049C28B /* NotificationsAndSounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E467723075EC60049C28B /* NotificationsAndSounds.swift */; };
+ D03E467A23075EC70049C28B /* NotificationSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E467823075EC70049C28B /* NotificationSearchItem.swift */; };
+ D03E467F23075EE90049C28B /* NotificationExceptionSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E467C23075EE90049C28B /* NotificationExceptionSettingsController.swift */; };
+ D03E468023075EE90049C28B /* NotificationExceptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E467D23075EE90049C28B /* NotificationExceptions.swift */; };
+ D03E468123075EE90049C28B /* NotificationExceptionControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E467E23075EE90049C28B /* NotificationExceptionControllerNode.swift */; };
+ D03E468A23075F010049C28B /* SettingsSearchRecentQueries.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468523075EFF0049C28B /* SettingsSearchRecentQueries.swift */; };
+ D03E468B23075F010049C28B /* SettingsSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468623075F000049C28B /* SettingsSearchItem.swift */; };
+ D03E468C23075F010049C28B /* SettingsSearchableItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468723075F000049C28B /* SettingsSearchableItems.swift */; };
+ D03E468D23075F010049C28B /* SettingsSearchResultItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468823075F000049C28B /* SettingsSearchResultItem.swift */; };
+ D03E468E23075F010049C28B /* SettingsSearchRecentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468923075F000049C28B /* SettingsSearchRecentItem.swift */; };
+ D03E469D23075F2C0049C28B /* SelectivePrivacySettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468F23075F290049C28B /* SelectivePrivacySettingsController.swift */; };
+ D03E469E23075F2C0049C28B /* ConfirmPhoneNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469023075F2A0049C28B /* ConfirmPhoneNumberController.swift */; };
+ D03E469F23075F2C0049C28B /* TwoStepVerificationResetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469123075F2A0049C28B /* TwoStepVerificationResetController.swift */; };
+ D03E46A023075F2C0049C28B /* PrivacyIntroControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469223075F2A0049C28B /* PrivacyIntroControllerNode.swift */; };
+ D03E46A123075F2C0049C28B /* PasscodeOptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469323075F2A0049C28B /* PasscodeOptionsController.swift */; };
+ D03E46A223075F2C0049C28B /* PrivacyAndSecurityController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469423075F2A0049C28B /* PrivacyAndSecurityController.swift */; };
+ D03E46A323075F2C0049C28B /* CreatePasswordController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469523075F2A0049C28B /* CreatePasswordController.swift */; };
+ D03E46A423075F2C0049C28B /* ForwardPrivacyChatPreviewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469623075F2A0049C28B /* ForwardPrivacyChatPreviewItem.swift */; };
+ D03E46A523075F2C0049C28B /* PrivacyIntroController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469723075F2B0049C28B /* PrivacyIntroController.swift */; };
+ D03E46A623075F2C0049C28B /* TwoStepVerificationPasswordEntryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469823075F2B0049C28B /* TwoStepVerificationPasswordEntryController.swift */; };
+ D03E46A723075F2C0049C28B /* SelectivePrivacySettingsPeersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469923075F2B0049C28B /* SelectivePrivacySettingsPeersController.swift */; };
+ D03E46A823075F2C0049C28B /* TwoStepVerificationUnlockController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469A23075F2B0049C28B /* TwoStepVerificationUnlockController.swift */; };
+ D03E46A923075F2C0049C28B /* BlockedPeersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469B23075F2B0049C28B /* BlockedPeersController.swift */; };
+ D03E46AA23075F2C0049C28B /* DataPrivacySettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E469C23075F2C0049C28B /* DataPrivacySettingsController.swift */; };
+ D03E46B023075F4E0049C28B /* ItemListRecentSessionItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46AC23075F4E0049C28B /* ItemListRecentSessionItem.swift */; };
+ D03E46B123075F4E0049C28B /* ItemListWebsiteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46AD23075F4E0049C28B /* ItemListWebsiteItem.swift */; };
+ D03E46B223075F4E0049C28B /* RecentSessionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46AE23075F4E0049C28B /* RecentSessionsController.swift */; };
+ D03E46B323075F4E0049C28B /* RecentSessionsEmptyStateItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46AF23075F4E0049C28B /* RecentSessionsEmptyStateItem.swift */; };
+ D03E46C523075F810049C28B /* DataAndStorageSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46B523075F7F0049C28B /* DataAndStorageSettingsController.swift */; };
+ D03E46C623075F810049C28B /* SaveIncomingMediaController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46B623075F7F0049C28B /* SaveIncomingMediaController.swift */; };
+ D03E46C723075F810049C28B /* ProxyServerActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46B723075F7F0049C28B /* ProxyServerActionSheetController.swift */; };
+ D03E46C823075F810049C28B /* CalculatingCacheSizeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46B823075F7F0049C28B /* CalculatingCacheSizeItem.swift */; };
+ D03E46C923075F810049C28B /* StorageUsageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46B923075F7F0049C28B /* StorageUsageController.swift */; };
+ D03E46CA23075F810049C28B /* AutodownloadDataUsagePickerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46BA23075F7F0049C28B /* AutodownloadDataUsagePickerItem.swift */; };
+ D03E46CB23075F810049C28B /* ProxySettingsServerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46BB23075F800049C28B /* ProxySettingsServerItem.swift */; };
+ D03E46CC23075F810049C28B /* NetworkUsageStatsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46BC23075F800049C28B /* NetworkUsageStatsController.swift */; };
+ D03E46CD23075F810049C28B /* AutodownloadConnectionTypeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46BD23075F800049C28B /* AutodownloadConnectionTypeController.swift */; };
+ D03E46CE23075F810049C28B /* VoiceCallDataSavingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46BE23075F800049C28B /* VoiceCallDataSavingController.swift */; };
+ D03E46CF23075F810049C28B /* ProxyServerSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46BF23075F800049C28B /* ProxyServerSettingsController.swift */; };
+ D03E46D023075F810049C28B /* AutodownloadSizeLimitItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46C023075F800049C28B /* AutodownloadSizeLimitItem.swift */; };
+ D03E46D123075F810049C28B /* ProxyListSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46C123075F810049C28B /* ProxyListSettingsController.swift */; };
+ D03E46D223075F810049C28B /* ShareProxyServerActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46C223075F810049C28B /* ShareProxyServerActionSheetController.swift */; };
+ D03E46D323075F810049C28B /* AutodownloadMediaCategoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46C323075F810049C28B /* AutodownloadMediaCategoryController.swift */; };
+ D03E46D423075F810049C28B /* ProxySettingsActionItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46C423075F810049C28B /* ProxySettingsActionItem.swift */; };
+ D03E46D923075FA40049C28B /* InstalledStickerPacksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46D623075FA40049C28B /* InstalledStickerPacksController.swift */; };
+ D03E46DA23075FA40049C28B /* ArchivedStickerPacksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46D723075FA40049C28B /* ArchivedStickerPacksController.swift */; };
+ D03E46DB23075FA40049C28B /* FeaturedStickerPacksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46D823075FA40049C28B /* FeaturedStickerPacksController.swift */; };
+ D03E470023075FE40049C28B /* ThemeColorsGridControllerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46DD23075FC90049C28B /* ThemeColorsGridControllerItem.swift */; };
+ D03E470123075FE40049C28B /* ThemeSettingsChatPreviewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46DE23075FC90049C28B /* ThemeSettingsChatPreviewItem.swift */; };
+ D03E470223075FE40049C28B /* WallpaperColorPickerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46DF23075FC90049C28B /* WallpaperColorPickerNode.swift */; };
+ D03E470323075FE40049C28B /* ThemeGridControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E023075FD10049C28B /* ThemeGridControllerNode.swift */; };
+ D03E470423075FE40049C28B /* ThemeGridSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E123075FD30049C28B /* ThemeGridSearchItem.swift */; };
+ D03E470523075FE40049C28B /* ThemeSettingsAppIconItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E223075FD30049C28B /* ThemeSettingsAppIconItem.swift */; };
+ D03E470623075FE40049C28B /* ThemeGridSearchColorsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E323075FD30049C28B /* ThemeGridSearchColorsItem.swift */; };
+ D03E470723075FE40049C28B /* ThemeSettingsThemeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E423075FD40049C28B /* ThemeSettingsThemeItem.swift */; };
+ D03E470823075FE40049C28B /* WallpaperGalleryToolbarNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E523075FD40049C28B /* WallpaperGalleryToolbarNode.swift */; };
+ D03E470923075FE40049C28B /* CustomWallpaperPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E623075FD50049C28B /* CustomWallpaperPicker.swift */; };
+ D03E470B23075FE40049C28B /* ThemePreviewControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E823075FD50049C28B /* ThemePreviewControllerNode.swift */; };
+ D03E470C23075FE40049C28B /* WallpaperGalleryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E923075FD50049C28B /* WallpaperGalleryController.swift */; };
+ D03E470D23075FE40049C28B /* ThemeSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46EA23075FD50049C28B /* ThemeSettingsController.swift */; };
+ D03E470E23075FE40049C28B /* WallpaperPatternPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46EB23075FD60049C28B /* WallpaperPatternPanelNode.swift */; };
+ D03E470F23075FE40049C28B /* ThemeAccentColorController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46EC23075FD60049C28B /* ThemeAccentColorController.swift */; };
+ D03E471023075FE40049C28B /* SettingsThemeWallpaperNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46ED23075FD60049C28B /* SettingsThemeWallpaperNode.swift */; };
+ D03E471123075FE40049C28B /* WallpaperSearchRecentQueries.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46EE23075FD60049C28B /* WallpaperSearchRecentQueries.swift */; };
+ D03E471223075FE40049C28B /* ThemeGridSearchContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46EF23075FD70049C28B /* ThemeGridSearchContentNode.swift */; };
+ D03E471323075FE40049C28B /* ThemePreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F023075FD70049C28B /* ThemePreviewController.swift */; };
+ D03E471423075FE40049C28B /* ThemeColorsGridController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F123075FD70049C28B /* ThemeColorsGridController.swift */; };
+ D03E471523075FE40049C28B /* ThemeSettingsFontSizeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F223075FD70049C28B /* ThemeSettingsFontSizeItem.swift */; };
+ D03E471623075FE40049C28B /* WallpaperColorPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F323075FD80049C28B /* WallpaperColorPanelNode.swift */; };
+ D03E471723075FE40049C28B /* WallpaperGalleryDecorationNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F423075FD80049C28B /* WallpaperGalleryDecorationNode.swift */; };
+ D03E471823075FE40049C28B /* ThemeGridSelectionPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F523075FD90049C28B /* ThemeGridSelectionPanelNode.swift */; };
+ D03E471923075FE40049C28B /* ThemeAccentColorControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F623075FD90049C28B /* ThemeAccentColorControllerNode.swift */; };
+ D03E471A23075FE40049C28B /* WallpaperCropNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F723075FD90049C28B /* WallpaperCropNode.swift */; };
+ D03E471B23075FE40049C28B /* ThemeGridControllerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F823075FD90049C28B /* ThemeGridControllerItem.swift */; };
+ D03E471C23075FE40049C28B /* ThemeSettingsBrightnessItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46F923075FD90049C28B /* ThemeSettingsBrightnessItem.swift */; };
+ D03E471D23075FE40049C28B /* ThemeAutoNightTimeSelectionActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46FA23075FD90049C28B /* ThemeAutoNightTimeSelectionActionSheet.swift */; };
+ D03E471E23075FE40049C28B /* ThemeColorsGridControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46FB23075FDA0049C28B /* ThemeColorsGridControllerNode.swift */; };
+ D03E471F23075FE40049C28B /* ThemeGridController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46FC23075FDA0049C28B /* ThemeGridController.swift */; };
+ D03E472023075FE40049C28B /* WallpaperGalleryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46FD23075FDA0049C28B /* WallpaperGalleryItem.swift */; };
+ D03E472123075FE40049C28B /* ThemeSettingsAccentColorItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46FE23075FDA0049C28B /* ThemeSettingsAccentColorItem.swift */; };
+ D03E472223075FE40049C28B /* ThemeAutoNightSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46FF23075FE20049C28B /* ThemeAutoNightSettingsController.swift */; };
+ D03E4725230760040049C28B /* WatchSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E4724230760040049C28B /* WatchSettingsController.swift */; };
+ D03E472A230760330049C28B /* LocalizationListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E4727230760320049C28B /* LocalizationListItem.swift */; };
+ D03E472B230760330049C28B /* LocalizationListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E4728230760320049C28B /* LocalizationListController.swift */; };
+ D03E472C230760330049C28B /* LocalizationListControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E4729230760330049C28B /* LocalizationListControllerNode.swift */; };
+ D03E4730230760570049C28B /* TermsOfServiceControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E472E230760560049C28B /* TermsOfServiceControllerNode.swift */; };
+ D03E4731230760570049C28B /* TermsOfServiceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E472F230760570049C28B /* TermsOfServiceController.swift */; };
+ D03E4734230761E10049C28B /* AccountContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4733230761E10049C28B /* AccountContext.framework */; };
+ D03E4736230761E50049C28B /* ActivityIndicator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4735230761E50049C28B /* ActivityIndicator.framework */; };
+ D03E4738230761EA0049C28B /* AlertUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4737230761EA0049C28B /* AlertUI.framework */; };
+ D03E473A230761ED0049C28B /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4739230761ED0049C28B /* AsyncDisplayKit.framework */; };
+ D03E473C230761F30049C28B /* AvatarNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E473B230761F30049C28B /* AvatarNode.framework */; };
+ D03E473E230761FA0049C28B /* CallListUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E473D230761FA0049C28B /* CallListUI.framework */; };
+ D03E4740230762020049C28B /* ChatListSearchItemHeader.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E473F230762020049C28B /* ChatListSearchItemHeader.framework */; };
+ D03E4742230762020049C28B /* ChatListSearchItemNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4741230762020049C28B /* ChatListSearchItemNode.framework */; };
+ D03E4744230762070049C28B /* ChatListUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4743230762070049C28B /* ChatListUI.framework */; };
+ D03E47462307620C0049C28B /* ContactsPeerItem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47452307620C0049C28B /* ContactsPeerItem.framework */; };
+ D03E4748230762130049C28B /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4747230762130049C28B /* CoreTelephony.framework */; };
+ D03E474A2307621A0049C28B /* CountrySelectionUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47492307621A0049C28B /* CountrySelectionUI.framework */; };
+ D03E474C230762200049C28B /* DeviceAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E474B230762200049C28B /* DeviceAccess.framework */; };
+ D03E474E230762270049C28B /* DeviceLocationManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E474D230762270049C28B /* DeviceLocationManager.framework */; };
+ D03E4750230762310049C28B /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E474F230762310049C28B /* Display.framework */; };
+ D03E47522307623A0049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47512307623A0049C28B /* Foundation.framework */; };
+ D03E47542307623E0049C28B /* GalleryUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47532307623E0049C28B /* GalleryUI.framework */; };
+ D03E4756230762460049C28B /* Geocoding.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4755230762460049C28B /* Geocoding.framework */; };
+ D03E4758230762560049C28B /* ItemListAvatarAndNameInfoItem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4757230762560049C28B /* ItemListAvatarAndNameInfoItem.framework */; };
+ D03E475A230762560049C28B /* ItemListPeerActionItem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4759230762560049C28B /* ItemListPeerActionItem.framework */; };
+ D03E475C230762560049C28B /* ItemListPeerItem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E475B230762560049C28B /* ItemListPeerItem.framework */; };
+ D03E475E230762560049C28B /* ItemListStickerPackItem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E475D230762560049C28B /* ItemListStickerPackItem.framework */; };
+ D03E4760230762560049C28B /* ItemListUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E475F230762560049C28B /* ItemListUI.framework */; };
+ D03E47622307625F0049C28B /* LegacyComponents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47612307625F0049C28B /* LegacyComponents.framework */; };
+ D03E4764230762670049C28B /* LegacyMediaPickerUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4763230762670049C28B /* LegacyMediaPickerUI.framework */; };
+ D03E4766230762670049C28B /* LegacyUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4765230762670049C28B /* LegacyUI.framework */; };
+ D03E4768230762710049C28B /* ListSectionHeaderNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4767230762710049C28B /* ListSectionHeaderNode.framework */; };
+ D03E476A2307628A0049C28B /* LocalAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47692307628A0049C28B /* LocalAuth.framework */; };
+ D03E476C2307628A0049C28B /* LocalizedPeerData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E476B2307628A0049C28B /* LocalizedPeerData.framework */; };
+ D03E476E2307628A0049C28B /* LocalMediaResources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E476D2307628A0049C28B /* LocalMediaResources.framework */; };
+ D03E47702307628B0049C28B /* LocalAuthentication.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E476F2307628B0049C28B /* LocalAuthentication.framework */; };
+ D03E4772230762910049C28B /* MapResourceToAvatarSizes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4771230762910049C28B /* MapResourceToAvatarSizes.framework */; };
+ D03E4774230762970049C28B /* MediaResources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4773230762970049C28B /* MediaResources.framework */; };
+ D03E47762307629D0049C28B /* MergeLists.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47752307629D0049C28B /* MergeLists.framework */; };
+ D03E4778230762A60049C28B /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4777230762A50049C28B /* MessageUI.framework */; };
+ D03E477A230762B30049C28B /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4779230762B30049C28B /* MtProtoKitDynamic.framework */; };
+ D03E477C230762C30049C28B /* NotificationSoundSelectionUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E477B230762C30049C28B /* NotificationSoundSelectionUI.framework */; };
+ D03E477E230762C90049C28B /* OverlayStatusController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E477D230762C90049C28B /* OverlayStatusController.framework */; };
+ D03E4780230762D40049C28B /* PasscodeUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E477F230762D40049C28B /* PasscodeUI.framework */; };
+ D03E4782230762D40049C28B /* PassportUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4781230762D40049C28B /* PassportUI.framework */; };
+ D03E4784230762D40049C28B /* PasswordSetupUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4783230762D40049C28B /* PasswordSetupUI.framework */; };
+ D03E4786230762D90049C28B /* PeerAvatarGalleryUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4785230762D90049C28B /* PeerAvatarGalleryUI.framework */; };
+ D03E4788230762E20049C28B /* PhoneInputNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4787230762E20049C28B /* PhoneInputNode.framework */; };
+ D03E478A230762E70049C28B /* PhotoResources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4789230762E70049C28B /* PhotoResources.framework */; };
+ D03E478C230762EE0049C28B /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E478B230762EE0049C28B /* Photos.framework */; };
+ D03E478E230762F20049C28B /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E478D230762F20049C28B /* Postbox.framework */; };
+ D03E4790230762F80049C28B /* ProgressNavigationButtonNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E478F230762F80049C28B /* ProgressNavigationButtonNode.framework */; };
+ D03E4792230763040049C28B /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4791230763020049C28B /* QuickLook.framework */; };
+ D03E4794230763060049C28B /* RadialStatusNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4793230763060049C28B /* RadialStatusNode.framework */; };
+ D03E4796230763100049C28B /* SearchBarNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4795230763100049C28B /* SearchBarNode.framework */; };
+ D03E4798230763160049C28B /* SearchUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4797230763160049C28B /* SearchUI.framework */; };
+ D03E479A2307631C0049C28B /* ShareController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47992307631C0049C28B /* ShareController.framework */; };
+ D03E479C230763230049C28B /* StickerPackPreviewUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E479B230763230049C28B /* StickerPackPreviewUI.framework */; };
+ D03E479E2307632C0049C28B /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E479D2307632C0049C28B /* SwiftSignalKit.framework */; };
+ D03E47A0230763400049C28B /* TelegramCallsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E479F230763400049C28B /* TelegramCallsUI.framework */; };
+ D03E47A2230763400049C28B /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47A1230763400049C28B /* TelegramCore.framework */; };
+ D03E47A4230763400049C28B /* TelegramNotices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47A3230763400049C28B /* TelegramNotices.framework */; };
+ D03E47A6230763400049C28B /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47A5230763400049C28B /* TelegramPresentationData.framework */; };
+ D03E47A8230763400049C28B /* TelegramStringFormatting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47A7230763400049C28B /* TelegramStringFormatting.framework */; };
+ D03E47AA230763400049C28B /* TelegramUIPreferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47A9230763400049C28B /* TelegramUIPreferences.framework */; };
+ D03E47AC230763460049C28B /* TextFormat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47AB230763460049C28B /* TextFormat.framework */; };
+ D03E47AE2307634C0049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47AD2307634C0049C28B /* UIKit.framework */; };
+ D03E47B0230763510049C28B /* UniversalMediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47AF230763510049C28B /* UniversalMediaPlayer.framework */; };
+ D03E47B2230763570049C28B /* UrlEscaping.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47B1230763570049C28B /* UrlEscaping.framework */; };
+ D03E47B42307635C0049C28B /* WebSearchUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47B32307635C0049C28B /* WebSearchUI.framework */; };
+ D03E47D5230767F40049C28B /* UrlHandling.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47D4230767F40049C28B /* UrlHandling.framework */; };
+ D03E480C230769A30049C28B /* HexColor.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E480B230769A30049C28B /* HexColor.framework */; };
+ D03E483623076AE90049C28B /* QrCode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E483523076AE90049C28B /* QrCode.framework */; };
+ D03E483A23076B220049C28B /* BlurredImageNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E483923076B210049C28B /* BlurredImageNode.swift */; };
+ D03E486E23076C440049C28B /* WallpaperResources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E486D23076C440049C28B /* WallpaperResources.framework */; };
+ D03E48A22307742D0049C28B /* AuthorizationUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48A12307742D0049C28B /* AuthorizationUI.framework */; };
+ D03E48AE230775800049C28B /* OpenSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E48AD230775800049C28B /* OpenSettings.swift */; };
+ D03E48B0230775F00049C28B /* AccountUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E48AF230775EF0049C28B /* AccountUtils.swift */; };
+ D03E48B22307767B0049C28B /* CachedFaqInstantPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E48B12307767A0049C28B /* CachedFaqInstantPage.swift */; };
+ D03E48B4230776870049C28B /* InstantPageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48B3230776870049C28B /* InstantPageUI.framework */; };
+ D03E48B6230777870049C28B /* CheckNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48B5230777870049C28B /* CheckNode.framework */; };
+ D03E48E22308649C0049C28B /* CounterContollerTitleView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48E12308649C0049C28B /* CounterContollerTitleView.framework */; };
+ D03E490E2308661A0049C28B /* GridMessageSelectionNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E490D2308661A0049C28B /* GridMessageSelectionNode.framework */; };
+ D03E493A2308678D0049C28B /* InstantPageCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E49392308678D0049C28B /* InstantPageCache.framework */; };
+ D0EFF26A2319825B00CF5164 /* AppBundle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0EFF2692319825B00CF5164 /* AppBundle.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 091EABA4231DAC7500A0EC14 /* ThemeNameGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeNameGenerator.swift; sourceTree = ""; };
+ 09B4A9B723102B7A005C2E08 /* EditThemeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditThemeController.swift; sourceTree = ""; };
+ 09CE5B8D2322154400743FF4 /* SegmentedControlNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SegmentedControlNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E464D23075D930049C28B /* SettingsUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SettingsUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E465023075D930049C28B /* SettingsUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsUI.h; sourceTree = ""; };
+ D03E465123075D930049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D03E465C23075E630049C28B /* TabBarAccountSwitchControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabBarAccountSwitchControllerNode.swift; sourceTree = ""; };
+ D03E465D23075E630049C28B /* LogoutOptionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogoutOptionsController.swift; sourceTree = ""; };
+ D03E465E23075E640049C28B /* DebugController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugController.swift; sourceTree = ""; };
+ D03E465F23075E640049C28B /* ChangePhoneNumberControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberControllerNode.swift; sourceTree = ""; };
+ D03E466023075E640049C28B /* ChangePhoneNumberController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberController.swift; sourceTree = ""; };
+ D03E466123075E640049C28B /* EditSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditSettingsController.swift; sourceTree = ""; };
+ D03E466223075E640049C28B /* TabBarAccountSwitchController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabBarAccountSwitchController.swift; sourceTree = ""; };
+ D03E466323075E650049C28B /* UsernameSetupController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UsernameSetupController.swift; sourceTree = ""; };
+ D03E466423075E650049C28B /* DebugAccountsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugAccountsController.swift; sourceTree = ""; };
+ D03E466523075E650049C28B /* SettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsController.swift; sourceTree = ""; };
+ D03E466623075E660049C28B /* ChangePhoneNumberCodeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberCodeController.swift; sourceTree = ""; };
+ D03E466723075E660049C28B /* ChangePhoneNumberIntroController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberIntroController.swift; sourceTree = ""; };
+ D03E467723075EC60049C28B /* NotificationsAndSounds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationsAndSounds.swift; sourceTree = ""; };
+ D03E467823075EC70049C28B /* NotificationSearchItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationSearchItem.swift; sourceTree = ""; };
+ D03E467C23075EE90049C28B /* NotificationExceptionSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptionSettingsController.swift; sourceTree = ""; };
+ D03E467D23075EE90049C28B /* NotificationExceptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptions.swift; sourceTree = ""; };
+ D03E467E23075EE90049C28B /* NotificationExceptionControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptionControllerNode.swift; sourceTree = ""; };
+ D03E468523075EFF0049C28B /* SettingsSearchRecentQueries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSearchRecentQueries.swift; sourceTree = ""; };
+ D03E468623075F000049C28B /* SettingsSearchItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSearchItem.swift; sourceTree = ""; };
+ D03E468723075F000049C28B /* SettingsSearchableItems.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSearchableItems.swift; sourceTree = ""; };
+ D03E468823075F000049C28B /* SettingsSearchResultItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSearchResultItem.swift; sourceTree = ""; };
+ D03E468923075F000049C28B /* SettingsSearchRecentItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSearchRecentItem.swift; sourceTree = ""; };
+ D03E468F23075F290049C28B /* SelectivePrivacySettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectivePrivacySettingsController.swift; sourceTree = ""; };
+ D03E469023075F2A0049C28B /* ConfirmPhoneNumberController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmPhoneNumberController.swift; sourceTree = ""; };
+ D03E469123075F2A0049C28B /* TwoStepVerificationResetController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoStepVerificationResetController.swift; sourceTree = ""; };
+ D03E469223075F2A0049C28B /* PrivacyIntroControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacyIntroControllerNode.swift; sourceTree = ""; };
+ D03E469323075F2A0049C28B /* PasscodeOptionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasscodeOptionsController.swift; sourceTree = ""; };
+ D03E469423075F2A0049C28B /* PrivacyAndSecurityController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacyAndSecurityController.swift; sourceTree = ""; };
+ D03E469523075F2A0049C28B /* CreatePasswordController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreatePasswordController.swift; sourceTree = ""; };
+ D03E469623075F2A0049C28B /* ForwardPrivacyChatPreviewItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ForwardPrivacyChatPreviewItem.swift; sourceTree = ""; };
+ D03E469723075F2B0049C28B /* PrivacyIntroController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacyIntroController.swift; sourceTree = ""; };
+ D03E469823075F2B0049C28B /* TwoStepVerificationPasswordEntryController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoStepVerificationPasswordEntryController.swift; sourceTree = ""; };
+ D03E469923075F2B0049C28B /* SelectivePrivacySettingsPeersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectivePrivacySettingsPeersController.swift; sourceTree = ""; };
+ D03E469A23075F2B0049C28B /* TwoStepVerificationUnlockController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoStepVerificationUnlockController.swift; sourceTree = ""; };
+ D03E469B23075F2B0049C28B /* BlockedPeersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlockedPeersController.swift; sourceTree = ""; };
+ D03E469C23075F2C0049C28B /* DataPrivacySettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataPrivacySettingsController.swift; sourceTree = ""; };
+ D03E46AC23075F4E0049C28B /* ItemListRecentSessionItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListRecentSessionItem.swift; sourceTree = ""; };
+ D03E46AD23075F4E0049C28B /* ItemListWebsiteItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListWebsiteItem.swift; sourceTree = ""; };
+ D03E46AE23075F4E0049C28B /* RecentSessionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentSessionsController.swift; sourceTree = ""; };
+ D03E46AF23075F4E0049C28B /* RecentSessionsEmptyStateItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentSessionsEmptyStateItem.swift; sourceTree = ""; };
+ D03E46B523075F7F0049C28B /* DataAndStorageSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataAndStorageSettingsController.swift; sourceTree = ""; };
+ D03E46B623075F7F0049C28B /* SaveIncomingMediaController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SaveIncomingMediaController.swift; sourceTree = ""; };
+ D03E46B723075F7F0049C28B /* ProxyServerActionSheetController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyServerActionSheetController.swift; sourceTree = ""; };
+ D03E46B823075F7F0049C28B /* CalculatingCacheSizeItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalculatingCacheSizeItem.swift; sourceTree = ""; };
+ D03E46B923075F7F0049C28B /* StorageUsageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageUsageController.swift; sourceTree = ""; };
+ D03E46BA23075F7F0049C28B /* AutodownloadDataUsagePickerItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutodownloadDataUsagePickerItem.swift; sourceTree = ""; };
+ D03E46BB23075F800049C28B /* ProxySettingsServerItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxySettingsServerItem.swift; sourceTree = ""; };
+ D03E46BC23075F800049C28B /* NetworkUsageStatsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkUsageStatsController.swift; sourceTree = ""; };
+ D03E46BD23075F800049C28B /* AutodownloadConnectionTypeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutodownloadConnectionTypeController.swift; sourceTree = ""; };
+ D03E46BE23075F800049C28B /* VoiceCallDataSavingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoiceCallDataSavingController.swift; sourceTree = ""; };
+ D03E46BF23075F800049C28B /* ProxyServerSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyServerSettingsController.swift; sourceTree = ""; };
+ D03E46C023075F800049C28B /* AutodownloadSizeLimitItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutodownloadSizeLimitItem.swift; sourceTree = ""; };
+ D03E46C123075F810049C28B /* ProxyListSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyListSettingsController.swift; sourceTree = ""; };
+ D03E46C223075F810049C28B /* ShareProxyServerActionSheetController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareProxyServerActionSheetController.swift; sourceTree = ""; };
+ D03E46C323075F810049C28B /* AutodownloadMediaCategoryController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutodownloadMediaCategoryController.swift; sourceTree = ""; };
+ D03E46C423075F810049C28B /* ProxySettingsActionItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxySettingsActionItem.swift; sourceTree = ""; };
+ D03E46D623075FA40049C28B /* InstalledStickerPacksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstalledStickerPacksController.swift; sourceTree = ""; };
+ D03E46D723075FA40049C28B /* ArchivedStickerPacksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArchivedStickerPacksController.swift; sourceTree = ""; };
+ D03E46D823075FA40049C28B /* FeaturedStickerPacksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeaturedStickerPacksController.swift; sourceTree = ""; };
+ D03E46DD23075FC90049C28B /* ThemeColorsGridControllerItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeColorsGridControllerItem.swift; sourceTree = ""; };
+ D03E46DE23075FC90049C28B /* ThemeSettingsChatPreviewItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettingsChatPreviewItem.swift; sourceTree = ""; };
+ D03E46DF23075FC90049C28B /* WallpaperColorPickerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperColorPickerNode.swift; sourceTree = ""; };
+ D03E46E023075FD10049C28B /* ThemeGridControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridControllerNode.swift; sourceTree = ""; };
+ D03E46E123075FD30049C28B /* ThemeGridSearchItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridSearchItem.swift; sourceTree = ""; };
+ D03E46E223075FD30049C28B /* ThemeSettingsAppIconItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettingsAppIconItem.swift; sourceTree = ""; };
+ D03E46E323075FD30049C28B /* ThemeGridSearchColorsItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridSearchColorsItem.swift; sourceTree = ""; };
+ D03E46E423075FD40049C28B /* ThemeSettingsThemeItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettingsThemeItem.swift; sourceTree = ""; };
+ D03E46E523075FD40049C28B /* WallpaperGalleryToolbarNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryToolbarNode.swift; sourceTree = ""; };
+ D03E46E623075FD50049C28B /* CustomWallpaperPicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomWallpaperPicker.swift; sourceTree = ""; };
+ D03E46E823075FD50049C28B /* ThemePreviewControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemePreviewControllerNode.swift; sourceTree = ""; };
+ D03E46E923075FD50049C28B /* WallpaperGalleryController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryController.swift; sourceTree = ""; };
+ D03E46EA23075FD50049C28B /* ThemeSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettingsController.swift; sourceTree = ""; };
+ D03E46EB23075FD60049C28B /* WallpaperPatternPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperPatternPanelNode.swift; sourceTree = ""; };
+ D03E46EC23075FD60049C28B /* ThemeAccentColorController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeAccentColorController.swift; sourceTree = ""; };
+ D03E46ED23075FD60049C28B /* SettingsThemeWallpaperNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsThemeWallpaperNode.swift; sourceTree = ""; };
+ D03E46EE23075FD60049C28B /* WallpaperSearchRecentQueries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperSearchRecentQueries.swift; sourceTree = ""; };
+ D03E46EF23075FD70049C28B /* ThemeGridSearchContentNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridSearchContentNode.swift; sourceTree = ""; };
+ D03E46F023075FD70049C28B /* ThemePreviewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemePreviewController.swift; sourceTree = ""; };
+ D03E46F123075FD70049C28B /* ThemeColorsGridController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeColorsGridController.swift; sourceTree = ""; };
+ D03E46F223075FD70049C28B /* ThemeSettingsFontSizeItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettingsFontSizeItem.swift; sourceTree = ""; };
+ D03E46F323075FD80049C28B /* WallpaperColorPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperColorPanelNode.swift; sourceTree = ""; };
+ D03E46F423075FD80049C28B /* WallpaperGalleryDecorationNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryDecorationNode.swift; sourceTree = ""; };
+ D03E46F523075FD90049C28B /* ThemeGridSelectionPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridSelectionPanelNode.swift; sourceTree = ""; };
+ D03E46F623075FD90049C28B /* ThemeAccentColorControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeAccentColorControllerNode.swift; sourceTree = ""; };
+ D03E46F723075FD90049C28B /* WallpaperCropNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperCropNode.swift; sourceTree = ""; };
+ D03E46F823075FD90049C28B /* ThemeGridControllerItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridControllerItem.swift; sourceTree = ""; };
+ D03E46F923075FD90049C28B /* ThemeSettingsBrightnessItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettingsBrightnessItem.swift; sourceTree = ""; };
+ D03E46FA23075FD90049C28B /* ThemeAutoNightTimeSelectionActionSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeAutoNightTimeSelectionActionSheet.swift; sourceTree = ""; };
+ D03E46FB23075FDA0049C28B /* ThemeColorsGridControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeColorsGridControllerNode.swift; sourceTree = ""; };
+ D03E46FC23075FDA0049C28B /* ThemeGridController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridController.swift; sourceTree = ""; };
+ D03E46FD23075FDA0049C28B /* WallpaperGalleryItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryItem.swift; sourceTree = ""; };
+ D03E46FE23075FDA0049C28B /* ThemeSettingsAccentColorItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettingsAccentColorItem.swift; sourceTree = ""; };
+ D03E46FF23075FE20049C28B /* ThemeAutoNightSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeAutoNightSettingsController.swift; sourceTree = ""; };
+ D03E4724230760040049C28B /* WatchSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchSettingsController.swift; sourceTree = ""; };
+ D03E4727230760320049C28B /* LocalizationListItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalizationListItem.swift; sourceTree = ""; };
+ D03E4728230760320049C28B /* LocalizationListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalizationListController.swift; sourceTree = ""; };
+ D03E4729230760330049C28B /* LocalizationListControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalizationListControllerNode.swift; sourceTree = ""; };
+ D03E472E230760560049C28B /* TermsOfServiceControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TermsOfServiceControllerNode.swift; sourceTree = ""; };
+ D03E472F230760570049C28B /* TermsOfServiceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TermsOfServiceController.swift; sourceTree = ""; };
+ D03E4733230761E10049C28B /* AccountContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AccountContext.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4735230761E50049C28B /* ActivityIndicator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ActivityIndicator.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4737230761EA0049C28B /* AlertUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AlertUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4739230761ED0049C28B /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E473B230761F30049C28B /* AvatarNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AvatarNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E473D230761FA0049C28B /* CallListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CallListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E473F230762020049C28B /* ChatListSearchItemHeader.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ChatListSearchItemHeader.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4741230762020049C28B /* ChatListSearchItemNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ChatListSearchItemNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4743230762070049C28B /* ChatListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ChatListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47452307620C0049C28B /* ContactsPeerItem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ContactsPeerItem.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4747230762130049C28B /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };
+ D03E47492307621A0049C28B /* CountrySelectionUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CountrySelectionUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E474B230762200049C28B /* DeviceAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeviceAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E474D230762270049C28B /* DeviceLocationManager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeviceLocationManager.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E474F230762310049C28B /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47512307623A0049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D03E47532307623E0049C28B /* GalleryUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GalleryUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4755230762460049C28B /* Geocoding.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Geocoding.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4757230762560049C28B /* ItemListAvatarAndNameInfoItem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ItemListAvatarAndNameInfoItem.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4759230762560049C28B /* ItemListPeerActionItem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ItemListPeerActionItem.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E475B230762560049C28B /* ItemListPeerItem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ItemListPeerItem.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E475D230762560049C28B /* ItemListStickerPackItem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ItemListStickerPackItem.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E475F230762560049C28B /* ItemListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ItemListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47612307625F0049C28B /* LegacyComponents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LegacyComponents.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4763230762670049C28B /* LegacyMediaPickerUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LegacyMediaPickerUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4765230762670049C28B /* LegacyUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LegacyUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4767230762710049C28B /* ListSectionHeaderNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ListSectionHeaderNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47692307628A0049C28B /* LocalAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LocalAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E476B2307628A0049C28B /* LocalizedPeerData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LocalizedPeerData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E476D2307628A0049C28B /* LocalMediaResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LocalMediaResources.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E476F2307628B0049C28B /* LocalAuthentication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LocalAuthentication.framework; path = System/Library/Frameworks/LocalAuthentication.framework; sourceTree = SDKROOT; };
+ D03E4771230762910049C28B /* MapResourceToAvatarSizes.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MapResourceToAvatarSizes.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4773230762970049C28B /* MediaResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MediaResources.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47752307629D0049C28B /* MergeLists.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MergeLists.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4777230762A50049C28B /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };
+ D03E4779230762B30049C28B /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MtProtoKitDynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E477B230762C30049C28B /* NotificationSoundSelectionUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NotificationSoundSelectionUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E477D230762C90049C28B /* OverlayStatusController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = OverlayStatusController.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E477F230762D40049C28B /* PasscodeUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PasscodeUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4781230762D40049C28B /* PassportUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PassportUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4783230762D40049C28B /* PasswordSetupUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PasswordSetupUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4785230762D90049C28B /* PeerAvatarGalleryUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PeerAvatarGalleryUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4787230762E20049C28B /* PhoneInputNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PhoneInputNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4789230762E70049C28B /* PhotoResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PhotoResources.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E478B230762EE0049C28B /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; };
+ D03E478D230762F20049C28B /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E478F230762F80049C28B /* ProgressNavigationButtonNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ProgressNavigationButtonNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4791230763020049C28B /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; };
+ D03E4793230763060049C28B /* RadialStatusNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RadialStatusNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4795230763100049C28B /* SearchBarNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SearchBarNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4797230763160049C28B /* SearchUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SearchUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47992307631C0049C28B /* ShareController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ShareController.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E479B230763230049C28B /* StickerPackPreviewUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = StickerPackPreviewUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E479D2307632C0049C28B /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E479F230763400049C28B /* TelegramCallsUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCallsUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47A1230763400049C28B /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47A3230763400049C28B /* TelegramNotices.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramNotices.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47A5230763400049C28B /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47A7230763400049C28B /* TelegramStringFormatting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramStringFormatting.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47A9230763400049C28B /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47AB230763460049C28B /* TextFormat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TextFormat.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47AD2307634C0049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ D03E47AF230763510049C28B /* UniversalMediaPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UniversalMediaPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47B1230763570049C28B /* UrlEscaping.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UrlEscaping.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47B32307635C0049C28B /* WebSearchUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WebSearchUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47D4230767F40049C28B /* UrlHandling.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UrlHandling.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E480B230769A30049C28B /* HexColor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = HexColor.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E483523076AE90049C28B /* QrCode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = QrCode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E483923076B210049C28B /* BlurredImageNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlurredImageNode.swift; sourceTree = ""; };
+ D03E486D23076C440049C28B /* WallpaperResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WallpaperResources.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48A12307742D0049C28B /* AuthorizationUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AuthorizationUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48AD230775800049C28B /* OpenSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenSettings.swift; sourceTree = ""; };
+ D03E48AF230775EF0049C28B /* AccountUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountUtils.swift; sourceTree = ""; };
+ D03E48B12307767A0049C28B /* CachedFaqInstantPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedFaqInstantPage.swift; sourceTree = ""; };
+ D03E48B3230776870049C28B /* InstantPageUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = InstantPageUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48B5230777870049C28B /* CheckNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CheckNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48E12308649C0049C28B /* CounterContollerTitleView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CounterContollerTitleView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E490D2308661A0049C28B /* GridMessageSelectionNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GridMessageSelectionNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E49392308678D0049C28B /* InstantPageCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = InstantPageCache.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D0EFF2692319825B00CF5164 /* AppBundle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppBundle.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E464A23075D930049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+<<<<<<< HEAD
+ 09CE5B8E2322154400743FF4 /* SegmentedControlNode.framework in Frameworks */,
+=======
+ D0EFF26A2319825B00CF5164 /* AppBundle.framework in Frameworks */,
+>>>>>>> d3e2a588298087c72f245181ae1d2c2f75726abe
+ D03E493A2308678D0049C28B /* InstantPageCache.framework in Frameworks */,
+ D03E490E2308661A0049C28B /* GridMessageSelectionNode.framework in Frameworks */,
+ D03E48E22308649C0049C28B /* CounterContollerTitleView.framework in Frameworks */,
+ D03E48B6230777870049C28B /* CheckNode.framework in Frameworks */,
+ D03E48B4230776870049C28B /* InstantPageUI.framework in Frameworks */,
+ D03E48A22307742D0049C28B /* AuthorizationUI.framework in Frameworks */,
+ D03E486E23076C440049C28B /* WallpaperResources.framework in Frameworks */,
+ D03E483623076AE90049C28B /* QrCode.framework in Frameworks */,
+ D03E480C230769A30049C28B /* HexColor.framework in Frameworks */,
+ D03E47D5230767F40049C28B /* UrlHandling.framework in Frameworks */,
+ D03E47B42307635C0049C28B /* WebSearchUI.framework in Frameworks */,
+ D03E47B2230763570049C28B /* UrlEscaping.framework in Frameworks */,
+ D03E47B0230763510049C28B /* UniversalMediaPlayer.framework in Frameworks */,
+ D03E47AE2307634C0049C28B /* UIKit.framework in Frameworks */,
+ D03E47AC230763460049C28B /* TextFormat.framework in Frameworks */,
+ D03E47A0230763400049C28B /* TelegramCallsUI.framework in Frameworks */,
+ D03E47A2230763400049C28B /* TelegramCore.framework in Frameworks */,
+ D03E47A4230763400049C28B /* TelegramNotices.framework in Frameworks */,
+ D03E47A6230763400049C28B /* TelegramPresentationData.framework in Frameworks */,
+ D03E47A8230763400049C28B /* TelegramStringFormatting.framework in Frameworks */,
+ D03E47AA230763400049C28B /* TelegramUIPreferences.framework in Frameworks */,
+ D03E479E2307632C0049C28B /* SwiftSignalKit.framework in Frameworks */,
+ D03E479C230763230049C28B /* StickerPackPreviewUI.framework in Frameworks */,
+ D03E479A2307631C0049C28B /* ShareController.framework in Frameworks */,
+ D03E4798230763160049C28B /* SearchUI.framework in Frameworks */,
+ D03E4796230763100049C28B /* SearchBarNode.framework in Frameworks */,
+ D03E4794230763060049C28B /* RadialStatusNode.framework in Frameworks */,
+ D03E4792230763040049C28B /* QuickLook.framework in Frameworks */,
+ D03E4790230762F80049C28B /* ProgressNavigationButtonNode.framework in Frameworks */,
+ D03E478E230762F20049C28B /* Postbox.framework in Frameworks */,
+ D03E478C230762EE0049C28B /* Photos.framework in Frameworks */,
+ D03E478A230762E70049C28B /* PhotoResources.framework in Frameworks */,
+ D03E4788230762E20049C28B /* PhoneInputNode.framework in Frameworks */,
+ D03E4786230762D90049C28B /* PeerAvatarGalleryUI.framework in Frameworks */,
+ D03E4780230762D40049C28B /* PasscodeUI.framework in Frameworks */,
+ D03E4782230762D40049C28B /* PassportUI.framework in Frameworks */,
+ D03E4784230762D40049C28B /* PasswordSetupUI.framework in Frameworks */,
+ D03E477E230762C90049C28B /* OverlayStatusController.framework in Frameworks */,
+ D03E477C230762C30049C28B /* NotificationSoundSelectionUI.framework in Frameworks */,
+ D03E477A230762B30049C28B /* MtProtoKitDynamic.framework in Frameworks */,
+ D03E4778230762A60049C28B /* MessageUI.framework in Frameworks */,
+ D03E47762307629D0049C28B /* MergeLists.framework in Frameworks */,
+ D03E4774230762970049C28B /* MediaResources.framework in Frameworks */,
+ D03E4772230762910049C28B /* MapResourceToAvatarSizes.framework in Frameworks */,
+ D03E47702307628B0049C28B /* LocalAuthentication.framework in Frameworks */,
+ D03E476A2307628A0049C28B /* LocalAuth.framework in Frameworks */,
+ D03E476C2307628A0049C28B /* LocalizedPeerData.framework in Frameworks */,
+ D03E476E2307628A0049C28B /* LocalMediaResources.framework in Frameworks */,
+ D03E4768230762710049C28B /* ListSectionHeaderNode.framework in Frameworks */,
+ D03E4764230762670049C28B /* LegacyMediaPickerUI.framework in Frameworks */,
+ D03E4766230762670049C28B /* LegacyUI.framework in Frameworks */,
+ D03E47622307625F0049C28B /* LegacyComponents.framework in Frameworks */,
+ D03E4758230762560049C28B /* ItemListAvatarAndNameInfoItem.framework in Frameworks */,
+ D03E475A230762560049C28B /* ItemListPeerActionItem.framework in Frameworks */,
+ D03E475C230762560049C28B /* ItemListPeerItem.framework in Frameworks */,
+ D03E475E230762560049C28B /* ItemListStickerPackItem.framework in Frameworks */,
+ D03E4760230762560049C28B /* ItemListUI.framework in Frameworks */,
+ D03E4756230762460049C28B /* Geocoding.framework in Frameworks */,
+ D03E47542307623E0049C28B /* GalleryUI.framework in Frameworks */,
+ D03E47522307623A0049C28B /* Foundation.framework in Frameworks */,
+ D03E4750230762310049C28B /* Display.framework in Frameworks */,
+ D03E474E230762270049C28B /* DeviceLocationManager.framework in Frameworks */,
+ D03E474C230762200049C28B /* DeviceAccess.framework in Frameworks */,
+ D03E474A2307621A0049C28B /* CountrySelectionUI.framework in Frameworks */,
+ D03E4748230762130049C28B /* CoreTelephony.framework in Frameworks */,
+ D03E47462307620C0049C28B /* ContactsPeerItem.framework in Frameworks */,
+ D03E4744230762070049C28B /* ChatListUI.framework in Frameworks */,
+ D03E4740230762020049C28B /* ChatListSearchItemHeader.framework in Frameworks */,
+ D03E4742230762020049C28B /* ChatListSearchItemNode.framework in Frameworks */,
+ D03E473E230761FA0049C28B /* CallListUI.framework in Frameworks */,
+ D03E473C230761F30049C28B /* AvatarNode.framework in Frameworks */,
+ D03E473A230761ED0049C28B /* AsyncDisplayKit.framework in Frameworks */,
+ D03E4738230761EA0049C28B /* AlertUI.framework in Frameworks */,
+ D03E4736230761E50049C28B /* ActivityIndicator.framework in Frameworks */,
+ D03E4734230761E10049C28B /* AccountContext.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D03E464323075D930049C28B = {
+ isa = PBXGroup;
+ children = (
+ D03E465123075D930049C28B /* Info.plist */,
+ D03E464F23075D930049C28B /* Sources */,
+ D03E464E23075D930049C28B /* Products */,
+ D03E4732230761E10049C28B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D03E464E23075D930049C28B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D03E464D23075D930049C28B /* SettingsUI.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D03E464F23075D930049C28B /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D03E467423075E6C0049C28B /* Search */,
+ D03E467623075EA90049C28B /* Notifications */,
+ D03E468223075EEB0049C28B /* Privacy and Security */,
+ D03E46B423075F610049C28B /* Data and Storage */,
+ D03E46D523075F8A0049C28B /* Stickers */,
+ D03E46DC23075FAD0049C28B /* Themes */,
+ D03E472323075FEC0049C28B /* Watch */,
+ D03E47262307600F0049C28B /* Language Selection */,
+ D03E472D2307603D0049C28B /* Terms of Service */,
+ D03E466623075E660049C28B /* ChangePhoneNumberCodeController.swift */,
+ D03E466023075E640049C28B /* ChangePhoneNumberController.swift */,
+ D03E465F23075E640049C28B /* ChangePhoneNumberControllerNode.swift */,
+ D03E466723075E660049C28B /* ChangePhoneNumberIntroController.swift */,
+ D03E466423075E650049C28B /* DebugAccountsController.swift */,
+ D03E465E23075E640049C28B /* DebugController.swift */,
+ D03E466123075E640049C28B /* EditSettingsController.swift */,
+ D03E465D23075E630049C28B /* LogoutOptionsController.swift */,
+ D03E466523075E650049C28B /* SettingsController.swift */,
+ D03E466223075E640049C28B /* TabBarAccountSwitchController.swift */,
+ D03E465C23075E630049C28B /* TabBarAccountSwitchControllerNode.swift */,
+ D03E466323075E650049C28B /* UsernameSetupController.swift */,
+ D03E483923076B210049C28B /* BlurredImageNode.swift */,
+ D03E48AD230775800049C28B /* OpenSettings.swift */,
+ D03E48AF230775EF0049C28B /* AccountUtils.swift */,
+ D03E48B12307767A0049C28B /* CachedFaqInstantPage.swift */,
+ D03E465023075D930049C28B /* SettingsUI.h */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D03E467423075E6C0049C28B /* Search */ = {
+ isa = PBXGroup;
+ children = (
+ D03E468723075F000049C28B /* SettingsSearchableItems.swift */,
+ D03E468623075F000049C28B /* SettingsSearchItem.swift */,
+ D03E468923075F000049C28B /* SettingsSearchRecentItem.swift */,
+ D03E468523075EFF0049C28B /* SettingsSearchRecentQueries.swift */,
+ D03E468823075F000049C28B /* SettingsSearchResultItem.swift */,
+ );
+ path = Search;
+ sourceTree = "";
+ };
+ D03E467623075EA90049C28B /* Notifications */ = {
+ isa = PBXGroup;
+ children = (
+ D03E467B23075EC90049C28B /* Exceptions */,
+ D03E467723075EC60049C28B /* NotificationsAndSounds.swift */,
+ D03E467823075EC70049C28B /* NotificationSearchItem.swift */,
+ );
+ path = Notifications;
+ sourceTree = "";
+ };
+ D03E467B23075EC90049C28B /* Exceptions */ = {
+ isa = PBXGroup;
+ children = (
+ D03E467E23075EE90049C28B /* NotificationExceptionControllerNode.swift */,
+ D03E467D23075EE90049C28B /* NotificationExceptions.swift */,
+ D03E467C23075EE90049C28B /* NotificationExceptionSettingsController.swift */,
+ );
+ path = Exceptions;
+ sourceTree = "";
+ };
+ D03E468223075EEB0049C28B /* Privacy and Security */ = {
+ isa = PBXGroup;
+ children = (
+ D03E46AB23075F350049C28B /* Recent Sessions */,
+ D03E469B23075F2B0049C28B /* BlockedPeersController.swift */,
+ D03E469023075F2A0049C28B /* ConfirmPhoneNumberController.swift */,
+ D03E469523075F2A0049C28B /* CreatePasswordController.swift */,
+ D03E469C23075F2C0049C28B /* DataPrivacySettingsController.swift */,
+ D03E469623075F2A0049C28B /* ForwardPrivacyChatPreviewItem.swift */,
+ D03E469323075F2A0049C28B /* PasscodeOptionsController.swift */,
+ D03E469423075F2A0049C28B /* PrivacyAndSecurityController.swift */,
+ D03E469723075F2B0049C28B /* PrivacyIntroController.swift */,
+ D03E469223075F2A0049C28B /* PrivacyIntroControllerNode.swift */,
+ D03E468F23075F290049C28B /* SelectivePrivacySettingsController.swift */,
+ D03E469923075F2B0049C28B /* SelectivePrivacySettingsPeersController.swift */,
+ D03E469823075F2B0049C28B /* TwoStepVerificationPasswordEntryController.swift */,
+ D03E469123075F2A0049C28B /* TwoStepVerificationResetController.swift */,
+ D03E469A23075F2B0049C28B /* TwoStepVerificationUnlockController.swift */,
+ );
+ path = "Privacy and Security";
+ sourceTree = "";
+ };
+ D03E46AB23075F350049C28B /* Recent Sessions */ = {
+ isa = PBXGroup;
+ children = (
+ D03E46AC23075F4E0049C28B /* ItemListRecentSessionItem.swift */,
+ D03E46AD23075F4E0049C28B /* ItemListWebsiteItem.swift */,
+ D03E46AE23075F4E0049C28B /* RecentSessionsController.swift */,
+ D03E46AF23075F4E0049C28B /* RecentSessionsEmptyStateItem.swift */,
+ );
+ path = "Recent Sessions";
+ sourceTree = "";
+ };
+ D03E46B423075F610049C28B /* Data and Storage */ = {
+ isa = PBXGroup;
+ children = (
+ D03E46BD23075F800049C28B /* AutodownloadConnectionTypeController.swift */,
+ D03E46BA23075F7F0049C28B /* AutodownloadDataUsagePickerItem.swift */,
+ D03E46C323075F810049C28B /* AutodownloadMediaCategoryController.swift */,
+ D03E46C023075F800049C28B /* AutodownloadSizeLimitItem.swift */,
+ D03E46B823075F7F0049C28B /* CalculatingCacheSizeItem.swift */,
+ D03E46B523075F7F0049C28B /* DataAndStorageSettingsController.swift */,
+ D03E46BC23075F800049C28B /* NetworkUsageStatsController.swift */,
+ D03E46C123075F810049C28B /* ProxyListSettingsController.swift */,
+ D03E46B723075F7F0049C28B /* ProxyServerActionSheetController.swift */,
+ D03E46BF23075F800049C28B /* ProxyServerSettingsController.swift */,
+ D03E46C423075F810049C28B /* ProxySettingsActionItem.swift */,
+ D03E46BB23075F800049C28B /* ProxySettingsServerItem.swift */,
+ D03E46B623075F7F0049C28B /* SaveIncomingMediaController.swift */,
+ D03E46C223075F810049C28B /* ShareProxyServerActionSheetController.swift */,
+ D03E46B923075F7F0049C28B /* StorageUsageController.swift */,
+ D03E46BE23075F800049C28B /* VoiceCallDataSavingController.swift */,
+ );
+ path = "Data and Storage";
+ sourceTree = "";
+ };
+ D03E46D523075F8A0049C28B /* Stickers */ = {
+ isa = PBXGroup;
+ children = (
+ D03E46D723075FA40049C28B /* ArchivedStickerPacksController.swift */,
+ D03E46D823075FA40049C28B /* FeaturedStickerPacksController.swift */,
+ D03E46D623075FA40049C28B /* InstalledStickerPacksController.swift */,
+ );
+ path = Stickers;
+ sourceTree = "";
+ };
+ D03E46DC23075FAD0049C28B /* Themes */ = {
+ isa = PBXGroup;
+ children = (
+ D03E46E623075FD50049C28B /* CustomWallpaperPicker.swift */,
+ D03E46ED23075FD60049C28B /* SettingsThemeWallpaperNode.swift */,
+ D03E46EC23075FD60049C28B /* ThemeAccentColorController.swift */,
+ D03E46F623075FD90049C28B /* ThemeAccentColorControllerNode.swift */,
+ D03E46FF23075FE20049C28B /* ThemeAutoNightSettingsController.swift */,
+ D03E46FA23075FD90049C28B /* ThemeAutoNightTimeSelectionActionSheet.swift */,
+ D03E46F123075FD70049C28B /* ThemeColorsGridController.swift */,
+ D03E46DD23075FC90049C28B /* ThemeColorsGridControllerItem.swift */,
+ D03E46FB23075FDA0049C28B /* ThemeColorsGridControllerNode.swift */,
+ D03E46FC23075FDA0049C28B /* ThemeGridController.swift */,
+ D03E46F823075FD90049C28B /* ThemeGridControllerItem.swift */,
+ D03E46E023075FD10049C28B /* ThemeGridControllerNode.swift */,
+ D03E46E323075FD30049C28B /* ThemeGridSearchColorsItem.swift */,
+ D03E46EF23075FD70049C28B /* ThemeGridSearchContentNode.swift */,
+ D03E46E123075FD30049C28B /* ThemeGridSearchItem.swift */,
+ D03E46F523075FD90049C28B /* ThemeGridSelectionPanelNode.swift */,
+ D03E46F023075FD70049C28B /* ThemePreviewController.swift */,
+ D03E46E823075FD50049C28B /* ThemePreviewControllerNode.swift */,
+ D03E46FE23075FDA0049C28B /* ThemeSettingsAccentColorItem.swift */,
+ D03E46E223075FD30049C28B /* ThemeSettingsAppIconItem.swift */,
+ D03E46F923075FD90049C28B /* ThemeSettingsBrightnessItem.swift */,
+ D03E46DE23075FC90049C28B /* ThemeSettingsChatPreviewItem.swift */,
+ D03E46EA23075FD50049C28B /* ThemeSettingsController.swift */,
+ D03E46F223075FD70049C28B /* ThemeSettingsFontSizeItem.swift */,
+ D03E46E423075FD40049C28B /* ThemeSettingsThemeItem.swift */,
+ D03E46F323075FD80049C28B /* WallpaperColorPanelNode.swift */,
+ D03E46DF23075FC90049C28B /* WallpaperColorPickerNode.swift */,
+ D03E46F723075FD90049C28B /* WallpaperCropNode.swift */,
+ D03E46E923075FD50049C28B /* WallpaperGalleryController.swift */,
+ D03E46F423075FD80049C28B /* WallpaperGalleryDecorationNode.swift */,
+ D03E46FD23075FDA0049C28B /* WallpaperGalleryItem.swift */,
+ D03E46E523075FD40049C28B /* WallpaperGalleryToolbarNode.swift */,
+ D03E46EB23075FD60049C28B /* WallpaperPatternPanelNode.swift */,
+ D03E46EE23075FD60049C28B /* WallpaperSearchRecentQueries.swift */,
+ 09B4A9B723102B7A005C2E08 /* EditThemeController.swift */,
+ 091EABA4231DAC7500A0EC14 /* ThemeNameGenerator.swift */,
+ );
+ path = Themes;
+ sourceTree = "";
+ };
+ D03E472323075FEC0049C28B /* Watch */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4724230760040049C28B /* WatchSettingsController.swift */,
+ );
+ path = Watch;
+ sourceTree = "";
+ };
+ D03E47262307600F0049C28B /* Language Selection */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4728230760320049C28B /* LocalizationListController.swift */,
+ D03E4729230760330049C28B /* LocalizationListControllerNode.swift */,
+ D03E4727230760320049C28B /* LocalizationListItem.swift */,
+ );
+ path = "Language Selection";
+ sourceTree = "";
+ };
+ D03E472D2307603D0049C28B /* Terms of Service */ = {
+ isa = PBXGroup;
+ children = (
+ D03E472F230760570049C28B /* TermsOfServiceController.swift */,
+ D03E472E230760560049C28B /* TermsOfServiceControllerNode.swift */,
+ );
+ path = "Terms of Service";
+ sourceTree = "";
+ };
+ D03E4732230761E10049C28B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+<<<<<<< HEAD
+ 09CE5B8D2322154400743FF4 /* SegmentedControlNode.framework */,
+=======
+ D0EFF2692319825B00CF5164 /* AppBundle.framework */,
+>>>>>>> d3e2a588298087c72f245181ae1d2c2f75726abe
+ D03E49392308678D0049C28B /* InstantPageCache.framework */,
+ D03E490D2308661A0049C28B /* GridMessageSelectionNode.framework */,
+ D03E48E12308649C0049C28B /* CounterContollerTitleView.framework */,
+ D03E48B5230777870049C28B /* CheckNode.framework */,
+ D03E48B3230776870049C28B /* InstantPageUI.framework */,
+ D03E48A12307742D0049C28B /* AuthorizationUI.framework */,
+ D03E486D23076C440049C28B /* WallpaperResources.framework */,
+ D03E483523076AE90049C28B /* QrCode.framework */,
+ D03E480B230769A30049C28B /* HexColor.framework */,
+ D03E47D4230767F40049C28B /* UrlHandling.framework */,
+ D03E47B32307635C0049C28B /* WebSearchUI.framework */,
+ D03E47B1230763570049C28B /* UrlEscaping.framework */,
+ D03E47AF230763510049C28B /* UniversalMediaPlayer.framework */,
+ D03E47AD2307634C0049C28B /* UIKit.framework */,
+ D03E47AB230763460049C28B /* TextFormat.framework */,
+ D03E479F230763400049C28B /* TelegramCallsUI.framework */,
+ D03E47A1230763400049C28B /* TelegramCore.framework */,
+ D03E47A3230763400049C28B /* TelegramNotices.framework */,
+ D03E47A5230763400049C28B /* TelegramPresentationData.framework */,
+ D03E47A7230763400049C28B /* TelegramStringFormatting.framework */,
+ D03E47A9230763400049C28B /* TelegramUIPreferences.framework */,
+ D03E479D2307632C0049C28B /* SwiftSignalKit.framework */,
+ D03E479B230763230049C28B /* StickerPackPreviewUI.framework */,
+ D03E47992307631C0049C28B /* ShareController.framework */,
+ D03E4797230763160049C28B /* SearchUI.framework */,
+ D03E4795230763100049C28B /* SearchBarNode.framework */,
+ D03E4793230763060049C28B /* RadialStatusNode.framework */,
+ D03E4791230763020049C28B /* QuickLook.framework */,
+ D03E478F230762F80049C28B /* ProgressNavigationButtonNode.framework */,
+ D03E478D230762F20049C28B /* Postbox.framework */,
+ D03E478B230762EE0049C28B /* Photos.framework */,
+ D03E4789230762E70049C28B /* PhotoResources.framework */,
+ D03E4787230762E20049C28B /* PhoneInputNode.framework */,
+ D03E4785230762D90049C28B /* PeerAvatarGalleryUI.framework */,
+ D03E477F230762D40049C28B /* PasscodeUI.framework */,
+ D03E4781230762D40049C28B /* PassportUI.framework */,
+ D03E4783230762D40049C28B /* PasswordSetupUI.framework */,
+ D03E477D230762C90049C28B /* OverlayStatusController.framework */,
+ D03E477B230762C30049C28B /* NotificationSoundSelectionUI.framework */,
+ D03E4779230762B30049C28B /* MtProtoKitDynamic.framework */,
+ D03E4777230762A50049C28B /* MessageUI.framework */,
+ D03E47752307629D0049C28B /* MergeLists.framework */,
+ D03E4773230762970049C28B /* MediaResources.framework */,
+ D03E4771230762910049C28B /* MapResourceToAvatarSizes.framework */,
+ D03E476F2307628B0049C28B /* LocalAuthentication.framework */,
+ D03E47692307628A0049C28B /* LocalAuth.framework */,
+ D03E476B2307628A0049C28B /* LocalizedPeerData.framework */,
+ D03E476D2307628A0049C28B /* LocalMediaResources.framework */,
+ D03E4767230762710049C28B /* ListSectionHeaderNode.framework */,
+ D03E4763230762670049C28B /* LegacyMediaPickerUI.framework */,
+ D03E4765230762670049C28B /* LegacyUI.framework */,
+ D03E47612307625F0049C28B /* LegacyComponents.framework */,
+ D03E4757230762560049C28B /* ItemListAvatarAndNameInfoItem.framework */,
+ D03E4759230762560049C28B /* ItemListPeerActionItem.framework */,
+ D03E475B230762560049C28B /* ItemListPeerItem.framework */,
+ D03E475D230762560049C28B /* ItemListStickerPackItem.framework */,
+ D03E475F230762560049C28B /* ItemListUI.framework */,
+ D03E4755230762460049C28B /* Geocoding.framework */,
+ D03E47532307623E0049C28B /* GalleryUI.framework */,
+ D03E47512307623A0049C28B /* Foundation.framework */,
+ D03E474F230762310049C28B /* Display.framework */,
+ D03E474D230762270049C28B /* DeviceLocationManager.framework */,
+ D03E474B230762200049C28B /* DeviceAccess.framework */,
+ D03E47492307621A0049C28B /* CountrySelectionUI.framework */,
+ D03E4747230762130049C28B /* CoreTelephony.framework */,
+ D03E47452307620C0049C28B /* ContactsPeerItem.framework */,
+ D03E4743230762070049C28B /* ChatListUI.framework */,
+ D03E473F230762020049C28B /* ChatListSearchItemHeader.framework */,
+ D03E4741230762020049C28B /* ChatListSearchItemNode.framework */,
+ D03E473D230761FA0049C28B /* CallListUI.framework */,
+ D03E473B230761F30049C28B /* AvatarNode.framework */,
+ D03E4739230761ED0049C28B /* AsyncDisplayKit.framework */,
+ D03E4737230761EA0049C28B /* AlertUI.framework */,
+ D03E4735230761E50049C28B /* ActivityIndicator.framework */,
+ D03E4733230761E10049C28B /* AccountContext.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D03E464823075D930049C28B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E465223075D930049C28B /* SettingsUI.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D03E464C23075D930049C28B /* SettingsUI */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D03E465523075D930049C28B /* Build configuration list for PBXNativeTarget "SettingsUI" */;
+ buildPhases = (
+ D03E464823075D930049C28B /* Headers */,
+ D03E464923075D930049C28B /* Sources */,
+ D03E464A23075D930049C28B /* Frameworks */,
+ D03E464B23075D930049C28B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SettingsUI;
+ productName = SettingsUI;
+ productReference = D03E464D23075D930049C28B /* SettingsUI.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D03E464423075D930049C28B /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1030;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D03E464C23075D930049C28B = {
+ CreatedOnToolsVersion = 10.3;
+ LastSwiftMigration = 1030;
+ };
+ };
+ };
+ buildConfigurationList = D03E464723075D930049C28B /* Build configuration list for PBXProject "SettingsUI_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D03E464323075D930049C28B;
+ productRefGroup = D03E464E23075D930049C28B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D03E464C23075D930049C28B /* SettingsUI */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D03E464B23075D930049C28B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D03E464923075D930049C28B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E468023075EE90049C28B /* NotificationExceptions.swift in Sources */,
+ D03E46D423075F810049C28B /* ProxySettingsActionItem.swift in Sources */,
+ D03E466923075E660049C28B /* LogoutOptionsController.swift in Sources */,
+ D03E469D23075F2C0049C28B /* SelectivePrivacySettingsController.swift in Sources */,
+ D03E4725230760040049C28B /* WatchSettingsController.swift in Sources */,
+ D03E468D23075F010049C28B /* SettingsSearchResultItem.swift in Sources */,
+ D03E470923075FE40049C28B /* CustomWallpaperPicker.swift in Sources */,
+ D03E46A123075F2C0049C28B /* PasscodeOptionsController.swift in Sources */,
+ D03E470623075FE40049C28B /* ThemeGridSearchColorsItem.swift in Sources */,
+ D03E46B223075F4E0049C28B /* RecentSessionsController.swift in Sources */,
+ D03E471F23075FE40049C28B /* ThemeGridController.swift in Sources */,
+ D03E48B22307767B0049C28B /* CachedFaqInstantPage.swift in Sources */,
+ D03E471A23075FE40049C28B /* WallpaperCropNode.swift in Sources */,
+ D03E46A523075F2C0049C28B /* PrivacyIntroController.swift in Sources */,
+ D03E46A023075F2C0049C28B /* PrivacyIntroControllerNode.swift in Sources */,
+ D03E46C523075F810049C28B /* DataAndStorageSettingsController.swift in Sources */,
+ D03E467923075EC70049C28B /* NotificationsAndSounds.swift in Sources */,
+ D03E470423075FE40049C28B /* ThemeGridSearchItem.swift in Sources */,
+ D03E466E23075E660049C28B /* TabBarAccountSwitchController.swift in Sources */,
+ D03E46D223075F810049C28B /* ShareProxyServerActionSheetController.swift in Sources */,
+ D03E468A23075F010049C28B /* SettingsSearchRecentQueries.swift in Sources */,
+ D03E472023075FE40049C28B /* WallpaperGalleryItem.swift in Sources */,
+ D03E471723075FE40049C28B /* WallpaperGalleryDecorationNode.swift in Sources */,
+ D03E46B123075F4E0049C28B /* ItemListWebsiteItem.swift in Sources */,
+ D03E470723075FE40049C28B /* ThemeSettingsThemeItem.swift in Sources */,
+ D03E46D123075F810049C28B /* ProxyListSettingsController.swift in Sources */,
+ D03E472223075FE40049C28B /* ThemeAutoNightSettingsController.swift in Sources */,
+ D03E470D23075FE40049C28B /* ThemeSettingsController.swift in Sources */,
+ D03E46D023075F810049C28B /* AutodownloadSizeLimitItem.swift in Sources */,
+ D03E46DA23075FA40049C28B /* ArchivedStickerPacksController.swift in Sources */,
+ D03E467323075E660049C28B /* ChangePhoneNumberIntroController.swift in Sources */,
+ D03E466C23075E660049C28B /* ChangePhoneNumberController.swift in Sources */,
+ D03E470123075FE40049C28B /* ThemeSettingsChatPreviewItem.swift in Sources */,
+ D03E471123075FE40049C28B /* WallpaperSearchRecentQueries.swift in Sources */,
+ D03E467023075E660049C28B /* DebugAccountsController.swift in Sources */,
+ D03E46CC23075F810049C28B /* NetworkUsageStatsController.swift in Sources */,
+ D03E466D23075E660049C28B /* EditSettingsController.swift in Sources */,
+ D03E46CD23075F810049C28B /* AutodownloadConnectionTypeController.swift in Sources */,
+ D03E46CB23075F810049C28B /* ProxySettingsServerItem.swift in Sources */,
+ D03E471323075FE40049C28B /* ThemePreviewController.swift in Sources */,
+ D03E48AE230775800049C28B /* OpenSettings.swift in Sources */,
+ D03E46A423075F2C0049C28B /* ForwardPrivacyChatPreviewItem.swift in Sources */,
+ D03E470323075FE40049C28B /* ThemeGridControllerNode.swift in Sources */,
+ D03E468C23075F010049C28B /* SettingsSearchableItems.swift in Sources */,
+ D03E48B0230775F00049C28B /* AccountUtils.swift in Sources */,
+ D03E472B230760330049C28B /* LocalizationListController.swift in Sources */,
+ D03E470F23075FE40049C28B /* ThemeAccentColorController.swift in Sources */,
+ D03E471C23075FE40049C28B /* ThemeSettingsBrightnessItem.swift in Sources */,
+ D03E46B323075F4E0049C28B /* RecentSessionsEmptyStateItem.swift in Sources */,
+ D03E472123075FE40049C28B /* ThemeSettingsAccentColorItem.swift in Sources */,
+ D03E469E23075F2C0049C28B /* ConfirmPhoneNumberController.swift in Sources */,
+ D03E46C723075F810049C28B /* ProxyServerActionSheetController.swift in Sources */,
+ D03E468123075EE90049C28B /* NotificationExceptionControllerNode.swift in Sources */,
+ D03E46C623075F810049C28B /* SaveIncomingMediaController.swift in Sources */,
+ D03E471223075FE40049C28B /* ThemeGridSearchContentNode.swift in Sources */,
+ D03E470223075FE40049C28B /* WallpaperColorPickerNode.swift in Sources */,
+ D03E471023075FE40049C28B /* SettingsThemeWallpaperNode.swift in Sources */,
+ D03E471E23075FE40049C28B /* ThemeColorsGridControllerNode.swift in Sources */,
+ D03E471823075FE40049C28B /* ThemeGridSelectionPanelNode.swift in Sources */,
+ D03E46A223075F2C0049C28B /* PrivacyAndSecurityController.swift in Sources */,
+ D03E46D323075F810049C28B /* AutodownloadMediaCategoryController.swift in Sources */,
+ D03E46DB23075FA40049C28B /* FeaturedStickerPacksController.swift in Sources */,
+ D03E483A23076B220049C28B /* BlurredImageNode.swift in Sources */,
+ D03E471923075FE40049C28B /* ThemeAccentColorControllerNode.swift in Sources */,
+ D03E467F23075EE90049C28B /* NotificationExceptionSettingsController.swift in Sources */,
+ D03E466A23075E660049C28B /* DebugController.swift in Sources */,
+ D03E46C923075F810049C28B /* StorageUsageController.swift in Sources */,
+ D03E470523075FE40049C28B /* ThemeSettingsAppIconItem.swift in Sources */,
+ D03E471523075FE40049C28B /* ThemeSettingsFontSizeItem.swift in Sources */,
+ D03E46AA23075F2C0049C28B /* DataPrivacySettingsController.swift in Sources */,
+ D03E467123075E660049C28B /* SettingsController.swift in Sources */,
+ 091EABA5231DAC7500A0EC14 /* ThemeNameGenerator.swift in Sources */,
+ D03E46A923075F2C0049C28B /* BlockedPeersController.swift in Sources */,
+ D03E469F23075F2C0049C28B /* TwoStepVerificationResetController.swift in Sources */,
+ D03E472A230760330049C28B /* LocalizationListItem.swift in Sources */,
+ D03E46A823075F2C0049C28B /* TwoStepVerificationUnlockController.swift in Sources */,
+ D03E470B23075FE40049C28B /* ThemePreviewControllerNode.swift in Sources */,
+ D03E470823075FE40049C28B /* WallpaperGalleryToolbarNode.swift in Sources */,
+ D03E466F23075E660049C28B /* UsernameSetupController.swift in Sources */,
+ D03E46C823075F810049C28B /* CalculatingCacheSizeItem.swift in Sources */,
+ D03E471423075FE40049C28B /* ThemeColorsGridController.swift in Sources */,
+ D03E46A723075F2C0049C28B /* SelectivePrivacySettingsPeersController.swift in Sources */,
+ D03E46A323075F2C0049C28B /* CreatePasswordController.swift in Sources */,
+ D03E4731230760570049C28B /* TermsOfServiceController.swift in Sources */,
+ D03E46CF23075F810049C28B /* ProxyServerSettingsController.swift in Sources */,
+ D03E468E23075F010049C28B /* SettingsSearchRecentItem.swift in Sources */,
+ D03E467223075E660049C28B /* ChangePhoneNumberCodeController.swift in Sources */,
+ D03E466823075E660049C28B /* TabBarAccountSwitchControllerNode.swift in Sources */,
+ 09B4A9B823102B7A005C2E08 /* EditThemeController.swift in Sources */,
+ D03E471623075FE40049C28B /* WallpaperColorPanelNode.swift in Sources */,
+ D03E470023075FE40049C28B /* ThemeColorsGridControllerItem.swift in Sources */,
+ D03E468B23075F010049C28B /* SettingsSearchItem.swift in Sources */,
+ D03E470E23075FE40049C28B /* WallpaperPatternPanelNode.swift in Sources */,
+ D03E466B23075E660049C28B /* ChangePhoneNumberControllerNode.swift in Sources */,
+ D03E46CA23075F810049C28B /* AutodownloadDataUsagePickerItem.swift in Sources */,
+ D03E470C23075FE40049C28B /* WallpaperGalleryController.swift in Sources */,
+ D03E471D23075FE40049C28B /* ThemeAutoNightTimeSelectionActionSheet.swift in Sources */,
+ D03E46CE23075F810049C28B /* VoiceCallDataSavingController.swift in Sources */,
+ D03E46B023075F4E0049C28B /* ItemListRecentSessionItem.swift in Sources */,
+ D03E471B23075FE40049C28B /* ThemeGridControllerItem.swift in Sources */,
+ D03E467A23075EC70049C28B /* NotificationSearchItem.swift in Sources */,
+ D03E4730230760570049C28B /* TermsOfServiceControllerNode.swift in Sources */,
+ D03E46A623075F2C0049C28B /* TwoStepVerificationPasswordEntryController.swift in Sources */,
+ D03E472C230760330049C28B /* LocalizationListControllerNode.swift in Sources */,
+ D03E46D923075FA40049C28B /* InstalledStickerPacksController.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D03E465323075D930049C28B /* DebugAppStoreLLC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = DebugAppStoreLLC;
+ };
+ D03E465423075D930049C28B /* ReleaseAppStoreLLC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E465623075D930049C28B /* DebugAppStoreLLC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Manual;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.SettingsUI;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = DebugAppStoreLLC;
+ };
+ D03E465723075D930049C28B /* ReleaseAppStoreLLC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Manual;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.SettingsUI;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E465823075DEB0049C28B /* DebugHockeyapp */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = DebugHockeyapp;
+ };
+ D03E465923075DEB0049C28B /* DebugHockeyapp */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Manual;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.SettingsUI;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = DebugHockeyapp;
+ };
+ D03E465A23075DF90049C28B /* ReleaseHockeyappInternal */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = ReleaseHockeyappInternal;
+ };
+ D03E465B23075DF90049C28B /* ReleaseHockeyappInternal */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Manual;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.SettingsUI;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseHockeyappInternal;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ D03E464723075D930049C28B /* Build configuration list for PBXProject "SettingsUI_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E465323075D930049C28B /* DebugAppStoreLLC */,
+ D03E465823075DEB0049C28B /* DebugHockeyapp */,
+ D03E465423075D930049C28B /* ReleaseAppStoreLLC */,
+ D03E465A23075DF90049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D03E465523075D930049C28B /* Build configuration list for PBXNativeTarget "SettingsUI" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E465623075D930049C28B /* DebugAppStoreLLC */,
+ D03E465923075DEB0049C28B /* DebugHockeyapp */,
+ D03E465723075D930049C28B /* ReleaseAppStoreLLC */,
+ D03E465B23075DF90049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D03E464423075D930049C28B /* Project object */;
+}
diff --git a/submodules/SettingsUI/Sources/OpenSettings.swift b/submodules/SettingsUI/Sources/OpenSettings.swift
index 833459e1c2..dcb8580e6f 100644
--- a/submodules/SettingsUI/Sources/OpenSettings.swift
+++ b/submodules/SettingsUI/Sources/OpenSettings.swift
@@ -50,7 +50,7 @@ func openEditSettings(context: AccountContext, accountsAndPeers: Signal<((Accoun
}
openEditingDisposable.set((signal
|> deliverOnMainQueue).start(next: { peer, cachedData, canAddAccounts in
- pushController(editSettingsController(context: context, currentName: .personName(firstName: peer.firstName ?? "", lastName: peer.lastName ?? ""), currentBioText: cachedData.about ?? "", accountManager: context.sharedContext.accountManager, canAddAccounts: canAddAccounts, focusOnItemTag: focusOnItemTag))
+ pushController(editSettingsController(context: context, currentName: .personName(firstName: peer.firstName ?? "", lastName: peer.lastName ?? " "), currentBioText: cachedData.about ?? "", accountManager: context.sharedContext.accountManager, canAddAccounts: canAddAccounts, focusOnItemTag: focusOnItemTag))
}))
return openEditingDisposable
}
diff --git a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift
index 914cabaa17..a60b8858e3 100644
--- a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift
+++ b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift
@@ -85,15 +85,15 @@ final class RecentSessionsEmptyStateItemNode: ItemListControllerEmptyStateItemNo
let imageSize = self.imageNode.image?.size ?? CGSize()
let imageHeight = layout.size.width < layout.size.height ? imageSize.height + imageSpacing : 0.0
- let titleSize = self.titleNode.measure(CGSize(width: layout.size.width - 50.0, height: max(1.0, layout.size.height - insets.top - insets.bottom)))
- let textSize = self.textNode.measure(CGSize(width: layout.size.width - 50.0, height: max(1.0, layout.size.height - insets.top - insets.bottom)))
+ let titleSize = self.titleNode.measure(CGSize(width: layout.size.width - layout.safeInsets.left - layout.safeInsets.right - layout.intrinsicInsets.left - layout.intrinsicInsets.right - 50.0, height: max(1.0, layout.size.height - insets.top - insets.bottom)))
+ let textSize = self.textNode.measure(CGSize(width: layout.size.width - layout.safeInsets.left - layout.safeInsets.right - layout.intrinsicInsets.left - layout.intrinsicInsets.right - 50.0, height: max(1.0, layout.size.height - insets.top - insets.bottom)))
let totalHeight = imageHeight + titleSize.height + textSpacing + textSize.height
let topOffset = insets.top + floor((layout.size.height - insets.top - insets.bottom - totalHeight) / 2.0)
transition.updateAlpha(node: self.imageNode, alpha: imageHeight > 0.0 ? 1.0 : 0.0)
transition.updateFrame(node: self.imageNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - imageSize.width) / 2.0), y: topOffset), size: imageSize))
- transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - titleSize.width) / 2.0), y: topOffset + imageHeight), size: titleSize))
- transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - textSize.width) / 2.0), y: self.titleNode.frame.maxY + textSpacing), size: textSize))
+ transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - titleSize.width - layout.safeInsets.left - layout.safeInsets.right - layout.intrinsicInsets.left - layout.intrinsicInsets.right) / 2.0), y: topOffset + imageHeight), size: titleSize))
+ transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - textSize.width - layout.safeInsets.left - layout.safeInsets.right - layout.intrinsicInsets.left - layout.intrinsicInsets.right) / 2.0), y: self.titleNode.frame.maxY + textSpacing), size: textSize))
}
}
diff --git a/submodules/SettingsUI/Sources/SettingsController.swift b/submodules/SettingsUI/Sources/SettingsController.swift
index c20b24e173..e0d3fc0384 100644
--- a/submodules/SettingsUI/Sources/SettingsController.swift
+++ b/submodules/SettingsUI/Sources/SettingsController.swift
@@ -33,11 +33,33 @@ import WebSearchUI
import PeerAvatarGalleryUI
import MapResourceToAvatarSizes
import AppBundle
+import ContextUI
private let maximumNumberOfAccounts = 3
private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 13.0)!
+private final class ContextControllerContentSourceImpl: ContextControllerContentSource {
+ let controller: ViewController
+ weak var sourceNode: ASDisplayNode?
+
+ init(controller: ViewController, sourceNode: ASDisplayNode?) {
+ self.controller = controller
+ self.sourceNode = sourceNode
+ }
+
+ func transitionInfo() -> ContextControllerTakeControllerInfo? {
+ let sourceNode = self.sourceNode
+ return ContextControllerTakeControllerInfo(contentAreaInScreenSpace: CGRect(origin: CGPoint(), size: CGSize(width: 10.0, height: 10.0)), sourceNode: { [weak sourceNode] in
+ if let sourceNode = sourceNode {
+ return (sourceNode, sourceNode.bounds)
+ } else {
+ return nil
+ }
+ })
+ }
+}
+
private enum SettingsEntryTag: Equatable, ItemListItemTag {
case account(AccountRecordId)
@@ -80,6 +102,7 @@ private struct SettingsItemArguments {
let removeAccount: (AccountRecordId) -> Void
let keepPhone: () -> Void
let openPhoneNumberChange: () -> Void
+ let accountContextAction: (AccountRecordId, ASDisplayNode, ContextGesture?) -> Void
}
private enum SettingsSection: Int32 {
@@ -409,6 +432,8 @@ private enum SettingsEntry: ItemListNodeEntry {
arguments.setAccountIdWithRevealedOptions(lhsAccountId, rhsAccountId)
}, removePeer: { _ in
arguments.removeAccount(account.id)
+ }, contextAction: { node, gesture in
+ arguments.accountContextAction(account.id, node, gesture)
}, tag: SettingsEntryTag.account(account.id))
case let .addAccount(theme, text):
return ItemListPeerActionItem(theme: theme, icon: PresentationResourcesItemList.plusIconImage(theme), title: text, alwaysPlain: false, sectionId: self.section, height: .generic, editing: false, action: {
@@ -627,6 +652,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM
var pushControllerImpl: ((ViewController) -> Void)?
var presentControllerImpl: ((ViewController, Any?) -> Void)?
+ var presentInGlobalOverlayImpl: ((ViewController, Any?) -> Void)?
var dismissInputImpl: (() -> Void)?
var setDisplayNavigationBarImpl: ((Bool) -> Void)?
var getNavigationControllerImpl: (() -> NavigationController?)?
@@ -695,6 +721,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM
return cachedFaqInstantPage(context: context)
}
+ var removeAccountImpl: ((AccountRecordId) -> Void)?
var switchToAccountImpl: ((AccountRecordId) -> Void)?
let displayPhoneNumberConfirmation = ValuePromise(false)
@@ -873,27 +900,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM
return state
}
}, removeAccount: { id in
- let _ = (contextValue.get()
- |> deliverOnMainQueue
- |> take(1)).start(next: { context in
- let presentationData = context.sharedContext.currentPresentationData.with { $0 }
- let controller = ActionSheetController(presentationTheme: presentationData.theme)
- let dismissAction: () -> Void = { [weak controller] in
- controller?.dismissAnimated()
- }
-
- var items: [ActionSheetItem] = []
- items.append(ActionSheetTextItem(title: presentationData.strings.Settings_LogoutConfirmationText.trimmingCharacters(in: .whitespacesAndNewlines)))
- items.append(ActionSheetButtonItem(title: presentationData.strings.Settings_Logout, color: .destructive, action: {
- dismissAction()
- let _ = logoutFromAccount(id: id, accountManager: context.sharedContext.accountManager, alreadyLoggedOutRemotely: false).start()
- }))
- controller.setItemGroups([
- ActionSheetItemGroup(items: items),
- ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
- ])
- presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
- })
+ removeAccountImpl?(id)
}, keepPhone: {
displayPhoneNumberConfirmation.set(false)
}, openPhoneNumberChange: {
@@ -907,6 +914,37 @@ public func settingsController(context: AccountContext, accountManager: AccountM
pushControllerImpl?(ChangePhoneNumberIntroController(context: context, phoneNumber: formatPhoneNumber(phoneNumber)))
})
})
+ }, accountContextAction: { id, node, gesture in
+ var selectedAccount: Account?
+ let _ = (accountsAndPeers.get()
+ |> take(1)
+ |> deliverOnMainQueue).start(next: { accountsAndPeers in
+ for (account, _, _) in accountsAndPeers.1 {
+ if account.id == id {
+ selectedAccount = account
+ break
+ }
+ }
+ })
+ var sharedContext: SharedAccountContext?
+ let _ = (contextValue.get()
+ |> deliverOnMainQueue
+ |> take(1)).start(next: { context in
+ sharedContext = context.sharedContext
+ })
+ if let selectedAccount = selectedAccount, let sharedContext = sharedContext {
+ let accountContext = sharedContext.makeTempAccountContext(account: selectedAccount)
+ let chatListController = accountContext.sharedContext.makeChatListController(context: accountContext, groupId: .root, controlsHistoryPreload: false, hideNetworkActivityStatus: true, enableDebugActions: enableDebugActions)
+
+ let presentationData = accountContext.sharedContext.currentPresentationData.with { $0 }
+
+ let contextController = ContextController(account: accountContext.account, theme: presentationData.theme, strings: presentationData.strings, source: .controller(ContextControllerContentSourceImpl(controller: chatListController, sourceNode: node)), items: accountContextMenuItems(context: accountContext, logout: {
+ removeAccountImpl?(id)
+ }), reactionItems: [], gesture: gesture)
+ presentInGlobalOverlayImpl?(contextController, nil)
+ } else {
+ gesture?.cancel()
+ }
})
changeProfilePhotoImpl = {
@@ -1269,6 +1307,9 @@ public func settingsController(context: AccountContext, accountManager: AccountM
presentControllerImpl = { [weak controller] value, arguments in
controller?.present(value, in: .window(.root), with: arguments ?? ViewControllerPresentationArguments(presentationAnimation: .modalSheet), blockInteraction: true)
}
+ presentInGlobalOverlayImpl = { [weak controller] value, arguments in
+ controller?.presentInGlobalOverlay(value, with: arguments)
+ }
dismissInputImpl = { [weak controller] in
controller?.view.window?.endEditing(true)
}
@@ -1357,6 +1398,29 @@ public func settingsController(context: AccountContext, accountManager: AccountM
}
})
}
+ removeAccountImpl = { id in
+ let _ = (contextValue.get()
+ |> deliverOnMainQueue
+ |> take(1)).start(next: { context in
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ let controller = ActionSheetController(presentationTheme: presentationData.theme)
+ let dismissAction: () -> Void = { [weak controller] in
+ controller?.dismissAnimated()
+ }
+
+ var items: [ActionSheetItem] = []
+ items.append(ActionSheetTextItem(title: presentationData.strings.Settings_LogoutConfirmationText.trimmingCharacters(in: .whitespacesAndNewlines)))
+ items.append(ActionSheetButtonItem(title: presentationData.strings.Settings_Logout, color: .destructive, action: {
+ dismissAction()
+ let _ = logoutFromAccount(id: id, accountManager: context.sharedContext.accountManager, alreadyLoggedOutRemotely: false).start()
+ }))
+ controller.setItemGroups([
+ ActionSheetItemGroup(items: items),
+ ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
+ ])
+ presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ })
+ }
switchToAccountImpl = { id in
let _ = (contextValue.get()
|> take(1)
@@ -1459,3 +1523,28 @@ public func settingsController(context: AccountContext, accountManager: AccountM
return controller
}
+private func accountContextMenuItems(context: AccountContext, logout: @escaping () -> Void) -> Signal<[ContextMenuItem], NoError> {
+ let strings = context.sharedContext.currentPresentationData.with({ $0 }).strings
+ return context.account.postbox.transaction { transaction -> [ContextMenuItem] in
+ var items: [ContextMenuItem] = []
+
+ if !transaction.getUnreadChatListPeerIds(groupId: .root).isEmpty {
+ items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_MarkAllAsRead, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/MarkAsRead"), color: theme.contextMenu.primaryColor) }, action: { _, f in
+ let _ = (context.account.postbox.transaction { transaction in
+ markAllChatsAsReadInteractively(transaction: transaction, viewTracker: context.account.viewTracker, groupId: .root)
+ }
+ |> deliverOnMainQueue).start(completed: {
+ f(.default)
+ })
+ })))
+ }
+
+ items.append(.action(ContextMenuActionItem(text: strings.Settings_Context_Logout, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Logout"), color: theme.contextMenu.destructiveColor) }, action: { _, f in
+ logout()
+ f(.default)
+ })))
+
+ return items
+ }
+}
+
diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift
index e2b5fa9c65..a19644b692 100644
--- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift
@@ -219,7 +219,9 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate
private func updateChatsLayout(layout: ContainerViewLayout, topInset: CGFloat, transition: ContainedViewLayoutTransition) {
var items: [ChatListItem] = []
- let interaction = ChatListNodeInteraction(activateSearch: {}, peerSelected: { _ in }, togglePeerSelected: { _ in }, messageSelected: { _, _, _ in}, groupSelected: { _ in }, addContact: { _ in }, setPeerIdWithRevealedOptions: { _, _ in }, setItemPinned: { _, _ in }, setPeerMuted: { _, _ in }, deletePeer: { _ in }, updatePeerGrouping: { _, _ in }, togglePeerMarkedUnread: { _, _ in}, toggleArchivedFolderHiddenByDefault: {})
+ let interaction = ChatListNodeInteraction(activateSearch: {}, peerSelected: { _ in }, togglePeerSelected: { _ in }, messageSelected: { _, _, _ in}, groupSelected: { _ in }, addContact: { _ in }, setPeerIdWithRevealedOptions: { _, _ in }, setItemPinned: { _, _ in }, setPeerMuted: { _, _ in }, deletePeer: { _ in }, updatePeerGrouping: { _, _ in }, togglePeerMarkedUnread: { _, _ in}, toggleArchivedFolderHiddenByDefault: {}, activateChatPreview: { _, _, gesture in
+ gesture?.cancel()
+ })
let chatListPresentationData = ChatListPresentationData(theme: self.theme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameSortOrder: self.presentationData.nameSortOrder, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: true)
let peers = SimpleDictionary()
diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift
index 5c886122b0..0d7d0f18df 100644
--- a/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift
@@ -231,7 +231,7 @@ private enum ThemeAutoNightSettingsControllerEntry: ItemListNodeEntry {
return ThemeSettingsThemeItem(context: arguments.context, theme: theme, strings: strings, sectionId: self.section, themes: themes, themeSpecificAccentColors: themeSpecificAccentColors, currentTheme: currentTheme, updatedTheme: { theme in
arguments.updateTheme(theme)
}, longTapped: { _ in
- })
+ }, contextAction: nil)
}
}
}
diff --git a/submodules/SettingsUI/Sources/Themes/ThemeNameGenerator.swift b/submodules/SettingsUI/Sources/Themes/ThemeNameGenerator.swift
index 694c1757ef..4668967035 100644
--- a/submodules/SettingsUI/Sources/Themes/ThemeNameGenerator.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeNameGenerator.swift
@@ -335,9 +335,10 @@ func generateThemeName(accentColor: UIColor) -> String {
if let color = nearest?.color, let colorName = colors[color]?.capitalized {
if arc4random() % 2 == 0 {
- return "\(adjectives[Int(arc4random()) % adjectives.count].capitalized) \(colorName)"
+
+ return "\((adjectives.randomElement() ?? "").capitalized) \(colorName)"
} else {
- return "\(colorName) \(subjectives[Int(arc4random()) % subjectives.count].capitalized)"
+ return "\(colorName) \((subjectives.randomElement() ?? "").capitalized)"
}
} else {
return ""
diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift
index 3dec14e542..ab05d1de77 100644
--- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift
@@ -15,6 +15,7 @@ import OverlayStatusController
import AppBundle
public enum ThemePreviewSource {
+ case settings(PresentationThemeReference)
case theme(TelegramTheme)
case slug(String, TelegramMediaFile)
case media(AnyMediaReference)
@@ -83,14 +84,21 @@ public final class ThemePreviewController: ViewController {
themeName = previewTheme.name.string
}
+ var isPreview = false
+ if case .settings = source {
+ isPreview = true
+ }
+
let titleView = CounterContollerTitleView(theme: self.previewTheme)
- titleView.title = CounterContollerTitle(title: themeName, counter: " ")
+ titleView.title = CounterContollerTitle(title: themeName, counter: isPreview ? "" : " ")
self.navigationItem.titleView = titleView
self.statusBar.statusBarStyle = self.previewTheme.rootController.statusBarStyle.style
self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait)
- self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: self.previewTheme.rootController.navigationBar.accentTextColor), style: .plain, target: self, action: #selector(self.actionPressed))
+ if !isPreview {
+ self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: self.previewTheme.rootController.navigationBar.accentTextColor), style: .plain, target: self, action: #selector(self.actionPressed))
+ }
self.disposable = (combineLatest(self.theme.get(), self.presentationTheme.get())
|> deliverOnMainQueue).start(next: { [weak self] theme, presentationTheme in
@@ -134,6 +142,10 @@ public final class ThemePreviewController: ViewController {
override public func loadDisplayNode() {
super.loadDisplayNode()
+ var isPreview = false
+ if case .settings = self.source {
+ isPreview = true
+ }
self.displayNode = ThemePreviewControllerNode(context: self.context, previewTheme: self.previewTheme, dismiss: { [weak self] in
if let strongSelf = self {
strongSelf.dismiss()
@@ -142,7 +154,7 @@ public final class ThemePreviewController: ViewController {
if let strongSelf = self {
strongSelf.apply()
}
- })
+ }, isPreview: isPreview)
self.displayNodeDidLoad()
let previewTheme = self.previewTheme
@@ -166,6 +178,8 @@ public final class ThemePreviewController: ViewController {
let disposable = self.applyDisposable
switch self.source {
+ case let .settings(reference):
+ theme = .single(reference)
case .theme, .slug:
theme = combineLatest(self.theme.get() |> take(1), wallpaperPromise.get() |> take(1))
|> mapToSignal { theme, wallpaper -> Signal in
@@ -334,6 +348,8 @@ public final class ThemePreviewController: ViewController {
let subject: ShareControllerSubject
let preferredAction: ShareControllerPreferredAction
switch self.source {
+ case let .settings(reference):
+ return
case let .theme(theme):
subject = .url("https://t.me/addtheme/\(theme.slug)")
preferredAction = .default
diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift
index 10ce1e8cd2..6ee2654fd2 100644
--- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift
@@ -31,6 +31,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
private let context: AccountContext
private var previewTheme: PresentationTheme
private var presentationData: PresentationData
+ private let isPreview: Bool
public let wallpaperPromise = Promise()
@@ -59,9 +60,10 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
private var statusDisposable: Disposable?
private var fetchDisposable = MetaDisposable()
- init(context: AccountContext, previewTheme: PresentationTheme, dismiss: @escaping () -> Void, apply: @escaping () -> Void) {
+ init(context: AccountContext, previewTheme: PresentationTheme, dismiss: @escaping () -> Void, apply: @escaping () -> Void, isPreview: Bool) {
self.context = context
self.previewTheme = previewTheme
+ self.isPreview = isPreview
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
@@ -83,6 +85,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
self.chatListBackgroundNode = ASDisplayNode()
self.chatContainerNode = ASDisplayNode()
+ self.chatContainerNode.clipsToBounds = true
self.instantChatBackgroundNode = WallpaperBackgroundNode()
self.instantChatBackgroundNode.displaysAsynchronously = false
self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: previewTheme, wallpaper: previewTheme.chat.defaultWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper)
@@ -94,7 +97,6 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
self.remoteChatBackgroundNode.view.contentMode = .scaleAspectFill
self.blurredNode = BlurredImageNode()
- self.blurredNode.clipsToBounds = true
self.blurredNode.blurView.contentMode = .scaleAspectFill
self.toolbarNode = WallpaperGalleryToolbarNode(theme: self.previewTheme, strings: self.presentationData.strings)
@@ -131,9 +133,11 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
self.addSubnode(self.scrollNode)
self.chatListBackgroundNode.addSubnode(self.maskNode)
- self.addSubnode(self.pageControlBackgroundNode)
- self.addSubnode(self.pageControlNode)
- self.addSubnode(self.toolbarNode)
+ if !isPreview {
+ self.addSubnode(self.pageControlBackgroundNode)
+ self.addSubnode(self.pageControlNode)
+ self.addSubnode(self.toolbarNode)
+ }
self.scrollNode.addSubnode(self.chatListBackgroundNode)
self.scrollNode.addSubnode(self.chatContainerNode)
@@ -307,7 +311,9 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
private func updateChatsLayout(layout: ContainerViewLayout, topInset: CGFloat, transition: ContainedViewLayoutTransition) {
var items: [ChatListItem] = []
- let interaction = ChatListNodeInteraction(activateSearch: {}, peerSelected: { _ in }, togglePeerSelected: { _ in }, messageSelected: { _, _, _ in}, groupSelected: { _ in }, addContact: { _ in }, setPeerIdWithRevealedOptions: { _, _ in }, setItemPinned: { _, _ in }, setPeerMuted: { _, _ in }, deletePeer: { _ in }, updatePeerGrouping: { _, _ in }, togglePeerMarkedUnread: { _, _ in}, toggleArchivedFolderHiddenByDefault: {})
+ let interaction = ChatListNodeInteraction(activateSearch: {}, peerSelected: { _ in }, togglePeerSelected: { _ in }, messageSelected: { _, _, _ in}, groupSelected: { _ in }, addContact: { _ in }, setPeerIdWithRevealedOptions: { _, _ in }, setItemPinned: { _, _ in }, setPeerMuted: { _, _ in }, deletePeer: { _ in }, updatePeerGrouping: { _, _ in }, togglePeerMarkedUnread: { _, _ in}, toggleArchivedFolderHiddenByDefault: {}, activateChatPreview: { _, _, gesture in
+ gesture?.cancel()
+ })
let chatListPresentationData = ChatListPresentationData(theme: self.previewTheme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameSortOrder: self.presentationData.nameSortOrder, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: true)
let peers = SimpleDictionary()
@@ -473,7 +479,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
self.toolbarNode.updateLayout(size: CGSize(width: layout.size.width, height: 49.0), layout: layout, transition: transition)
self.updateChatsLayout(layout: layout, topInset: navigationBarHeight, transition: transition)
- self.updateMessagesLayout(layout: layout, bottomInset: toolbarHeight + 66.0, transition: transition)
+ self.updateMessagesLayout(layout: layout, bottomInset: self.isPreview ? 0.0 : (toolbarHeight + 66.0), transition: transition)
let pageControlSize = self.pageControlNode.measure(CGSize(width: bounds.width, height: 100.0))
let pageControlFrame = CGRect(origin: CGPoint(x: floor((bounds.width - pageControlSize.width) / 2.0), y: layout.size.height - toolbarHeight - 42.0), size: pageControlSize)
diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift
index ee5d080a37..2a64b7db9a 100644
--- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift
@@ -11,6 +11,28 @@ import AlertUI
import WallpaperResources
import ShareController
import AccountContext
+import ContextUI
+
+private final class ContextControllerContentSourceImpl: ContextControllerContentSource {
+ let controller: ViewController
+ weak var sourceNode: ASDisplayNode?
+
+ init(controller: ViewController, sourceNode: ASDisplayNode?) {
+ self.controller = controller
+ self.sourceNode = sourceNode
+ }
+
+ func transitionInfo() -> ContextControllerTakeControllerInfo? {
+ let sourceNode = self.sourceNode
+ return ContextControllerTakeControllerInfo(contentAreaInScreenSpace: CGRect(origin: CGPoint(), size: CGSize(width: 10.0, height: 10.0)), sourceNode: { [weak sourceNode] in
+ if let sourceNode = sourceNode {
+ return (sourceNode, sourceNode.bounds)
+ } else {
+ return nil
+ }
+ })
+ }
+}
func themeDisplayName(strings: PresentationStrings, reference: PresentationThemeReference) -> String {
let name: String
@@ -47,8 +69,9 @@ private final class ThemeSettingsControllerArguments {
let selectAppIcon: (String) -> Void
let presentThemeMenu: (PresentationThemeReference, Bool) -> Void
let editTheme: (PresentationCloudTheme) -> Void
+ let contextAction: (Bool, PresentationThemeReference, ASDisplayNode, ContextGesture?) -> Void
- init(context: AccountContext, updateTheme: @escaping (PresentationThemeReference) -> Void, selectFontSize: @escaping (PresentationFontSize) -> Void, openWallpaperSettings: @escaping () -> Void, selectAccentColor: @escaping (PresentationThemeAccentColor) -> Void, openAccentColorPicker: @escaping (PresentationThemeReference, PresentationThemeAccentColor?) -> Void, openAutoNightTheme: @escaping () -> Void, toggleLargeEmoji: @escaping (Bool) -> Void, disableAnimations: @escaping (Bool) -> Void, selectAppIcon: @escaping (String) -> Void, presentThemeMenu: @escaping (PresentationThemeReference, Bool) -> Void, editTheme: @escaping (PresentationCloudTheme) -> Void) {
+ init(context: AccountContext, updateTheme: @escaping (PresentationThemeReference) -> Void, selectFontSize: @escaping (PresentationFontSize) -> Void, openWallpaperSettings: @escaping () -> Void, selectAccentColor: @escaping (PresentationThemeAccentColor) -> Void, openAccentColorPicker: @escaping (PresentationThemeReference, PresentationThemeAccentColor?) -> Void, openAutoNightTheme: @escaping () -> Void, toggleLargeEmoji: @escaping (Bool) -> Void, disableAnimations: @escaping (Bool) -> Void, selectAppIcon: @escaping (String) -> Void, presentThemeMenu: @escaping (PresentationThemeReference, Bool) -> Void, editTheme: @escaping (PresentationCloudTheme) -> Void, contextAction: @escaping (Bool, PresentationThemeReference, ASDisplayNode, ContextGesture?) -> Void) {
self.context = context
self.updateTheme = updateTheme
self.selectFontSize = selectFontSize
@@ -61,6 +84,7 @@ private final class ThemeSettingsControllerArguments {
self.selectAppIcon = selectAppIcon
self.presentThemeMenu = presentThemeMenu
self.editTheme = editTheme
+ self.contextAction = contextAction
}
}
@@ -300,7 +324,9 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry {
arguments.updateTheme(theme)
}
}, longTapped: { theme in
- arguments.presentThemeMenu(theme, theme.index == currentTheme.index)
+ //arguments.presentThemeMenu(theme, theme.index == currentTheme.index)
+ }, contextAction: { theme, node, gesture in
+ arguments.contextAction(theme.index == currentTheme.index, theme, node, gesture)
})
case let .iconHeader(theme, text):
return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section)
@@ -368,6 +394,7 @@ private func themeSettingsControllerEntries(presentationData: PresentationData,
public func themeSettingsController(context: AccountContext, focusOnItemTag: ThemeSettingsEntryTag? = nil) -> ViewController {
var pushControllerImpl: ((ViewController) -> Void)?
var presentControllerImpl: ((ViewController, Any?) -> Void)?
+ var presentInGlobalOverlayImpl: ((ViewController, Any?) -> Void)?
var getNavigationControllerImpl: (() -> NavigationController?)?
var updateThemeImpl: ((PresentationThemeReference) -> Void)?
@@ -500,6 +527,77 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
}
})
presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ }, contextAction: { isCurrent, reference, node, gesture in
+ let _ = (context.account.postbox.transaction { transaction in
+ return makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: reference, accentColor: nil, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: .blue)
+ }
+ |> deliverOnMainQueue).start(next: { theme in
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ let strings = presentationData.strings
+ let themeController = ThemePreviewController(context: context, previewTheme: theme, source: .settings(reference))
+ var items: [ContextMenuItem] = []
+
+ items.append(.action(ContextMenuActionItem(text: strings.Theme_Context_Apply, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/ApplyTheme"), color: theme.contextMenu.primaryColor) }, action: { c, f in
+ c.dismiss(completion: {
+ updateThemeImpl?(reference)
+ })
+ })))
+
+ if case let .cloud(theme) = reference {
+ if theme.theme.isCreator {
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.Appearance_EditTheme, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { c, f in
+ let controller = editThemeController(context: context, mode: .edit(theme), navigateToChat: { peerId in
+ if let navigationController = getNavigationControllerImpl?() {
+ context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
+ }
+ })
+
+ c.dismiss(completion: {
+ presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ })
+ })))
+ }
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.Appearance_ShareTheme, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Share"), color: theme.contextMenu.primaryColor) }, action: { c, f in
+ c.dismiss(completion: {
+ let controller = ShareController(context: context, subject: .url("https://t.me/addtheme/\(theme.theme.slug)"), preferredAction: .default)
+ presentControllerImpl?(controller, nil)
+ })
+ })))
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.Appearance_RemoveTheme, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { c, f in
+ c.dismiss(completion: {
+ let actionSheet = ActionSheetController(presentationTheme: presentationData.theme)
+ var items: [ActionSheetItem] = []
+ items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_RemoveThemeConfirmation, color: .destructive, action: { [weak actionSheet] in
+ actionSheet?.dismissAnimated()
+ let _ = (cloudThemes.get() |> delay(0.5, queue: Queue.mainQueue())
+ |> take(1)
+ |> deliverOnMainQueue).start(next: { themes in
+ if isCurrent, let themeIndex = themes.firstIndex(where: { $0.id == theme.theme.id }) {
+ let newTheme: PresentationThemeReference
+ if themeIndex > 0 {
+ newTheme = .cloud(PresentationCloudTheme(theme: themes[themeIndex - 1], resolvedWallpaper: nil))
+ } else {
+ newTheme = .builtin(.nightAccent)
+ }
+ updateThemeImpl?(newTheme)
+ }
+
+ let _ = deleteThemeInteractively(account: context.account, accountManager: context.sharedContext.accountManager, theme: theme.theme).start()
+ })
+ }))
+ actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [
+ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in
+ actionSheet?.dismissAnimated()
+ })
+ ])])
+ presentControllerImpl?(actionSheet, nil)
+ })
+ })))
+ }
+
+ let contextController = ContextController(account: context.account, theme: presentationData.theme, strings: presentationData.strings, source: .controller(ContextControllerContentSourceImpl(controller: themeController, sourceNode: node)), items: .single(items), reactionItems: [], gesture: gesture)
+ presentInGlobalOverlayImpl?(contextController, nil)
+ })
})
let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]), cloudThemes.get(), availableAppIcons, currentAppIconName.get())
@@ -548,6 +646,9 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
presentControllerImpl = { [weak controller] c, a in
controller?.present(c, in: .window(.root), with: a, blockInteraction: true)
}
+ presentInGlobalOverlayImpl = { [weak controller] c, a in
+ controller?.presentInGlobalOverlay(c, with: a)
+ }
getNavigationControllerImpl = { [weak controller] in
return controller?.navigationController as? NavigationController
}
diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift
index e4ed343a2d..098a9c21e6 100644
--- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift
@@ -11,6 +11,7 @@ import ItemListUI
import WallpaperResources
import AccountContext
import AppBundle
+import ContextUI
private var borderImages: [String: UIImage] = [:]
@@ -88,9 +89,10 @@ class ThemeSettingsThemeItem: ListViewItem, ItemListItem {
let currentTheme: PresentationThemeReference
let updatedTheme: (PresentationThemeReference) -> Void
let longTapped: (PresentationThemeReference) -> Void
+ let contextAction: ((PresentationThemeReference, ASDisplayNode, ContextGesture?) -> Void)?
let tag: ItemListItemTag?
- init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings, sectionId: ItemListSectionId, themes: [PresentationThemeReference], themeSpecificAccentColors: [Int64: PresentationThemeAccentColor], currentTheme: PresentationThemeReference, updatedTheme: @escaping (PresentationThemeReference) -> Void, longTapped: @escaping (PresentationThemeReference) -> Void, tag: ItemListItemTag? = nil) {
+ init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings, sectionId: ItemListSectionId, themes: [PresentationThemeReference], themeSpecificAccentColors: [Int64: PresentationThemeAccentColor], currentTheme: PresentationThemeReference, updatedTheme: @escaping (PresentationThemeReference) -> Void, longTapped: @escaping (PresentationThemeReference) -> Void, contextAction: ((PresentationThemeReference, ASDisplayNode, ContextGesture?) -> Void)?, tag: ItemListItemTag? = nil) {
self.context = context
self.theme = theme
self.strings = strings
@@ -99,6 +101,7 @@ class ThemeSettingsThemeItem: ListViewItem, ItemListItem {
self.currentTheme = currentTheme
self.updatedTheme = updatedTheme
self.longTapped = longTapped
+ self.contextAction = contextAction
self.tag = tag
self.sectionId = sectionId
}
@@ -138,11 +141,13 @@ class ThemeSettingsThemeItem: ListViewItem, ItemListItem {
}
private final class ThemeSettingsThemeItemIconNode : ASDisplayNode {
+ private let containerNode: ContextControllerSourceNode
private let imageNode: TransformImageNode
private let overlayNode: ASImageNode
private let textNode: ASTextNode
private var action: (() -> Void)?
private var longTapAction: (() -> Void)?
+ private var contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?
private var theme: PresentationThemeReference?
private var currentTheme: PresentationTheme?
@@ -151,6 +156,8 @@ private final class ThemeSettingsThemeItemIconNode : ASDisplayNode {
private var selected: Bool?
override init() {
+ self.containerNode = ContextControllerSourceNode()
+
self.imageNode = TransformImageNode()
self.imageNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 98.0, height: 62.0))
self.imageNode.isLayerBacked = true
@@ -165,12 +172,21 @@ private final class ThemeSettingsThemeItemIconNode : ASDisplayNode {
super.init()
- self.addSubnode(self.imageNode)
- self.addSubnode(self.overlayNode)
- self.addSubnode(self.textNode)
+ self.addSubnode(self.containerNode)
+ self.containerNode.addSubnode(self.imageNode)
+ self.containerNode.addSubnode(self.overlayNode)
+ self.containerNode.addSubnode(self.textNode)
+
+ self.containerNode.activated = { [weak self] gesture in
+ guard let strongSelf = self else {
+ gesture.cancel()
+ return
+ }
+ strongSelf.contextAction?(strongSelf.containerNode, gesture)
+ }
}
- func setup(context: AccountContext, theme: PresentationThemeReference, accentColor: UIColor?, currentTheme: PresentationTheme, title: NSAttributedString, bordered: Bool, selected: Bool, action: @escaping () -> Void, longTapAction: @escaping () -> Void) {
+ func setup(context: AccountContext, theme: PresentationThemeReference, accentColor: UIColor?, currentTheme: PresentationTheme, title: NSAttributedString, bordered: Bool, selected: Bool, action: @escaping () -> Void, longTapAction: @escaping () -> Void, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?) {
let updatedTheme = self.currentTheme == nil || currentTheme !== self.currentTheme!
if case let .cloud(theme) = theme, theme.theme.file == nil {
if updatedTheme || accentColor != self.accentColor {
@@ -198,6 +214,8 @@ private final class ThemeSettingsThemeItemIconNode : ASDisplayNode {
self.longTapAction = {
longTapAction()
}
+ self.contextAction = contextAction
+ self.containerNode.isGestureEnabled = !selected
}
override func didLoad() {
@@ -234,6 +252,8 @@ private final class ThemeSettingsThemeItemIconNode : ASDisplayNode {
let bounds = self.bounds
+ self.containerNode.frame = CGRect(origin: CGPoint(), size: bounds.size)
+
let imageSize = CGSize(width: 98.0, height: 62.0)
self.imageNode.frame = CGRect(origin: CGPoint(x: 10.0, y: 14.0), size: imageSize)
let makeLayout = self.imageNode.asyncLayout()
@@ -381,6 +401,11 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode {
}
}, longTapAction: {
item.longTapped(theme)
+ }, contextAction: item.contextAction.flatMap {
+ contextAction in
+ return { node, gesture in
+ contextAction(theme, node, gesture)
+ }
})
imageNode.frame = CGRect(origin: CGPoint(x: nodeOffset, y: 0.0), size: nodeSize)
diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift
index 40df63d7b4..58354b3e1e 100644
--- a/submodules/TelegramApi/Sources/Api0.swift
+++ b/submodules/TelegramApi/Sources/Api0.swift
@@ -5,6 +5,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[570911930] = { return $0.readInt64() }
dict[571523412] = { return $0.readDouble() }
dict[-1255641564] = { return parseString($0) }
+ dict[-475111160] = { return Api.MessageReactionsList.parse_messageReactionsList($0) }
dict[-1240849242] = { return Api.messages.StickerSet.parse_stickerSet($0) }
dict[-457104426] = { return Api.InputGeoPoint.parse_inputGeoPointEmpty($0) }
dict[-206066487] = { return Api.InputGeoPoint.parse_inputGeoPoint($0) }
@@ -240,6 +241,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[967122427] = { return Api.Update.parse_updateNewScheduledMessage($0) }
dict[-1870238482] = { return Api.Update.parse_updateDeleteScheduledMessages($0) }
dict[-2112423005] = { return Api.Update.parse_updateTheme($0) }
+ dict[357013699] = { return Api.Update.parse_updateMessageReactions($0) }
dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) }
dict[-373643672] = { return Api.FolderPeer.parse_folderPeer($0) }
dict[367766557] = { return Api.ChannelParticipant.parse_channelParticipant($0) }
@@ -281,6 +283,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[1012306921] = { return Api.InputTheme.parse_inputTheme($0) }
dict[-175567375] = { return Api.InputTheme.parse_inputThemeSlug($0) }
dict[1158290442] = { return Api.messages.FoundGifs.parse_foundGifs($0) }
+ dict[-1199954735] = { return Api.MessageReactions.parse_messageReactions($0) }
dict[-1132476723] = { return Api.FileLocation.parse_fileLocationToBeDeprecated($0) }
dict[-716006138] = { return Api.Poll.parse_poll($0) }
dict[423314455] = { return Api.InputNotifyPeer.parse_inputNotifyUsers($0) }
@@ -558,7 +561,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1820043071] = { return Api.User.parse_user($0) }
dict[-2082087340] = { return Api.Message.parse_messageEmpty($0) }
dict[-1642487306] = { return Api.Message.parse_messageService($0) }
- dict[1160515173] = { return Api.Message.parse_message($0) }
+ dict[-1752573244] = { return Api.Message.parse_message($0) }
dict[186120336] = { return Api.messages.RecentStickers.parse_recentStickersNotModified($0) }
dict[586395571] = { return Api.messages.RecentStickers.parse_recentStickers($0) }
dict[-182231723] = { return Api.InputFileLocation.parse_inputEncryptedFileLocation($0) }
@@ -612,6 +615,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1625153079] = { return Api.InputWebFileLocation.parse_inputWebFileGeoPointLocation($0) }
dict[-332168592] = { return Api.MessageFwdHeader.parse_messageFwdHeader($0) }
dict[398898678] = { return Api.help.Support.parse_support($0) }
+ dict[1873957073] = { return Api.ReactionCount.parse_reactionCount($0) }
dict[1474492012] = { return Api.MessagesFilter.parse_inputMessagesFilterEmpty($0) }
dict[-1777752804] = { return Api.MessagesFilter.parse_inputMessagesFilterPhotos($0) }
dict[-1614803355] = { return Api.MessagesFilter.parse_inputMessagesFilterVideo($0) }
@@ -638,6 +642,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-290921362] = { return Api.upload.CdnFile.parse_cdnFileReuploadNeeded($0) }
dict[-1449145777] = { return Api.upload.CdnFile.parse_cdnFile($0) }
dict[415997816] = { return Api.help.InviteText.parse_inviteText($0) }
+ dict[-764945220] = { return Api.MessageUserReaction.parse_messageUserReaction($0) }
dict[-1937807902] = { return Api.BotInlineMessage.parse_botInlineMessageText($0) }
dict[982505656] = { return Api.BotInlineMessage.parse_botInlineMessageMediaGeo($0) }
dict[1984755728] = { return Api.BotInlineMessage.parse_botInlineMessageMediaAuto($0) }
@@ -837,6 +842,8 @@ public struct Api {
public static func serializeObject(_ object: Any, buffer: Buffer, boxed: Swift.Bool) {
switch object {
+ case let _1 as Api.MessageReactionsList:
+ _1.serialize(buffer, boxed)
case let _1 as Api.messages.StickerSet:
_1.serialize(buffer, boxed)
case let _1 as Api.InputGeoPoint:
@@ -969,6 +976,8 @@ public struct Api {
_1.serialize(buffer, boxed)
case let _1 as Api.messages.FoundGifs:
_1.serialize(buffer, boxed)
+ case let _1 as Api.MessageReactions:
+ _1.serialize(buffer, boxed)
case let _1 as Api.FileLocation:
_1.serialize(buffer, boxed)
case let _1 as Api.Poll:
@@ -1257,6 +1266,8 @@ public struct Api {
_1.serialize(buffer, boxed)
case let _1 as Api.help.Support:
_1.serialize(buffer, boxed)
+ case let _1 as Api.ReactionCount:
+ _1.serialize(buffer, boxed)
case let _1 as Api.MessagesFilter:
_1.serialize(buffer, boxed)
case let _1 as Api.messages.Dialogs:
@@ -1267,6 +1278,8 @@ public struct Api {
_1.serialize(buffer, boxed)
case let _1 as Api.help.InviteText:
_1.serialize(buffer, boxed)
+ case let _1 as Api.MessageUserReaction:
+ _1.serialize(buffer, boxed)
case let _1 as Api.BotInlineMessage:
_1.serialize(buffer, boxed)
case let _1 as Api.InputPeerNotifySettings:
diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift
index c564b24423..dea26f3ed2 100644
--- a/submodules/TelegramApi/Sources/Api1.swift
+++ b/submodules/TelegramApi/Sources/Api1.swift
@@ -1,4 +1,66 @@
public extension Api {
+ public enum MessageReactionsList: TypeConstructorDescription {
+ case messageReactionsList(flags: Int32, count: Int32, reactions: [Api.MessageUserReaction], users: [Api.User], nextOffset: String?)
+
+ public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
+ switch self {
+ case .messageReactionsList(let flags, let count, let reactions, let users, let nextOffset):
+ if boxed {
+ buffer.appendInt32(-475111160)
+ }
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ serializeInt32(count, buffer: buffer, boxed: false)
+ buffer.appendInt32(481674261)
+ buffer.appendInt32(Int32(reactions.count))
+ for item in reactions {
+ item.serialize(buffer, true)
+ }
+ buffer.appendInt32(481674261)
+ buffer.appendInt32(Int32(users.count))
+ for item in users {
+ item.serialize(buffer, true)
+ }
+ if Int(flags) & Int(1 << 0) != 0 {serializeString(nextOffset!, buffer: buffer, boxed: false)}
+ break
+ }
+ }
+
+ public func descriptionFields() -> (String, [(String, Any)]) {
+ switch self {
+ case .messageReactionsList(let flags, let count, let reactions, let users, let nextOffset):
+ return ("messageReactionsList", [("flags", flags), ("count", count), ("reactions", reactions), ("users", users), ("nextOffset", nextOffset)])
+ }
+ }
+
+ public static func parse_messageReactionsList(_ reader: BufferReader) -> MessageReactionsList? {
+ var _1: Int32?
+ _1 = reader.readInt32()
+ var _2: Int32?
+ _2 = reader.readInt32()
+ var _3: [Api.MessageUserReaction]?
+ if let _ = reader.readInt32() {
+ _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageUserReaction.self)
+ }
+ var _4: [Api.User]?
+ if let _ = reader.readInt32() {
+ _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self)
+ }
+ var _5: String?
+ if Int(_1!) & Int(1 << 0) != 0 {_5 = parseString(reader) }
+ let _c1 = _1 != nil
+ let _c2 = _2 != nil
+ let _c3 = _3 != nil
+ let _c4 = _4 != nil
+ let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil
+ if _c1 && _c2 && _c3 && _c4 && _c5 {
+ return Api.MessageReactionsList.messageReactionsList(flags: _1!, count: _2!, reactions: _3!, users: _4!, nextOffset: _5)
+ }
+ else {
+ return nil
+ }
+ }
+
+ }
public enum InputGeoPoint: TypeConstructorDescription {
case inputGeoPointEmpty
case inputGeoPoint(lat: Double, long: Double)
@@ -4082,6 +4144,7 @@ public extension Api {
case updateNewScheduledMessage(message: Api.Message)
case updateDeleteScheduledMessages(peer: Api.Peer, messages: [Int32])
case updateTheme(theme: Api.Theme)
+ case updateMessageReactions(peer: Api.Peer, msgId: Int32, reactions: Api.MessageReactions)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
@@ -4706,6 +4769,14 @@ public extension Api {
}
theme.serialize(buffer, true)
break
+ case .updateMessageReactions(let peer, let msgId, let reactions):
+ if boxed {
+ buffer.appendInt32(357013699)
+ }
+ peer.serialize(buffer, true)
+ serializeInt32(msgId, buffer: buffer, boxed: false)
+ reactions.serialize(buffer, true)
+ break
}
}
@@ -4859,6 +4930,8 @@ public extension Api {
return ("updateDeleteScheduledMessages", [("peer", peer), ("messages", messages)])
case .updateTheme(let theme):
return ("updateTheme", [("theme", theme)])
+ case .updateMessageReactions(let peer, let msgId, let reactions):
+ return ("updateMessageReactions", [("peer", peer), ("msgId", msgId), ("reactions", reactions)])
}
}
@@ -6117,6 +6190,27 @@ public extension Api {
return nil
}
}
+ public static func parse_updateMessageReactions(_ reader: BufferReader) -> Update? {
+ var _1: Api.Peer?
+ if let signature = reader.readInt32() {
+ _1 = Api.parse(reader, signature: signature) as? Api.Peer
+ }
+ var _2: Int32?
+ _2 = reader.readInt32()
+ var _3: Api.MessageReactions?
+ if let signature = reader.readInt32() {
+ _3 = Api.parse(reader, signature: signature) as? Api.MessageReactions
+ }
+ let _c1 = _1 != nil
+ let _c2 = _2 != nil
+ let _c3 = _3 != nil
+ if _c1 && _c2 && _c3 {
+ return Api.Update.updateMessageReactions(peer: _1!, msgId: _2!, reactions: _3!)
+ }
+ else {
+ return nil
+ }
+ }
}
public enum PopularContact: TypeConstructorDescription {
@@ -7072,6 +7166,50 @@ public extension Api {
}
}
+ }
+ public enum MessageReactions: TypeConstructorDescription {
+ case messageReactions(flags: Int32, results: [Api.ReactionCount])
+
+ public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
+ switch self {
+ case .messageReactions(let flags, let results):
+ if boxed {
+ buffer.appendInt32(-1199954735)
+ }
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ buffer.appendInt32(481674261)
+ buffer.appendInt32(Int32(results.count))
+ for item in results {
+ item.serialize(buffer, true)
+ }
+ break
+ }
+ }
+
+ public func descriptionFields() -> (String, [(String, Any)]) {
+ switch self {
+ case .messageReactions(let flags, let results):
+ return ("messageReactions", [("flags", flags), ("results", results)])
+ }
+ }
+
+ public static func parse_messageReactions(_ reader: BufferReader) -> MessageReactions? {
+ var _1: Int32?
+ _1 = reader.readInt32()
+ var _2: [Api.ReactionCount]?
+ if let _ = reader.readInt32() {
+ _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ReactionCount.self)
+ }
+ let _c1 = _1 != nil
+ let _c2 = _2 != nil
+ if _c1 && _c2 {
+ return Api.MessageReactions.messageReactions(flags: _1!, results: _2!)
+ }
+ else {
+ return nil
+ }
+ }
+
}
public enum FileLocation: TypeConstructorDescription {
case fileLocationToBeDeprecated(volumeId: Int64, localId: Int32)
@@ -14184,7 +14322,7 @@ public extension Api {
public enum Message: TypeConstructorDescription {
case messageEmpty(id: Int32)
case messageService(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, replyToMsgId: Int32?, date: Int32, action: Api.MessageAction)
- case message(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, restrictionReason: [Api.RestrictionReason]?)
+ case message(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, reactions: Api.MessageReactions?, restrictionReason: [Api.RestrictionReason]?)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
@@ -14206,9 +14344,9 @@ public extension Api {
serializeInt32(date, buffer: buffer, boxed: false)
action.serialize(buffer, true)
break
- case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let restrictionReason):
+ case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let reactions, let restrictionReason):
if boxed {
- buffer.appendInt32(1160515173)
+ buffer.appendInt32(-1752573244)
}
serializeInt32(flags, buffer: buffer, boxed: false)
serializeInt32(id, buffer: buffer, boxed: false)
@@ -14230,6 +14368,7 @@ public extension Api {
if Int(flags) & Int(1 << 15) != 0 {serializeInt32(editDate!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 16) != 0 {serializeString(postAuthor!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 17) != 0 {serializeInt64(groupedId!, buffer: buffer, boxed: false)}
+ if Int(flags) & Int(1 << 20) != 0 {reactions!.serialize(buffer, true)}
if Int(flags) & Int(1 << 22) != 0 {buffer.appendInt32(481674261)
buffer.appendInt32(Int32(restrictionReason!.count))
for item in restrictionReason! {
@@ -14245,8 +14384,8 @@ public extension Api {
return ("messageEmpty", [("id", id)])
case .messageService(let flags, let id, let fromId, let toId, let replyToMsgId, let date, let action):
return ("messageService", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("replyToMsgId", replyToMsgId), ("date", date), ("action", action)])
- case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let restrictionReason):
- return ("message", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyToMsgId", replyToMsgId), ("date", date), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("views", views), ("editDate", editDate), ("postAuthor", postAuthor), ("groupedId", groupedId), ("restrictionReason", restrictionReason)])
+ case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let reactions, let restrictionReason):
+ return ("message", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyToMsgId", replyToMsgId), ("date", date), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("views", views), ("editDate", editDate), ("postAuthor", postAuthor), ("groupedId", groupedId), ("reactions", reactions), ("restrictionReason", restrictionReason)])
}
}
@@ -14337,9 +14476,13 @@ public extension Api {
if Int(_1!) & Int(1 << 16) != 0 {_15 = parseString(reader) }
var _16: Int64?
if Int(_1!) & Int(1 << 17) != 0 {_16 = reader.readInt64() }
- var _17: [Api.RestrictionReason]?
+ var _17: Api.MessageReactions?
+ if Int(_1!) & Int(1 << 20) != 0 {if let signature = reader.readInt32() {
+ _17 = Api.parse(reader, signature: signature) as? Api.MessageReactions
+ } }
+ var _18: [Api.RestrictionReason]?
if Int(_1!) & Int(1 << 22) != 0 {if let _ = reader.readInt32() {
- _17 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self)
+ _18 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self)
} }
let _c1 = _1 != nil
let _c2 = _2 != nil
@@ -14357,9 +14500,10 @@ public extension Api {
let _c14 = (Int(_1!) & Int(1 << 15) == 0) || _14 != nil
let _c15 = (Int(_1!) & Int(1 << 16) == 0) || _15 != nil
let _c16 = (Int(_1!) & Int(1 << 17) == 0) || _16 != nil
- let _c17 = (Int(_1!) & Int(1 << 22) == 0) || _17 != nil
- if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 {
- return Api.Message.message(flags: _1!, id: _2!, fromId: _3, toId: _4!, fwdFrom: _5, viaBotId: _6, replyToMsgId: _7, date: _8!, message: _9!, media: _10, replyMarkup: _11, entities: _12, views: _13, editDate: _14, postAuthor: _15, groupedId: _16, restrictionReason: _17)
+ let _c17 = (Int(_1!) & Int(1 << 20) == 0) || _17 != nil
+ let _c18 = (Int(_1!) & Int(1 << 22) == 0) || _18 != nil
+ if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 {
+ return Api.Message.message(flags: _1!, id: _2!, fromId: _3, toId: _4!, fwdFrom: _5, viaBotId: _6, replyToMsgId: _7, date: _8!, message: _9!, media: _10, replyMarkup: _11, entities: _12, views: _13, editDate: _14, postAuthor: _15, groupedId: _16, reactions: _17, restrictionReason: _18)
}
else {
return nil
@@ -15852,6 +15996,48 @@ public extension Api {
}
}
+ }
+ public enum ReactionCount: TypeConstructorDescription {
+ case reactionCount(flags: Int32, reaction: String, count: Int32)
+
+ public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
+ switch self {
+ case .reactionCount(let flags, let reaction, let count):
+ if boxed {
+ buffer.appendInt32(1873957073)
+ }
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ serializeString(reaction, buffer: buffer, boxed: false)
+ serializeInt32(count, buffer: buffer, boxed: false)
+ break
+ }
+ }
+
+ public func descriptionFields() -> (String, [(String, Any)]) {
+ switch self {
+ case .reactionCount(let flags, let reaction, let count):
+ return ("reactionCount", [("flags", flags), ("reaction", reaction), ("count", count)])
+ }
+ }
+
+ public static func parse_reactionCount(_ reader: BufferReader) -> ReactionCount? {
+ var _1: Int32?
+ _1 = reader.readInt32()
+ var _2: String?
+ _2 = parseString(reader)
+ var _3: Int32?
+ _3 = reader.readInt32()
+ let _c1 = _1 != nil
+ let _c2 = _2 != nil
+ let _c3 = _3 != nil
+ if _c1 && _c2 && _c3 {
+ return Api.ReactionCount.reactionCount(flags: _1!, reaction: _2!, count: _3!)
+ }
+ else {
+ return nil
+ }
+ }
+
}
public enum MessagesFilter: TypeConstructorDescription {
case inputMessagesFilterEmpty
@@ -16164,6 +16350,44 @@ public extension Api {
}
}
+ }
+ public enum MessageUserReaction: TypeConstructorDescription {
+ case messageUserReaction(userId: Int32, reaction: String)
+
+ public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
+ switch self {
+ case .messageUserReaction(let userId, let reaction):
+ if boxed {
+ buffer.appendInt32(-764945220)
+ }
+ serializeInt32(userId, buffer: buffer, boxed: false)
+ serializeString(reaction, buffer: buffer, boxed: false)
+ break
+ }
+ }
+
+ public func descriptionFields() -> (String, [(String, Any)]) {
+ switch self {
+ case .messageUserReaction(let userId, let reaction):
+ return ("messageUserReaction", [("userId", userId), ("reaction", reaction)])
+ }
+ }
+
+ public static func parse_messageUserReaction(_ reader: BufferReader) -> MessageUserReaction? {
+ var _1: Int32?
+ _1 = reader.readInt32()
+ var _2: String?
+ _2 = parseString(reader)
+ let _c1 = _1 != nil
+ let _c2 = _2 != nil
+ if _c1 && _c2 {
+ return Api.MessageUserReaction.messageUserReaction(userId: _1!, reaction: _2!)
+ }
+ else {
+ return nil
+ }
+ }
+
}
public enum BotInlineMessage: TypeConstructorDescription {
case botInlineMessageText(flags: Int32, message: String, entities: [Api.MessageEntity]?, replyMarkup: Api.ReplyMarkup?)
diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift
index f549eb900b..a66c158aa3 100644
--- a/submodules/TelegramApi/Sources/Api3.swift
+++ b/submodules/TelegramApi/Sources/Api3.swift
@@ -2924,33 +2924,6 @@ public extension Api {
})
}
- public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
- let buffer = Buffer()
- buffer.appendInt32(-637606386)
- serializeInt32(flags, buffer: buffer, boxed: false)
- fromPeer.serialize(buffer, true)
- buffer.appendInt32(481674261)
- buffer.appendInt32(Int32(id.count))
- for item in id {
- serializeInt32(item, buffer: buffer, boxed: false)
- }
- buffer.appendInt32(481674261)
- buffer.appendInt32(Int32(randomId.count))
- for item in randomId {
- serializeInt64(item, buffer: buffer, boxed: false)
- }
- toPeer.serialize(buffer, true)
- if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)}
- return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
- let reader = BufferReader(buffer)
- var result: Api.Updates?
- if let signature = reader.readInt32() {
- result = Api.parse(reader, signature: signature) as? Api.Updates
- }
- return result
- })
- }
-
public static func sendInlineBotResult(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, randomId: Int64, queryId: Int64, id: String, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
let buffer = Buffer()
buffer.appendInt32(570955184)
@@ -2971,31 +2944,6 @@ public extension Api {
})
}
- public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
- let buffer = Buffer()
- buffer.appendInt32(1224152952)
- serializeInt32(flags, buffer: buffer, boxed: false)
- peer.serialize(buffer, true)
- serializeInt32(id, buffer: buffer, boxed: false)
- if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)}
- if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)}
- if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)}
- if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261)
- buffer.appendInt32(Int32(entities!.count))
- for item in entities! {
- item.serialize(buffer, true)
- }}
- if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)}
- return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
- let reader = BufferReader(buffer)
- var result: Api.Updates?
- if let signature = reader.readInt32() {
- result = Api.parse(reader, signature: signature) as? Api.Updates
- }
- return result
- })
- }
-
public static func sendMultiMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, multiMedia: [Api.InputSingleMedia], scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
let buffer = Buffer()
buffer.appendInt32(-872345397)
@@ -3018,6 +2966,33 @@ public extension Api {
})
}
+ public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(-637606386)
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ fromPeer.serialize(buffer, true)
+ buffer.appendInt32(481674261)
+ buffer.appendInt32(Int32(id.count))
+ for item in id {
+ serializeInt32(item, buffer: buffer, boxed: false)
+ }
+ buffer.appendInt32(481674261)
+ buffer.appendInt32(Int32(randomId.count))
+ for item in randomId {
+ serializeInt64(item, buffer: buffer, boxed: false)
+ }
+ toPeer.serialize(buffer, true)
+ if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)}
+ return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
+ let reader = BufferReader(buffer)
+ var result: Api.Updates?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.Updates
+ }
+ return result
+ })
+ }
+
public static func getScheduledHistory(peer: Api.InputPeer, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
let buffer = Buffer()
buffer.appendInt32(-490575781)
@@ -3089,6 +3064,86 @@ public extension Api {
return result
})
}
+
+ public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(1224152952)
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ peer.serialize(buffer, true)
+ serializeInt32(id, buffer: buffer, boxed: false)
+ if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)}
+ if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)}
+ if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)}
+ if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261)
+ buffer.appendInt32(Int32(entities!.count))
+ for item in entities! {
+ item.serialize(buffer, true)
+ }}
+ if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)}
+ return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
+ let reader = BufferReader(buffer)
+ var result: Api.Updates?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.Updates
+ }
+ return result
+ })
+ }
+
+ public static func sendReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, reaction: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(627641572)
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ peer.serialize(buffer, true)
+ serializeInt32(msgId, buffer: buffer, boxed: false)
+ if Int(flags) & Int(1 << 0) != 0 {serializeString(reaction!, buffer: buffer, boxed: false)}
+ return (FunctionDescription(name: "messages.sendReaction", parameters: [("flags", flags), ("peer", peer), ("msgId", msgId), ("reaction", reaction)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
+ let reader = BufferReader(buffer)
+ var result: Api.Updates?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.Updates
+ }
+ return result
+ })
+ }
+
+ public static func getMessagesReactions(peer: Api.InputPeer, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(-1950707482)
+ peer.serialize(buffer, true)
+ buffer.appendInt32(481674261)
+ buffer.appendInt32(Int32(id.count))
+ for item in id {
+ serializeInt32(item, buffer: buffer, boxed: false)
+ }
+ return (FunctionDescription(name: "messages.getMessagesReactions", parameters: [("peer", peer), ("id", id)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
+ let reader = BufferReader(buffer)
+ var result: Api.Updates?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.Updates
+ }
+ return result
+ })
+ }
+
+ public static func getMessageReactionsList(flags: Int32, peer: Api.InputPeer, id: Int32, reaction: String?, offset: String?, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(363935594)
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ peer.serialize(buffer, true)
+ serializeInt32(id, buffer: buffer, boxed: false)
+ if Int(flags) & Int(1 << 0) != 0 {serializeString(reaction!, buffer: buffer, boxed: false)}
+ if Int(flags) & Int(1 << 1) != 0 {serializeString(offset!, buffer: buffer, boxed: false)}
+ serializeInt32(limit, buffer: buffer, boxed: false)
+ return (FunctionDescription(name: "messages.getMessageReactionsList", parameters: [("flags", flags), ("peer", peer), ("id", id), ("reaction", reaction), ("offset", offset), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.MessageReactionsList? in
+ let reader = BufferReader(buffer)
+ var result: Api.MessageReactionsList?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.MessageReactionsList
+ }
+ return result
+ })
+ }
}
public struct channels {
public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
diff --git a/submodules/TelegramAudio/Sources/ManagedAudioSession.swift b/submodules/TelegramAudio/Sources/ManagedAudioSession.swift
index 38964341ad..efa126565c 100644
--- a/submodules/TelegramAudio/Sources/ManagedAudioSession.swift
+++ b/submodules/TelegramAudio/Sources/ManagedAudioSession.swift
@@ -362,6 +362,10 @@ public final class ManagedAudioSession {
} |> runOn(queue)
}
+ public func isOtherAudioPlaying() -> Bool {
+ return AVAudioSession.sharedInstance().secondaryAudioShouldBeSilencedHint
+ }
+
public func push(audioSessionType: ManagedAudioSessionType, outputMode: AudioSessionOutputMode = .system, once: Bool = false, activate: @escaping (AudioSessionActivationState) -> Void, deactivate: @escaping () -> Signal) -> Disposable {
return self.push(audioSessionType: audioSessionType, once: once, manualActivate: { control in
control.setupAndActivate(synchronous: false, { state in
diff --git a/submodules/TelegramCallsUI/TelegramCallsUI.xcodeproj/project.pbxproj b/submodules/TelegramCallsUI/TelegramCallsUI.xcodeproj/project.pbxproj
index ef51fdf73c..42fd4056b3 100644
--- a/submodules/TelegramCallsUI/TelegramCallsUI.xcodeproj/project.pbxproj
+++ b/submodules/TelegramCallsUI/TelegramCallsUI.xcodeproj/project.pbxproj
@@ -312,6 +312,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -548,6 +561,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -1166,6 +1180,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -1260,6 +1281,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F04BBAF750C00000000
diff --git a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift
index 2f691fe3e5..a4f3da726e 100644
--- a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift
+++ b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift
@@ -57,7 +57,7 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes
var updatedTimestamp: Int32?
if let apiMessage = apiMessage {
switch apiMessage {
- case let .message(_, _, _, _, _, _, _, date, _, _, _, _, _, _, _, _, _):
+ case let .message(_, _, _, _, _, _, _, date, _, _, _, _, _, _, _, _, _, _):
updatedTimestamp = date
case .messageEmpty:
break
diff --git a/submodules/TelegramCore/TelegramCore/MessageReactionList.swift b/submodules/TelegramCore/TelegramCore/MessageReactionList.swift
index 5df92f6549..85a6b34d8b 100644
--- a/submodules/TelegramCore/TelegramCore/MessageReactionList.swift
+++ b/submodules/TelegramCore/TelegramCore/MessageReactionList.swift
@@ -82,7 +82,7 @@ private final class MessageReactionCategoryContext {
self.state.loadingMore = true
self.statePromise.set(self.state)
- /*var flags: Int32 = 0
+ var flags: Int32 = 0
var reaction: String?
switch self.category {
case .all:
@@ -147,7 +147,7 @@ private final class MessageReactionCategoryContext {
})
}, error: { _ in
- }))*/
+ }))
}
}
diff --git a/submodules/TelegramCore/TelegramCore/MessageReactions.swift b/submodules/TelegramCore/TelegramCore/MessageReactions.swift
index 1842464c3e..bb804ff08c 100644
--- a/submodules/TelegramCore/TelegramCore/MessageReactions.swift
+++ b/submodules/TelegramCore/TelegramCore/MessageReactions.swift
@@ -61,8 +61,7 @@ private enum RequestUpdateMessageReactionError {
}
private func requestUpdateMessageReaction(postbox: Postbox, network: Network, stateManager: AccountStateManager, messageId: MessageId) -> Signal {
- return .fail(.generic)
- /*return postbox.transaction { transaction -> (Peer, String?)? in
+ return postbox.transaction { transaction -> (Peer, String?)? in
guard let peer = transaction.getPeer(messageId.peerId) else {
return nil
}
@@ -118,7 +117,7 @@ private func requestUpdateMessageReaction(postbox: Postbox, network: Network, st
|> introduceError(RequestUpdateMessageReactionError.self)
|> ignoreValues
}
- }*/
+ }
}
private final class ManagedApplyPendingMessageReactionsActionsHelper {
diff --git a/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift
index ce3ab1104c..92cd9f78cd 100644
--- a/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift
+++ b/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift
@@ -46,7 +46,7 @@ public final class ReactionsMessageAttribute: MessageAttribute {
encoder.encodeObjectArray(self.reactions, forKey: "r")
}
- /*func withUpdatedResults(_ reactions: Api.MessageReactions) -> ReactionsMessageAttribute {
+ func withUpdatedResults(_ reactions: Api.MessageReactions) -> ReactionsMessageAttribute {
switch reactions {
case let .messageReactions(flags, results):
let min = (flags & (1 << 0)) != 0
@@ -74,7 +74,7 @@ public final class ReactionsMessageAttribute: MessageAttribute {
}
return ReactionsMessageAttribute(reactions: reactions)
}
- }*/
+ }
}
public func mergedMessageReactions(attributes: [MessageAttribute]) -> ReactionsMessageAttribute? {
@@ -147,7 +147,7 @@ public final class PendingReactionsMessageAttribute: MessageAttribute {
}
}
-/*extension ReactionsMessageAttribute {
+extension ReactionsMessageAttribute {
convenience init(apiReactions: Api.MessageReactions) {
switch apiReactions {
case let .messageReactions(_, results):
@@ -159,4 +159,4 @@ public final class PendingReactionsMessageAttribute: MessageAttribute {
})
}
}
-}*/
+}
diff --git a/submodules/TelegramCore/TelegramCore/Serialization.swift b/submodules/TelegramCore/TelegramCore/Serialization.swift
index 06a094ff21..acd34716b8 100644
--- a/submodules/TelegramCore/TelegramCore/Serialization.swift
+++ b/submodules/TelegramCore/TelegramCore/Serialization.swift
@@ -220,7 +220,7 @@ public class BoxedMessage: NSObject {
public class Serialization: NSObject, MTSerialization {
public func currentLayer() -> UInt {
- return 105
+ return 106
}
public func parseMessage(_ data: Data!) -> Any! {
diff --git a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift
index 4514141488..ce92e2195e 100644
--- a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift
+++ b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift
@@ -111,7 +111,7 @@ public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute],
func apiMessagePeerId(_ messsage: Api.Message) -> PeerId? {
switch messsage {
- case let .message(flags, _, fromId, toId, _, _, _, _, _, _, _, _, _, _, _, _, _):
+ case let .message(flags, _, fromId, toId, _, _, _, _, _, _, _, _, _, _, _, _, _, _):
switch toId {
case let .peerUser(userId):
return PeerId(namespace: Namespaces.Peer.CloudUser, id: (flags & Int32(2)) != 0 ? userId : (fromId ?? userId))
@@ -136,7 +136,7 @@ func apiMessagePeerId(_ messsage: Api.Message) -> PeerId? {
func apiMessagePeerIds(_ message: Api.Message) -> [PeerId] {
switch message {
- case let .message(flags, _, fromId, toId, fwdHeader, viaBotId, _, _, _, media, _, entities, _, _, _, _, _):
+ case let .message(flags, _, fromId, toId, fwdHeader, viaBotId, _, _, _, media, _, entities, _, _, _, _, _, _):
let peerId: PeerId
switch toId {
case let .peerUser(userId):
@@ -240,7 +240,7 @@ func apiMessagePeerIds(_ message: Api.Message) -> [PeerId] {
func apiMessageAssociatedMessageIds(_ message: Api.Message) -> [MessageId]? {
switch message {
- case let .message(flags, _, fromId, toId, _, _, replyToMsgId, _, _, _, _, _, _, _, _, _, _):
+ case let .message(flags, _, fromId, toId, _, _, replyToMsgId, _, _, _, _, _, _, _, _, _, _, _):
if let replyToMsgId = replyToMsgId {
let peerId: PeerId
switch toId {
@@ -382,7 +382,7 @@ func messageTextEntitiesFromApiEntities(_ entities: [Api.MessageEntity]) -> [Mes
extension StoreMessage {
convenience init?(apiMessage: Api.Message, namespace: MessageId.Namespace = Namespaces.Message.Cloud) {
switch apiMessage {
- case let .message(flags, id, fromId, toId, fwdFrom, viaBotId, replyToMsgId, date, message, media, replyMarkup, entities, views, editDate, postAuthor, groupingId, restrictionReason):
+ case let .message(flags, id, fromId, toId, fwdFrom, viaBotId, replyToMsgId, date, message, media, replyMarkup, entities, views, editDate, postAuthor, groupingId, reactions, restrictionReason):
let peerId: PeerId
var authorId: PeerId?
switch toId {
@@ -537,9 +537,9 @@ extension StoreMessage {
attributes.append(ContentRequiresValidationMessageAttribute())
}
- /*if let reactions = reactions {
+ if let reactions = reactions {
attributes.append(ReactionsMessageAttribute(apiReactions: reactions))
- }*/
+ }
if let restrictionReason = restrictionReason {
attributes.append(RestrictedContentMessageAttribute(rules: restrictionReason.map(RestrictionRule.init(apiReason:))))
diff --git a/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift b/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift
index 94d242405b..b493d4bc81 100644
--- a/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift
+++ b/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift
@@ -69,7 +69,7 @@ class UpdateMessageService: NSObject, MTMessageService {
self.putNext(groups)
}
case let .updateShortChatMessage(flags, id, fromId, chatId, message, pts, ptsCount, date, fwdFrom, viaBotId, replyToMsgId, entities):
- let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: fromId, toId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil)
+ let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: fromId, toId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, reactions: nil, restrictionReason: nil)
let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount)
let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil)
if groups.count != 0 {
@@ -86,7 +86,7 @@ class UpdateMessageService: NSObject, MTMessageService {
generatedToId = Api.Peer.peerUser(userId: self.peerId.id)
}
- let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: generatedFromId, toId: generatedToId, fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil)
+ let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: generatedFromId, toId: generatedToId, fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, reactions: nil, restrictionReason: nil)
let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount)
let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil)
if groups.count != 0 {
diff --git a/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift b/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift
index 2439756d55..651711a391 100644
--- a/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift
+++ b/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift
@@ -100,7 +100,7 @@ extension Api.MessageMedia {
extension Api.Message {
var rawId: Int32 {
switch self {
- case let .message(_, id, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _):
+ case let .message(_, id, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _):
return id
case let .messageEmpty(id):
return id
@@ -111,7 +111,7 @@ extension Api.Message {
func id(namespace: MessageId.Namespace = Namespaces.Message.Cloud) -> MessageId? {
switch self {
- case let .message(flags, id, fromId, toId, _, _, _, _, _, _, _, _, _, _, _, _, _):
+ case let .message(flags, id, fromId, toId, _, _, _, _, _, _, _, _, _, _, _, _, _, _):
let peerId: PeerId
switch toId {
case let .peerUser(userId):
@@ -146,7 +146,7 @@ extension Api.Message {
var timestamp: Int32? {
switch self {
- case let .message(_, _, _, _, _, _, _, date, _, _, _, _, _, _, _, _, _):
+ case let .message(_, _, _, _, _, _, _, date, _, _, _, _, _, _, _, _, _, _):
return date
case let .messageService(_, _, _, _, _, date, _):
return date
@@ -157,7 +157,7 @@ extension Api.Message {
var preCachedResources: [(MediaResource, Data)]? {
switch self {
- case let .message(_, _, _, _, _, _, _, _, _, media, _, _, _, _, _, _, _):
+ case let .message(_, _, _, _, _, _, _, _, _, media, _, _, _, _, _, _, _, _):
return media?.preCachedResources
default:
return nil
diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift
index ae90761ef4..001fc076b2 100644
--- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift
+++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift
@@ -251,4494 +251,4515 @@ public final class PresentationStrings {
return formatWithArgumentRanges(self._s[63]!, self._r[63]!, [_0])
}
public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[64]! }
- public var AutoNightTheme_UseSunsetSunrise: String { return self._s[66]! }
- public var FastTwoStepSetup_Title: String { return self._s[67]! }
- public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[68]! }
- public var Channel_Info_BlackList: String { return self._s[69]! }
- public var Channel_AdminLog_InfoPanelTitle: String { return self._s[70]! }
- public var Conversation_OpenFile: String { return self._s[71]! }
- public var SecretTimer_ImageDescription: String { return self._s[72]! }
- public var StickerSettings_ContextInfo: String { return self._s[73]! }
- public var TwoStepAuth_GenericHelp: String { return self._s[75]! }
- public var AutoDownloadSettings_Unlimited: String { return self._s[76]! }
- public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[77]! }
- public var AutoDownloadSettings_DataUsageHigh: String { return self._s[78]! }
+ public var ChatList_Context_HideArchive: String { return self._s[66]! }
+ public var AutoNightTheme_UseSunsetSunrise: String { return self._s[67]! }
+ public var FastTwoStepSetup_Title: String { return self._s[68]! }
+ public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[69]! }
+ public var Channel_Info_BlackList: String { return self._s[70]! }
+ public var Channel_AdminLog_InfoPanelTitle: String { return self._s[71]! }
+ public var Conversation_OpenFile: String { return self._s[72]! }
+ public var SecretTimer_ImageDescription: String { return self._s[73]! }
+ public var StickerSettings_ContextInfo: String { return self._s[74]! }
+ public var TwoStepAuth_GenericHelp: String { return self._s[76]! }
+ public var AutoDownloadSettings_Unlimited: String { return self._s[77]! }
+ public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[78]! }
+ public var AutoDownloadSettings_DataUsageHigh: String { return self._s[79]! }
public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[79]!, self._r[79]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[80]!, self._r[80]!, [_1, _2])
}
- public var Notifications_AddExceptionTitle: String { return self._s[80]! }
- public var Watch_MessageView_Reply: String { return self._s[81]! }
- public var Tour_Text6: String { return self._s[82]! }
- public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[83]! }
+ public var Notifications_AddExceptionTitle: String { return self._s[81]! }
+ public var Watch_MessageView_Reply: String { return self._s[82]! }
+ public var Tour_Text6: String { return self._s[83]! }
+ public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[84]! }
public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[84]!, self._r[84]!, [_0])
- }
- public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[85]!, self._r[85]!, [_0])
}
- public var AccessDenied_LocationDenied: String { return self._s[86]! }
- public var CallSettings_RecentCalls: String { return self._s[87]! }
- public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[88]! }
- public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[89]! }
- public var Passport_Authorize: String { return self._s[90]! }
- public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[91]! }
- public var AutoDownloadSettings_Videos: String { return self._s[92]! }
- public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[93]! }
- public var Tour_StartButton: String { return self._s[94]! }
- public var Watch_AppName: String { return self._s[96]! }
- public var StickerPack_ErrorNotFound: String { return self._s[97]! }
- public var Channel_Info_Subscribers: String { return self._s[98]! }
- public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[99]!, self._r[99]!, [_0])
+ public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[86]!, self._r[86]!, [_0])
}
- public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) {
+ public var AccessDenied_LocationDenied: String { return self._s[87]! }
+ public var CallSettings_RecentCalls: String { return self._s[88]! }
+ public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[89]! }
+ public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[90]! }
+ public var Passport_Authorize: String { return self._s[91]! }
+ public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[92]! }
+ public var AutoDownloadSettings_Videos: String { return self._s[93]! }
+ public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[94]! }
+ public var Tour_StartButton: String { return self._s[95]! }
+ public var Watch_AppName: String { return self._s[97]! }
+ public var StickerPack_ErrorNotFound: String { return self._s[98]! }
+ public var Channel_Info_Subscribers: String { return self._s[99]! }
+ public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[100]!, self._r[100]!, [_0])
}
- public var Appearance_RemoveTheme: String { return self._s[101]! }
- public var Conversation_StopLiveLocation: String { return self._s[103]! }
- public var Channel_AdminLogFilter_EventsAll: String { return self._s[104]! }
- public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[106]! }
- public var Username_LinkCopied: String { return self._s[108]! }
- public var GroupRemoved_Title: String { return self._s[109]! }
- public var SecretVideo_Title: String { return self._s[110]! }
+ public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[101]!, self._r[101]!, [_0])
+ }
+ public var Appearance_RemoveTheme: String { return self._s[102]! }
+ public var Conversation_StopLiveLocation: String { return self._s[104]! }
+ public var Channel_AdminLogFilter_EventsAll: String { return self._s[105]! }
+ public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[107]! }
+ public var Username_LinkCopied: String { return self._s[109]! }
+ public var GroupRemoved_Title: String { return self._s[110]! }
+ public var SecretVideo_Title: String { return self._s[111]! }
public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[111]!, self._r[111]!, [_1])
+ return formatWithArgumentRanges(self._s[112]!, self._r[112]!, [_1])
}
- public var AccessDenied_PhotosAndVideos: String { return self._s[112]! }
- public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[113]! }
+ public var AccessDenied_PhotosAndVideos: String { return self._s[113]! }
+ public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[114]! }
public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[115]!, self._r[115]!, [_1])
+ return formatWithArgumentRanges(self._s[116]!, self._r[116]!, [_1])
}
- public var Map_OpenInGoogleMaps: String { return self._s[116]! }
+ public var Map_OpenInGoogleMaps: String { return self._s[117]! }
public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[117]!, self._r[117]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_1, _2, _3])
}
public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[119]!, self._r[119]!, [_1, _2])
}
- public var Call_StatusRinging: String { return self._s[119]! }
- public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[120]! }
- public var Group_Username_InvalidStartsWithNumber: String { return self._s[121]! }
- public var UserInfo_NotificationsEnabled: String { return self._s[122]! }
- public var Map_Search: String { return self._s[123]! }
- public var Login_TermsOfServiceHeader: String { return self._s[125]! }
+ public var Call_StatusRinging: String { return self._s[120]! }
+ public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[121]! }
+ public var Group_Username_InvalidStartsWithNumber: String { return self._s[122]! }
+ public var UserInfo_NotificationsEnabled: String { return self._s[123]! }
+ public var Map_Search: String { return self._s[124]! }
+ public var Login_TermsOfServiceHeader: String { return self._s[126]! }
public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[126]!, self._r[126]!, [_0])
- }
- public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[127]!, self._r[127]!, [_0])
}
- public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[128]! }
- public var Weekday_Today: String { return self._s[129]! }
+ public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[128]!, self._r[128]!, [_0])
+ }
+ public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[129]! }
+ public var Weekday_Today: String { return self._s[130]! }
public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[131]!, self._r[131]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[132]!, self._r[132]!, [_1, _2])
}
public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[132]!, self._r[132]!, ["\(_1)"])
+ return formatWithArgumentRanges(self._s[133]!, self._r[133]!, ["\(_1)"])
}
- public var Notification_PassportValuePersonalDetails: String { return self._s[134]! }
- public var Channel_AdminLog_MessagePreviousLink: String { return self._s[135]! }
- public var ChangePhoneNumberNumber_NewNumber: String { return self._s[136]! }
- public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[137]! }
- public var TwoStepAuth_ChangePasswordDescription: String { return self._s[138]! }
- public var PhotoEditor_BlurToolLinear: String { return self._s[139]! }
- public var Contacts_PermissionsAllowInSettings: String { return self._s[140]! }
- public var Weekday_ShortMonday: String { return self._s[141]! }
- public var Cache_KeepMedia: String { return self._s[142]! }
- public var Passport_FieldIdentitySelfieHelp: String { return self._s[143]! }
+ public var Notification_PassportValuePersonalDetails: String { return self._s[135]! }
+ public var Channel_AdminLog_MessagePreviousLink: String { return self._s[136]! }
+ public var ChangePhoneNumberNumber_NewNumber: String { return self._s[137]! }
+ public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[138]! }
+ public var TwoStepAuth_ChangePasswordDescription: String { return self._s[139]! }
+ public var PhotoEditor_BlurToolLinear: String { return self._s[140]! }
+ public var Contacts_PermissionsAllowInSettings: String { return self._s[141]! }
+ public var Weekday_ShortMonday: String { return self._s[142]! }
+ public var Cache_KeepMedia: String { return self._s[143]! }
+ public var Passport_FieldIdentitySelfieHelp: String { return self._s[144]! }
public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[144]!, self._r[144]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[145]!, self._r[145]!, [_1, _2])
}
public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[145]!, self._r[145]!, [_0])
+ return formatWithArgumentRanges(self._s[146]!, self._r[146]!, [_0])
}
- public var Conversation_ClousStorageInfo_Description4: String { return self._s[146]! }
- public var Passport_Language_ru: String { return self._s[147]! }
+ public var Conversation_ClousStorageInfo_Description4: String { return self._s[147]! }
+ public var Passport_Language_ru: String { return self._s[148]! }
public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[148]!, self._r[148]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[149]!, self._r[149]!, [_0, _1])
}
- public var WallpaperPreview_PatternIntensity: String { return self._s[149]! }
- public var TwoStepAuth_RecoveryUnavailable: String { return self._s[150]! }
- public var EnterPasscode_TouchId: String { return self._s[151]! }
- public var PhotoEditor_QualityVeryHigh: String { return self._s[154]! }
- public var Checkout_NewCard_SaveInfo: String { return self._s[156]! }
- public var Gif_NoGifsPlaceholder: String { return self._s[158]! }
- public var Conversation_OpenBotLinkTitle: String { return self._s[160]! }
- public var ChatSettings_AutoDownloadEnabled: String { return self._s[161]! }
- public var NetworkUsageSettings_BytesSent: String { return self._s[162]! }
- public var Checkout_PasswordEntry_Pay: String { return self._s[163]! }
- public var AuthSessions_TerminateSession: String { return self._s[164]! }
- public var Message_File: String { return self._s[165]! }
- public var MediaPicker_VideoMuteDescription: String { return self._s[166]! }
- public var SocksProxySetup_ProxyStatusConnected: String { return self._s[167]! }
- public var TwoStepAuth_RecoveryCode: String { return self._s[168]! }
- public var EnterPasscode_EnterCurrentPasscode: String { return self._s[169]! }
+ public var WallpaperPreview_PatternIntensity: String { return self._s[150]! }
+ public var TwoStepAuth_RecoveryUnavailable: String { return self._s[151]! }
+ public var EnterPasscode_TouchId: String { return self._s[152]! }
+ public var PhotoEditor_QualityVeryHigh: String { return self._s[155]! }
+ public var Checkout_NewCard_SaveInfo: String { return self._s[157]! }
+ public var Gif_NoGifsPlaceholder: String { return self._s[159]! }
+ public var Conversation_OpenBotLinkTitle: String { return self._s[161]! }
+ public var ChatSettings_AutoDownloadEnabled: String { return self._s[162]! }
+ public var NetworkUsageSettings_BytesSent: String { return self._s[163]! }
+ public var Checkout_PasswordEntry_Pay: String { return self._s[164]! }
+ public var AuthSessions_TerminateSession: String { return self._s[165]! }
+ public var Message_File: String { return self._s[166]! }
+ public var MediaPicker_VideoMuteDescription: String { return self._s[167]! }
+ public var SocksProxySetup_ProxyStatusConnected: String { return self._s[168]! }
+ public var TwoStepAuth_RecoveryCode: String { return self._s[169]! }
+ public var EnterPasscode_EnterCurrentPasscode: String { return self._s[170]! }
public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[170]!, self._r[170]!, [_0])
+ return formatWithArgumentRanges(self._s[171]!, self._r[171]!, [_0])
}
- public var Conversation_Moderate_Report: String { return self._s[172]! }
- public var TwoStepAuth_EmailInvalid: String { return self._s[173]! }
- public var Passport_Language_ms: String { return self._s[174]! }
- public var Channel_Edit_AboutItem: String { return self._s[176]! }
- public var DialogList_SearchSectionGlobal: String { return self._s[180]! }
- public var AttachmentMenu_WebSearch: String { return self._s[181]! }
- public var PasscodeSettings_TurnPasscodeOn: String { return self._s[182]! }
- public var Channel_BanUser_Title: String { return self._s[183]! }
- public var WallpaperPreview_SwipeTopText: String { return self._s[184]! }
- public var ArchivedChats_IntroText2: String { return self._s[185]! }
- public var Notification_Exceptions_DeleteAll: String { return self._s[186]! }
+ public var Conversation_Moderate_Report: String { return self._s[173]! }
+ public var TwoStepAuth_EmailInvalid: String { return self._s[174]! }
+ public var Passport_Language_ms: String { return self._s[175]! }
+ public var Channel_Edit_AboutItem: String { return self._s[177]! }
+ public var DialogList_SearchSectionGlobal: String { return self._s[181]! }
+ public var AttachmentMenu_WebSearch: String { return self._s[182]! }
+ public var PasscodeSettings_TurnPasscodeOn: String { return self._s[183]! }
+ public var Channel_BanUser_Title: String { return self._s[184]! }
+ public var WallpaperPreview_SwipeTopText: String { return self._s[185]! }
+ public var ArchivedChats_IntroText2: String { return self._s[186]! }
+ public var Notification_Exceptions_DeleteAll: String { return self._s[187]! }
public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[188]!, self._r[188]!, [_1, _2])
}
- public var ChatSearch_SearchPlaceholder: String { return self._s[189]! }
- public var Passport_FieldAddressTranslationHelp: String { return self._s[190]! }
- public var NotificationsSound_Aurora: String { return self._s[191]! }
+ public var ChatSearch_SearchPlaceholder: String { return self._s[190]! }
+ public var Passport_FieldAddressTranslationHelp: String { return self._s[191]! }
+ public var NotificationsSound_Aurora: String { return self._s[192]! }
public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[192]!, self._r[192]!, [_0])
+ return formatWithArgumentRanges(self._s[193]!, self._r[193]!, [_0])
}
- public var AuthSessions_LoggedInWithTelegram: String { return self._s[195]! }
+ public var AuthSessions_LoggedInWithTelegram: String { return self._s[196]! }
public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[196]!, self._r[196]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[197]!, self._r[197]!, [_0, _1])
}
- public var Passport_PasswordNext: String { return self._s[197]! }
- public var Bot_GroupStatusReadsHistory: String { return self._s[198]! }
- public var EmptyGroupInfo_Line2: String { return self._s[199]! }
- public var VoiceOver_Chat_SeenByRecipients: String { return self._s[200]! }
- public var Settings_FAQ_Intro: String { return self._s[202]! }
- public var PrivacySettings_PasscodeAndTouchId: String { return self._s[204]! }
- public var FeaturedStickerPacks_Title: String { return self._s[205]! }
- public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[207]! }
- public var Username_Title: String { return self._s[208]! }
+ public var Passport_PasswordNext: String { return self._s[198]! }
+ public var Bot_GroupStatusReadsHistory: String { return self._s[199]! }
+ public var EmptyGroupInfo_Line2: String { return self._s[200]! }
+ public var VoiceOver_Chat_SeenByRecipients: String { return self._s[201]! }
+ public var Settings_FAQ_Intro: String { return self._s[203]! }
+ public var PrivacySettings_PasscodeAndTouchId: String { return self._s[205]! }
+ public var FeaturedStickerPacks_Title: String { return self._s[206]! }
+ public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[208]! }
+ public var Username_Title: String { return self._s[209]! }
public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[209]!, self._r[209]!, [_0])
+ return formatWithArgumentRanges(self._s[210]!, self._r[210]!, [_0])
}
- public var PasscodeSettings_AlphanumericCode: String { return self._s[210]! }
- public var Localization_LanguageOther: String { return self._s[211]! }
- public var Stickers_SuggestStickers: String { return self._s[212]! }
+ public var PasscodeSettings_AlphanumericCode: String { return self._s[211]! }
+ public var Localization_LanguageOther: String { return self._s[212]! }
+ public var Stickers_SuggestStickers: String { return self._s[213]! }
public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[213]!, self._r[213]!, [_0])
+ return formatWithArgumentRanges(self._s[214]!, self._r[214]!, [_0])
}
- public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[214]! }
- public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[215]! }
- public var Conversation_DefaultRestrictedStickers: String { return self._s[216]! }
+ public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[215]! }
+ public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[216]! }
+ public var Conversation_DefaultRestrictedStickers: String { return self._s[217]! }
public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[217]!, self._r[217]!, [_0])
+ return formatWithArgumentRanges(self._s[218]!, self._r[218]!, [_0])
}
- public var Group_UpgradeConfirmation: String { return self._s[219]! }
- public var DialogList_Unpin: String { return self._s[220]! }
- public var Passport_Identity_DateOfBirth: String { return self._s[221]! }
- public var Month_ShortOctober: String { return self._s[222]! }
- public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[223]! }
- public var Notification_CallCanceledShort: String { return self._s[224]! }
- public var Passport_Phone_Help: String { return self._s[225]! }
- public var Passport_Language_az: String { return self._s[227]! }
- public var CreatePoll_TextPlaceholder: String { return self._s[229]! }
- public var VoiceOver_Chat_AnonymousPoll: String { return self._s[230]! }
- public var Passport_Identity_DocumentNumber: String { return self._s[231]! }
- public var PhotoEditor_CurvesRed: String { return self._s[232]! }
- public var PhoneNumberHelp_Alert: String { return self._s[234]! }
- public var SocksProxySetup_Port: String { return self._s[235]! }
- public var Checkout_PayNone: String { return self._s[236]! }
- public var AutoDownloadSettings_WiFi: String { return self._s[237]! }
- public var GroupInfo_GroupType: String { return self._s[238]! }
- public var StickerSettings_ContextHide: String { return self._s[239]! }
- public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[240]! }
- public var Group_Setup_HistoryTitle: String { return self._s[242]! }
- public var Passport_Identity_FilesUploadNew: String { return self._s[243]! }
- public var PasscodeSettings_AutoLock: String { return self._s[244]! }
- public var Passport_Title: String { return self._s[245]! }
- public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[246]! }
- public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[247]! }
- public var GroupPermission_NoSendGifs: String { return self._s[248]! }
- public var PrivacySettings_PasscodeOn: String { return self._s[249]! }
+ public var Group_UpgradeConfirmation: String { return self._s[220]! }
+ public var DialogList_Unpin: String { return self._s[221]! }
+ public var Passport_Identity_DateOfBirth: String { return self._s[222]! }
+ public var Month_ShortOctober: String { return self._s[223]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[224]! }
+ public var Notification_CallCanceledShort: String { return self._s[225]! }
+ public var Passport_Phone_Help: String { return self._s[226]! }
+ public var Passport_Language_az: String { return self._s[228]! }
+ public var CreatePoll_TextPlaceholder: String { return self._s[230]! }
+ public var VoiceOver_Chat_AnonymousPoll: String { return self._s[231]! }
+ public var Passport_Identity_DocumentNumber: String { return self._s[232]! }
+ public var PhotoEditor_CurvesRed: String { return self._s[233]! }
+ public var PhoneNumberHelp_Alert: String { return self._s[235]! }
+ public var SocksProxySetup_Port: String { return self._s[236]! }
+ public var Checkout_PayNone: String { return self._s[237]! }
+ public var AutoDownloadSettings_WiFi: String { return self._s[238]! }
+ public var GroupInfo_GroupType: String { return self._s[239]! }
+ public var StickerSettings_ContextHide: String { return self._s[240]! }
+ public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[241]! }
+ public var Group_Setup_HistoryTitle: String { return self._s[243]! }
+ public var Passport_Identity_FilesUploadNew: String { return self._s[244]! }
+ public var PasscodeSettings_AutoLock: String { return self._s[245]! }
+ public var Passport_Title: String { return self._s[246]! }
+ public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[247]! }
+ public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[248]! }
+ public var GroupPermission_NoSendGifs: String { return self._s[249]! }
+ public var PrivacySettings_PasscodeOn: String { return self._s[250]! }
public func Conversation_ScheduleMessage_SendTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[250]!, self._r[250]!, [_0])
+ return formatWithArgumentRanges(self._s[251]!, self._r[251]!, [_0])
}
- public var State_WaitingForNetwork: String { return self._s[252]! }
+ public var State_WaitingForNetwork: String { return self._s[253]! }
public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[253]!, self._r[253]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[254]!, self._r[254]!, [_0, _1])
}
- public var Calls_NotNow: String { return self._s[255]! }
+ public var Calls_NotNow: String { return self._s[256]! }
public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[256]!, self._r[256]!, [_0])
+ return formatWithArgumentRanges(self._s[257]!, self._r[257]!, [_0])
}
- public var UserInfo_SendMessage: String { return self._s[257]! }
- public var TwoStepAuth_PasswordSet: String { return self._s[258]! }
- public var Passport_DeleteDocument: String { return self._s[259]! }
- public var SocksProxySetup_AddProxyTitle: String { return self._s[260]! }
+ public var UserInfo_SendMessage: String { return self._s[258]! }
+ public var TwoStepAuth_PasswordSet: String { return self._s[259]! }
+ public var Passport_DeleteDocument: String { return self._s[260]! }
+ public var SocksProxySetup_AddProxyTitle: String { return self._s[261]! }
public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[261]!, self._r[261]!, [_1])
+ return formatWithArgumentRanges(self._s[262]!, self._r[262]!, [_1])
}
- public var GroupRemoved_Remove: String { return self._s[262]! }
- public var Passport_FieldIdentity: String { return self._s[263]! }
- public var Group_Setup_TypePrivateHelp: String { return self._s[264]! }
- public var Conversation_Processing: String { return self._s[267]! }
- public var ChatSettings_AutoPlayAnimations: String { return self._s[269]! }
- public var AuthSessions_LogOutApplicationsHelp: String { return self._s[272]! }
- public var Month_GenFebruary: String { return self._s[273]! }
+ public var GroupRemoved_Remove: String { return self._s[263]! }
+ public var Passport_FieldIdentity: String { return self._s[264]! }
+ public var Group_Setup_TypePrivateHelp: String { return self._s[265]! }
+ public var Conversation_Processing: String { return self._s[268]! }
+ public var ChatSettings_AutoPlayAnimations: String { return self._s[270]! }
+ public var AuthSessions_LogOutApplicationsHelp: String { return self._s[273]! }
+ public var Month_GenFebruary: String { return self._s[274]! }
public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[275]!, self._r[275]!, [_1, _2, _3, _4, _5])
+ return formatWithArgumentRanges(self._s[276]!, self._r[276]!, [_1, _2, _3, _4, _5])
}
- public var Passport_Identity_TypeIdentityCard: String { return self._s[276]! }
- public var AutoDownloadSettings_DataUsageMedium: String { return self._s[278]! }
- public var GroupInfo_AddParticipant: String { return self._s[279]! }
- public var KeyCommand_SendMessage: String { return self._s[280]! }
- public var VoiceOver_Chat_YourContact: String { return self._s[282]! }
- public var Map_LiveLocationShowAll: String { return self._s[283]! }
- public var WallpaperSearch_ColorOrange: String { return self._s[285]! }
- public var Appearance_AppIconDefaultX: String { return self._s[286]! }
- public var Checkout_Receipt_Title: String { return self._s[287]! }
- public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[288]! }
- public var WallpaperPreview_PreviewTopText: String { return self._s[289]! }
- public var Message_Contact: String { return self._s[290]! }
- public var Call_StatusIncoming: String { return self._s[291]! }
+ public var Passport_Identity_TypeIdentityCard: String { return self._s[277]! }
+ public var AutoDownloadSettings_DataUsageMedium: String { return self._s[279]! }
+ public var GroupInfo_AddParticipant: String { return self._s[280]! }
+ public var KeyCommand_SendMessage: String { return self._s[281]! }
+ public var VoiceOver_Chat_YourContact: String { return self._s[283]! }
+ public var Map_LiveLocationShowAll: String { return self._s[284]! }
+ public var WallpaperSearch_ColorOrange: String { return self._s[286]! }
+ public var Appearance_AppIconDefaultX: String { return self._s[287]! }
+ public var Checkout_Receipt_Title: String { return self._s[288]! }
+ public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[289]! }
+ public var WallpaperPreview_PreviewTopText: String { return self._s[290]! }
+ public var Message_Contact: String { return self._s[291]! }
+ public var Call_StatusIncoming: String { return self._s[292]! }
public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[292]!, self._r[292]!, [_1])
+ return formatWithArgumentRanges(self._s[293]!, self._r[293]!, [_1])
}
public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[294]!, self._r[294]!, [_1])
+ return formatWithArgumentRanges(self._s[295]!, self._r[295]!, [_1])
}
- public var VoiceOver_Media_PlaybackRate: String { return self._s[295]! }
- public var Passport_FieldIdentityDetailsHelp: String { return self._s[296]! }
- public var Conversation_ViewChannel: String { return self._s[297]! }
+ public var VoiceOver_Media_PlaybackRate: String { return self._s[296]! }
+ public var Passport_FieldIdentityDetailsHelp: String { return self._s[297]! }
+ public var Conversation_ViewChannel: String { return self._s[298]! }
public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[298]!, self._r[298]!, [_0])
+ return formatWithArgumentRanges(self._s[299]!, self._r[299]!, [_0])
}
- public var Passport_Language_nl: String { return self._s[300]! }
- public var Camera_Retake: String { return self._s[301]! }
+ public var Passport_Language_nl: String { return self._s[301]! }
+ public var Camera_Retake: String { return self._s[302]! }
public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[302]!, self._r[302]!, [_0])
+ return formatWithArgumentRanges(self._s[303]!, self._r[303]!, [_0])
}
- public var AuthSessions_LogOutApplications: String { return self._s[303]! }
- public var ApplyLanguage_ApplySuccess: String { return self._s[304]! }
- public var Tour_Title6: String { return self._s[305]! }
- public var Map_ChooseAPlace: String { return self._s[306]! }
- public var CallSettings_Never: String { return self._s[308]! }
+ public var AuthSessions_LogOutApplications: String { return self._s[304]! }
+ public var ApplyLanguage_ApplySuccess: String { return self._s[305]! }
+ public var Tour_Title6: String { return self._s[306]! }
+ public var Map_ChooseAPlace: String { return self._s[307]! }
+ public var CallSettings_Never: String { return self._s[309]! }
public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[309]!, self._r[309]!, [_0])
+ return formatWithArgumentRanges(self._s[310]!, self._r[310]!, [_0])
}
- public var ChannelRemoved_RemoveInfo: String { return self._s[310]! }
+ public var ChannelRemoved_RemoveInfo: String { return self._s[311]! }
public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[311]!, self._r[311]!, [_0])
+ return formatWithArgumentRanges(self._s[312]!, self._r[312]!, [_0])
}
- public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[312]! }
+ public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[313]! }
public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[313]!, self._r[313]!, [_0])
+ return formatWithArgumentRanges(self._s[314]!, self._r[314]!, [_0])
}
- public var GroupInfo_InviteLink_Title: String { return self._s[314]! }
+ public var GroupInfo_InviteLink_Title: String { return self._s[315]! }
public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[315]!, self._r[315]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[316]!, self._r[316]!, [_1, _2])
}
- public var KeyCommand_ScrollUp: String { return self._s[316]! }
- public var ContactInfo_URLLabelHomepage: String { return self._s[317]! }
- public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[318]! }
+ public var KeyCommand_ScrollUp: String { return self._s[317]! }
+ public var ContactInfo_URLLabelHomepage: String { return self._s[318]! }
+ public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[319]! }
public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[319]!, self._r[319]!, [_0])
- }
- public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[320]!, self._r[320]!, [_0])
}
- public var CallFeedback_ReasonDistortedSpeech: String { return self._s[321]! }
- public var Watch_LastSeen_WithinAWeek: String { return self._s[322]! }
- public var Weekday_Tuesday: String { return self._s[324]! }
- public var ScheduledMessages_Delete: String { return self._s[326]! }
- public var UserInfo_StartSecretChat: String { return self._s[327]! }
- public var Passport_Identity_FilesTitle: String { return self._s[328]! }
- public var Permissions_NotificationsAllow_v0: String { return self._s[329]! }
- public var DialogList_DeleteConversationConfirmation: String { return self._s[331]! }
- public var ChatList_UndoArchiveRevealedTitle: String { return self._s[332]! }
- public var AuthSessions_Sessions: String { return self._s[333]! }
+ public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[321]!, self._r[321]!, [_0])
+ }
+ public var CallFeedback_ReasonDistortedSpeech: String { return self._s[322]! }
+ public var Watch_LastSeen_WithinAWeek: String { return self._s[323]! }
+ public var ContactList_Context_SendMessage: String { return self._s[325]! }
+ public var Weekday_Tuesday: String { return self._s[326]! }
+ public var ScheduledMessages_Delete: String { return self._s[328]! }
+ public var UserInfo_StartSecretChat: String { return self._s[329]! }
+ public var Passport_Identity_FilesTitle: String { return self._s[330]! }
+ public var Permissions_NotificationsAllow_v0: String { return self._s[331]! }
+ public var DialogList_DeleteConversationConfirmation: String { return self._s[333]! }
+ public var ChatList_UndoArchiveRevealedTitle: String { return self._s[334]! }
+ public var AuthSessions_Sessions: String { return self._s[335]! }
public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[335]!, self._r[335]!, [_0])
+ return formatWithArgumentRanges(self._s[337]!, self._r[337]!, [_0])
}
- public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[336]! }
- public var Call_StatusWaiting: String { return self._s[337]! }
- public var CreateGroup_SoftUserLimitAlert: String { return self._s[338]! }
- public var FastTwoStepSetup_HintHelp: String { return self._s[339]! }
- public var WallpaperPreview_CustomColorBottomText: String { return self._s[340]! }
- public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[341]! }
- public var LogoutOptions_AddAccountText: String { return self._s[342]! }
- public var PasscodeSettings_6DigitCode: String { return self._s[343]! }
- public var Settings_LogoutConfirmationText: String { return self._s[344]! }
- public var Passport_Identity_TypePassport: String { return self._s[346]! }
+ public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[338]! }
+ public var Call_StatusWaiting: String { return self._s[339]! }
+ public var CreateGroup_SoftUserLimitAlert: String { return self._s[340]! }
+ public var FastTwoStepSetup_HintHelp: String { return self._s[341]! }
+ public var WallpaperPreview_CustomColorBottomText: String { return self._s[342]! }
+ public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[343]! }
+ public var LogoutOptions_AddAccountText: String { return self._s[344]! }
+ public var PasscodeSettings_6DigitCode: String { return self._s[345]! }
+ public var Settings_LogoutConfirmationText: String { return self._s[346]! }
+ public var Passport_Identity_TypePassport: String { return self._s[348]! }
public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[349]!, self._r[349]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[351]!, self._r[351]!, [_1, _2])
}
- public var SocksProxySetup_SaveProxy: String { return self._s[350]! }
- public var AccessDenied_SaveMedia: String { return self._s[351]! }
- public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[353]! }
- public var Settings_Title: String { return self._s[355]! }
- public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[356]! }
- public var Contacts_InviteSearchLabel: String { return self._s[358]! }
- public var ConvertToSupergroup_Title: String { return self._s[359]! }
+ public var SocksProxySetup_SaveProxy: String { return self._s[352]! }
+ public var AccessDenied_SaveMedia: String { return self._s[353]! }
+ public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[355]! }
+ public var Settings_Title: String { return self._s[357]! }
+ public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[358]! }
+ public var Contacts_InviteSearchLabel: String { return self._s[360]! }
+ public var ConvertToSupergroup_Title: String { return self._s[361]! }
public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[360]!, self._r[360]!, [_0])
+ return formatWithArgumentRanges(self._s[362]!, self._r[362]!, [_0])
}
- public var InfoPlist_NSSiriUsageDescription: String { return self._s[361]! }
+ public var InfoPlist_NSSiriUsageDescription: String { return self._s[363]! }
public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[362]!, self._r[362]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[364]!, self._r[364]!, [_1, _2, _3])
}
- public var ChatSettings_AutomaticPhotoDownload: String { return self._s[363]! }
- public var UserInfo_BotHelp: String { return self._s[364]! }
- public var PrivacySettings_LastSeenEverybody: String { return self._s[365]! }
- public var Checkout_Name: String { return self._s[366]! }
- public var AutoDownloadSettings_DataUsage: String { return self._s[367]! }
- public var Channel_BanUser_BlockFor: String { return self._s[368]! }
- public var Checkout_ShippingAddress: String { return self._s[369]! }
- public var AutoDownloadSettings_MaxVideoSize: String { return self._s[370]! }
- public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[371]! }
- public var Privacy_Forwards: String { return self._s[372]! }
- public var Channel_BanUser_PermissionSendPolls: String { return self._s[373]! }
- public var Appearance_ThemeCarouselNewNight: String { return self._s[374]! }
+ public var ChatSettings_AutomaticPhotoDownload: String { return self._s[365]! }
+ public var UserInfo_BotHelp: String { return self._s[366]! }
+ public var PrivacySettings_LastSeenEverybody: String { return self._s[367]! }
+ public var Checkout_Name: String { return self._s[368]! }
+ public var AutoDownloadSettings_DataUsage: String { return self._s[369]! }
+ public var Channel_BanUser_BlockFor: String { return self._s[370]! }
+ public var Checkout_ShippingAddress: String { return self._s[371]! }
+ public var AutoDownloadSettings_MaxVideoSize: String { return self._s[372]! }
+ public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[373]! }
+ public var Privacy_Forwards: String { return self._s[374]! }
+ public var Channel_BanUser_PermissionSendPolls: String { return self._s[375]! }
+ public var Appearance_ThemeCarouselNewNight: String { return self._s[376]! }
public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[377]!, self._r[377]!, [_0])
+ return formatWithArgumentRanges(self._s[379]!, self._r[379]!, [_0])
}
- public var Contacts_SortedByName: String { return self._s[378]! }
- public var Group_OwnershipTransfer_Title: String { return self._s[379]! }
- public var VoiceOver_Chat_OpenHint: String { return self._s[380]! }
- public var Group_LeaveGroup: String { return self._s[381]! }
- public var Settings_UsernameEmpty: String { return self._s[382]! }
+ public var Contacts_SortedByName: String { return self._s[380]! }
+ public var Group_OwnershipTransfer_Title: String { return self._s[381]! }
+ public var VoiceOver_Chat_OpenHint: String { return self._s[382]! }
+ public var Group_LeaveGroup: String { return self._s[383]! }
+ public var Settings_UsernameEmpty: String { return self._s[384]! }
public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[383]!, self._r[383]!, [_0])
+ return formatWithArgumentRanges(self._s[385]!, self._r[385]!, [_0])
}
public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[384]!, self._r[384]!, [_1])
+ return formatWithArgumentRanges(self._s[386]!, self._r[386]!, [_1])
}
public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[385]!, self._r[385]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[387]!, self._r[387]!, [_1, _2])
}
- public var Message_ImageExpired: String { return self._s[386]! }
- public var TwoStepAuth_RecoveryFailed: String { return self._s[388]! }
- public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[389]! }
- public var UserInfo_AddToExisting: String { return self._s[390]! }
- public var TwoStepAuth_EnabledSuccess: String { return self._s[391]! }
- public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[392]! }
+ public var Message_ImageExpired: String { return self._s[388]! }
+ public var TwoStepAuth_RecoveryFailed: String { return self._s[390]! }
+ public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[391]! }
+ public var UserInfo_AddToExisting: String { return self._s[392]! }
+ public var TwoStepAuth_EnabledSuccess: String { return self._s[393]! }
+ public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[394]! }
public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[393]!, self._r[393]!, [_1])
+ return formatWithArgumentRanges(self._s[395]!, self._r[395]!, [_1])
}
- public var Notifications_GroupNotificationsAlert: String { return self._s[394]! }
- public var Passport_Language_km: String { return self._s[395]! }
- public var SocksProxySetup_AdNoticeHelp: String { return self._s[397]! }
- public var VoiceOver_Media_PlaybackPlay: String { return self._s[398]! }
- public var Notification_CallMissedShort: String { return self._s[399]! }
- public var ReportPeer_ReasonOther_Send: String { return self._s[400]! }
- public var Watch_Compose_Send: String { return self._s[401]! }
- public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[404]! }
- public var Conversation_HoldForVideo: String { return self._s[405]! }
- public var CheckoutInfo_ErrorCityInvalid: String { return self._s[407]! }
- public var Appearance_AutoNightThemeDisabled: String { return self._s[409]! }
- public var Channel_LinkItem: String { return self._s[410]! }
+ public var Notifications_GroupNotificationsAlert: String { return self._s[396]! }
+ public var Passport_Language_km: String { return self._s[397]! }
+ public var SocksProxySetup_AdNoticeHelp: String { return self._s[399]! }
+ public var VoiceOver_Media_PlaybackPlay: String { return self._s[400]! }
+ public var Notification_CallMissedShort: String { return self._s[401]! }
+ public var ReportPeer_ReasonOther_Send: String { return self._s[402]! }
+ public var Watch_Compose_Send: String { return self._s[403]! }
+ public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[406]! }
+ public var Conversation_HoldForVideo: String { return self._s[407]! }
+ public var CheckoutInfo_ErrorCityInvalid: String { return self._s[409]! }
+ public var Appearance_AutoNightThemeDisabled: String { return self._s[411]! }
+ public var Channel_LinkItem: String { return self._s[412]! }
public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[411]!, self._r[411]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[413]!, self._r[413]!, [_0, _1])
}
public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[414]!, self._r[414]!, [_0])
+ return formatWithArgumentRanges(self._s[416]!, self._r[416]!, [_0])
}
- public var VoiceOver_Recording_StopAndPreview: String { return self._s[415]! }
- public var Passport_Language_dv: String { return self._s[416]! }
- public var Undo_LeftChannel: String { return self._s[417]! }
- public var Notifications_ExceptionsMuted: String { return self._s[418]! }
- public var ChatList_UnhideAction: String { return self._s[419]! }
- public var Conversation_ContextMenuShare: String { return self._s[420]! }
- public var Conversation_ContextMenuStickerPackInfo: String { return self._s[421]! }
- public var ShareFileTip_Title: String { return self._s[422]! }
- public var NotificationsSound_Chord: String { return self._s[423]! }
+ public var VoiceOver_Recording_StopAndPreview: String { return self._s[417]! }
+ public var Passport_Language_dv: String { return self._s[418]! }
+ public var Undo_LeftChannel: String { return self._s[419]! }
+ public var Notifications_ExceptionsMuted: String { return self._s[420]! }
+ public var ChatList_UnhideAction: String { return self._s[421]! }
+ public var Conversation_ContextMenuShare: String { return self._s[422]! }
+ public var Conversation_ContextMenuStickerPackInfo: String { return self._s[423]! }
+ public var ShareFileTip_Title: String { return self._s[424]! }
+ public var NotificationsSound_Chord: String { return self._s[425]! }
public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[424]!, self._r[424]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[426]!, self._r[426]!, [_1, _2])
}
- public var Passport_Address_EditTemporaryRegistration: String { return self._s[425]! }
+ public var Passport_Address_EditTemporaryRegistration: String { return self._s[427]! }
public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[426]!, self._r[426]!, [_0])
+ return formatWithArgumentRanges(self._s[428]!, self._r[428]!, [_0])
}
- public var Wallpaper_ErrorNotFound: String { return self._s[427]! }
- public var Notification_CallOutgoingShort: String { return self._s[429]! }
+ public var Wallpaper_ErrorNotFound: String { return self._s[429]! }
+ public var Notification_CallOutgoingShort: String { return self._s[431]! }
public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[430]!, self._r[430]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[432]!, self._r[432]!, [_1, _2])
}
- public var Passport_Address_TypeUtilityBill: String { return self._s[431]! }
- public var Privacy_Forwards_LinkIfAllowed: String { return self._s[432]! }
- public var ReportPeer_Report: String { return self._s[433]! }
- public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[434]! }
- public var GroupInfo_DeactivatedStatus: String { return self._s[435]! }
+ public var Passport_Address_TypeUtilityBill: String { return self._s[433]! }
+ public var Privacy_Forwards_LinkIfAllowed: String { return self._s[434]! }
+ public var ReportPeer_Report: String { return self._s[435]! }
+ public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[436]! }
+ public var GroupInfo_DeactivatedStatus: String { return self._s[437]! }
public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[436]!, self._r[436]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[438]!, self._r[438]!, [_1, _2])
}
- public var StickerPack_Send: String { return self._s[437]! }
- public var Login_CodeSentInternal: String { return self._s[438]! }
- public var GroupInfo_InviteLink_LinkSection: String { return self._s[439]! }
+ public var StickerPack_Send: String { return self._s[439]! }
+ public var Login_CodeSentInternal: String { return self._s[440]! }
+ public var GroupInfo_InviteLink_LinkSection: String { return self._s[441]! }
public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[440]!, self._r[440]!, [_0])
- }
- public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[442]!, self._r[442]!, [_0])
}
- public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[443]! }
- public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[444]!, self._r[444]!, [_1])
+ public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[444]!, self._r[444]!, [_0])
}
- public var ReportPeer_ReasonViolence: String { return self._s[446]! }
- public var Map_Locating: String { return self._s[447]! }
+ public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[445]! }
+ public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[446]!, self._r[446]!, [_1])
+ }
+ public var ReportPeer_ReasonViolence: String { return self._s[448]! }
+ public var Map_Locating: String { return self._s[449]! }
public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[448]!, self._r[448]!, [_0])
+ return formatWithArgumentRanges(self._s[450]!, self._r[450]!, [_0])
}
public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[449]!, self._r[449]!, [_1])
+ return formatWithArgumentRanges(self._s[451]!, self._r[451]!, [_1])
}
- public var AutoDownloadSettings_GroupChats: String { return self._s[451]! }
- public var CheckoutInfo_SaveInfo: String { return self._s[452]! }
- public var SharedMedia_EmptyLinksText: String { return self._s[454]! }
- public var Passport_Address_CityPlaceholder: String { return self._s[455]! }
- public var CheckoutInfo_ErrorStateInvalid: String { return self._s[456]! }
- public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[457]! }
- public var Channel_AdminLog_CanAddAdmins: String { return self._s[459]! }
+ public var AutoDownloadSettings_GroupChats: String { return self._s[453]! }
+ public var CheckoutInfo_SaveInfo: String { return self._s[454]! }
+ public var SharedMedia_EmptyLinksText: String { return self._s[456]! }
+ public var Passport_Address_CityPlaceholder: String { return self._s[457]! }
+ public var CheckoutInfo_ErrorStateInvalid: String { return self._s[458]! }
+ public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[459]! }
+ public var Channel_AdminLog_CanAddAdmins: String { return self._s[461]! }
public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[460]!, self._r[460]!, [_1])
+ return formatWithArgumentRanges(self._s[462]!, self._r[462]!, [_1])
}
public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[461]!, self._r[461]!, [_0])
+ return formatWithArgumentRanges(self._s[463]!, self._r[463]!, [_0])
}
- public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[462]! }
- public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[463]! }
- public var ChangePhoneNumberCode_Code: String { return self._s[464]! }
- public var Appearance_CreateTheme: String { return self._s[465]! }
+ public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[464]! }
+ public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[465]! }
+ public var ChangePhoneNumberCode_Code: String { return self._s[466]! }
+ public var Appearance_CreateTheme: String { return self._s[467]! }
public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[466]!, self._r[466]!, [_0])
+ return formatWithArgumentRanges(self._s[468]!, self._r[468]!, [_0])
}
- public var TwoStepAuth_SetupEmail: String { return self._s[467]! }
- public var HashtagSearch_AllChats: String { return self._s[468]! }
- public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[470]! }
+ public var TwoStepAuth_SetupEmail: String { return self._s[469]! }
+ public var HashtagSearch_AllChats: String { return self._s[470]! }
+ public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[472]! }
public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[471]!, self._r[471]!, [_0])
+ return formatWithArgumentRanges(self._s[473]!, self._r[473]!, [_0])
}
- public var PhotoEditor_QualityHigh: String { return self._s[473]! }
+ public var PhotoEditor_QualityHigh: String { return self._s[475]! }
public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[474]!, self._r[474]!, [_0])
+ return formatWithArgumentRanges(self._s[476]!, self._r[476]!, [_0])
}
- public var ApplyLanguage_ApplyLanguageAction: String { return self._s[475]! }
- public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[476]! }
- public var Message_LiveLocation: String { return self._s[477]! }
- public var Cache_LowDiskSpaceText: String { return self._s[478]! }
- public var EditTheme_ErrorLinkTaken: String { return self._s[479]! }
- public var Conversation_SendMessage: String { return self._s[480]! }
- public var AuthSessions_EmptyTitle: String { return self._s[481]! }
- public var Privacy_PhoneNumber: String { return self._s[482]! }
- public var PeopleNearby_CreateGroup: String { return self._s[483]! }
- public var CallSettings_UseLessData: String { return self._s[484]! }
- public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[485]! }
- public var Stickers_AddToFavorites: String { return self._s[486]! }
- public var PhotoEditor_QualityLow: String { return self._s[487]! }
- public var Watch_UserInfo_Unblock: String { return self._s[488]! }
- public var Settings_Logout: String { return self._s[489]! }
+ public var ApplyLanguage_ApplyLanguageAction: String { return self._s[477]! }
+ public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[478]! }
+ public var Message_LiveLocation: String { return self._s[479]! }
+ public var Cache_LowDiskSpaceText: String { return self._s[480]! }
+ public var EditTheme_ErrorLinkTaken: String { return self._s[481]! }
+ public var Conversation_SendMessage: String { return self._s[482]! }
+ public var AuthSessions_EmptyTitle: String { return self._s[483]! }
+ public var Privacy_PhoneNumber: String { return self._s[484]! }
+ public var PeopleNearby_CreateGroup: String { return self._s[485]! }
+ public var CallSettings_UseLessData: String { return self._s[486]! }
+ public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[487]! }
+ public var Stickers_AddToFavorites: String { return self._s[488]! }
+ public var PhotoEditor_QualityLow: String { return self._s[489]! }
+ public var Watch_UserInfo_Unblock: String { return self._s[490]! }
+ public var Settings_Logout: String { return self._s[491]! }
public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[490]!, self._r[490]!, [_1])
+ return formatWithArgumentRanges(self._s[492]!, self._r[492]!, [_1])
}
- public var ContactInfo_PhoneLabelWork: String { return self._s[491]! }
- public var ChannelInfo_Stats: String { return self._s[492]! }
- public var TextFormat_Link: String { return self._s[493]! }
+ public var ContactInfo_PhoneLabelWork: String { return self._s[493]! }
+ public var ChannelInfo_Stats: String { return self._s[494]! }
+ public var TextFormat_Link: String { return self._s[495]! }
public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[494]!, self._r[494]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[496]!, self._r[496]!, [_1, _2])
}
public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[495]!, self._r[495]!, [_0])
+ return formatWithArgumentRanges(self._s[497]!, self._r[497]!, [_0])
}
- public var Watch_Notification_Joined: String { return self._s[496]! }
- public var Group_Setup_TypePublicHelp: String { return self._s[497]! }
- public var Passport_Scans_UploadNew: String { return self._s[498]! }
- public var Checkout_LiabilityAlertTitle: String { return self._s[499]! }
- public var DialogList_Title: String { return self._s[502]! }
- public var NotificationSettings_ContactJoined: String { return self._s[503]! }
- public var GroupInfo_LabelAdmin: String { return self._s[504]! }
- public var KeyCommand_ChatInfo: String { return self._s[505]! }
- public var Conversation_EditingCaptionPanelTitle: String { return self._s[506]! }
- public var Call_ReportIncludeLog: String { return self._s[507]! }
+ public var Watch_Notification_Joined: String { return self._s[498]! }
+ public var Group_Setup_TypePublicHelp: String { return self._s[499]! }
+ public var Passport_Scans_UploadNew: String { return self._s[500]! }
+ public var Checkout_LiabilityAlertTitle: String { return self._s[501]! }
+ public var DialogList_Title: String { return self._s[504]! }
+ public var NotificationSettings_ContactJoined: String { return self._s[505]! }
+ public var GroupInfo_LabelAdmin: String { return self._s[506]! }
+ public var KeyCommand_ChatInfo: String { return self._s[507]! }
+ public var Conversation_EditingCaptionPanelTitle: String { return self._s[508]! }
+ public var Call_ReportIncludeLog: String { return self._s[509]! }
public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[510]!, self._r[510]!, [_0])
+ return formatWithArgumentRanges(self._s[512]!, self._r[512]!, [_0])
}
- public var LocalGroup_IrrelevantWarning: String { return self._s[511]! }
- public var ChatAdmins_AllMembersAreAdmins: String { return self._s[512]! }
- public var Conversation_DefaultRestrictedInline: String { return self._s[513]! }
- public var Message_Sticker: String { return self._s[514]! }
- public var LastSeen_JustNow: String { return self._s[516]! }
- public var Passport_Email_EmailPlaceholder: String { return self._s[518]! }
- public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[519]! }
- public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[520]! }
- public var Channel_EditAdmin_PermissionsHeader: String { return self._s[521]! }
- public var TwoStepAuth_Email: String { return self._s[522]! }
- public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[523]! }
- public var PhotoEditor_BlurToolOff: String { return self._s[524]! }
- public var Message_PinnedStickerMessage: String { return self._s[525]! }
- public var ContactInfo_PhoneLabelPager: String { return self._s[526]! }
- public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[527]! }
- public var Passport_DiscardMessageTitle: String { return self._s[528]! }
- public var Privacy_PaymentsTitle: String { return self._s[529]! }
- public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[530]! }
- public var Channel_DiscussionGroup_Header: String { return self._s[532]! }
- public var VoiceOver_Chat_OptionSelected: String { return self._s[533]! }
- public var Appearance_ColorTheme: String { return self._s[534]! }
- public var UserInfo_ShareContact: String { return self._s[535]! }
- public var Passport_Address_TypePassportRegistration: String { return self._s[536]! }
- public var Common_More: String { return self._s[537]! }
- public var Watch_Message_Call: String { return self._s[538]! }
- public var Profile_EncryptionKey: String { return self._s[541]! }
- public var Privacy_TopPeers: String { return self._s[542]! }
- public var Conversation_StopPollConfirmation: String { return self._s[543]! }
- public var Privacy_TopPeersWarning: String { return self._s[545]! }
- public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[546]! }
- public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[547]! }
- public var DialogList_SearchSectionMessages: String { return self._s[550]! }
- public var Notifications_ChannelNotifications: String { return self._s[551]! }
- public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[552]! }
- public var Passport_Language_sk: String { return self._s[553]! }
- public var Notification_MessageLifetime1h: String { return self._s[554]! }
- public var Wallpaper_ResetWallpapersInfo: String { return self._s[555]! }
- public var Call_ReportSkip: String { return self._s[557]! }
- public var Cache_ServiceFiles: String { return self._s[558]! }
- public var Group_ErrorAddTooMuchAdmins: String { return self._s[559]! }
- public var VoiceOver_Chat_YourFile: String { return self._s[560]! }
- public var Map_Hybrid: String { return self._s[561]! }
- public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[563]! }
- public var ChatSettings_AutoDownloadVideos: String { return self._s[565]! }
- public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[566]! }
- public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[567]! }
- public var SocksProxySetup_ProxyTelegram: String { return self._s[570]! }
+ public var LocalGroup_IrrelevantWarning: String { return self._s[513]! }
+ public var ChatAdmins_AllMembersAreAdmins: String { return self._s[514]! }
+ public var Conversation_DefaultRestrictedInline: String { return self._s[515]! }
+ public var Message_Sticker: String { return self._s[516]! }
+ public var LastSeen_JustNow: String { return self._s[518]! }
+ public var Passport_Email_EmailPlaceholder: String { return self._s[520]! }
+ public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[521]! }
+ public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[522]! }
+ public var Channel_EditAdmin_PermissionsHeader: String { return self._s[523]! }
+ public var TwoStepAuth_Email: String { return self._s[524]! }
+ public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[525]! }
+ public var PhotoEditor_BlurToolOff: String { return self._s[526]! }
+ public var Message_PinnedStickerMessage: String { return self._s[527]! }
+ public var ContactInfo_PhoneLabelPager: String { return self._s[528]! }
+ public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[529]! }
+ public var Passport_DiscardMessageTitle: String { return self._s[530]! }
+ public var Privacy_PaymentsTitle: String { return self._s[531]! }
+ public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[532]! }
+ public var Channel_DiscussionGroup_Header: String { return self._s[534]! }
+ public var VoiceOver_Chat_OptionSelected: String { return self._s[535]! }
+ public var Appearance_ColorTheme: String { return self._s[536]! }
+ public var UserInfo_ShareContact: String { return self._s[537]! }
+ public var Passport_Address_TypePassportRegistration: String { return self._s[538]! }
+ public var Common_More: String { return self._s[539]! }
+ public var Watch_Message_Call: String { return self._s[540]! }
+ public var Profile_EncryptionKey: String { return self._s[543]! }
+ public var Privacy_TopPeers: String { return self._s[544]! }
+ public var Conversation_StopPollConfirmation: String { return self._s[545]! }
+ public var Privacy_TopPeersWarning: String { return self._s[547]! }
+ public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[548]! }
+ public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[549]! }
+ public var DialogList_SearchSectionMessages: String { return self._s[552]! }
+ public var Notifications_ChannelNotifications: String { return self._s[553]! }
+ public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[554]! }
+ public var Passport_Language_sk: String { return self._s[555]! }
+ public var Notification_MessageLifetime1h: String { return self._s[556]! }
+ public var Wallpaper_ResetWallpapersInfo: String { return self._s[557]! }
+ public var Call_ReportSkip: String { return self._s[559]! }
+ public var Cache_ServiceFiles: String { return self._s[560]! }
+ public var Group_ErrorAddTooMuchAdmins: String { return self._s[561]! }
+ public var VoiceOver_Chat_YourFile: String { return self._s[562]! }
+ public var Map_Hybrid: String { return self._s[563]! }
+ public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[565]! }
+ public var ChatSettings_AutoDownloadVideos: String { return self._s[567]! }
+ public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[568]! }
+ public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[569]! }
+ public var SocksProxySetup_ProxyTelegram: String { return self._s[572]! }
public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[571]!, self._r[571]!, [_1])
+ return formatWithArgumentRanges(self._s[573]!, self._r[573]!, [_1])
}
- public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[573]! }
- public var ScheduledMessages_ScheduledToday: String { return self._s[574]! }
+ public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[575]! }
+ public var ScheduledMessages_ScheduledToday: String { return self._s[576]! }
public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[575]!, self._r[575]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[577]!, self._r[577]!, [_1, _2])
}
- public var Conversation_LiveLocationYou: String { return self._s[576]! }
- public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[577]! }
- public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[578]! }
- public var UserInfo_ShareBot: String { return self._s[581]! }
+ public var Conversation_LiveLocationYou: String { return self._s[578]! }
+ public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[579]! }
+ public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[580]! }
+ public var UserInfo_ShareBot: String { return self._s[583]! }
public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[582]!, self._r[582]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[584]!, self._r[584]!, [_1, _2])
}
- public var PhotoEditor_ShadowsTint: String { return self._s[583]! }
- public var Message_Audio: String { return self._s[584]! }
- public var Passport_Language_lt: String { return self._s[585]! }
+ public var PhotoEditor_ShadowsTint: String { return self._s[585]! }
+ public var Message_Audio: String { return self._s[586]! }
+ public var Passport_Language_lt: String { return self._s[587]! }
public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[586]!, self._r[586]!, [_0])
+ return formatWithArgumentRanges(self._s[588]!, self._r[588]!, [_0])
}
- public var Permissions_SiriText_v0: String { return self._s[587]! }
- public var Conversation_FileICloudDrive: String { return self._s[588]! }
- public var Notifications_Badge_IncludeMutedChats: String { return self._s[589]! }
+ public var Permissions_SiriText_v0: String { return self._s[589]! }
+ public var Conversation_FileICloudDrive: String { return self._s[590]! }
+ public var Notifications_Badge_IncludeMutedChats: String { return self._s[591]! }
public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[590]!, self._r[590]!, [_1, _2, _3, _4, _5, _6])
+ return formatWithArgumentRanges(self._s[592]!, self._r[592]!, [_1, _2, _3, _4, _5, _6])
}
- public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[591]! }
+ public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[593]! }
public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[592]!, self._r[592]!, [_0])
+ return formatWithArgumentRanges(self._s[594]!, self._r[594]!, [_0])
}
- public var Channel_SignMessages: String { return self._s[593]! }
+ public var Channel_SignMessages: String { return self._s[595]! }
public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[594]!, self._r[594]!, [_1])
+ return formatWithArgumentRanges(self._s[596]!, self._r[596]!, [_1])
}
- public var Compose_ChannelTokenListPlaceholder: String { return self._s[595]! }
- public var Passport_ScanPassport: String { return self._s[596]! }
- public var Watch_Suggestion_Thanks: String { return self._s[597]! }
- public var BlockedUsers_AddNew: String { return self._s[598]! }
+ public var Compose_ChannelTokenListPlaceholder: String { return self._s[597]! }
+ public var Passport_ScanPassport: String { return self._s[598]! }
+ public var Watch_Suggestion_Thanks: String { return self._s[599]! }
+ public var BlockedUsers_AddNew: String { return self._s[600]! }
public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[599]!, self._r[599]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[601]!, self._r[601]!, [_1, _2])
}
- public var Watch_Message_Invoice: String { return self._s[600]! }
- public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[601]! }
- public var Month_GenJuly: String { return self._s[602]! }
- public var SocksProxySetup_ProxySocks5: String { return self._s[603]! }
- public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[605]! }
- public var Notification_ChannelInviterSelf: String { return self._s[606]! }
- public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[607]! }
+ public var Watch_Message_Invoice: String { return self._s[602]! }
+ public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[603]! }
+ public var Month_GenJuly: String { return self._s[604]! }
+ public var SocksProxySetup_ProxySocks5: String { return self._s[605]! }
+ public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[607]! }
+ public var Notification_ChannelInviterSelf: String { return self._s[608]! }
+ public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[609]! }
public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[608]!, self._r[608]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[610]!, self._r[610]!, [_1, _2])
}
- public var CheckoutInfo_Title: String { return self._s[609]! }
- public var Watch_Stickers_RecentPlaceholder: String { return self._s[610]! }
+ public var CheckoutInfo_Title: String { return self._s[611]! }
+ public var Watch_Stickers_RecentPlaceholder: String { return self._s[612]! }
public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[611]!, self._r[611]!, [_0])
+ return formatWithArgumentRanges(self._s[613]!, self._r[613]!, [_0])
}
- public var Passport_Identity_MainPage: String { return self._s[612]! }
- public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[613]! }
- public var Passport_Language_de: String { return self._s[614]! }
- public var Update_Title: String { return self._s[615]! }
- public var ContactInfo_PhoneLabelWorkFax: String { return self._s[616]! }
- public var Channel_AdminLog_BanEmbedLinks: String { return self._s[617]! }
- public var Passport_Email_UseTelegramEmailHelp: String { return self._s[618]! }
- public var Notifications_ChannelNotificationsPreview: String { return self._s[619]! }
- public var NotificationsSound_Telegraph: String { return self._s[620]! }
- public var Watch_LastSeen_ALongTimeAgo: String { return self._s[621]! }
- public var ChannelMembers_WhoCanAddMembers: String { return self._s[622]! }
+ public var Passport_Identity_MainPage: String { return self._s[614]! }
+ public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[615]! }
+ public var Passport_Language_de: String { return self._s[616]! }
+ public var Update_Title: String { return self._s[617]! }
+ public var ContactInfo_PhoneLabelWorkFax: String { return self._s[618]! }
+ public var Channel_AdminLog_BanEmbedLinks: String { return self._s[619]! }
+ public var Passport_Email_UseTelegramEmailHelp: String { return self._s[620]! }
+ public var Notifications_ChannelNotificationsPreview: String { return self._s[621]! }
+ public var NotificationsSound_Telegraph: String { return self._s[622]! }
+ public var Watch_LastSeen_ALongTimeAgo: String { return self._s[623]! }
+ public var ChannelMembers_WhoCanAddMembers: String { return self._s[624]! }
public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[623]!, self._r[623]!, [_0])
+ return formatWithArgumentRanges(self._s[625]!, self._r[625]!, [_0])
}
- public var Stickers_SuggestAll: String { return self._s[624]! }
- public var Conversation_ForwardTitle: String { return self._s[625]! }
- public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[626]! }
+ public var Stickers_SuggestAll: String { return self._s[626]! }
+ public var Conversation_ForwardTitle: String { return self._s[627]! }
+ public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[628]! }
public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[627]!, self._r[627]!, [_0])
+ return formatWithArgumentRanges(self._s[629]!, self._r[629]!, [_0])
}
- public var Calls_NewCall: String { return self._s[628]! }
- public var Call_StatusEnded: String { return self._s[629]! }
- public var AutoDownloadSettings_DataUsageLow: String { return self._s[630]! }
- public var Settings_ProxyConnected: String { return self._s[631]! }
- public var Channel_AdminLogFilter_EventsPinned: String { return self._s[632]! }
- public var PhotoEditor_QualityVeryLow: String { return self._s[633]! }
- public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[634]! }
- public var Passport_PasswordPlaceholder: String { return self._s[635]! }
- public var Message_PinnedInvoice: String { return self._s[636]! }
- public var Passport_Identity_IssueDate: String { return self._s[637]! }
- public var Passport_Language_pl: String { return self._s[638]! }
+ public var Calls_NewCall: String { return self._s[630]! }
+ public var Call_StatusEnded: String { return self._s[631]! }
+ public var AutoDownloadSettings_DataUsageLow: String { return self._s[632]! }
+ public var Settings_ProxyConnected: String { return self._s[633]! }
+ public var Channel_AdminLogFilter_EventsPinned: String { return self._s[634]! }
+ public var PhotoEditor_QualityVeryLow: String { return self._s[635]! }
+ public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[636]! }
+ public var Passport_PasswordPlaceholder: String { return self._s[637]! }
+ public var Message_PinnedInvoice: String { return self._s[638]! }
+ public var Passport_Identity_IssueDate: String { return self._s[639]! }
+ public var Passport_Language_pl: String { return self._s[640]! }
public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[639]!, self._r[639]!, [_0])
+ return formatWithArgumentRanges(self._s[641]!, self._r[641]!, [_0])
}
- public var SocksProxySetup_PasteFromClipboard: String { return self._s[640]! }
- public var Call_StatusConnecting: String { return self._s[641]! }
+ public var SocksProxySetup_PasteFromClipboard: String { return self._s[642]! }
+ public var Call_StatusConnecting: String { return self._s[643]! }
public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[642]!, self._r[642]!, [_0])
+ return formatWithArgumentRanges(self._s[644]!, self._r[644]!, [_0])
}
- public var ChatSettings_ConnectionType_UseProxy: String { return self._s[644]! }
- public var Common_Edit: String { return self._s[645]! }
- public var PrivacySettings_LastSeenNobody: String { return self._s[646]! }
+ public var ChatSettings_ConnectionType_UseProxy: String { return self._s[646]! }
+ public var Common_Edit: String { return self._s[647]! }
+ public var PrivacySettings_LastSeenNobody: String { return self._s[648]! }
public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[647]!, self._r[647]!, [_0])
+ return formatWithArgumentRanges(self._s[649]!, self._r[649]!, [_0])
}
- public var GroupInfo_ChatAdmins: String { return self._s[648]! }
- public var PrivateDataSettings_Title: String { return self._s[649]! }
- public var Login_CancelPhoneVerificationStop: String { return self._s[650]! }
- public var ChatList_Read: String { return self._s[651]! }
- public var Undo_ChatClearedForBothSides: String { return self._s[652]! }
- public var GroupPermission_SectionTitle: String { return self._s[653]! }
+ public var GroupInfo_ChatAdmins: String { return self._s[650]! }
+ public var PrivateDataSettings_Title: String { return self._s[651]! }
+ public var Login_CancelPhoneVerificationStop: String { return self._s[652]! }
+ public var ChatList_Read: String { return self._s[653]! }
+ public var Undo_ChatClearedForBothSides: String { return self._s[654]! }
+ public var GroupPermission_SectionTitle: String { return self._s[655]! }
public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[655]!, self._r[655]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[657]!, self._r[657]!, [_1, _2])
}
- public var Checkout_ErrorPaymentFailed: String { return self._s[656]! }
- public var Update_UpdateApp: String { return self._s[657]! }
- public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[658]! }
- public var Settings_Appearance: String { return self._s[659]! }
- public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[662]! }
- public var Watch_Location_Access: String { return self._s[663]! }
- public var ShareMenu_CopyShareLink: String { return self._s[665]! }
- public var TwoStepAuth_SetupHintTitle: String { return self._s[666]! }
- public var Conversation_Theme: String { return self._s[668]! }
+ public var Checkout_ErrorPaymentFailed: String { return self._s[658]! }
+ public var Update_UpdateApp: String { return self._s[659]! }
+ public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[660]! }
+ public var Settings_Appearance: String { return self._s[661]! }
+ public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[664]! }
+ public var Watch_Location_Access: String { return self._s[665]! }
+ public var ShareMenu_CopyShareLink: String { return self._s[667]! }
+ public var TwoStepAuth_SetupHintTitle: String { return self._s[668]! }
+ public var Conversation_Theme: String { return self._s[670]! }
public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[669]!, self._r[669]!, [_0])
+ return formatWithArgumentRanges(self._s[671]!, self._r[671]!, [_0])
}
- public var Notifications_ClassicTones: String { return self._s[670]! }
- public var Weekday_ShortWednesday: String { return self._s[671]! }
- public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[672]! }
- public var Undo_LeftGroup: String { return self._s[675]! }
- public var Conversation_LinkDialogCopy: String { return self._s[676]! }
- public var KeyCommand_FocusOnInputField: String { return self._s[678]! }
- public var Contacts_SelectAll: String { return self._s[679]! }
- public var Preview_SaveToCameraRoll: String { return self._s[680]! }
- public var PrivacySettings_PasscodeOff: String { return self._s[681]! }
- public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[682]! }
- public var Wallpaper_Title: String { return self._s[683]! }
- public var Conversation_FilePhotoOrVideo: String { return self._s[684]! }
- public var AccessDenied_Camera: String { return self._s[685]! }
- public var Watch_Compose_CurrentLocation: String { return self._s[686]! }
- public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[688]! }
+ public var Notifications_ClassicTones: String { return self._s[672]! }
+ public var Weekday_ShortWednesday: String { return self._s[673]! }
+ public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[674]! }
+ public var Undo_LeftGroup: String { return self._s[677]! }
+ public var Conversation_LinkDialogCopy: String { return self._s[678]! }
+ public var KeyCommand_FocusOnInputField: String { return self._s[680]! }
+ public var Contacts_SelectAll: String { return self._s[681]! }
+ public var Preview_SaveToCameraRoll: String { return self._s[682]! }
+ public var PrivacySettings_PasscodeOff: String { return self._s[683]! }
+ public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[684]! }
+ public var Wallpaper_Title: String { return self._s[685]! }
+ public var Conversation_FilePhotoOrVideo: String { return self._s[686]! }
+ public var AccessDenied_Camera: String { return self._s[687]! }
+ public var Watch_Compose_CurrentLocation: String { return self._s[688]! }
+ public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[690]! }
public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[689]!, self._r[689]!, [_0])
+ return formatWithArgumentRanges(self._s[691]!, self._r[691]!, [_0])
}
- public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[690]! }
- public var Passport_Language_ro: String { return self._s[691]! }
- public var EditTheme_UploadNewTheme: String { return self._s[692]! }
- public var CheckoutInfo_SaveInfoHelp: String { return self._s[693]! }
+ public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[692]! }
+ public var Passport_Language_ro: String { return self._s[693]! }
+ public var EditTheme_UploadNewTheme: String { return self._s[694]! }
+ public var CheckoutInfo_SaveInfoHelp: String { return self._s[695]! }
public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[694]!, self._r[694]!, [_0])
+ return formatWithArgumentRanges(self._s[696]!, self._r[696]!, [_0])
}
- public var Login_CancelPhoneVerification: String { return self._s[695]! }
- public var State_ConnectingToProxy: String { return self._s[696]! }
- public var Calls_RatingTitle: String { return self._s[697]! }
- public var Generic_ErrorMoreInfo: String { return self._s[698]! }
- public var Appearance_PreviewReplyText: String { return self._s[699]! }
- public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[700]! }
- public var SharedMedia_CategoryLinks: String { return self._s[701]! }
- public var Calls_Missed: String { return self._s[702]! }
- public var Cache_Photos: String { return self._s[706]! }
- public var GroupPermission_NoAddMembers: String { return self._s[707]! }
- public var ScheduledMessages_Title: String { return self._s[708]! }
+ public var Login_CancelPhoneVerification: String { return self._s[697]! }
+ public var State_ConnectingToProxy: String { return self._s[698]! }
+ public var Calls_RatingTitle: String { return self._s[699]! }
+ public var Generic_ErrorMoreInfo: String { return self._s[700]! }
+ public var Appearance_PreviewReplyText: String { return self._s[701]! }
+ public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[702]! }
+ public var SharedMedia_CategoryLinks: String { return self._s[703]! }
+ public var Calls_Missed: String { return self._s[704]! }
+ public var Cache_Photos: String { return self._s[708]! }
+ public var GroupPermission_NoAddMembers: String { return self._s[709]! }
+ public var ScheduledMessages_Title: String { return self._s[710]! }
public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[709]!, self._r[709]!, [_0])
+ return formatWithArgumentRanges(self._s[711]!, self._r[711]!, [_0])
}
- public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[710]! }
- public var Settings_ProxyDisabled: String { return self._s[711]! }
+ public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[712]! }
+ public var Settings_ProxyDisabled: String { return self._s[713]! }
public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[712]!, self._r[712]!, [_1, _2, _3, _4])
+ return formatWithArgumentRanges(self._s[714]!, self._r[714]!, [_1, _2, _3, _4])
}
public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[713]!, self._r[713]!, [_0])
+ return formatWithArgumentRanges(self._s[715]!, self._r[715]!, [_0])
}
- public var Appearance_Title: String { return self._s[715]! }
+ public var ChatList_Context_RemoveFromRecents: String { return self._s[717]! }
+ public var Appearance_Title: String { return self._s[718]! }
public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[717]!, self._r[717]!, [_0])
+ return formatWithArgumentRanges(self._s[720]!, self._r[720]!, [_0])
}
- public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[718]! }
- public var Channel_EditMessageErrorGeneric: String { return self._s[719]! }
- public var Privacy_Calls_IntegrationHelp: String { return self._s[720]! }
- public var Preview_DeletePhoto: String { return self._s[721]! }
- public var Appearance_AppIconFilledX: String { return self._s[722]! }
- public var PrivacySettings_PrivacyTitle: String { return self._s[723]! }
+ public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[721]! }
+ public var Channel_EditMessageErrorGeneric: String { return self._s[722]! }
+ public var Privacy_Calls_IntegrationHelp: String { return self._s[723]! }
+ public var Preview_DeletePhoto: String { return self._s[724]! }
+ public var Appearance_AppIconFilledX: String { return self._s[725]! }
+ public var PrivacySettings_PrivacyTitle: String { return self._s[726]! }
public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[724]!, self._r[724]!, [_0])
+ return formatWithArgumentRanges(self._s[727]!, self._r[727]!, [_0])
}
- public var Coub_TapForSound: String { return self._s[726]! }
- public var Map_LocatingError: String { return self._s[727]! }
- public var TwoStepAuth_EmailChangeSuccess: String { return self._s[729]! }
- public var Conversation_SendMessage_SendSilently: String { return self._s[730]! }
- public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[731]! }
- public var Passport_ForgottenPassword: String { return self._s[732]! }
- public var GroupInfo_InviteLink_RevokeLink: String { return self._s[733]! }
- public var StickerPacksSettings_ArchivedPacks: String { return self._s[734]! }
- public var Login_TermsOfServiceSignupDecline: String { return self._s[736]! }
- public var Channel_Moderator_AccessLevelRevoke: String { return self._s[737]! }
- public var Message_Location: String { return self._s[738]! }
- public var Passport_Identity_NamePlaceholder: String { return self._s[739]! }
- public var Channel_Management_Title: String { return self._s[740]! }
- public var DialogList_SearchSectionDialogs: String { return self._s[742]! }
- public var Compose_NewChannel_Members: String { return self._s[743]! }
+ public var Coub_TapForSound: String { return self._s[729]! }
+ public var Map_LocatingError: String { return self._s[730]! }
+ public var TwoStepAuth_EmailChangeSuccess: String { return self._s[732]! }
+ public var Conversation_SendMessage_SendSilently: String { return self._s[733]! }
+ public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[734]! }
+ public var Passport_ForgottenPassword: String { return self._s[735]! }
+ public var GroupInfo_InviteLink_RevokeLink: String { return self._s[736]! }
+ public var StickerPacksSettings_ArchivedPacks: String { return self._s[737]! }
+ public var Login_TermsOfServiceSignupDecline: String { return self._s[739]! }
+ public var Channel_Moderator_AccessLevelRevoke: String { return self._s[740]! }
+ public var Message_Location: String { return self._s[741]! }
+ public var Passport_Identity_NamePlaceholder: String { return self._s[742]! }
+ public var Channel_Management_Title: String { return self._s[743]! }
+ public var DialogList_SearchSectionDialogs: String { return self._s[745]! }
+ public var Compose_NewChannel_Members: String { return self._s[746]! }
public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[744]!, self._r[744]!, [_0])
+ return formatWithArgumentRanges(self._s[747]!, self._r[747]!, [_0])
}
- public var GroupInfo_Location: String { return self._s[745]! }
- public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[746]! }
- public var AutoNightTheme_ScheduledFrom: String { return self._s[747]! }
- public var PhotoEditor_WarmthTool: String { return self._s[748]! }
- public var Passport_Language_tr: String { return self._s[749]! }
+ public var GroupInfo_Location: String { return self._s[748]! }
+ public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[749]! }
+ public var AutoNightTheme_ScheduledFrom: String { return self._s[750]! }
+ public var PhotoEditor_WarmthTool: String { return self._s[751]! }
+ public var Passport_Language_tr: String { return self._s[752]! }
public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[750]!, self._r[750]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[753]!, self._r[753]!, [_1, _2, _3])
}
- public var Login_ResetAccountProtected_Reset: String { return self._s[752]! }
- public var Watch_PhotoView_Title: String { return self._s[753]! }
- public var Passport_Phone_Delete: String { return self._s[754]! }
- public var Undo_ChatDeletedForBothSides: String { return self._s[755]! }
- public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[756]! }
- public var GroupInfo_Permissions: String { return self._s[757]! }
- public var PasscodeSettings_TurnPasscodeOff: String { return self._s[758]! }
- public var Profile_ShareContactButton: String { return self._s[759]! }
- public var ChatSettings_Other: String { return self._s[760]! }
- public var UserInfo_NotificationsDisabled: String { return self._s[761]! }
- public var CheckoutInfo_ShippingInfoCity: String { return self._s[762]! }
- public var LastSeen_WithinAMonth: String { return self._s[763]! }
- public var VoiceOver_Chat_PlayHint: String { return self._s[764]! }
- public var Conversation_ReportGroupLocation: String { return self._s[765]! }
- public var Conversation_EncryptionCanceled: String { return self._s[766]! }
- public var MediaPicker_GroupDescription: String { return self._s[767]! }
- public var WebSearch_Images: String { return self._s[768]! }
+ public var Login_ResetAccountProtected_Reset: String { return self._s[755]! }
+ public var Watch_PhotoView_Title: String { return self._s[756]! }
+ public var Passport_Phone_Delete: String { return self._s[757]! }
+ public var Undo_ChatDeletedForBothSides: String { return self._s[758]! }
+ public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[759]! }
+ public var GroupInfo_Permissions: String { return self._s[760]! }
+ public var PasscodeSettings_TurnPasscodeOff: String { return self._s[761]! }
+ public var Profile_ShareContactButton: String { return self._s[762]! }
+ public var ChatSettings_Other: String { return self._s[763]! }
+ public var UserInfo_NotificationsDisabled: String { return self._s[764]! }
+ public var CheckoutInfo_ShippingInfoCity: String { return self._s[765]! }
+ public var LastSeen_WithinAMonth: String { return self._s[766]! }
+ public var VoiceOver_Chat_PlayHint: String { return self._s[767]! }
+ public var Conversation_ReportGroupLocation: String { return self._s[768]! }
+ public var Conversation_EncryptionCanceled: String { return self._s[769]! }
+ public var MediaPicker_GroupDescription: String { return self._s[770]! }
+ public var WebSearch_Images: String { return self._s[771]! }
public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[769]!, self._r[769]!, [_0])
+ return formatWithArgumentRanges(self._s[772]!, self._r[772]!, [_0])
}
- public var Message_Photo: String { return self._s[770]! }
- public var PasscodeSettings_HelpBottom: String { return self._s[771]! }
- public var AutoDownloadSettings_VideosTitle: String { return self._s[772]! }
- public var VoiceOver_Media_PlaybackRateChange: String { return self._s[773]! }
- public var Passport_Identity_AddDriversLicense: String { return self._s[774]! }
- public var TwoStepAuth_EnterPasswordPassword: String { return self._s[775]! }
- public var NotificationsSound_Calypso: String { return self._s[776]! }
- public var Map_Map: String { return self._s[777]! }
- public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[779]! }
- public var ChatSettings_TextSizeUnits: String { return self._s[780]! }
+ public var Message_Photo: String { return self._s[773]! }
+ public var PasscodeSettings_HelpBottom: String { return self._s[774]! }
+ public var AutoDownloadSettings_VideosTitle: String { return self._s[775]! }
+ public var VoiceOver_Media_PlaybackRateChange: String { return self._s[776]! }
+ public var Passport_Identity_AddDriversLicense: String { return self._s[777]! }
+ public var TwoStepAuth_EnterPasswordPassword: String { return self._s[778]! }
+ public var NotificationsSound_Calypso: String { return self._s[779]! }
+ public var Map_Map: String { return self._s[780]! }
+ public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[782]! }
+ public var ChatSettings_TextSizeUnits: String { return self._s[783]! }
public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_0])
+ return formatWithArgumentRanges(self._s[784]!, self._r[784]!, [_0])
}
- public var Common_of: String { return self._s[782]! }
- public var Conversation_ForwardContacts: String { return self._s[785]! }
+ public var Common_of: String { return self._s[785]! }
+ public var Conversation_ForwardContacts: String { return self._s[788]! }
public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[787]!, self._r[787]!, [_0])
+ return formatWithArgumentRanges(self._s[790]!, self._r[790]!, [_0])
}
- public var Passport_Language_hy: String { return self._s[788]! }
- public var Notifications_MessageNotificationsHelp: String { return self._s[789]! }
- public var AutoDownloadSettings_Reset: String { return self._s[790]! }
- public var Paint_ClearConfirm: String { return self._s[791]! }
- public var Camera_VideoMode: String { return self._s[792]! }
+ public var Passport_Language_hy: String { return self._s[791]! }
+ public var Notifications_MessageNotificationsHelp: String { return self._s[792]! }
+ public var AutoDownloadSettings_Reset: String { return self._s[793]! }
+ public var Paint_ClearConfirm: String { return self._s[794]! }
+ public var Camera_VideoMode: String { return self._s[795]! }
public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[793]!, self._r[793]!, [_0])
+ return formatWithArgumentRanges(self._s[796]!, self._r[796]!, [_0])
}
- public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[794]! }
- public var Conversation_ViewBackground: String { return self._s[795]! }
- public var Passport_Language_el: String { return self._s[796]! }
- public var PhotoEditor_Original: String { return self._s[797]! }
- public var Settings_FAQ_Button: String { return self._s[799]! }
- public var Channel_Setup_PublicNoLink: String { return self._s[801]! }
- public var Conversation_UnsupportedMedia: String { return self._s[802]! }
- public var Conversation_SlideToCancel: String { return self._s[803]! }
- public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[804]! }
- public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[805]! }
- public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[806]! }
- public var Conversation_ReportSpamChannelConfirmation: String { return self._s[807]! }
- public var AutoNightTheme_NotAvailable: String { return self._s[808]! }
- public var Conversation_Owner: String { return self._s[809]! }
- public var Common_Create: String { return self._s[810]! }
- public var Settings_ApplyProxyAlertEnable: String { return self._s[811]! }
- public var Localization_ChooseLanguage: String { return self._s[813]! }
- public var Settings_Proxy: String { return self._s[816]! }
- public var Privacy_TopPeersHelp: String { return self._s[817]! }
- public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[818]! }
- public var Chat_UnsendMyMessages: String { return self._s[819]! }
+ public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[797]! }
+ public var Conversation_ViewBackground: String { return self._s[798]! }
+ public var Passport_Language_el: String { return self._s[799]! }
+ public var PhotoEditor_Original: String { return self._s[800]! }
+ public var Settings_FAQ_Button: String { return self._s[802]! }
+ public var Channel_Setup_PublicNoLink: String { return self._s[804]! }
+ public var Conversation_UnsupportedMedia: String { return self._s[805]! }
+ public var Conversation_SlideToCancel: String { return self._s[806]! }
+ public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[807]! }
+ public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[808]! }
+ public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[809]! }
+ public var Conversation_ReportSpamChannelConfirmation: String { return self._s[810]! }
+ public var AutoNightTheme_NotAvailable: String { return self._s[811]! }
+ public var Conversation_Owner: String { return self._s[812]! }
+ public var Common_Create: String { return self._s[813]! }
+ public var Settings_ApplyProxyAlertEnable: String { return self._s[814]! }
+ public var ContactList_Context_Call: String { return self._s[815]! }
+ public var Localization_ChooseLanguage: String { return self._s[817]! }
+ public var ChatList_Context_AddToContacts: String { return self._s[819]! }
+ public var Settings_Proxy: String { return self._s[821]! }
+ public var Privacy_TopPeersHelp: String { return self._s[822]! }
+ public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[823]! }
+ public var Chat_UnsendMyMessages: String { return self._s[824]! }
public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[820]!, self._r[820]!, [_0])
+ return formatWithArgumentRanges(self._s[825]!, self._r[825]!, [_0])
}
- public var TwoStepAuth_ConfirmationAbort: String { return self._s[821]! }
+ public var TwoStepAuth_ConfirmationAbort: String { return self._s[826]! }
public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[823]!, self._r[823]!, [_0])
+ return formatWithArgumentRanges(self._s[828]!, self._r[828]!, [_0])
}
- public var Contacts_SortedByPresence: String { return self._s[824]! }
- public var Passport_Identity_SurnamePlaceholder: String { return self._s[825]! }
- public var Cache_Title: String { return self._s[826]! }
+ public var Contacts_SortedByPresence: String { return self._s[829]! }
+ public var Passport_Identity_SurnamePlaceholder: String { return self._s[830]! }
+ public var Cache_Title: String { return self._s[831]! }
public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[827]!, self._r[827]!, [_0])
+ return formatWithArgumentRanges(self._s[832]!, self._r[832]!, [_0])
}
- public var TwoStepAuth_EmailCodeExpired: String { return self._s[828]! }
- public var Channel_Moderator_Title: String { return self._s[829]! }
- public var InstantPage_AutoNightTheme: String { return self._s[831]! }
+ public var TwoStepAuth_EmailCodeExpired: String { return self._s[833]! }
+ public var Channel_Moderator_Title: String { return self._s[834]! }
+ public var InstantPage_AutoNightTheme: String { return self._s[836]! }
public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[834]!, self._r[834]!, [_1])
+ return formatWithArgumentRanges(self._s[839]!, self._r[839]!, [_1])
}
- public var Passport_Scans_Upload: String { return self._s[835]! }
- public var Undo_Undo: String { return self._s[837]! }
- public var Contacts_AccessDeniedHelpON: String { return self._s[838]! }
- public var TwoStepAuth_RemovePassword: String { return self._s[839]! }
- public var Common_Delete: String { return self._s[840]! }
- public var Contacts_AddPeopleNearby: String { return self._s[842]! }
- public var Conversation_ContextMenuDelete: String { return self._s[843]! }
- public var SocksProxySetup_Credentials: String { return self._s[844]! }
- public var Appearance_EditTheme: String { return self._s[846]! }
- public var PasscodeSettings_AutoLock_Disabled: String { return self._s[847]! }
- public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[850]! }
- public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[851]! }
- public var Passport_Language_id: String { return self._s[853]! }
- public var WallpaperSearch_ColorTeal: String { return self._s[854]! }
- public var ChannelIntro_Title: String { return self._s[855]! }
+ public var Passport_Scans_Upload: String { return self._s[840]! }
+ public var Undo_Undo: String { return self._s[842]! }
+ public var Contacts_AccessDeniedHelpON: String { return self._s[843]! }
+ public var TwoStepAuth_RemovePassword: String { return self._s[844]! }
+ public var Common_Delete: String { return self._s[845]! }
+ public var Contacts_AddPeopleNearby: String { return self._s[847]! }
+ public var Conversation_ContextMenuDelete: String { return self._s[848]! }
+ public var SocksProxySetup_Credentials: String { return self._s[849]! }
+ public var Appearance_EditTheme: String { return self._s[851]! }
+ public var PasscodeSettings_AutoLock_Disabled: String { return self._s[852]! }
+ public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[855]! }
+ public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[856]! }
+ public var Passport_Language_id: String { return self._s[858]! }
+ public var WallpaperSearch_ColorTeal: String { return self._s[859]! }
+ public var ChannelIntro_Title: String { return self._s[860]! }
public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[856]!, self._r[856]!, [_0])
+ return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_0])
}
- public var VoiceOver_Chat_OpenLinkHint: String { return self._s[858]! }
- public var VoiceOver_Chat_Reply: String { return self._s[859]! }
- public var ScheduledMessages_BotActionUnavailable: String { return self._s[860]! }
- public var Channel_Info_Description: String { return self._s[861]! }
- public var Stickers_FavoriteStickers: String { return self._s[862]! }
- public var Channel_BanUser_PermissionAddMembers: String { return self._s[863]! }
- public var Notifications_DisplayNamesOnLockScreen: String { return self._s[864]! }
- public var Calls_NoMissedCallsPlacehoder: String { return self._s[865]! }
- public var Group_PublicLink_Placeholder: String { return self._s[866]! }
- public var Notifications_ExceptionsDefaultSound: String { return self._s[867]! }
+ public var VoiceOver_Chat_OpenLinkHint: String { return self._s[863]! }
+ public var VoiceOver_Chat_Reply: String { return self._s[864]! }
+ public var ScheduledMessages_BotActionUnavailable: String { return self._s[865]! }
+ public var Channel_Info_Description: String { return self._s[866]! }
+ public var Stickers_FavoriteStickers: String { return self._s[867]! }
+ public var Channel_BanUser_PermissionAddMembers: String { return self._s[868]! }
+ public var Notifications_DisplayNamesOnLockScreen: String { return self._s[869]! }
+ public var Calls_NoMissedCallsPlacehoder: String { return self._s[870]! }
+ public var Group_PublicLink_Placeholder: String { return self._s[871]! }
+ public var Notifications_ExceptionsDefaultSound: String { return self._s[872]! }
public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_1])
+ return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_1])
}
- public var TextFormat_Underline: String { return self._s[869]! }
+ public var TextFormat_Underline: String { return self._s[874]! }
public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_1, _2])
}
public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_0])
+ return formatWithArgumentRanges(self._s[876]!, self._r[876]!, [_0])
}
- public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[872]! }
+ public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[877]! }
public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[878]!, self._r[878]!, [_1, _2])
}
- public var GroupPermission_Delete: String { return self._s[874]! }
- public var Passport_Language_uk: String { return self._s[875]! }
- public var StickerPack_HideStickers: String { return self._s[877]! }
- public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[878]! }
+ public var GroupPermission_Delete: String { return self._s[879]! }
+ public var Passport_Language_uk: String { return self._s[880]! }
+ public var StickerPack_HideStickers: String { return self._s[882]! }
+ public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[883]! }
public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[879]!, self._r[879]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_1, _2])
}
- public var Activity_UploadingVideoMessage: String { return self._s[880]! }
+ public var Activity_UploadingVideoMessage: String { return self._s[885]! }
public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[881]!, self._r[881]!, [_0])
+ return formatWithArgumentRanges(self._s[886]!, self._r[886]!, [_0])
}
- public var Channel_TitleInfo: String { return self._s[882]! }
- public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[883]! }
- public var Settings_CallSettings: String { return self._s[884]! }
- public var Camera_SquareMode: String { return self._s[885]! }
- public var Conversation_SendMessage_ScheduleMessage: String { return self._s[886]! }
- public var GroupInfo_SharedMediaNone: String { return self._s[887]! }
+ public var Channel_TitleInfo: String { return self._s[887]! }
+ public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[888]! }
+ public var Settings_CallSettings: String { return self._s[889]! }
+ public var Camera_SquareMode: String { return self._s[890]! }
+ public var Conversation_SendMessage_ScheduleMessage: String { return self._s[891]! }
+ public var GroupInfo_SharedMediaNone: String { return self._s[892]! }
public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[888]!, self._r[888]!, [_1])
+ return formatWithArgumentRanges(self._s[893]!, self._r[893]!, [_1])
}
- public var Bot_GenericBotStatus: String { return self._s[889]! }
- public var Application_Update: String { return self._s[891]! }
- public var Month_ShortJanuary: String { return self._s[892]! }
- public var Contacts_PermissionsKeepDisabled: String { return self._s[893]! }
- public var Channel_AdminLog_BanReadMessages: String { return self._s[894]! }
- public var Settings_AppLanguage_Unofficial: String { return self._s[895]! }
- public var Passport_Address_Street2Placeholder: String { return self._s[896]! }
+ public var Bot_GenericBotStatus: String { return self._s[894]! }
+ public var Application_Update: String { return self._s[896]! }
+ public var Month_ShortJanuary: String { return self._s[897]! }
+ public var Contacts_PermissionsKeepDisabled: String { return self._s[898]! }
+ public var Channel_AdminLog_BanReadMessages: String { return self._s[899]! }
+ public var Settings_AppLanguage_Unofficial: String { return self._s[900]! }
+ public var Passport_Address_Street2Placeholder: String { return self._s[901]! }
public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[897]!, self._r[897]!, [_0])
+ return formatWithArgumentRanges(self._s[902]!, self._r[902]!, [_0])
}
- public var NetworkUsageSettings_Cellular: String { return self._s[898]! }
- public var Appearance_PreviewOutgoingText: String { return self._s[899]! }
- public var Notifications_PermissionsAllowInSettings: String { return self._s[900]! }
- public var AutoDownloadSettings_OnForAll: String { return self._s[902]! }
- public var Map_Directions: String { return self._s[903]! }
- public var Passport_FieldIdentityTranslationHelp: String { return self._s[905]! }
- public var Appearance_ThemeDay: String { return self._s[906]! }
- public var LogoutOptions_LogOut: String { return self._s[907]! }
- public var Group_PublicLink_Title: String { return self._s[909]! }
- public var Channel_AddBotErrorNoRights: String { return self._s[910]! }
- public var Passport_Identity_AddPassport: String { return self._s[911]! }
- public var LocalGroup_ButtonTitle: String { return self._s[912]! }
- public var Call_Message: String { return self._s[913]! }
- public var PhotoEditor_ExposureTool: String { return self._s[914]! }
- public var Passport_FieldOneOf_Delimeter: String { return self._s[916]! }
- public var Channel_AdminLog_CanBanUsers: String { return self._s[918]! }
- public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[919]! }
- public var Appearance_Preview: String { return self._s[920]! }
- public var Compose_ChannelMembers: String { return self._s[921]! }
- public var Conversation_DeleteManyMessages: String { return self._s[922]! }
- public var ReportPeer_ReasonOther_Title: String { return self._s[923]! }
- public var Checkout_ErrorProviderAccountTimeout: String { return self._s[924]! }
- public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[925]! }
- public var Channel_Stickers_CreateYourOwn: String { return self._s[928]! }
- public var Conversation_UpdateTelegram: String { return self._s[929]! }
- public var EditTheme_Create_TopInfo: String { return self._s[930]! }
+ public var NetworkUsageSettings_Cellular: String { return self._s[903]! }
+ public var Appearance_PreviewOutgoingText: String { return self._s[904]! }
+ public var Notifications_PermissionsAllowInSettings: String { return self._s[905]! }
+ public var AutoDownloadSettings_OnForAll: String { return self._s[907]! }
+ public var Map_Directions: String { return self._s[908]! }
+ public var Passport_FieldIdentityTranslationHelp: String { return self._s[910]! }
+ public var Appearance_ThemeDay: String { return self._s[911]! }
+ public var LogoutOptions_LogOut: String { return self._s[912]! }
+ public var Group_PublicLink_Title: String { return self._s[914]! }
+ public var Channel_AddBotErrorNoRights: String { return self._s[915]! }
+ public var Passport_Identity_AddPassport: String { return self._s[916]! }
+ public var LocalGroup_ButtonTitle: String { return self._s[917]! }
+ public var Call_Message: String { return self._s[918]! }
+ public var PhotoEditor_ExposureTool: String { return self._s[919]! }
+ public var Passport_FieldOneOf_Delimeter: String { return self._s[921]! }
+ public var Channel_AdminLog_CanBanUsers: String { return self._s[923]! }
+ public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[924]! }
+ public var Appearance_Preview: String { return self._s[925]! }
+ public var Compose_ChannelMembers: String { return self._s[926]! }
+ public var Conversation_DeleteManyMessages: String { return self._s[927]! }
+ public var ReportPeer_ReasonOther_Title: String { return self._s[928]! }
+ public var Checkout_ErrorProviderAccountTimeout: String { return self._s[929]! }
+ public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[930]! }
+ public var Channel_Stickers_CreateYourOwn: String { return self._s[933]! }
+ public var Conversation_UpdateTelegram: String { return self._s[934]! }
+ public var EditTheme_Create_TopInfo: String { return self._s[935]! }
public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[931]!, self._r[931]!, [_0])
+ return formatWithArgumentRanges(self._s[936]!, self._r[936]!, [_0])
}
public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[932]!, self._r[932]!, [_1])
+ return formatWithArgumentRanges(self._s[937]!, self._r[937]!, [_1])
}
- public var GroupInfo_Administrators_Title: String { return self._s[933]! }
- public var Privacy_Forwards_PreviewMessageText: String { return self._s[934]! }
+ public var GroupInfo_Administrators_Title: String { return self._s[938]! }
+ public var Privacy_Forwards_PreviewMessageText: String { return self._s[939]! }
public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_0])
+ return formatWithArgumentRanges(self._s[940]!, self._r[940]!, [_0])
}
- public var Tour_Title3: String { return self._s[936]! }
- public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[937]! }
- public var Clipboard_SendPhoto: String { return self._s[941]! }
- public var MediaPicker_Videos: String { return self._s[942]! }
- public var Passport_Email_Title: String { return self._s[943]! }
+ public var Tour_Title3: String { return self._s[941]! }
+ public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[942]! }
+ public var Clipboard_SendPhoto: String { return self._s[946]! }
+ public var MediaPicker_Videos: String { return self._s[947]! }
+ public var Passport_Email_Title: String { return self._s[948]! }
public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[944]!, self._r[944]!, [_0])
+ return formatWithArgumentRanges(self._s[949]!, self._r[949]!, [_0])
}
- public var StickerPacksSettings_Title: String { return self._s[945]! }
- public var Conversation_MessageDialogDelete: String { return self._s[946]! }
- public var Privacy_Calls_CustomHelp: String { return self._s[948]! }
- public var Message_Wallpaper: String { return self._s[949]! }
- public var MemberSearch_BotSection: String { return self._s[950]! }
- public var GroupInfo_SetSound: String { return self._s[951]! }
- public var Core_ServiceUserStatus: String { return self._s[952]! }
- public var LiveLocationUpdated_JustNow: String { return self._s[953]! }
- public var Call_StatusFailed: String { return self._s[954]! }
- public var TwoStepAuth_SetupPasswordDescription: String { return self._s[955]! }
- public var TwoStepAuth_SetPassword: String { return self._s[956]! }
- public var Permissions_PeopleNearbyText_v0: String { return self._s[957]! }
+ public var StickerPacksSettings_Title: String { return self._s[950]! }
+ public var Conversation_MessageDialogDelete: String { return self._s[951]! }
+ public var Privacy_Calls_CustomHelp: String { return self._s[953]! }
+ public var Message_Wallpaper: String { return self._s[954]! }
+ public var MemberSearch_BotSection: String { return self._s[955]! }
+ public var GroupInfo_SetSound: String { return self._s[956]! }
+ public var Core_ServiceUserStatus: String { return self._s[957]! }
+ public var LiveLocationUpdated_JustNow: String { return self._s[958]! }
+ public var Call_StatusFailed: String { return self._s[959]! }
+ public var TwoStepAuth_SetupPasswordDescription: String { return self._s[960]! }
+ public var TwoStepAuth_SetPassword: String { return self._s[961]! }
+ public var Permissions_PeopleNearbyText_v0: String { return self._s[962]! }
public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[959]!, self._r[959]!, [_0])
+ return formatWithArgumentRanges(self._s[964]!, self._r[964]!, [_0])
}
- public var Calls_SubmitRating: String { return self._s[960]! }
- public var Profile_Username: String { return self._s[961]! }
- public var Bot_DescriptionTitle: String { return self._s[962]! }
- public var MaskStickerSettings_Title: String { return self._s[963]! }
- public var SharedMedia_CategoryOther: String { return self._s[964]! }
- public var GroupInfo_SetGroupPhoto: String { return self._s[965]! }
- public var Common_NotNow: String { return self._s[966]! }
- public var CallFeedback_IncludeLogsInfo: String { return self._s[967]! }
- public var Conversation_ShareMyPhoneNumber: String { return self._s[968]! }
- public var Map_Location: String { return self._s[969]! }
- public var Invitation_JoinGroup: String { return self._s[970]! }
- public var AutoDownloadSettings_Title: String { return self._s[972]! }
- public var Conversation_DiscardVoiceMessageDescription: String { return self._s[973]! }
- public var Channel_ErrorAddBlocked: String { return self._s[974]! }
- public var Conversation_UnblockUser: String { return self._s[975]! }
- public var EditTheme_Edit_TopInfo: String { return self._s[976]! }
- public var Watch_Bot_Restart: String { return self._s[977]! }
- public var TwoStepAuth_Title: String { return self._s[978]! }
- public var Channel_AdminLog_BanSendMessages: String { return self._s[979]! }
- public var Checkout_ShippingMethod: String { return self._s[980]! }
- public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[981]! }
+ public var Calls_SubmitRating: String { return self._s[965]! }
+ public var Profile_Username: String { return self._s[966]! }
+ public var Bot_DescriptionTitle: String { return self._s[967]! }
+ public var MaskStickerSettings_Title: String { return self._s[968]! }
+ public var SharedMedia_CategoryOther: String { return self._s[969]! }
+ public var GroupInfo_SetGroupPhoto: String { return self._s[970]! }
+ public var Common_NotNow: String { return self._s[971]! }
+ public var CallFeedback_IncludeLogsInfo: String { return self._s[972]! }
+ public var Conversation_ShareMyPhoneNumber: String { return self._s[973]! }
+ public var Map_Location: String { return self._s[974]! }
+ public var Invitation_JoinGroup: String { return self._s[975]! }
+ public var AutoDownloadSettings_Title: String { return self._s[977]! }
+ public var Conversation_DiscardVoiceMessageDescription: String { return self._s[978]! }
+ public var Channel_ErrorAddBlocked: String { return self._s[979]! }
+ public var Conversation_UnblockUser: String { return self._s[980]! }
+ public var EditTheme_Edit_TopInfo: String { return self._s[981]! }
+ public var Watch_Bot_Restart: String { return self._s[982]! }
+ public var TwoStepAuth_Title: String { return self._s[983]! }
+ public var Channel_AdminLog_BanSendMessages: String { return self._s[984]! }
+ public var Checkout_ShippingMethod: String { return self._s[985]! }
+ public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[986]! }
public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[982]!, self._r[982]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[987]!, self._r[987]!, [_1, _2, _3])
}
public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[984]!, self._r[984]!, [_0])
+ return formatWithArgumentRanges(self._s[989]!, self._r[989]!, [_0])
}
public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[985]!, self._r[985]!, [_0])
+ return formatWithArgumentRanges(self._s[990]!, self._r[990]!, [_0])
}
- public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[986]! }
- public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[987]! }
- public var AuthSessions_TerminateOtherSessions: String { return self._s[988]! }
- public var Contacts_FailedToSendInvitesMessage: String { return self._s[989]! }
- public var PrivacySettings_TwoStepAuth: String { return self._s[990]! }
- public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[991]! }
- public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[992]! }
- public var Conversation_EditingMessagePanelMedia: String { return self._s[993]! }
- public var Checkout_PaymentMethod_Title: String { return self._s[994]! }
- public var SocksProxySetup_Connection: String { return self._s[995]! }
- public var Group_MessagePhotoRemoved: String { return self._s[996]! }
- public var Channel_Stickers_NotFound: String { return self._s[999]! }
- public var Group_About_Help: String { return self._s[1000]! }
- public var Notification_PassportValueProofOfIdentity: String { return self._s[1001]! }
- public var PeopleNearby_Title: String { return self._s[1003]! }
+ public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[991]! }
+ public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[992]! }
+ public var AuthSessions_TerminateOtherSessions: String { return self._s[993]! }
+ public var Contacts_FailedToSendInvitesMessage: String { return self._s[994]! }
+ public var PrivacySettings_TwoStepAuth: String { return self._s[995]! }
+ public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[996]! }
+ public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[997]! }
+ public var Conversation_EditingMessagePanelMedia: String { return self._s[998]! }
+ public var Checkout_PaymentMethod_Title: String { return self._s[999]! }
+ public var SocksProxySetup_Connection: String { return self._s[1000]! }
+ public var Group_MessagePhotoRemoved: String { return self._s[1001]! }
+ public var Channel_Stickers_NotFound: String { return self._s[1004]! }
+ public var Group_About_Help: String { return self._s[1005]! }
+ public var Notification_PassportValueProofOfIdentity: String { return self._s[1006]! }
+ public var PeopleNearby_Title: String { return self._s[1008]! }
public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1004]!, self._r[1004]!, [_1])
+ return formatWithArgumentRanges(self._s[1009]!, self._r[1009]!, [_1])
}
- public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1006]! }
- public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1007]! }
- public var SocksProxySetup_Password: String { return self._s[1008]! }
- public var Notifications_PermissionsEnable: String { return self._s[1009]! }
- public var TwoStepAuth_ChangeEmail: String { return self._s[1011]! }
+ public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1011]! }
+ public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1012]! }
+ public var SocksProxySetup_Password: String { return self._s[1013]! }
+ public var Notifications_PermissionsEnable: String { return self._s[1014]! }
+ public var TwoStepAuth_ChangeEmail: String { return self._s[1016]! }
public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1012]!, self._r[1012]!, [_1])
+ return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_1])
}
public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1014]!, self._r[1014]!, [_0])
+ return formatWithArgumentRanges(self._s[1019]!, self._r[1019]!, [_0])
}
- public var Passport_Identity_TypeDriversLicense: String { return self._s[1015]! }
- public var ArchivedPacksAlert_Title: String { return self._s[1016]! }
+ public var Passport_Identity_TypeDriversLicense: String { return self._s[1020]! }
+ public var ArchivedPacksAlert_Title: String { return self._s[1021]! }
public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1022]!, self._r[1022]!, [_1, _2, _3])
}
- public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1018]! }
- public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1020]! }
- public var Conversation_StatusTyping: String { return self._s[1021]! }
- public var Broadcast_AdminLog_EmptyText: String { return self._s[1022]! }
- public var Notification_PassportValueProofOfAddress: String { return self._s[1023]! }
- public var UserInfo_CreateNewContact: String { return self._s[1024]! }
- public var Passport_Identity_FrontSide: String { return self._s[1025]! }
- public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1026]! }
- public var Calls_CallTabTitle: String { return self._s[1027]! }
- public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1028]! }
+ public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1023]! }
+ public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1025]! }
+ public var Conversation_StatusTyping: String { return self._s[1026]! }
+ public var Broadcast_AdminLog_EmptyText: String { return self._s[1027]! }
+ public var Notification_PassportValueProofOfAddress: String { return self._s[1028]! }
+ public var UserInfo_CreateNewContact: String { return self._s[1029]! }
+ public var Passport_Identity_FrontSide: String { return self._s[1030]! }
+ public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1031]! }
+ public var Calls_CallTabTitle: String { return self._s[1032]! }
+ public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1033]! }
public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1030]!, self._r[1030]!, [_0])
+ return formatWithArgumentRanges(self._s[1035]!, self._r[1035]!, [_0])
}
- public var Watch_UserInfo_MuteTitle: String { return self._s[1031]! }
- public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1032]! }
- public var SharedMedia_EmptyMusicText: String { return self._s[1033]! }
- public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1034]! }
- public var Paint_Stickers: String { return self._s[1035]! }
- public var Privacy_GroupsAndChannels: String { return self._s[1036]! }
- public var UserInfo_AddContact: String { return self._s[1038]! }
+ public var Watch_UserInfo_MuteTitle: String { return self._s[1036]! }
+ public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1037]! }
+ public var SharedMedia_EmptyMusicText: String { return self._s[1038]! }
+ public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1039]! }
+ public var Paint_Stickers: String { return self._s[1040]! }
+ public var Privacy_GroupsAndChannels: String { return self._s[1041]! }
+ public var ChatList_Context_Delete: String { return self._s[1043]! }
+ public var UserInfo_AddContact: String { return self._s[1044]! }
public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1039]!, self._r[1039]!, [_0])
+ return formatWithArgumentRanges(self._s[1045]!, self._r[1045]!, [_0])
}
- public var PhoneNumberHelp_ChangeNumber: String { return self._s[1041]! }
+ public var PhoneNumberHelp_ChangeNumber: String { return self._s[1047]! }
public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1043]!, self._r[1043]!, [_0])
+ return formatWithArgumentRanges(self._s[1049]!, self._r[1049]!, [_0])
}
- public var DialogList_NoMessagesTitle: String { return self._s[1044]! }
- public var EditProfile_NameAndPhotoHelp: String { return self._s[1045]! }
- public var BlockedUsers_BlockUser: String { return self._s[1046]! }
- public var Notifications_PermissionsOpenSettings: String { return self._s[1047]! }
- public var MediaPicker_UngroupDescription: String { return self._s[1048]! }
- public var Watch_NoConnection: String { return self._s[1049]! }
- public var Month_GenSeptember: String { return self._s[1050]! }
- public var Conversation_ViewGroup: String { return self._s[1051]! }
- public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1054]! }
- public var Privacy_Forwards_AlwaysLink: String { return self._s[1055]! }
- public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1056]! }
- public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1057]! }
- public var MediaPicker_CameraRoll: String { return self._s[1059]! }
- public var Month_GenAugust: String { return self._s[1060]! }
- public var AccessDenied_VideoMessageMicrophone: String { return self._s[1061]! }
- public var SharedMedia_EmptyText: String { return self._s[1062]! }
- public var Map_ShareLiveLocation: String { return self._s[1063]! }
- public var Calls_All: String { return self._s[1064]! }
- public var Appearance_ThemeNight: String { return self._s[1067]! }
- public var Conversation_HoldForAudio: String { return self._s[1068]! }
- public var SettingsSearch_Synonyms_Support: String { return self._s[1071]! }
- public var GroupInfo_GroupHistoryHidden: String { return self._s[1072]! }
- public var SocksProxySetup_Secret: String { return self._s[1073]! }
+ public var DialogList_NoMessagesTitle: String { return self._s[1050]! }
+ public var EditProfile_NameAndPhotoHelp: String { return self._s[1051]! }
+ public var BlockedUsers_BlockUser: String { return self._s[1052]! }
+ public var Notifications_PermissionsOpenSettings: String { return self._s[1053]! }
+ public var MediaPicker_UngroupDescription: String { return self._s[1054]! }
+ public var Watch_NoConnection: String { return self._s[1055]! }
+ public var Month_GenSeptember: String { return self._s[1056]! }
+ public var Conversation_ViewGroup: String { return self._s[1057]! }
+ public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1060]! }
+ public var Privacy_Forwards_AlwaysLink: String { return self._s[1061]! }
+ public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1062]! }
+ public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1063]! }
+ public var MediaPicker_CameraRoll: String { return self._s[1065]! }
+ public var Month_GenAugust: String { return self._s[1066]! }
+ public var AccessDenied_VideoMessageMicrophone: String { return self._s[1067]! }
+ public var SharedMedia_EmptyText: String { return self._s[1068]! }
+ public var Map_ShareLiveLocation: String { return self._s[1069]! }
+ public var Calls_All: String { return self._s[1070]! }
+ public var Appearance_ThemeNight: String { return self._s[1073]! }
+ public var Conversation_HoldForAudio: String { return self._s[1074]! }
+ public var SettingsSearch_Synonyms_Support: String { return self._s[1077]! }
+ public var GroupInfo_GroupHistoryHidden: String { return self._s[1078]! }
+ public var SocksProxySetup_Secret: String { return self._s[1079]! }
public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1074]!, self._r[1074]!, [_0])
+ return formatWithArgumentRanges(self._s[1080]!, self._r[1080]!, [_0])
}
- public var Channel_BanList_RestrictedTitle: String { return self._s[1076]! }
- public var Conversation_Location: String { return self._s[1077]! }
+ public var Channel_BanList_RestrictedTitle: String { return self._s[1082]! }
+ public var Conversation_Location: String { return self._s[1083]! }
public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1078]!, self._r[1078]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1084]!, self._r[1084]!, [_1, _2])
}
- public var ChatSettings_AutoDownloadPhotos: String { return self._s[1080]! }
- public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1081]! }
- public var Notifications_PermissionsText: String { return self._s[1082]! }
- public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1083]! }
- public var Call_Flip: String { return self._s[1084]! }
- public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1086]! }
- public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1087]! }
- public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1089]! }
- public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1091]! }
- public var Channel_TooMuchBots: String { return self._s[1093]! }
- public var Passport_DeletePassportConfirmation: String { return self._s[1094]! }
- public var Login_InvalidCodeError: String { return self._s[1095]! }
- public var StickerPacksSettings_FeaturedPacks: String { return self._s[1096]! }
+ public var ChatSettings_AutoDownloadPhotos: String { return self._s[1086]! }
+ public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1087]! }
+ public var Notifications_PermissionsText: String { return self._s[1088]! }
+ public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1089]! }
+ public var Call_Flip: String { return self._s[1090]! }
+ public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1092]! }
+ public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1093]! }
+ public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1095]! }
+ public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1097]! }
+ public var Channel_TooMuchBots: String { return self._s[1099]! }
+ public var Passport_DeletePassportConfirmation: String { return self._s[1100]! }
+ public var Login_InvalidCodeError: String { return self._s[1101]! }
+ public var StickerPacksSettings_FeaturedPacks: String { return self._s[1102]! }
public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1097]!, self._r[1097]!, [_0])
+ return formatWithArgumentRanges(self._s[1103]!, self._r[1103]!, [_0])
}
public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1098]!, self._r[1098]!, [_0])
+ return formatWithArgumentRanges(self._s[1104]!, self._r[1104]!, [_0])
}
- public var VoiceOver_Navigation_ProxySettings: String { return self._s[1099]! }
- public var Call_CallInProgressTitle: String { return self._s[1100]! }
- public var Month_ShortSeptember: String { return self._s[1101]! }
- public var Watch_ChannelInfo_Title: String { return self._s[1102]! }
- public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1105]! }
- public var DialogList_PasscodeLockHelp: String { return self._s[1106]! }
- public var Chat_MultipleTextMessagesDisabled: String { return self._s[1107]! }
- public var Notifications_Badge_IncludePublicGroups: String { return self._s[1108]! }
- public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1109]! }
- public var PhotoEditor_CropReset: String { return self._s[1110]! }
- public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1112]! }
- public var Channel_Management_LabelEditor: String { return self._s[1113]! }
- public var Passport_Identity_LatinNameHelp: String { return self._s[1115]! }
- public var PhotoEditor_HighlightsTool: String { return self._s[1116]! }
- public var UserInfo_Title: String { return self._s[1117]! }
- public var ChatList_HideAction: String { return self._s[1118]! }
- public var AccessDenied_Title: String { return self._s[1119]! }
- public var DialogList_SearchLabel: String { return self._s[1120]! }
- public var Group_Setup_HistoryHidden: String { return self._s[1121]! }
- public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1122]! }
- public var State_Updating: String { return self._s[1124]! }
- public var Contacts_TabTitle: String { return self._s[1125]! }
- public var Notifications_Badge_CountUnreadMessages: String { return self._s[1127]! }
- public var GroupInfo_GroupHistory: String { return self._s[1128]! }
- public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1129]! }
- public var Wallpaper_SetColor: String { return self._s[1130]! }
- public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1131]! }
- public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1132]! }
- public var Chat_AttachmentLimitReached: String { return self._s[1133]! }
- public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1134]! }
- public var Contacts_NotRegisteredSection: String { return self._s[1135]! }
+ public var VoiceOver_Navigation_ProxySettings: String { return self._s[1105]! }
+ public var Call_CallInProgressTitle: String { return self._s[1106]! }
+ public var Month_ShortSeptember: String { return self._s[1107]! }
+ public var Watch_ChannelInfo_Title: String { return self._s[1108]! }
+ public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1111]! }
+ public var DialogList_PasscodeLockHelp: String { return self._s[1112]! }
+ public var Chat_MultipleTextMessagesDisabled: String { return self._s[1113]! }
+ public var Notifications_Badge_IncludePublicGroups: String { return self._s[1114]! }
+ public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1115]! }
+ public var PhotoEditor_CropReset: String { return self._s[1116]! }
+ public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1118]! }
+ public var Channel_Management_LabelEditor: String { return self._s[1119]! }
+ public var Passport_Identity_LatinNameHelp: String { return self._s[1121]! }
+ public var PhotoEditor_HighlightsTool: String { return self._s[1122]! }
+ public var UserInfo_Title: String { return self._s[1123]! }
+ public var ChatList_HideAction: String { return self._s[1124]! }
+ public var AccessDenied_Title: String { return self._s[1125]! }
+ public var DialogList_SearchLabel: String { return self._s[1126]! }
+ public var Group_Setup_HistoryHidden: String { return self._s[1127]! }
+ public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1128]! }
+ public var State_Updating: String { return self._s[1130]! }
+ public var Contacts_TabTitle: String { return self._s[1131]! }
+ public var Notifications_Badge_CountUnreadMessages: String { return self._s[1133]! }
+ public var GroupInfo_GroupHistory: String { return self._s[1134]! }
+ public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1135]! }
+ public var Wallpaper_SetColor: String { return self._s[1136]! }
+ public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1137]! }
+ public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1138]! }
+ public var Chat_AttachmentLimitReached: String { return self._s[1139]! }
+ public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1140]! }
+ public var Contacts_NotRegisteredSection: String { return self._s[1141]! }
public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1136]!, self._r[1136]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1142]!, self._r[1142]!, [_1, _2, _3])
}
- public var Paint_Clear: String { return self._s[1137]! }
- public var StickerPacksSettings_ArchivedMasks: String { return self._s[1138]! }
- public var SocksProxySetup_Connecting: String { return self._s[1139]! }
- public var ExplicitContent_AlertChannel: String { return self._s[1140]! }
- public var CreatePoll_AllOptionsAdded: String { return self._s[1141]! }
- public var Conversation_Contact: String { return self._s[1142]! }
- public var Login_CodeExpired: String { return self._s[1143]! }
- public var Passport_DiscardMessageAction: String { return self._s[1144]! }
- public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1145]! }
+ public var Paint_Clear: String { return self._s[1143]! }
+ public var StickerPacksSettings_ArchivedMasks: String { return self._s[1144]! }
+ public var SocksProxySetup_Connecting: String { return self._s[1145]! }
+ public var ExplicitContent_AlertChannel: String { return self._s[1146]! }
+ public var CreatePoll_AllOptionsAdded: String { return self._s[1147]! }
+ public var Conversation_Contact: String { return self._s[1148]! }
+ public var Login_CodeExpired: String { return self._s[1149]! }
+ public var Passport_DiscardMessageAction: String { return self._s[1150]! }
+ public var ChatList_Context_Unpin: String { return self._s[1151]! }
+ public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1152]! }
public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1146]!, self._r[1146]!, [_0])
+ return formatWithArgumentRanges(self._s[1153]!, self._r[1153]!, [_0])
}
- public var Channel_AdminLog_EmptyMessageText: String { return self._s[1147]! }
- public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1148]! }
+ public var Channel_AdminLog_EmptyMessageText: String { return self._s[1154]! }
+ public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1155]! }
public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1149]!, self._r[1149]!, [_0])
+ return formatWithArgumentRanges(self._s[1156]!, self._r[1156]!, [_0])
}
- public var Month_ShortApril: String { return self._s[1150]! }
- public var AuthSessions_CurrentSession: String { return self._s[1151]! }
- public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1154]! }
- public var WallpaperPreview_CropTopText: String { return self._s[1156]! }
- public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1157]! }
- public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1158]! }
+ public var Month_ShortApril: String { return self._s[1157]! }
+ public var AuthSessions_CurrentSession: String { return self._s[1158]! }
+ public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1161]! }
+ public var WallpaperPreview_CropTopText: String { return self._s[1163]! }
+ public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1164]! }
+ public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1165]! }
public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1159]!, self._r[1159]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[1166]!, self._r[1166]!, [_0, _1])
}
- public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1160]! }
- public var Channel_Setup_TypePrivate: String { return self._s[1162]! }
- public var Forward_ChannelReadOnly: String { return self._s[1165]! }
- public var PhotoEditor_CurvesBlue: String { return self._s[1166]! }
- public var AddContact_SharedContactException: String { return self._s[1167]! }
- public var UserInfo_BotPrivacy: String { return self._s[1169]! }
- public var Notification_PassportValueEmail: String { return self._s[1170]! }
- public var EmptyGroupInfo_Subtitle: String { return self._s[1171]! }
- public var GroupPermission_NewTitle: String { return self._s[1172]! }
- public var CallFeedback_ReasonDropped: String { return self._s[1173]! }
- public var GroupInfo_Permissions_AddException: String { return self._s[1174]! }
- public var Channel_SignMessages_Help: String { return self._s[1176]! }
- public var Undo_ChatDeleted: String { return self._s[1178]! }
- public var Conversation_ChatBackground: String { return self._s[1179]! }
- public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1180]! }
- public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1181]! }
- public var Passport_Language_pt: String { return self._s[1182]! }
- public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1183]! }
- public var NotificationsSound_Popcorn: String { return self._s[1186]! }
- public var AutoNightTheme_Disabled: String { return self._s[1187]! }
- public var BlockedUsers_LeavePrefix: String { return self._s[1188]! }
- public var WallpaperPreview_CustomColorTopText: String { return self._s[1189]! }
- public var Contacts_PermissionsSuppressWarningText: String { return self._s[1190]! }
- public var WallpaperSearch_ColorBlue: String { return self._s[1191]! }
+ public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1167]! }
+ public var Channel_Setup_TypePrivate: String { return self._s[1169]! }
+ public var Forward_ChannelReadOnly: String { return self._s[1172]! }
+ public var PhotoEditor_CurvesBlue: String { return self._s[1173]! }
+ public var AddContact_SharedContactException: String { return self._s[1174]! }
+ public var UserInfo_BotPrivacy: String { return self._s[1176]! }
+ public var Notification_PassportValueEmail: String { return self._s[1177]! }
+ public var EmptyGroupInfo_Subtitle: String { return self._s[1178]! }
+ public var GroupPermission_NewTitle: String { return self._s[1179]! }
+ public var CallFeedback_ReasonDropped: String { return self._s[1180]! }
+ public var GroupInfo_Permissions_AddException: String { return self._s[1181]! }
+ public var Channel_SignMessages_Help: String { return self._s[1183]! }
+ public var Undo_ChatDeleted: String { return self._s[1185]! }
+ public var Conversation_ChatBackground: String { return self._s[1186]! }
+ public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1187]! }
+ public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1188]! }
+ public var Passport_Language_pt: String { return self._s[1189]! }
+ public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1190]! }
+ public var NotificationsSound_Popcorn: String { return self._s[1193]! }
+ public var AutoNightTheme_Disabled: String { return self._s[1194]! }
+ public var BlockedUsers_LeavePrefix: String { return self._s[1195]! }
+ public var WallpaperPreview_CustomColorTopText: String { return self._s[1196]! }
+ public var Contacts_PermissionsSuppressWarningText: String { return self._s[1197]! }
+ public var WallpaperSearch_ColorBlue: String { return self._s[1198]! }
public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1192]!, self._r[1192]!, [_0])
+ return formatWithArgumentRanges(self._s[1199]!, self._r[1199]!, [_0])
}
- public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1193]! }
- public var SocksProxySetup_UseForCalls: String { return self._s[1194]! }
- public var Passport_DeleteDocumentConfirmation: String { return self._s[1196]! }
+ public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1200]! }
+ public var SocksProxySetup_UseForCalls: String { return self._s[1201]! }
+ public var Passport_DeleteDocumentConfirmation: String { return self._s[1203]! }
public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1197]!, self._r[1197]!, ["\(_0)"])
+ return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, ["\(_0)"])
}
- public var SocksProxySetup_Hostname: String { return self._s[1200]! }
- public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1201]! }
- public var Compose_NewEncryptedChat: String { return self._s[1202]! }
- public var Login_CodeFloodError: String { return self._s[1203]! }
- public var Calls_TabTitle: String { return self._s[1204]! }
- public var Privacy_ProfilePhoto: String { return self._s[1205]! }
- public var Passport_Language_he: String { return self._s[1206]! }
+ public var SocksProxySetup_Hostname: String { return self._s[1207]! }
+ public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1208]! }
+ public var Compose_NewEncryptedChat: String { return self._s[1209]! }
+ public var Login_CodeFloodError: String { return self._s[1210]! }
+ public var Calls_TabTitle: String { return self._s[1211]! }
+ public var Privacy_ProfilePhoto: String { return self._s[1212]! }
+ public var Passport_Language_he: String { return self._s[1213]! }
public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1207]!, self._r[1207]!, [_0])
+ return formatWithArgumentRanges(self._s[1214]!, self._r[1214]!, [_0])
}
- public var GroupPermission_Title: String { return self._s[1208]! }
+ public var GroupPermission_Title: String { return self._s[1215]! }
public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1209]!, self._r[1209]!, [_0])
+ return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_0])
}
- public var GroupPermission_NoChangeInfo: String { return self._s[1210]! }
- public var ChatList_DeleteForCurrentUser: String { return self._s[1211]! }
- public var Tour_Text1: String { return self._s[1212]! }
- public var Channel_EditAdmin_TransferOwnership: String { return self._s[1213]! }
- public var Month_ShortFebruary: String { return self._s[1214]! }
- public var TwoStepAuth_EmailSkip: String { return self._s[1215]! }
- public var NotificationsSound_Glass: String { return self._s[1216]! }
- public var Appearance_ThemeNightBlue: String { return self._s[1217]! }
- public var CheckoutInfo_Pay: String { return self._s[1218]! }
- public var Invite_LargeRecipientsCountWarning: String { return self._s[1220]! }
- public var Call_CallAgain: String { return self._s[1222]! }
- public var AttachmentMenu_SendAsFile: String { return self._s[1223]! }
- public var AccessDenied_MicrophoneRestricted: String { return self._s[1224]! }
- public var Passport_InvalidPasswordError: String { return self._s[1225]! }
- public var Watch_Message_Game: String { return self._s[1226]! }
- public var Stickers_Install: String { return self._s[1227]! }
- public var VoiceOver_Chat_Message: String { return self._s[1228]! }
- public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1229]! }
- public var Passport_Identity_ResidenceCountry: String { return self._s[1231]! }
- public var Notifications_GroupNotificationsHelp: String { return self._s[1232]! }
- public var AuthSessions_OtherSessions: String { return self._s[1233]! }
- public var Channel_Username_Help: String { return self._s[1234]! }
- public var Camera_Title: String { return self._s[1235]! }
- public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1237]! }
- public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1238]! }
- public var Channel_AdminLog_SendPolls: String { return self._s[1239]! }
- public var Channel_AdminLog_TitleAllEvents: String { return self._s[1240]! }
- public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1241]! }
- public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1242]! }
- public var ScheduledMessages_DeleteMany: String { return self._s[1243]! }
- public var Conversation_RestrictedStickers: String { return self._s[1244]! }
- public var Notifications_ExceptionsResetToDefaults: String { return self._s[1246]! }
- public var UserInfo_TelegramCall: String { return self._s[1248]! }
- public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1249]! }
- public var CreatePoll_OptionsHeader: String { return self._s[1250]! }
- public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1251]! }
- public var ArchivedChats_IntroTitle1: String { return self._s[1252]! }
- public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1253]! }
- public var Passport_Identity_EditPersonalDetails: String { return self._s[1254]! }
+ public var GroupPermission_NoChangeInfo: String { return self._s[1217]! }
+ public var ChatList_DeleteForCurrentUser: String { return self._s[1218]! }
+ public var Tour_Text1: String { return self._s[1219]! }
+ public var Channel_EditAdmin_TransferOwnership: String { return self._s[1220]! }
+ public var Month_ShortFebruary: String { return self._s[1221]! }
+ public var TwoStepAuth_EmailSkip: String { return self._s[1222]! }
+ public var NotificationsSound_Glass: String { return self._s[1223]! }
+ public var Appearance_ThemeNightBlue: String { return self._s[1224]! }
+ public var CheckoutInfo_Pay: String { return self._s[1225]! }
+ public var Invite_LargeRecipientsCountWarning: String { return self._s[1227]! }
+ public var Call_CallAgain: String { return self._s[1229]! }
+ public var AttachmentMenu_SendAsFile: String { return self._s[1230]! }
+ public var AccessDenied_MicrophoneRestricted: String { return self._s[1231]! }
+ public var Passport_InvalidPasswordError: String { return self._s[1232]! }
+ public var Watch_Message_Game: String { return self._s[1233]! }
+ public var Stickers_Install: String { return self._s[1234]! }
+ public var VoiceOver_Chat_Message: String { return self._s[1235]! }
+ public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1236]! }
+ public var Passport_Identity_ResidenceCountry: String { return self._s[1238]! }
+ public var Notifications_GroupNotificationsHelp: String { return self._s[1239]! }
+ public var AuthSessions_OtherSessions: String { return self._s[1240]! }
+ public var Channel_Username_Help: String { return self._s[1241]! }
+ public var Camera_Title: String { return self._s[1242]! }
+ public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1244]! }
+ public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1245]! }
+ public var Channel_AdminLog_SendPolls: String { return self._s[1246]! }
+ public var Channel_AdminLog_TitleAllEvents: String { return self._s[1247]! }
+ public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1248]! }
+ public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1249]! }
+ public var ScheduledMessages_DeleteMany: String { return self._s[1250]! }
+ public var Conversation_RestrictedStickers: String { return self._s[1251]! }
+ public var Notifications_ExceptionsResetToDefaults: String { return self._s[1253]! }
+ public var UserInfo_TelegramCall: String { return self._s[1255]! }
+ public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1256]! }
+ public var CreatePoll_OptionsHeader: String { return self._s[1257]! }
+ public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1258]! }
+ public var ArchivedChats_IntroTitle1: String { return self._s[1259]! }
+ public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1260]! }
+ public var Passport_Identity_EditPersonalDetails: String { return self._s[1261]! }
public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1255]!, self._r[1255]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1262]!, self._r[1262]!, [_1, _2, _3])
}
- public var Settings_SaveEditedPhotos: String { return self._s[1256]! }
- public var TwoStepAuth_ConfirmationTitle: String { return self._s[1257]! }
- public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1258]! }
- public var Conversation_MessageDialogRetry: String { return self._s[1259]! }
- public var Conversation_DiscardVoiceMessageAction: String { return self._s[1260]! }
- public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1261]! }
- public var Group_Setup_TypeHeader: String { return self._s[1262]! }
- public var Paint_RecentStickers: String { return self._s[1263]! }
- public var PhotoEditor_GrainTool: String { return self._s[1264]! }
- public var CheckoutInfo_ShippingInfoState: String { return self._s[1265]! }
- public var EmptyGroupInfo_Line4: String { return self._s[1266]! }
- public var Watch_AuthRequired: String { return self._s[1268]! }
+ public var Settings_SaveEditedPhotos: String { return self._s[1263]! }
+ public var TwoStepAuth_ConfirmationTitle: String { return self._s[1264]! }
+ public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1265]! }
+ public var Conversation_MessageDialogRetry: String { return self._s[1266]! }
+ public var ChatList_Context_MarkAsUnread: String { return self._s[1267]! }
+ public var Conversation_DiscardVoiceMessageAction: String { return self._s[1268]! }
+ public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1269]! }
+ public var Group_Setup_TypeHeader: String { return self._s[1270]! }
+ public var Paint_RecentStickers: String { return self._s[1271]! }
+ public var PhotoEditor_GrainTool: String { return self._s[1272]! }
+ public var CheckoutInfo_ShippingInfoState: String { return self._s[1273]! }
+ public var EmptyGroupInfo_Line4: String { return self._s[1274]! }
+ public var Watch_AuthRequired: String { return self._s[1276]! }
public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1269]!, self._r[1269]!, [_0])
+ return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_0])
}
- public var Conversation_EncryptedDescriptionTitle: String { return self._s[1270]! }
- public var ChannelIntro_Text: String { return self._s[1271]! }
- public var DialogList_DeleteBotConfirmation: String { return self._s[1272]! }
- public var GroupPermission_NoSendMedia: String { return self._s[1273]! }
- public var Calls_AddTab: String { return self._s[1274]! }
- public var Message_ReplyActionButtonShowReceipt: String { return self._s[1275]! }
- public var Channel_AdminLog_EmptyFilterText: String { return self._s[1276]! }
- public var Notification_MessageLifetime1d: String { return self._s[1277]! }
- public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1278]! }
- public var Channel_BanUser_PermissionsHeader: String { return self._s[1279]! }
- public var Passport_Identity_GenderFemale: String { return self._s[1280]! }
- public var BlockedUsers_BlockTitle: String { return self._s[1281]! }
+ public var Conversation_EncryptedDescriptionTitle: String { return self._s[1278]! }
+ public var ChannelIntro_Text: String { return self._s[1279]! }
+ public var DialogList_DeleteBotConfirmation: String { return self._s[1280]! }
+ public var GroupPermission_NoSendMedia: String { return self._s[1281]! }
+ public var Calls_AddTab: String { return self._s[1282]! }
+ public var Message_ReplyActionButtonShowReceipt: String { return self._s[1283]! }
+ public var Channel_AdminLog_EmptyFilterText: String { return self._s[1284]! }
+ public var Notification_MessageLifetime1d: String { return self._s[1285]! }
+ public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1286]! }
+ public var Channel_BanUser_PermissionsHeader: String { return self._s[1287]! }
+ public var Passport_Identity_GenderFemale: String { return self._s[1288]! }
+ public var BlockedUsers_BlockTitle: String { return self._s[1289]! }
public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_1])
+ return formatWithArgumentRanges(self._s[1290]!, self._r[1290]!, [_1])
}
- public var Weekday_Yesterday: String { return self._s[1283]! }
- public var WallpaperSearch_ColorBlack: String { return self._s[1284]! }
- public var ChatList_ArchiveAction: String { return self._s[1285]! }
- public var AutoNightTheme_Scheduled: String { return self._s[1286]! }
+ public var Weekday_Yesterday: String { return self._s[1291]! }
+ public var WallpaperSearch_ColorBlack: String { return self._s[1292]! }
+ public var Settings_Context_Logout: String { return self._s[1293]! }
+ public var ChatList_ArchiveAction: String { return self._s[1294]! }
+ public var AutoNightTheme_Scheduled: String { return self._s[1295]! }
public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2, _3, _4, _5, _6])
+ return formatWithArgumentRanges(self._s[1296]!, self._r[1296]!, [_1, _2, _3, _4, _5, _6])
}
- public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1288]! }
- public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1289]! }
+ public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1297]! }
+ public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1298]! }
public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1290]!, self._r[1290]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1299]!, self._r[1299]!, [_1, _2])
}
- public var CreatePoll_Create: String { return self._s[1291]! }
- public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1292]! }
+ public var CreatePoll_Create: String { return self._s[1300]! }
+ public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1301]! }
public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1293]!, self._r[1293]!, [_1, _2])
- }
- public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1294]! }
- public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1295]! }
- public var Notifications_InAppNotificationsSounds: String { return self._s[1297]! }
- public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1298]!, self._r[1298]!, [_1])
- }
- public var Preview_OpenInInstagram: String { return self._s[1299]! }
- public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1300]! }
- public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1301]!, self._r[1301]!, [_1, _2, _3])
- }
- public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1302]!, self._r[1302]!, [_1, _2])
}
- public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1303]! }
- public var ArchivedChats_IntroText3: String { return self._s[1304]! }
- public var ChatList_UndoArchiveHiddenText: String { return self._s[1305]! }
- public var NetworkUsageSettings_TotalSection: String { return self._s[1306]! }
- public var Channel_Setup_TypePrivateHelp: String { return self._s[1307]! }
+ public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1303]! }
+ public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1304]! }
+ public var Notifications_InAppNotificationsSounds: String { return self._s[1306]! }
+ public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1307]!, self._r[1307]!, [_1])
+ }
+ public var Preview_OpenInInstagram: String { return self._s[1308]! }
+ public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1309]! }
+ public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1310]!, self._r[1310]!, [_1, _2, _3])
+ }
+ public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1311]!, self._r[1311]!, [_1, _2])
+ }
+ public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1312]! }
+ public var ArchivedChats_IntroText3: String { return self._s[1313]! }
+ public var ChatList_UndoArchiveHiddenText: String { return self._s[1314]! }
+ public var NetworkUsageSettings_TotalSection: String { return self._s[1315]! }
+ public var Channel_Setup_TypePrivateHelp: String { return self._s[1316]! }
public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1308]!, self._r[1308]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1317]!, self._r[1317]!, [_1, _2, _3])
}
- public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1310]! }
- public var FastTwoStepSetup_HintSection: String { return self._s[1311]! }
- public var Wallpaper_PhotoLibrary: String { return self._s[1312]! }
- public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1313]! }
- public var Gif_NoGifsFound: String { return self._s[1314]! }
- public var Watch_LastSeen_WithinAMonth: String { return self._s[1315]! }
- public var VoiceOver_MessageContextDelete: String { return self._s[1316]! }
- public var EditTheme_Preview: String { return self._s[1317]! }
- public var GroupInfo_ActionPromote: String { return self._s[1318]! }
- public var PasscodeSettings_SimplePasscode: String { return self._s[1319]! }
- public var GroupInfo_Permissions_Title: String { return self._s[1320]! }
- public var Permissions_ContactsText_v0: String { return self._s[1321]! }
- public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1322]! }
- public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1323]! }
- public var PrivacySettings_DataSettingsHelp: String { return self._s[1326]! }
- public var Passport_FieldEmailHelp: String { return self._s[1327]! }
+ public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1319]! }
+ public var FastTwoStepSetup_HintSection: String { return self._s[1320]! }
+ public var Wallpaper_PhotoLibrary: String { return self._s[1321]! }
+ public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1322]! }
+ public var Gif_NoGifsFound: String { return self._s[1323]! }
+ public var Watch_LastSeen_WithinAMonth: String { return self._s[1324]! }
+ public var VoiceOver_MessageContextDelete: String { return self._s[1325]! }
+ public var EditTheme_Preview: String { return self._s[1326]! }
+ public var GroupInfo_ActionPromote: String { return self._s[1327]! }
+ public var PasscodeSettings_SimplePasscode: String { return self._s[1328]! }
+ public var GroupInfo_Permissions_Title: String { return self._s[1329]! }
+ public var Permissions_ContactsText_v0: String { return self._s[1330]! }
+ public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1331]! }
+ public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1332]! }
+ public var PrivacySettings_DataSettingsHelp: String { return self._s[1335]! }
+ public var Passport_FieldEmailHelp: String { return self._s[1336]! }
public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1328]!, self._r[1328]!, [_0])
+ return formatWithArgumentRanges(self._s[1337]!, self._r[1337]!, [_0])
}
- public var Passport_Identity_GenderPlaceholder: String { return self._s[1329]! }
- public var Weekday_ShortSaturday: String { return self._s[1330]! }
- public var ContactInfo_PhoneLabelMain: String { return self._s[1331]! }
- public var Watch_Conversation_UserInfo: String { return self._s[1332]! }
- public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1333]! }
- public var PrivacyLastSeenSettings_Title: String { return self._s[1334]! }
- public var Conversation_ShareBotLocationConfirmation: String { return self._s[1335]! }
- public var PhotoEditor_VignetteTool: String { return self._s[1336]! }
- public var Passport_Address_Street1Placeholder: String { return self._s[1337]! }
- public var Passport_Language_et: String { return self._s[1338]! }
- public var AppUpgrade_Running: String { return self._s[1339]! }
- public var Channel_DiscussionGroup_Info: String { return self._s[1341]! }
- public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1342]! }
- public var Passport_Language_bg: String { return self._s[1343]! }
- public var Stickers_NoStickersFound: String { return self._s[1345]! }
+ public var Passport_Identity_GenderPlaceholder: String { return self._s[1338]! }
+ public var Weekday_ShortSaturday: String { return self._s[1339]! }
+ public var ContactInfo_PhoneLabelMain: String { return self._s[1340]! }
+ public var Watch_Conversation_UserInfo: String { return self._s[1341]! }
+ public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1342]! }
+ public var PrivacyLastSeenSettings_Title: String { return self._s[1343]! }
+ public var Conversation_ShareBotLocationConfirmation: String { return self._s[1344]! }
+ public var PhotoEditor_VignetteTool: String { return self._s[1345]! }
+ public var Passport_Address_Street1Placeholder: String { return self._s[1346]! }
+ public var Passport_Language_et: String { return self._s[1347]! }
+ public var AppUpgrade_Running: String { return self._s[1348]! }
+ public var Channel_DiscussionGroup_Info: String { return self._s[1350]! }
+ public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1351]! }
+ public var Passport_Language_bg: String { return self._s[1352]! }
+ public var Stickers_NoStickersFound: String { return self._s[1354]! }
public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1356]!, self._r[1356]!, [_1, _2])
}
public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1348]!, self._r[1348]!, [_0])
+ return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_0])
}
- public var Settings_About: String { return self._s[1349]! }
+ public var Settings_About: String { return self._s[1358]! }
public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_0, _1, _2])
+ return formatWithArgumentRanges(self._s[1359]!, self._r[1359]!, [_0, _1, _2])
}
- public var KeyCommand_NewMessage: String { return self._s[1352]! }
- public var Group_ErrorAddBlocked: String { return self._s[1353]! }
+ public var ChatList_Context_MarkAsRead: String { return self._s[1361]! }
+ public var KeyCommand_NewMessage: String { return self._s[1362]! }
+ public var Group_ErrorAddBlocked: String { return self._s[1363]! }
public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_0])
+ return formatWithArgumentRanges(self._s[1364]!, self._r[1364]!, [_0])
}
- public var Map_LocationTitle: String { return self._s[1355]! }
- public var ReportGroupLocation_Title: String { return self._s[1356]! }
- public var CallSettings_UseLessDataLongDescription: String { return self._s[1357]! }
- public var Cache_ClearProgress: String { return self._s[1358]! }
+ public var Map_LocationTitle: String { return self._s[1365]! }
+ public var ReportGroupLocation_Title: String { return self._s[1366]! }
+ public var CallSettings_UseLessDataLongDescription: String { return self._s[1367]! }
+ public var Cache_ClearProgress: String { return self._s[1368]! }
public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1359]!, self._r[1359]!, [_0])
+ return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_0])
}
- public var GroupRemoved_AddToGroup: String { return self._s[1360]! }
- public var Passport_UpdateRequiredError: String { return self._s[1361]! }
+ public var GroupRemoved_AddToGroup: String { return self._s[1370]! }
+ public var Passport_UpdateRequiredError: String { return self._s[1371]! }
public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1362]!, self._r[1362]!, [_1])
+ return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_1])
}
- public var Notifications_PermissionsSuppressWarningText: String { return self._s[1364]! }
- public var Passport_Identity_MainPageHelp: String { return self._s[1365]! }
- public var Conversation_StatusKickedFromGroup: String { return self._s[1366]! }
- public var Passport_Language_ka: String { return self._s[1367]! }
- public var Call_Decline: String { return self._s[1368]! }
- public var SocksProxySetup_ProxyEnabled: String { return self._s[1369]! }
+ public var Notifications_PermissionsSuppressWarningText: String { return self._s[1374]! }
+ public var Passport_Identity_MainPageHelp: String { return self._s[1375]! }
+ public var Conversation_StatusKickedFromGroup: String { return self._s[1376]! }
+ public var Passport_Language_ka: String { return self._s[1377]! }
+ public var Call_Decline: String { return self._s[1378]! }
+ public var SocksProxySetup_ProxyEnabled: String { return self._s[1379]! }
public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_0])
+ return formatWithArgumentRanges(self._s[1382]!, self._r[1382]!, [_0])
}
- public var CallFeedback_Send: String { return self._s[1373]! }
- public var EditTheme_EditTitle: String { return self._s[1374]! }
+ public var CallFeedback_Send: String { return self._s[1383]! }
+ public var EditTheme_EditTitle: String { return self._s[1384]! }
public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1375]!, self._r[1375]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1385]!, self._r[1385]!, [_1, _2])
}
- public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1376]! }
- public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1378]! }
- public var Passport_DeletePassport: String { return self._s[1379]! }
- public var Appearance_AppIconFilled: String { return self._s[1380]! }
- public var Privacy_Calls_P2PAlways: String { return self._s[1381]! }
- public var Month_ShortDecember: String { return self._s[1382]! }
- public var Channel_AdminLog_CanEditMessages: String { return self._s[1384]! }
+ public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1386]! }
+ public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1388]! }
+ public var Passport_DeletePassport: String { return self._s[1389]! }
+ public var Appearance_AppIconFilled: String { return self._s[1390]! }
+ public var Privacy_Calls_P2PAlways: String { return self._s[1391]! }
+ public var Month_ShortDecember: String { return self._s[1392]! }
+ public var Channel_AdminLog_CanEditMessages: String { return self._s[1394]! }
public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1385]!, self._r[1385]!, [_0])
+ return formatWithArgumentRanges(self._s[1395]!, self._r[1395]!, [_0])
}
- public var Channel_Stickers_Searching: String { return self._s[1386]! }
- public var Conversation_EncryptedDescription1: String { return self._s[1387]! }
- public var Conversation_EncryptedDescription2: String { return self._s[1388]! }
- public var PasscodeSettings_PasscodeOptions: String { return self._s[1389]! }
- public var Conversation_EncryptedDescription3: String { return self._s[1390]! }
- public var PhotoEditor_SharpenTool: String { return self._s[1391]! }
+ public var Channel_Stickers_Searching: String { return self._s[1396]! }
+ public var Conversation_EncryptedDescription1: String { return self._s[1397]! }
+ public var Conversation_EncryptedDescription2: String { return self._s[1398]! }
+ public var PasscodeSettings_PasscodeOptions: String { return self._s[1399]! }
+ public var Conversation_EncryptedDescription3: String { return self._s[1400]! }
+ public var PhotoEditor_SharpenTool: String { return self._s[1401]! }
public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1392]!, self._r[1392]!, [_0])
+ return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_0])
}
- public var Conversation_EncryptedDescription4: String { return self._s[1394]! }
- public var Channel_Members_AddMembers: String { return self._s[1395]! }
- public var Wallpaper_Search: String { return self._s[1396]! }
- public var Weekday_Friday: String { return self._s[1397]! }
- public var Privacy_ContactsSync: String { return self._s[1398]! }
- public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1399]! }
- public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1400]! }
+ public var Conversation_EncryptedDescription4: String { return self._s[1404]! }
+ public var Channel_Members_AddMembers: String { return self._s[1405]! }
+ public var Wallpaper_Search: String { return self._s[1406]! }
+ public var Weekday_Friday: String { return self._s[1407]! }
+ public var Privacy_ContactsSync: String { return self._s[1408]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1409]! }
+ public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1410]! }
public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1401]!, self._r[1401]!, [_0])
+ return formatWithArgumentRanges(self._s[1411]!, self._r[1411]!, [_0])
}
- public var GroupInfo_Permissions_Removed: String { return self._s[1402]! }
- public var Passport_Identity_GenderMale: String { return self._s[1403]! }
+ public var GroupInfo_Permissions_Removed: String { return self._s[1412]! }
+ public var Passport_Identity_GenderMale: String { return self._s[1413]! }
public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1404]!, self._r[1404]!, [_0])
+ return formatWithArgumentRanges(self._s[1414]!, self._r[1414]!, [_0])
}
- public var Notifications_PermissionsKeepDisabled: String { return self._s[1405]! }
- public var Conversation_JumpToDate: String { return self._s[1406]! }
- public var Contacts_GlobalSearch: String { return self._s[1407]! }
- public var AutoDownloadSettings_ResetHelp: String { return self._s[1408]! }
- public var SettingsSearch_Synonyms_FAQ: String { return self._s[1409]! }
- public var Profile_MessageLifetime1d: String { return self._s[1410]! }
+ public var Notifications_PermissionsKeepDisabled: String { return self._s[1415]! }
+ public var Conversation_JumpToDate: String { return self._s[1416]! }
+ public var Contacts_GlobalSearch: String { return self._s[1417]! }
+ public var AutoDownloadSettings_ResetHelp: String { return self._s[1418]! }
+ public var SettingsSearch_Synonyms_FAQ: String { return self._s[1419]! }
+ public var Profile_MessageLifetime1d: String { return self._s[1420]! }
public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1411]!, self._r[1411]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_1, _2])
}
- public var StickerPack_BuiltinPackName: String { return self._s[1414]! }
+ public var StickerPack_BuiltinPackName: String { return self._s[1424]! }
public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1415]!, self._r[1415]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1425]!, self._r[1425]!, [_1, _2])
}
- public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1416]! }
- public var Passport_InfoTitle: String { return self._s[1418]! }
- public var Notifications_PermissionsUnreachableText: String { return self._s[1419]! }
+ public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1426]! }
+ public var Passport_InfoTitle: String { return self._s[1428]! }
+ public var Notifications_PermissionsUnreachableText: String { return self._s[1429]! }
public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0])
+ return formatWithArgumentRanges(self._s[1433]!, self._r[1433]!, [_0])
}
public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1424]!, self._r[1424]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1434]!, self._r[1434]!, [_1, _2])
}
- public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1425]! }
- public var Profile_BotInfo: String { return self._s[1426]! }
- public var Watch_Compose_CreateMessage: String { return self._s[1427]! }
- public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1428]! }
- public var Month_ShortNovember: String { return self._s[1429]! }
- public var Conversation_ScamWarning: String { return self._s[1430]! }
- public var Wallpaper_SetCustomBackground: String { return self._s[1431]! }
- public var Passport_Identity_TranslationsHelp: String { return self._s[1432]! }
- public var NotificationsSound_Chime: String { return self._s[1433]! }
- public var Passport_Language_ko: String { return self._s[1435]! }
- public var InviteText_URL: String { return self._s[1436]! }
- public var TextFormat_Monospace: String { return self._s[1437]! }
+ public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1435]! }
+ public var Profile_BotInfo: String { return self._s[1436]! }
+ public var Watch_Compose_CreateMessage: String { return self._s[1437]! }
+ public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1438]! }
+ public var Month_ShortNovember: String { return self._s[1439]! }
+ public var Conversation_ScamWarning: String { return self._s[1440]! }
+ public var Wallpaper_SetCustomBackground: String { return self._s[1441]! }
+ public var Passport_Identity_TranslationsHelp: String { return self._s[1442]! }
+ public var NotificationsSound_Chime: String { return self._s[1443]! }
+ public var Passport_Language_ko: String { return self._s[1445]! }
+ public var InviteText_URL: String { return self._s[1446]! }
+ public var TextFormat_Monospace: String { return self._s[1447]! }
public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1438]!, self._r[1438]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_1, _2, _3])
}
- public var EditTheme_Edit_BottomInfo: String { return self._s[1439]! }
+ public var EditTheme_Edit_BottomInfo: String { return self._s[1449]! }
public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1440]!, self._r[1440]!, [_0])
+ return formatWithArgumentRanges(self._s[1450]!, self._r[1450]!, [_0])
}
public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1441]!, self._r[1441]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_1, _2])
}
- public var EditTheme_CreateTitle: String { return self._s[1443]! }
- public var Passport_InfoLearnMore: String { return self._s[1444]! }
- public var TwoStepAuth_EmailPlaceholder: String { return self._s[1445]! }
- public var Passport_Identity_AddIdentityCard: String { return self._s[1446]! }
- public var Your_card_has_expired: String { return self._s[1447]! }
- public var StickerPacksSettings_StickerPacksSection: String { return self._s[1448]! }
- public var GroupInfo_InviteLink_Help: String { return self._s[1449]! }
- public var Conversation_Report: String { return self._s[1453]! }
- public var Notifications_MessageNotificationsSound: String { return self._s[1454]! }
- public var Notification_MessageLifetime1m: String { return self._s[1455]! }
- public var Privacy_ContactsTitle: String { return self._s[1456]! }
- public var Conversation_ShareMyContactInfo: String { return self._s[1457]! }
- public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1458]! }
- public var Channel_Members_Title: String { return self._s[1459]! }
- public var Map_OpenInWaze: String { return self._s[1460]! }
- public var Login_PhoneBannedError: String { return self._s[1461]! }
+ public var EditTheme_CreateTitle: String { return self._s[1453]! }
+ public var Passport_InfoLearnMore: String { return self._s[1454]! }
+ public var TwoStepAuth_EmailPlaceholder: String { return self._s[1455]! }
+ public var Passport_Identity_AddIdentityCard: String { return self._s[1456]! }
+ public var Your_card_has_expired: String { return self._s[1457]! }
+ public var StickerPacksSettings_StickerPacksSection: String { return self._s[1458]! }
+ public var GroupInfo_InviteLink_Help: String { return self._s[1459]! }
+ public var Conversation_Report: String { return self._s[1463]! }
+ public var Notifications_MessageNotificationsSound: String { return self._s[1464]! }
+ public var Notification_MessageLifetime1m: String { return self._s[1465]! }
+ public var Privacy_ContactsTitle: String { return self._s[1466]! }
+ public var Conversation_ShareMyContactInfo: String { return self._s[1467]! }
+ public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1468]! }
+ public var Channel_Members_Title: String { return self._s[1469]! }
+ public var Map_OpenInWaze: String { return self._s[1470]! }
+ public var Login_PhoneBannedError: String { return self._s[1471]! }
public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1462]!, self._r[1462]!, [_0])
- }
- public var Group_Management_AddModeratorHelp: String { return self._s[1463]! }
- public var AutoDownloadSettings_WifiTitle: String { return self._s[1464]! }
- public var Common_OK: String { return self._s[1465]! }
- public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1466]! }
- public var Cache_Music: String { return self._s[1467]! }
- public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1468]! }
- public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1469]! }
- public var TwoStepAuth_HintPlaceholder: String { return self._s[1470]! }
- public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1471]!, self._r[1471]!, [_1])
- }
- public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_0])
}
- public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_0])
+ public var Group_Management_AddModeratorHelp: String { return self._s[1473]! }
+ public var AutoDownloadSettings_WifiTitle: String { return self._s[1474]! }
+ public var Common_OK: String { return self._s[1475]! }
+ public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1476]! }
+ public var Cache_Music: String { return self._s[1477]! }
+ public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1478]! }
+ public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1479]! }
+ public var TwoStepAuth_HintPlaceholder: String { return self._s[1480]! }
+ public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1481]!, self._r[1481]!, [_1])
}
- public var Watch_MessageView_ViewOnPhone: String { return self._s[1475]! }
- public var Privacy_Calls_CustomShareHelp: String { return self._s[1476]! }
- public var ChangePhoneNumberNumber_Title: String { return self._s[1478]! }
- public var State_ConnectingToProxyInfo: String { return self._s[1479]! }
- public var Message_VideoMessage: String { return self._s[1481]! }
- public var ChannelInfo_DeleteChannel: String { return self._s[1482]! }
- public var ContactInfo_PhoneLabelOther: String { return self._s[1483]! }
- public var Channel_EditAdmin_CannotEdit: String { return self._s[1484]! }
- public var Passport_DeleteAddressConfirmation: String { return self._s[1485]! }
- public var WallpaperPreview_SwipeBottomText: String { return self._s[1486]! }
- public var Activity_RecordingAudio: String { return self._s[1487]! }
- public var SettingsSearch_Synonyms_Watch: String { return self._s[1488]! }
- public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1489]! }
+ public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1482]!, self._r[1482]!, [_0])
+ }
+ public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1483]!, self._r[1483]!, [_0])
+ }
+ public var Watch_MessageView_ViewOnPhone: String { return self._s[1485]! }
+ public var Privacy_Calls_CustomShareHelp: String { return self._s[1486]! }
+ public var ChangePhoneNumberNumber_Title: String { return self._s[1488]! }
+ public var State_ConnectingToProxyInfo: String { return self._s[1489]! }
+ public var Message_VideoMessage: String { return self._s[1491]! }
+ public var ChannelInfo_DeleteChannel: String { return self._s[1492]! }
+ public var ContactInfo_PhoneLabelOther: String { return self._s[1493]! }
+ public var Channel_EditAdmin_CannotEdit: String { return self._s[1494]! }
+ public var Passport_DeleteAddressConfirmation: String { return self._s[1495]! }
+ public var WallpaperPreview_SwipeBottomText: String { return self._s[1496]! }
+ public var Activity_RecordingAudio: String { return self._s[1497]! }
+ public var SettingsSearch_Synonyms_Watch: String { return self._s[1498]! }
+ public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1499]! }
public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1491]!, self._r[1491]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0, _1])
}
public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1495]!, self._r[1495]!, [_0])
+ return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0])
}
- public var Conversation_ApplyLocalization: String { return self._s[1496]! }
- public var UserInfo_AddPhone: String { return self._s[1497]! }
- public var Map_ShareLiveLocationHelp: String { return self._s[1498]! }
+ public var Conversation_ApplyLocalization: String { return self._s[1506]! }
+ public var UserInfo_AddPhone: String { return self._s[1507]! }
+ public var Map_ShareLiveLocationHelp: String { return self._s[1508]! }
public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1499]!, self._r[1499]!, [_0])
+ return formatWithArgumentRanges(self._s[1509]!, self._r[1509]!, [_0])
}
- public var Passport_Scans: String { return self._s[1501]! }
- public var BlockedUsers_Unblock: String { return self._s[1502]! }
+ public var Passport_Scans: String { return self._s[1511]! }
+ public var BlockedUsers_Unblock: String { return self._s[1512]! }
public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1503]!, self._r[1503]!, [_1])
+ return formatWithArgumentRanges(self._s[1513]!, self._r[1513]!, [_1])
}
- public var Channel_Management_LabelCreator: String { return self._s[1504]! }
- public var Conversation_ReportSpamAndLeave: String { return self._s[1505]! }
- public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1506]! }
- public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1507]! }
- public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1508]! }
+ public var Channel_Management_LabelCreator: String { return self._s[1514]! }
+ public var Conversation_ReportSpamAndLeave: String { return self._s[1515]! }
+ public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1516]! }
+ public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1517]! }
+ public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1518]! }
public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1509]!, self._r[1509]!, [_0, _1, _2])
+ return formatWithArgumentRanges(self._s[1519]!, self._r[1519]!, [_0, _1, _2])
}
- public var Login_PhoneNumberHelp: String { return self._s[1510]! }
- public var LastSeen_ALongTimeAgo: String { return self._s[1511]! }
- public var Channel_AdminLog_CanPinMessages: String { return self._s[1512]! }
- public var ChannelIntro_CreateChannel: String { return self._s[1513]! }
- public var Conversation_UnreadMessages: String { return self._s[1514]! }
- public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1515]! }
- public var Channel_AdminLog_EmptyText: String { return self._s[1516]! }
- public var Notification_GroupActivated: String { return self._s[1517]! }
- public var NotificationSettings_ContactJoinedInfo: String { return self._s[1518]! }
+ public var Login_PhoneNumberHelp: String { return self._s[1520]! }
+ public var LastSeen_ALongTimeAgo: String { return self._s[1521]! }
+ public var Channel_AdminLog_CanPinMessages: String { return self._s[1522]! }
+ public var ChannelIntro_CreateChannel: String { return self._s[1523]! }
+ public var Conversation_UnreadMessages: String { return self._s[1524]! }
+ public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1525]! }
+ public var Channel_AdminLog_EmptyText: String { return self._s[1526]! }
+ public var Theme_Context_Apply: String { return self._s[1527]! }
+ public var Notification_GroupActivated: String { return self._s[1528]! }
+ public var NotificationSettings_ContactJoinedInfo: String { return self._s[1529]! }
public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1519]!, self._r[1519]!, [_0])
+ return formatWithArgumentRanges(self._s[1530]!, self._r[1530]!, [_0])
}
public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1520]!, self._r[1520]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[1531]!, self._r[1531]!, [_0, _1])
}
- public var GroupInfo_ConvertToSupergroup: String { return self._s[1522]! }
+ public var GroupInfo_ConvertToSupergroup: String { return self._s[1533]! }
public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1523]!, self._r[1523]!, [_0])
+ return formatWithArgumentRanges(self._s[1534]!, self._r[1534]!, [_0])
}
- public var Undo_DeletedChannel: String { return self._s[1524]! }
- public var CallFeedback_AddComment: String { return self._s[1525]! }
+ public var Undo_DeletedChannel: String { return self._s[1535]! }
+ public var CallFeedback_AddComment: String { return self._s[1536]! }
public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1526]!, self._r[1526]!, [_0])
+ return formatWithArgumentRanges(self._s[1537]!, self._r[1537]!, [_0])
}
- public var Document_TargetConfirmationFormat: String { return self._s[1527]! }
+ public var Document_TargetConfirmationFormat: String { return self._s[1538]! }
public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1528]!, self._r[1528]!, [_0])
+ return formatWithArgumentRanges(self._s[1539]!, self._r[1539]!, [_0])
}
- public var LogoutOptions_SetPasscodeTitle: String { return self._s[1529]! }
+ public var LogoutOptions_SetPasscodeTitle: String { return self._s[1540]! }
public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1530]!, self._r[1530]!, [_1, _2, _3, _4])
+ return formatWithArgumentRanges(self._s[1541]!, self._r[1541]!, [_1, _2, _3, _4])
}
- public var Theme_ErrorNotFound: String { return self._s[1531]! }
- public var Contacts_SortByName: String { return self._s[1532]! }
- public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1533]! }
+ public var Theme_ErrorNotFound: String { return self._s[1542]! }
+ public var Contacts_SortByName: String { return self._s[1543]! }
+ public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1544]! }
public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1546]!, self._r[1546]!, [_1, _2, _3])
}
- public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1536]! }
- public var ScheduledMessages_EditTime: String { return self._s[1537]! }
- public var Conversation_ClearSelfHistory: String { return self._s[1538]! }
- public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1539]! }
- public var PasscodeSettings_DoNotMatch: String { return self._s[1540]! }
- public var Stickers_SuggestNone: String { return self._s[1541]! }
- public var ChatSettings_Cache: String { return self._s[1542]! }
- public var Settings_SaveIncomingPhotos: String { return self._s[1543]! }
- public var Media_ShareThisPhoto: String { return self._s[1544]! }
- public var Chat_SlowmodeTooltipPending: String { return self._s[1545]! }
- public var InfoPlist_NSContactsUsageDescription: String { return self._s[1546]! }
- public var Conversation_ContextMenuCopyLink: String { return self._s[1547]! }
- public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1548]! }
- public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1549]! }
- public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1550]! }
- public var Permissions_CellularDataTitle_v0: String { return self._s[1551]! }
- public var WallpaperSearch_ColorWhite: String { return self._s[1553]! }
- public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1554]! }
- public var Conversation_ErrorInaccessibleMessage: String { return self._s[1555]! }
- public var Map_OpenIn: String { return self._s[1556]! }
+ public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1547]! }
+ public var ScheduledMessages_EditTime: String { return self._s[1548]! }
+ public var Conversation_ClearSelfHistory: String { return self._s[1549]! }
+ public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1550]! }
+ public var PasscodeSettings_DoNotMatch: String { return self._s[1551]! }
+ public var Stickers_SuggestNone: String { return self._s[1552]! }
+ public var ChatSettings_Cache: String { return self._s[1553]! }
+ public var Settings_SaveIncomingPhotos: String { return self._s[1554]! }
+ public var Media_ShareThisPhoto: String { return self._s[1555]! }
+ public var Chat_SlowmodeTooltipPending: String { return self._s[1556]! }
+ public var InfoPlist_NSContactsUsageDescription: String { return self._s[1557]! }
+ public var Conversation_ContextMenuCopyLink: String { return self._s[1558]! }
+ public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1559]! }
+ public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1560]! }
+ public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1561]! }
+ public var Permissions_CellularDataTitle_v0: String { return self._s[1562]! }
+ public var WallpaperSearch_ColorWhite: String { return self._s[1564]! }
+ public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1565]! }
+ public var Conversation_ErrorInaccessibleMessage: String { return self._s[1566]! }
+ public var Map_OpenIn: String { return self._s[1567]! }
public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_1])
+ return formatWithArgumentRanges(self._s[1570]!, self._r[1570]!, [_1])
}
public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1560]!, self._r[1560]!, [_0])
+ return formatWithArgumentRanges(self._s[1571]!, self._r[1571]!, [_0])
}
- public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1561]! }
- public var MessagePoll_LabelClosed: String { return self._s[1562]! }
- public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1564]! }
- public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1565]! }
- public var UserInfo_FirstNamePlaceholder: String { return self._s[1566]! }
- public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1567]! }
- public var Login_SelectCountry_Title: String { return self._s[1568]! }
- public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1569]! }
+ public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1572]! }
+ public var MessagePoll_LabelClosed: String { return self._s[1573]! }
+ public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1575]! }
+ public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1576]! }
+ public var UserInfo_FirstNamePlaceholder: String { return self._s[1577]! }
+ public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1578]! }
+ public var Login_SelectCountry_Title: String { return self._s[1579]! }
+ public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1580]! }
public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1570]!, self._r[1570]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1581]!, self._r[1581]!, [_1, _2])
}
- public var Channel_AdminLog_ChangeInfo: String { return self._s[1571]! }
- public var Watch_Suggestion_BRB: String { return self._s[1572]! }
- public var Passport_Identity_EditIdentityCard: String { return self._s[1573]! }
- public var Contacts_PermissionsTitle: String { return self._s[1574]! }
- public var Conversation_RestrictedInline: String { return self._s[1575]! }
- public var StickerPack_ViewPack: String { return self._s[1577]! }
+ public var Channel_AdminLog_ChangeInfo: String { return self._s[1582]! }
+ public var Watch_Suggestion_BRB: String { return self._s[1583]! }
+ public var Passport_Identity_EditIdentityCard: String { return self._s[1584]! }
+ public var Contacts_PermissionsTitle: String { return self._s[1585]! }
+ public var Conversation_RestrictedInline: String { return self._s[1586]! }
+ public var StickerPack_ViewPack: String { return self._s[1588]! }
public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1578]!, self._r[1578]!, [_0])
+ return formatWithArgumentRanges(self._s[1589]!, self._r[1589]!, [_0])
}
- public var Compose_NewChannel: String { return self._s[1580]! }
- public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1583]! }
- public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1585]! }
- public var Channel_Info_Stickers: String { return self._s[1586]! }
- public var AutoNightTheme_PreferredTheme: String { return self._s[1587]! }
- public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1588]! }
- public var Passport_DeletePersonalDetails: String { return self._s[1589]! }
- public var LogoutOptions_AddAccountTitle: String { return self._s[1590]! }
- public var Channel_DiscussionGroupInfo: String { return self._s[1591]! }
- public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1592]! }
- public var Conversation_SearchNoResults: String { return self._s[1594]! }
- public var MessagePoll_LabelAnonymous: String { return self._s[1595]! }
- public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1596]! }
- public var Login_Code: String { return self._s[1597]! }
- public var EditTheme_Create_BottomInfo: String { return self._s[1598]! }
- public var Watch_Suggestion_WhatsUp: String { return self._s[1599]! }
- public var Weekday_ShortThursday: String { return self._s[1600]! }
- public var Resolve_ErrorNotFound: String { return self._s[1602]! }
- public var LastSeen_Offline: String { return self._s[1603]! }
- public var PeopleNearby_NoMembers: String { return self._s[1604]! }
- public var GroupPermission_AddMembersNotAvailable: String { return self._s[1605]! }
- public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1606]! }
- public var GroupInfo_Title: String { return self._s[1608]! }
- public var NotificationsSound_Note: String { return self._s[1609]! }
- public var Conversation_EditingMessagePanelTitle: String { return self._s[1610]! }
- public var Watch_Message_Poll: String { return self._s[1611]! }
- public var Privacy_Calls: String { return self._s[1612]! }
+ public var Compose_NewChannel: String { return self._s[1591]! }
+ public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1594]! }
+ public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1596]! }
+ public var Channel_Info_Stickers: String { return self._s[1597]! }
+ public var AutoNightTheme_PreferredTheme: String { return self._s[1598]! }
+ public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1599]! }
+ public var Passport_DeletePersonalDetails: String { return self._s[1600]! }
+ public var LogoutOptions_AddAccountTitle: String { return self._s[1601]! }
+ public var Channel_DiscussionGroupInfo: String { return self._s[1602]! }
+ public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1603]! }
+ public var Conversation_SearchNoResults: String { return self._s[1605]! }
+ public var MessagePoll_LabelAnonymous: String { return self._s[1606]! }
+ public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1607]! }
+ public var Login_Code: String { return self._s[1608]! }
+ public var EditTheme_Create_BottomInfo: String { return self._s[1609]! }
+ public var Watch_Suggestion_WhatsUp: String { return self._s[1610]! }
+ public var Weekday_ShortThursday: String { return self._s[1611]! }
+ public var Resolve_ErrorNotFound: String { return self._s[1613]! }
+ public var LastSeen_Offline: String { return self._s[1614]! }
+ public var PeopleNearby_NoMembers: String { return self._s[1615]! }
+ public var GroupPermission_AddMembersNotAvailable: String { return self._s[1616]! }
+ public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1617]! }
+ public var GroupInfo_Title: String { return self._s[1619]! }
+ public var NotificationsSound_Note: String { return self._s[1620]! }
+ public var Conversation_EditingMessagePanelTitle: String { return self._s[1621]! }
+ public var Watch_Message_Poll: String { return self._s[1622]! }
+ public var Privacy_Calls: String { return self._s[1623]! }
public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1613]!, self._r[1613]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1624]!, self._r[1624]!, [_1, _2, _3])
}
- public var Month_ShortAugust: String { return self._s[1614]! }
- public var TwoStepAuth_SetPasswordHelp: String { return self._s[1615]! }
- public var Notifications_Reset: String { return self._s[1616]! }
- public var Conversation_Pin: String { return self._s[1617]! }
- public var Passport_Language_lv: String { return self._s[1618]! }
- public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1619]! }
- public var BlockedUsers_Info: String { return self._s[1620]! }
- public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1622]! }
- public var Watch_Conversation_Unblock: String { return self._s[1624]! }
+ public var Month_ShortAugust: String { return self._s[1625]! }
+ public var TwoStepAuth_SetPasswordHelp: String { return self._s[1626]! }
+ public var Notifications_Reset: String { return self._s[1627]! }
+ public var Conversation_Pin: String { return self._s[1628]! }
+ public var Passport_Language_lv: String { return self._s[1629]! }
+ public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1630]! }
+ public var BlockedUsers_Info: String { return self._s[1631]! }
+ public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1633]! }
+ public var Watch_Conversation_Unblock: String { return self._s[1635]! }
public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1625]!, self._r[1625]!, [_0])
+ return formatWithArgumentRanges(self._s[1636]!, self._r[1636]!, [_0])
}
- public var CloudStorage_Title: String { return self._s[1626]! }
- public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1627]! }
+ public var CloudStorage_Title: String { return self._s[1637]! }
+ public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1638]! }
public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1628]!, self._r[1628]!, [_0])
+ return formatWithArgumentRanges(self._s[1639]!, self._r[1639]!, [_0])
}
- public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1629]! }
- public var Watch_Suggestion_OnMyWay: String { return self._s[1630]! }
- public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1631]! }
- public var Passport_Address_EditBankStatement: String { return self._s[1632]! }
+ public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1640]! }
+ public var Watch_Suggestion_OnMyWay: String { return self._s[1641]! }
+ public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1642]! }
+ public var Passport_Address_EditBankStatement: String { return self._s[1643]! }
public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1633]!, self._r[1633]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1644]!, self._r[1644]!, [_1, _2])
}
- public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1634]! }
- public var ShareMenu_Comment: String { return self._s[1635]! }
- public var Permissions_ContactsTitle_v0: String { return self._s[1636]! }
- public var Notifications_PermissionsTitle: String { return self._s[1637]! }
- public var GroupPermission_NoSendLinks: String { return self._s[1638]! }
- public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1639]! }
- public var Settings_Support: String { return self._s[1640]! }
- public var Notifications_ChannelNotificationsSound: String { return self._s[1641]! }
- public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1642]! }
- public var Privacy_Forwards_Preview: String { return self._s[1643]! }
- public var GroupPermission_ApplyAlertAction: String { return self._s[1644]! }
- public var Watch_Stickers_StickerPacks: String { return self._s[1645]! }
- public var Common_Select: String { return self._s[1647]! }
- public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1648]! }
- public var WallpaperSearch_ColorGray: String { return self._s[1650]! }
- public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1651]! }
- public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1652]! }
- public var Appearance_PreviewReplyAuthor: String { return self._s[1653]! }
- public var TwoStepAuth_RecoveryTitle: String { return self._s[1654]! }
- public var Widget_AuthRequired: String { return self._s[1655]! }
- public var Camera_FlashOn: String { return self._s[1656]! }
- public var Conversation_ContextMenuLookUp: String { return self._s[1657]! }
- public var Channel_Stickers_NotFoundHelp: String { return self._s[1658]! }
- public var Watch_Suggestion_OK: String { return self._s[1659]! }
+ public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1645]! }
+ public var ShareMenu_Comment: String { return self._s[1646]! }
+ public var Permissions_ContactsTitle_v0: String { return self._s[1647]! }
+ public var Notifications_PermissionsTitle: String { return self._s[1648]! }
+ public var GroupPermission_NoSendLinks: String { return self._s[1649]! }
+ public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1650]! }
+ public var Settings_Support: String { return self._s[1651]! }
+ public var Notifications_ChannelNotificationsSound: String { return self._s[1652]! }
+ public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1653]! }
+ public var Privacy_Forwards_Preview: String { return self._s[1654]! }
+ public var GroupPermission_ApplyAlertAction: String { return self._s[1655]! }
+ public var Watch_Stickers_StickerPacks: String { return self._s[1656]! }
+ public var Common_Select: String { return self._s[1658]! }
+ public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1659]! }
+ public var WallpaperSearch_ColorGray: String { return self._s[1661]! }
+ public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1662]! }
+ public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1663]! }
+ public var Appearance_PreviewReplyAuthor: String { return self._s[1664]! }
+ public var TwoStepAuth_RecoveryTitle: String { return self._s[1665]! }
+ public var Widget_AuthRequired: String { return self._s[1666]! }
+ public var Camera_FlashOn: String { return self._s[1667]! }
+ public var Conversation_ContextMenuLookUp: String { return self._s[1668]! }
+ public var Channel_Stickers_NotFoundHelp: String { return self._s[1669]! }
+ public var Watch_Suggestion_OK: String { return self._s[1670]! }
public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1661]!, self._r[1661]!, [_0])
+ return formatWithArgumentRanges(self._s[1672]!, self._r[1672]!, [_0])
}
public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1663]!, self._r[1663]!, [_0])
+ return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_0])
}
- public var TextFormat_Strikethrough: String { return self._s[1664]! }
- public var DialogList_AdLabel: String { return self._s[1665]! }
- public var WatchRemote_NotificationText: String { return self._s[1666]! }
- public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1667]! }
- public var Conversation_ReportSpam: String { return self._s[1668]! }
- public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1669]! }
- public var Settings_LogoutConfirmationTitle: String { return self._s[1671]! }
- public var PhoneLabel_Title: String { return self._s[1672]! }
- public var Passport_Address_EditRentalAgreement: String { return self._s[1673]! }
- public var Settings_ChangePhoneNumber: String { return self._s[1674]! }
- public var Notifications_ExceptionsTitle: String { return self._s[1675]! }
- public var Notifications_AlertTones: String { return self._s[1676]! }
- public var Call_ReportIncludeLogDescription: String { return self._s[1677]! }
- public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1678]! }
- public var AutoDownloadSettings_PrivateChats: String { return self._s[1679]! }
- public var VoiceOver_Chat_Photo: String { return self._s[1681]! }
- public var TwoStepAuth_AddHintTitle: String { return self._s[1682]! }
- public var ReportPeer_ReasonOther: String { return self._s[1683]! }
- public var KeyCommand_ScrollDown: String { return self._s[1685]! }
- public var Conversation_ScheduleMessage_Title: String { return self._s[1686]! }
+ public var TextFormat_Strikethrough: String { return self._s[1675]! }
+ public var DialogList_AdLabel: String { return self._s[1676]! }
+ public var WatchRemote_NotificationText: String { return self._s[1677]! }
+ public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1678]! }
+ public var Conversation_ReportSpam: String { return self._s[1679]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1680]! }
+ public var Settings_LogoutConfirmationTitle: String { return self._s[1682]! }
+ public var PhoneLabel_Title: String { return self._s[1683]! }
+ public var Passport_Address_EditRentalAgreement: String { return self._s[1684]! }
+ public var Settings_ChangePhoneNumber: String { return self._s[1685]! }
+ public var Notifications_ExceptionsTitle: String { return self._s[1686]! }
+ public var Notifications_AlertTones: String { return self._s[1687]! }
+ public var Call_ReportIncludeLogDescription: String { return self._s[1688]! }
+ public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1689]! }
+ public var AutoDownloadSettings_PrivateChats: String { return self._s[1690]! }
+ public var VoiceOver_Chat_Photo: String { return self._s[1692]! }
+ public var TwoStepAuth_AddHintTitle: String { return self._s[1693]! }
+ public var ReportPeer_ReasonOther: String { return self._s[1694]! }
+ public var ChatList_Context_JoinChannel: String { return self._s[1695]! }
+ public var KeyCommand_ScrollDown: String { return self._s[1697]! }
+ public var Conversation_ScheduleMessage_Title: String { return self._s[1698]! }
public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1687]!, self._r[1687]!, [_0])
+ return formatWithArgumentRanges(self._s[1699]!, self._r[1699]!, [_0])
}
- public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1688]! }
- public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1689]! }
- public var AuthSessions_LogOut: String { return self._s[1690]! }
- public var Passport_Identity_TypeInternalPassport: String { return self._s[1691]! }
- public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1692]! }
- public var Passport_Phone_Title: String { return self._s[1693]! }
- public var Settings_PhoneNumber: String { return self._s[1694]! }
+ public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1700]! }
+ public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1701]! }
+ public var AuthSessions_LogOut: String { return self._s[1702]! }
+ public var Passport_Identity_TypeInternalPassport: String { return self._s[1703]! }
+ public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1704]! }
+ public var Passport_Phone_Title: String { return self._s[1705]! }
+ public var ContactList_Context_StartSecretChat: String { return self._s[1706]! }
+ public var Settings_PhoneNumber: String { return self._s[1707]! }
public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1695]!, self._r[1695]!, [_0])
+ return formatWithArgumentRanges(self._s[1708]!, self._r[1708]!, [_0])
}
- public var NotificationsSound_Alert: String { return self._s[1696]! }
- public var WebSearch_SearchNoResults: String { return self._s[1697]! }
- public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1699]! }
- public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1700]! }
- public var SettingsSearch_Synonyms_Passport: String { return self._s[1701]! }
- public var PhotoEditor_CurvesTool: String { return self._s[1702]! }
- public var Checkout_PaymentMethod: String { return self._s[1704]! }
+ public var NotificationsSound_Alert: String { return self._s[1709]! }
+ public var WebSearch_SearchNoResults: String { return self._s[1710]! }
+ public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1712]! }
+ public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1713]! }
+ public var SettingsSearch_Synonyms_Passport: String { return self._s[1714]! }
+ public var PhotoEditor_CurvesTool: String { return self._s[1715]! }
+ public var Checkout_PaymentMethod: String { return self._s[1717]! }
public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1718]!, self._r[1718]!, [_1, _2])
}
- public var Contacts_AccessDeniedError: String { return self._s[1706]! }
- public var Camera_PhotoMode: String { return self._s[1709]! }
- public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1710]! }
- public var Passport_Address_AddUtilityBill: String { return self._s[1712]! }
- public var CallSettings_OnMobile: String { return self._s[1713]! }
- public var Tour_Text2: String { return self._s[1714]! }
+ public var Contacts_AccessDeniedError: String { return self._s[1719]! }
+ public var Camera_PhotoMode: String { return self._s[1722]! }
+ public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1723]! }
+ public var Passport_Address_AddUtilityBill: String { return self._s[1725]! }
+ public var CallSettings_OnMobile: String { return self._s[1726]! }
+ public var Tour_Text2: String { return self._s[1727]! }
public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1728]!, self._r[1728]!, [_1, _2])
}
- public var DialogList_EncryptionProcessing: String { return self._s[1717]! }
- public var Permissions_Skip: String { return self._s[1718]! }
- public var SecretImage_Title: String { return self._s[1719]! }
- public var Watch_MessageView_Title: String { return self._s[1720]! }
- public var Channel_DiscussionGroupAdd: String { return self._s[1721]! }
- public var AttachmentMenu_Poll: String { return self._s[1722]! }
+ public var DialogList_EncryptionProcessing: String { return self._s[1730]! }
+ public var Permissions_Skip: String { return self._s[1731]! }
+ public var SecretImage_Title: String { return self._s[1732]! }
+ public var Watch_MessageView_Title: String { return self._s[1733]! }
+ public var Channel_DiscussionGroupAdd: String { return self._s[1734]! }
+ public var AttachmentMenu_Poll: String { return self._s[1735]! }
public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1723]!, self._r[1723]!, [_0])
+ return formatWithArgumentRanges(self._s[1736]!, self._r[1736]!, [_0])
}
public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1724]!, self._r[1724]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1737]!, self._r[1737]!, [_1, _2])
}
- public var Notification_CallCanceled: String { return self._s[1725]! }
- public var WallpaperPreview_Title: String { return self._s[1726]! }
- public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1727]! }
- public var Settings_ProxyConnecting: String { return self._s[1728]! }
- public var Settings_CheckPhoneNumberText: String { return self._s[1730]! }
- public var VoiceOver_Chat_YourVideo: String { return self._s[1731]! }
- public var Profile_MessageLifetime5s: String { return self._s[1732]! }
- public var Username_InvalidCharacters: String { return self._s[1733]! }
- public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1734]! }
- public var ScheduledMessages_ClearAll: String { return self._s[1735]! }
- public var WallpaperPreview_CropBottomText: String { return self._s[1736]! }
- public var AutoDownloadSettings_LimitBySize: String { return self._s[1737]! }
- public var Settings_AddAccount: String { return self._s[1738]! }
- public var Notification_CreatedChannel: String { return self._s[1741]! }
+ public var Notification_CallCanceled: String { return self._s[1738]! }
+ public var WallpaperPreview_Title: String { return self._s[1739]! }
+ public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1740]! }
+ public var Settings_ProxyConnecting: String { return self._s[1741]! }
+ public var Settings_CheckPhoneNumberText: String { return self._s[1743]! }
+ public var VoiceOver_Chat_YourVideo: String { return self._s[1744]! }
+ public var Profile_MessageLifetime5s: String { return self._s[1745]! }
+ public var Username_InvalidCharacters: String { return self._s[1746]! }
+ public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1747]! }
+ public var ScheduledMessages_ClearAll: String { return self._s[1748]! }
+ public var WallpaperPreview_CropBottomText: String { return self._s[1749]! }
+ public var AutoDownloadSettings_LimitBySize: String { return self._s[1750]! }
+ public var Settings_AddAccount: String { return self._s[1751]! }
+ public var Notification_CreatedChannel: String { return self._s[1754]! }
public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1742]!, self._r[1742]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1755]!, self._r[1755]!, [_1, _2, _3])
}
- public var Passcode_AppLockedAlert: String { return self._s[1744]! }
- public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1745]! }
- public var VoiceOver_Media_PlaybackStop: String { return self._s[1746]! }
- public var Contacts_TopSection: String { return self._s[1747]! }
+ public var Passcode_AppLockedAlert: String { return self._s[1757]! }
+ public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1758]! }
+ public var VoiceOver_Media_PlaybackStop: String { return self._s[1759]! }
+ public var Contacts_TopSection: String { return self._s[1760]! }
public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1748]!, self._r[1748]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[1761]!, self._r[1761]!, [_0, _1])
}
public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1749]!, self._r[1749]!, [_0])
- }
- public var ReportPeer_ReasonSpam: String { return self._s[1750]! }
- public var UserInfo_TapToCall: String { return self._s[1751]! }
- public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1753]! }
- public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1754]! }
- public var Common_Search: String { return self._s[1755]! }
- public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1756]! }
- public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1757]!, self._r[1757]!, [_0])
- }
- public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1758]! }
- public var Message_InvoiceLabel: String { return self._s[1759]! }
- public var Conversation_InputTextPlaceholder: String { return self._s[1760]! }
- public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1761]! }
- public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1762]!, self._r[1762]!, [_0])
}
- public var Conversation_Info: String { return self._s[1763]! }
- public var Login_InfoDeletePhoto: String { return self._s[1764]! }
- public var Passport_Language_vi: String { return self._s[1766]! }
- public var UserInfo_ScamUserWarning: String { return self._s[1767]! }
- public var Conversation_Search: String { return self._s[1768]! }
- public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1770]! }
- public var ReportPeer_ReasonPornography: String { return self._s[1771]! }
- public var AutoDownloadSettings_PhotosTitle: String { return self._s[1772]! }
- public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1773]! }
- public var Map_LiveLocationGroupDescription: String { return self._s[1774]! }
- public var Channel_Setup_TypeHeader: String { return self._s[1775]! }
- public var AuthSessions_LoggedIn: String { return self._s[1776]! }
- public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1777]! }
- public var Login_SmsRequestState3: String { return self._s[1778]! }
- public var Passport_Address_EditUtilityBill: String { return self._s[1779]! }
- public var Appearance_ReduceMotionInfo: String { return self._s[1780]! }
- public var Join_ChannelsTooMuch: String { return self._s[1781]! }
- public var Channel_Edit_LinkItem: String { return self._s[1782]! }
- public var Privacy_Calls_P2PNever: String { return self._s[1783]! }
- public var Conversation_AddToReadingList: String { return self._s[1785]! }
- public var Share_MultipleMessagesDisabled: String { return self._s[1786]! }
- public var Message_Animation: String { return self._s[1787]! }
- public var Conversation_DefaultRestrictedMedia: String { return self._s[1788]! }
- public var Map_Unknown: String { return self._s[1789]! }
- public var AutoDownloadSettings_LastDelimeter: String { return self._s[1790]! }
+ public var ReportPeer_ReasonSpam: String { return self._s[1763]! }
+ public var UserInfo_TapToCall: String { return self._s[1764]! }
+ public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1766]! }
+ public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1767]! }
+ public var Common_Search: String { return self._s[1768]! }
+ public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1769]! }
+ public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1770]!, self._r[1770]!, [_0])
+ }
+ public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1771]! }
+ public var Message_InvoiceLabel: String { return self._s[1772]! }
+ public var Conversation_InputTextPlaceholder: String { return self._s[1773]! }
+ public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1774]! }
+ public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1775]!, self._r[1775]!, [_0])
+ }
+ public var Conversation_Info: String { return self._s[1776]! }
+ public var Login_InfoDeletePhoto: String { return self._s[1777]! }
+ public var Passport_Language_vi: String { return self._s[1779]! }
+ public var UserInfo_ScamUserWarning: String { return self._s[1780]! }
+ public var Conversation_Search: String { return self._s[1781]! }
+ public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1783]! }
+ public var ReportPeer_ReasonPornography: String { return self._s[1784]! }
+ public var AutoDownloadSettings_PhotosTitle: String { return self._s[1785]! }
+ public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1786]! }
+ public var Map_LiveLocationGroupDescription: String { return self._s[1787]! }
+ public var Channel_Setup_TypeHeader: String { return self._s[1788]! }
+ public var AuthSessions_LoggedIn: String { return self._s[1789]! }
+ public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1790]! }
+ public var Login_SmsRequestState3: String { return self._s[1791]! }
+ public var Passport_Address_EditUtilityBill: String { return self._s[1792]! }
+ public var Appearance_ReduceMotionInfo: String { return self._s[1793]! }
+ public var Join_ChannelsTooMuch: String { return self._s[1794]! }
+ public var Channel_Edit_LinkItem: String { return self._s[1795]! }
+ public var Privacy_Calls_P2PNever: String { return self._s[1796]! }
+ public var Conversation_AddToReadingList: String { return self._s[1798]! }
+ public var Share_MultipleMessagesDisabled: String { return self._s[1799]! }
+ public var Message_Animation: String { return self._s[1800]! }
+ public var Conversation_DefaultRestrictedMedia: String { return self._s[1801]! }
+ public var Map_Unknown: String { return self._s[1802]! }
+ public var AutoDownloadSettings_LastDelimeter: String { return self._s[1803]! }
public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1791]!, self._r[1791]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1804]!, self._r[1804]!, [_1, _2])
}
public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1792]!, self._r[1792]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1805]!, self._r[1805]!, [_1, _2])
}
- public var Call_StatusRequesting: String { return self._s[1793]! }
- public var Conversation_SecretChatContextBotAlert: String { return self._s[1794]! }
- public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1795]! }
+ public var Call_StatusRequesting: String { return self._s[1806]! }
+ public var Conversation_SecretChatContextBotAlert: String { return self._s[1807]! }
+ public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1808]! }
public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_1, _2])
}
public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1797]!, self._r[1797]!, [_0])
- }
- public var Update_Skip: String { return self._s[1798]! }
- public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1799]! }
- public var Message_PinnedPollMessage: String { return self._s[1800]! }
- public var BlockedUsers_Title: String { return self._s[1801]! }
- public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1802]!, self._r[1802]!, [_1])
- }
- public var Username_CheckingUsername: String { return self._s[1803]! }
- public var NotificationsSound_Bell: String { return self._s[1804]! }
- public var Conversation_SendMessageErrorFlood: String { return self._s[1805]! }
- public var Weekday_Monday: String { return self._s[1806]! }
- public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1807]! }
- public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1808]! }
- public var ChatSettings_Groups: String { return self._s[1809]! }
- public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1810]!, self._r[1810]!, [_0])
}
- public var Your_card_was_declined: String { return self._s[1811]! }
- public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1813]! }
- public var ChatList_Unmute: String { return self._s[1814]! }
- public var PhotoEditor_CurvesAll: String { return self._s[1815]! }
- public var Weekday_ShortTuesday: String { return self._s[1816]! }
- public var DialogList_Read: String { return self._s[1817]! }
- public var Appearance_AppIconClassic: String { return self._s[1818]! }
- public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1819]! }
- public var Passport_Identity_Gender: String { return self._s[1820]! }
+ public var Update_Skip: String { return self._s[1811]! }
+ public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1812]! }
+ public var Message_PinnedPollMessage: String { return self._s[1813]! }
+ public var BlockedUsers_Title: String { return self._s[1814]! }
+ public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1815]!, self._r[1815]!, [_1])
+ }
+ public var Username_CheckingUsername: String { return self._s[1816]! }
+ public var NotificationsSound_Bell: String { return self._s[1817]! }
+ public var Conversation_SendMessageErrorFlood: String { return self._s[1818]! }
+ public var Weekday_Monday: String { return self._s[1819]! }
+ public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1820]! }
+ public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1821]! }
+ public var ChatSettings_Groups: String { return self._s[1822]! }
+ public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1823]!, self._r[1823]!, [_0])
+ }
+ public var Your_card_was_declined: String { return self._s[1824]! }
+ public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1826]! }
+ public var ChatList_Unmute: String { return self._s[1827]! }
+ public var PhotoEditor_CurvesAll: String { return self._s[1828]! }
+ public var Weekday_ShortTuesday: String { return self._s[1829]! }
+ public var DialogList_Read: String { return self._s[1830]! }
+ public var Appearance_AppIconClassic: String { return self._s[1831]! }
+ public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1832]! }
+ public var Passport_Identity_Gender: String { return self._s[1833]! }
public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, [_0])
+ return formatWithArgumentRanges(self._s[1834]!, self._r[1834]!, [_0])
}
- public var Target_SelectGroup: String { return self._s[1822]! }
+ public var Target_SelectGroup: String { return self._s[1835]! }
public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, [_0])
+ return formatWithArgumentRanges(self._s[1837]!, self._r[1837]!, [_0])
}
- public var Passport_Language_en: String { return self._s[1825]! }
- public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1826]! }
- public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1827]! }
- public var Login_CancelPhoneVerificationContinue: String { return self._s[1828]! }
- public var ScheduledMessages_SendNow: String { return self._s[1829]! }
- public var Checkout_NewCard_PaymentCard: String { return self._s[1831]! }
- public var Login_InfoHelp: String { return self._s[1832]! }
- public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1833]! }
- public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1834]! }
+ public var Passport_Language_en: String { return self._s[1838]! }
+ public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1839]! }
+ public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1840]! }
+ public var Login_CancelPhoneVerificationContinue: String { return self._s[1841]! }
+ public var ScheduledMessages_SendNow: String { return self._s[1842]! }
+ public var Checkout_NewCard_PaymentCard: String { return self._s[1844]! }
+ public var Login_InfoHelp: String { return self._s[1845]! }
+ public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1846]! }
+ public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1847]! }
public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1835]!, self._r[1835]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, [_1, _2])
}
- public var SocksProxySetup_AddProxy: String { return self._s[1838]! }
- public var CreatePoll_Title: String { return self._s[1839]! }
- public var Conversation_ViewTheme: String { return self._s[1840]! }
- public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1841]! }
- public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1842]! }
- public var UserInfo_GroupsInCommon: String { return self._s[1843]! }
- public var Call_AudioRouteHide: String { return self._s[1844]! }
- public var ContactInfo_PhoneLabelMobile: String { return self._s[1846]! }
+ public var SocksProxySetup_AddProxy: String { return self._s[1851]! }
+ public var CreatePoll_Title: String { return self._s[1852]! }
+ public var Conversation_ViewTheme: String { return self._s[1853]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1854]! }
+ public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1855]! }
+ public var UserInfo_GroupsInCommon: String { return self._s[1856]! }
+ public var Call_AudioRouteHide: String { return self._s[1857]! }
+ public var ContactInfo_PhoneLabelMobile: String { return self._s[1859]! }
public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1847]!, self._r[1847]!, [_0])
+ return formatWithArgumentRanges(self._s[1860]!, self._r[1860]!, [_0])
}
- public var TextFormat_Bold: String { return self._s[1848]! }
- public var FastTwoStepSetup_EmailSection: String { return self._s[1849]! }
- public var Notifications_Title: String { return self._s[1850]! }
- public var Group_Username_InvalidTooShort: String { return self._s[1851]! }
- public var Channel_ErrorAddTooMuch: String { return self._s[1852]! }
+ public var TextFormat_Bold: String { return self._s[1861]! }
+ public var FastTwoStepSetup_EmailSection: String { return self._s[1862]! }
+ public var Notifications_Title: String { return self._s[1863]! }
+ public var Group_Username_InvalidTooShort: String { return self._s[1864]! }
+ public var Channel_ErrorAddTooMuch: String { return self._s[1865]! }
public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, ["\(_0)"])
+ return formatWithArgumentRanges(self._s[1866]!, self._r[1866]!, ["\(_0)"])
}
- public var VoiceOver_DiscardPreparedContent: String { return self._s[1855]! }
- public var Stickers_SuggestAdded: String { return self._s[1856]! }
- public var Login_CountryCode: String { return self._s[1857]! }
- public var ChatSettings_AutoPlayVideos: String { return self._s[1858]! }
- public var Map_GetDirections: String { return self._s[1859]! }
- public var Login_PhoneFloodError: String { return self._s[1860]! }
+ public var VoiceOver_DiscardPreparedContent: String { return self._s[1868]! }
+ public var Stickers_SuggestAdded: String { return self._s[1869]! }
+ public var Login_CountryCode: String { return self._s[1870]! }
+ public var ChatSettings_AutoPlayVideos: String { return self._s[1871]! }
+ public var Map_GetDirections: String { return self._s[1872]! }
+ public var Login_PhoneFloodError: String { return self._s[1873]! }
public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1861]!, self._r[1861]!, [_0])
+ return formatWithArgumentRanges(self._s[1874]!, self._r[1874]!, [_0])
}
- public var Settings_SetUsername: String { return self._s[1863]! }
- public var Group_Location_ChangeLocation: String { return self._s[1864]! }
- public var Notification_GroupInviterSelf: String { return self._s[1865]! }
- public var InstantPage_TapToOpenLink: String { return self._s[1866]! }
+ public var Settings_SetUsername: String { return self._s[1876]! }
+ public var Group_Location_ChangeLocation: String { return self._s[1877]! }
+ public var Notification_GroupInviterSelf: String { return self._s[1878]! }
+ public var InstantPage_TapToOpenLink: String { return self._s[1879]! }
public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_0])
+ return formatWithArgumentRanges(self._s[1880]!, self._r[1880]!, [_0])
}
- public var Watch_Suggestion_TalkLater: String { return self._s[1868]! }
- public var SecretChat_Title: String { return self._s[1869]! }
- public var Group_UpgradeNoticeText1: String { return self._s[1870]! }
- public var AuthSessions_Title: String { return self._s[1871]! }
+ public var Watch_Suggestion_TalkLater: String { return self._s[1881]! }
+ public var SecretChat_Title: String { return self._s[1882]! }
+ public var Group_UpgradeNoticeText1: String { return self._s[1883]! }
+ public var AuthSessions_Title: String { return self._s[1884]! }
public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1872]!, self._r[1872]!, [_0])
- }
- public var PhotoEditor_CropAuto: String { return self._s[1873]! }
- public var Channel_About_Title: String { return self._s[1874]! }
- public var FastTwoStepSetup_EmailHelp: String { return self._s[1875]! }
- public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, ["\(_0)"])
- }
- public var VoiceOver_MessageContextReport: String { return self._s[1878]! }
- public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1880]! }
- public var Group_Setup_HistoryVisibleHelp: String { return self._s[1881]! }
- public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_1])
- }
- public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_0])
- }
- public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0])
}
- public var Privacy_PaymentsClearInfoHelp: String { return self._s[1886]! }
- public var Presence_online: String { return self._s[1888]! }
- public var PasscodeSettings_Title: String { return self._s[1889]! }
- public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1890]! }
- public var Web_OpenExternal: String { return self._s[1891]! }
- public var AutoDownloadSettings_AutoDownload: String { return self._s[1893]! }
- public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1894]! }
- public var LocalGroup_Title: String { return self._s[1895]! }
- public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1896]!, self._r[1896]!, [_0])
+ public var PhotoEditor_CropAuto: String { return self._s[1886]! }
+ public var Channel_About_Title: String { return self._s[1887]! }
+ public var FastTwoStepSetup_EmailHelp: String { return self._s[1888]! }
+ public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, ["\(_0)"])
}
- public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1897]! }
- public var Map_YouAreHere: String { return self._s[1898]! }
+ public var VoiceOver_MessageContextReport: String { return self._s[1891]! }
+ public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1893]! }
+ public var Group_Setup_HistoryVisibleHelp: String { return self._s[1894]! }
+ public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1895]!, self._r[1895]!, [_1])
+ }
+ public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1897]!, self._r[1897]!, [_0])
+ }
+ public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1898]!, self._r[1898]!, [_0])
+ }
+ public var Privacy_PaymentsClearInfoHelp: String { return self._s[1899]! }
+ public var Presence_online: String { return self._s[1901]! }
+ public var PasscodeSettings_Title: String { return self._s[1902]! }
+ public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1903]! }
+ public var Web_OpenExternal: String { return self._s[1904]! }
+ public var AutoDownloadSettings_AutoDownload: String { return self._s[1906]! }
+ public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1907]! }
+ public var LocalGroup_Title: String { return self._s[1908]! }
+ public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1909]!, self._r[1909]!, [_0])
+ }
+ public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1910]! }
+ public var Map_YouAreHere: String { return self._s[1911]! }
public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_0])
+ return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_0])
}
public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1900]!, self._r[1900]!, [_0])
+ return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_0])
}
- public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1901]! }
- public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1902]! }
+ public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1914]! }
+ public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1915]! }
public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1903]!, self._r[1903]!, [_0])
+ return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_0])
}
public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1904]!, self._r[1904]!, [_0])
+ return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_0])
}
- public var SocksProxySetup_Username: String { return self._s[1905]! }
- public var Bot_Start: String { return self._s[1906]! }
+ public var SocksProxySetup_Username: String { return self._s[1918]! }
+ public var Bot_Start: String { return self._s[1919]! }
public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1907]!, self._r[1907]!, [_0])
+ return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0])
}
public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1908]!, self._r[1908]!, [_0])
+ return formatWithArgumentRanges(self._s[1921]!, self._r[1921]!, [_0])
}
- public var Contacts_SortByPresence: String { return self._s[1909]! }
- public var AccentColor_Title: String { return self._s[1911]! }
- public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1912]! }
+ public var Contacts_SortByPresence: String { return self._s[1922]! }
+ public var AccentColor_Title: String { return self._s[1924]! }
+ public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1925]! }
public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1926]!, self._r[1926]!, [_1, _2])
}
public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1914]!, self._r[1914]!, [_0])
+ return formatWithArgumentRanges(self._s[1927]!, self._r[1927]!, [_0])
}
public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1915]!, self._r[1915]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1928]!, self._r[1928]!, [_1, _2])
}
- public var Passport_Email_EnterOtherEmail: String { return self._s[1916]! }
- public var Login_InfoAvatarPhoto: String { return self._s[1917]! }
- public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1918]! }
- public var Tour_Title4: String { return self._s[1919]! }
- public var Passport_Identity_Translation: String { return self._s[1920]! }
- public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1921]! }
- public var Login_TermsOfServiceLabel: String { return self._s[1923]! }
- public var Passport_Language_it: String { return self._s[1924]! }
- public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1925]! }
- public var Passport_Identity_SelfieHelp: String { return self._s[1926]! }
- public var Conversation_ClearAll: String { return self._s[1928]! }
- public var Channel_OwnershipTransfer_Title: String { return self._s[1930]! }
- public var TwoStepAuth_FloodError: String { return self._s[1931]! }
+ public var Passport_Email_EnterOtherEmail: String { return self._s[1929]! }
+ public var Login_InfoAvatarPhoto: String { return self._s[1930]! }
+ public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1931]! }
+ public var Tour_Title4: String { return self._s[1932]! }
+ public var Passport_Identity_Translation: String { return self._s[1933]! }
+ public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1934]! }
+ public var Login_TermsOfServiceLabel: String { return self._s[1936]! }
+ public var Passport_Language_it: String { return self._s[1937]! }
+ public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1938]! }
+ public var Passport_Identity_SelfieHelp: String { return self._s[1939]! }
+ public var Conversation_ClearAll: String { return self._s[1941]! }
+ public var Channel_OwnershipTransfer_Title: String { return self._s[1943]! }
+ public var TwoStepAuth_FloodError: String { return self._s[1944]! }
public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1932]!, self._r[1932]!, [_1])
+ return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_1])
}
- public var Paint_Delete: String { return self._s[1933]! }
- public var Privacy_AddNewPeer: String { return self._s[1934]! }
+ public var Paint_Delete: String { return self._s[1946]! }
+ public var Privacy_AddNewPeer: String { return self._s[1947]! }
public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1935]!, self._r[1935]!, [_1])
- }
- public var LogoutOptions_SetPasscodeText: String { return self._s[1936]! }
- public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1937]!, self._r[1937]!, [_1, _2])
- }
- public var Message_PinnedAudioMessage: String { return self._s[1938]! }
- public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1939]!, self._r[1939]!, [_0])
- }
- public var Notification_Mute1hMin: String { return self._s[1940]! }
- public var Notifications_GroupNotificationsSound: String { return self._s[1941]! }
- public var SocksProxySetup_ShareProxyList: String { return self._s[1942]! }
- public var Conversation_MessageEditedLabel: String { return self._s[1943]! }
- public var Notification_Exceptions_AlwaysOff: String { return self._s[1944]! }
- public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1945]! }
- public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1946]!, self._r[1946]!, [_0, _1, _2])
- }
- public var NetworkUsageSettings_ResetStats: String { return self._s[1947]! }
- public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_1])
}
- public var AccessDenied_LocationTracking: String { return self._s[1949]! }
- public var Month_GenOctober: String { return self._s[1950]! }
- public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1951]! }
- public var EnterPasscode_EnterPasscode: String { return self._s[1952]! }
- public var MediaPicker_TimerTooltip: String { return self._s[1954]! }
- public var SharedMedia_TitleAll: String { return self._s[1955]! }
- public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1958]! }
- public var Conversation_RestrictedMedia: String { return self._s[1959]! }
- public var AccessDenied_PhotosRestricted: String { return self._s[1960]! }
- public var Privacy_Forwards_WhoCanForward: String { return self._s[1962]! }
- public var ChangePhoneNumberCode_Called: String { return self._s[1963]! }
+ public var LogoutOptions_SetPasscodeText: String { return self._s[1949]! }
+ public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1950]!, self._r[1950]!, [_1, _2])
+ }
+ public var Message_PinnedAudioMessage: String { return self._s[1951]! }
+ public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1952]!, self._r[1952]!, [_0])
+ }
+ public var Notification_Mute1hMin: String { return self._s[1953]! }
+ public var Notifications_GroupNotificationsSound: String { return self._s[1954]! }
+ public var SocksProxySetup_ShareProxyList: String { return self._s[1955]! }
+ public var Conversation_MessageEditedLabel: String { return self._s[1956]! }
+ public var Notification_Exceptions_AlwaysOff: String { return self._s[1957]! }
+ public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1958]! }
+ public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_0, _1, _2])
+ }
+ public var NetworkUsageSettings_ResetStats: String { return self._s[1960]! }
+ public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1961]!, self._r[1961]!, [_1])
+ }
+ public var AccessDenied_LocationTracking: String { return self._s[1962]! }
+ public var Month_GenOctober: String { return self._s[1963]! }
+ public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1964]! }
+ public var EnterPasscode_EnterPasscode: String { return self._s[1965]! }
+ public var MediaPicker_TimerTooltip: String { return self._s[1967]! }
+ public var SharedMedia_TitleAll: String { return self._s[1968]! }
+ public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1971]! }
+ public var Conversation_RestrictedMedia: String { return self._s[1972]! }
+ public var AccessDenied_PhotosRestricted: String { return self._s[1973]! }
+ public var Privacy_Forwards_WhoCanForward: String { return self._s[1975]! }
+ public var ChangePhoneNumberCode_Called: String { return self._s[1976]! }
public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1964]!, self._r[1964]!, [_0])
+ return formatWithArgumentRanges(self._s[1977]!, self._r[1977]!, [_0])
}
- public var Conversation_SavedMessages: String { return self._s[1967]! }
- public var Your_cards_expiration_month_is_invalid: String { return self._s[1969]! }
- public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1970]! }
+ public var Conversation_SavedMessages: String { return self._s[1980]! }
+ public var Your_cards_expiration_month_is_invalid: String { return self._s[1982]! }
+ public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1983]! }
public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1972]!, self._r[1972]!, [_0])
+ return formatWithArgumentRanges(self._s[1985]!, self._r[1985]!, [_0])
}
- public var VoiceOver_Chat_YourMessage: String { return self._s[1973]! }
+ public var VoiceOver_Chat_YourMessage: String { return self._s[1986]! }
public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1974]!, self._r[1974]!, [_0])
+ return formatWithArgumentRanges(self._s[1987]!, self._r[1987]!, [_0])
}
- public var ReportPeer_AlertSuccess: String { return self._s[1975]! }
- public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1976]! }
+ public var ReportPeer_AlertSuccess: String { return self._s[1988]! }
+ public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1989]! }
public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1977]!, self._r[1977]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1990]!, self._r[1990]!, [_1, _2])
}
- public var Checkout_PasswordEntry_Title: String { return self._s[1978]! }
- public var PhotoEditor_FadeTool: String { return self._s[1979]! }
- public var Privacy_ContactsReset: String { return self._s[1980]! }
+ public var Checkout_PasswordEntry_Title: String { return self._s[1991]! }
+ public var PhotoEditor_FadeTool: String { return self._s[1992]! }
+ public var Privacy_ContactsReset: String { return self._s[1993]! }
public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1982]!, self._r[1982]!, [_0])
+ return formatWithArgumentRanges(self._s[1995]!, self._r[1995]!, [_0])
}
- public var Message_PinnedVideoMessage: String { return self._s[1983]! }
- public var ChatList_Mute: String { return self._s[1984]! }
- public var Permissions_CellularDataText_v0: String { return self._s[1985]! }
- public var ShareMenu_SelectChats: String { return self._s[1988]! }
- public var MusicPlayer_VoiceNote: String { return self._s[1989]! }
- public var Conversation_RestrictedText: String { return self._s[1990]! }
- public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1991]! }
- public var TwoStepAuth_DisableSuccess: String { return self._s[1992]! }
- public var Cache_Videos: String { return self._s[1993]! }
- public var PrivacySettings_PhoneNumber: String { return self._s[1994]! }
- public var FeatureDisabled_Oops: String { return self._s[1996]! }
- public var Passport_Address_PostcodePlaceholder: String { return self._s[1997]! }
+ public var Message_PinnedVideoMessage: String { return self._s[1996]! }
+ public var ChatList_Mute: String { return self._s[1997]! }
+ public var Permissions_CellularDataText_v0: String { return self._s[1998]! }
+ public var ShareMenu_SelectChats: String { return self._s[2001]! }
+ public var ChatList_Context_Unarchive: String { return self._s[2002]! }
+ public var MusicPlayer_VoiceNote: String { return self._s[2003]! }
+ public var Conversation_RestrictedText: String { return self._s[2004]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2005]! }
+ public var TwoStepAuth_DisableSuccess: String { return self._s[2006]! }
+ public var Cache_Videos: String { return self._s[2007]! }
+ public var PrivacySettings_PhoneNumber: String { return self._s[2008]! }
+ public var FeatureDisabled_Oops: String { return self._s[2010]! }
+ public var Passport_Address_PostcodePlaceholder: String { return self._s[2011]! }
public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1998]!, self._r[1998]!, [_0])
+ return formatWithArgumentRanges(self._s[2012]!, self._r[2012]!, [_0])
}
- public var Stickers_GroupStickersHelp: String { return self._s[1999]! }
- public var GroupPermission_NoSendPolls: String { return self._s[2000]! }
- public var Message_VideoExpired: String { return self._s[2002]! }
- public var Notifications_Badge: String { return self._s[2003]! }
- public var GroupInfo_GroupHistoryVisible: String { return self._s[2004]! }
- public var CreatePoll_OptionPlaceholder: String { return self._s[2005]! }
- public var Username_InvalidTooShort: String { return self._s[2006]! }
- public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2007]! }
- public var Channel_AdminLog_PinMessages: String { return self._s[2008]! }
- public var ArchivedChats_IntroTitle3: String { return self._s[2009]! }
+ public var Stickers_GroupStickersHelp: String { return self._s[2013]! }
+ public var GroupPermission_NoSendPolls: String { return self._s[2014]! }
+ public var Message_VideoExpired: String { return self._s[2016]! }
+ public var Notifications_Badge: String { return self._s[2017]! }
+ public var GroupInfo_GroupHistoryVisible: String { return self._s[2018]! }
+ public var CreatePoll_OptionPlaceholder: String { return self._s[2019]! }
+ public var Username_InvalidTooShort: String { return self._s[2020]! }
+ public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2021]! }
+ public var Channel_AdminLog_PinMessages: String { return self._s[2022]! }
+ public var ArchivedChats_IntroTitle3: String { return self._s[2023]! }
public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2010]!, self._r[2010]!, [_1])
+ return formatWithArgumentRanges(self._s[2024]!, self._r[2024]!, [_1])
}
- public var Permissions_SiriAllowInSettings_v0: String { return self._s[2011]! }
- public var Conversation_DefaultRestrictedText: String { return self._s[2012]! }
- public var SharedMedia_CategoryDocs: String { return self._s[2015]! }
+ public var Permissions_SiriAllowInSettings_v0: String { return self._s[2025]! }
+ public var Conversation_DefaultRestrictedText: String { return self._s[2026]! }
+ public var SharedMedia_CategoryDocs: String { return self._s[2029]! }
public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2016]!, self._r[2016]!, [_1])
+ return formatWithArgumentRanges(self._s[2030]!, self._r[2030]!, [_1])
}
- public var Privacy_Forwards_NeverLink: String { return self._s[2018]! }
+ public var Privacy_Forwards_NeverLink: String { return self._s[2032]! }
public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2019]!, self._r[2019]!, [_1])
+ return formatWithArgumentRanges(self._s[2033]!, self._r[2033]!, [_1])
}
- public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2020]! }
+ public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2034]! }
public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2021]!, self._r[2021]!, [_0])
+ return formatWithArgumentRanges(self._s[2035]!, self._r[2035]!, [_0])
}
- public var ChatSettings_PrivateChats: String { return self._s[2022]! }
- public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2023]! }
- public var Conversation_PrivateMessageLinkCopied: String { return self._s[2024]! }
- public var Channel_UpdatePhotoItem: String { return self._s[2025]! }
- public var GroupInfo_LeftStatus: String { return self._s[2026]! }
- public var Watch_MessageView_Forward: String { return self._s[2028]! }
- public var ReportPeer_ReasonChildAbuse: String { return self._s[2029]! }
- public var Cache_ClearEmpty: String { return self._s[2031]! }
- public var Localization_LanguageName: String { return self._s[2032]! }
- public var WebSearch_GIFs: String { return self._s[2033]! }
- public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2034]! }
- public var Username_InvalidStartsWithNumber: String { return self._s[2035]! }
- public var Common_Back: String { return self._s[2036]! }
- public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2037]! }
+ public var ChatSettings_PrivateChats: String { return self._s[2036]! }
+ public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2037]! }
+ public var Conversation_PrivateMessageLinkCopied: String { return self._s[2038]! }
+ public var Channel_UpdatePhotoItem: String { return self._s[2039]! }
+ public var GroupInfo_LeftStatus: String { return self._s[2040]! }
+ public var Watch_MessageView_Forward: String { return self._s[2042]! }
+ public var ReportPeer_ReasonChildAbuse: String { return self._s[2043]! }
+ public var Cache_ClearEmpty: String { return self._s[2045]! }
+ public var Localization_LanguageName: String { return self._s[2046]! }
+ public var WebSearch_GIFs: String { return self._s[2047]! }
+ public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2048]! }
+ public var Username_InvalidStartsWithNumber: String { return self._s[2049]! }
+ public var Common_Back: String { return self._s[2050]! }
+ public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2051]! }
public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2038]!, self._r[2038]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_1, _2])
}
- public var Passport_Email_Help: String { return self._s[2039]! }
- public var Watch_Conversation_Reply: String { return self._s[2041]! }
- public var Conversation_EditingMessageMediaChange: String { return self._s[2043]! }
- public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2044]! }
- public var Channel_BanUser_Unban: String { return self._s[2046]! }
- public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2047]! }
- public var Group_Username_CreatePublicLinkHelp: String { return self._s[2048]! }
- public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2050]! }
- public var Passport_Identity_Name: String { return self._s[2051]! }
+ public var Passport_Email_Help: String { return self._s[2053]! }
+ public var Watch_Conversation_Reply: String { return self._s[2055]! }
+ public var Conversation_EditingMessageMediaChange: String { return self._s[2057]! }
+ public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2058]! }
+ public var Channel_BanUser_Unban: String { return self._s[2060]! }
+ public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2061]! }
+ public var Group_Username_CreatePublicLinkHelp: String { return self._s[2062]! }
+ public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2064]! }
+ public var Passport_Identity_Name: String { return self._s[2065]! }
public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_0])
+ return formatWithArgumentRanges(self._s[2066]!, self._r[2066]!, [_0])
}
- public var GroupRemoved_ViewUserInfo: String { return self._s[2053]! }
- public var Conversation_BlockUser: String { return self._s[2054]! }
- public var Month_GenJanuary: String { return self._s[2055]! }
- public var ChatSettings_TextSize: String { return self._s[2056]! }
- public var Notification_PassportValuePhone: String { return self._s[2057]! }
- public var Passport_Language_ne: String { return self._s[2058]! }
- public var Notification_CallBack: String { return self._s[2059]! }
- public var TwoStepAuth_EmailHelp: String { return self._s[2060]! }
+ public var GroupRemoved_ViewUserInfo: String { return self._s[2067]! }
+ public var Conversation_BlockUser: String { return self._s[2068]! }
+ public var Month_GenJanuary: String { return self._s[2069]! }
+ public var ChatSettings_TextSize: String { return self._s[2070]! }
+ public var Notification_PassportValuePhone: String { return self._s[2071]! }
+ public var Passport_Language_ne: String { return self._s[2072]! }
+ public var Notification_CallBack: String { return self._s[2073]! }
+ public var TwoStepAuth_EmailHelp: String { return self._s[2074]! }
public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2061]!, self._r[2061]!, [_0])
+ return formatWithArgumentRanges(self._s[2075]!, self._r[2075]!, [_0])
}
- public var Channel_Info_Management: String { return self._s[2062]! }
- public var Passport_FieldIdentityUploadHelp: String { return self._s[2063]! }
- public var Stickers_FrequentlyUsed: String { return self._s[2064]! }
- public var Channel_BanUser_PermissionSendMessages: String { return self._s[2065]! }
- public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2067]! }
+ public var Channel_Info_Management: String { return self._s[2076]! }
+ public var Passport_FieldIdentityUploadHelp: String { return self._s[2077]! }
+ public var Stickers_FrequentlyUsed: String { return self._s[2078]! }
+ public var Channel_BanUser_PermissionSendMessages: String { return self._s[2079]! }
+ public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2081]! }
public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2068]!, self._r[2068]!, [_1, "\(_2)"])
+ return formatWithArgumentRanges(self._s[2082]!, self._r[2082]!, [_1, "\(_2)"])
}
- public var Passport_Address_EditResidentialAddress: String { return self._s[2069]! }
- public var PrivacyPolicy_DeclineTitle: String { return self._s[2070]! }
- public var CreatePoll_TextHeader: String { return self._s[2071]! }
+ public var Passport_Address_EditResidentialAddress: String { return self._s[2083]! }
+ public var PrivacyPolicy_DeclineTitle: String { return self._s[2084]! }
+ public var CreatePoll_TextHeader: String { return self._s[2085]! }
public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2072]!, self._r[2072]!, [_0])
+ return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_0])
}
- public var PhotoEditor_QualityMedium: String { return self._s[2073]! }
- public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2074]! }
- public var Conversation_StatusKickedFromChannel: String { return self._s[2076]! }
- public var CheckoutInfo_ReceiverInfoName: String { return self._s[2077]! }
- public var Group_ErrorSendRestrictedStickers: String { return self._s[2078]! }
+ public var PhotoEditor_QualityMedium: String { return self._s[2087]! }
+ public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2088]! }
+ public var Conversation_StatusKickedFromChannel: String { return self._s[2090]! }
+ public var CheckoutInfo_ReceiverInfoName: String { return self._s[2091]! }
+ public var Group_ErrorSendRestrictedStickers: String { return self._s[2092]! }
public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2079]!, self._r[2079]!, [_0])
+ return formatWithArgumentRanges(self._s[2093]!, self._r[2093]!, [_0])
}
public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_1])
+ return formatWithArgumentRanges(self._s[2094]!, self._r[2094]!, [_1])
}
- public var Conversation_LinkDialogOpen: String { return self._s[2082]! }
- public var VoiceOver_Chat_PollNoVotes: String { return self._s[2083]! }
- public var Settings_Username: String { return self._s[2085]! }
- public var Conversation_Block: String { return self._s[2087]! }
- public var Wallpaper_Wallpaper: String { return self._s[2088]! }
- public var SocksProxySetup_UseProxy: String { return self._s[2090]! }
- public var EditTheme_UploadEditedTheme: String { return self._s[2091]! }
- public var UserInfo_ShareMyContactInfo: String { return self._s[2092]! }
- public var MessageTimer_Forever: String { return self._s[2093]! }
- public var Privacy_Calls_WhoCanCallMe: String { return self._s[2094]! }
- public var PhotoEditor_DiscardChanges: String { return self._s[2095]! }
- public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2096]! }
- public var Passport_Language_da: String { return self._s[2097]! }
- public var SocksProxySetup_PortPlaceholder: String { return self._s[2098]! }
+ public var Conversation_LinkDialogOpen: String { return self._s[2096]! }
+ public var VoiceOver_Chat_PollNoVotes: String { return self._s[2097]! }
+ public var Settings_Username: String { return self._s[2099]! }
+ public var Conversation_Block: String { return self._s[2101]! }
+ public var Wallpaper_Wallpaper: String { return self._s[2102]! }
+ public var SocksProxySetup_UseProxy: String { return self._s[2104]! }
+ public var EditTheme_UploadEditedTheme: String { return self._s[2105]! }
+ public var UserInfo_ShareMyContactInfo: String { return self._s[2106]! }
+ public var MessageTimer_Forever: String { return self._s[2107]! }
+ public var Privacy_Calls_WhoCanCallMe: String { return self._s[2108]! }
+ public var PhotoEditor_DiscardChanges: String { return self._s[2109]! }
+ public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2110]! }
+ public var Passport_Language_da: String { return self._s[2111]! }
+ public var SocksProxySetup_PortPlaceholder: String { return self._s[2112]! }
public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2099]!, self._r[2099]!, [_0])
+ return formatWithArgumentRanges(self._s[2113]!, self._r[2113]!, [_0])
}
- public var Passport_Address_EditPassportRegistration: String { return self._s[2100]! }
+ public var Passport_Address_EditPassportRegistration: String { return self._s[2114]! }
public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2102]!, self._r[2102]!, [_0])
+ return formatWithArgumentRanges(self._s[2116]!, self._r[2116]!, [_0])
}
- public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2104]! }
- public var Conversation_SearchByName_Prefix: String { return self._s[2105]! }
- public var Conversation_PinnedPoll: String { return self._s[2106]! }
- public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2107]! }
+ public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2118]! }
+ public var Conversation_SearchByName_Prefix: String { return self._s[2119]! }
+ public var Conversation_PinnedPoll: String { return self._s[2120]! }
+ public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2121]! }
public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, [_1])
+ return formatWithArgumentRanges(self._s[2122]!, self._r[2122]!, [_1])
}
- public var WallpaperSearch_ColorPurple: String { return self._s[2109]! }
- public var Cache_ByPeerHeader: String { return self._s[2110]! }
+ public var WallpaperSearch_ColorPurple: String { return self._s[2123]! }
+ public var Cache_ByPeerHeader: String { return self._s[2124]! }
public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_0])
+ return formatWithArgumentRanges(self._s[2125]!, self._r[2125]!, [_0])
}
- public var ChatSettings_AutoDownloadDocuments: String { return self._s[2112]! }
- public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2115]! }
- public var Notification_PinnedMessage: String { return self._s[2116]! }
- public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2118]! }
- public var Contacts_SortBy: String { return self._s[2119]! }
+ public var ChatSettings_AutoDownloadDocuments: String { return self._s[2126]! }
+ public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2129]! }
+ public var Notification_PinnedMessage: String { return self._s[2130]! }
+ public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2132]! }
+ public var Contacts_SortBy: String { return self._s[2133]! }
public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, [_1])
+ return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_1])
}
public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2122]!, self._r[2122]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2136]!, self._r[2136]!, [_1, _2])
}
- public var Call_EncryptionKey_Title: String { return self._s[2123]! }
- public var Watch_UserInfo_Service: String { return self._s[2124]! }
- public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2126]! }
- public var Conversation_Unpin: String { return self._s[2128]! }
- public var CancelResetAccount_Title: String { return self._s[2129]! }
- public var Map_LiveLocationFor15Minutes: String { return self._s[2130]! }
+ public var Call_EncryptionKey_Title: String { return self._s[2137]! }
+ public var Watch_UserInfo_Service: String { return self._s[2138]! }
+ public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2140]! }
+ public var Conversation_Unpin: String { return self._s[2142]! }
+ public var CancelResetAccount_Title: String { return self._s[2143]! }
+ public var Map_LiveLocationFor15Minutes: String { return self._s[2144]! }
public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2146]!, self._r[2146]!, [_1, _2, _3])
}
- public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2133]! }
- public var CallSettings_Title: String { return self._s[2134]! }
- public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2135]! }
- public var PasscodeSettings_EncryptDataHelp: String { return self._s[2137]! }
- public var AutoDownloadSettings_Contacts: String { return self._s[2138]! }
+ public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2147]! }
+ public var CallSettings_Title: String { return self._s[2148]! }
+ public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2149]! }
+ public var PasscodeSettings_EncryptDataHelp: String { return self._s[2151]! }
+ public var AutoDownloadSettings_Contacts: String { return self._s[2152]! }
public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2139]!, self._r[2139]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2153]!, self._r[2153]!, [_1, _2])
}
- public var Passport_Identity_DocumentDetails: String { return self._s[2140]! }
- public var LoginPassword_PasswordHelp: String { return self._s[2141]! }
- public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2142]! }
- public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2143]! }
- public var Checkout_TotalPaidAmount: String { return self._s[2144]! }
+ public var Passport_Identity_DocumentDetails: String { return self._s[2154]! }
+ public var LoginPassword_PasswordHelp: String { return self._s[2155]! }
+ public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2156]! }
+ public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2157]! }
+ public var Checkout_TotalPaidAmount: String { return self._s[2158]! }
public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2145]!, self._r[2145]!, [_0])
+ return formatWithArgumentRanges(self._s[2159]!, self._r[2159]!, [_0])
}
- public var PasscodeSettings_ChangePasscode: String { return self._s[2146]! }
- public var Conversation_SecretLinkPreviewAlert: String { return self._s[2148]! }
- public var Privacy_SecretChatsLinkPreviews: String { return self._s[2149]! }
+ public var PasscodeSettings_ChangePasscode: String { return self._s[2160]! }
+ public var Conversation_SecretLinkPreviewAlert: String { return self._s[2162]! }
+ public var Privacy_SecretChatsLinkPreviews: String { return self._s[2163]! }
public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2150]!, self._r[2150]!, [_1])
+ return formatWithArgumentRanges(self._s[2164]!, self._r[2164]!, [_1])
}
- public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2151]! }
- public var Contacts_InviteFriends: String { return self._s[2153]! }
- public var Map_ChooseLocationTitle: String { return self._s[2154]! }
- public var Conversation_StopPoll: String { return self._s[2156]! }
+ public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2165]! }
+ public var Contacts_InviteFriends: String { return self._s[2167]! }
+ public var Map_ChooseLocationTitle: String { return self._s[2168]! }
+ public var Conversation_StopPoll: String { return self._s[2170]! }
public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2157]!, self._r[2157]!, [_0])
+ return formatWithArgumentRanges(self._s[2171]!, self._r[2171]!, [_0])
}
- public var Call_Camera: String { return self._s[2158]! }
- public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2159]! }
- public var Calls_RatingFeedback: String { return self._s[2160]! }
- public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2161]! }
- public var NotificationsSound_Pulse: String { return self._s[2162]! }
- public var Watch_LastSeen_Lately: String { return self._s[2163]! }
- public var ReportGroupLocation_Report: String { return self._s[2166]! }
- public var Widget_NoUsers: String { return self._s[2167]! }
- public var Conversation_UnvotePoll: String { return self._s[2168]! }
- public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2170]! }
- public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2171]! }
- public var NotificationsSound_Circles: String { return self._s[2172]! }
- public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2175]! }
- public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2176]! }
- public var Proxy_TooltipUnavailable: String { return self._s[2177]! }
- public var Passport_Identity_CountryPlaceholder: String { return self._s[2179]! }
- public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2181]! }
- public var Conversation_FileDropbox: String { return self._s[2182]! }
- public var Notifications_ExceptionsUnmuted: String { return self._s[2183]! }
- public var Tour_Text3: String { return self._s[2185]! }
- public var Login_ResetAccountProtected_Title: String { return self._s[2187]! }
- public var GroupPermission_NoSendMessages: String { return self._s[2188]! }
- public var WallpaperSearch_ColorTitle: String { return self._s[2189]! }
- public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2190]! }
+ public var Call_Camera: String { return self._s[2172]! }
+ public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2173]! }
+ public var Calls_RatingFeedback: String { return self._s[2174]! }
+ public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2175]! }
+ public var NotificationsSound_Pulse: String { return self._s[2176]! }
+ public var Watch_LastSeen_Lately: String { return self._s[2177]! }
+ public var ReportGroupLocation_Report: String { return self._s[2180]! }
+ public var Widget_NoUsers: String { return self._s[2181]! }
+ public var Conversation_UnvotePoll: String { return self._s[2182]! }
+ public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2184]! }
+ public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2185]! }
+ public var NotificationsSound_Circles: String { return self._s[2186]! }
+ public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2189]! }
+ public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2190]! }
+ public var Proxy_TooltipUnavailable: String { return self._s[2191]! }
+ public var Passport_Identity_CountryPlaceholder: String { return self._s[2193]! }
+ public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2195]! }
+ public var Conversation_FileDropbox: String { return self._s[2196]! }
+ public var Notifications_ExceptionsUnmuted: String { return self._s[2197]! }
+ public var Tour_Text3: String { return self._s[2199]! }
+ public var Login_ResetAccountProtected_Title: String { return self._s[2201]! }
+ public var GroupPermission_NoSendMessages: String { return self._s[2202]! }
+ public var WallpaperSearch_ColorTitle: String { return self._s[2203]! }
+ public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2204]! }
public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2192]!, self._r[2192]!, [_0])
+ return formatWithArgumentRanges(self._s[2206]!, self._r[2206]!, [_0])
}
- public var GroupInfo_AddParticipantTitle: String { return self._s[2193]! }
- public var Checkout_ShippingOption_Title: String { return self._s[2194]! }
- public var ChatSettings_AutoDownloadTitle: String { return self._s[2195]! }
+ public var GroupInfo_AddParticipantTitle: String { return self._s[2207]! }
+ public var Checkout_ShippingOption_Title: String { return self._s[2208]! }
+ public var ChatSettings_AutoDownloadTitle: String { return self._s[2209]! }
public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2196]!, self._r[2196]!, [_0])
+ return formatWithArgumentRanges(self._s[2210]!, self._r[2210]!, [_0])
}
public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2197]!, self._r[2197]!, [_0])
+ return formatWithArgumentRanges(self._s[2211]!, self._r[2211]!, [_0])
}
- public var Channel_Management_LabelAdministrator: String { return self._s[2198]! }
- public var EditTheme_FileReadError: String { return self._s[2199]! }
- public var OwnershipTransfer_ComeBackLater: String { return self._s[2200]! }
- public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2201]! }
- public var AutoDownloadSettings_Photos: String { return self._s[2203]! }
- public var Appearance_PreviewIncomingText: String { return self._s[2204]! }
- public var ChannelInfo_ConfirmLeave: String { return self._s[2205]! }
- public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2206]! }
- public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2207]! }
- public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2208]! }
- public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2209]! }
- public var GroupInfo_SetGroupPhotoStop: String { return self._s[2210]! }
- public var Notification_SecretChatScreenshot: String { return self._s[2211]! }
- public var AccessDenied_Wallpapers: String { return self._s[2212]! }
- public var Passport_Address_City: String { return self._s[2214]! }
- public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2215]! }
- public var Appearance_ThemeCarouselClassic: String { return self._s[2216]! }
- public var SocksProxySetup_SecretPlaceholder: String { return self._s[2217]! }
- public var AccessDenied_LocationDisabled: String { return self._s[2218]! }
- public var Group_Location_Title: String { return self._s[2219]! }
- public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2221]! }
- public var GroupInfo_Sound: String { return self._s[2222]! }
- public var ChannelInfo_ScamChannelWarning: String { return self._s[2223]! }
- public var Stickers_RemoveFromFavorites: String { return self._s[2224]! }
- public var Contacts_Title: String { return self._s[2225]! }
- public var EditTheme_ThemeTemplateAlertText: String { return self._s[2226]! }
- public var Passport_Language_fr: String { return self._s[2227]! }
- public var Notifications_ResetAllNotifications: String { return self._s[2228]! }
- public var PrivacySettings_SecurityTitle: String { return self._s[2231]! }
- public var Checkout_NewCard_Title: String { return self._s[2232]! }
- public var Login_HaveNotReceivedCodeInternal: String { return self._s[2233]! }
- public var Conversation_ForwardChats: String { return self._s[2234]! }
- public var PasscodeSettings_4DigitCode: String { return self._s[2236]! }
- public var Settings_FAQ: String { return self._s[2238]! }
- public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2239]! }
- public var Conversation_ContextMenuForward: String { return self._s[2240]! }
- public var VoiceOver_Chat_YourPhoto: String { return self._s[2243]! }
- public var PrivacyPolicy_Title: String { return self._s[2246]! }
- public var Notifications_TextTone: String { return self._s[2247]! }
- public var Profile_CreateNewContact: String { return self._s[2248]! }
- public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2249]! }
- public var Call_Speaker: String { return self._s[2251]! }
- public var AutoNightTheme_AutomaticSection: String { return self._s[2252]! }
- public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2254]! }
- public var Channel_Username_InvalidCharacters: String { return self._s[2255]! }
+ public var Channel_Management_LabelAdministrator: String { return self._s[2212]! }
+ public var EditTheme_FileReadError: String { return self._s[2213]! }
+ public var OwnershipTransfer_ComeBackLater: String { return self._s[2214]! }
+ public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2215]! }
+ public var AutoDownloadSettings_Photos: String { return self._s[2217]! }
+ public var Appearance_PreviewIncomingText: String { return self._s[2218]! }
+ public var ChatList_Context_MarkAllAsRead: String { return self._s[2219]! }
+ public var ChannelInfo_ConfirmLeave: String { return self._s[2220]! }
+ public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2221]! }
+ public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2222]! }
+ public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2223]! }
+ public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2224]! }
+ public var GroupInfo_SetGroupPhotoStop: String { return self._s[2225]! }
+ public var Notification_SecretChatScreenshot: String { return self._s[2226]! }
+ public var AccessDenied_Wallpapers: String { return self._s[2227]! }
+ public var ChatList_Context_Mute: String { return self._s[2229]! }
+ public var Passport_Address_City: String { return self._s[2230]! }
+ public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2231]! }
+ public var Appearance_ThemeCarouselClassic: String { return self._s[2232]! }
+ public var SocksProxySetup_SecretPlaceholder: String { return self._s[2233]! }
+ public var AccessDenied_LocationDisabled: String { return self._s[2234]! }
+ public var Group_Location_Title: String { return self._s[2235]! }
+ public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2237]! }
+ public var GroupInfo_Sound: String { return self._s[2238]! }
+ public var ChannelInfo_ScamChannelWarning: String { return self._s[2239]! }
+ public var Stickers_RemoveFromFavorites: String { return self._s[2240]! }
+ public var Contacts_Title: String { return self._s[2241]! }
+ public var EditTheme_ThemeTemplateAlertText: String { return self._s[2242]! }
+ public var Passport_Language_fr: String { return self._s[2243]! }
+ public var Notifications_ResetAllNotifications: String { return self._s[2244]! }
+ public var PrivacySettings_SecurityTitle: String { return self._s[2247]! }
+ public var Checkout_NewCard_Title: String { return self._s[2248]! }
+ public var Login_HaveNotReceivedCodeInternal: String { return self._s[2249]! }
+ public var Conversation_ForwardChats: String { return self._s[2250]! }
+ public var PasscodeSettings_4DigitCode: String { return self._s[2252]! }
+ public var Settings_FAQ: String { return self._s[2254]! }
+ public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2255]! }
+ public var Conversation_ContextMenuForward: String { return self._s[2256]! }
+ public var VoiceOver_Chat_YourPhoto: String { return self._s[2259]! }
+ public var PrivacyPolicy_Title: String { return self._s[2262]! }
+ public var Notifications_TextTone: String { return self._s[2263]! }
+ public var Profile_CreateNewContact: String { return self._s[2264]! }
+ public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2265]! }
+ public var Call_Speaker: String { return self._s[2267]! }
+ public var AutoNightTheme_AutomaticSection: String { return self._s[2268]! }
+ public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2270]! }
+ public var Channel_Username_InvalidCharacters: String { return self._s[2271]! }
public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2256]!, self._r[2256]!, [_0])
+ return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_0])
}
- public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2257]! }
- public var PrivacySettings_LastSeenTitle: String { return self._s[2258]! }
- public var Channel_AdminLog_CanInviteUsers: String { return self._s[2259]! }
- public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2260]! }
- public var OwnershipTransfer_SecurityCheck: String { return self._s[2261]! }
- public var Conversation_MessageDeliveryFailed: String { return self._s[2262]! }
- public var Watch_ChatList_NoConversationsText: String { return self._s[2263]! }
- public var Bot_Unblock: String { return self._s[2264]! }
- public var TextFormat_Italic: String { return self._s[2265]! }
- public var WallpaperSearch_ColorPink: String { return self._s[2266]! }
- public var Settings_About_Help: String { return self._s[2267]! }
- public var SearchImages_Title: String { return self._s[2268]! }
- public var Weekday_Wednesday: String { return self._s[2269]! }
- public var Conversation_ClousStorageInfo_Description1: String { return self._s[2270]! }
- public var ExplicitContent_AlertTitle: String { return self._s[2271]! }
+ public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2273]! }
+ public var PrivacySettings_LastSeenTitle: String { return self._s[2274]! }
+ public var Channel_AdminLog_CanInviteUsers: String { return self._s[2275]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2276]! }
+ public var OwnershipTransfer_SecurityCheck: String { return self._s[2277]! }
+ public var Conversation_MessageDeliveryFailed: String { return self._s[2278]! }
+ public var Watch_ChatList_NoConversationsText: String { return self._s[2279]! }
+ public var Bot_Unblock: String { return self._s[2280]! }
+ public var TextFormat_Italic: String { return self._s[2281]! }
+ public var WallpaperSearch_ColorPink: String { return self._s[2282]! }
+ public var Settings_About_Help: String { return self._s[2283]! }
+ public var SearchImages_Title: String { return self._s[2284]! }
+ public var Weekday_Wednesday: String { return self._s[2285]! }
+ public var Conversation_ClousStorageInfo_Description1: String { return self._s[2286]! }
+ public var ExplicitContent_AlertTitle: String { return self._s[2287]! }
public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_1, _2, _3])
}
- public var Channel_DiscussionGroup_Create: String { return self._s[2273]! }
- public var Weekday_Thursday: String { return self._s[2274]! }
- public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2275]! }
- public var Channel_Members_AddMembersHelp: String { return self._s[2276]! }
+ public var Channel_DiscussionGroup_Create: String { return self._s[2289]! }
+ public var Weekday_Thursday: String { return self._s[2290]! }
+ public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2291]! }
+ public var Channel_Members_AddMembersHelp: String { return self._s[2292]! }
public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2277]!, self._r[2277]!, [_0])
- }
- public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2278]! }
- public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2279]! }
- public var Passport_RequestedInformation: String { return self._s[2280]! }
- public var Login_PhoneAndCountryHelp: String { return self._s[2281]! }
- public var Conversation_EncryptionProcessing: String { return self._s[2283]! }
- public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2284]! }
- public var PhotoEditor_EnhanceTool: String { return self._s[2286]! }
- public var Channel_Setup_Title: String { return self._s[2287]! }
- public var Conversation_SearchPlaceholder: String { return self._s[2288]! }
- public var AccessDenied_LocationAlwaysDenied: String { return self._s[2289]! }
- public var Checkout_ErrorGeneric: String { return self._s[2290]! }
- public var Passport_Language_hu: String { return self._s[2291]! }
- public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2293]!, self._r[2293]!, [_0])
}
+ public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2294]! }
+ public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2295]! }
+ public var Passport_RequestedInformation: String { return self._s[2296]! }
+ public var Login_PhoneAndCountryHelp: String { return self._s[2297]! }
+ public var Conversation_EncryptionProcessing: String { return self._s[2299]! }
+ public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2300]! }
+ public var PhotoEditor_EnhanceTool: String { return self._s[2302]! }
+ public var Channel_Setup_Title: String { return self._s[2303]! }
+ public var Conversation_SearchPlaceholder: String { return self._s[2304]! }
+ public var AccessDenied_LocationAlwaysDenied: String { return self._s[2305]! }
+ public var Checkout_ErrorGeneric: String { return self._s[2306]! }
+ public var Passport_Language_hu: String { return self._s[2307]! }
+ public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2309]!, self._r[2309]!, [_0])
+ }
public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2296]!, self._r[2296]!, [_1])
+ return formatWithArgumentRanges(self._s[2312]!, self._r[2312]!, [_1])
}
public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2297]!, self._r[2297]!, [_0])
+ return formatWithArgumentRanges(self._s[2313]!, self._r[2313]!, [_0])
}
- public var Group_Location_Info: String { return self._s[2298]! }
- public var Conversation_CloudStorageInfo_Title: String { return self._s[2299]! }
- public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2300]! }
- public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2301]! }
+ public var Group_Location_Info: String { return self._s[2314]! }
+ public var Conversation_CloudStorageInfo_Title: String { return self._s[2315]! }
+ public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2316]! }
+ public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2317]! }
public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_0])
- }
- public var Conversation_ClearPrivateHistory: String { return self._s[2303]! }
- public var ContactInfo_PhoneLabelHome: String { return self._s[2304]! }
- public var Appearance_RemoveThemeConfirmation: String { return self._s[2305]! }
- public var PrivacySettings_LastSeenContacts: String { return self._s[2306]! }
- public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2307]!, self._r[2307]!, [_0])
- }
- public var Passport_Language_cs: String { return self._s[2308]! }
- public var Message_PinnedAnimationMessage: String { return self._s[2310]! }
- public var Passport_Identity_ReverseSideHelp: String { return self._s[2312]! }
- public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2313]! }
- public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2315]! }
- public var Embed_PlayingInPIP: String { return self._s[2316]! }
- public var AutoNightTheme_ScheduleSection: String { return self._s[2317]! }
- public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2318]!, self._r[2318]!, [_0])
}
- public var MediaPicker_LivePhotoDescription: String { return self._s[2319]! }
- public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2320]!, self._r[2320]!, [_1])
+ public var Conversation_ClearPrivateHistory: String { return self._s[2319]! }
+ public var ContactInfo_PhoneLabelHome: String { return self._s[2320]! }
+ public var Appearance_RemoveThemeConfirmation: String { return self._s[2321]! }
+ public var PrivacySettings_LastSeenContacts: String { return self._s[2322]! }
+ public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2323]!, self._r[2323]!, [_0])
}
- public var Notification_PaymentSent: String { return self._s[2321]! }
- public var PhotoEditor_CurvesGreen: String { return self._s[2322]! }
- public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2323]! }
- public var SaveIncomingPhotosSettings_Title: String { return self._s[2324]! }
- public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2325]! }
- public var VoiceOver_Chat_PagePreview: String { return self._s[2326]! }
+ public var Passport_Language_cs: String { return self._s[2324]! }
+ public var Message_PinnedAnimationMessage: String { return self._s[2326]! }
+ public var Passport_Identity_ReverseSideHelp: String { return self._s[2328]! }
+ public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2329]! }
+ public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2331]! }
+ public var Embed_PlayingInPIP: String { return self._s[2332]! }
+ public var AutoNightTheme_ScheduleSection: String { return self._s[2333]! }
+ public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2334]!, self._r[2334]!, [_0])
+ }
+ public var MediaPicker_LivePhotoDescription: String { return self._s[2335]! }
+ public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2336]!, self._r[2336]!, [_1])
+ }
+ public var Notification_PaymentSent: String { return self._s[2337]! }
+ public var PhotoEditor_CurvesGreen: String { return self._s[2338]! }
+ public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2339]! }
+ public var SaveIncomingPhotosSettings_Title: String { return self._s[2340]! }
+ public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2341]! }
+ public var VoiceOver_Chat_PagePreview: String { return self._s[2342]! }
public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2329]!, self._r[2329]!, [_1])
+ return formatWithArgumentRanges(self._s[2345]!, self._r[2345]!, [_1])
}
public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2330]!, self._r[2330]!, [_1])
+ return formatWithArgumentRanges(self._s[2346]!, self._r[2346]!, [_1])
}
public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2331]!, self._r[2331]!, [_1])
+ return formatWithArgumentRanges(self._s[2347]!, self._r[2347]!, [_1])
}
- public var NetworkUsageSettings_CallDataSection: String { return self._s[2333]! }
- public var PasscodeSettings_HelpTop: String { return self._s[2334]! }
- public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2335]! }
- public var Passport_Address_TypeRentalAgreement: String { return self._s[2336]! }
- public var EditTheme_ShortLink: String { return self._s[2337]! }
- public var ProxyServer_VoiceOver_Active: String { return self._s[2338]! }
- public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2339]! }
- public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2340]! }
- public var Call_Accept: String { return self._s[2342]! }
- public var GroupRemoved_RemoveInfo: String { return self._s[2343]! }
- public var Month_GenMarch: String { return self._s[2345]! }
- public var PhotoEditor_ShadowsTool: String { return self._s[2346]! }
- public var LoginPassword_Title: String { return self._s[2347]! }
- public var Call_End: String { return self._s[2348]! }
- public var Watch_Conversation_GroupInfo: String { return self._s[2349]! }
- public var VoiceOver_Chat_Contact: String { return self._s[2350]! }
- public var EditTheme_Create_Preview_IncomingText: String { return self._s[2351]! }
- public var CallSettings_Always: String { return self._s[2352]! }
- public var CallFeedback_Success: String { return self._s[2353]! }
- public var TwoStepAuth_SetupHint: String { return self._s[2354]! }
+ public var NetworkUsageSettings_CallDataSection: String { return self._s[2349]! }
+ public var PasscodeSettings_HelpTop: String { return self._s[2350]! }
+ public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2351]! }
+ public var Passport_Address_TypeRentalAgreement: String { return self._s[2352]! }
+ public var EditTheme_ShortLink: String { return self._s[2353]! }
+ public var ProxyServer_VoiceOver_Active: String { return self._s[2354]! }
+ public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2355]! }
+ public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2356]! }
+ public var Call_Accept: String { return self._s[2358]! }
+ public var GroupRemoved_RemoveInfo: String { return self._s[2359]! }
+ public var Month_GenMarch: String { return self._s[2361]! }
+ public var PhotoEditor_ShadowsTool: String { return self._s[2362]! }
+ public var LoginPassword_Title: String { return self._s[2363]! }
+ public var Call_End: String { return self._s[2364]! }
+ public var Watch_Conversation_GroupInfo: String { return self._s[2365]! }
+ public var VoiceOver_Chat_Contact: String { return self._s[2366]! }
+ public var EditTheme_Create_Preview_IncomingText: String { return self._s[2367]! }
+ public var CallSettings_Always: String { return self._s[2368]! }
+ public var CallFeedback_Success: String { return self._s[2369]! }
+ public var TwoStepAuth_SetupHint: String { return self._s[2370]! }
public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2355]!, self._r[2355]!, [_1])
+ return formatWithArgumentRanges(self._s[2371]!, self._r[2371]!, [_1])
}
- public var ConversationProfile_UsersTooMuchError: String { return self._s[2356]! }
- public var Login_PhoneTitle: String { return self._s[2357]! }
- public var Passport_FieldPhoneHelp: String { return self._s[2358]! }
- public var Weekday_ShortSunday: String { return self._s[2359]! }
- public var Passport_InfoFAQ_URL: String { return self._s[2360]! }
- public var ContactInfo_Job: String { return self._s[2362]! }
- public var UserInfo_InviteBotToGroup: String { return self._s[2363]! }
- public var Appearance_ThemeCarouselNightBlue: String { return self._s[2364]! }
- public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2365]! }
- public var Invite_ChannelsTooMuch: String { return self._s[2366]! }
- public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2367]! }
- public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2368]! }
- public var CallFeedback_ReasonNoise: String { return self._s[2369]! }
- public var Appearance_AppIconDefault: String { return self._s[2371]! }
- public var Passport_Identity_AddInternalPassport: String { return self._s[2372]! }
- public var MediaPicker_AddCaption: String { return self._s[2373]! }
- public var CallSettings_TabIconDescription: String { return self._s[2374]! }
+ public var ConversationProfile_UsersTooMuchError: String { return self._s[2372]! }
+ public var Login_PhoneTitle: String { return self._s[2373]! }
+ public var Passport_FieldPhoneHelp: String { return self._s[2374]! }
+ public var Weekday_ShortSunday: String { return self._s[2375]! }
+ public var Passport_InfoFAQ_URL: String { return self._s[2376]! }
+ public var ContactInfo_Job: String { return self._s[2378]! }
+ public var UserInfo_InviteBotToGroup: String { return self._s[2379]! }
+ public var Appearance_ThemeCarouselNightBlue: String { return self._s[2380]! }
+ public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2381]! }
+ public var Invite_ChannelsTooMuch: String { return self._s[2382]! }
+ public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2383]! }
+ public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2384]! }
+ public var CallFeedback_ReasonNoise: String { return self._s[2385]! }
+ public var Appearance_AppIconDefault: String { return self._s[2387]! }
+ public var Passport_Identity_AddInternalPassport: String { return self._s[2388]! }
+ public var MediaPicker_AddCaption: String { return self._s[2389]! }
+ public var CallSettings_TabIconDescription: String { return self._s[2390]! }
public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2375]!, self._r[2375]!, [_0])
+ return formatWithArgumentRanges(self._s[2391]!, self._r[2391]!, [_0])
}
- public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2376]! }
- public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2377]! }
- public var Passport_Identity_TypePersonalDetails: String { return self._s[2378]! }
- public var DialogList_SearchSectionRecent: String { return self._s[2379]! }
- public var PrivacyPolicy_DeclineMessage: String { return self._s[2380]! }
- public var LogoutOptions_ClearCacheText: String { return self._s[2383]! }
- public var LastSeen_WithinAWeek: String { return self._s[2384]! }
- public var ChannelMembers_GroupAdminsTitle: String { return self._s[2385]! }
- public var Conversation_CloudStorage_ChatStatus: String { return self._s[2387]! }
- public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2388]! }
+ public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2392]! }
+ public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2393]! }
+ public var Passport_Identity_TypePersonalDetails: String { return self._s[2394]! }
+ public var DialogList_SearchSectionRecent: String { return self._s[2395]! }
+ public var PrivacyPolicy_DeclineMessage: String { return self._s[2396]! }
+ public var LogoutOptions_ClearCacheText: String { return self._s[2399]! }
+ public var LastSeen_WithinAWeek: String { return self._s[2400]! }
+ public var ChannelMembers_GroupAdminsTitle: String { return self._s[2401]! }
+ public var Conversation_CloudStorage_ChatStatus: String { return self._s[2403]! }
+ public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2404]! }
public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2389]!, self._r[2389]!, [_0])
+ return formatWithArgumentRanges(self._s[2405]!, self._r[2405]!, [_0])
}
- public var Passport_Address_TypeResidentialAddress: String { return self._s[2390]! }
- public var Conversation_StatusLeftGroup: String { return self._s[2391]! }
- public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2392]! }
- public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2394]! }
- public var GroupPermission_AddSuccess: String { return self._s[2395]! }
- public var PhotoEditor_BlurToolRadial: String { return self._s[2397]! }
- public var Conversation_ContextMenuCopy: String { return self._s[2398]! }
- public var AccessDenied_CallMicrophone: String { return self._s[2399]! }
+ public var Passport_Address_TypeResidentialAddress: String { return self._s[2406]! }
+ public var Conversation_StatusLeftGroup: String { return self._s[2407]! }
+ public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2408]! }
+ public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2410]! }
+ public var GroupPermission_AddSuccess: String { return self._s[2411]! }
+ public var PhotoEditor_BlurToolRadial: String { return self._s[2413]! }
+ public var Conversation_ContextMenuCopy: String { return self._s[2414]! }
+ public var AccessDenied_CallMicrophone: String { return self._s[2415]! }
public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2400]!, self._r[2400]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2416]!, self._r[2416]!, [_1, _2, _3])
}
- public var Login_InvalidFirstNameError: String { return self._s[2401]! }
- public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2402]! }
- public var Checkout_PaymentMethod_New: String { return self._s[2403]! }
- public var ShareMenu_CopyShareLinkGame: String { return self._s[2404]! }
- public var PhotoEditor_QualityTool: String { return self._s[2405]! }
- public var Login_SendCodeViaSms: String { return self._s[2406]! }
- public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2407]! }
- public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2408]! }
- public var Login_EmailNotConfiguredError: String { return self._s[2409]! }
- public var SocksProxySetup_Status: String { return self._s[2410]! }
- public var PrivacyPolicy_Accept: String { return self._s[2411]! }
- public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2412]! }
- public var Appearance_AppIconClassicX: String { return self._s[2413]! }
+ public var Login_InvalidFirstNameError: String { return self._s[2417]! }
+ public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2418]! }
+ public var Checkout_PaymentMethod_New: String { return self._s[2419]! }
+ public var ShareMenu_CopyShareLinkGame: String { return self._s[2420]! }
+ public var PhotoEditor_QualityTool: String { return self._s[2421]! }
+ public var Login_SendCodeViaSms: String { return self._s[2422]! }
+ public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2423]! }
+ public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2424]! }
+ public var Login_EmailNotConfiguredError: String { return self._s[2425]! }
+ public var SocksProxySetup_Status: String { return self._s[2426]! }
+ public var PrivacyPolicy_Accept: String { return self._s[2427]! }
+ public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2428]! }
+ public var Appearance_AppIconClassicX: String { return self._s[2429]! }
public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2414]!, self._r[2414]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2430]!, self._r[2430]!, [_1, _2, _3])
}
- public var OwnershipTransfer_SecurityRequirements: String { return self._s[2415]! }
- public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2416]! }
- public var AutoNightTheme_Automatic: String { return self._s[2417]! }
- public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2418]! }
- public var Privacy_ContactsSyncHelp: String { return self._s[2419]! }
- public var Cache_Help: String { return self._s[2420]! }
- public var Group_ErrorAccessDenied: String { return self._s[2421]! }
- public var Passport_Language_fa: String { return self._s[2422]! }
- public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2423]! }
- public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2424]! }
- public var PrivacySettings_LastSeen: String { return self._s[2425]! }
+ public var OwnershipTransfer_SecurityRequirements: String { return self._s[2431]! }
+ public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2432]! }
+ public var AutoNightTheme_Automatic: String { return self._s[2433]! }
+ public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2434]! }
+ public var Privacy_ContactsSyncHelp: String { return self._s[2435]! }
+ public var Cache_Help: String { return self._s[2436]! }
+ public var Group_ErrorAccessDenied: String { return self._s[2437]! }
+ public var Passport_Language_fa: String { return self._s[2438]! }
+ public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2439]! }
+ public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2440]! }
+ public var PrivacySettings_LastSeen: String { return self._s[2441]! }
public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2426]!, self._r[2426]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[2442]!, self._r[2442]!, [_0, _1])
}
- public var Preview_SaveGif: String { return self._s[2430]! }
- public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2431]! }
- public var Profile_About: String { return self._s[2432]! }
- public var Channel_About_Placeholder: String { return self._s[2433]! }
- public var Login_InfoTitle: String { return self._s[2434]! }
+ public var Preview_SaveGif: String { return self._s[2446]! }
+ public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2447]! }
+ public var Profile_About: String { return self._s[2448]! }
+ public var Channel_About_Placeholder: String { return self._s[2449]! }
+ public var Login_InfoTitle: String { return self._s[2450]! }
public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2435]!, self._r[2435]!, [_0])
+ return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0])
}
- public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2436]! }
- public var Watch_Suggestion_CantTalk: String { return self._s[2438]! }
- public var ContactInfo_Title: String { return self._s[2439]! }
- public var Media_ShareThisVideo: String { return self._s[2440]! }
- public var Weekday_ShortFriday: String { return self._s[2441]! }
- public var AccessDenied_Contacts: String { return self._s[2443]! }
- public var Notification_CallIncomingShort: String { return self._s[2444]! }
- public var Group_Setup_TypePublic: String { return self._s[2445]! }
- public var Notifications_MessageNotificationsExceptions: String { return self._s[2446]! }
- public var Notifications_Badge_IncludeChannels: String { return self._s[2447]! }
- public var Notifications_MessageNotificationsPreview: String { return self._s[2450]! }
- public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2451]! }
- public var Group_ErrorAddTooMuchBots: String { return self._s[2452]! }
- public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2453]! }
- public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2454]! }
- public var DialogList_Typing: String { return self._s[2455]! }
- public var CallFeedback_IncludeLogs: String { return self._s[2457]! }
- public var Checkout_Phone: String { return self._s[2459]! }
- public var Login_InfoFirstNamePlaceholder: String { return self._s[2462]! }
- public var Privacy_Calls_Integration: String { return self._s[2463]! }
- public var Notifications_PermissionsAllow: String { return self._s[2464]! }
- public var TwoStepAuth_AddHintDescription: String { return self._s[2468]! }
- public var Settings_ChatSettings: String { return self._s[2469]! }
+ public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2452]! }
+ public var Watch_Suggestion_CantTalk: String { return self._s[2454]! }
+ public var ContactInfo_Title: String { return self._s[2455]! }
+ public var Media_ShareThisVideo: String { return self._s[2456]! }
+ public var Weekday_ShortFriday: String { return self._s[2457]! }
+ public var AccessDenied_Contacts: String { return self._s[2459]! }
+ public var Notification_CallIncomingShort: String { return self._s[2460]! }
+ public var Group_Setup_TypePublic: String { return self._s[2461]! }
+ public var Notifications_MessageNotificationsExceptions: String { return self._s[2462]! }
+ public var Notifications_Badge_IncludeChannels: String { return self._s[2463]! }
+ public var Notifications_MessageNotificationsPreview: String { return self._s[2466]! }
+ public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2467]! }
+ public var Group_ErrorAddTooMuchBots: String { return self._s[2468]! }
+ public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2469]! }
+ public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2470]! }
+ public var DialogList_Typing: String { return self._s[2471]! }
+ public var CallFeedback_IncludeLogs: String { return self._s[2473]! }
+ public var Checkout_Phone: String { return self._s[2475]! }
+ public var Login_InfoFirstNamePlaceholder: String { return self._s[2478]! }
+ public var Privacy_Calls_Integration: String { return self._s[2479]! }
+ public var Notifications_PermissionsAllow: String { return self._s[2480]! }
+ public var TwoStepAuth_AddHintDescription: String { return self._s[2484]! }
+ public var Settings_ChatSettings: String { return self._s[2485]! }
public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2470]!, self._r[2470]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2486]!, self._r[2486]!, [_1, _2])
}
- public var GroupRemoved_DeleteUser: String { return self._s[2472]! }
+ public var GroupRemoved_DeleteUser: String { return self._s[2488]! }
public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_0])
+ return formatWithArgumentRanges(self._s[2489]!, self._r[2489]!, [_0])
}
public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2474]!, self._r[2474]!, [_1])
+ return formatWithArgumentRanges(self._s[2490]!, self._r[2490]!, [_1])
}
- public var Login_ContinueWithLocalization: String { return self._s[2475]! }
- public var Watch_Message_ForwardedFrom: String { return self._s[2476]! }
- public var TwoStepAuth_EnterEmailCode: String { return self._s[2478]! }
- public var Conversation_Unblock: String { return self._s[2479]! }
- public var PrivacySettings_DataSettings: String { return self._s[2480]! }
- public var Group_PublicLink_Info: String { return self._s[2481]! }
- public var Notifications_InAppNotificationsVibrate: String { return self._s[2482]! }
+ public var Login_ContinueWithLocalization: String { return self._s[2491]! }
+ public var Watch_Message_ForwardedFrom: String { return self._s[2492]! }
+ public var TwoStepAuth_EnterEmailCode: String { return self._s[2494]! }
+ public var Conversation_Unblock: String { return self._s[2495]! }
+ public var PrivacySettings_DataSettings: String { return self._s[2496]! }
+ public var Group_PublicLink_Info: String { return self._s[2497]! }
+ public var Notifications_InAppNotificationsVibrate: String { return self._s[2498]! }
public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2483]!, self._r[2483]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[2499]!, self._r[2499]!, [_0, _1])
}
- public var PrivacySettings_Passcode: String { return self._s[2486]! }
- public var Call_Mute: String { return self._s[2487]! }
- public var Passport_Language_dz: String { return self._s[2488]! }
- public var Passport_Language_tk: String { return self._s[2489]! }
+ public var PrivacySettings_Passcode: String { return self._s[2502]! }
+ public var Call_Mute: String { return self._s[2503]! }
+ public var Passport_Language_dz: String { return self._s[2504]! }
+ public var Passport_Language_tk: String { return self._s[2505]! }
public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2490]!, self._r[2490]!, [_0])
+ return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_0])
}
- public var Settings_Search: String { return self._s[2491]! }
- public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2492]! }
- public var Conversation_ContextMenuReply: String { return self._s[2493]! }
- public var WallpaperSearch_ColorBrown: String { return self._s[2494]! }
- public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2495]! }
- public var Tour_Title1: String { return self._s[2496]! }
- public var Conversation_ClearGroupHistory: String { return self._s[2498]! }
- public var WallpaperPreview_Motion: String { return self._s[2499]! }
+ public var Settings_Search: String { return self._s[2507]! }
+ public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2508]! }
+ public var Conversation_ContextMenuReply: String { return self._s[2509]! }
+ public var WallpaperSearch_ColorBrown: String { return self._s[2510]! }
+ public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2511]! }
+ public var Tour_Title1: String { return self._s[2512]! }
+ public var Conversation_ClearGroupHistory: String { return self._s[2514]! }
+ public var WallpaperPreview_Motion: String { return self._s[2515]! }
public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2500]!, self._r[2500]!, [_0])
+ return formatWithArgumentRanges(self._s[2516]!, self._r[2516]!, [_0])
}
- public var Call_RateCall: String { return self._s[2501]! }
- public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2502]! }
- public var Passport_PasswordCompleteSetup: String { return self._s[2503]! }
- public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2504]! }
- public var UserInfo_LastNamePlaceholder: String { return self._s[2506]! }
+ public var Call_RateCall: String { return self._s[2517]! }
+ public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2518]! }
+ public var Passport_PasswordCompleteSetup: String { return self._s[2519]! }
+ public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2520]! }
+ public var UserInfo_LastNamePlaceholder: String { return self._s[2522]! }
public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2508]!, self._r[2508]!, [_0])
+ return formatWithArgumentRanges(self._s[2524]!, self._r[2524]!, [_0])
}
- public var Compose_Create: String { return self._s[2509]! }
- public var Contacts_InviteToTelegram: String { return self._s[2510]! }
- public var GroupInfo_Notifications: String { return self._s[2511]! }
- public var Message_PinnedLiveLocationMessage: String { return self._s[2513]! }
- public var Month_GenApril: String { return self._s[2514]! }
- public var Appearance_AutoNightTheme: String { return self._s[2515]! }
- public var ChatSettings_AutomaticAudioDownload: String { return self._s[2517]! }
- public var Login_CodeSentSms: String { return self._s[2519]! }
+ public var Compose_Create: String { return self._s[2525]! }
+ public var Contacts_InviteToTelegram: String { return self._s[2526]! }
+ public var GroupInfo_Notifications: String { return self._s[2527]! }
+ public var Message_PinnedLiveLocationMessage: String { return self._s[2529]! }
+ public var Month_GenApril: String { return self._s[2530]! }
+ public var Appearance_AutoNightTheme: String { return self._s[2531]! }
+ public var ChatSettings_AutomaticAudioDownload: String { return self._s[2533]! }
+ public var Login_CodeSentSms: String { return self._s[2535]! }
public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2520]!, self._r[2520]!, [_0])
+ return formatWithArgumentRanges(self._s[2536]!, self._r[2536]!, [_0])
}
- public var EmptyGroupInfo_Line3: String { return self._s[2521]! }
- public var LogoutOptions_ContactSupportText: String { return self._s[2522]! }
- public var Passport_Language_hr: String { return self._s[2523]! }
- public var Common_ActionNotAllowedError: String { return self._s[2524]! }
+ public var EmptyGroupInfo_Line3: String { return self._s[2537]! }
+ public var LogoutOptions_ContactSupportText: String { return self._s[2538]! }
+ public var Passport_Language_hr: String { return self._s[2539]! }
+ public var Common_ActionNotAllowedError: String { return self._s[2540]! }
public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2525]!, self._r[2525]!, [_0])
+ return formatWithArgumentRanges(self._s[2541]!, self._r[2541]!, [_0])
}
- public var GroupInfo_InviteLink_CopyLink: String { return self._s[2526]! }
- public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2527]! }
- public var Privacy_SecretChatsTitle: String { return self._s[2528]! }
- public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2530]! }
- public var GroupInfo_AddUserLeftError: String { return self._s[2531]! }
- public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2532]! }
- public var LogoutOptions_ContactSupportTitle: String { return self._s[2533]! }
- public var Channel_AddBotErrorHaveRights: String { return self._s[2534]! }
- public var Preview_DeleteGif: String { return self._s[2535]! }
- public var GroupInfo_Permissions_Exceptions: String { return self._s[2536]! }
- public var Group_ErrorNotMutualContact: String { return self._s[2537]! }
- public var Notification_MessageLifetime5s: String { return self._s[2538]! }
+ public var GroupInfo_InviteLink_CopyLink: String { return self._s[2542]! }
+ public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2543]! }
+ public var Privacy_SecretChatsTitle: String { return self._s[2544]! }
+ public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2546]! }
+ public var GroupInfo_AddUserLeftError: String { return self._s[2547]! }
+ public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2548]! }
+ public var LogoutOptions_ContactSupportTitle: String { return self._s[2549]! }
+ public var Channel_AddBotErrorHaveRights: String { return self._s[2550]! }
+ public var Preview_DeleteGif: String { return self._s[2551]! }
+ public var GroupInfo_Permissions_Exceptions: String { return self._s[2552]! }
+ public var Group_ErrorNotMutualContact: String { return self._s[2553]! }
+ public var Notification_MessageLifetime5s: String { return self._s[2554]! }
public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2539]!, self._r[2539]!, [_0])
+ return formatWithArgumentRanges(self._s[2555]!, self._r[2555]!, [_0])
}
- public var VoiceOver_Chat_Video: String { return self._s[2540]! }
- public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2542]! }
- public var ReportSpam_DeleteThisChat: String { return self._s[2543]! }
- public var Passport_Address_AddBankStatement: String { return self._s[2544]! }
- public var Notification_CallIncoming: String { return self._s[2545]! }
- public var Compose_NewGroupTitle: String { return self._s[2546]! }
- public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2548]! }
- public var Passport_Address_Postcode: String { return self._s[2550]! }
+ public var VoiceOver_Chat_Video: String { return self._s[2556]! }
+ public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2558]! }
+ public var ReportSpam_DeleteThisChat: String { return self._s[2559]! }
+ public var Passport_Address_AddBankStatement: String { return self._s[2560]! }
+ public var Notification_CallIncoming: String { return self._s[2561]! }
+ public var Compose_NewGroupTitle: String { return self._s[2562]! }
+ public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2564]! }
+ public var Passport_Address_Postcode: String { return self._s[2566]! }
public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2551]!, self._r[2551]!, [_0])
+ return formatWithArgumentRanges(self._s[2567]!, self._r[2567]!, [_0])
}
- public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2552]! }
- public var VoiceOver_Chat_YourMusic: String { return self._s[2553]! }
- public var WallpaperColors_Title: String { return self._s[2554]! }
- public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2555]! }
- public var VoiceOver_MessageContextForward: String { return self._s[2556]! }
- public var GroupPermission_Duration: String { return self._s[2557]! }
+ public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2568]! }
+ public var VoiceOver_Chat_YourMusic: String { return self._s[2569]! }
+ public var WallpaperColors_Title: String { return self._s[2570]! }
+ public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2571]! }
+ public var VoiceOver_MessageContextForward: String { return self._s[2572]! }
+ public var GroupPermission_Duration: String { return self._s[2573]! }
public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2558]!, self._r[2558]!, [_0])
+ return formatWithArgumentRanges(self._s[2574]!, self._r[2574]!, [_0])
}
- public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2559]! }
- public var Username_Placeholder: String { return self._s[2560]! }
- public var CallFeedback_WhatWentWrong: String { return self._s[2561]! }
- public var Passport_FieldAddressUploadHelp: String { return self._s[2562]! }
- public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2563]! }
+ public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2575]! }
+ public var Username_Placeholder: String { return self._s[2576]! }
+ public var CallFeedback_WhatWentWrong: String { return self._s[2577]! }
+ public var Passport_FieldAddressUploadHelp: String { return self._s[2578]! }
+ public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2579]! }
public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2565]!, self._r[2565]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2581]!, self._r[2581]!, [_1, _2])
}
- public var Passport_PasswordDescription: String { return self._s[2566]! }
- public var Channel_MessagePhotoUpdated: String { return self._s[2567]! }
- public var MediaPicker_TapToUngroupDescription: String { return self._s[2568]! }
- public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2569]! }
- public var AttachmentMenu_PhotoOrVideo: String { return self._s[2570]! }
- public var Conversation_ContextMenuMore: String { return self._s[2571]! }
- public var Privacy_PaymentsClearInfo: String { return self._s[2572]! }
- public var CallSettings_TabIcon: String { return self._s[2573]! }
- public var KeyCommand_Find: String { return self._s[2574]! }
- public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2575]! }
- public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2576]! }
- public var Message_PinnedGame: String { return self._s[2577]! }
- public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2578]! }
- public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2580]! }
- public var Login_CallRequestState2: String { return self._s[2582]! }
- public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2584]! }
+ public var Passport_PasswordDescription: String { return self._s[2582]! }
+ public var Channel_MessagePhotoUpdated: String { return self._s[2583]! }
+ public var MediaPicker_TapToUngroupDescription: String { return self._s[2584]! }
+ public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2585]! }
+ public var AttachmentMenu_PhotoOrVideo: String { return self._s[2586]! }
+ public var Conversation_ContextMenuMore: String { return self._s[2587]! }
+ public var Privacy_PaymentsClearInfo: String { return self._s[2588]! }
+ public var CallSettings_TabIcon: String { return self._s[2589]! }
+ public var KeyCommand_Find: String { return self._s[2590]! }
+ public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2591]! }
+ public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2592]! }
+ public var Message_PinnedGame: String { return self._s[2593]! }
+ public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2594]! }
+ public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2596]! }
+ public var Login_CallRequestState2: String { return self._s[2598]! }
+ public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2600]! }
public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_0])
+ return formatWithArgumentRanges(self._s[2601]!, self._r[2601]!, [_0])
}
public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2587]!, self._r[2587]!, [_0])
+ return formatWithArgumentRanges(self._s[2603]!, self._r[2603]!, [_0])
}
- public var WallpaperPreview_Blurred: String { return self._s[2588]! }
- public var Conversation_InstantPagePreview: String { return self._s[2589]! }
+ public var WallpaperPreview_Blurred: String { return self._s[2604]! }
+ public var Conversation_InstantPagePreview: String { return self._s[2605]! }
public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2590]!, self._r[2590]!, [_0])
+ return formatWithArgumentRanges(self._s[2606]!, self._r[2606]!, [_0])
}
- public var SecretTimer_VideoDescription: String { return self._s[2593]! }
- public var WallpaperSearch_ColorRed: String { return self._s[2594]! }
- public var GroupPermission_NoPinMessages: String { return self._s[2595]! }
- public var Passport_Language_es: String { return self._s[2596]! }
- public var Permissions_ContactsAllow_v0: String { return self._s[2598]! }
- public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2599]! }
+ public var SecretTimer_VideoDescription: String { return self._s[2609]! }
+ public var WallpaperSearch_ColorRed: String { return self._s[2610]! }
+ public var GroupPermission_NoPinMessages: String { return self._s[2611]! }
+ public var Passport_Language_es: String { return self._s[2612]! }
+ public var Permissions_ContactsAllow_v0: String { return self._s[2614]! }
+ public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2615]! }
public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2600]!, self._r[2600]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2616]!, self._r[2616]!, [_1, _2])
}
- public var Privacy_Forwards_CustomHelp: String { return self._s[2601]! }
- public var WebPreview_GettingLinkInfo: String { return self._s[2602]! }
- public var Watch_UserInfo_Unmute: String { return self._s[2603]! }
- public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2604]! }
- public var AccessDenied_CameraRestricted: String { return self._s[2606]! }
+ public var Privacy_Forwards_CustomHelp: String { return self._s[2617]! }
+ public var WebPreview_GettingLinkInfo: String { return self._s[2618]! }
+ public var Watch_UserInfo_Unmute: String { return self._s[2619]! }
+ public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2620]! }
+ public var AccessDenied_CameraRestricted: String { return self._s[2622]! }
public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2607]!, self._r[2607]!, ["\(_0)"])
+ return formatWithArgumentRanges(self._s[2623]!, self._r[2623]!, ["\(_0)"])
}
- public var ChatList_ReadAll: String { return self._s[2609]! }
- public var Settings_CopyUsername: String { return self._s[2610]! }
- public var Contacts_SearchLabel: String { return self._s[2611]! }
- public var Map_OpenInYandexNavigator: String { return self._s[2613]! }
- public var PasscodeSettings_EncryptData: String { return self._s[2614]! }
- public var WallpaperSearch_ColorPrefix: String { return self._s[2615]! }
- public var Notifications_GroupNotificationsPreview: String { return self._s[2616]! }
- public var DialogList_AdNoticeAlert: String { return self._s[2617]! }
- public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2619]! }
- public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2620]! }
- public var Localization_LanguageCustom: String { return self._s[2621]! }
- public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2622]! }
- public var CallFeedback_Title: String { return self._s[2623]! }
- public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2626]! }
- public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2627]! }
- public var Conversation_InfoGroup: String { return self._s[2628]! }
- public var Compose_NewMessage: String { return self._s[2629]! }
- public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2630]! }
- public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2631]! }
- public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2632]! }
+ public var ChatList_ReadAll: String { return self._s[2625]! }
+ public var Settings_CopyUsername: String { return self._s[2626]! }
+ public var Contacts_SearchLabel: String { return self._s[2627]! }
+ public var Map_OpenInYandexNavigator: String { return self._s[2629]! }
+ public var PasscodeSettings_EncryptData: String { return self._s[2630]! }
+ public var WallpaperSearch_ColorPrefix: String { return self._s[2631]! }
+ public var Notifications_GroupNotificationsPreview: String { return self._s[2632]! }
+ public var DialogList_AdNoticeAlert: String { return self._s[2633]! }
+ public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2635]! }
+ public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2636]! }
+ public var Localization_LanguageCustom: String { return self._s[2637]! }
+ public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2638]! }
+ public var CallFeedback_Title: String { return self._s[2639]! }
+ public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2642]! }
+ public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2643]! }
+ public var Conversation_InfoGroup: String { return self._s[2644]! }
+ public var Compose_NewMessage: String { return self._s[2645]! }
+ public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2646]! }
+ public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2647]! }
+ public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2648]! }
public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2633]!, self._r[2633]!, [_0])
+ return formatWithArgumentRanges(self._s[2649]!, self._r[2649]!, [_0])
}
- public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2634]! }
- public var Login_CancelSignUpConfirmation: String { return self._s[2635]! }
- public var ChangePhoneNumberCode_Help: String { return self._s[2636]! }
- public var PrivacySettings_DeleteAccountHelp: String { return self._s[2637]! }
- public var Channel_BlackList_Title: String { return self._s[2638]! }
- public var UserInfo_PhoneCall: String { return self._s[2639]! }
- public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2641]! }
- public var State_connecting: String { return self._s[2642]! }
- public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2643]! }
- public var EditTheme_Expand_BottomInfo: String { return self._s[2644]! }
+ public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2650]! }
+ public var Login_CancelSignUpConfirmation: String { return self._s[2651]! }
+ public var ChangePhoneNumberCode_Help: String { return self._s[2652]! }
+ public var PrivacySettings_DeleteAccountHelp: String { return self._s[2653]! }
+ public var Channel_BlackList_Title: String { return self._s[2654]! }
+ public var UserInfo_PhoneCall: String { return self._s[2655]! }
+ public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2657]! }
+ public var State_connecting: String { return self._s[2658]! }
+ public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2659]! }
+ public var EditTheme_Expand_BottomInfo: String { return self._s[2660]! }
public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_0])
+ return formatWithArgumentRanges(self._s[2661]!, self._r[2661]!, [_0])
}
public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2646]!, self._r[2646]!, [_0])
+ return formatWithArgumentRanges(self._s[2662]!, self._r[2662]!, [_0])
}
- public var Notifications_GroupNotifications: String { return self._s[2647]! }
- public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2648]! }
- public var Passport_Identity_EditPassport: String { return self._s[2649]! }
- public var EnterPasscode_RepeatNewPasscode: String { return self._s[2651]! }
- public var Localization_EnglishLanguageName: String { return self._s[2652]! }
- public var Share_AuthDescription: String { return self._s[2653]! }
- public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2654]! }
- public var Passport_Identity_Surname: String { return self._s[2655]! }
- public var Compose_TokenListPlaceholder: String { return self._s[2656]! }
- public var Passport_Identity_OneOfTypePassport: String { return self._s[2657]! }
- public var Settings_AboutEmpty: String { return self._s[2658]! }
- public var Conversation_Unmute: String { return self._s[2659]! }
- public var CreateGroup_ChannelsTooMuch: String { return self._s[2661]! }
+ public var Notifications_GroupNotifications: String { return self._s[2663]! }
+ public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2664]! }
+ public var Passport_Identity_EditPassport: String { return self._s[2665]! }
+ public var EnterPasscode_RepeatNewPasscode: String { return self._s[2667]! }
+ public var Localization_EnglishLanguageName: String { return self._s[2668]! }
+ public var Share_AuthDescription: String { return self._s[2669]! }
+ public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2670]! }
+ public var Passport_Identity_Surname: String { return self._s[2671]! }
+ public var Compose_TokenListPlaceholder: String { return self._s[2672]! }
+ public var Passport_Identity_OneOfTypePassport: String { return self._s[2673]! }
+ public var Settings_AboutEmpty: String { return self._s[2674]! }
+ public var Conversation_Unmute: String { return self._s[2675]! }
+ public var CreateGroup_ChannelsTooMuch: String { return self._s[2677]! }
public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2662]!, self._r[2662]!, [_1])
+ return formatWithArgumentRanges(self._s[2678]!, self._r[2678]!, [_1])
}
- public var Login_CodeSentCall: String { return self._s[2663]! }
- public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2665]! }
- public var ChatSettings_Appearance: String { return self._s[2666]! }
- public var Appearance_PickAccentColor: String { return self._s[2667]! }
+ public var Login_CodeSentCall: String { return self._s[2679]! }
+ public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2681]! }
+ public var ChatSettings_Appearance: String { return self._s[2682]! }
+ public var Appearance_PickAccentColor: String { return self._s[2683]! }
public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2668]!, self._r[2668]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2684]!, self._r[2684]!, [_1, _2])
}
public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2669]!, self._r[2669]!, [_1])
+ return formatWithArgumentRanges(self._s[2685]!, self._r[2685]!, [_1])
}
- public var Notification_CallMissed: String { return self._s[2670]! }
- public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2671]! }
- public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2672]! }
- public var ChatAdmins_AdminLabel: String { return self._s[2674]! }
- public var KeyCommand_JumpToNextChat: String { return self._s[2675]! }
- public var Conversation_StopPollConfirmationTitle: String { return self._s[2677]! }
- public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2678]! }
- public var Month_GenJune: String { return self._s[2679]! }
- public var Watch_Location_Current: String { return self._s[2680]! }
- public var Conversation_TitleMute: String { return self._s[2681]! }
+ public var Notification_CallMissed: String { return self._s[2686]! }
+ public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2687]! }
+ public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2688]! }
+ public var ChatAdmins_AdminLabel: String { return self._s[2690]! }
+ public var KeyCommand_JumpToNextChat: String { return self._s[2691]! }
+ public var Conversation_StopPollConfirmationTitle: String { return self._s[2693]! }
+ public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2694]! }
+ public var Month_GenJune: String { return self._s[2695]! }
+ public var Watch_Location_Current: String { return self._s[2696]! }
+ public var Conversation_TitleMute: String { return self._s[2697]! }
public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2682]!, self._r[2682]!, [_1])
+ return formatWithArgumentRanges(self._s[2698]!, self._r[2698]!, [_1])
}
- public var GroupInfo_DeleteAndExit: String { return self._s[2683]! }
+ public var GroupInfo_DeleteAndExit: String { return self._s[2699]! }
public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2684]!, self._r[2684]!, [_0])
+ return formatWithArgumentRanges(self._s[2700]!, self._r[2700]!, [_0])
}
- public var Call_ReportPlaceholder: String { return self._s[2685]! }
- public var Chat_SlowmodeSendError: String { return self._s[2686]! }
- public var MaskStickerSettings_Info: String { return self._s[2687]! }
- public var EditTheme_Expand_TopInfo: String { return self._s[2688]! }
+ public var Call_ReportPlaceholder: String { return self._s[2701]! }
+ public var Chat_SlowmodeSendError: String { return self._s[2702]! }
+ public var MaskStickerSettings_Info: String { return self._s[2703]! }
+ public var EditTheme_Expand_TopInfo: String { return self._s[2704]! }
public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_0])
+ return formatWithArgumentRanges(self._s[2705]!, self._r[2705]!, [_0])
}
- public var Checkout_NewCard_PostcodeTitle: String { return self._s[2690]! }
- public var Passport_Address_RegionPlaceholder: String { return self._s[2692]! }
- public var Contacts_ShareTelegram: String { return self._s[2693]! }
- public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2694]! }
- public var Channel_ErrorAccessDenied: String { return self._s[2695]! }
- public var UserInfo_ScamBotWarning: String { return self._s[2697]! }
- public var Stickers_GroupChooseStickerPack: String { return self._s[2698]! }
- public var Call_ConnectionErrorTitle: String { return self._s[2699]! }
- public var UserInfo_NotificationsEnable: String { return self._s[2700]! }
- public var ArchivedChats_IntroText1: String { return self._s[2701]! }
- public var Tour_Text4: String { return self._s[2704]! }
- public var WallpaperSearch_Recent: String { return self._s[2705]! }
- public var GroupInfo_ScamGroupWarning: String { return self._s[2706]! }
- public var Profile_MessageLifetime2s: String { return self._s[2708]! }
- public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2709]! }
- public var Notification_MessageLifetime2s: String { return self._s[2710]! }
+ public var Checkout_NewCard_PostcodeTitle: String { return self._s[2706]! }
+ public var Passport_Address_RegionPlaceholder: String { return self._s[2708]! }
+ public var Contacts_ShareTelegram: String { return self._s[2709]! }
+ public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2710]! }
+ public var Channel_ErrorAccessDenied: String { return self._s[2711]! }
+ public var UserInfo_ScamBotWarning: String { return self._s[2713]! }
+ public var Stickers_GroupChooseStickerPack: String { return self._s[2714]! }
+ public var Call_ConnectionErrorTitle: String { return self._s[2715]! }
+ public var UserInfo_NotificationsEnable: String { return self._s[2716]! }
+ public var ArchivedChats_IntroText1: String { return self._s[2717]! }
+ public var Tour_Text4: String { return self._s[2720]! }
+ public var WallpaperSearch_Recent: String { return self._s[2721]! }
+ public var GroupInfo_ScamGroupWarning: String { return self._s[2722]! }
+ public var Profile_MessageLifetime2s: String { return self._s[2724]! }
+ public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2725]! }
+ public var Notification_MessageLifetime2s: String { return self._s[2726]! }
public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2711]!, self._r[2711]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2727]!, self._r[2727]!, [_1, _2, _3])
}
- public var Cache_ClearCache: String { return self._s[2712]! }
- public var AutoNightTheme_UpdateLocation: String { return self._s[2713]! }
- public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2714]! }
+ public var Cache_ClearCache: String { return self._s[2728]! }
+ public var AutoNightTheme_UpdateLocation: String { return self._s[2729]! }
+ public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2730]! }
public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_0])
+ return formatWithArgumentRanges(self._s[2734]!, self._r[2734]!, [_0])
}
public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2720]!, self._r[2720]!, [_0])
+ return formatWithArgumentRanges(self._s[2736]!, self._r[2736]!, [_0])
}
- public var LocalGroup_Text: String { return self._s[2721]! }
- public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2722]! }
- public var SocksProxySetup_TypeSocks: String { return self._s[2723]! }
- public var ChatList_UnarchiveAction: String { return self._s[2724]! }
- public var AutoNightTheme_Title: String { return self._s[2725]! }
- public var InstantPage_FeedbackButton: String { return self._s[2726]! }
- public var Passport_FieldAddress: String { return self._s[2727]! }
+ public var LocalGroup_Text: String { return self._s[2737]! }
+ public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2738]! }
+ public var SocksProxySetup_TypeSocks: String { return self._s[2739]! }
+ public var ChatList_UnarchiveAction: String { return self._s[2740]! }
+ public var AutoNightTheme_Title: String { return self._s[2741]! }
+ public var InstantPage_FeedbackButton: String { return self._s[2742]! }
+ public var Passport_FieldAddress: String { return self._s[2743]! }
public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2728]!, self._r[2728]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2744]!, self._r[2744]!, [_1, _2])
}
- public var Month_ShortMarch: String { return self._s[2729]! }
+ public var Month_ShortMarch: String { return self._s[2745]! }
public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2730]!, self._r[2730]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2746]!, self._r[2746]!, [_1, _2])
}
- public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2731]! }
- public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2732]! }
- public var Passport_FloodError: String { return self._s[2733]! }
- public var SecretGif_Title: String { return self._s[2734]! }
- public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2735]! }
- public var Passport_Language_th: String { return self._s[2737]! }
- public var Passport_Address_Address: String { return self._s[2738]! }
- public var Login_InvalidLastNameError: String { return self._s[2739]! }
- public var Notifications_InAppNotificationsPreview: String { return self._s[2740]! }
- public var Notifications_PermissionsUnreachableTitle: String { return self._s[2741]! }
- public var SettingsSearch_FAQ: String { return self._s[2742]! }
- public var ShareMenu_Send: String { return self._s[2743]! }
- public var WallpaperSearch_ColorYellow: String { return self._s[2745]! }
- public var Month_GenNovember: String { return self._s[2747]! }
- public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2749]! }
+ public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2747]! }
+ public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2748]! }
+ public var Passport_FloodError: String { return self._s[2749]! }
+ public var SecretGif_Title: String { return self._s[2750]! }
+ public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2751]! }
+ public var ChatList_Context_UnhideArchive: String { return self._s[2752]! }
+ public var Passport_Language_th: String { return self._s[2754]! }
+ public var Passport_Address_Address: String { return self._s[2755]! }
+ public var Login_InvalidLastNameError: String { return self._s[2756]! }
+ public var Notifications_InAppNotificationsPreview: String { return self._s[2757]! }
+ public var Notifications_PermissionsUnreachableTitle: String { return self._s[2758]! }
+ public var ChatList_Context_Archive: String { return self._s[2759]! }
+ public var SettingsSearch_FAQ: String { return self._s[2760]! }
+ public var ShareMenu_Send: String { return self._s[2761]! }
+ public var WallpaperSearch_ColorYellow: String { return self._s[2763]! }
+ public var Month_GenNovember: String { return self._s[2765]! }
+ public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2767]! }
public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2750]!, self._r[2750]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2768]!, self._r[2768]!, [_1, _2])
}
- public var Checkout_Email: String { return self._s[2751]! }
- public var NotificationsSound_Tritone: String { return self._s[2752]! }
- public var StickerPacksSettings_ManagingHelp: String { return self._s[2754]! }
+ public var Checkout_Email: String { return self._s[2769]! }
+ public var NotificationsSound_Tritone: String { return self._s[2770]! }
+ public var StickerPacksSettings_ManagingHelp: String { return self._s[2772]! }
public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2757]!, self._r[2757]!, [_1])
+ return formatWithArgumentRanges(self._s[2775]!, self._r[2775]!, [_1])
}
- public var ChangePhoneNumberNumber_Help: String { return self._s[2758]! }
+ public var ChangePhoneNumberNumber_Help: String { return self._s[2776]! }
public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_1, _1, _1, _2])
+ return formatWithArgumentRanges(self._s[2777]!, self._r[2777]!, [_1, _1, _1, _2])
}
- public var ChatList_UndoArchiveTitle: String { return self._s[2760]! }
- public var Notification_Exceptions_Add: String { return self._s[2761]! }
- public var DialogList_You: String { return self._s[2762]! }
- public var MediaPicker_Send: String { return self._s[2765]! }
- public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2766]! }
- public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2767]! }
- public var Call_AudioRouteSpeaker: String { return self._s[2768]! }
- public var Watch_UserInfo_Title: String { return self._s[2769]! }
- public var VoiceOver_Chat_PollFinalResults: String { return self._s[2770]! }
- public var Appearance_AccentColor: String { return self._s[2771]! }
+ public var ChatList_UndoArchiveTitle: String { return self._s[2778]! }
+ public var Notification_Exceptions_Add: String { return self._s[2779]! }
+ public var DialogList_You: String { return self._s[2780]! }
+ public var MediaPicker_Send: String { return self._s[2783]! }
+ public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2784]! }
+ public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2785]! }
+ public var Call_AudioRouteSpeaker: String { return self._s[2786]! }
+ public var Watch_UserInfo_Title: String { return self._s[2787]! }
+ public var VoiceOver_Chat_PollFinalResults: String { return self._s[2788]! }
+ public var Appearance_AccentColor: String { return self._s[2789]! }
public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2772]!, self._r[2772]!, [_0])
+ return formatWithArgumentRanges(self._s[2790]!, self._r[2790]!, [_0])
}
- public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2773]! }
+ public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2791]! }
public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2774]!, self._r[2774]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2792]!, self._r[2792]!, [_1, _2])
}
- public var Conversation_ClousStorageInfo_Description2: String { return self._s[2775]! }
- public var WebSearch_RecentClearConfirmation: String { return self._s[2776]! }
- public var Notification_CallOutgoing: String { return self._s[2777]! }
- public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2778]! }
- public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2779]! }
- public var Call_RecordingDisabledMessage: String { return self._s[2780]! }
- public var Message_Game: String { return self._s[2781]! }
- public var Conversation_PressVolumeButtonForSound: String { return self._s[2782]! }
- public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2783]! }
- public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2784]! }
- public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2785]! }
- public var Date_DialogDateFormat: String { return self._s[2786]! }
- public var WallpaperColors_SetCustomColor: String { return self._s[2787]! }
- public var Notifications_InAppNotifications: String { return self._s[2788]! }
+ public var Conversation_ClousStorageInfo_Description2: String { return self._s[2793]! }
+ public var WebSearch_RecentClearConfirmation: String { return self._s[2794]! }
+ public var Notification_CallOutgoing: String { return self._s[2795]! }
+ public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2796]! }
+ public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2797]! }
+ public var Call_RecordingDisabledMessage: String { return self._s[2798]! }
+ public var Message_Game: String { return self._s[2799]! }
+ public var Conversation_PressVolumeButtonForSound: String { return self._s[2800]! }
+ public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2801]! }
+ public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2802]! }
+ public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2803]! }
+ public var Date_DialogDateFormat: String { return self._s[2804]! }
+ public var WallpaperColors_SetCustomColor: String { return self._s[2805]! }
+ public var Notifications_InAppNotifications: String { return self._s[2806]! }
public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2789]!, self._r[2789]!, [_0])
+ return formatWithArgumentRanges(self._s[2807]!, self._r[2807]!, [_0])
}
public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2790]!, self._r[2790]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2808]!, self._r[2808]!, [_1, _2])
}
- public var NewContact_Title: String { return self._s[2791]! }
+ public var NewContact_Title: String { return self._s[2809]! }
public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2792]!, self._r[2792]!, [_0])
+ return formatWithArgumentRanges(self._s[2810]!, self._r[2810]!, [_0])
}
- public var Conversation_ViewContactDetails: String { return self._s[2793]! }
+ public var Conversation_ViewContactDetails: String { return self._s[2811]! }
public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2795]!, self._r[2795]!, [_1])
+ return formatWithArgumentRanges(self._s[2813]!, self._r[2813]!, [_1])
}
- public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2796]! }
- public var Passport_Identity_ExpiryDateNone: String { return self._s[2797]! }
- public var PrivacySettings_Title: String { return self._s[2798]! }
- public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2801]! }
- public var GroupRemoved_UsersSectionTitle: String { return self._s[2802]! }
- public var VoiceOver_Chat_ContactEmail: String { return self._s[2803]! }
- public var Contacts_PhoneNumber: String { return self._s[2804]! }
- public var Map_ShowPlaces: String { return self._s[2806]! }
- public var ChatAdmins_Title: String { return self._s[2807]! }
- public var InstantPage_Reference: String { return self._s[2809]! }
- public var ReportGroupLocation_Text: String { return self._s[2810]! }
+ public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2814]! }
+ public var Passport_Identity_ExpiryDateNone: String { return self._s[2815]! }
+ public var PrivacySettings_Title: String { return self._s[2816]! }
+ public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2819]! }
+ public var GroupRemoved_UsersSectionTitle: String { return self._s[2820]! }
+ public var VoiceOver_Chat_ContactEmail: String { return self._s[2821]! }
+ public var Contacts_PhoneNumber: String { return self._s[2822]! }
+ public var Map_ShowPlaces: String { return self._s[2824]! }
+ public var ChatAdmins_Title: String { return self._s[2825]! }
+ public var InstantPage_Reference: String { return self._s[2827]! }
+ public var ReportGroupLocation_Text: String { return self._s[2828]! }
public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2811]!, self._r[2811]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2829]!, self._r[2829]!, [_1, _2])
}
- public var Camera_FlashOff: String { return self._s[2812]! }
- public var Watch_UserInfo_Block: String { return self._s[2813]! }
- public var ChatSettings_Stickers: String { return self._s[2814]! }
- public var ChatSettings_DownloadInBackground: String { return self._s[2815]! }
- public var Appearance_ThemeCarouselTintedNight: String { return self._s[2816]! }
+ public var Camera_FlashOff: String { return self._s[2830]! }
+ public var Watch_UserInfo_Block: String { return self._s[2831]! }
+ public var ChatSettings_Stickers: String { return self._s[2832]! }
+ public var ChatSettings_DownloadInBackground: String { return self._s[2833]! }
+ public var Appearance_ThemeCarouselTintedNight: String { return self._s[2834]! }
public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2817]!, self._r[2817]!, [_0])
- }
- public var Settings_ViewPhoto: String { return self._s[2818]! }
- public var Login_CheckOtherSessionMessages: String { return self._s[2819]! }
- public var AutoDownloadSettings_Cellular: String { return self._s[2820]! }
- public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2821]! }
- public var VoiceOver_MessageContextShare: String { return self._s[2822]! }
- public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2824]!, self._r[2824]!, [_0])
- }
- public var Privacy_DeleteDrafts: String { return self._s[2825]! }
- public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2826]! }
- public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_0])
- }
- public var DialogList_SavedMessagesHelp: String { return self._s[2828]! }
- public var DialogList_SavedMessages: String { return self._s[2829]! }
- public var GroupInfo_UpgradeButton: String { return self._s[2830]! }
- public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2832]! }
- public var DialogList_Pin: String { return self._s[2833]! }
- public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2834]!, self._r[2834]!, [_0, _1])
- }
- public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2835]!, self._r[2835]!, [_0])
}
- public var Notification_Exceptions_AlwaysOn: String { return self._s[2836]! }
- public var UserInfo_NotificationsDisable: String { return self._s[2837]! }
- public var Paint_Outlined: String { return self._s[2838]! }
- public var Activity_PlayingGame: String { return self._s[2839]! }
- public var SearchImages_NoImagesFound: String { return self._s[2840]! }
- public var SocksProxySetup_ProxyType: String { return self._s[2841]! }
- public var AppleWatch_ReplyPresetsHelp: String { return self._s[2843]! }
- public var Conversation_ContextMenuCancelSending: String { return self._s[2844]! }
- public var Settings_AppLanguage: String { return self._s[2845]! }
- public var TwoStepAuth_ResetAccountHelp: String { return self._s[2846]! }
- public var Common_ChoosePhoto: String { return self._s[2847]! }
- public var CallFeedback_ReasonEcho: String { return self._s[2848]! }
+ public var Settings_ViewPhoto: String { return self._s[2836]! }
+ public var Login_CheckOtherSessionMessages: String { return self._s[2837]! }
+ public var AutoDownloadSettings_Cellular: String { return self._s[2838]! }
+ public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2839]! }
+ public var VoiceOver_MessageContextShare: String { return self._s[2840]! }
+ public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2842]!, self._r[2842]!, [_0])
+ }
+ public var Privacy_DeleteDrafts: String { return self._s[2843]! }
+ public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2844]! }
+ public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2845]!, self._r[2845]!, [_0])
+ }
+ public var DialogList_SavedMessagesHelp: String { return self._s[2846]! }
+ public var DialogList_SavedMessages: String { return self._s[2847]! }
+ public var GroupInfo_UpgradeButton: String { return self._s[2848]! }
+ public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2850]! }
+ public var DialogList_Pin: String { return self._s[2851]! }
+ public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2852]!, self._r[2852]!, [_0, _1])
+ }
+ public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2853]!, self._r[2853]!, [_0])
+ }
+ public var Notification_Exceptions_AlwaysOn: String { return self._s[2854]! }
+ public var UserInfo_NotificationsDisable: String { return self._s[2855]! }
+ public var Paint_Outlined: String { return self._s[2856]! }
+ public var Activity_PlayingGame: String { return self._s[2857]! }
+ public var SearchImages_NoImagesFound: String { return self._s[2858]! }
+ public var SocksProxySetup_ProxyType: String { return self._s[2859]! }
+ public var AppleWatch_ReplyPresetsHelp: String { return self._s[2861]! }
+ public var Conversation_ContextMenuCancelSending: String { return self._s[2862]! }
+ public var Settings_AppLanguage: String { return self._s[2863]! }
+ public var TwoStepAuth_ResetAccountHelp: String { return self._s[2864]! }
+ public var Common_ChoosePhoto: String { return self._s[2865]! }
+ public var CallFeedback_ReasonEcho: String { return self._s[2866]! }
public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2849]!, self._r[2849]!, [_1])
+ return formatWithArgumentRanges(self._s[2867]!, self._r[2867]!, [_1])
}
- public var Privacy_Calls_AlwaysAllow: String { return self._s[2850]! }
- public var Activity_UploadingVideo: String { return self._s[2851]! }
- public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2852]! }
- public var NetworkUsageSettings_Wifi: String { return self._s[2853]! }
- public var VoiceOver_Editing_ClearText: String { return self._s[2854]! }
- public var Channel_BanUser_PermissionReadMessages: String { return self._s[2855]! }
- public var Checkout_PayWithTouchId: String { return self._s[2856]! }
- public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2857]! }
+ public var Privacy_Calls_AlwaysAllow: String { return self._s[2868]! }
+ public var Activity_UploadingVideo: String { return self._s[2869]! }
+ public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2870]! }
+ public var NetworkUsageSettings_Wifi: String { return self._s[2871]! }
+ public var VoiceOver_Editing_ClearText: String { return self._s[2872]! }
+ public var PUSH_SENDER_YOU: String { return self._s[2873]! }
+ public var Channel_BanUser_PermissionReadMessages: String { return self._s[2874]! }
+ public var Checkout_PayWithTouchId: String { return self._s[2875]! }
+ public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2876]! }
public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2859]!, self._r[2859]!, [_1])
+ return formatWithArgumentRanges(self._s[2878]!, self._r[2878]!, [_1])
}
- public var Notifications_ExceptionsNone: String { return self._s[2860]! }
+ public var Notifications_ExceptionsNone: String { return self._s[2879]! }
public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2861]!, self._r[2861]!, [_0])
+ return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_0])
}
public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2862]!, self._r[2862]!, [_1])
+ return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_1])
}
- public var AuthSessions_IncompleteAttempts: String { return self._s[2864]! }
- public var Passport_Address_Region: String { return self._s[2867]! }
- public var ChatList_DeleteChat: String { return self._s[2868]! }
- public var LogoutOptions_ClearCacheTitle: String { return self._s[2869]! }
- public var PhotoEditor_TiltShift: String { return self._s[2870]! }
- public var Settings_FAQ_URL: String { return self._s[2871]! }
- public var Passport_Language_sl: String { return self._s[2872]! }
- public var Settings_PrivacySettings: String { return self._s[2874]! }
- public var SharedMedia_TitleLink: String { return self._s[2875]! }
- public var Passport_Identity_TypePassportUploadScan: String { return self._s[2876]! }
- public var Settings_SetProfilePhoto: String { return self._s[2877]! }
- public var Channel_About_Help: String { return self._s[2878]! }
- public var Contacts_PermissionsEnable: String { return self._s[2879]! }
- public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2880]! }
- public var AttachmentMenu_SendAsFiles: String { return self._s[2881]! }
- public var CallFeedback_ReasonInterruption: String { return self._s[2883]! }
- public var Passport_Address_AddTemporaryRegistration: String { return self._s[2884]! }
- public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2885]! }
- public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2886]! }
- public var PrivacySettings_DeleteAccountTitle: String { return self._s[2887]! }
- public var AccessDenied_VideoMessageCamera: String { return self._s[2889]! }
- public var Map_OpenInYandexMaps: String { return self._s[2891]! }
- public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2892]! }
- public var VoiceOver_MessageContextReply: String { return self._s[2893]! }
- public var PhotoEditor_SaturationTool: String { return self._s[2894]! }
+ public var AuthSessions_IncompleteAttempts: String { return self._s[2883]! }
+ public var Passport_Address_Region: String { return self._s[2886]! }
+ public var ChatList_DeleteChat: String { return self._s[2887]! }
+ public var LogoutOptions_ClearCacheTitle: String { return self._s[2888]! }
+ public var PhotoEditor_TiltShift: String { return self._s[2889]! }
+ public var Settings_FAQ_URL: String { return self._s[2890]! }
+ public var Passport_Language_sl: String { return self._s[2891]! }
+ public var Settings_PrivacySettings: String { return self._s[2893]! }
+ public var SharedMedia_TitleLink: String { return self._s[2894]! }
+ public var Passport_Identity_TypePassportUploadScan: String { return self._s[2895]! }
+ public var Settings_SetProfilePhoto: String { return self._s[2896]! }
+ public var Channel_About_Help: String { return self._s[2897]! }
+ public var Contacts_PermissionsEnable: String { return self._s[2898]! }
+ public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2899]! }
+ public var AttachmentMenu_SendAsFiles: String { return self._s[2900]! }
+ public var CallFeedback_ReasonInterruption: String { return self._s[2902]! }
+ public var Passport_Address_AddTemporaryRegistration: String { return self._s[2903]! }
+ public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2904]! }
+ public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2905]! }
+ public var PrivacySettings_DeleteAccountTitle: String { return self._s[2906]! }
+ public var AccessDenied_VideoMessageCamera: String { return self._s[2908]! }
+ public var Map_OpenInYandexMaps: String { return self._s[2910]! }
+ public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2911]! }
+ public var VoiceOver_MessageContextReply: String { return self._s[2912]! }
+ public var PhotoEditor_SaturationTool: String { return self._s[2913]! }
public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2895]!, self._r[2895]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2914]!, self._r[2914]!, [_1, _2])
}
- public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2896]! }
- public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2897]! }
- public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2898]! }
- public var Appearance_TextSize: String { return self._s[2899]! }
+ public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2915]! }
+ public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2916]! }
+ public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2917]! }
+ public var Appearance_TextSize: String { return self._s[2918]! }
public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2900]!, self._r[2900]!, [_1, "\(_2)"])
+ return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_1, "\(_2)"])
}
- public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2901]! }
- public var Channel_Username_InvalidTooShort: String { return self._s[2903]! }
+ public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2920]! }
+ public var Channel_Username_InvalidTooShort: String { return self._s[2922]! }
public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2904]!, self._r[2904]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_1, _2])
}
public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2905]!, self._r[2905]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_1, _2, _3])
}
- public var GroupInfo_PublicLinkAdd: String { return self._s[2906]! }
- public var Passport_PassportInformation: String { return self._s[2909]! }
- public var Theme_Unsupported: String { return self._s[2910]! }
- public var WatchRemote_AlertTitle: String { return self._s[2911]! }
- public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2912]! }
- public var ConvertToSupergroup_HelpText: String { return self._s[2914]! }
+ public var GroupInfo_PublicLinkAdd: String { return self._s[2925]! }
+ public var Passport_PassportInformation: String { return self._s[2928]! }
+ public var Theme_Unsupported: String { return self._s[2929]! }
+ public var WatchRemote_AlertTitle: String { return self._s[2930]! }
+ public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2931]! }
+ public var ConvertToSupergroup_HelpText: String { return self._s[2933]! }
public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2915]!, self._r[2915]!, [_0])
+ return formatWithArgumentRanges(self._s[2934]!, self._r[2934]!, [_0])
}
public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2916]!, self._r[2916]!, [_1])
+ return formatWithArgumentRanges(self._s[2935]!, self._r[2935]!, [_1])
}
- public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2917]! }
- public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2919]! }
- public var AccessDenied_CameraDisabled: String { return self._s[2920]! }
+ public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2936]! }
+ public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2938]! }
+ public var AccessDenied_CameraDisabled: String { return self._s[2939]! }
public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2921]!, self._r[2921]!, [_0])
- }
- public var PhotoEditor_ContrastTool: String { return self._s[2924]! }
- public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2925]!, self._r[2925]!, [_1])
- }
- public var DialogList_Draft: String { return self._s[2926]! }
- public var Privacy_TopPeersDelete: String { return self._s[2928]! }
- public var LoginPassword_PasswordPlaceholder: String { return self._s[2929]! }
- public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2930]! }
- public var WebSearch_RecentSectionClear: String { return self._s[2931]! }
- public var EditTheme_ErrorInvalidCharacters: String { return self._s[2932]! }
- public var Watch_ChatList_NoConversationsTitle: String { return self._s[2934]! }
- public var Common_Done: String { return self._s[2936]! }
- public var AuthSessions_EmptyText: String { return self._s[2937]! }
- public var Conversation_ShareBotContactConfirmation: String { return self._s[2938]! }
- public var Tour_Title5: String { return self._s[2939]! }
- public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2940]!, self._r[2940]!, [_0])
}
- public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2941]! }
- public var Conversation_LinkDialogSave: String { return self._s[2942]! }
- public var GroupInfo_ActionRestrict: String { return self._s[2943]! }
- public var Checkout_Title: String { return self._s[2944]! }
- public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2946]! }
- public var Channel_AdminLog_CanChangeInfo: String { return self._s[2948]! }
- public var Notification_RenamedGroup: String { return self._s[2949]! }
- public var PeopleNearby_Groups: String { return self._s[2950]! }
- public var Checkout_PayWithFaceId: String { return self._s[2951]! }
- public var Channel_BanList_BlockedTitle: String { return self._s[2952]! }
- public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2954]! }
- public var Checkout_WebConfirmation_Title: String { return self._s[2955]! }
- public var Notifications_MessageNotificationsAlert: String { return self._s[2956]! }
+ public var PhotoEditor_ContrastTool: String { return self._s[2943]! }
+ public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2944]!, self._r[2944]!, [_1])
+ }
+ public var DialogList_Draft: String { return self._s[2945]! }
+ public var Privacy_TopPeersDelete: String { return self._s[2947]! }
+ public var LoginPassword_PasswordPlaceholder: String { return self._s[2948]! }
+ public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2949]! }
+ public var WebSearch_RecentSectionClear: String { return self._s[2950]! }
+ public var EditTheme_ErrorInvalidCharacters: String { return self._s[2951]! }
+ public var Watch_ChatList_NoConversationsTitle: String { return self._s[2953]! }
+ public var Common_Done: String { return self._s[2955]! }
+ public var AuthSessions_EmptyText: String { return self._s[2956]! }
+ public var Conversation_ShareBotContactConfirmation: String { return self._s[2957]! }
+ public var Tour_Title5: String { return self._s[2958]! }
+ public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_0])
+ }
+ public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2960]! }
+ public var Conversation_LinkDialogSave: String { return self._s[2961]! }
+ public var GroupInfo_ActionRestrict: String { return self._s[2962]! }
+ public var Checkout_Title: String { return self._s[2963]! }
+ public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2965]! }
+ public var Channel_AdminLog_CanChangeInfo: String { return self._s[2967]! }
+ public var Notification_RenamedGroup: String { return self._s[2968]! }
+ public var PeopleNearby_Groups: String { return self._s[2969]! }
+ public var Checkout_PayWithFaceId: String { return self._s[2970]! }
+ public var Channel_BanList_BlockedTitle: String { return self._s[2971]! }
+ public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2973]! }
+ public var Checkout_WebConfirmation_Title: String { return self._s[2974]! }
+ public var Notifications_MessageNotificationsAlert: String { return self._s[2975]! }
public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2957]!, self._r[2957]!, [_0])
+ return formatWithArgumentRanges(self._s[2976]!, self._r[2976]!, [_0])
}
- public var Profile_AddToExisting: String { return self._s[2959]! }
+ public var Profile_AddToExisting: String { return self._s[2978]! }
public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2960]!, self._r[2960]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[2979]!, self._r[2979]!, [_0, _1])
}
- public var Cache_Files: String { return self._s[2962]! }
- public var Permissions_PrivacyPolicy: String { return self._s[2963]! }
- public var SocksProxySetup_ConnectAndSave: String { return self._s[2964]! }
- public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2965]! }
- public var AutoDownloadSettings_TypeContacts: String { return self._s[2967]! }
- public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2969]! }
- public var Calls_NoCallsPlaceholder: String { return self._s[2970]! }
- public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2971]! }
- public var VoiceOver_AttachMedia: String { return self._s[2973]! }
- public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2974]! }
+ public var Cache_Files: String { return self._s[2981]! }
+ public var Permissions_PrivacyPolicy: String { return self._s[2982]! }
+ public var SocksProxySetup_ConnectAndSave: String { return self._s[2983]! }
+ public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2984]! }
+ public var AutoDownloadSettings_TypeContacts: String { return self._s[2986]! }
+ public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2988]! }
+ public var Calls_NoCallsPlaceholder: String { return self._s[2989]! }
+ public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2990]! }
+ public var VoiceOver_AttachMedia: String { return self._s[2992]! }
+ public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2993]! }
public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2975]!, self._r[2975]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2994]!, self._r[2994]!, [_1, _2, _3])
}
- public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2976]! }
- public var Conversation_SetReminder_Title: String { return self._s[2977]! }
- public var Passport_FieldAddressHelp: String { return self._s[2978]! }
- public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2979]! }
- public var PUSH_REMINDER_TITLE: String { return self._s[2980]! }
+ public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2995]! }
+ public var Conversation_SetReminder_Title: String { return self._s[2996]! }
+ public var Passport_FieldAddressHelp: String { return self._s[2997]! }
+ public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2998]! }
+ public var PUSH_REMINDER_TITLE: String { return self._s[2999]! }
public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2981]!, self._r[2981]!, [_0])
+ return formatWithArgumentRanges(self._s[3000]!, self._r[3000]!, [_0])
}
- public var Channel_AdminLog_EmptyTitle: String { return self._s[2982]! }
- public var Privacy_Calls_NeverAllow_Title: String { return self._s[2983]! }
- public var Login_UnknownError: String { return self._s[2984]! }
- public var Group_UpgradeNoticeText2: String { return self._s[2987]! }
- public var Watch_Compose_AddContact: String { return self._s[2988]! }
- public var Web_Error: String { return self._s[2989]! }
- public var Gif_Search: String { return self._s[2990]! }
- public var Profile_MessageLifetime1h: String { return self._s[2991]! }
- public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2992]! }
- public var Channel_Username_CheckingUsername: String { return self._s[2993]! }
- public var CallFeedback_ReasonSilentRemote: String { return self._s[2994]! }
- public var AutoDownloadSettings_TypeChannels: String { return self._s[2995]! }
- public var Channel_AboutItem: String { return self._s[2996]! }
- public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2998]! }
- public var VoiceOver_Chat_VoiceMessage: String { return self._s[2999]! }
- public var GroupInfo_SharedMedia: String { return self._s[3000]! }
+ public var Channel_AdminLog_EmptyTitle: String { return self._s[3001]! }
+ public var Privacy_Calls_NeverAllow_Title: String { return self._s[3002]! }
+ public var Login_UnknownError: String { return self._s[3003]! }
+ public var Group_UpgradeNoticeText2: String { return self._s[3006]! }
+ public var Watch_Compose_AddContact: String { return self._s[3007]! }
+ public var Web_Error: String { return self._s[3008]! }
+ public var Gif_Search: String { return self._s[3009]! }
+ public var Profile_MessageLifetime1h: String { return self._s[3010]! }
+ public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3011]! }
+ public var Channel_Username_CheckingUsername: String { return self._s[3012]! }
+ public var CallFeedback_ReasonSilentRemote: String { return self._s[3013]! }
+ public var AutoDownloadSettings_TypeChannels: String { return self._s[3014]! }
+ public var Channel_AboutItem: String { return self._s[3015]! }
+ public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3017]! }
+ public var VoiceOver_Chat_VoiceMessage: String { return self._s[3018]! }
+ public var GroupInfo_SharedMedia: String { return self._s[3019]! }
public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3001]!, self._r[3001]!, [_1])
+ return formatWithArgumentRanges(self._s[3020]!, self._r[3020]!, [_1])
}
- public var Call_PhoneCallInProgressMessage: String { return self._s[3002]! }
+ public var Call_PhoneCallInProgressMessage: String { return self._s[3021]! }
public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3003]!, self._r[3003]!, [_1])
+ return formatWithArgumentRanges(self._s[3022]!, self._r[3022]!, [_1])
}
- public var ChatList_UndoArchiveRevealedText: String { return self._s[3004]! }
- public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3005]! }
- public var Conversation_SearchByName_Placeholder: String { return self._s[3006]! }
- public var CreatePoll_AddOption: String { return self._s[3007]! }
- public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3008]! }
- public var Group_UpgradeNoticeHeader: String { return self._s[3009]! }
- public var Channel_Management_AddModerator: String { return self._s[3010]! }
- public var AutoDownloadSettings_MaxFileSize: String { return self._s[3011]! }
- public var StickerPacksSettings_ShowStickersButton: String { return self._s[3012]! }
- public var NotificationsSound_Hello: String { return self._s[3013]! }
- public var SocksProxySetup_SavedProxies: String { return self._s[3014]! }
- public var Channel_Stickers_Placeholder: String { return self._s[3016]! }
+ public var ChatList_UndoArchiveRevealedText: String { return self._s[3023]! }
+ public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3024]! }
+ public var Conversation_SearchByName_Placeholder: String { return self._s[3025]! }
+ public var CreatePoll_AddOption: String { return self._s[3026]! }
+ public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3027]! }
+ public var Group_UpgradeNoticeHeader: String { return self._s[3028]! }
+ public var Channel_Management_AddModerator: String { return self._s[3029]! }
+ public var AutoDownloadSettings_MaxFileSize: String { return self._s[3030]! }
+ public var StickerPacksSettings_ShowStickersButton: String { return self._s[3031]! }
+ public var NotificationsSound_Hello: String { return self._s[3032]! }
+ public var SocksProxySetup_SavedProxies: String { return self._s[3033]! }
+ public var Channel_Stickers_Placeholder: String { return self._s[3035]! }
public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3017]!, self._r[3017]!, [_0])
+ return formatWithArgumentRanges(self._s[3036]!, self._r[3036]!, [_0])
}
- public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3018]! }
- public var Channel_Management_AddModeratorHelp: String { return self._s[3019]! }
- public var ContactInfo_BirthdayLabel: String { return self._s[3020]! }
- public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3021]! }
- public var AutoDownloadSettings_Channels: String { return self._s[3022]! }
- public var Passport_Language_mn: String { return self._s[3023]! }
- public var Notifications_ResetAllNotificationsHelp: String { return self._s[3026]! }
- public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3027]! }
- public var Passport_Language_ja: String { return self._s[3029]! }
- public var Settings_About_Title: String { return self._s[3030]! }
- public var Settings_NotificationsAndSounds: String { return self._s[3031]! }
- public var ChannelInfo_DeleteGroup: String { return self._s[3032]! }
- public var Settings_BlockedUsers: String { return self._s[3033]! }
+ public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3037]! }
+ public var Channel_Management_AddModeratorHelp: String { return self._s[3038]! }
+ public var ContactInfo_BirthdayLabel: String { return self._s[3039]! }
+ public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3040]! }
+ public var AutoDownloadSettings_Channels: String { return self._s[3041]! }
+ public var Passport_Language_mn: String { return self._s[3042]! }
+ public var Notifications_ResetAllNotificationsHelp: String { return self._s[3045]! }
+ public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3046]! }
+ public var Passport_Language_ja: String { return self._s[3048]! }
+ public var Settings_About_Title: String { return self._s[3049]! }
+ public var Settings_NotificationsAndSounds: String { return self._s[3050]! }
+ public var ChannelInfo_DeleteGroup: String { return self._s[3051]! }
+ public var Settings_BlockedUsers: String { return self._s[3052]! }
public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_0])
+ return formatWithArgumentRanges(self._s[3053]!, self._r[3053]!, [_0])
}
- public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3035]! }
- public var AutoDownloadSettings_PreloadVideo: String { return self._s[3036]! }
- public var Passport_Address_AddResidentialAddress: String { return self._s[3037]! }
- public var Channel_Username_Title: String { return self._s[3038]! }
+ public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3054]! }
+ public var AutoDownloadSettings_PreloadVideo: String { return self._s[3055]! }
+ public var Passport_Address_AddResidentialAddress: String { return self._s[3056]! }
+ public var Channel_Username_Title: String { return self._s[3057]! }
public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3039]!, self._r[3039]!, [_0])
+ return formatWithArgumentRanges(self._s[3058]!, self._r[3058]!, [_0])
}
- public var AttachmentMenu_File: String { return self._s[3041]! }
- public var AppleWatch_Title: String { return self._s[3042]! }
- public var Activity_RecordingVideoMessage: String { return self._s[3043]! }
+ public var AttachmentMenu_File: String { return self._s[3060]! }
+ public var AppleWatch_Title: String { return self._s[3061]! }
+ public var Activity_RecordingVideoMessage: String { return self._s[3062]! }
public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3044]!, self._r[3044]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3063]!, self._r[3063]!, [_1, _2])
}
- public var Weekday_Saturday: String { return self._s[3045]! }
- public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3046]! }
- public var Profile_CreateEncryptedChatError: String { return self._s[3047]! }
- public var Common_Next: String { return self._s[3049]! }
- public var Channel_Stickers_YourStickers: String { return self._s[3051]! }
- public var Message_Theme: String { return self._s[3052]! }
- public var Call_AudioRouteHeadphones: String { return self._s[3053]! }
- public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3055]! }
- public var Watch_Contacts_NoResults: String { return self._s[3057]! }
- public var PhotoEditor_TintTool: String { return self._s[3060]! }
- public var LoginPassword_ResetAccount: String { return self._s[3062]! }
- public var Settings_SavedMessages: String { return self._s[3063]! }
- public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3064]! }
- public var Bot_GenericSupportStatus: String { return self._s[3065]! }
- public var StickerPack_Add: String { return self._s[3066]! }
- public var Checkout_TotalAmount: String { return self._s[3067]! }
- public var Your_cards_number_is_invalid: String { return self._s[3068]! }
- public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3069]! }
- public var VoiceOver_Chat_VideoMessage: String { return self._s[3070]! }
+ public var Weekday_Saturday: String { return self._s[3064]! }
+ public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3065]! }
+ public var Profile_CreateEncryptedChatError: String { return self._s[3066]! }
+ public var Common_Next: String { return self._s[3068]! }
+ public var Channel_Stickers_YourStickers: String { return self._s[3070]! }
+ public var Message_Theme: String { return self._s[3071]! }
+ public var Call_AudioRouteHeadphones: String { return self._s[3072]! }
+ public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3074]! }
+ public var Watch_Contacts_NoResults: String { return self._s[3076]! }
+ public var PhotoEditor_TintTool: String { return self._s[3079]! }
+ public var LoginPassword_ResetAccount: String { return self._s[3081]! }
+ public var Settings_SavedMessages: String { return self._s[3082]! }
+ public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3083]! }
+ public var Bot_GenericSupportStatus: String { return self._s[3084]! }
+ public var StickerPack_Add: String { return self._s[3085]! }
+ public var Checkout_TotalAmount: String { return self._s[3086]! }
+ public var Your_cards_number_is_invalid: String { return self._s[3087]! }
+ public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3088]! }
+ public var VoiceOver_Chat_VideoMessage: String { return self._s[3089]! }
public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3071]!, self._r[3071]!, [_0])
- }
- public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3072]!, self._r[3072]!, [_1, _2])
- }
- public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3073]! }
- public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_1, _2])
- }
- public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3076]!, self._r[3076]!, [_0])
- }
- public var GroupInfo_InviteLink_ShareLink: String { return self._s[3077]! }
- public var StickerPack_Share: String { return self._s[3078]! }
- public var Passport_DeleteAddress: String { return self._s[3079]! }
- public var Settings_Passport: String { return self._s[3080]! }
- public var SharedMedia_EmptyFilesText: String { return self._s[3081]! }
- public var Conversation_DeleteMessagesForMe: String { return self._s[3082]! }
- public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3083]! }
- public var Contacts_PermissionsText: String { return self._s[3084]! }
- public var Group_Setup_HistoryVisible: String { return self._s[3085]! }
- public var Passport_Address_AddRentalAgreement: String { return self._s[3087]! }
- public var SocksProxySetup_Title: String { return self._s[3088]! }
- public var Notification_Mute1h: String { return self._s[3089]! }
- public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_0])
}
- public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3091]! }
- public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_1])
+ public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3091]!, self._r[3091]!, [_1, _2])
}
- public var FastTwoStepSetup_PasswordSection: String { return self._s[3093]! }
- public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3096]! }
- public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3098]! }
- public var DialogList_NoMessagesText: String { return self._s[3099]! }
- public var Privacy_ContactsResetConfirmation: String { return self._s[3100]! }
- public var Privacy_Calls_P2PHelp: String { return self._s[3101]! }
- public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3103]! }
- public var Your_cards_expiration_year_is_invalid: String { return self._s[3104]! }
- public var Common_TakePhotoOrVideo: String { return self._s[3105]! }
- public var Call_StatusBusy: String { return self._s[3106]! }
- public var Conversation_PinnedMessage: String { return self._s[3107]! }
- public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3108]! }
- public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3109]! }
- public var Undo_ChatCleared: String { return self._s[3110]! }
- public var AppleWatch_ReplyPresets: String { return self._s[3111]! }
- public var Passport_DiscardMessageDescription: String { return self._s[3113]! }
- public var Login_NetworkError: String { return self._s[3114]! }
+ public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3092]! }
+ public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3094]!, self._r[3094]!, [_1, _2])
+ }
+ public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_0])
+ }
+ public var GroupInfo_InviteLink_ShareLink: String { return self._s[3096]! }
+ public var StickerPack_Share: String { return self._s[3097]! }
+ public var Passport_DeleteAddress: String { return self._s[3098]! }
+ public var Settings_Passport: String { return self._s[3099]! }
+ public var SharedMedia_EmptyFilesText: String { return self._s[3100]! }
+ public var Conversation_DeleteMessagesForMe: String { return self._s[3101]! }
+ public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3102]! }
+ public var Contacts_PermissionsText: String { return self._s[3103]! }
+ public var Group_Setup_HistoryVisible: String { return self._s[3104]! }
+ public var Passport_Address_AddRentalAgreement: String { return self._s[3106]! }
+ public var SocksProxySetup_Title: String { return self._s[3107]! }
+ public var Notification_Mute1h: String { return self._s[3108]! }
+ public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3109]!, self._r[3109]!, [_0])
+ }
+ public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3110]! }
+ public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_1])
+ }
+ public var FastTwoStepSetup_PasswordSection: String { return self._s[3112]! }
+ public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3115]! }
+ public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3117]! }
+ public var DialogList_NoMessagesText: String { return self._s[3118]! }
+ public var Privacy_ContactsResetConfirmation: String { return self._s[3119]! }
+ public var Privacy_Calls_P2PHelp: String { return self._s[3120]! }
+ public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3122]! }
+ public var Your_cards_expiration_year_is_invalid: String { return self._s[3123]! }
+ public var Common_TakePhotoOrVideo: String { return self._s[3124]! }
+ public var Call_StatusBusy: String { return self._s[3125]! }
+ public var Conversation_PinnedMessage: String { return self._s[3126]! }
+ public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3127]! }
+ public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3128]! }
+ public var Undo_ChatCleared: String { return self._s[3129]! }
+ public var AppleWatch_ReplyPresets: String { return self._s[3130]! }
+ public var Passport_DiscardMessageDescription: String { return self._s[3132]! }
+ public var Login_NetworkError: String { return self._s[3133]! }
public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3115]!, self._r[3115]!, [_0])
+ return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0])
}
public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3116]!, self._r[3116]!, [_0])
+ return formatWithArgumentRanges(self._s[3135]!, self._r[3135]!, [_0])
}
- public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3117]! }
- public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3119]! }
+ public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3136]! }
+ public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3138]! }
public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3121]!, self._r[3121]!, [_0])
+ return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_0])
}
- public var Call_ConnectionErrorMessage: String { return self._s[3122]! }
- public var VoiceOver_Chat_Music: String { return self._s[3123]! }
- public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3124]! }
- public var Compose_GroupTokenListPlaceholder: String { return self._s[3126]! }
- public var ConversationMedia_Title: String { return self._s[3127]! }
- public var EncryptionKey_Title: String { return self._s[3129]! }
- public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3130]! }
- public var Notification_Exceptions_AddException: String { return self._s[3131]! }
- public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3132]! }
- public var Profile_MessageLifetime1m: String { return self._s[3133]! }
+ public var Call_ConnectionErrorMessage: String { return self._s[3141]! }
+ public var VoiceOver_Chat_Music: String { return self._s[3142]! }
+ public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3143]! }
+ public var Compose_GroupTokenListPlaceholder: String { return self._s[3145]! }
+ public var ConversationMedia_Title: String { return self._s[3146]! }
+ public var EncryptionKey_Title: String { return self._s[3148]! }
+ public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3149]! }
+ public var Notification_Exceptions_AddException: String { return self._s[3150]! }
+ public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3151]! }
+ public var Profile_MessageLifetime1m: String { return self._s[3152]! }
public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_1])
+ return formatWithArgumentRanges(self._s[3153]!, self._r[3153]!, [_1])
}
- public var Month_GenMay: String { return self._s[3135]! }
+ public var Month_GenMay: String { return self._s[3154]! }
public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0])
+ return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_0])
}
- public var PeopleNearby_Users: String { return self._s[3137]! }
- public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3138]! }
- public var AutoDownloadSettings_ResetSettings: String { return self._s[3139]! }
- public var Conversation_EmptyPlaceholder: String { return self._s[3141]! }
- public var Passport_Address_AddPassportRegistration: String { return self._s[3142]! }
- public var Notifications_ChannelNotificationsAlert: String { return self._s[3143]! }
- public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3144]! }
- public var Camera_TapAndHoldForVideo: String { return self._s[3145]! }
- public var Channel_JoinChannel: String { return self._s[3147]! }
- public var Appearance_Animations: String { return self._s[3150]! }
+ public var PeopleNearby_Users: String { return self._s[3156]! }
+ public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3157]! }
+ public var AutoDownloadSettings_ResetSettings: String { return self._s[3158]! }
+ public var Conversation_EmptyPlaceholder: String { return self._s[3160]! }
+ public var Passport_Address_AddPassportRegistration: String { return self._s[3161]! }
+ public var Notifications_ChannelNotificationsAlert: String { return self._s[3162]! }
+ public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3163]! }
+ public var Camera_TapAndHoldForVideo: String { return self._s[3164]! }
+ public var Channel_JoinChannel: String { return self._s[3166]! }
+ public var Appearance_Animations: String { return self._s[3169]! }
public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3151]!, self._r[3151]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_1, _2])
}
- public var Stickers_GroupStickers: String { return self._s[3153]! }
- public var Appearance_ShareTheme: String { return self._s[3154]! }
- public var ConvertToSupergroup_HelpTitle: String { return self._s[3156]! }
- public var Passport_Address_Street: String { return self._s[3157]! }
- public var Conversation_AddContact: String { return self._s[3158]! }
- public var Login_PhonePlaceholder: String { return self._s[3159]! }
- public var Channel_Members_InviteLink: String { return self._s[3161]! }
- public var Bot_Stop: String { return self._s[3162]! }
- public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3164]! }
- public var Notification_PassportValueAddress: String { return self._s[3165]! }
- public var Month_ShortJuly: String { return self._s[3166]! }
- public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3167]! }
- public var Channel_AdminLog_BanSendMedia: String { return self._s[3168]! }
- public var Passport_Identity_ReverseSide: String { return self._s[3169]! }
- public var Watch_Stickers_Recents: String { return self._s[3172]! }
- public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3174]! }
- public var Map_SendThisLocation: String { return self._s[3175]! }
+ public var Stickers_GroupStickers: String { return self._s[3172]! }
+ public var Appearance_ShareTheme: String { return self._s[3173]! }
+ public var ConvertToSupergroup_HelpTitle: String { return self._s[3175]! }
+ public var Passport_Address_Street: String { return self._s[3176]! }
+ public var Conversation_AddContact: String { return self._s[3177]! }
+ public var Login_PhonePlaceholder: String { return self._s[3178]! }
+ public var Channel_Members_InviteLink: String { return self._s[3180]! }
+ public var Bot_Stop: String { return self._s[3181]! }
+ public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3183]! }
+ public var Notification_PassportValueAddress: String { return self._s[3184]! }
+ public var Month_ShortJuly: String { return self._s[3185]! }
+ public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3186]! }
+ public var Channel_AdminLog_BanSendMedia: String { return self._s[3187]! }
+ public var Passport_Identity_ReverseSide: String { return self._s[3188]! }
+ public var Watch_Stickers_Recents: String { return self._s[3191]! }
+ public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3193]! }
+ public var Map_SendThisLocation: String { return self._s[3194]! }
public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3176]!, self._r[3176]!, [_0])
- }
- public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_0])
- }
- public var ConvertToSupergroup_Note: String { return self._s[3178]! }
- public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3179]!, self._r[3179]!, [_0])
- }
- public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3180]! }
- public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3181]!, self._r[3181]!, [_0, _1])
- }
- public var Login_CallRequestState3: String { return self._s[3183]! }
- public var Wallpaper_SearchShort: String { return self._s[3184]! }
- public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3186]! }
- public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3187]! }
- public var Channel_BotDoesntSupportGroups: String { return self._s[3188]! }
- public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3189]!, self._r[3189]!, [_1, _2])
- }
- public var Channel_AdminLogFilter_Title: String { return self._s[3190]! }
- public var Notifications_GroupNotificationsExceptions: String { return self._s[3194]! }
- public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3195]!, self._r[3195]!, [_0])
}
- public var Passport_CorrectErrors: String { return self._s[3196]! }
- public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3197]! }
- public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) {
+ public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3196]!, self._r[3196]!, [_0])
+ }
+ public var ConvertToSupergroup_Note: String { return self._s[3197]! }
+ public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3198]!, self._r[3198]!, [_0])
}
- public var Map_SendMyCurrentLocation: String { return self._s[3199]! }
- public var Channel_DiscussionGroup: String { return self._s[3200]! }
+ public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3199]! }
+ public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3200]!, self._r[3200]!, [_0, _1])
+ }
+ public var Login_CallRequestState3: String { return self._s[3202]! }
+ public var Wallpaper_SearchShort: String { return self._s[3203]! }
+ public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3205]! }
+ public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3206]! }
+ public var Channel_BotDoesntSupportGroups: String { return self._s[3207]! }
+ public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_1, _2])
+ }
+ public var Channel_AdminLogFilter_Title: String { return self._s[3209]! }
+ public var Notifications_GroupNotificationsExceptions: String { return self._s[3213]! }
+ public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3214]!, self._r[3214]!, [_0])
+ }
+ public var Passport_CorrectErrors: String { return self._s[3215]! }
+ public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3216]! }
+ public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3217]!, self._r[3217]!, [_0])
+ }
+ public var Map_SendMyCurrentLocation: String { return self._s[3218]! }
+ public var Channel_DiscussionGroup: String { return self._s[3219]! }
public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3201]!, self._r[3201]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3220]!, self._r[3220]!, [_1, _2])
}
- public var SharedMedia_SearchNoResults: String { return self._s[3202]! }
- public var Permissions_NotificationsText_v0: String { return self._s[3203]! }
- public var Appearance_AppIcon: String { return self._s[3204]! }
- public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3205]! }
- public var LoginPassword_FloodError: String { return self._s[3206]! }
- public var Group_Setup_HistoryHiddenHelp: String { return self._s[3208]! }
+ public var SharedMedia_SearchNoResults: String { return self._s[3221]! }
+ public var Permissions_NotificationsText_v0: String { return self._s[3222]! }
+ public var Appearance_AppIcon: String { return self._s[3223]! }
+ public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3224]! }
+ public var LoginPassword_FloodError: String { return self._s[3225]! }
+ public var Group_Setup_HistoryHiddenHelp: String { return self._s[3227]! }
public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3209]!, self._r[3209]!, [_0])
+ return formatWithArgumentRanges(self._s[3228]!, self._r[3228]!, [_0])
}
- public var Passport_Language_bn: String { return self._s[3210]! }
+ public var Passport_Language_bn: String { return self._s[3229]! }
public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3211]!, self._r[3211]!, [_0])
+ return formatWithArgumentRanges(self._s[3230]!, self._r[3230]!, [_0])
}
+ public var ChatList_Context_Pin: String { return self._s[3231]! }
public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_0])
+ return formatWithArgumentRanges(self._s[3232]!, self._r[3232]!, [_0])
}
public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3213]!, self._r[3213]!, [_0])
+ return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_0])
}
- public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3216]! }
- public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3218]! }
- public var Contacts_PermissionsAllow: String { return self._s[3219]! }
- public var ReportPeer_ReasonCopyright: String { return self._s[3220]! }
- public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3221]! }
- public var WallpaperPreview_Pattern: String { return self._s[3222]! }
- public var Paint_Duplicate: String { return self._s[3223]! }
- public var Passport_Address_Country: String { return self._s[3224]! }
- public var Notification_RenamedChannel: String { return self._s[3226]! }
- public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3227]! }
- public var Group_MessagePhotoUpdated: String { return self._s[3228]! }
- public var Channel_BanUser_PermissionSendMedia: String { return self._s[3229]! }
- public var Conversation_ContextMenuBan: String { return self._s[3230]! }
- public var TwoStepAuth_EmailSent: String { return self._s[3231]! }
- public var MessagePoll_NoVotes: String { return self._s[3232]! }
- public var Passport_Language_is: String { return self._s[3233]! }
- public var PeopleNearby_UsersEmpty: String { return self._s[3235]! }
- public var Tour_Text5: String { return self._s[3236]! }
+ public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3236]! }
+ public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3238]! }
+ public var Contacts_PermissionsAllow: String { return self._s[3239]! }
+ public var ReportPeer_ReasonCopyright: String { return self._s[3240]! }
+ public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3241]! }
+ public var WallpaperPreview_Pattern: String { return self._s[3242]! }
+ public var Paint_Duplicate: String { return self._s[3243]! }
+ public var Passport_Address_Country: String { return self._s[3244]! }
+ public var Notification_RenamedChannel: String { return self._s[3246]! }
+ public var ChatList_Context_Unmute: String { return self._s[3247]! }
+ public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3248]! }
+ public var Group_MessagePhotoUpdated: String { return self._s[3249]! }
+ public var Channel_BanUser_PermissionSendMedia: String { return self._s[3250]! }
+ public var Conversation_ContextMenuBan: String { return self._s[3251]! }
+ public var TwoStepAuth_EmailSent: String { return self._s[3252]! }
+ public var MessagePoll_NoVotes: String { return self._s[3253]! }
+ public var Passport_Language_is: String { return self._s[3254]! }
+ public var PeopleNearby_UsersEmpty: String { return self._s[3256]! }
+ public var Tour_Text5: String { return self._s[3257]! }
public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3238]!, self._r[3238]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3259]!, self._r[3259]!, [_1, _2])
}
- public var Undo_SecretChatDeleted: String { return self._s[3239]! }
- public var SocksProxySetup_ShareQRCode: String { return self._s[3240]! }
+ public var Undo_SecretChatDeleted: String { return self._s[3260]! }
+ public var SocksProxySetup_ShareQRCode: String { return self._s[3261]! }
public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3241]!, self._r[3241]!, [_0])
+ return formatWithArgumentRanges(self._s[3262]!, self._r[3262]!, [_0])
}
- public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3242]! }
- public var Paint_Edit: String { return self._s[3244]! }
- public var ScheduledMessages_ReminderNotification: String { return self._s[3246]! }
- public var Undo_DeletedGroup: String { return self._s[3248]! }
- public var LoginPassword_ForgotPassword: String { return self._s[3249]! }
- public var GroupInfo_GroupNamePlaceholder: String { return self._s[3250]! }
+ public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3263]! }
+ public var Paint_Edit: String { return self._s[3265]! }
+ public var ScheduledMessages_ReminderNotification: String { return self._s[3267]! }
+ public var Undo_DeletedGroup: String { return self._s[3269]! }
+ public var LoginPassword_ForgotPassword: String { return self._s[3270]! }
+ public var GroupInfo_GroupNamePlaceholder: String { return self._s[3271]! }
public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3251]!, self._r[3251]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[3272]!, self._r[3272]!, [_0, _1])
}
- public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3252]! }
- public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3253]! }
- public var Passport_Language_uz: String { return self._s[3254]! }
- public var Conversation_PinMessageAlertGroup: String { return self._s[3255]! }
- public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3256]! }
- public var Map_StopLiveLocation: String { return self._s[3258]! }
- public var VoiceOver_MessageContextSend: String { return self._s[3260]! }
- public var PasscodeSettings_Help: String { return self._s[3261]! }
- public var NotificationsSound_Input: String { return self._s[3262]! }
- public var Share_Title: String { return self._s[3265]! }
- public var LogoutOptions_Title: String { return self._s[3266]! }
- public var Login_TermsOfServiceAgree: String { return self._s[3267]! }
- public var Compose_NewEncryptedChatTitle: String { return self._s[3268]! }
- public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3269]! }
- public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3270]! }
- public var EnterPasscode_EnterTitle: String { return self._s[3271]! }
+ public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3273]! }
+ public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3274]! }
+ public var Passport_Language_uz: String { return self._s[3275]! }
+ public var Conversation_PinMessageAlertGroup: String { return self._s[3276]! }
+ public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3277]! }
+ public var Map_StopLiveLocation: String { return self._s[3279]! }
+ public var VoiceOver_MessageContextSend: String { return self._s[3281]! }
+ public var PasscodeSettings_Help: String { return self._s[3282]! }
+ public var NotificationsSound_Input: String { return self._s[3283]! }
+ public var Share_Title: String { return self._s[3286]! }
+ public var LogoutOptions_Title: String { return self._s[3287]! }
+ public var Login_TermsOfServiceAgree: String { return self._s[3288]! }
+ public var Compose_NewEncryptedChatTitle: String { return self._s[3289]! }
+ public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3290]! }
+ public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3291]! }
+ public var EnterPasscode_EnterTitle: String { return self._s[3292]! }
public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3272]!, self._r[3272]!, [_0])
+ return formatWithArgumentRanges(self._s[3293]!, self._r[3293]!, [_0])
}
- public var Settings_CopyPhoneNumber: String { return self._s[3273]! }
- public var Conversation_AddToContacts: String { return self._s[3274]! }
+ public var Settings_CopyPhoneNumber: String { return self._s[3294]! }
+ public var Conversation_AddToContacts: String { return self._s[3295]! }
public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3275]!, self._r[3275]!, [_0])
+ return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0])
}
- public var NotificationsSound_Keys: String { return self._s[3276]! }
+ public var NotificationsSound_Keys: String { return self._s[3297]! }
public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3277]!, self._r[3277]!, [_0])
+ return formatWithArgumentRanges(self._s[3298]!, self._r[3298]!, [_0])
}
- public var Notification_MessageLifetime1w: String { return self._s[3278]! }
- public var Message_Video: String { return self._s[3279]! }
- public var AutoDownloadSettings_CellularTitle: String { return self._s[3280]! }
+ public var Notification_MessageLifetime1w: String { return self._s[3299]! }
+ public var Message_Video: String { return self._s[3300]! }
+ public var AutoDownloadSettings_CellularTitle: String { return self._s[3301]! }
public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3281]!, self._r[3281]!, [_1])
+ return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_1])
}
public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3284]!, self._r[3284]!, [_0])
+ return formatWithArgumentRanges(self._s[3305]!, self._r[3305]!, [_0])
}
public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3285]!, self._r[3285]!, [_0])
+ return formatWithArgumentRanges(self._s[3306]!, self._r[3306]!, [_0])
}
- public var Passport_Language_mk: String { return self._s[3286]! }
- public var CreatePoll_CancelConfirmation: String { return self._s[3287]! }
- public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3289]! }
- public var PrivacyPolicy_Decline: String { return self._s[3290]! }
- public var Passport_Identity_DoesNotExpire: String { return self._s[3291]! }
- public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3292]! }
- public var Permissions_SiriAllow_v0: String { return self._s[3294]! }
- public var Appearance_ThemeCarouselNight: String { return self._s[3295]! }
+ public var Passport_Language_mk: String { return self._s[3307]! }
+ public var CreatePoll_CancelConfirmation: String { return self._s[3308]! }
+ public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3310]! }
+ public var PrivacyPolicy_Decline: String { return self._s[3311]! }
+ public var Passport_Identity_DoesNotExpire: String { return self._s[3312]! }
+ public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3313]! }
+ public var Permissions_SiriAllow_v0: String { return self._s[3315]! }
+ public var Appearance_ThemeCarouselNight: String { return self._s[3316]! }
public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_1, "\(_2)"])
+ return formatWithArgumentRanges(self._s[3317]!, self._r[3317]!, [_1, "\(_2)"])
}
public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3297]!, self._r[3297]!, [_0])
+ return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_0])
}
- public var Paint_Regular: String { return self._s[3298]! }
- public var ChatSettings_AutoDownloadReset: String { return self._s[3299]! }
- public var SocksProxySetup_ShareLink: String { return self._s[3300]! }
- public var BlockedUsers_SelectUserTitle: String { return self._s[3301]! }
- public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3303]! }
- public var GroupInfo_InviteByLink: String { return self._s[3304]! }
- public var MessageTimer_Custom: String { return self._s[3305]! }
- public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3306]! }
- public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3308]! }
- public var Conversation_SendMessage_SetReminder: String { return self._s[3309]! }
- public var VoiceOver_Chat_Selected: String { return self._s[3310]! }
- public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3311]! }
- public var Channel_Username_InvalidTaken: String { return self._s[3312]! }
- public var Conversation_ClousStorageInfo_Description3: String { return self._s[3313]! }
- public var Settings_ChatBackground: String { return self._s[3314]! }
- public var Channel_Subscribers_Title: String { return self._s[3315]! }
- public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3316]! }
- public var Watch_ConnectionDescription: String { return self._s[3317]! }
- public var ChatList_ArchivedChatsTitle: String { return self._s[3321]! }
- public var Wallpaper_ResetWallpapers: String { return self._s[3322]! }
- public var EditProfile_Title: String { return self._s[3323]! }
- public var NotificationsSound_Bamboo: String { return self._s[3325]! }
- public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3327]! }
- public var Login_SmsRequestState2: String { return self._s[3328]! }
- public var Passport_Language_ar: String { return self._s[3329]! }
+ public var Paint_Regular: String { return self._s[3319]! }
+ public var ChatSettings_AutoDownloadReset: String { return self._s[3320]! }
+ public var SocksProxySetup_ShareLink: String { return self._s[3321]! }
+ public var BlockedUsers_SelectUserTitle: String { return self._s[3322]! }
+ public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3324]! }
+ public var GroupInfo_InviteByLink: String { return self._s[3325]! }
+ public var MessageTimer_Custom: String { return self._s[3326]! }
+ public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3327]! }
+ public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3329]! }
+ public var Conversation_SendMessage_SetReminder: String { return self._s[3330]! }
+ public var VoiceOver_Chat_Selected: String { return self._s[3331]! }
+ public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3332]! }
+ public var Channel_Username_InvalidTaken: String { return self._s[3333]! }
+ public var Conversation_ClousStorageInfo_Description3: String { return self._s[3334]! }
+ public var Settings_ChatBackground: String { return self._s[3335]! }
+ public var Channel_Subscribers_Title: String { return self._s[3336]! }
+ public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3337]! }
+ public var Watch_ConnectionDescription: String { return self._s[3338]! }
+ public var ChatList_ArchivedChatsTitle: String { return self._s[3342]! }
+ public var Wallpaper_ResetWallpapers: String { return self._s[3343]! }
+ public var EditProfile_Title: String { return self._s[3344]! }
+ public var NotificationsSound_Bamboo: String { return self._s[3346]! }
+ public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3348]! }
+ public var Login_SmsRequestState2: String { return self._s[3349]! }
+ public var Passport_Language_ar: String { return self._s[3350]! }
public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3330]!, self._r[3330]!, [_0])
+ return formatWithArgumentRanges(self._s[3351]!, self._r[3351]!, [_0])
}
- public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3331]! }
- public var Conversation_MessageDialogEdit: String { return self._s[3332]! }
- public var VoiceOver_Media_PlaybackPause: String { return self._s[3333]! }
+ public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3352]! }
+ public var Conversation_MessageDialogEdit: String { return self._s[3353]! }
+ public var VoiceOver_Media_PlaybackPause: String { return self._s[3354]! }
public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3334]!, self._r[3334]!, [_1])
+ return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_1])
}
- public var Common_Close: String { return self._s[3335]! }
- public var GroupInfo_PublicLink: String { return self._s[3336]! }
- public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3337]! }
- public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3338]! }
+ public var Common_Close: String { return self._s[3356]! }
+ public var GroupInfo_PublicLink: String { return self._s[3357]! }
+ public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3358]! }
+ public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3359]! }
public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_0])
+ return formatWithArgumentRanges(self._s[3363]!, self._r[3363]!, [_0])
}
- public var UserInfo_About_Placeholder: String { return self._s[3343]! }
+ public var UserInfo_About_Placeholder: String { return self._s[3364]! }
public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3344]!, self._r[3344]!, [_0])
+ return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_0])
}
- public var GroupInfo_Permissions_SectionTitle: String { return self._s[3345]! }
- public var Channel_Info_Banned: String { return self._s[3347]! }
+ public var GroupInfo_Permissions_SectionTitle: String { return self._s[3366]! }
+ public var Channel_Info_Banned: String { return self._s[3368]! }
public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3348]!, self._r[3348]!, [_0])
+ return formatWithArgumentRanges(self._s[3369]!, self._r[3369]!, [_0])
}
- public var Appearance_Other: String { return self._s[3349]! }
- public var Passport_Language_my: String { return self._s[3350]! }
- public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3351]! }
+ public var Appearance_Other: String { return self._s[3370]! }
+ public var Passport_Language_my: String { return self._s[3371]! }
+ public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3372]! }
public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3352]!, self._r[3352]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3373]!, self._r[3373]!, [_1, _2, _3])
}
- public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3353]! }
- public var Preview_CopyAddress: String { return self._s[3354]! }
+ public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3374]! }
+ public var Preview_CopyAddress: String { return self._s[3375]! }
public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_0])
+ return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_0])
}
- public var KeyCommand_JumpToPreviousChat: String { return self._s[3356]! }
- public var UserInfo_BotSettings: String { return self._s[3357]! }
- public var LiveLocation_MenuStopAll: String { return self._s[3359]! }
- public var Passport_PasswordCreate: String { return self._s[3360]! }
- public var StickerSettings_MaskContextInfo: String { return self._s[3361]! }
- public var Message_PinnedLocationMessage: String { return self._s[3362]! }
- public var Map_Satellite: String { return self._s[3363]! }
- public var Watch_Message_Unsupported: String { return self._s[3364]! }
- public var Username_TooManyPublicUsernamesError: String { return self._s[3365]! }
- public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3366]! }
+ public var KeyCommand_JumpToPreviousChat: String { return self._s[3377]! }
+ public var UserInfo_BotSettings: String { return self._s[3378]! }
+ public var LiveLocation_MenuStopAll: String { return self._s[3380]! }
+ public var Passport_PasswordCreate: String { return self._s[3381]! }
+ public var StickerSettings_MaskContextInfo: String { return self._s[3382]! }
+ public var Message_PinnedLocationMessage: String { return self._s[3383]! }
+ public var Map_Satellite: String { return self._s[3384]! }
+ public var Watch_Message_Unsupported: String { return self._s[3385]! }
+ public var Username_TooManyPublicUsernamesError: String { return self._s[3386]! }
+ public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3387]! }
public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3367]!, self._r[3367]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_0, _1])
}
public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3368]!, self._r[3368]!, [_0])
- }
- public var Notifications_ChannelNotificationsHelp: String { return self._s[3369]! }
- public var Privacy_Calls_P2PContacts: String { return self._s[3370]! }
- public var NotificationsSound_None: String { return self._s[3371]! }
- public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3373]! }
- public var AccessDenied_VoiceMicrophone: String { return self._s[3374]! }
- public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3375]!, self._r[3375]!, [_1])
- }
- public var Cache_Indexing: String { return self._s[3376]! }
- public var DialogList_RecentTitlePeople: String { return self._s[3378]! }
- public var DialogList_EncryptionRejected: String { return self._s[3379]! }
- public var GroupInfo_Administrators: String { return self._s[3380]! }
- public var Passport_ScanPassportHelp: String { return self._s[3381]! }
- public var Application_Name: String { return self._s[3382]! }
- public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3383]! }
- public var Appearance_ThemeCarouselDay: String { return self._s[3385]! }
- public var Passport_Identity_TranslationHelp: String { return self._s[3386]! }
- public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3387]!, self._r[3387]!, [_0])
- }
- public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_0])
- }
- public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3389]!, self._r[3389]!, [_0])
}
- public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3390]! }
- public var Privacy_ChatsTitle: String { return self._s[3391]! }
- public var DialogList_ClearHistoryConfirmation: String { return self._s[3392]! }
- public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3393]! }
- public var Watch_Suggestion_HoldOn: String { return self._s[3394]! }
- public var Group_EditAdmin_TransferOwnership: String { return self._s[3395]! }
- public var Group_LinkedChannel: String { return self._s[3396]! }
- public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3397]! }
- public var SocksProxySetup_RequiredCredentials: String { return self._s[3398]! }
- public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3399]! }
- public var TwoStepAuth_EmailSkipAlert: String { return self._s[3400]! }
- public var ScheduledMessages_RemindersTitle: String { return self._s[3402]! }
- public var Channel_Setup_TypePublic: String { return self._s[3404]! }
+ public var Notifications_ChannelNotificationsHelp: String { return self._s[3390]! }
+ public var Privacy_Calls_P2PContacts: String { return self._s[3391]! }
+ public var NotificationsSound_None: String { return self._s[3392]! }
+ public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3394]! }
+ public var AccessDenied_VoiceMicrophone: String { return self._s[3395]! }
+ public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3396]!, self._r[3396]!, [_1])
+ }
+ public var Cache_Indexing: String { return self._s[3397]! }
+ public var DialogList_RecentTitlePeople: String { return self._s[3399]! }
+ public var DialogList_EncryptionRejected: String { return self._s[3400]! }
+ public var GroupInfo_Administrators: String { return self._s[3401]! }
+ public var Passport_ScanPassportHelp: String { return self._s[3402]! }
+ public var Application_Name: String { return self._s[3403]! }
+ public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3404]! }
+ public var Appearance_ThemeCarouselDay: String { return self._s[3406]! }
+ public var Passport_Identity_TranslationHelp: String { return self._s[3407]! }
+ public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3408]!, self._r[3408]!, [_0])
+ }
+ public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3409]!, self._r[3409]!, [_0])
+ }
+ public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3410]!, self._r[3410]!, [_0])
+ }
+ public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3411]! }
+ public var Privacy_ChatsTitle: String { return self._s[3412]! }
+ public var DialogList_ClearHistoryConfirmation: String { return self._s[3413]! }
+ public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3414]! }
+ public var Watch_Suggestion_HoldOn: String { return self._s[3415]! }
+ public var Group_EditAdmin_TransferOwnership: String { return self._s[3416]! }
+ public var Group_LinkedChannel: String { return self._s[3417]! }
+ public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3418]! }
+ public var SocksProxySetup_RequiredCredentials: String { return self._s[3419]! }
+ public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3420]! }
+ public var TwoStepAuth_EmailSkipAlert: String { return self._s[3421]! }
+ public var ScheduledMessages_RemindersTitle: String { return self._s[3423]! }
+ public var Channel_Setup_TypePublic: String { return self._s[3425]! }
public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3405]!, self._r[3405]!, [_0])
+ return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_0])
}
- public var Channel_TypeSetup_Title: String { return self._s[3407]! }
- public var Map_OpenInMaps: String { return self._s[3409]! }
+ public var Channel_TypeSetup_Title: String { return self._s[3428]! }
+ public var Map_OpenInMaps: String { return self._s[3430]! }
public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3410]!, self._r[3410]!, [_1])
+ return formatWithArgumentRanges(self._s[3431]!, self._r[3431]!, [_1])
}
- public var NotificationsSound_Tremolo: String { return self._s[3412]! }
+ public var NotificationsSound_Tremolo: String { return self._s[3433]! }
public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3413]!, self._r[3413]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_1, _2, _3])
}
- public var ConversationProfile_UnknownAddMemberError: String { return self._s[3414]! }
- public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3415]! }
- public var Passport_PasswordHelp: String { return self._s[3416]! }
- public var Login_CodeExpiredError: String { return self._s[3417]! }
- public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3418]! }
- public var Conversation_TitleUnmute: String { return self._s[3419]! }
- public var Passport_Identity_ScansHelp: String { return self._s[3420]! }
- public var Passport_Language_lo: String { return self._s[3421]! }
- public var Camera_FlashAuto: String { return self._s[3422]! }
- public var Conversation_OpenBotLinkOpen: String { return self._s[3423]! }
- public var Common_Cancel: String { return self._s[3424]! }
- public var DialogList_SavedMessagesTooltip: String { return self._s[3425]! }
- public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3426]! }
- public var Appearance_TintAllColors: String { return self._s[3427]! }
+ public var ConversationProfile_UnknownAddMemberError: String { return self._s[3435]! }
+ public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3436]! }
+ public var Passport_PasswordHelp: String { return self._s[3437]! }
+ public var Login_CodeExpiredError: String { return self._s[3438]! }
+ public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3439]! }
+ public var Conversation_TitleUnmute: String { return self._s[3440]! }
+ public var Passport_Identity_ScansHelp: String { return self._s[3441]! }
+ public var Passport_Language_lo: String { return self._s[3442]! }
+ public var Camera_FlashAuto: String { return self._s[3443]! }
+ public var Conversation_OpenBotLinkOpen: String { return self._s[3444]! }
+ public var Common_Cancel: String { return self._s[3445]! }
+ public var DialogList_SavedMessagesTooltip: String { return self._s[3446]! }
+ public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3447]! }
+ public var Appearance_TintAllColors: String { return self._s[3448]! }
public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_1])
+ return formatWithArgumentRanges(self._s[3449]!, self._r[3449]!, [_1])
}
- public var Conversation_ReportSpamConfirmation: String { return self._s[3429]! }
- public var ChatSettings_Title: String { return self._s[3431]! }
- public var Passport_PasswordReset: String { return self._s[3432]! }
- public var SocksProxySetup_TypeNone: String { return self._s[3433]! }
- public var EditTheme_Title: String { return self._s[3435]! }
- public var PhoneNumberHelp_Help: String { return self._s[3436]! }
- public var Checkout_EnterPassword: String { return self._s[3437]! }
- public var Share_AuthTitle: String { return self._s[3439]! }
- public var Activity_UploadingDocument: String { return self._s[3440]! }
- public var State_Connecting: String { return self._s[3441]! }
- public var Profile_MessageLifetime1w: String { return self._s[3442]! }
- public var Conversation_ContextMenuReport: String { return self._s[3443]! }
- public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3444]! }
- public var AutoNightTheme_ScheduledTo: String { return self._s[3445]! }
+ public var Conversation_ReportSpamConfirmation: String { return self._s[3450]! }
+ public var ChatSettings_Title: String { return self._s[3452]! }
+ public var Passport_PasswordReset: String { return self._s[3453]! }
+ public var SocksProxySetup_TypeNone: String { return self._s[3454]! }
+ public var EditTheme_Title: String { return self._s[3456]! }
+ public var PhoneNumberHelp_Help: String { return self._s[3457]! }
+ public var Checkout_EnterPassword: String { return self._s[3458]! }
+ public var Share_AuthTitle: String { return self._s[3460]! }
+ public var Activity_UploadingDocument: String { return self._s[3461]! }
+ public var State_Connecting: String { return self._s[3462]! }
+ public var Profile_MessageLifetime1w: String { return self._s[3463]! }
+ public var Conversation_ContextMenuReport: String { return self._s[3464]! }
+ public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3465]! }
+ public var AutoNightTheme_ScheduledTo: String { return self._s[3466]! }
public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3446]!, self._r[3446]!, [_0])
- }
- public var AuthSessions_Terminate: String { return self._s[3447]! }
- public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3448]! }
- public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3449]! }
- public var PhotoEditor_Set: String { return self._s[3450]! }
- public var EmptyGroupInfo_Title: String { return self._s[3451]! }
- public var Login_PadPhoneHelp: String { return self._s[3452]! }
- public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3454]! }
- public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3456]! }
- public var NotificationsSound_Complete: String { return self._s[3457]! }
- public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3458]! }
- public var Group_Info_AdminLog: String { return self._s[3459]! }
- public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3460]! }
- public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3461]! }
- public var Conversation_Admin: String { return self._s[3463]! }
- public var Conversation_GifTooltip: String { return self._s[3464]! }
- public var Passport_NotLoggedInMessage: String { return self._s[3465]! }
- public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3467]!, self._r[3467]!, [_0])
}
- public var Profile_MessageLifetimeForever: String { return self._s[3468]! }
- public var SharedMedia_EmptyTitle: String { return self._s[3470]! }
- public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3472]! }
- public var Username_Help: String { return self._s[3473]! }
- public var DialogList_LanguageTooltip: String { return self._s[3475]! }
- public var Map_LoadError: String { return self._s[3476]! }
- public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3477]! }
- public var Channel_AdminLog_AddMembers: String { return self._s[3478]! }
- public var ArchivedChats_IntroTitle2: String { return self._s[3479]! }
- public var Notification_Exceptions_NewException: String { return self._s[3480]! }
- public var TwoStepAuth_EmailTitle: String { return self._s[3481]! }
- public var WatchRemote_AlertText: String { return self._s[3482]! }
- public var ChatSettings_ConnectionType_Title: String { return self._s[3485]! }
- public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3486]!, self._r[3486]!, [_0])
+ public var AuthSessions_Terminate: String { return self._s[3468]! }
+ public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3469]! }
+ public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3470]! }
+ public var PhotoEditor_Set: String { return self._s[3471]! }
+ public var EmptyGroupInfo_Title: String { return self._s[3472]! }
+ public var Login_PadPhoneHelp: String { return self._s[3473]! }
+ public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3475]! }
+ public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3477]! }
+ public var NotificationsSound_Complete: String { return self._s[3478]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3479]! }
+ public var Group_Info_AdminLog: String { return self._s[3480]! }
+ public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3481]! }
+ public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3482]! }
+ public var Conversation_Admin: String { return self._s[3484]! }
+ public var Conversation_GifTooltip: String { return self._s[3485]! }
+ public var Passport_NotLoggedInMessage: String { return self._s[3486]! }
+ public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3488]!, self._r[3488]!, [_0])
}
- public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3487]! }
- public var Passport_Address_CountryPlaceholder: String { return self._s[3488]! }
+ public var Profile_MessageLifetimeForever: String { return self._s[3489]! }
+ public var SharedMedia_EmptyTitle: String { return self._s[3491]! }
+ public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3493]! }
+ public var Username_Help: String { return self._s[3494]! }
+ public var DialogList_LanguageTooltip: String { return self._s[3496]! }
+ public var Map_LoadError: String { return self._s[3497]! }
+ public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3498]! }
+ public var Channel_AdminLog_AddMembers: String { return self._s[3499]! }
+ public var ArchivedChats_IntroTitle2: String { return self._s[3500]! }
+ public var Notification_Exceptions_NewException: String { return self._s[3501]! }
+ public var TwoStepAuth_EmailTitle: String { return self._s[3502]! }
+ public var WatchRemote_AlertText: String { return self._s[3503]! }
+ public var ChatSettings_ConnectionType_Title: String { return self._s[3506]! }
+ public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3507]!, self._r[3507]!, [_0])
+ }
+ public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3508]! }
+ public var Passport_Address_CountryPlaceholder: String { return self._s[3509]! }
public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3489]!, self._r[3489]!, [_0])
+ return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_0])
}
public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3490]!, self._r[3490]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_1, _2, _3])
}
- public var Group_AdminLog_EmptyText: String { return self._s[3491]! }
- public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3492]! }
- public var Conversation_PrivateChannelTooltip: String { return self._s[3494]! }
- public var ChatList_UndoArchiveText1: String { return self._s[3495]! }
- public var AccessDenied_VideoMicrophone: String { return self._s[3496]! }
- public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3497]! }
- public var Cache_ClearNone: String { return self._s[3498]! }
- public var SocksProxySetup_FailedToConnect: String { return self._s[3499]! }
- public var Permissions_NotificationsTitle_v0: String { return self._s[3500]! }
+ public var Group_AdminLog_EmptyText: String { return self._s[3512]! }
+ public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3513]! }
+ public var Conversation_PrivateChannelTooltip: String { return self._s[3515]! }
+ public var ChatList_UndoArchiveText1: String { return self._s[3516]! }
+ public var AccessDenied_VideoMicrophone: String { return self._s[3517]! }
+ public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3518]! }
+ public var Cache_ClearNone: String { return self._s[3519]! }
+ public var SocksProxySetup_FailedToConnect: String { return self._s[3520]! }
+ public var Permissions_NotificationsTitle_v0: String { return self._s[3521]! }
public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3501]!, self._r[3501]!, [_0])
+ return formatWithArgumentRanges(self._s[3522]!, self._r[3522]!, [_0])
}
- public var Passport_Identity_Country: String { return self._s[3502]! }
+ public var Passport_Identity_Country: String { return self._s[3523]! }
public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3503]!, self._r[3503]!, [_0])
+ return formatWithArgumentRanges(self._s[3524]!, self._r[3524]!, [_0])
}
public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3504]!, self._r[3504]!, [_0])
+ return formatWithArgumentRanges(self._s[3525]!, self._r[3525]!, [_0])
}
- public var Exceptions_AddToExceptions: String { return self._s[3505]! }
- public var AccessDenied_Settings: String { return self._s[3506]! }
- public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3507]! }
- public var Month_ShortMay: String { return self._s[3508]! }
- public var Compose_NewGroup: String { return self._s[3510]! }
- public var Group_Setup_TypePrivate: String { return self._s[3512]! }
- public var Login_PadPhoneHelpTitle: String { return self._s[3514]! }
- public var Appearance_ThemeDayClassic: String { return self._s[3515]! }
- public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3516]! }
- public var AutoDownloadSettings_OffForAll: String { return self._s[3517]! }
- public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3518]! }
- public var Conversation_typing: String { return self._s[3520]! }
- public var Undo_ScheduledMessagesCleared: String { return self._s[3521]! }
- public var Paint_Masks: String { return self._s[3522]! }
- public var Contacts_DeselectAll: String { return self._s[3523]! }
- public var Username_InvalidTaken: String { return self._s[3524]! }
- public var Call_StatusNoAnswer: String { return self._s[3525]! }
- public var TwoStepAuth_EmailAddSuccess: String { return self._s[3526]! }
- public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3527]! }
- public var Passport_Identity_Selfie: String { return self._s[3528]! }
- public var Login_InfoLastNamePlaceholder: String { return self._s[3529]! }
- public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3530]! }
- public var Conversation_ClearSecretHistory: String { return self._s[3531]! }
- public var PeopleNearby_Description: String { return self._s[3533]! }
- public var NetworkUsageSettings_Title: String { return self._s[3534]! }
- public var Your_cards_security_code_is_invalid: String { return self._s[3536]! }
+ public var Exceptions_AddToExceptions: String { return self._s[3526]! }
+ public var AccessDenied_Settings: String { return self._s[3527]! }
+ public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3528]! }
+ public var Month_ShortMay: String { return self._s[3529]! }
+ public var Compose_NewGroup: String { return self._s[3531]! }
+ public var Group_Setup_TypePrivate: String { return self._s[3533]! }
+ public var Login_PadPhoneHelpTitle: String { return self._s[3535]! }
+ public var Appearance_ThemeDayClassic: String { return self._s[3536]! }
+ public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3537]! }
+ public var AutoDownloadSettings_OffForAll: String { return self._s[3538]! }
+ public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3539]! }
+ public var Conversation_typing: String { return self._s[3541]! }
+ public var Undo_ScheduledMessagesCleared: String { return self._s[3542]! }
+ public var Paint_Masks: String { return self._s[3543]! }
+ public var Contacts_DeselectAll: String { return self._s[3544]! }
+ public var Username_InvalidTaken: String { return self._s[3545]! }
+ public var Call_StatusNoAnswer: String { return self._s[3546]! }
+ public var TwoStepAuth_EmailAddSuccess: String { return self._s[3547]! }
+ public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3548]! }
+ public var Passport_Identity_Selfie: String { return self._s[3549]! }
+ public var Login_InfoLastNamePlaceholder: String { return self._s[3550]! }
+ public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3551]! }
+ public var Conversation_ClearSecretHistory: String { return self._s[3552]! }
+ public var PeopleNearby_Description: String { return self._s[3554]! }
+ public var NetworkUsageSettings_Title: String { return self._s[3555]! }
+ public var Your_cards_security_code_is_invalid: String { return self._s[3557]! }
public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3538]!, self._r[3538]!, [_0])
+ return formatWithArgumentRanges(self._s[3559]!, self._r[3559]!, [_0])
}
public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3539]!, self._r[3539]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_1, _2])
}
- public var SaveIncomingPhotosSettings_From: String { return self._s[3541]! }
- public var VoiceOver_Navigation_Search: String { return self._s[3542]! }
- public var Map_LiveLocationTitle: String { return self._s[3543]! }
- public var Login_InfoAvatarAdd: String { return self._s[3544]! }
- public var Passport_Identity_FilesView: String { return self._s[3545]! }
- public var UserInfo_GenericPhoneLabel: String { return self._s[3546]! }
- public var Privacy_Calls_NeverAllow: String { return self._s[3547]! }
- public var VoiceOver_Chat_File: String { return self._s[3548]! }
+ public var SaveIncomingPhotosSettings_From: String { return self._s[3562]! }
+ public var VoiceOver_Navigation_Search: String { return self._s[3563]! }
+ public var Map_LiveLocationTitle: String { return self._s[3564]! }
+ public var Login_InfoAvatarAdd: String { return self._s[3565]! }
+ public var Passport_Identity_FilesView: String { return self._s[3566]! }
+ public var UserInfo_GenericPhoneLabel: String { return self._s[3567]! }
+ public var Privacy_Calls_NeverAllow: String { return self._s[3568]! }
+ public var VoiceOver_Chat_File: String { return self._s[3569]! }
public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3549]!, self._r[3549]!, [_0])
+ return formatWithArgumentRanges(self._s[3570]!, self._r[3570]!, [_0])
}
- public var ContactInfo_PhoneNumberHidden: String { return self._s[3550]! }
- public var TwoStepAuth_ConfirmationText: String { return self._s[3551]! }
- public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3552]! }
+ public var ContactInfo_PhoneNumberHidden: String { return self._s[3571]! }
+ public var TwoStepAuth_ConfirmationText: String { return self._s[3572]! }
+ public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3573]! }
public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3553]!, self._r[3553]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3574]!, self._r[3574]!, [_1, _2, _3])
}
- public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3554]! }
- public var Tour_Title2: String { return self._s[3555]! }
- public var Conversation_FileOpenIn: String { return self._s[3556]! }
- public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3557]! }
- public var Wallpaper_Set: String { return self._s[3558]! }
- public var Passport_Identity_Translations: String { return self._s[3560]! }
+ public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3575]! }
+ public var Tour_Title2: String { return self._s[3576]! }
+ public var Conversation_FileOpenIn: String { return self._s[3577]! }
+ public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3578]! }
+ public var Wallpaper_Set: String { return self._s[3579]! }
+ public var Passport_Identity_Translations: String { return self._s[3581]! }
public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_0])
- }
- public var Channel_LeaveChannel: String { return self._s[3562]! }
- public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3563]!, self._r[3563]!, [_1])
- }
- public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3565]! }
- public var PhotoEditor_HighlightsTint: String { return self._s[3566]! }
- public var Passport_Email_Delete: String { return self._s[3567]! }
- public var Conversation_Mute: String { return self._s[3569]! }
- public var Channel_AddBotAsAdmin: String { return self._s[3570]! }
- public var Channel_AdminLog_CanSendMessages: String { return self._s[3572]! }
- public var Channel_Management_LabelOwner: String { return self._s[3574]! }
- public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_1, _2])
- }
- public var Calls_CallTabDescription: String { return self._s[3576]! }
- public var Passport_Identity_NativeNameHelp: String { return self._s[3577]! }
- public var Common_No: String { return self._s[3578]! }
- public var Weekday_Sunday: String { return self._s[3579]! }
- public var Notification_Reply: String { return self._s[3580]! }
- public var Conversation_ViewMessage: String { return self._s[3581]! }
- public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3582]!, self._r[3582]!, [_0])
}
+ public var Channel_LeaveChannel: String { return self._s[3583]! }
+ public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3584]!, self._r[3584]!, [_1])
+ }
+ public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3586]! }
+ public var PhotoEditor_HighlightsTint: String { return self._s[3587]! }
+ public var Passport_Email_Delete: String { return self._s[3588]! }
+ public var Conversation_Mute: String { return self._s[3590]! }
+ public var Channel_AddBotAsAdmin: String { return self._s[3591]! }
+ public var Channel_AdminLog_CanSendMessages: String { return self._s[3593]! }
+ public var Channel_Management_LabelOwner: String { return self._s[3595]! }
+ public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3596]!, self._r[3596]!, [_1, _2])
+ }
+ public var Calls_CallTabDescription: String { return self._s[3597]! }
+ public var Passport_Identity_NativeNameHelp: String { return self._s[3598]! }
+ public var Common_No: String { return self._s[3599]! }
+ public var Weekday_Sunday: String { return self._s[3600]! }
+ public var Notification_Reply: String { return self._s[3601]! }
+ public var Conversation_ViewMessage: String { return self._s[3602]! }
+ public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3603]!, self._r[3603]!, [_0])
+ }
public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3583]!, self._r[3583]!, [_0])
+ return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0])
}
- public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3584]! }
- public var Message_PinnedDocumentMessage: String { return self._s[3585]! }
- public var DialogList_TabTitle: String { return self._s[3587]! }
- public var ChatSettings_AutoPlayTitle: String { return self._s[3588]! }
- public var Passport_FieldEmail: String { return self._s[3589]! }
- public var Conversation_UnpinMessageAlert: String { return self._s[3590]! }
- public var Passport_Address_TypeBankStatement: String { return self._s[3591]! }
- public var Passport_Identity_ExpiryDate: String { return self._s[3592]! }
- public var Privacy_Calls_P2P: String { return self._s[3593]! }
+ public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3605]! }
+ public var Message_PinnedDocumentMessage: String { return self._s[3606]! }
+ public var DialogList_TabTitle: String { return self._s[3608]! }
+ public var ChatSettings_AutoPlayTitle: String { return self._s[3609]! }
+ public var Passport_FieldEmail: String { return self._s[3610]! }
+ public var Conversation_UnpinMessageAlert: String { return self._s[3611]! }
+ public var Passport_Address_TypeBankStatement: String { return self._s[3612]! }
+ public var Passport_Identity_ExpiryDate: String { return self._s[3613]! }
+ public var Privacy_Calls_P2P: String { return self._s[3614]! }
public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3595]!, self._r[3595]!, [_0])
+ return formatWithArgumentRanges(self._s[3616]!, self._r[3616]!, [_0])
}
- public var SocksProxySetup_UseForCallsHelp: String { return self._s[3596]! }
+ public var SocksProxySetup_UseForCallsHelp: String { return self._s[3617]! }
public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3597]!, self._r[3597]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_1, _2])
}
- public var Stickers_ClearRecent: String { return self._s[3598]! }
- public var EnterPasscode_ChangeTitle: String { return self._s[3599]! }
- public var Passport_InfoText: String { return self._s[3600]! }
- public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3601]! }
+ public var Stickers_ClearRecent: String { return self._s[3619]! }
+ public var EnterPasscode_ChangeTitle: String { return self._s[3620]! }
+ public var Passport_InfoText: String { return self._s[3621]! }
+ public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3622]! }
public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3602]!, self._r[3602]!, [_0])
+ return formatWithArgumentRanges(self._s[3623]!, self._r[3623]!, [_0])
}
public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3603]!, self._r[3603]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3624]!, self._r[3624]!, [_1, _2, _3])
}
- public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3604]! }
- public var ScheduledMessages_PollUnavailable: String { return self._s[3605]! }
- public var VoiceOver_Navigation_Compose: String { return self._s[3606]! }
- public var Passport_Identity_EditDriversLicense: String { return self._s[3607]! }
- public var Conversation_TapAndHoldToRecord: String { return self._s[3609]! }
- public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3610]! }
+ public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3625]! }
+ public var ScheduledMessages_PollUnavailable: String { return self._s[3626]! }
+ public var VoiceOver_Navigation_Compose: String { return self._s[3627]! }
+ public var Passport_Identity_EditDriversLicense: String { return self._s[3628]! }
+ public var Conversation_TapAndHoldToRecord: String { return self._s[3630]! }
+ public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3631]! }
public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_1, _2])
}
- public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3613]! }
+ public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3634]! }
public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_0])
+ return formatWithArgumentRanges(self._s[3636]!, self._r[3636]!, [_0])
}
- public var DialogList_Unread: String { return self._s[3616]! }
+ public var DialogList_Unread: String { return self._s[3637]! }
public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3617]!, self._r[3617]!, [_1, _2])
- }
- public var User_DeletedAccount: String { return self._s[3618]! }
- public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3619]! }
- public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3620]!, self._r[3620]!, [_0])
- }
- public var UserInfo_NotificationsDefault: String { return self._s[3621]! }
- public var SharedMedia_CategoryMedia: String { return self._s[3622]! }
- public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3623]! }
- public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3624]! }
- public var Watch_ChatList_Compose: String { return self._s[3625]! }
- public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3626]! }
- public var AutoDownloadSettings_Delimeter: String { return self._s[3627]! }
- public var Watch_Microphone_Access: String { return self._s[3628]! }
- public var Group_Setup_HistoryHeader: String { return self._s[3629]! }
- public var Map_SetThisLocation: String { return self._s[3630]! }
- public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3631]! }
- public var Activity_UploadingPhoto: String { return self._s[3632]! }
- public var Conversation_Edit: String { return self._s[3634]! }
- public var Group_ErrorSendRestrictedMedia: String { return self._s[3635]! }
- public var Login_TermsOfServiceDecline: String { return self._s[3636]! }
- public var Message_PinnedContactMessage: String { return self._s[3637]! }
- public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3638]!, self._r[3638]!, [_1, _2])
}
+ public var User_DeletedAccount: String { return self._s[3639]! }
+ public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3640]! }
+ public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3641]!, self._r[3641]!, [_0])
+ }
+ public var UserInfo_NotificationsDefault: String { return self._s[3642]! }
+ public var SharedMedia_CategoryMedia: String { return self._s[3643]! }
+ public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3644]! }
+ public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3645]! }
+ public var Watch_ChatList_Compose: String { return self._s[3646]! }
+ public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3647]! }
+ public var AutoDownloadSettings_Delimeter: String { return self._s[3648]! }
+ public var Watch_Microphone_Access: String { return self._s[3649]! }
+ public var Group_Setup_HistoryHeader: String { return self._s[3650]! }
+ public var Map_SetThisLocation: String { return self._s[3651]! }
+ public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3652]! }
+ public var Activity_UploadingPhoto: String { return self._s[3653]! }
+ public var Conversation_Edit: String { return self._s[3655]! }
+ public var Group_ErrorSendRestrictedMedia: String { return self._s[3656]! }
+ public var Login_TermsOfServiceDecline: String { return self._s[3657]! }
+ public var Message_PinnedContactMessage: String { return self._s[3658]! }
+ public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3659]!, self._r[3659]!, [_1, _2])
+ }
public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3639]!, self._r[3639]!, [_1, _2, _3, _4, _5])
+ return formatWithArgumentRanges(self._s[3660]!, self._r[3660]!, [_1, _2, _3, _4, _5])
}
- public var Appearance_LargeEmoji: String { return self._s[3640]! }
- public var TwoStepAuth_AdditionalPassword: String { return self._s[3642]! }
- public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3643]! }
+ public var Appearance_LargeEmoji: String { return self._s[3661]! }
+ public var TwoStepAuth_AdditionalPassword: String { return self._s[3663]! }
+ public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3664]! }
public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3644]!, self._r[3644]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3665]!, self._r[3665]!, [_1, _2])
}
- public var Passport_Phone_EnterOtherNumber: String { return self._s[3645]! }
- public var Message_PinnedPhotoMessage: String { return self._s[3646]! }
- public var Passport_FieldPhone: String { return self._s[3647]! }
- public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3648]! }
- public var ChatSettings_AutoPlayGifs: String { return self._s[3649]! }
- public var InfoPlist_NSCameraUsageDescription: String { return self._s[3651]! }
- public var Conversation_Call: String { return self._s[3652]! }
- public var Common_TakePhoto: String { return self._s[3654]! }
- public var Group_EditAdmin_RankTitle: String { return self._s[3655]! }
- public var Channel_NotificationLoading: String { return self._s[3656]! }
+ public var Passport_Phone_EnterOtherNumber: String { return self._s[3666]! }
+ public var Message_PinnedPhotoMessage: String { return self._s[3667]! }
+ public var Passport_FieldPhone: String { return self._s[3668]! }
+ public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3669]! }
+ public var ChatSettings_AutoPlayGifs: String { return self._s[3670]! }
+ public var InfoPlist_NSCameraUsageDescription: String { return self._s[3672]! }
+ public var Conversation_Call: String { return self._s[3673]! }
+ public var Common_TakePhoto: String { return self._s[3675]! }
+ public var Group_EditAdmin_RankTitle: String { return self._s[3676]! }
+ public var Channel_NotificationLoading: String { return self._s[3677]! }
public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3657]!, self._r[3657]!, [_0])
+ return formatWithArgumentRanges(self._s[3678]!, self._r[3678]!, [_0])
}
public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3658]!, self._r[3658]!, [_0])
- }
- public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3659]!, self._r[3659]!, [_1])
- }
- public var Permissions_SiriTitle_v0: String { return self._s[3660]! }
- public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3661]!, self._r[3661]!, [_0])
- }
- public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3662]!, self._r[3662]!, [_0])
- }
- public var Channel_MessagePhotoRemoved: String { return self._s[3663]! }
- public var Common_edit: String { return self._s[3664]! }
- public var PrivacySettings_AuthSessions: String { return self._s[3665]! }
- public var Month_ShortJune: String { return self._s[3666]! }
- public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3667]! }
- public var Call_ReportSend: String { return self._s[3668]! }
- public var Watch_LastSeen_JustNow: String { return self._s[3669]! }
- public var Notifications_MessageNotifications: String { return self._s[3670]! }
- public var WallpaperSearch_ColorGreen: String { return self._s[3671]! }
- public var BroadcastListInfo_AddRecipient: String { return self._s[3673]! }
- public var Group_Status: String { return self._s[3674]! }
- public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3675]!, self._r[3675]!, [_0, _1])
- }
- public var TextFormat_AddLinkTitle: String { return self._s[3676]! }
- public var ShareMenu_ShareTo: String { return self._s[3677]! }
- public var Conversation_Moderate_Ban: String { return self._s[3678]! }
- public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3679]!, self._r[3679]!, [_0])
}
- public var SharedMedia_ViewInChat: String { return self._s[3680]! }
- public var Map_LiveLocationFor8Hours: String { return self._s[3681]! }
+ public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3680]!, self._r[3680]!, [_1])
+ }
+ public var Permissions_SiriTitle_v0: String { return self._s[3681]! }
+ public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3682]!, self._r[3682]!, [_0])
+ }
+ public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3683]!, self._r[3683]!, [_0])
+ }
+ public var Channel_MessagePhotoRemoved: String { return self._s[3684]! }
+ public var Common_edit: String { return self._s[3685]! }
+ public var PrivacySettings_AuthSessions: String { return self._s[3686]! }
+ public var Month_ShortJune: String { return self._s[3687]! }
+ public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3688]! }
+ public var Call_ReportSend: String { return self._s[3689]! }
+ public var Watch_LastSeen_JustNow: String { return self._s[3690]! }
+ public var Notifications_MessageNotifications: String { return self._s[3691]! }
+ public var WallpaperSearch_ColorGreen: String { return self._s[3692]! }
+ public var BroadcastListInfo_AddRecipient: String { return self._s[3694]! }
+ public var Group_Status: String { return self._s[3695]! }
+ public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3696]!, self._r[3696]!, [_0, _1])
+ }
+ public var TextFormat_AddLinkTitle: String { return self._s[3697]! }
+ public var ShareMenu_ShareTo: String { return self._s[3698]! }
+ public var Conversation_Moderate_Ban: String { return self._s[3699]! }
+ public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3700]!, self._r[3700]!, [_0])
+ }
+ public var SharedMedia_ViewInChat: String { return self._s[3701]! }
+ public var Map_LiveLocationFor8Hours: String { return self._s[3702]! }
public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3682]!, self._r[3682]!, [_1])
+ return formatWithArgumentRanges(self._s[3703]!, self._r[3703]!, [_1])
}
public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3683]!, self._r[3683]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3704]!, self._r[3704]!, [_1, _2])
}
public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3685]!, self._r[3685]!, [_0])
+ return formatWithArgumentRanges(self._s[3706]!, self._r[3706]!, [_0])
}
- public var Map_OpenInHereMaps: String { return self._s[3686]! }
- public var Appearance_ReduceMotion: String { return self._s[3687]! }
+ public var Map_OpenInHereMaps: String { return self._s[3707]! }
+ public var Appearance_ReduceMotion: String { return self._s[3708]! }
public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3688]!, self._r[3688]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3709]!, self._r[3709]!, [_1, _2])
}
- public var Channel_Setup_TypePublicHelp: String { return self._s[3689]! }
- public var Passport_Identity_EditInternalPassport: String { return self._s[3690]! }
- public var PhotoEditor_Skip: String { return self._s[3691]! }
- public func ChatList_SelectedChats(_ value: Int32) -> String {
+ public var Channel_Setup_TypePublicHelp: String { return self._s[3710]! }
+ public var Passport_Identity_EditInternalPassport: String { return self._s[3711]! }
+ public var PhotoEditor_Skip: String { return self._s[3712]! }
+ public func Map_ETAMinutes(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value)
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, selector)
return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _1, _2)
}
- public func CreatePoll_AddMoreOptions(_ 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 QuickSend_Photos(_ 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 MessageTimer_Hours(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func LastSeen_HoursAgo(_ 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 Notifications_ExceptionMuteExpires_Hours(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, _2, _1, _3)
- }
- public func Notifications_Exceptions(_ 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 MuteFor_Hours(_ 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 SharedMedia_Photo(_ 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 Conversation_StatusSubscribers(_ 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 Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func Notification_GameScoreSelfExtended(_ 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 PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[15 * 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[16 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func Theme_UsersCount(_ 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 VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func MessageTimer_Days(_ 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 MessageTimer_ShortWeeks(_ 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 Media_ShareVideo(_ 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 ForwardedGifs(_ 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 GroupInfo_ParticipantCount(_ 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 Conversation_LiveLocationMembersCount(_ 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 PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func ServiceMessage_GameScoreSimple(_ 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 ForwardedFiles(_ 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 DialogList_LiveLocationChatsCount(_ 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 Conversation_StatusMembers(_ 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 AttachmentMenu_SendVideo(_ 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_ShortHours(_ 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 MessageTimer_Weeks(_ 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 StickerPack_RemoveStickerCount(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func Conversation_StatusOnline(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func StickerPack_StickerCount(_ 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 Notification_GameScoreSelfSimple(_ 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 PrivacyLastSeenSettings_AddUsers(_ 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 Contacts_ImportersCount(_ 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 MessageTimer_Seconds(_ 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 ServiceMessage_GameScoreSelfSimple(_ 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 AttachmentMenu_SendPhoto(_ 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 PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func VoiceOver_Chat_PollVotes(_ 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 ChatList_DeleteConfirmation(_ 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 PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func Media_ShareItem(_ 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_ShortSeconds(_ 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 AttachmentMenu_SendItem(_ 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)
+ return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _1, _2)
}
public func Call_ShortMinutes(_ 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 Forward_ConfirmMultipleFiles(_ 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 SharedMedia_DeleteItemsConfirmation(_ 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 Notification_GameScoreSimple(_ 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 PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, _2, _1, _3)
- }
- public func StickerPack_AddStickerCount(_ 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 Map_ETAHours(_ 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 ForwardedVideoMessages(_ 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_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, _2, _1, _3)
- }
- public func Wallpaper_DeleteConfirmation(_ 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 MessageTimer_Months(_ 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 ForwardedAudios(_ 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 Passport_Scans(_ 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 ForwardedLocations(_ 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 AttachmentMenu_SendGif(_ 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 MuteExpires_Minutes(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func Call_Minutes(_ 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 Notifications_ExceptionMuteExpires_Days(_ 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 Call_ShortSeconds(_ 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 Invitation_Members(_ 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 ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _0, _1)
- }
- public func ServiceMessage_GameScoreSelfExtended(_ 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 ServiceMessage_GameScoreExtended(_ 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_MESSAGE_ROUNDS(_ 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 PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[75 * 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[76 * 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[77 * 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[78 * 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[79 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func Conversation_SelectedMessages(_ 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 PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func Media_SharePhoto(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[82 * 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[83 * 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[84 * 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[85 * 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[86 * 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[87 * 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[88 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func VoiceOver_Chat_ContactEmailCount(_ 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 ForwardedPolls(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func MuteExpires_Hours(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func SharedMedia_Video(_ 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_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, _2, _1, _3)
- }
- public func UserCount(_ 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[3 * 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[95 * 6 + Int(form.rawValue)]!, stringValue)
+ return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func LiveLocation_MenuChatsCount(_ 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[96 * 6 + Int(form.rawValue)]!, stringValue)
+ return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String {
+ public func Media_SharePhoto(_ 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)
+ return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func ForwardedMessages(_ value: Int32) -> String {
+ public func ChatList_SelectedChats(_ 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)
+ return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func StickerPack_AddMaskCount(_ 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[99 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func ForwardedVideos(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, selector)
- return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _2, _1, _3)
- }
- public func MuteExpires_Days(_ 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 SharedMedia_Generic(_ 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 Watch_LastSeen_MinutesAgo(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue)
- }
- public func LastSeen_MinutesAgo(_ 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 PasscodeSettings_FailedAttempts(_ 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 Watch_UserInfo_Mute(_ 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 MessageTimer_ShortMinutes(_ value: Int32) -> String {
- let form = presentationStringsPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[108 * 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[109 * 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[110 * 6 + Int(form.rawValue)]!, stringValue)
+ return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue)
}
public func MuteFor_Days(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value)
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue)
+ return String(format: self._ps[9 * 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[10 * 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[11 * 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[12 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, value)
+ let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
+ return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func QuickSend_Photos(_ 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 MessageTimer_Months(_ 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 PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[16 * 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[17 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func ForwardedFiles(_ 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 VoiceOver_Chat_ContactPhoneNumberCount(_ 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 MessageTimer_Years(_ 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 ForwardedVideoMessages(_ 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 VoiceOver_Chat_PollOptionCount(_ 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_ShortWeeks(_ 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 Notifications_ExceptionMuteExpires_Minutes(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, _1, _2)
+ }
+ public func Call_ShortSeconds(_ 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 ForwardedVideos(_ 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 Conversation_LiveLocationMembersCount(_ 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 MuteExpires_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 DialogList_LiveLocationChatsCount(_ 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 ChatList_DeleteConfirmation(_ 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_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ }
+ public func Notifications_Exceptions(_ value: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, value)
+ let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
+ return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func StickerPack_RemoveMaskCount(_ 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 InviteText_ContactsCountText(_ value: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, value)
+ let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
+ return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func StickerPack_AddStickerCount(_ 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 SharedMedia_Link(_ 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 AttachmentMenu_SendVideo(_ 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 Media_ShareVideo(_ 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 Notifications_ExceptionMuteExpires_Hours(_ 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 ForwardedMessages(_ 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 Notification_GameScoreSelfExtended(_ 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 MuteExpires_Hours(_ 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 PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, _1, _2)
}
public func MessagePoll_VotedCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value)
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue)
+ return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func InviteText_ContactsCountText(_ 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[47 * 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[48 * 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[49 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func Theme_UsersCount(_ 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 UserCount(_ 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 MuteExpires_Minutes(_ 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 MessageTimer_Days(_ 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 GroupInfo_ParticipantCount(_ 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 ServiceMessage_GameScoreSimple(_ 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 PrivacyLastSeenSettings_AddUsers(_ 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 ServiceMessage_GameScoreSelfExtended(_ 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 Notification_GameScoreExtended(_ 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_StickerCount(_ 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 MessageTimer_ShortHours(_ 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 Notification_GameScoreSelfSimple(_ 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 VoiceOver_Chat_PollVotes(_ 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 PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ }
+ public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, _1, _2)
+ }
+ public func SharedMedia_Generic(_ 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 Call_Minutes(_ 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 MessageTimer_ShortSeconds(_ 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_MESSAGES(_ 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 Passport_Scans(_ 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 PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ }
+ public func Conversation_StatusOnline(_ 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 LastSeen_HoursAgo(_ 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 PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[74 * 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[75 * 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[76 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func Conversation_SelectedMessages(_ 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 SharedMedia_File(_ 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 Invitation_Members(_ 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 ForwardedAudios(_ 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_StatusMembers(_ 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 CreatePoll_AddMoreOptions(_ 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 PUSH_CHANNEL_MESSAGE_FWDS(_ 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 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 AttachmentMenu_SendPhoto(_ 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 ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, _0, _1)
+ }
+ public func AttachmentMenu_SendGif(_ 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 StickerPack_RemoveStickerCount(_ 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 Watch_LastSeen_MinutesAgo(_ 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 PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, _1, _2)
+ }
+ public func MessageTimer_ShortMinutes(_ value: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, value)
+ let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
+ return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func StickerPack_AddMaskCount(_ value: Int32) -> String {
+ 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 Call_Seconds(_ value: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, value)
+ let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
+ return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func Notification_GameScoreSimple(_ value: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, value)
+ let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
+ return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue)
+ }
+ public func ForwardedPhotos(_ 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 VoiceOver_Chat_ContactEmailCount(_ 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 Chat_DeleteMessagesConfirmation(_ 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 PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, selector)
+ return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, _1, _2)
+ }
+ public func ServiceMessage_GameScoreExtended(_ 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 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 MuteFor_Hours(_ 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 MessageTimer_Weeks(_ 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 AttachmentMenu_SendItem(_ 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 ForwardedLocations(_ 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 Notifications_ExceptionMuteExpires_Days(_ 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 Wallpaper_DeleteConfirmation(_ 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 Forward_ConfirmMultipleFiles(_ 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 PasscodeSettings_FailedAttempts(_ value: Int32) -> String {
+ let form = presentationStringsPluralizationForm(self.lc, value)
+ let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
+ return String(format: self._ps[108 * 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[109 * 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[110 * 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[111 * 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[112 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ }
+ public func ForwardedPolls(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value)
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue)
diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift
index cbca01ce42..6378d155ee 100644
--- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift
+++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift
@@ -47,13 +47,13 @@ public enum PresentationResourceKey: Int32 {
case itemListAddExceptionIcon
case itemListAddPhoneIcon
case itemListClearInputIcon
-
case itemListStickerItemUnreadDot
case itemListVerifiedPeerIcon
-
case itemListCloudFetchIcon
-
case itemListCloseIconImage
+ case itemListCornersTop
+ case itemListCornersBottom
+ case itemListCornersBoth
case chatListLockTopUnlockedImage
case chatListLockBottomUnlockedImage
diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift
index 54e893f7c4..0bf4c16233 100644
--- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift
+++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift
@@ -145,4 +145,40 @@ public struct PresentationResourcesItemList {
})
})
}
+
+ public static func cornersImage(_ theme: PresentationTheme, top: Bool, bottom: Bool) -> UIImage? {
+ if !top && !bottom {
+ return nil
+ }
+ let key: PresentationResourceKey
+ if top && bottom {
+ key = PresentationResourceKey.itemListCornersBoth
+ } else if top {
+ key = PresentationResourceKey.itemListCornersTop
+ } else {
+ key = PresentationResourceKey.itemListCornersBottom
+ }
+ return theme.image(key.rawValue, { theme in
+ return generateImage(CGSize(width: 50.0, height: 50.0), rotatedContext: { (size, context) in
+ let bounds = CGRect(origin: CGPoint(), size: size)
+ context.setFillColor(theme.list.blocksBackgroundColor.cgColor)
+ context.fill(bounds)
+
+ context.setBlendMode(.clear)
+
+ var corners: UIRectCorner = []
+ if top {
+ corners.insert(.topLeft)
+ corners.insert(.topRight)
+ }
+ if bottom {
+ corners.insert(.bottomLeft)
+ corners.insert(.bottomRight)
+ }
+ let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: 11.0, height: 11.0))
+ context.addPath(path.cgPath)
+ context.fillPath()
+ })?.stretchableImage(withLeftCapWidth: 25, topCapHeight: 25)
+ })
+ }
}
diff --git a/submodules/TelegramUI/BUCK b/submodules/TelegramUI/BUCK
index a5ed51d22f..8e8a2aaea7 100644
--- a/submodules/TelegramUI/BUCK
+++ b/submodules/TelegramUI/BUCK
@@ -180,6 +180,7 @@ framework(
"//submodules/InstantPageCache:InstantPageCache",
"//submodules/PersistentStringHash:PersistentStringHash",
"//submodules/MessageReactionListUI:MessageReactionListUI",
+ "//submodules/SegmentedControlNode:SegmentedControlNode",
"//submodules/AppBundle:AppBundle",
],
frameworks = [
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddUser.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddUser.imageset/Contents.json
new file mode 100644
index 0000000000..d7f8a263fa
--- /dev/null
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddUser.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "ic_lt_adduser.pdf"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddUser.imageset/ic_lt_adduser.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddUser.imageset/ic_lt_adduser.pdf
new file mode 100644
index 0000000000..7803bbe7be
Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddUser.imageset/ic_lt_adduser.pdf differ
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ApplyTheme.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ApplyTheme.imageset/Contents.json
new file mode 100644
index 0000000000..743b06bb22
--- /dev/null
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ApplyTheme.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "ic_applytheme.pdf"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ApplyTheme.imageset/ic_applytheme.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ApplyTheme.imageset/ic_applytheme.pdf
new file mode 100644
index 0000000000..2e4664af53
Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ApplyTheme.imageset/ic_applytheme.pdf differ
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/GoToMessage.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/GoToMessage.imageset/Contents.json
new file mode 100644
index 0000000000..3c5b983ee3
--- /dev/null
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/GoToMessage.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "ic_viewinchat.pdf"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/GoToMessage.imageset/ic_viewinchat.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/GoToMessage.imageset/ic_viewinchat.pdf
new file mode 100644
index 0000000000..546bc5b029
Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/GoToMessage.imageset/ic_viewinchat.pdf differ
diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift
index 6054cc6434..35e6f58f71 100644
--- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift
+++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift
@@ -1278,6 +1278,14 @@ final class SharedApplicationContext {
self.isInForegroundPromise.set(true)
self.isActiveValue = true
self.isActivePromise.set(true)
+
+ let configuration = URLSessionConfiguration.background(withIdentifier: "org.telegram.Telegram-iOS.background")
+ let session = URLSession(configuration: configuration)
+ if #available(iOS 9.0, *) {
+ session.getAllTasks(completionHandler: { tasks in
+ print(tasks)
+ })
+ }
}
func applicationWillTerminate(_ application: UIApplication) {
@@ -1742,6 +1750,11 @@ final class SharedApplicationContext {
})
}
+ func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
+ Logger.shared.log("App \(self.episodeId)", "handleEventsForBackgroundURLSession \(identifier)")
+ completionHandler()
+ }
+
override var next: UIResponder? {
if let context = self.contextValue, let controller = context.context.keyShortcutsController {
return controller
diff --git a/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift b/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift
index 9a2f2c65f5..767403dada 100644
--- a/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift
@@ -69,7 +69,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode {
}
}
- override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, isVisible: Bool) -> (CGFloat, CGFloat) {
+ override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, deviceMetrics: DeviceMetrics, isVisible: Bool) -> (CGFloat, CGFloat) {
transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: width, height: UIScreenPixel)))
if self.theme !== interfaceState.theme {
diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift
index c84095e2cf..77a896f042 100644
--- a/submodules/TelegramUI/TelegramUI/ChatController.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatController.swift
@@ -540,7 +540,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self, !actions.isEmpty else {
return
}
- /*let reactions: [(String, String, String)] = [
+ let reactions: [(String, String, String)] = [
("😔", "Sad", "sad"),
("😳", "Surprised", "surprised"),
("😂", "Fun", "lol"),
@@ -553,18 +553,18 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
("😐", "Poker", "poker"),
("💩", "Poop", "poop"),
("😊", "Smile", "smile")
- ]*/
+ ]
var reactionItems: [ReactionContextItem] = []
- /*for (value, text, name) in reactions {
- if let path = getAppBundle().path(forResource: name, ofType: "tgs", inDirectory: "BuiltinReactions") {
+ for (value, text, name) in reactions {
+ if let path = getAppBundle().path(forResource: name, ofType: "tgs") {
reactionItems.append(ReactionContextItem(value: value, text: text, path: path))
}
- }*/
+ }
if Namespaces.Message.allScheduled.contains(message.id.namespace) {
reactionItems = []
}
- let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: reactionItems, recognizer: recognizer)
+ let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: .extracted(ChatMessageContextExtractedContentSource(chatNode: strongSelf.chatDisplayNode, message: message)), items: .single(actions), reactionItems: reactionItems, recognizer: recognizer)
strongSelf.currentContextController = controller
controller.reactionSelected = { [weak controller] value in
guard let strongSelf = self, let message = updatedMessages.first else {
@@ -592,6 +592,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
strongSelf.window?.presentInGlobalOverlay(controller)
})
}
+ }, openMessageContextActions: { message, node, rect, gesture in
+ gesture?.cancel()
}, navigateToMessage: { [weak self] fromId, id in
self?.navigateToMessage(from: fromId, to: .id(id))
}, clickThroughMessage: { [weak self] in
@@ -1393,7 +1395,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
})))
- let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: [], recognizer: nil)
+ let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: .extracted(ChatMessageContextExtractedContentSource(chatNode: strongSelf.chatDisplayNode, message: message)), items: .single(actions), reactionItems: [], recognizer: nil)
strongSelf.currentContextController = controller
strongSelf.window?.presentInGlobalOverlay(controller)
})
@@ -1433,7 +1435,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
f(.dismissWithoutContent)
})))
- let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: [], recognizer: nil)
+ let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: .extracted(ChatMessageContextExtractedContentSource(chatNode: strongSelf.chatDisplayNode, message: message)), items: .single(actions), reactionItems: [], recognizer: nil)
strongSelf.currentContextController = controller
strongSelf.window?.presentInGlobalOverlay(controller)
})
@@ -4153,7 +4155,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
subscriber.putCompletion()
return EmptyDisposable
}
- subscriber.putNext(strongSelf.traceVisibility() && isTopmostChatController(strongSelf))
+
+ subscriber.putNext(strongSelf.traceVisibility() && isTopmostChatController(strongSelf) && !strongSelf.context.sharedContext.mediaManager.audioSession.isOtherAudioPlaying())
subscriber.putCompletion()
return EmptyDisposable
} |> then(.complete() |> delay(1.0, queue: Queue.mainQueue())) |> restart
@@ -7323,7 +7326,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
if canDisplayContextMenu, let contextController = contextController {
- contextController.setItems(contextItems)
+ contextController.setItems(.single(contextItems))
} else {
actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [
ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in
diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift
index 4cdb6a14ff..9656295485 100644
--- a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift
@@ -8,6 +8,7 @@ import TelegramUIPreferences
import AccountContext
import TextSelectionNode
import ReactionSelectionNode
+import ContextUI
struct ChatInterfaceHighlightedState: Equatable {
let messageStableId: UInt32
@@ -51,6 +52,7 @@ public final class ChatControllerInteraction {
let openPeer: (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void
let openPeerMention: (String) -> Void
let openMessageContextMenu: (Message, Bool, ASDisplayNode, CGRect, TapLongTapOrDoubleTapGestureRecognizer?) -> Void
+ let openMessageContextActions: (Message, ASDisplayNode, CGRect, ContextGesture?) -> Void
let navigateToMessage: (MessageId, MessageId) -> Void
let clickThroughMessage: () -> Void
let toggleMessagesSelection: ([MessageId], Bool) -> Void
@@ -111,11 +113,12 @@ public final class ChatControllerInteraction {
var searchTextHighightState: String?
var seenOneTimeAnimatedMedia = Set()
- init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, TapLongTapOrDoubleTapGestureRecognizer?) -> 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, openTheme: @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?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, 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, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, String, TextSelectionAction) -> Void, updateMessageReaction: @escaping (MessageId, String) -> Void, openMessageReactions: @escaping (MessageId) -> 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, TapLongTapOrDoubleTapGestureRecognizer?) -> Void, openMessageContextActions: @escaping (Message, ASDisplayNode, CGRect, ContextGesture?) -> 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, openTheme: @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?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, 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, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, String, TextSelectionAction) -> Void, updateMessageReaction: @escaping (MessageId, String) -> Void, openMessageReactions: @escaping (MessageId) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) {
self.openMessage = openMessage
self.openPeer = openPeer
self.openPeerMention = openPeerMention
self.openMessageContextMenu = openMessageContextMenu
+ self.openMessageContextActions = openMessageContextActions
self.navigateToMessage = navigateToMessage
self.clickThroughMessage = clickThroughMessage
self.toggleMessagesSelection = toggleMessagesSelection
@@ -174,7 +177,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 }, 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 }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in
+ return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextActions: { _, _, _, _ 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 }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in
}, presentController: { _, _ in }, navigationController: {
return nil
}, chatControllerNode: {
diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift
index ab5f9aeefd..4fd2a80d66 100644
--- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift
@@ -591,7 +591,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
self.insertSubnode(inputNode, aboveSubnode: self.inputPanelBackgroundNode)
}
}
- inputNodeHeightAndOverflow = inputNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: cleanInsets.bottom, standardInputHeight: layout.standardInputHeight, inputHeight: layout.inputHeight ?? 0.0, maximumHeight: maximumInputNodeHeight, inputPanelHeight: inputPanelNodeBaseHeight, transition: immediatelyLayoutInputNodeAndAnimateAppearance ? .immediate : transition, interfaceState: self.chatPresentationInterfaceState, isVisible: true)
+ inputNodeHeightAndOverflow = inputNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: cleanInsets.bottom, standardInputHeight: layout.standardInputHeight, inputHeight: layout.inputHeight ?? 0.0, maximumHeight: maximumInputNodeHeight, inputPanelHeight: inputPanelNodeBaseHeight, transition: immediatelyLayoutInputNodeAndAnimateAppearance ? .immediate : transition, interfaceState: self.chatPresentationInterfaceState, deviceMetrics: layout.deviceMetrics, isVisible: true)
} else if let inputNode = self.inputNode {
dismissedInputNode = inputNode
self.inputNode = nil
@@ -672,7 +672,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
}
if let inputMediaNode = self.inputMediaNode, inputMediaNode != self.inputNode {
- let _ = inputMediaNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: cleanInsets.bottom, standardInputHeight: layout.standardInputHeight, inputHeight: layout.inputHeight ?? 0.0, maximumHeight: maximumInputNodeHeight, inputPanelHeight: inputPanelSize?.height ?? 0.0, transition: .immediate, interfaceState: self.chatPresentationInterfaceState, isVisible: false)
+ let _ = inputMediaNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: cleanInsets.bottom, standardInputHeight: layout.standardInputHeight, inputHeight: layout.inputHeight ?? 0.0, maximumHeight: maximumInputNodeHeight, inputPanelHeight: inputPanelSize?.height ?? 0.0, transition: .immediate, interfaceState: self.chatPresentationInterfaceState, deviceMetrics: layout.deviceMetrics, isVisible: false)
}
transition.updateFrame(node: self.titleAccessoryPanelContainer, frame: CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: 56.0)))
@@ -1045,7 +1045,13 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
let previousInputPanelBackgroundFrame = self.inputPanelBackgroundNode.frame
transition.updateFrame(node: self.inputPanelBackgroundNode, frame: apparentInputBackgroundFrame)
- transition.updateFrame(node: self.inputPanelBackgroundSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: apparentInputBackgroundFrame.origin.y - UIScreenPixel), size: CGSize(width: apparentInputBackgroundFrame.size.width, height: UIScreenPixel)))
+ let separatorOffset: CGFloat
+ if apparentInputBackgroundFrame.maxY >= layout.size.height {
+ separatorOffset = UIScreenPixel
+ } else {
+ separatorOffset = -UIScreenPixel
+ }
+ transition.updateFrame(node: self.inputPanelBackgroundSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: apparentInputBackgroundFrame.origin.y + separatorOffset), size: CGSize(width: apparentInputBackgroundFrame.size.width, height: UIScreenPixel)))
transition.updateFrame(node: self.navigateButtons, frame: apparentNavigateButtonsFrame)
if let titleAccessoryPanelNode = self.titleAccessoryPanelNode, let titleAccessoryPanelFrame = titleAccessoryPanelFrame, !titleAccessoryPanelNode.frame.equalTo(titleAccessoryPanelFrame) {
@@ -1573,7 +1579,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
inputNode.interfaceInteraction = interfaceInteraction
self.inputMediaNode = inputNode
if let (validLayout, _) = self.validLayout {
- let _ = inputNode.updateLayout(width: validLayout.size.width, leftInset: validLayout.safeInsets.left, rightInset: validLayout.safeInsets.right, bottomInset: validLayout.intrinsicInsets.bottom, standardInputHeight: validLayout.standardInputHeight, inputHeight: validLayout.inputHeight ?? 0.0, maximumHeight: validLayout.standardInputHeight, inputPanelHeight: 44.0, transition: .immediate, interfaceState: self.chatPresentationInterfaceState, isVisible: false)
+ let _ = inputNode.updateLayout(width: validLayout.size.width, leftInset: validLayout.safeInsets.left, rightInset: validLayout.safeInsets.right, bottomInset: validLayout.intrinsicInsets.bottom, standardInputHeight: validLayout.standardInputHeight, inputHeight: validLayout.inputHeight ?? 0.0, maximumHeight: validLayout.standardInputHeight, inputPanelHeight: 44.0, transition: .immediate, interfaceState: self.chatPresentationInterfaceState, deviceMetrics: validLayout.deviceMetrics, isVisible: false)
}
self.textInputPanelNode?.loadTextInputNodeIfNeeded()
diff --git a/submodules/TelegramUI/TelegramUI/ChatInputNode.swift b/submodules/TelegramUI/TelegramUI/ChatInputNode.swift
index 9302ed63c9..d87af58c89 100644
--- a/submodules/TelegramUI/TelegramUI/ChatInputNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatInputNode.swift
@@ -10,7 +10,7 @@ class ChatInputNode: ASDisplayNode {
return .single(Void())
}
- func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, isVisible: Bool) -> (CGFloat, CGFloat) {
+ func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, deviceMetrics: DeviceMetrics, isVisible: Bool) -> (CGFloat, CGFloat) {
return (0.0, 0.0)
}
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift
index d1b9090167..98044b5948 100644
--- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift
@@ -12,6 +12,7 @@ import AccountContext
import ContextUI
import LegacyUI
import AppBundle
+import SaveToCameraRoll
private struct MessageContextMenuData {
let starStatus: Bool?
@@ -35,7 +36,7 @@ private func canEditMessage(accountPeerId: PeerId, limitsConfiguration: LimitsCo
if let peer = message.peers[message.id.peerId], let channel = peer as? TelegramChannel {
switch channel.info {
case .broadcast:
- if channel.hasPermission(.editAllMessages) {
+ if message.author?.id == message.id.peerId || channel.hasPermission(.editAllMessages) {
hasEditRights = true
}
default:
@@ -446,6 +447,30 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState:
}
f(.default)
})))
+ if resourceAvailable, !message.containsSecretMedia {
+ var mediaReference: AnyMediaReference?
+ for media in message.media {
+ if let image = media as? TelegramMediaImage, let largest = largestImageRepresentation(image.representations) {
+ mediaReference = ImageMediaReference.standalone(media: image).abstract
+ break
+ } else if let file = media as? TelegramMediaFile, file.isVideo {
+ mediaReference = FileMediaReference.standalone(media: file).abstract
+ break
+ }
+ }
+ if let mediaReference = mediaReference {
+ actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Preview_SaveToCameraRoll, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Save"), color: theme.actionSheet.primaryTextColor)
+ }, action: { _, f in
+ let _ = (saveToCameraRoll(context: context, postbox: context.account.postbox, mediaReference: mediaReference)
+ |> deliverOnMainQueue).start(completed: {
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success), nil)
+ })
+ f(.default)
+ })))
+ }
+ }
}
if data.canEdit {
diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift
index 3b4d31123e..13c5324388 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift
@@ -36,7 +36,7 @@ final class ChatMediaInputGifPane: ChatMediaInputPane, UIScrollViewDelegate {
private let disposable = MetaDisposable()
let trendingPromise = Promise<[FileMediaReference]?>(nil)
- private var validLayout: (CGSize, CGFloat, CGFloat, Bool, Bool)?
+ private var validLayout: (CGSize, CGFloat, CGFloat, Bool, Bool, DeviceMetrics)?
private var didScrollPreviousOffset: CGFloat?
private var didScrollPreviousState: ChatMediaInputPaneScrollState?
@@ -76,18 +76,18 @@ final class ChatMediaInputGifPane: ChatMediaInputPane, UIScrollViewDelegate {
self.searchPlaceholderNode.setup(theme: theme, strings: strings, type: .gifs)
if let layout = self.validLayout {
- self.updateLayout(size: layout.0, topInset: layout.1, bottomInset: layout.2, isExpanded: layout.3, isVisible: layout.4, transition: .immediate)
+ self.updateLayout(size: layout.0, topInset: layout.1, bottomInset: layout.2, isExpanded: layout.3, isVisible: layout.4, deviceMetrics: layout.5, transition: .immediate)
}
}
- override func updateLayout(size: CGSize, topInset: CGFloat, bottomInset: CGFloat, isExpanded: Bool, isVisible: Bool, transition: ContainedViewLayoutTransition) {
+ override func updateLayout(size: CGSize, topInset: CGFloat, bottomInset: CGFloat, isExpanded: Bool, isVisible: Bool, deviceMetrics: DeviceMetrics, transition: ContainedViewLayoutTransition) {
var changedIsExpanded = false
- if let (_, _, _, previousIsExpanded, _) = self.validLayout {
+ if let (_, _, _, previousIsExpanded, _, _) = self.validLayout {
if previousIsExpanded != isExpanded {
changedIsExpanded = true
}
}
- self.validLayout = (size, topInset, bottomInset, isExpanded, isVisible)
+ self.validLayout = (size, topInset, bottomInset, isExpanded, isVisible, deviceMetrics)
let emptySize = self.emptyNode.updateLayout(size)
transition.updateFrame(node: self.emptyNode, frame: CGRect(origin: CGPoint(x: floor(size.width - emptySize.width) / 2.0, y: topInset + floor(size.height - topInset - emptySize.height) / 2.0), size: emptySize))
@@ -96,8 +96,15 @@ final class ChatMediaInputGifPane: ChatMediaInputPane, UIScrollViewDelegate {
let previousBounds = multiplexedNode.layer.bounds
multiplexedNode.topInset = topInset + 60.0
multiplexedNode.bottomInset = bottomInset
+
+ if case .tablet = deviceMetrics.type, size.width > 480.0 {
+ multiplexedNode.idealHeight = 120.0
+ } else {
+ multiplexedNode.idealHeight = 93.0
+ }
+
let nodeFrame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: size.width, height: size.height))
-
+
var targetBounds = CGRect(origin: previousBounds.origin, size: nodeFrame.size)
if changedIsExpanded {
targetBounds.origin.y = isExpanded || multiplexedNode.files.isEmpty ? 0.0 : 60.0
diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift
index 6a8aaf86c0..d1114a7664 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift
@@ -425,7 +425,7 @@ final class ChatMediaInputNode: ChatInputNode {
private var currentView: ItemCollectionsView?
private let dismissedPeerSpecificStickerPack = Promise()
- private var validLayout: (CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, ChatPresentationInterfaceState, Bool)?
+ private var validLayout: (CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, ChatPresentationInterfaceState, DeviceMetrics, Bool)?
private var paneArrangement: ChatMediaInputPaneArrangement
private var initializedArrangement = false
@@ -1045,8 +1045,8 @@ final class ChatMediaInputNode: ChatInputNode {
if let index = self.paneArrangement.panes.firstIndex(of: pane), index != self.paneArrangement.currentIndex {
let previousGifPanelWasActive = self.paneArrangement.panes[self.paneArrangement.currentIndex] == .gifs
self.paneArrangement = self.paneArrangement.withIndexTransition(0.0).withCurrentIndex(index)
- if let (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, isVisible) = self.validLayout {
- let _ = self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, standardInputHeight: standardInputHeight, inputHeight: inputHeight, maximumHeight: maximumHeight, inputPanelHeight: inputPanelHeight, transition: .animated(duration: 0.25, curve: .spring), interfaceState: interfaceState, isVisible: isVisible)
+ if let (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, deviceMetrics, isVisible) = self.validLayout {
+ let _ = self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, standardInputHeight: standardInputHeight, inputHeight: inputHeight, maximumHeight: maximumHeight, inputPanelHeight: inputPanelHeight, transition: .animated(duration: 0.25, curve: .spring), interfaceState: interfaceState, deviceMetrics: deviceMetrics, isVisible: isVisible)
self.updateAppearanceTransition(transition: transition)
}
let updatedGifPanelWasActive = self.paneArrangement.panes[self.paneArrangement.currentIndex] == .gifs
@@ -1066,8 +1066,8 @@ final class ChatMediaInputNode: ChatInputNode {
self.setHighlightedItemCollectionId(ItemCollectionId(namespace: ChatMediaInputPanelAuxiliaryNamespace.trending.rawValue, id: 0))
}
} else {
- if let (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, isVisible) = self.validLayout {
- let _ = self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, standardInputHeight: standardInputHeight, inputHeight: inputHeight, maximumHeight: maximumHeight, inputPanelHeight: inputPanelHeight, transition: .animated(duration: 0.25, curve: .spring), interfaceState: interfaceState, isVisible: isVisible)
+ if let (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, deviceMetrics, isVisible) = self.validLayout {
+ let _ = self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, standardInputHeight: standardInputHeight, inputHeight: inputHeight, maximumHeight: maximumHeight, inputPanelHeight: inputPanelHeight, transition: .animated(duration: 0.25, curve: .spring), interfaceState: interfaceState, deviceMetrics: deviceMetrics, isVisible: isVisible)
}
}
}
@@ -1195,13 +1195,13 @@ final class ChatMediaInputNode: ChatInputNode {
}
}
- override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, isVisible: Bool) -> (CGFloat, CGFloat) {
+ override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, deviceMetrics: DeviceMetrics, isVisible: Bool) -> (CGFloat, CGFloat) {
var searchMode: ChatMediaInputSearchMode?
- if let (_, _, _, _, _, _, _, _, interfaceState, _) = self.validLayout, case let .media(_, maybeExpanded) = interfaceState.inputMode, let expanded = maybeExpanded, case let .search(mode) = expanded {
+ if let (_, _, _, _, _, _, _, _, interfaceState, _, _) = self.validLayout, case let .media(_, maybeExpanded) = interfaceState.inputMode, let expanded = maybeExpanded, case let .search(mode) = expanded {
searchMode = mode
}
- self.validLayout = (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, isVisible)
+ self.validLayout = (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, deviceMetrics, isVisible)
if self.theme !== interfaceState.theme || self.strings !== interfaceState.strings {
self.updateThemeAndStrings(theme: interfaceState.theme, strings: interfaceState.strings)
@@ -1235,12 +1235,12 @@ final class ChatMediaInputNode: ChatInputNode {
let containerFrame = CGRect(origin: CGPoint(x: 0.0, y: -inputPanelHeight), size: CGSize(width: width, height: panelHeight + inputPanelHeight))
if searchContainerNode.supernode != nil {
transition.updateFrame(node: searchContainerNode, frame: containerFrame)
- searchContainerNode.updateLayout(size: containerFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, transition: transition)
+ searchContainerNode.updateLayout(size: containerFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics, transition: transition)
} else {
self.searchContainerNode = searchContainerNode
self.insertSubnode(searchContainerNode, belowSubnode: self.collectionListContainer)
searchContainerNode.frame = containerFrame
- searchContainerNode.updateLayout(size: containerFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, transition: .immediate)
+ searchContainerNode.updateLayout(size: containerFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics, transition: .immediate)
var placeholderNode: PaneSearchBarPlaceholderNode?
if let searchMode = searchMode {
switch searchMode {
@@ -1349,10 +1349,9 @@ final class ChatMediaInputNode: ChatInputNode {
}
}
- self.gifPane.updateLayout(size: CGSize(width: width - leftInset - rightInset, height: panelHeight), topInset: 41.0, bottomInset: bottomInset, isExpanded: isExpanded, isVisible: isVisible, transition: transition)
-
- self.stickerPane.updateLayout(size: CGSize(width: width - leftInset - rightInset, height: panelHeight), topInset: 41.0, bottomInset: bottomInset, isExpanded: isExpanded, isVisible: isVisible && visiblePanes.contains(where: { $0.0 == .stickers }), transition: transition)
- self.trendingPane.updateLayout(size: CGSize(width: width - leftInset - rightInset, height: panelHeight), topInset: 41.0, bottomInset: bottomInset, isExpanded: isExpanded, isVisible: isVisible, transition: transition)
+ self.gifPane.updateLayout(size: CGSize(width: width - leftInset - rightInset, height: panelHeight), topInset: 41.0, bottomInset: bottomInset, isExpanded: isExpanded, isVisible: isVisible, deviceMetrics: deviceMetrics, transition: transition)
+ self.stickerPane.updateLayout(size: CGSize(width: width - leftInset - rightInset, height: panelHeight), topInset: 41.0, bottomInset: bottomInset, isExpanded: isExpanded, isVisible: isVisible && visiblePanes.contains(where: { $0.0 == .stickers }), deviceMetrics: deviceMetrics, transition: transition)
+ self.trendingPane.updateLayout(size: CGSize(width: width - leftInset - rightInset, height: panelHeight), topInset: 41.0, bottomInset: bottomInset, isExpanded: isExpanded, isVisible: isVisible, deviceMetrics: deviceMetrics, transition: transition)
if self.gifPane.supernode != nil {
if !visiblePanes.contains(where: { $0.0 == .gifs }) {
@@ -1525,7 +1524,7 @@ final class ChatMediaInputNode: ChatInputNode {
self.trendingPane.removeFromSupernode()
}
case .changed:
- if let (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, isVisible) = self.validLayout {
+ if let (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, deviceMetrics, isVisible) = self.validLayout {
let translationX = -recognizer.translation(in: self.view).x
var indexTransition = translationX / width
if self.paneArrangement.currentIndex == 0 {
@@ -1534,10 +1533,10 @@ final class ChatMediaInputNode: ChatInputNode {
indexTransition = min(0.0, indexTransition)
}
self.paneArrangement = self.paneArrangement.withIndexTransition(indexTransition)
- let _ = self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, standardInputHeight: standardInputHeight, inputHeight: inputHeight, maximumHeight: maximumHeight, inputPanelHeight: inputPanelHeight, transition: .immediate, interfaceState: interfaceState, isVisible: isVisible)
+ let _ = self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, standardInputHeight: standardInputHeight, inputHeight: inputHeight, maximumHeight: maximumHeight, inputPanelHeight: inputPanelHeight, transition: .immediate, interfaceState: interfaceState, deviceMetrics: deviceMetrics, isVisible: isVisible)
}
case .ended:
- if let (width, _, _, _, _, _, _, _, _, _) = self.validLayout {
+ if let (width, _, _, _, _, _, _, _, _, _, _) = self.validLayout {
var updatedIndex = self.paneArrangement.currentIndex
if abs(self.paneArrangement.indexTransition * width) > 30.0 {
if self.paneArrangement.indexTransition < 0.0 {
@@ -1550,9 +1549,9 @@ final class ChatMediaInputNode: ChatInputNode {
self.setCurrentPane(self.paneArrangement.panes[updatedIndex], transition: .animated(duration: 0.25, curve: .spring))
}
case .cancelled:
- if let (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, isVisible) = self.validLayout {
+ if let (width, leftInset, rightInset, bottomInset, standardInputHeight, inputHeight, maximumHeight, inputPanelHeight, interfaceState, deviceMetrics, isVisible) = self.validLayout {
self.paneArrangement = self.paneArrangement.withIndexTransition(0.0)
- let _ = self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, standardInputHeight: standardInputHeight, inputHeight: inputHeight, maximumHeight: maximumHeight, inputPanelHeight: inputPanelHeight, transition: .animated(duration: 0.25, curve: .spring), interfaceState: interfaceState, isVisible: isVisible)
+ let _ = self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, standardInputHeight: standardInputHeight, inputHeight: inputHeight, maximumHeight: maximumHeight, inputPanelHeight: inputPanelHeight, transition: .animated(duration: 0.25, curve: .spring), interfaceState: interfaceState, deviceMetrics: deviceMetrics, isVisible: isVisible)
}
default:
break
diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputPane.swift
index f1c8647566..012627463c 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMediaInputPane.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputPane.swift
@@ -16,7 +16,7 @@ class ChatMediaInputPane: ASDisplayNode {
return false
}
- func updateLayout(size: CGSize, topInset: CGFloat, bottomInset: CGFloat, isExpanded: Bool, isVisible: Bool, transition: ContainedViewLayoutTransition) {
+ func updateLayout(size: CGSize, topInset: CGFloat, bottomInset: CGFloat, isExpanded: Bool, isVisible: Bool, deviceMetrics: DeviceMetrics, transition: ContainedViewLayoutTransition) {
}
func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings) {
diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift
index 8fa2250297..a978a9f21d 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift
@@ -251,7 +251,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode {
if self.currentSize != size {
self.currentSize = size
- let sideSize: CGFloat = min(75.0 - 10.0, size.width)
+ let sideSize: CGFloat = size.width - 10.0 //min(75.0 - 10.0, size.width)
let boundingSize = CGSize(width: sideSize, height: sideSize)
if let (_, _, mediaDimensions) = self.currentState {
@@ -271,7 +271,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode {
return
}
if let interfaceInteraction = self.interfaceInteraction, let (_, item, _) = self.currentState, case .ended = recognizer.state {
- interfaceInteraction.sendSticker(.standalone(media: item.file), false, self, self.bounds)
+ let _ = interfaceInteraction.sendSticker(.standalone(media: item.file), false, self, self.bounds)
self.imageNode.layer.animateAlpha(from: 0.5, to: 1.0, duration: 1.0)
}
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPane.swift
index d2caf0a433..1629717a22 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPane.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPane.swift
@@ -114,7 +114,7 @@ final class ChatMediaInputStickerPane: ChatMediaInputPane {
self.gridNode.scrollView.alwaysBounceVertical = true
}
- override func updateLayout(size: CGSize, topInset: CGFloat, bottomInset: CGFloat, isExpanded: Bool, isVisible: Bool, transition: ContainedViewLayoutTransition) {
+ override func updateLayout(size: CGSize, topInset: CGFloat, bottomInset: CGFloat, isExpanded: Bool, isVisible: Bool, deviceMetrics: DeviceMetrics, transition: ContainedViewLayoutTransition) {
var changedIsExpanded = false
if let previousIsExpanded = self.isExpanded {
if previousIsExpanded != isExpanded {
@@ -123,10 +123,17 @@ final class ChatMediaInputStickerPane: ChatMediaInputPane {
}
self.isExpanded = isExpanded
+ let maxItemSize: CGSize
+ if case .tablet = deviceMetrics.type, size.width > 480.0 {
+ maxItemSize = CGSize(width: 90.0, height: 96.0)
+ } else {
+ maxItemSize = CGSize(width: 75.0, height: 80.0)
+ }
+
let sideInset: CGFloat = 2.0
var itemSide: CGFloat = floor((size.width - sideInset * 2.0) / 5.0)
- itemSide = min(itemSide, 75.0)
- let itemSize = CGSize(width: itemSide, height: max(itemSide, 80.0))
+ itemSide = min(itemSide, maxItemSize.width)
+ let itemSize = CGSize(width: itemSide, height: max(itemSide, maxItemSize.height))
var scrollToItem: GridNodeScrollToItem?
if changedIsExpanded {
diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift
index 9b2568f367..aa50bcfaa7 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift
@@ -75,24 +75,31 @@ private final class TrendingPaneEntry: Identifiable, Comparable {
return lhs.index < rhs.index
}
- func item(account: Account, interaction: TrendingPaneInteraction) -> ListViewItem {
- return MediaInputPaneTrendingItem(account: account, theme: self.theme, strings: self.strings, interaction: interaction, info: self.info, topItems: self.topItems, installed: self.installed, unread: self.unread)
+ func item(account: Account, interaction: TrendingPaneInteraction) -> GridItem {
+ let info = self.info
+ return StickerPaneSearchGlobalItem(account: account, theme: self.theme, strings: self.strings, info: self.info, topItems: self.topItems, grid: true, installed: self.installed, unread: self.unread, open: {
+ interaction.openPack(info)
+ }, install: {
+ interaction.installPack(info)
+ }, getItemIsPreviewed: { item in
+ return interaction.getItemIsPreviewed(item)
+ })
}
}
private struct TrendingPaneTransition {
- let deletions: [ListViewDeleteItem]
- let insertions: [ListViewInsertItem]
- let updates: [ListViewUpdateItem]
+ let deletions: [Int]
+ let insertions: [GridNodeInsertItem]
+ let updates: [GridNodeUpdateItem]
let initial: Bool
}
private func preparedTransition(from fromEntries: [TrendingPaneEntry], to toEntries: [TrendingPaneEntry], account: Account, interaction: TrendingPaneInteraction, initial: Bool) -> TrendingPaneTransition {
let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdates(leftList: fromEntries, rightList: toEntries)
- let deletions = deleteIndices.map { ListViewDeleteItem(index: $0, directionHint: nil) }
- let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, interaction: interaction), directionHint: nil) }
- let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, interaction: interaction), directionHint: nil) }
+ let deletions = deleteIndices
+ let insertions = indicesAndItems.map { GridNodeInsertItem(index: $0.0, item: $0.1.item(account: account, interaction: interaction), previousIndex: $0.2) }
+ let updates = updateIndices.map { GridNodeUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, interaction: interaction)) }
return TrendingPaneTransition(deletions: deletions, insertions: insertions, updates: updates, initial: initial)
}
@@ -114,7 +121,7 @@ final class ChatMediaInputTrendingPane: ChatMediaInputPane {
private let controllerInteraction: ChatControllerInteraction
private let getItemIsPreviewed: (StickerPackItem) -> Bool
- private let listNode: ListView
+ let gridNode: GridNode
private var enqueuedTransitions: [TrendingPaneTransition] = []
private var validLayout: (CGSize, CGFloat)?
@@ -135,13 +142,13 @@ final class ChatMediaInputTrendingPane: ChatMediaInputPane {
self.controllerInteraction = controllerInteraction
self.getItemIsPreviewed = getItemIsPreviewed
- self.listNode = ListView()
+ self.gridNode = GridNode()
super.init()
- self.addSubnode(self.listNode)
+ self.addSubnode(self.gridNode)
- self.listNode.beganInteractiveDragging = { [weak self] in
+ self.gridNode.scrollingInitiated = { [weak self] in
self?.scrollingInitiated?()
}
}
@@ -224,28 +231,39 @@ final class ChatMediaInputTrendingPane: ChatMediaInputPane {
})
}
- override func updateLayout(size: CGSize, topInset: CGFloat, bottomInset: CGFloat, isExpanded: Bool, isVisible: Bool, transition: ContainedViewLayoutTransition) {
+ override func updateLayout(size: CGSize, topInset: CGFloat, bottomInset: CGFloat, isExpanded: Bool, isVisible: Bool, deviceMetrics: DeviceMetrics, transition: ContainedViewLayoutTransition) {
let hadValidLayout = self.validLayout != nil
self.validLayout = (size, bottomInset)
- transition.updateFrame(node: self.listNode, frame: CGRect(origin: CGPoint(), size: size))
-
- var duration: Double = 0.0
- var listViewCurve: ListViewAnimationCurve = .Default(duration: nil)
- switch transition {
- case .immediate:
- break
- case let .animated(animationDuration, animationCurve):
- duration = animationDuration
- switch animationCurve {
- case .easeInOut, .custom:
- listViewCurve = .Default(duration: duration)
- case .spring:
- listViewCurve = .Spring(duration: duration)
- }
+ let itemSize: CGSize
+ if case .tablet = deviceMetrics.type, size.width > 480.0 {
+ itemSize = CGSize(width: floor(size.width / 2.0), height: 128.0)
+ } else {
+ itemSize = CGSize(width: size.width, height: 128.0)
}
- self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous], scrollToItem: nil, updateSizeAndInsets: ListViewUpdateSizeAndInsets(size: size, insets: UIEdgeInsets(top: topInset, left: 0.0, bottom: bottomInset, right: 0.0), duration: duration, curve: listViewCurve), stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in })
+ self.gridNode.transaction(GridNodeTransaction(deleteItems: [], insertItems: [], updateItems: [], scrollToItem: nil, updateLayout: GridNodeUpdateLayout(layout: GridNodeLayout(size: size, insets: UIEdgeInsets(top: topInset, left: 0.0, bottom: bottomInset, right: 0.0), preloadSize: isVisible ? 300.0 : 0.0, type: .fixed(itemSize: itemSize, fillWidth: nil, lineSpacing: 0.0, itemSpacing: nil)), transition: transition), itemTransition: .immediate, stationaryItems: .none, updateFirstIndexInSectionOffset: nil), completion: { _ in })
+
+ transition.updateFrame(node: self.gridNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: size.width, height: size.height)))
+
+// transition.updateFrame(node: self.listNode, frame: CGRect(origin: CGPoint(), size: size))
+//
+// var duration: Double = 0.0
+// var listViewCurve: ListViewAnimationCurve = .Default(duration: nil)
+// switch transition {
+// case .immediate:
+// break
+// case let .animated(animationDuration, animationCurve):
+// duration = animationDuration
+// switch animationCurve {
+// case .easeInOut, .custom:
+// listViewCurve = .Default(duration: duration)
+// case .spring:
+// listViewCurve = .Spring(duration: duration)
+// }
+// }
+//
+// self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous], scrollToItem: nil, updateSizeAndInsets: ListViewUpdateSizeAndInsets(size: size, insets: UIEdgeInsets(top: topInset, left: 0.0, bottom: bottomInset, right: 0.0), duration: duration, curve: listViewCurve), stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in })
if !hadValidLayout {
while !self.enqueuedTransitions.isEmpty {
@@ -274,38 +292,28 @@ final class ChatMediaInputTrendingPane: ChatMediaInputPane {
if let transition = self.enqueuedTransitions.first {
self.enqueuedTransitions.remove(at: 0)
- var options = ListViewDeleteAndInsertOptions()
- if transition.initial {
- options.insert(.Synchronous)
- options.insert(.LowLatency)
- options.insert(.PreferSynchronousResourceLoading)
- } else {
- options.insert(.AnimateInsertion)
- }
-
- self.listNode.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: options, updateSizeAndInsets: nil, updateOpaqueState: nil, completion: { _ in
- })
+ let itemTransition: ContainedViewLayoutTransition = .immediate
+ self.gridNode.transaction(GridNodeTransaction(deleteItems: transition.deletions, insertItems: transition.insertions, updateItems: transition.updates, scrollToItem: nil, updateLayout: nil, itemTransition: itemTransition, stationaryItems: .none, updateFirstIndexInSectionOffset: nil, synchronousLoads: transition.initial), completion: { _ in })
}
}
func itemAt(point: CGPoint) -> (ASDisplayNode, StickerPackItem)? {
- let localPoint = self.view.convert(point, to: self.listNode.view)
- var resultNode: MediaInputPaneTrendingItemNode?
- self.listNode.forEachItemNode { itemNode in
- if itemNode.frame.contains(localPoint), let itemNode = itemNode as? MediaInputPaneTrendingItemNode {
+ let localPoint = self.view.convert(point, to: self.gridNode.view)
+ var resultNode: StickerPaneSearchGlobalItemNode?
+ self.gridNode.forEachItemNode { itemNode in
+ if itemNode.frame.contains(localPoint), let itemNode = itemNode as? StickerPaneSearchGlobalItemNode {
resultNode = itemNode
}
}
if let resultNode = resultNode {
- return resultNode.itemAt(point: self.listNode.view.convert(localPoint, to: resultNode.view))
+ return resultNode.itemAt(point: self.gridNode.view.convert(localPoint, to: resultNode.view))
}
-
return nil
}
func updatePreviewing(animated: Bool) {
- self.listNode.forEachItemNode { itemNode in
- if let itemNode = itemNode as? MediaInputPaneTrendingItemNode {
+ self.gridNode.forEachItemNode { itemNode in
+ if let itemNode = itemNode as? StickerPaneSearchGlobalItemNode {
itemNode.updatePreviewing(animated: animated)
}
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift
index 5ad94121a6..0d88b60bc6 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift
@@ -107,7 +107,7 @@ private class ChatMessageHeartbeatHaptic {
}
class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
- private let contextSourceNode: ContextContentContainingNode
+ private let contextSourceNode: ContextExtractedContentContainingNode
let imageNode: TransformImageNode
private let animationNode: AnimatedStickerNode
private var didSetUpAnimationNode = false
@@ -138,7 +138,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
private var currentSwipeToReplyTranslation: CGFloat = 0.0
required init() {
- self.contextSourceNode = ContextContentContainingNode()
+ self.contextSourceNode = ContextExtractedContentContainingNode()
self.imageNode = TransformImageNode()
self.animationNode = AnimatedStickerNode()
self.dateAndStatusNode = ChatMessageDateAndStatusNode()
@@ -1063,7 +1063,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
}
- override func getMessageContextSourceNode() -> ContextContentContainingNode? {
+ override func getMessageContextSourceNode() -> ContextExtractedContentContainingNode? {
return self.contextSourceNode
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift
index ff139a7c03..2a474aa1ae 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift
@@ -147,7 +147,7 @@ private enum ContentNodeOperation {
}
class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode {
- private let contextSourceNode: ContextContentContainingNode
+ private let contextSourceNode: ContextExtractedContentContainingNode
private let backgroundWallpaperNode: ChatMessageBubbleBackdrop
private let backgroundNode: ChatMessageBackground
private var transitionClippingNode: ASDisplayNode?
@@ -198,7 +198,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
}
required init() {
- self.contextSourceNode = ContextContentContainingNode()
+ self.contextSourceNode = ContextExtractedContentContainingNode()
self.backgroundWallpaperNode = ChatMessageBubbleBackdrop()
self.backgroundNode = ChatMessageBackground()
@@ -277,7 +277,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
if let subnodes = self.subnodes {
for node in subnodes {
- if let contextNode = node as? ContextContentContainingNode {
+ if let contextNode = node as? ContextExtractedContentContainingNode {
if let contextSubnodes = contextNode.contentNode.subnodes {
for contextSubnode in contextSubnodes {
if contextSubnode !== self.accessoryItemNode {
@@ -382,7 +382,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
self.tapRecognizer = recognizer
self.view.addGestureRecognizer(recognizer)
- let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:)))
+ /*let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:)))
replyRecognizer.shouldBegin = { [weak self] in
if let strongSelf = self, let item = strongSelf.item {
if strongSelf.selectionNode != nil {
@@ -404,9 +404,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
}
return false
}
- self.view.addGestureRecognizer(replyRecognizer)
+ self.view.addGestureRecognizer(replyRecognizer)*/
- /*let reactionRecognizer = ReactionSwipeGestureRecognizer(target: nil, action: nil)
+ let reactionRecognizer = ReactionSwipeGestureRecognizer(target: nil, action: nil)
self.reactionRecognizer = reactionRecognizer
reactionRecognizer.availableReactions = { [weak self] in
guard let strongSelf = self, let item = strongSelf.item, !item.presentationData.isPreview && !Namespaces.Message.allScheduled.contains(item.message.id.namespace) else {
@@ -437,7 +437,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
var reactionItems: [ReactionGestureItem] = []
for (value, text, name) in reactions {
- if let path = getAppBundle().path(forResource: name, ofType: "tgs", inDirectory: "BuiltinReactions") {
+ if let path = getAppBundle().path(forResource: name, ofType: "tgs") {
reactionItems.append(.reaction(value: value, text: text, path: path))
}
}
@@ -551,7 +551,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
}
}
}
- self.view.addGestureRecognizer(reactionRecognizer)*/
+ self.view.addGestureRecognizer(reactionRecognizer)
}
override func asyncLayout() -> (_ item: ChatMessageItem, _ params: ListViewItemLayoutParams, _ mergedTop: ChatMessageMerge, _ mergedBottom: ChatMessageMerge, _ dateHeaderAtBottom: Bool) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, Bool) -> Void) {
@@ -2730,7 +2730,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
}
@objc func swipeToReplyGesture(_ recognizer: ChatSwipeToReplyRecognizer) {
- switch recognizer.state {
+ /*switch recognizer.state {
case .began:
self.currentSwipeToReplyTranslation = 0.0
if self.swipeToReplyFeedback == nil {
@@ -2789,7 +2789,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
}
default:
break
- }
+ }*/
}
private var absoluteRect: (CGRect, CGSize)?
@@ -2822,7 +2822,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
self.backgroundWallpaperNode.offsetSpring(value: value, duration: duration, damping: damping)
}
- override func getMessageContextSourceNode() -> ContextContentContainingNode? {
+ override func getMessageContextSourceNode() -> ContextExtractedContentContainingNode? {
return self.contextSourceNode
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageContextControllerContentSource.swift b/submodules/TelegramUI/TelegramUI/ChatMessageContextControllerContentSource.swift
index e7014b23ac..93050d570f 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMessageContextControllerContentSource.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMessageContextControllerContentSource.swift
@@ -4,7 +4,7 @@ import Display
import ContextUI
import Postbox
-final class ChatMessageContextControllerContentSource: ContextControllerContentSource {
+final class ChatMessageContextExtractedContentSource: ContextExtractedContentSource {
private weak var chatNode: ChatControllerNode?
private let message: Message
diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift
index e1e3ddaed8..f8d31ceec8 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift
@@ -18,7 +18,7 @@ private let inlineBotPrefixFont = Font.regular(14.0)
private let inlineBotNameFont = nameFont
class ChatMessageInstantVideoItemNode: ChatMessageItemView {
- private let contextSourceNode: ContextContentContainingNode
+ private let contextSourceNode: ContextExtractedContentContainingNode
private let interactiveVideoNode: ChatMessageInteractiveInstantVideoNode
private var selectionNode: ChatMessageSelectionNode?
@@ -54,7 +54,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView {
}
required init() {
- self.contextSourceNode = ContextContentContainingNode()
+ self.contextSourceNode = ContextExtractedContentContainingNode()
self.interactiveVideoNode = ChatMessageInteractiveInstantVideoNode()
super.init(layerBacked: false)
@@ -830,7 +830,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView {
return self.interactiveVideoNode.playMediaWithSound()
}
- override func getMessageContextSourceNode() -> ContextContentContainingNode? {
+ override func getMessageContextSourceNode() -> ContextExtractedContentContainingNode? {
return self.contextSourceNode
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift
index 4d23ae3178..b01bd7c434 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift
@@ -832,7 +832,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
}
strongSelf.fetchDisposable.set(visibilityAwareFetchSignal.start())
}
- } else if case .prefetch = automaticDownload, message.id.namespace != Namespaces.Message.SecretIncoming && message.id.namespace != Namespaces.Message.Local {
+ } else if case .prefetch = automaticDownload, message.id.namespace != Namespaces.Message.SecretIncoming /*&& message.id.namespace != Namespaces.Message.Local*/ {
if let file = media as? TelegramMediaFile {
let fetchSignal = preloadVideoResource(postbox: context.account.postbox, resourceReference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference(file.resource), duration: 4.0)
let visibilityAwareFetchSignal = strongSelf.visibilityPromise.get()
diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift
index 592d3a429e..f4a92996bb 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift
@@ -31,6 +31,7 @@ struct ChatMessageItemBubbleLayoutConstants {
let minimumSize: CGSize
let contentInsets: UIEdgeInsets
let borderInset: CGFloat
+ let strokeInsets: UIEdgeInsets
}
struct ChatMessageItemTextLayoutConstants {
@@ -81,7 +82,7 @@ struct ChatMessageItemLayoutConstants {
self.avatarDiameter = 37.0
self.timestampHeaderHeight = 34.0
- self.bubble = ChatMessageItemBubbleLayoutConstants(edgeInset: 4.0, defaultSpacing: 2.0 + UIScreenPixel, mergedSpacing: 1.0, maximumWidthFill: ChatMessageItemWidthFill(compactInset: 36.0, compactWidthBoundary: 500.0, freeMaximumFillFactor: 0.85), minimumSize: CGSize(width: 40.0, height: 35.0), contentInsets: UIEdgeInsets(top: 0.0, left: 6.0, bottom: 0.0, right: 0.0), borderInset: UIScreenPixel)
+ self.bubble = ChatMessageItemBubbleLayoutConstants(edgeInset: 4.0, defaultSpacing: 2.0 + UIScreenPixel, mergedSpacing: 1.0, maximumWidthFill: ChatMessageItemWidthFill(compactInset: 36.0, compactWidthBoundary: 500.0, freeMaximumFillFactor: 0.85), minimumSize: CGSize(width: 40.0, height: 35.0), contentInsets: UIEdgeInsets(top: 0.0, left: 6.0, bottom: 0.0, right: 0.0), borderInset: UIScreenPixel, strokeInsets: UIEdgeInsets(top: 1.0 - UIScreenPixel, left: 1.0 - UIScreenPixel, bottom: 1.0 - UIScreenPixel, right: 1.0 - UIScreenPixel))
self.text = ChatMessageItemTextLayoutConstants(bubbleInsets: UIEdgeInsets(top: 6.0 + UIScreenPixel, left: 12.0, bottom: 6.0 - UIScreenPixel, right: 12.0))
self.image = ChatMessageItemImageLayoutConstants(bubbleInsets: UIEdgeInsets(top: 1.0 + UIScreenPixel, left: 1.0 + UIScreenPixel, bottom: 1.0 + UIScreenPixel, right: 1.0 + UIScreenPixel), statusInsets: UIEdgeInsets(top: 0.0, left: 0.0, bottom: 6.0, right: 6.0), defaultCornerRadius: 17.0, mergedCornerRadius: 5.0, contentMergedCornerRadius: 5.0, maxDimensions: CGSize(width: 300.0, height: 300.0), minDimensions: CGSize(width: 170.0, height: 74.0))
self.video = ChatMessageItemVideoLayoutConstants(maxHorizontalHeight: 250.0, maxVerticalHeight: 360.0)
@@ -679,7 +680,7 @@ public class ChatMessageItemView: ListViewItemNode {
return nil
}
- func getMessageContextSourceNode() -> ContextContentContainingNode? {
+ func getMessageContextSourceNode() -> ContextExtractedContentContainingNode? {
return nil
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift
index 5f1ee57306..4c0b023338 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift
@@ -6,6 +6,7 @@ import SwiftSignalKit
import Postbox
import TelegramCore
import TelegramUIPreferences
+import TelegramPresentationData
import AccountContext
import GridMessageSelectionNode
@@ -115,7 +116,17 @@ class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode {
switch preparePosition {
case .linear:
if case .color = item.presentationData.theme.wallpaper {
- bubbleInsets = UIEdgeInsets()
+ let colors: PresentationThemeBubbleColorComponents
+ if item.message.effectivelyIncoming(item.context.account.peerId) {
+ colors = item.presentationData.theme.theme.chat.message.incoming.bubble.withoutWallpaper
+ } else {
+ colors = item.presentationData.theme.theme.chat.message.outgoing.bubble.withoutWallpaper
+ }
+ if colors.fill == colors.stroke {
+ bubbleInsets = UIEdgeInsets()
+ } else {
+ bubbleInsets = layoutConstants.bubble.strokeInsets
+ }
} else {
bubbleInsets = layoutConstants.image.bubbleInsets
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift
index f2ff3a5dcb..6218a3bc30 100644
--- a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift
@@ -16,7 +16,7 @@ private let inlineBotPrefixFont = Font.regular(14.0)
private let inlineBotNameFont = nameFont
class ChatMessageStickerItemNode: ChatMessageItemView {
- private let contextSourceNode: ContextContentContainingNode
+ private let contextSourceNode: ContextExtractedContentContainingNode
let imageNode: TransformImageNode
var textNode: TextNode?
@@ -42,7 +42,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
private var currentSwipeToReplyTranslation: CGFloat = 0.0
required init() {
- self.contextSourceNode = ContextContentContainingNode()
+ self.contextSourceNode = ContextExtractedContentContainingNode()
self.imageNode = TransformImageNode()
self.dateAndStatusNode = ChatMessageDateAndStatusNode()
@@ -899,7 +899,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
}
- override func getMessageContextSourceNode() -> ContextContentContainingNode? {
+ override func getMessageContextSourceNode() -> ContextExtractedContentContainingNode? {
return self.contextSourceNode
}
diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift
index 21e4515c16..946953d6d7 100644
--- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift
@@ -192,6 +192,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)
+ }, openMessageContextActions: { _, _, _, _ 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
diff --git a/submodules/TelegramUI/TelegramUI/ChatTitleView.swift b/submodules/TelegramUI/TelegramUI/ChatTitleView.swift
index 90f968a5e1..cd9c0c1077 100644
--- a/submodules/TelegramUI/TelegramUI/ChatTitleView.swift
+++ b/submodules/TelegramUI/TelegramUI/ChatTitleView.swift
@@ -666,7 +666,6 @@ final class ChatTitleView: UIView, NavigationBarTitleView {
func animateLayoutTransition() {
UIView.transition(with: self, duration: 0.25, options: [.transitionCrossDissolve], animations: {
-
}, completion: nil)
}
}
diff --git a/submodules/TelegramUI/TelegramUI/FetchVideoMediaResource.swift b/submodules/TelegramUI/TelegramUI/FetchVideoMediaResource.swift
index 75f16189fc..7f12ab1f79 100644
--- a/submodules/TelegramUI/TelegramUI/FetchVideoMediaResource.swift
+++ b/submodules/TelegramUI/TelegramUI/FetchVideoMediaResource.swift
@@ -73,6 +73,151 @@ struct VideoConversionConfiguration {
}
}
+private final class FetchVideoLibraryMediaResourceItem {
+ let priority: MediaBoxFetchPriority
+ let signal: Signal
+ let next: (MediaResourceDataFetchResult) -> Void
+ let error: (MediaResourceDataFetchError) -> Void
+ let completion: () -> Void
+ var isActive: Bool = false
+ var disposable: Disposable?
+
+ init(priority: MediaBoxFetchPriority, signal: Signal, next: @escaping (MediaResourceDataFetchResult) -> Void, error: @escaping (MediaResourceDataFetchError) -> Void, completion: @escaping () -> Void) {
+ self.priority = priority
+ self.signal = signal
+ self.next = next
+ self.error = error
+ self.completion = completion
+ }
+
+ deinit {
+ self.disposable?.dispose()
+ }
+}
+
+private let fetchVideoLimit: Int = 2
+
+private final class FetchVideoLibraryMediaResourceContextImpl {
+ private let queue: Queue
+ var items: [FetchVideoLibraryMediaResourceItem] = []
+
+ init(queue: Queue) {
+ self.queue = queue
+ }
+
+ func add(priority: MediaBoxFetchPriority, signal: Signal, next: @escaping (MediaResourceDataFetchResult) -> Void, error: @escaping (MediaResourceDataFetchError) -> Void, completion: @escaping () -> Void) -> Disposable {
+ let queue = self.queue
+
+ let item = FetchVideoLibraryMediaResourceItem(priority: priority, signal: signal, next: next, error: error, completion: completion)
+ self.items.append(item)
+
+ self.update()
+
+ return ActionDisposable { [weak self, weak item] in
+ queue.async {
+ guard let strongSelf = self, let item = item else {
+ return
+ }
+ for i in 0 ..< strongSelf.items.count {
+ if strongSelf.items[i] === item {
+ strongSelf.items[i].disposable?.dispose()
+ strongSelf.items.remove(at: i)
+ strongSelf.update()
+ break
+ }
+ }
+ }
+ }
+ }
+
+ func update() {
+ let queue = self.queue
+
+ var activeCount = 0
+ for item in self.items {
+ if item.isActive {
+ activeCount += 1
+ }
+ }
+
+ while activeCount < fetchVideoLimit {
+ var maxPriorityIndex: Int?
+ for i in 0 ..< self.items.count {
+ if !self.items[i].isActive {
+ if let maxPriorityIndexValue = maxPriorityIndex {
+ if self.items[i].priority.rawValue > self.items[maxPriorityIndexValue].priority.rawValue {
+ maxPriorityIndex = i
+ }
+ } else {
+ maxPriorityIndex = i
+ }
+ }
+ }
+ if let maxPriorityIndex = maxPriorityIndex {
+ let item = self.items[maxPriorityIndex]
+ item.isActive = true
+ activeCount += 1
+ assert(item.disposable == nil)
+ item.disposable = self.items[maxPriorityIndex].signal.start(next: { [weak item] value in
+ queue.async {
+ item?.next(value)
+ }
+ }, error: { [weak item] value in
+ queue.async {
+ item?.error(value)
+ }
+ }, completed: { [weak self, weak item] in
+ queue.async {
+ guard let strongSelf = self, let item = item else {
+ return
+ }
+ for i in 0 ..< strongSelf.items.count {
+ if strongSelf.items[i] === item {
+ strongSelf.items.remove(at: i)
+ item.completion()
+ strongSelf.update()
+ break
+ }
+ }
+ }
+ })
+ } else {
+ break
+ }
+ }
+ }
+}
+
+private final class FetchVideoLibraryMediaResourceContext {
+ private let queue = Queue()
+ private let impl: QueueLocalObject
+
+ init() {
+ let queue = self.queue
+ self.impl = QueueLocalObject(queue: queue, generate: {
+ return FetchVideoLibraryMediaResourceContextImpl(queue: queue)
+ })
+ }
+
+ func wrap(priority: MediaBoxFetchPriority, signal: Signal) -> Signal {
+ return Signal { subscriber in
+ let disposable = MetaDisposable()
+ self.impl.with { impl in
+ disposable.set(impl.add(priority: priority, signal: signal, next: { value in
+ subscriber.putNext(value)
+ }, error: { error in
+ subscriber.putError(error)
+ }, completion: {
+ subscriber.putCompletion()
+ }))
+ }
+ return disposable
+ }
+ }
+}
+
+private let throttlingContext = FetchVideoLibraryMediaResourceContext()
+
public func fetchVideoLibraryMediaResource(postbox: Postbox, resource: VideoLibraryMediaResource) -> Signal {
return postbox.preferencesView(keys: [PreferencesKeys.appConfiguration])
|> take(1)
@@ -82,9 +227,8 @@ public func fetchVideoLibraryMediaResource(postbox: Postbox, resource: VideoLibr
|> introduceError(MediaResourceDataFetchError.self)
|> mapToSignal { appConfiguration -> Signal in
let config = VideoConversionConfiguration.with(appConfiguration: appConfiguration)
- return Signal { subscriber in
+ let signal = Signal { subscriber in
subscriber.putNext(.reset)
-
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [resource.localIdentifier], options: nil)
var requestId: PHImageRequestID?
let disposable = MetaDisposable()
@@ -189,6 +333,7 @@ public func fetchVideoLibraryMediaResource(postbox: Postbox, resource: VideoLibr
disposable.dispose()
}
}
+ return throttlingContext.wrap(priority: .default, signal: signal)
}
}
@@ -201,7 +346,7 @@ func fetchLocalFileVideoMediaResource(postbox: Postbox, resource: LocalFileVideo
|> introduceError(MediaResourceDataFetchError.self)
|> mapToSignal { appConfiguration -> Signal in
let config = VideoConversionConfiguration.with(appConfiguration: appConfiguration)
- return Signal { subscriber in
+ let signal = Signal { subscriber in
subscriber.putNext(.reset)
let avAsset = AVURLAsset(url: URL(fileURLWithPath: resource.path))
@@ -267,6 +412,7 @@ func fetchLocalFileVideoMediaResource(postbox: Postbox, resource: LocalFileVideo
disposable.dispose()
}
}
+ return throttlingContext.wrap(priority: .default, signal: signal)
}
}
diff --git a/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift
index 99b34cd924..2ae027995f 100644
--- a/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift
+++ b/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift
@@ -197,7 +197,7 @@ final class GifPaneSearchContentNode: ASDisplayNode & PaneSearchContentNode {
}
}
- func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, inputHeight: CGFloat, transition: ContainedViewLayoutTransition) {
+ func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, inputHeight: CGFloat, deviceMetrics: DeviceMetrics, transition: ContainedViewLayoutTransition) {
let firstLayout = self.validLayout == nil
self.validLayout = size
diff --git a/submodules/TelegramUI/TelegramUI/GridMessageItem.swift b/submodules/TelegramUI/TelegramUI/GridMessageItem.swift
index 0f8326e261..485dd4c83d 100644
--- a/submodules/TelegramUI/TelegramUI/GridMessageItem.swift
+++ b/submodules/TelegramUI/TelegramUI/GridMessageItem.swift
@@ -11,6 +11,7 @@ import AccountContext
import RadialStatusNode
import PhotoResources
import GridMessageSelectionNode
+import ContextUI
private func mediaForMessage(_ message: Message) -> Media? {
for media in message.media {
@@ -145,6 +146,7 @@ final class GridMessageItem: GridItem {
final class GridMessageItemNode: GridItemNode {
private var currentState: (AccountContext, Media, CGSize)?
+ private let containerNode: ContextControllerSourceNode
private let imageNode: TransformImageNode
private(set) var messageId: MessageId?
private var item: GridMessageItem?
@@ -159,6 +161,7 @@ final class GridMessageItemNode: GridItemNode {
private var resourceStatus: MediaResourceStatus?
override init() {
+ self.containerNode = ContextControllerSourceNode()
self.imageNode = TransformImageNode()
self.statusNode = RadialStatusNode(backgroundNodeColor: UIColor(white: 0.0, alpha: 0.6))
let progressDiameter: CGFloat = 40.0
@@ -170,8 +173,17 @@ final class GridMessageItemNode: GridItemNode {
super.init()
- self.addSubnode(self.imageNode)
- self.addSubnode(self.mediaBadgeNode)
+ self.addSubnode(self.containerNode)
+ self.containerNode.addSubnode(self.imageNode)
+ self.containerNode.addSubnode(self.mediaBadgeNode)
+
+ self.containerNode.activated = { [weak self] gesture in
+ guard let strongSelf = self, let item = strongSelf.item, let controllerInteraction = strongSelf.controllerInteraction else {
+ gesture.cancel()
+ return
+ }
+ controllerInteraction.openMessageContextActions(item.message, strongSelf.containerNode, strongSelf.containerNode.bounds, gesture)
+ }
}
deinit {
@@ -302,6 +314,9 @@ final class GridMessageItemNode: GridItemNode {
super.layout()
let imageFrame = self.bounds
+
+ self.containerNode.frame = imageFrame
+
self.imageNode.frame = imageFrame
if let item = self.item, let (_, _, mediaDimensions) = self.currentState {
@@ -336,7 +351,7 @@ final class GridMessageItemNode: GridItemNode {
})
selectionNode.frame = CGRect(origin: CGPoint(), size: self.bounds.size)
- self.addSubnode(selectionNode)
+ self.containerNode.addSubnode(selectionNode)
self.selectionNode = selectionNode
selectionNode.updateSelected(selected, animated: false)
if animated {
@@ -437,7 +452,8 @@ final class GridMessageItemNode: GridItemNode {
let _ = controllerInteraction.openMessage(message, .default)
}
case .longTap:
- controllerInteraction.openMessageContextMenu(message, false, self, self.bounds, nil)
+ break
+ //controllerInteraction.openMessageContextMenu(message, false, self, self.bounds, nil)
default:
break
}
diff --git a/submodules/TelegramUI/TelegramUI/MultiplexedVideoNode.swift b/submodules/TelegramUI/TelegramUI/MultiplexedVideoNode.swift
index fb03be4a5f..16e897f26e 100644
--- a/submodules/TelegramUI/TelegramUI/MultiplexedVideoNode.swift
+++ b/submodules/TelegramUI/TelegramUI/MultiplexedVideoNode.swift
@@ -51,6 +51,12 @@ final class MultiplexedVideoNode: ASScrollNode, UIScrollViewDelegate {
}
}
+ var idealHeight: CGFloat = 93.0 {
+ didSet {
+ self.setNeedsLayout()
+ }
+ }
+
var files: [FileMediaReference] = [] {
didSet {
self.updateVisibleItems()
@@ -341,7 +347,7 @@ final class MultiplexedVideoNode: ASScrollNode, UIScrollViewDelegate {
if !drawableSize.width.isZero {
var displayItems: [VisibleVideoItem] = []
- let idealHeight: CGFloat = 93.0
+ let idealHeight = self.idealHeight
var weights: [Int] = []
var totalItemSize: CGFloat = 0.0
diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift
index 5e3b95c6d6..ae30637840 100644
--- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift
+++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift
@@ -63,6 +63,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu
}, openPeer: { _, _, _ in
}, openPeerMention: { _ in
}, openMessageContextMenu: { _, _, _, _, _ in
+ }, openMessageContextActions: { _, _, _, _ in
}, navigateToMessage: { _, _ in
}, clickThroughMessage: {
}, toggleMessagesSelection: { _, _ in
diff --git a/submodules/TelegramUI/TelegramUI/PaneSearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/PaneSearchContainerNode.swift
index ddd7ae64ca..ece3b008e0 100644
--- a/submodules/TelegramUI/TelegramUI/PaneSearchContainerNode.swift
+++ b/submodules/TelegramUI/TelegramUI/PaneSearchContainerNode.swift
@@ -17,7 +17,7 @@ protocol PaneSearchContentNode {
func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings)
func updateText(_ text: String, languageCode: String?)
- func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, inputHeight: CGFloat, transition: ContainedViewLayoutTransition)
+ func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, inputHeight: CGFloat, deviceMetrics: DeviceMetrics, transition: ContainedViewLayoutTransition)
func animateIn(additivePosition: CGFloat, transition: ContainedViewLayoutTransition)
func animateOut(transition: ContainedViewLayoutTransition)
@@ -103,7 +103,7 @@ final class PaneSearchContainerNode: ASDisplayNode {
return self.contentNode.itemAt(point: CGPoint(x: point.x, y: point.y - searchBarHeight))
}
- func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, inputHeight: CGFloat, transition: ContainedViewLayoutTransition) {
+ func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, inputHeight: CGFloat, deviceMetrics: DeviceMetrics, transition: ContainedViewLayoutTransition) {
self.validLayout = size
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size))
@@ -113,7 +113,7 @@ final class PaneSearchContainerNode: ASDisplayNode {
let contentFrame = CGRect(origin: CGPoint(x: leftInset, y: searchBarHeight), size: CGSize(width: size.width - leftInset - rightInset, height: size.height - searchBarHeight))
transition.updateFrame(node: self.contentNode, frame: contentFrame)
- self.contentNode.updateLayout(size: contentFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, transition: transition)
+ self.contentNode.updateLayout(size: contentFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics, transition: transition)
}
func deactivate() {
diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift
index ae18dd209a..99b8942f8d 100644
--- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift
+++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift
@@ -14,6 +14,7 @@ import AccountContext
import ShareController
import OpenInExternalAppUI
import PeerInfoUI
+import ContextUI
public class PeerMediaCollectionController: TelegramBaseController {
private var validLayout: ContainerViewLayout?
@@ -156,6 +157,105 @@ public class PeerMediaCollectionController: TelegramBaseController {
strongSelf.present(actionSheet, in: .window(.root))
}
}
+ }, openMessageContextActions: { [weak self] message, node, rect, gesture in
+ guard let strongSelf = self else {
+ gesture?.cancel()
+ return
+ }
+ if let previewData = chatMessagePreviewControllerData(context: strongSelf.context, message: message, standalone: false, reverseMessageGalleryOrder: false, navigationController: strongSelf.navigationController as? NavigationController) {
+ let context = strongSelf.context
+ let strings = strongSelf.presentationData.strings
+ let items = chatAvailableMessageActionsImpl(postbox: strongSelf.context.account.postbox, accountPeerId: strongSelf.context.account.peerId, messageIds: [message.id])
+ |> map { actions -> [ContextMenuItem] in
+ var items: [ContextMenuItem] = []
+
+ items.append(.action(ContextMenuActionItem(text: strings.SharedMedia_ViewInChat, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/GoToMessage"), color: theme.contextMenu.primaryColor) }, action: { c, f in
+ c.dismiss(completion: {
+ if let strongSelf = self, let navigationController = strongSelf.navigationController as? NavigationController {
+ strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(strongSelf.peerId), subject: .message(message.id)))
+ }
+ })
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: strings.Conversation_ContextMenuForward, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Forward"), color: theme.contextMenu.primaryColor) }, action: { c, f in
+ c.dismiss(completion: {
+ if let strongSelf = self {
+ strongSelf.forwardMessages([message.id])
+ }
+ })
+ })))
+
+ if actions.options.contains(.deleteLocally) || actions.options.contains(.deleteGlobally) {
+ items.append(.action(ContextMenuActionItem(text: strings.Conversation_ContextMenuDelete, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { c, f in
+ c.setItems(context.account.postbox.transaction { transaction -> [ContextMenuItem] in
+ var items: [ContextMenuItem] = []
+ let messageIds = [message.id]
+
+ if let peer = transaction.getPeer(message.id.peerId) {
+ var personalPeerName: String?
+ var isChannel = false
+ if let user = peer as? TelegramUser {
+ personalPeerName = user.compactDisplayTitle
+ } else if let channel = peer as? TelegramChannel, case .broadcast = channel.info {
+ isChannel = true
+ }
+
+ if actions.options.contains(.deleteGlobally) {
+ let globalTitle: String
+ if isChannel {
+ globalTitle = strongSelf.presentationData.strings.Conversation_DeleteMessagesForMe
+ } else if let personalPeerName = personalPeerName {
+ globalTitle = strongSelf.presentationData.strings.Conversation_DeleteMessagesFor(personalPeerName).0
+ } else {
+ globalTitle = strongSelf.presentationData.strings.Conversation_DeleteMessagesForEveryone
+ }
+ items.append(.action(ContextMenuActionItem(text: globalTitle, textColor: .destructive, icon: { _ in nil }, action: { c, f in
+ c.dismiss(completion: {
+ if let strongSelf = self {
+ strongSelf.updateInterfaceState(animated: true, { $0.withoutSelectionState() })
+ let _ = deleteMessagesInteractively(postbox: strongSelf.context.account.postbox, messageIds: Array(messageIds), type: .forEveryone).start()
+ }
+ })
+ })))
+ }
+
+ if actions.options.contains(.deleteLocally) {
+ var localOptionText = strongSelf.presentationData.strings.Conversation_DeleteMessagesForMe
+ if strongSelf.context.account.peerId == strongSelf.peerId {
+ if messageIds.count == 1 {
+ localOptionText = strongSelf.presentationData.strings.Conversation_Moderate_Delete
+ } else {
+ localOptionText = strongSelf.presentationData.strings.Conversation_DeleteManyMessages
+ }
+ }
+ items.append(.action(ContextMenuActionItem(text: localOptionText, textColor: .destructive, icon: { _ in nil }, action: { c, f in
+ c.dismiss(completion: {
+ if let strongSelf = self {
+ strongSelf.updateInterfaceState(animated: true, { $0.withoutSelectionState() })
+ let _ = deleteMessagesInteractively(postbox: strongSelf.context.account.postbox, messageIds: Array(messageIds), type: .forLocalPeer).start()
+ }
+ })
+ })))
+ }
+ }
+
+ return items
+ })
+ })))
+ }
+
+ return items
+ }
+
+ switch previewData {
+ case let .gallery(gallery):
+ gallery.setHintWillBePresentedInPreviewingContext(true)
+ let contextController = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: .controller(ContextControllerContentSourceImpl(controller: gallery, sourceNode: node)), items: items, reactionItems: [], gesture: gesture)
+ strongSelf.presentInGlobalOverlay(contextController)
+ case .instantPage:
+ break
+ }
+ }
}, navigateToMessage: { [weak self] fromId, id in
if let strongSelf = self, strongSelf.isNodeLoaded {
if id.peerId == strongSelf.peerId {
@@ -786,3 +886,24 @@ public class PeerMediaCollectionController: TelegramBaseController {
}
}
}
+
+private final class ContextControllerContentSourceImpl: ContextControllerContentSource {
+ let controller: ViewController
+ weak var sourceNode: ASDisplayNode?
+
+ init(controller: ViewController, sourceNode: ASDisplayNode?) {
+ self.controller = controller
+ self.sourceNode = sourceNode
+ }
+
+ func transitionInfo() -> ContextControllerTakeControllerInfo? {
+ let sourceNode = self.sourceNode
+ return ContextControllerTakeControllerInfo(contentAreaInScreenSpace: CGRect(origin: CGPoint(), size: CGSize(width: 10.0, height: 10.0)), sourceNode: { [weak sourceNode] in
+ if let sourceNode = sourceNode {
+ return (sourceNode, sourceNode.bounds)
+ } else {
+ return nil
+ }
+ })
+ }
+}
diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionSectionsNode.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionSectionsNode.swift
index 6958bdc7cc..1aee8717c2 100644
--- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionSectionsNode.swift
+++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionSectionsNode.swift
@@ -4,12 +4,13 @@ import AsyncDisplayKit
import Display
import TelegramCore
import TelegramPresentationData
+import SegmentedControlNode
final class PeerMediaCollectionSectionsNode: ASDisplayNode {
private var theme: PresentationTheme
private var strings: PresentationStrings
- private let segmentedControl: UISegmentedControl
+ private let segmentedControlNode: SegmentedControlNode
private let separatorNode: ASDisplayNode
var indexUpdated: ((Int) -> Void)?
@@ -17,15 +18,14 @@ final class PeerMediaCollectionSectionsNode: ASDisplayNode {
init(theme: PresentationTheme, strings: PresentationStrings) {
self.theme = theme
self.strings = strings
-
- self.segmentedControl = UISegmentedControl(items: [
+
+ let items = [
strings.SharedMedia_CategoryMedia,
strings.SharedMedia_CategoryDocs,
strings.SharedMedia_CategoryLinks,
strings.SharedMedia_CategoryOther
- ])
- self.segmentedControl.selectedSegmentIndex = 0
- self.segmentedControl.tintColor = theme.rootController.navigationBar.accentTextColor
+ ]
+ self.segmentedControlNode = SegmentedControlNode(theme: SegmentedControlTheme(theme: theme), items: items.map { SegmentedControlItem(title: $0) }, selectedIndex: 0)
self.separatorNode = ASDisplayNode()
self.separatorNode.isLayerBacked = true
@@ -34,22 +34,22 @@ final class PeerMediaCollectionSectionsNode: ASDisplayNode {
super.init()
- self.addSubnode(self.separatorNode)
- self.view.addSubview(self.segmentedControl)
-
self.backgroundColor = self.theme.rootController.navigationBar.backgroundColor
- self.segmentedControl.addTarget(self, action: #selector(indexChanged), for: .valueChanged)
+ self.segmentedControlNode.selectedIndexChanged = { [weak self] index in
+ self?.indexUpdated?(index)
+ }
+
+ self.addSubnode(self.separatorNode)
+ self.addSubnode(self.segmentedControlNode)
}
func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, additionalInset: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: PeerMediaCollectionInterfaceState) -> CGFloat {
let panelHeight: CGFloat = 39.0 + additionalInset
-
- let controlHeight: CGFloat = 29.0
let sideInset: CGFloat = 8.0
- transition.animateView {
- self.segmentedControl.frame = CGRect(origin: CGPoint(x: sideInset + leftInset, y: panelHeight - 11.0 - controlHeight), size: CGSize(width: width - sideInset * 2.0 - leftInset - rightInset, height: controlHeight))
- }
+
+ let controlSize = self.segmentedControlNode.updateLayout(.stretchToFill(width: width - sideInset * 2.0 - leftInset - rightInset), transition: transition)
+ transition.updateFrame(node: self.segmentedControlNode, frame: CGRect(origin: CGPoint(x: sideInset + leftInset, y: panelHeight - 8.0 - controlSize.height), size: controlSize))
transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelHeight - UIScreenPixel), size: CGSize(width: width, height: UIScreenPixel)))
@@ -57,13 +57,9 @@ final class PeerMediaCollectionSectionsNode: ASDisplayNode {
self.theme = interfaceState.theme
self.separatorNode.backgroundColor = self.theme.rootController.navigationBar.separatorColor
self.backgroundColor = self.theme.rootController.navigationBar.backgroundColor
- self.segmentedControl.tintColor = theme.rootController.navigationBar.accentTextColor
+ self.segmentedControlNode.updateTheme(SegmentedControlTheme(theme: self.theme))
}
return panelHeight
}
-
- @objc func indexChanged() {
- self.indexUpdated?(self.segmentedControl.selectedSegmentIndex)
- }
}
diff --git a/submodules/TelegramUI/TelegramUI/PeerSelectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/PeerSelectionControllerNode.swift
index 4a44cd0267..c9b216e987 100644
--- a/submodules/TelegramUI/TelegramUI/PeerSelectionControllerNode.swift
+++ b/submodules/TelegramUI/TelegramUI/PeerSelectionControllerNode.swift
@@ -11,6 +11,7 @@ import SearchBarNode
import SearchUI
import ContactListUI
import ChatListUI
+import SegmentedControlNode
final class PeerSelectionControllerNode: ASDisplayNode {
private let context: AccountContext
@@ -28,7 +29,7 @@ final class PeerSelectionControllerNode: ASDisplayNode {
private let toolbarBackgroundNode: ASDisplayNode?
private let toolbarSeparatorNode: ASDisplayNode?
- private let segmentedControl: UISegmentedControl?
+ private let segmentedControlNode: SegmentedControlNode?
var contactListNode: ContactListNode?
let chatListNode: ChatListNode
@@ -71,13 +72,15 @@ final class PeerSelectionControllerNode: ASDisplayNode {
self.toolbarSeparatorNode = ASDisplayNode()
self.toolbarSeparatorNode?.backgroundColor = self.presentationData.theme.rootController.navigationBar.separatorColor
- self.segmentedControl = UISegmentedControl(items: [self.presentationData.strings.DialogList_TabTitle, self.presentationData.strings.Contacts_TabTitle])
- self.segmentedControl?.tintColor = self.presentationData.theme.rootController.navigationBar.accentTextColor
- self.segmentedControl?.selectedSegmentIndex = 0
+ let items = [
+ self.presentationData.strings.DialogList_TabTitle,
+ self.presentationData.strings.Contacts_TabTitle
+ ]
+ self.segmentedControlNode = SegmentedControlNode(theme: SegmentedControlTheme(theme: self.presentationData.theme), items: items.map { SegmentedControlItem(title: $0) }, selectedIndex: 0)
} else {
self.toolbarBackgroundNode = nil
self.toolbarSeparatorNode = nil
- self.segmentedControl = nil
+ self.segmentedControlNode = nil
}
@@ -121,10 +124,13 @@ final class PeerSelectionControllerNode: ASDisplayNode {
})
if hasContactSelector {
+ self.segmentedControlNode!.selectedIndexChanged = { [weak self] index in
+ self?.indexChanged(index)
+ }
+
self.addSubnode(self.toolbarBackgroundNode!)
self.addSubnode(self.toolbarSeparatorNode!)
- self.view.addSubview(self.segmentedControl!)
- self.segmentedControl!.addTarget(self, action: #selector(indexChanged), for: .valueChanged)
+ self.addSubnode(self.segmentedControlNode!)
}
@@ -142,7 +148,7 @@ final class PeerSelectionControllerNode: ASDisplayNode {
self.toolbarBackgroundNode?.backgroundColor = self.presentationData.theme.rootController.navigationBar.backgroundColor
self.toolbarSeparatorNode?.backgroundColor = self.presentationData.theme.rootController.navigationBar.separatorColor
- self.segmentedControl?.tintColor = self.presentationData.theme.rootController.navigationBar.accentTextColor
+ self.segmentedControlNode?.updateTheme(SegmentedControlTheme(theme: self.presentationData.theme))
}
func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, actualNavigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) {
@@ -152,14 +158,13 @@ final class PeerSelectionControllerNode: ASDisplayNode {
var toolbarHeight: CGFloat = cleanInsets.bottom
- if let segmentedControl = segmentedControl, let toolbarBackgroundNode = toolbarBackgroundNode, let toolbarSeparatorNode = toolbarSeparatorNode {
+ if let segmentedControlNode = self.segmentedControlNode, let toolbarBackgroundNode = self.toolbarBackgroundNode, let toolbarSeparatorNode = self.toolbarSeparatorNode {
toolbarHeight += 44
transition.updateFrame(node: toolbarBackgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - toolbarHeight), size: CGSize(width: layout.size.width, height: toolbarHeight)))
transition.updateFrame(node: toolbarSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - toolbarHeight), size: CGSize(width: layout.size.width, height: UIScreenPixel)))
- var controlSize = segmentedControl.sizeThatFits(layout.size)
- controlSize.width = min(layout.size.width, max(200.0, controlSize.width))
- transition.updateFrame(view: segmentedControl, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - controlSize.width) / 2.0), y: layout.size.height - toolbarHeight + floor((44.0 - controlSize.height) / 2.0)), size: controlSize))
+ let controlSize = segmentedControlNode.updateLayout(.sizeToFit(maximumWidth: layout.size.width, minimumWidth: 200.0), transition: transition)
+ transition.updateFrame(node: segmentedControlNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - controlSize.width) / 2.0), y: layout.size.height - toolbarHeight + floor((44.0 - controlSize.height) / 2.0)), size: controlSize))
}
var insets = layout.insets(options: [.input])
@@ -232,7 +237,7 @@ final class PeerSelectionControllerNode: ASDisplayNode {
if let requestOpenMessageFromSearch = self?.requestOpenMessageFromSearch {
requestOpenMessageFromSearch(peer, messageId)
}
- }, addContact: nil), cancel: { [weak self] in
+ }, addContact: nil, peerContextAction: nil), cancel: { [weak self] in
if let requestDeactivateSearch = self?.requestDeactivateSearch {
requestDeactivateSearch()
}
@@ -318,12 +323,12 @@ final class PeerSelectionControllerNode: ASDisplayNode {
})
}
- @objc func indexChanged() {
- guard let (layout, navigationHeight, actualNavigationHeight) = self.containerLayout, let segmentedControl = self.segmentedControl else {
+ private func indexChanged(_ index: Int) {
+ guard let (layout, navigationHeight, actualNavigationHeight) = self.containerLayout else {
return
}
- let contactListActive = segmentedControl.selectedSegmentIndex == 1
+ let contactListActive = index == 1
if contactListActive != self.contactListActive {
self.contactListActive = contactListActive
if contactListActive {
diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping
index 771e0a97d8..86b928ee9d 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/SharedAccountContext.swift b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift
index 7e2eefda4e..89226d864f 100644
--- a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift
+++ b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift
@@ -995,6 +995,10 @@ public final class SharedAccountContextImpl: SharedAccountContext {
openAddContactImpl(context: context, firstName: firstName, lastName: lastName, phoneNumber: phoneNumber, label: label, present: present, pushController: pushController, completed: completed)
}
+ public func openAddPersonContact(context: AccountContext, peerId: PeerId, present: @escaping (ViewController, Any?) -> Void) {
+ openAddPersonContactImpl(context: context, peerId: peerId, present: present)
+ }
+
public func makeCreateGroupController(context: AccountContext, peerIds: [PeerId], initialTitle: String?, mode: CreateGroupMode, completion: ((PeerId, @escaping () -> Void) -> Void)?) -> ViewController {
return createGroupControllerImpl(context: context, peerIds: peerIds, initialTitle: initialTitle, mode: mode, completion: completion)
}
diff --git a/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift
index 2cf75faa78..bcdf908070 100644
--- a/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift
+++ b/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift
@@ -100,7 +100,7 @@ private enum StickerSearchEntry: Identifiable, Comparable {
interaction.sendSticker(.standalone(media: stickerItem.file), node, rect)
})
case let .global(_, info, topItems, installed):
- return StickerPaneSearchGlobalItem(account: account, theme: theme, strings: strings, info: info, topItems: topItems, installed: installed, unread: false, open: {
+ return StickerPaneSearchGlobalItem(account: account, theme: theme, strings: strings, info: info, topItems: topItems, grid: false, installed: installed, unread: false, open: {
interaction.open(info)
}, install: {
interaction.install(info)
@@ -248,7 +248,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode {
}
}, sendSticker: { [weak self] file, sourceNode, sourceRect in
if let strongSelf = self {
- strongSelf.controllerInteraction.sendSticker(file, false, sourceNode, sourceRect)
+ let _ = strongSelf.controllerInteraction.sendSticker(file, false, sourceNode, sourceRect)
}
}, getItemIsPreviewed: { item in
return inputNodeInteraction.previewedStickerPackItem == .pack(item)
@@ -461,7 +461,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode {
return nil
}
- func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, inputHeight: CGFloat, transition: ContainedViewLayoutTransition) {
+ func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, inputHeight: CGFloat, deviceMetrics: DeviceMetrics, transition: ContainedViewLayoutTransition) {
let firstLayout = self.validLayout == nil
self.validLayout = size
@@ -479,7 +479,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode {
self.gridNode.transaction(GridNodeTransaction(deleteItems: [], insertItems: [], updateItems: [], scrollToItem: nil, updateLayout: GridNodeUpdateLayout(layout: GridNodeLayout(size: contentFrame.size, insets: UIEdgeInsets(top: 4.0, left: 0.0, bottom: 4.0 + bottomInset, right: 0.0), preloadSize: 300.0, type: .fixed(itemSize: CGSize(width: 75.0, height: 75.0), fillWidth: nil, lineSpacing: 0.0, itemSpacing: nil)), transition: transition), itemTransition: .immediate, stationaryItems: .none, updateFirstIndexInSectionOffset: nil), completion: { _ in })
transition.updateFrame(node: self.trendingPane, frame: contentFrame)
- self.trendingPane.updateLayout(size: contentFrame.size, topInset: 0.0, bottomInset: bottomInset, isExpanded: false, isVisible: true, transition: transition)
+ self.trendingPane.updateLayout(size: contentFrame.size, topInset: 0.0, bottomInset: bottomInset, isExpanded: false, isVisible: true, deviceMetrics: deviceMetrics, transition: transition)
transition.updateFrame(node: self.gridNode, frame: contentFrame)
if firstLayout {
diff --git a/submodules/TelegramUI/TelegramUI/StickerPaneSearchGlobaltem.swift b/submodules/TelegramUI/TelegramUI/StickerPaneSearchGlobaltem.swift
index 65bce49a26..8557f94b73 100644
--- a/submodules/TelegramUI/TelegramUI/StickerPaneSearchGlobaltem.swift
+++ b/submodules/TelegramUI/TelegramUI/StickerPaneSearchGlobaltem.swift
@@ -37,6 +37,7 @@ final class StickerPaneSearchGlobalItem: GridItem {
let strings: PresentationStrings
let info: StickerPackCollectionInfo
let topItems: [StickerPackItem]
+ let grid: Bool
let installed: Bool
let unread: Bool
let open: () -> Void
@@ -44,14 +45,17 @@ final class StickerPaneSearchGlobalItem: GridItem {
let getItemIsPreviewed: (StickerPackItem) -> Bool
let section: GridSection? = StickerPaneSearchGlobalSection()
- let fillsRowWithHeight: CGFloat? = 128.0
+ var fillsRowWithHeight: CGFloat? {
+ return self.grid ? nil : 128.0
+ }
- init(account: Account, theme: PresentationTheme, strings: PresentationStrings, info: StickerPackCollectionInfo, topItems: [StickerPackItem], installed: Bool, unread: Bool, open: @escaping () -> Void, install: @escaping () -> Void, getItemIsPreviewed: @escaping (StickerPackItem) -> Bool) {
+ init(account: Account, theme: PresentationTheme, strings: PresentationStrings, info: StickerPackCollectionInfo, topItems: [StickerPackItem], grid: Bool, installed: Bool, unread: Bool, open: @escaping () -> Void, install: @escaping () -> Void, getItemIsPreviewed: @escaping (StickerPackItem) -> Bool) {
self.account = account
self.theme = theme
self.strings = strings
self.info = info
self.topItems = topItems
+ self.grid = grid
self.installed = installed
self.unread = unread
self.open = open
diff --git a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputContextPanelNode.swift
index 925a759fef..31c7f122f8 100644
--- a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputContextPanelNode.swift
+++ b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputContextPanelNode.swift
@@ -126,7 +126,6 @@ final class VerticalListContextResultsChatInputContextPanelNode: ChatInputContex
private var enqueuedTransitions: [(VerticalListContextResultsChatInputContextPanelTransition, Bool)] = []
private var validLayout: (CGSize, CGFloat, CGFloat)?
-
override init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings) {
self.listView = ListView()
self.listView.isOpaque = false
diff --git a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelItem.swift
index 016f1502ef..898fce5b81 100644
--- a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelItem.swift
+++ b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelItem.swift
@@ -8,6 +8,7 @@ import Postbox
import TelegramPresentationData
import RadialStatusNode
import PhotoResources
+import StickerResources
final class VerticalListContextResultsChatInputPanelItem: ListViewItem {
fileprivate let account: Account
@@ -165,7 +166,6 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
var textString: NSAttributedString?
var iconText: NSAttributedString?
- var iconImageRepresentation: TelegramMediaImageRepresentation?
var updateIconImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?
var updatedStatusSignal: Signal?
@@ -178,8 +178,9 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
}
var imageResource: TelegramMediaResource?
+ var stickerFile: TelegramMediaFile?
switch item.result {
- case let .externalReference(_, _, _, title, _, url, content, thumbnail, _):
+ case let .externalReference(_, _, _, _, _, url, content, thumbnail, _):
if let thumbnail = thumbnail {
imageResource = thumbnail.resource
}
@@ -198,11 +199,16 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
iconText = NSAttributedString(string: host.substring(to: host.index(after: host.startIndex)).uppercased(), font: iconFont, textColor: UIColor.white)
}
}
- case let .internalReference(_, _, _, title, _, image, file, _):
+ case let .internalReference(_, _, _, _, _, image, file, _):
if let image = image {
imageResource = imageRepresentationLargerThan(image.representations, size: CGSize(width: 200.0, height: 200.0))?.resource
} else if let file = file {
- imageResource = smallestImageRepresentation(file.previewRepresentations)?.resource
+ if file.isSticker {
+ stickerFile = file
+ imageResource = file.resource
+ } else {
+ imageResource = smallestImageRepresentation(file.previewRepresentations)?.resource
+ }
}
}
@@ -215,9 +221,15 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
var iconImageApply: (() -> Void)?
if let imageResource = imageResource {
- let iconSize = CGSize(width: 55.0, height: 55.0)
+ let boundingSize = CGSize(width: 55.0, height: 55.0)
+ let iconSize: CGSize
+ if let stickerFile = stickerFile, let dimensions = stickerFile.dimensions {
+ iconSize = dimensions.fitted(boundingSize)
+ } else {
+ iconSize = boundingSize
+ }
let imageCorners = ImageCorners(topLeft: .Corner(2.0), topRight: .Corner(2.0), bottomLeft: .Corner(2.0), bottomRight: .Corner(2.0))
- let arguments = TransformImageArguments(corners: imageCorners, imageSize: iconSize, boundingSize: iconSize, intrinsicInsets: UIEdgeInsets())
+ let arguments = TransformImageArguments(corners: imageCorners, imageSize: iconSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets())
iconImageApply = iconImageLayout(arguments)
updatedStatusSignal = item.account.postbox.mediaBox.resourceStatus(imageResource)
@@ -235,9 +247,13 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
if updatedIconImageResource {
if let imageResource = imageResource {
- let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 55.0, height: 55.0), resource: imageResource)
- let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: [tmpRepresentation], immediateThumbnailData: nil, reference: nil, partialReference: nil)
- updateIconImageSignal = chatWebpageSnippetPhoto(account: item.account, photoReference: .standalone(media: tmpImage))
+ if let stickerFile = stickerFile {
+ updateIconImageSignal = chatMessageSticker(account: item.account, file: stickerFile, small: false, fetched: true)
+ } else {
+ let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 55.0, height: 55.0), resource: imageResource)
+ let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: [tmpRepresentation], immediateThumbnailData: nil, reference: nil, partialReference: nil)
+ updateIconImageSignal = chatWebpageSnippetPhoto(account: item.account, photoReference: .standalone(media: tmpImage))
+ }
} else {
updateIconImageSignal = .complete()
}
diff --git a/submodules/TelegramUpdateUI/TelegramUpdateUI.xcodeproj/project.pbxproj b/submodules/TelegramUpdateUI/TelegramUpdateUI.xcodeproj/project.pbxproj
index 2671cccedf..cd56eff6f6 100644
--- a/submodules/TelegramUpdateUI/TelegramUpdateUI.xcodeproj/project.pbxproj
+++ b/submodules/TelegramUpdateUI/TelegramUpdateUI.xcodeproj/project.pbxproj
@@ -260,6 +260,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E293594DCC000000000
isa
@@ -440,6 +453,7 @@
1DD70E290F1A3C6400000000
1DD70E29DB6520C800000000
1DD70E29CBE117ED00000000
+ 1DD70E2957B5522500000000
1DD70E293594DCC000000000
1DD70E29D65BA68200000000
1DD70E2925BBFEEE00000000
@@ -751,6 +765,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -795,6 +816,7 @@
E7A30F04C37F741500000000
E7A30F04BF0846EE00000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
diff --git a/submodules/WebSearchUI/BUCK b/submodules/WebSearchUI/BUCK
index b53c2f6d56..f9bd159378 100644
--- a/submodules/WebSearchUI/BUCK
+++ b/submodules/WebSearchUI/BUCK
@@ -24,6 +24,7 @@ static_library(
"//submodules/SearchBarNode:SearchBarNode",
"//submodules/ItemListUI:ItemListUI",
"//submodules/LegacyMediaPickerUI:LegacyMediaPickerUI",
+ "//submodules/SegmentedControlNode:SegmentedControlNode",
"//submodules/AppBundle:AppBundle",
],
frameworks = [
diff --git a/submodules/WebSearchUI/Sources/WebSearchControllerNode.swift b/submodules/WebSearchUI/Sources/WebSearchControllerNode.swift
index a47c63ea0a..fce793f897 100644
--- a/submodules/WebSearchUI/Sources/WebSearchControllerNode.swift
+++ b/submodules/WebSearchUI/Sources/WebSearchControllerNode.swift
@@ -12,6 +12,7 @@ import MergeLists
import AccountContext
import GalleryUI
import ChatListSearchItemHeader
+import SegmentedControlNode
import AppBundle
private struct WebSearchContextResultStableId: Hashable {
@@ -136,7 +137,7 @@ class WebSearchControllerNode: ASDisplayNode {
private let segmentedBackgroundNode: ASDisplayNode
private let segmentedSeparatorNode: ASDisplayNode
- private let segmentedControl: UISegmentedControl
+ private let segmentedControlNode: SegmentedControlNode
private let toolbarBackgroundNode: ASDisplayNode
private let toolbarSeparatorNode: ASDisplayNode
@@ -190,8 +191,11 @@ class WebSearchControllerNode: ASDisplayNode {
self.segmentedBackgroundNode = ASDisplayNode()
self.segmentedSeparatorNode = ASDisplayNode()
- self.segmentedControl = UISegmentedControl(items: [strings.WebSearch_Images, strings.WebSearch_GIFs])
- self.segmentedControl.selectedSegmentIndex = 0
+ let items = [
+ strings.WebSearch_Images,
+ strings.WebSearch_GIFs
+ ]
+ self.segmentedControlNode = SegmentedControlNode(theme: SegmentedControlTheme(theme: theme), items: items.map { SegmentedControlItem(title: $0) }, selectedIndex: 0)
self.toolbarBackgroundNode = ASDisplayNode()
self.toolbarSeparatorNode = ASDisplayNode()
@@ -222,7 +226,7 @@ class WebSearchControllerNode: ASDisplayNode {
self.addSubnode(self.segmentedBackgroundNode)
self.addSubnode(self.segmentedSeparatorNode)
if case .media = mode {
- self.view.addSubview(self.segmentedControl)
+ self.addSubnode(self.segmentedControlNode)
}
self.addSubnode(self.toolbarBackgroundNode)
self.addSubnode(self.toolbarSeparatorNode)
@@ -231,7 +235,16 @@ class WebSearchControllerNode: ASDisplayNode {
self.addSubnode(self.attributionNode)
self.addSubnode(self.badgeNode)
- self.segmentedControl.addTarget(self, action: #selector(self.indexChanged), for: .valueChanged)
+ self.segmentedControlNode.selectedIndexChanged = { [weak self] index in
+ if let strongSelf = self, let scope = WebSearchScope(rawValue: Int32(index)) {
+ let _ = updateWebSearchSettingsInteractively(accountManager: strongSelf.context.sharedContext.accountManager) { _ -> WebSearchSettings in
+ return WebSearchSettings(scope: scope)
+ }.start()
+ strongSelf.requestUpdateInterfaceState(true) { current in
+ return current.withUpdatedScope(scope)
+ }
+ }
+ }
self.cancelButton.addTarget(self, action: #selector(self.cancelPressed), forControlEvents: .touchUpInside)
self.sendButton.addTarget(self, action: #selector(self.sendPressed), forControlEvents: .touchUpInside)
@@ -335,7 +348,7 @@ class WebSearchControllerNode: ASDisplayNode {
self.segmentedBackgroundNode.backgroundColor = self.theme.rootController.navigationBar.backgroundColor
self.segmentedSeparatorNode.backgroundColor = self.theme.rootController.navigationBar.separatorColor
- self.segmentedControl.tintColor = self.theme.rootController.navigationBar.accentTextColor
+ self.segmentedControlNode.updateTheme(SegmentedControlTheme(theme: self.theme))
self.toolbarBackgroundNode.backgroundColor = self.theme.rootController.navigationBar.backgroundColor
self.toolbarSeparatorNode.backgroundColor = self.theme.rootController.navigationBar.separatorColor
@@ -359,16 +372,14 @@ class WebSearchControllerNode: ASDisplayNode {
var insets = layout.insets(options: [.input])
insets.top += navigationBarHeight
- let segmentedHeight: CGFloat = self.segmentedControl.superview != nil ? 44.0 : 5.0
+ let segmentedHeight: CGFloat = self.segmentedControlNode.supernode != nil ? 44.0 : 5.0
let panelY: CGFloat = insets.top - UIScreenPixel - 4.0
transition.updateFrame(node: self.segmentedBackgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelY), size: CGSize(width: layout.size.width, height: segmentedHeight)))
transition.updateFrame(node: self.segmentedSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelY + segmentedHeight), size: CGSize(width: layout.size.width, height: UIScreenPixel)))
- var controlSize = self.segmentedControl.sizeThatFits(layout.size)
- controlSize.width = layout.size.width - layout.safeInsets.left - layout.safeInsets.right - 10.0 * 2.0
-
- transition.updateFrame(view: self.segmentedControl, frame: CGRect(origin: CGPoint(x: layout.safeInsets.left + floor((layout.size.width - layout.safeInsets.left - layout.safeInsets.right - controlSize.width) / 2.0), y: panelY + 5.0), size: controlSize))
+ let controlSize = self.segmentedControlNode.updateLayout(.stretchToFill(width: layout.size.width - layout.safeInsets.left - layout.safeInsets.right - 10.0 * 2.0), transition: transition)
+ transition.updateFrame(node: self.segmentedControlNode, frame: CGRect(origin: CGPoint(x: layout.safeInsets.left + floor((layout.size.width - layout.safeInsets.left - layout.safeInsets.right - controlSize.width) / 2.0), y: panelY + 5.0), size: controlSize))
insets.top -= 4.0
@@ -472,7 +483,7 @@ class WebSearchControllerNode: ASDisplayNode {
self.webSearchInterfaceStatePromise.set(self.webSearchInterfaceState)
if let state = interfaceState.state {
- self.segmentedControl.selectedSegmentIndex = Int(state.scope.rawValue)
+ self.segmentedControlNode.selectedIndex = Int(state.scope.rawValue)
}
if let validLayout = self.containerLayout {
@@ -657,17 +668,6 @@ class WebSearchControllerNode: ASDisplayNode {
}
}
- @objc private func indexChanged() {
- if let scope = WebSearchScope(rawValue: Int32(self.segmentedControl.selectedSegmentIndex)) {
- let _ = updateWebSearchSettingsInteractively(accountManager: self.context.sharedContext.accountManager) { _ -> WebSearchSettings in
- return WebSearchSettings(scope: scope)
- }.start()
- self.requestUpdateInterfaceState(true) { current in
- return current.withUpdatedScope(scope)
- }
- }
- }
-
@objc private func cancelPressed() {
self.cancel?()
}
diff --git a/submodules/WebSearchUI/WebSearchUI.xcodeproj/project.pbxproj b/submodules/WebSearchUI/WebSearchUI.xcodeproj/project.pbxproj
index dc58d668cb..fe83eb6b0a 100644
--- a/submodules/WebSearchUI/WebSearchUI.xcodeproj/project.pbxproj
+++ b/submodules/WebSearchUI/WebSearchUI.xcodeproj/project.pbxproj
@@ -533,6 +533,19 @@
explicitFileType
archive.ar
+ 1DD70E2957B5522500000000
+
+ isa
+ PBXFileReference
+ name
+ libSegmentedControlNode.a
+ path
+ libSegmentedControlNode.a
+ sourceTree
+ BUILT_PRODUCTS_DIR
+ explicitFileType
+ archive.ar
+
1DD70E29097DBE9200000000
isa
@@ -825,6 +838,7 @@
1DD70E291D58331200000000
1DD70E29CF967D4300000000
1DD70E29EA9CBB5B00000000
+ 1DD70E2957B5522500000000
1DD70E29097DBE9200000000
1DD70E2981AE180900000000
1DD70E293594DCC000000000
@@ -1524,6 +1538,13 @@
fileRef
1DD70E29CBE117ED00000000
+ E7A30F0457B5522500000000
+
+ isa
+ PBXBuildFile
+ fileRef
+ 1DD70E2957B5522500000000
+
E7A30F0425BBFEEE00000000
isa
@@ -1626,6 +1647,7 @@
E7A30F04A6BAE8A300000000
E7A30F04F29DEA1400000000
E7A30F04CBE117ED00000000
+ E7A30F0457B5522500000000
E7A30F0425BBFEEE00000000
E7A30F045A26607D00000000
E7A30F0452137F3500000000
diff --git a/tools/GenerateLocalization.swift b/tools/GenerateLocalization.swift
index 1fd0c49eff..5e26783c77 100644
--- a/tools/GenerateLocalization.swift
+++ b/tools/GenerateLocalization.swift
@@ -203,12 +203,12 @@ if CommandLine.arguments.count != 4 {
print("Usage: swift GenerateLocalization.swift Localizable.strings Strings.swift Strings.mapping")
} else {
if let rawDict = NSDictionary(contentsOfFile: CommandLine.arguments[1]) {
- var result = "import Foundation\n\n"
+ var result = "import Foundation\nimport AppBundle\n\n"
result +=
"""
private let fallbackDict: [String: String] = {
- guard let mainPath = Bundle.main.path(forResource: \"en\", ofType: \"lproj\"), let bundle = Bundle(path: mainPath) else {
+ guard let mainPath = getAppBundle().path(forResource: \"en\", ofType: \"lproj\"), let bundle = Bundle(path: mainPath) else {
return [:]
}
guard let path = bundle.path(forResource: \"Localizable\", ofType: \"strings\") else {
@@ -346,7 +346,7 @@ private final class DataReader {
}
private func loadMapping() -> ([Int], [String], [Int], [Int], [String]) {
- guard let filePath = Bundle(for: PresentationStrings.self).path(forResource: "PresentationStrings", ofType: "mapping") else {
+ guard let filePath = getAppBundle().path(forResource: "PresentationStrings", ofType: "mapping") else {
fatalError()
}
guard let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)) else {