diff --git a/.gitignore b/.gitignore
index 51c2c450ed..2294d1d1bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,4 @@ AppBinary.xcworkspace/*
Project.xcodeproj/*
Watch/Watch.xcodeproj/*
AppBundle.xcworkspace/*
+tools/buck
diff --git a/Telegram-iOS.xcworkspace/contents.xcworkspacedata b/Telegram-iOS.xcworkspace/contents.xcworkspacedata
index 2b57cc1adf..b294c9cb24 100644
--- a/Telegram-iOS.xcworkspace/contents.xcworkspacedata
+++ b/Telegram-iOS.xcworkspace/contents.xcworkspacedata
@@ -53,10 +53,16 @@
+
+
+
+
@@ -72,9 +78,6 @@
-
-
@@ -120,6 +123,18 @@
+
+
+
+
+
+
+
+
@@ -209,6 +224,9 @@
+
+
@@ -233,6 +251,13 @@
+
+
+
+
@@ -288,6 +313,12 @@
+
+
+
+
+
+
ViewController
func makeChatListController(context: AccountContext, groupId: PeerGroupId, controlsHistoryPreload: Bool, hideNetworkActivityStatus: Bool, enableDebugActions: Bool) -> ChatListController
func makeChatController(context: AccountContext, chatLocation: ChatLocation, subject: ChatControllerSubject?, botStart: ChatControllerInitialBotStart?, mode: ChatControllerPresentationMode) -> ChatController
+ func makeChatMessagePreviewItem(context: AccountContext, message: Message, theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, dateTimeFormat: PresentationDateTimeFormat, nameOrder: PresentationPersonNameOrder, forcedResourceStatus: FileMediaResourceStatus?) -> ListViewItem
func makePeerSharedMediaController(context: AccountContext, peerId: PeerId) -> ViewController?
func makeContactSelectionController(_ params: ContactSelectionControllerParams) -> ContactSelectionController
func makeContactMultiselectionController(_ params: ContactMultiselectionControllerParams) -> ContactMultiselectionController
+ func makePeerSelectionController(_ params: PeerSelectionControllerParams) -> PeerSelectionController
func makeProxySettingsController(context: AccountContext) -> ViewController
func makeLocalizationListController(context: AccountContext) -> ViewController
func makeCreateGroupController(context: AccountContext, peerIds: [PeerId], initialTitle: String?, mode: CreateGroupMode, completion: ((PeerId, @escaping () -> Void) -> Void)?) -> ViewController
diff --git a/submodules/AccountContext/Sources/ChatController.swift b/submodules/AccountContext/Sources/ChatController.swift
index 7f119048aa..36c1703c0f 100644
--- a/submodules/AccountContext/Sources/ChatController.swift
+++ b/submodules/AccountContext/Sources/ChatController.swift
@@ -4,6 +4,8 @@ import TelegramCore
import TextFormat
import Display
import SwiftSignalKit
+import TelegramPresentationData
+import TelegramUIPreferences
public enum ChatControllerInitialBotStartBehavior {
case interactive
@@ -367,3 +369,27 @@ public protocol ChatController: ViewController {
func updatePresentationMode(_ mode: ChatControllerPresentationMode)
func beginMessageSearch(_ query: String)
}
+
+public protocol ChatMessagePrevewItemNode: class {
+ var forwardInfoReferenceNode: ASDisplayNode? { get }
+}
+
+public enum FileMediaResourcePlaybackStatus: Equatable {
+ case playing
+ case paused
+}
+
+public struct FileMediaResourceStatus: Equatable {
+ public var mediaStatus: FileMediaResourceMediaStatus
+ public var fetchStatus: MediaResourceStatus
+
+ public init(mediaStatus: FileMediaResourceMediaStatus, fetchStatus: MediaResourceStatus) {
+ self.mediaStatus = mediaStatus
+ self.fetchStatus = fetchStatus
+ }
+}
+
+public enum FileMediaResourceMediaStatus: Equatable {
+ case fetchStatus(MediaResourceStatus)
+ case playbackStatus(FileMediaResourcePlaybackStatus)
+}
diff --git a/submodules/AccountContext/Sources/PeerSelectionController.swift b/submodules/AccountContext/Sources/PeerSelectionController.swift
new file mode 100644
index 0000000000..fee175e265
--- /dev/null
+++ b/submodules/AccountContext/Sources/PeerSelectionController.swift
@@ -0,0 +1,47 @@
+import Foundation
+import Display
+import Postbox
+import SwiftSignalKit
+
+public struct ChatListNodePeersFilter: OptionSet {
+ public var rawValue: Int32
+
+ public init(rawValue: Int32) {
+ self.rawValue = rawValue
+ }
+
+ public static let onlyWriteable = ChatListNodePeersFilter(rawValue: 1 << 0)
+ public static let onlyPrivateChats = ChatListNodePeersFilter(rawValue: 1 << 1)
+ public static let onlyGroups = ChatListNodePeersFilter(rawValue: 1 << 2)
+ public static let onlyChannels = ChatListNodePeersFilter(rawValue: 1 << 3)
+ public static let onlyManageable = ChatListNodePeersFilter(rawValue: 1 << 4)
+
+ public static let excludeSecretChats = ChatListNodePeersFilter(rawValue: 1 << 5)
+ public static let excludeRecent = ChatListNodePeersFilter(rawValue: 1 << 6)
+ public static let excludeSavedMessages = ChatListNodePeersFilter(rawValue: 1 << 7)
+
+ public static let doNotSearchMessages = ChatListNodePeersFilter(rawValue: 1 << 8)
+ public static let removeSearchHeader = ChatListNodePeersFilter(rawValue: 1 << 9)
+
+ public static let excludeDisabled = ChatListNodePeersFilter(rawValue: 1 << 10)
+ public static let includeSavedMessages = ChatListNodePeersFilter(rawValue: 1 << 11)
+}
+
+public final class PeerSelectionControllerParams {
+ public let context: AccountContext
+ public let filter: ChatListNodePeersFilter
+ public let hasContactSelector: Bool
+ public let title: String?
+
+ public init(context: AccountContext, filter: ChatListNodePeersFilter = [.onlyWriteable], hasContactSelector: Bool = true, title: String? = nil) {
+ self.context = context
+ self.filter = filter
+ self.hasContactSelector = hasContactSelector
+ self.title = title
+ }
+}
+
+public protocol PeerSelectionController: ViewController {
+ var peerSelected: ((PeerId) -> Void)? { get set }
+ var inProgress: Bool { get set }
+}
diff --git a/submodules/AnimationUI/Sources/AnimatedStickerNode.swift b/submodules/AnimationUI/Sources/AnimatedStickerNode.swift
index e6a1df697b..9efaa25127 100644
--- a/submodules/AnimationUI/Sources/AnimatedStickerNode.swift
+++ b/submodules/AnimationUI/Sources/AnimatedStickerNode.swift
@@ -301,6 +301,11 @@ public struct AnimatedStickerStatus: Equatable {
}
}
+public enum AnimatedStickerNodeResource {
+ case resource(MediaResource)
+ case localFile(String)
+}
+
public final class AnimatedStickerNode: ASDisplayNode {
private let queue: Queue
private var account: Account?
@@ -381,28 +386,38 @@ public final class AnimatedStickerNode: ASDisplayNode {
self.addSubnode(self.renderer!)
}
- public func setup(account: Account, resource: MediaResource, fitzModifier: EmojiFitzModifier? = nil, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) {
+ public func setup(account: Account, resource: AnimatedStickerNodeResource, fitzModifier: EmojiFitzModifier? = nil, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) {
if width < 2 || height < 2 {
return
}
self.playbackMode = playbackMode
switch mode {
- case .direct:
+ case .direct:
+ let f: (MediaResourceData) -> Void = { [weak self] data in
+ guard let strongSelf = self, data.complete else {
+ return
+ }
+ if let directData = try? Data(contentsOf: URL(fileURLWithPath: data.path), options: [.mappedRead]) {
+ strongSelf.directData = Tuple(directData, data.path, width, height)
+ }
+ if strongSelf.isPlaying {
+ strongSelf.play()
+ } else if strongSelf.canDisplayFirstFrame {
+ strongSelf.play(firstFrame: true)
+ }
+ }
+ switch resource {
+ case let .resource(resource):
self.disposable.set((account.postbox.mediaBox.resourceData(resource)
- |> deliverOnMainQueue).start(next: { [weak self] data in
- guard let strongSelf = self, data.complete else {
- return
- }
- if let directData = try? Data(contentsOf: URL(fileURLWithPath: data.path), options: [.mappedRead]) {
- strongSelf.directData = Tuple(directData, data.path, width, height)
- }
- if strongSelf.isPlaying {
- strongSelf.play()
- } else if strongSelf.canDisplayFirstFrame {
- strongSelf.play(firstFrame: true)
- }
+ |> deliverOnMainQueue).start(next: { data in
+ f(data)
}))
- case .cached:
+ case let .localFile(path):
+ f(MediaResourceData(path: path, offset: 0, size: Int(Int32.max - 1), complete: true))
+ }
+ case .cached:
+ switch resource {
+ case let .resource(resource):
self.disposable.set((chatMessageAnimationData(postbox: account.postbox, resource: resource, fitzModifier: fitzModifier, width: width, height: height, synchronousLoad: false)
|> deliverOnMainQueue).start(next: { [weak self] data in
if let strongSelf = self, data.complete {
@@ -414,6 +429,9 @@ public final class AnimatedStickerNode: ASDisplayNode {
}
}
}))
+ case .localFile:
+ break
+ }
}
}
diff --git a/submodules/AuthorizationUI/AuthorizationUI_Xcode.xcodeproj/project.pbxproj b/submodules/AuthorizationUI/AuthorizationUI_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..cd7f654fe4
--- /dev/null
+++ b/submodules/AuthorizationUI/AuthorizationUI_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,571 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D03E488C230773120049C28B /* AuthorizationUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E488A230773120049C28B /* AuthorizationUI.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D03E48972307739C0049C28B /* AuthorizationLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E48962307739B0049C28B /* AuthorizationLayout.swift */; };
+ D03E489A230774040049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4899230774040049C28B /* Foundation.framework */; };
+ D03E489C2307740C0049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E489B2307740C0049C28B /* UIKit.framework */; };
+ D03E489E2307740D0049C28B /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E489D2307740D0049C28B /* AsyncDisplayKit.framework */; };
+ D03E48A0230774130049C28B /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E489F230774130049C28B /* Display.framework */; };
+ D03E48A6230774780049C28B /* AuthorizationOptionText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E48A5230774780049C28B /* AuthorizationOptionText.swift */; };
+ D03E48A8230774980049C28B /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48A7230774980049C28B /* TelegramCore.framework */; };
+ D03E48AA230775060049C28B /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48A9230775060049C28B /* TelegramPresentationData.framework */; };
+ D03E48AC2307750D0049C28B /* TextFormat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48AB2307750D0049C28B /* TextFormat.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ D03E4887230773120049C28B /* AuthorizationUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AuthorizationUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E488A230773120049C28B /* AuthorizationUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AuthorizationUI.h; sourceTree = ""; };
+ D03E488B230773120049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D03E48962307739B0049C28B /* AuthorizationLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizationLayout.swift; sourceTree = ""; };
+ D03E4899230774040049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D03E489B2307740C0049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ D03E489D2307740D0049C28B /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E489F230774130049C28B /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48A5230774780049C28B /* AuthorizationOptionText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorizationOptionText.swift; sourceTree = ""; };
+ D03E48A7230774980049C28B /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48A9230775060049C28B /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48AB2307750D0049C28B /* TextFormat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TextFormat.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E4884230773120049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E48AC2307750D0049C28B /* TextFormat.framework in Frameworks */,
+ D03E48AA230775060049C28B /* TelegramPresentationData.framework in Frameworks */,
+ D03E48A8230774980049C28B /* TelegramCore.framework in Frameworks */,
+ D03E48A0230774130049C28B /* Display.framework in Frameworks */,
+ D03E489E2307740D0049C28B /* AsyncDisplayKit.framework in Frameworks */,
+ D03E489C2307740C0049C28B /* UIKit.framework in Frameworks */,
+ D03E489A230774040049C28B /* Foundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D03E487D230773120049C28B = {
+ isa = PBXGroup;
+ children = (
+ D03E488B230773120049C28B /* Info.plist */,
+ D03E4889230773120049C28B /* Sources */,
+ D03E4888230773120049C28B /* Products */,
+ D03E4898230774030049C28B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D03E4888230773120049C28B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4887230773120049C28B /* AuthorizationUI.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D03E4889230773120049C28B /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D03E48962307739B0049C28B /* AuthorizationLayout.swift */,
+ D03E488A230773120049C28B /* AuthorizationUI.h */,
+ D03E48A5230774780049C28B /* AuthorizationOptionText.swift */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D03E4898230774030049C28B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D03E48AB2307750D0049C28B /* TextFormat.framework */,
+ D03E48A9230775060049C28B /* TelegramPresentationData.framework */,
+ D03E48A7230774980049C28B /* TelegramCore.framework */,
+ D03E489F230774130049C28B /* Display.framework */,
+ D03E489D2307740D0049C28B /* AsyncDisplayKit.framework */,
+ D03E489B2307740C0049C28B /* UIKit.framework */,
+ D03E4899230774040049C28B /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D03E4882230773120049C28B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E488C230773120049C28B /* AuthorizationUI.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D03E4886230773120049C28B /* AuthorizationUI */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D03E488F230773120049C28B /* Build configuration list for PBXNativeTarget "AuthorizationUI" */;
+ buildPhases = (
+ D03E4882230773120049C28B /* Headers */,
+ D03E4883230773120049C28B /* Sources */,
+ D03E4884230773120049C28B /* Frameworks */,
+ D03E4885230773120049C28B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = AuthorizationUI;
+ productName = AuthorizationUI;
+ productReference = D03E4887230773120049C28B /* AuthorizationUI.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D03E487E230773120049C28B /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1030;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D03E4886230773120049C28B = {
+ CreatedOnToolsVersion = 10.3;
+ LastSwiftMigration = 1030;
+ };
+ };
+ };
+ buildConfigurationList = D03E4881230773120049C28B /* Build configuration list for PBXProject "AuthorizationUI_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D03E487D230773120049C28B;
+ productRefGroup = D03E4888230773120049C28B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D03E4886230773120049C28B /* AuthorizationUI */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D03E4885230773120049C28B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D03E4883230773120049C28B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E48972307739C0049C28B /* AuthorizationLayout.swift in Sources */,
+ D03E48A6230774780049C28B /* AuthorizationOptionText.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D03E488D230773120049C28B /* 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;
+ };
+ D03E488E230773120049C28B /* 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;
+ };
+ D03E4890230773120049C28B /* 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.AuthorizationUI;
+ 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;
+ };
+ D03E4891230773120049C28B /* 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.AuthorizationUI;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E4892230773460049C28B /* 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;
+ };
+ D03E4893230773460049C28B /* 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.AuthorizationUI;
+ 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;
+ };
+ D03E4894230773610049C28B /* 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;
+ };
+ D03E4895230773610049C28B /* 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.AuthorizationUI;
+ 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 */
+ D03E4881230773120049C28B /* Build configuration list for PBXProject "AuthorizationUI_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E488D230773120049C28B /* DebugAppStoreLLC */,
+ D03E4892230773460049C28B /* DebugHockeyapp */,
+ D03E488E230773120049C28B /* ReleaseAppStoreLLC */,
+ D03E4894230773610049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D03E488F230773120049C28B /* Build configuration list for PBXNativeTarget "AuthorizationUI" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E4890230773120049C28B /* DebugAppStoreLLC */,
+ D03E4893230773460049C28B /* DebugHockeyapp */,
+ D03E4891230773120049C28B /* ReleaseAppStoreLLC */,
+ D03E4895230773610049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D03E487E230773120049C28B /* Project object */;
+}
diff --git a/submodules/AuthorizationUI/Info.plist b/submodules/AuthorizationUI/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/AuthorizationUI/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/TelegramUI/TelegramUI/AuthorizationLayout.swift b/submodules/AuthorizationUI/Sources/AuthorizationLayout.swift
similarity index 80%
rename from submodules/TelegramUI/TelegramUI/AuthorizationLayout.swift
rename to submodules/AuthorizationUI/Sources/AuthorizationLayout.swift
index e3166c4f42..29e62e2b1a 100644
--- a/submodules/TelegramUI/TelegramUI/AuthorizationLayout.swift
+++ b/submodules/AuthorizationUI/Sources/AuthorizationLayout.swift
@@ -3,29 +3,41 @@ import UIKit
import AsyncDisplayKit
import Display
-struct AuthorizationLayoutItemSpacing {
- let weight: CGFloat
- let maxValue: CGFloat
-}
-
-struct AuthorizationLayoutItem {
- let node: ASDisplayNode
- let size: CGSize
- let spacingBefore: AuthorizationLayoutItemSpacing
- let spacingAfter: AuthorizationLayoutItemSpacing
-}
-
-final class SolvedAuthorizationLayoutItem {
- let item: AuthorizationLayoutItem
- var spacingBefore: CGFloat?
- var spacingAfter: CGFloat?
+public struct AuthorizationLayoutItemSpacing {
+ public var weight: CGFloat
+ public var maxValue: CGFloat
- init(item: AuthorizationLayoutItem) {
+ public init(weight: CGFloat, maxValue: CGFloat) {
+ self.weight = weight
+ self.maxValue = maxValue
+ }
+}
+
+public struct AuthorizationLayoutItem {
+ public var node: ASDisplayNode
+ public var size: CGSize
+ public var spacingBefore: AuthorizationLayoutItemSpacing
+ public var spacingAfter: AuthorizationLayoutItemSpacing
+
+ public init(node: ASDisplayNode, size: CGSize, spacingBefore: AuthorizationLayoutItemSpacing, spacingAfter: AuthorizationLayoutItemSpacing) {
+ self.node = node
+ self.size = size
+ self.spacingBefore = spacingBefore
+ self.spacingAfter = spacingAfter
+ }
+}
+
+public final class SolvedAuthorizationLayoutItem {
+ public let item: AuthorizationLayoutItem
+ public var spacingBefore: CGFloat?
+ public var spacingAfter: CGFloat?
+
+ public init(item: AuthorizationLayoutItem) {
self.item = item
}
}
-func layoutAuthorizationItems(bounds: CGRect, items: [AuthorizationLayoutItem], transition: ContainedViewLayoutTransition, failIfDoesNotFit: Bool) -> Bool {
+public func layoutAuthorizationItems(bounds: CGRect, items: [AuthorizationLayoutItem], transition: ContainedViewLayoutTransition, failIfDoesNotFit: Bool) -> Bool {
var fixedHeight: CGFloat = 0.0
var totalSpacerWeight: CGFloat = 0.0
for item in items {
diff --git a/submodules/AuthorizationUI/Sources/AuthorizationOptionText.swift b/submodules/AuthorizationUI/Sources/AuthorizationOptionText.swift
new file mode 100644
index 0000000000..aea3869ed0
--- /dev/null
+++ b/submodules/AuthorizationUI/Sources/AuthorizationOptionText.swift
@@ -0,0 +1,47 @@
+import Foundation
+import TelegramCore
+import Display
+import TelegramPresentationData
+import TextFormat
+
+public func authorizationCurrentOptionText(_ type: SentAuthorizationCodeType, strings: PresentationStrings, primaryColor: UIColor, accentColor: UIColor) -> NSAttributedString {
+ switch type {
+ case .sms:
+ return NSAttributedString(string: strings.Login_CodeSentSms, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center)
+ case .otherSession:
+ let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: primaryColor)
+ let bold = MarkdownAttributeSet(font: Font.semibold(16.0), textColor: primaryColor)
+ return parseMarkdownIntoAttributedString(strings.Login_CodeSentInternal, attributes: MarkdownAttributes(body: body, bold: bold, link: body, linkAttribute: { _ in nil }), textAlignment: .center)
+ case .call, .flashCall:
+ return NSAttributedString(string: strings.ChangePhoneNumberCode_Called, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center)
+ }
+}
+
+public func authorizationNextOptionText(currentType: SentAuthorizationCodeType, nextType: AuthorizationCodeNextType?, timeout: Int32?, strings: PresentationStrings, primaryColor: UIColor, accentColor: UIColor) -> (NSAttributedString, Bool) {
+ if let nextType = nextType, let timeout = timeout {
+ let minutes = timeout / 60
+ let seconds = timeout % 60
+ switch nextType {
+ case .sms:
+ if timeout <= 0 {
+ return (NSAttributedString(string: strings.Login_CodeSentSms, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
+ } else {
+ let timeString = NSString(format: "%d:%.02d", Int(minutes), Int(seconds))
+ return (NSAttributedString(string: strings.Login_WillSendSms(timeString as String).0, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
+ }
+ case .call, .flashCall:
+ if timeout <= 0 {
+ return (NSAttributedString(string: strings.ChangePhoneNumberCode_Called, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
+ } else {
+ return (NSAttributedString(string: String(format: strings.ChangePhoneNumberCode_CallTimer(String(format: "%d:%.2d", minutes, seconds)).0, minutes, seconds), font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
+ }
+ }
+ } else {
+ switch currentType {
+ case .otherSession:
+ return (NSAttributedString(string: strings.Login_SendCodeViaSms, font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true)
+ default:
+ return (NSAttributedString(string: strings.Login_HaveNotReceivedCodeInternal, font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true)
+ }
+ }
+}
diff --git a/submodules/AuthorizationUI/Sources/AuthorizationUI.h b/submodules/AuthorizationUI/Sources/AuthorizationUI.h
new file mode 100644
index 0000000000..ff41738826
--- /dev/null
+++ b/submodules/AuthorizationUI/Sources/AuthorizationUI.h
@@ -0,0 +1,19 @@
+//
+// AuthorizationUI.h
+// AuthorizationUI
+//
+// Created by Peter on 8/17/19.
+// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
+//
+
+#import
+
+//! Project version number for AuthorizationUI.
+FOUNDATION_EXPORT double AuthorizationUIVersionNumber;
+
+//! Project version string for AuthorizationUI.
+FOUNDATION_EXPORT const unsigned char AuthorizationUIVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/ChatListUI/Sources/Node/ChatListNode.swift b/submodules/ChatListUI/Sources/Node/ChatListNode.swift
index 99761c57a7..eb80cc1fb8 100644
--- a/submodules/ChatListUI/Sources/Node/ChatListNode.swift
+++ b/submodules/ChatListUI/Sources/Node/ChatListNode.swift
@@ -11,30 +11,6 @@ import AccountContext
import TelegramNotices
import ContactsPeerItem
-public struct ChatListNodePeersFilter: OptionSet {
- public var rawValue: Int32
-
- public init(rawValue: Int32) {
- self.rawValue = rawValue
- }
-
- public static let onlyWriteable = ChatListNodePeersFilter(rawValue: 1 << 0)
- public static let onlyPrivateChats = ChatListNodePeersFilter(rawValue: 1 << 1)
- public static let onlyGroups = ChatListNodePeersFilter(rawValue: 1 << 2)
- public static let onlyChannels = ChatListNodePeersFilter(rawValue: 1 << 3)
- public static let onlyManageable = ChatListNodePeersFilter(rawValue: 1 << 4)
-
- public static let excludeSecretChats = ChatListNodePeersFilter(rawValue: 1 << 5)
- public static let excludeRecent = ChatListNodePeersFilter(rawValue: 1 << 6)
- public static let excludeSavedMessages = ChatListNodePeersFilter(rawValue: 1 << 7)
-
- public static let doNotSearchMessages = ChatListNodePeersFilter(rawValue: 1 << 8)
- public static let removeSearchHeader = ChatListNodePeersFilter(rawValue: 1 << 9)
-
- public static let excludeDisabled = ChatListNodePeersFilter(rawValue: 1 << 10)
- public static let includeSavedMessages = ChatListNodePeersFilter(rawValue: 1 << 11)
-}
-
public enum ChatListNodeMode {
case chatList
case peers(filter: ChatListNodePeersFilter)
diff --git a/submodules/CheckNode/CheckNode_Xcode.xcodeproj/project.pbxproj b/submodules/CheckNode/CheckNode_Xcode.xcodeproj/project.pbxproj
index f33bc26029..6c1a7cb25a 100644
--- a/submodules/CheckNode/CheckNode_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/CheckNode/CheckNode_Xcode.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
+ D03E48B8230777AA0049C28B /* ModernCheckNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E48B7230777A80049C28B /* ModernCheckNode.swift */; };
+ D03E48BA230777B70049C28B /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48B9230777B70049C28B /* Display.framework */; };
D06018CD22F3665900796784 /* CheckNode.h in Headers */ = {isa = PBXBuildFile; fileRef = D06018CB22F3665900796784 /* CheckNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
D06018D822F366B000796784 /* CheckNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06018D722F366B000796784 /* CheckNode.swift */; };
D06018DB22F366BB00796784 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D06018DA22F366BB00796784 /* UIKit.framework */; };
@@ -16,6 +18,8 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
+ D03E48B7230777A80049C28B /* ModernCheckNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModernCheckNode.swift; sourceTree = ""; };
+ D03E48B9230777B70049C28B /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D06018C822F3665900796784 /* CheckNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CheckNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D06018CB22F3665900796784 /* CheckNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CheckNode.h; sourceTree = ""; };
D06018CC22F3665900796784 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
@@ -31,6 +35,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ D03E48BA230777B70049C28B /* Display.framework in Frameworks */,
D06018E122F366C500796784 /* LegacyComponents.framework in Frameworks */,
D06018DF22F366C200796784 /* AsyncDisplayKit.framework in Frameworks */,
D06018DD22F366BE00796784 /* Foundation.framework in Frameworks */,
@@ -62,6 +67,7 @@
D06018CA22F3665900796784 /* Sources */ = {
isa = PBXGroup;
children = (
+ D03E48B7230777A80049C28B /* ModernCheckNode.swift */,
D06018D722F366B000796784 /* CheckNode.swift */,
D06018CB22F3665900796784 /* CheckNode.h */,
);
@@ -71,6 +77,7 @@
D06018D922F366BA00796784 /* Frameworks */ = {
isa = PBXGroup;
children = (
+ D03E48B9230777B70049C28B /* Display.framework */,
D06018E022F366C500796784 /* LegacyComponents.framework */,
D06018DE22F366C200796784 /* AsyncDisplayKit.framework */,
D06018DC22F366BE00796784 /* Foundation.framework */,
@@ -160,6 +167,7 @@
buildActionMask = 2147483647;
files = (
D06018D822F366B000796784 /* CheckNode.swift in Sources */,
+ D03E48B8230777AA0049C28B /* ModernCheckNode.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/submodules/TelegramUI/TelegramUI/ModernCheckNode.swift b/submodules/CheckNode/Sources/ModernCheckNode.swift
similarity index 78%
rename from submodules/TelegramUI/TelegramUI/ModernCheckNode.swift
rename to submodules/CheckNode/Sources/ModernCheckNode.swift
index b266ac7972..c851755875 100644
--- a/submodules/TelegramUI/TelegramUI/ModernCheckNode.swift
+++ b/submodules/CheckNode/Sources/ModernCheckNode.swift
@@ -4,14 +4,21 @@ import AsyncDisplayKit
import Display
import LegacyComponents
-struct CheckNodeTheme {
- let backgroundColor: UIColor
- let strokeColor: UIColor
- let borderColor: UIColor
- let hasShadow: Bool
+public struct CheckNodeTheme {
+ public let backgroundColor: UIColor
+ public let strokeColor: UIColor
+ public let borderColor: UIColor
+ public let hasShadow: Bool
+
+ public init(backgroundColor: UIColor, strokeColor: UIColor, borderColor: UIColor, hasShadow: Bool) {
+ self.backgroundColor = backgroundColor
+ self.strokeColor = strokeColor
+ self.borderColor = borderColor
+ self.hasShadow = hasShadow
+ }
}
-enum CheckNodeContent {
+public enum CheckNodeContent {
case check
case counter(Int)
}
@@ -30,15 +37,15 @@ private final class CheckNodeParameters: NSObject {
}
}
-class ModernCheckNode: ASDisplayNode {
+public class ModernCheckNode: ASDisplayNode {
private var animationProgress: CGFloat = 0.0
- var theme: CheckNodeTheme {
+ public var theme: CheckNodeTheme {
didSet {
self.setNeedsDisplay()
}
}
- init(theme: CheckNodeTheme, content: CheckNodeContent = .check) {
+ public init(theme: CheckNodeTheme, content: CheckNodeContent = .check) {
self.theme = theme
self.content = content
@@ -47,14 +54,14 @@ class ModernCheckNode: ASDisplayNode {
self.isOpaque = false
}
- var content: CheckNodeContent {
+ public var content: CheckNodeContent {
didSet {
self.setNeedsDisplay()
}
}
- var selected = false
- func setSelected(_ selected: Bool, animated: Bool = false) {
+ public var selected = false
+ public func setSelected(_ selected: Bool, animated: Bool = false) {
guard self.selected != selected else {
return
}
@@ -84,15 +91,14 @@ class ModernCheckNode: ASDisplayNode {
}
}
- func setHighlighted(_ highlighted: Bool, animated: Bool = false) {
-
+ public func setHighlighted(_ highlighted: Bool, animated: Bool = false) {
}
- override func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? {
+ override public func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? {
return CheckNodeParameters(theme: self.theme, content: self.content, animationProgress: self.animationProgress, selected: self.selected)
}
- @objc override class func draw(_ bounds: CGRect, withParameters parameters: Any?, isCancelled: () -> Bool, isRasterizing: Bool) {
+ @objc override public class func draw(_ bounds: CGRect, withParameters parameters: Any?, isCancelled: () -> Bool, isRasterizing: Bool) {
let context = UIGraphicsGetCurrentContext()!
if !isRasterizing {
@@ -144,26 +150,19 @@ class ModernCheckNode: ASDisplayNode {
context.setLineJoin(.round)
context.setMiterLimit(10.0)
- switch parameters.content {
- case .check:
- break
- case let .counter(number):
- break
- }
-
context.strokePath()
}
}
- override func touchesBegan(_ touches: Set, with event: UIEvent?) {
+ override public func touchesBegan(_ touches: Set, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
}
- override func touchesEnded(_ touches: Set, with event: UIEvent?) {
+ override public func touchesEnded(_ touches: Set, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
}
- override func touchesCancelled(_ touches: Set?, with event: UIEvent?) {
+ override public func touchesCancelled(_ touches: Set?, with event: UIEvent?) {
super.touchesCancelled(touches, with: event)
}
}
diff --git a/submodules/ContextUI/ContextUI_Xcode.xcodeproj/project.pbxproj b/submodules/ContextUI/ContextUI_Xcode.xcodeproj/project.pbxproj
index 9f3333daec..1bb4fb705e 100644
--- a/submodules/ContextUI/ContextUI_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/ContextUI/ContextUI_Xcode.xcodeproj/project.pbxproj
@@ -13,6 +13,8 @@
D038AC7522F8A06200320981 /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D038AC7422F8A06200320981 /* Display.framework */; };
D038AC7722F8A07000320981 /* ContextController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D038AC7622F8A07000320981 /* ContextController.swift */; };
D038AC7922F8A08A00320981 /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D038AC7822F8A08A00320981 /* AsyncDisplayKit.framework */; };
+ D0624F93230C0CB7000FC2BD /* ReactionSelectionNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0624F92230C0CB7000FC2BD /* ReactionSelectionNode.framework */; };
+ D0624F95230C0D2C000FC2BD /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0624F94230C0D2C000FC2BD /* TelegramCore.framework */; };
D09E777F22F8E47000B9CCA7 /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E777E22F8E47000B9CCA7 /* TelegramPresentationData.framework */; };
D09E778122F8E62000B9CCA7 /* ContextActionsContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09E778022F8E62000B9CCA7 /* ContextActionsContainerNode.swift */; };
D09E778322F8E67300B9CCA7 /* ContextActionNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09E778222F8E67300B9CCA7 /* ContextActionNode.swift */; };
@@ -30,6 +32,8 @@
D038AC7422F8A06200320981 /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D038AC7622F8A07000320981 /* ContextController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextController.swift; sourceTree = ""; };
D038AC7822F8A08A00320981 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D0624F92230C0CB7000FC2BD /* ReactionSelectionNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ReactionSelectionNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D0624F94230C0D2C000FC2BD /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D09E777E22F8E47000B9CCA7 /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D09E778022F8E62000B9CCA7 /* ContextActionsContainerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextActionsContainerNode.swift; sourceTree = ""; };
D09E778222F8E67300B9CCA7 /* ContextActionNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextActionNode.swift; sourceTree = ""; };
@@ -43,6 +47,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ D0624F95230C0D2C000FC2BD /* TelegramCore.framework in Frameworks */,
+ D0624F93230C0CB7000FC2BD /* ReactionSelectionNode.framework in Frameworks */,
D0C9CBE42302D45F00FAB518 /* TextSelectionNode.framework in Frameworks */,
D09E777F22F8E47000B9CCA7 /* TelegramPresentationData.framework in Frameworks */,
D038AC7922F8A08A00320981 /* AsyncDisplayKit.framework in Frameworks */,
@@ -89,6 +95,8 @@
D038AC6F22F8A05A00320981 /* Frameworks */ = {
isa = PBXGroup;
children = (
+ D0624F94230C0D2C000FC2BD /* TelegramCore.framework */,
+ D0624F92230C0CB7000FC2BD /* ReactionSelectionNode.framework */,
D0C9CBE32302D45F00FAB518 /* TextSelectionNode.framework */,
D09E777E22F8E47000B9CCA7 /* TelegramPresentationData.framework */,
D038AC7822F8A08A00320981 /* AsyncDisplayKit.framework */,
diff --git a/submodules/ContextUI/Sources/ContextActionNode.swift b/submodules/ContextUI/Sources/ContextActionNode.swift
index 7881690856..46ca6f16b0 100644
--- a/submodules/ContextUI/Sources/ContextActionNode.swift
+++ b/submodules/ContextUI/Sources/ContextActionNode.swift
@@ -103,7 +103,7 @@ final class ContextActionNode: ASDisplayNode {
func updateLayout(constrainedWidth: CGFloat, previous: ContextActionSibling, next: ContextActionSibling) -> (CGSize, (CGSize, ContainedViewLayoutTransition) -> Void) {
let sideInset: CGFloat = 16.0
- let iconSideInset: CGFloat = 8.0
+ let iconSideInset: CGFloat = 12.0
let verticalInset: CGFloat = 12.0
let iconSize = self.iconNode.image.flatMap({ $0.size }) ?? CGSize()
diff --git a/submodules/ContextUI/Sources/ContextContentSourceNode.swift b/submodules/ContextUI/Sources/ContextContentSourceNode.swift
index 3c37d7090b..a2f91e3cd3 100644
--- a/submodules/ContextUI/Sources/ContextContentSourceNode.swift
+++ b/submodules/ContextUI/Sources/ContextContentSourceNode.swift
@@ -12,6 +12,7 @@ public final class ContextContentContainingNode: ASDisplayNode {
public var applyAbsoluteOffset: ((CGFloat, ContainedViewLayoutTransitionCurve, Double) -> Void)?
public var applyAbsoluteOffsetSpring: ((CGFloat, Double, CGFloat) -> Void)?
public var layoutUpdated: ((CGSize) -> Void)?
+ public var updateDistractionFreeMode: ((Bool) -> Void)?
public override init() {
self.contentNode = ContextContentNode()
diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift
index 2e045b0cdf..e1a9e3b786 100644
--- a/submodules/ContextUI/Sources/ContextController.swift
+++ b/submodules/ContextUI/Sources/ContextController.swift
@@ -4,6 +4,8 @@ import AsyncDisplayKit
import Display
import TelegramPresentationData
import TextSelectionNode
+import ReactionSelectionNode
+import TelegramCore
public enum ContextMenuActionItemTextLayout {
case singleLine
@@ -48,6 +50,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
private let source: ContextControllerContentSource
private var items: [ContextMenuItem]
private let beginDismiss: (ContextMenuActionResult) -> Void
+ private let reactionSelected: (String) -> Void
private var validLayout: ContainerViewLayout?
@@ -64,20 +67,26 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
private var contentParentNode: ContextContentContainingNode?
private let contentContainerNode: ContextContentContainerNode
private var actionsContainerNode: ContextActionsContainerNode
+ private var reactionContextNode: ReactionContextNode?
+ private var reactionContextNodeIsAnimatingOut = false
private var didCompleteAnimationIn = false
private var initialContinueGesturePoint: CGPoint?
private var didMoveFromInitialGesturePoint = false
private var highlightedActionNode: ContextActionNode?
+ private var highlightedReaction: String?
private let hapticFeedback = HapticFeedback()
- init(controller: ContextController, theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], beginDismiss: @escaping (ContextMenuActionResult) -> Void, recognizer: TapLongTapOrDoubleTapGestureRecognizer?) {
+ 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) {
self.theme = theme
self.strings = strings
self.source = source
self.items = items
self.beginDismiss = beginDismiss
+ self.reactionSelected = reactionSelected
self.effectView = UIVisualEffectView()
if #available(iOS 9.0, *) {
@@ -114,16 +123,14 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
beginDismiss(result)
})
- super.init()
+ if !reactionItems.isEmpty {
+ let reactionContextNode = ReactionContextNode(account: account, theme: theme, items: reactionItems)
+ self.reactionContextNode = reactionContextNode
+ } else {
+ self.reactionContextNode = nil
+ }
- /*if #available(iOS 10.0, *) {
- let propertyAnimator = UIViewPropertyAnimator(duration: 0.4, curve: .linear)
- propertyAnimator.isInterruptible = true
- propertyAnimator.addAnimations {
- self.effectView.effect = makeCustomZoomBlurEffect()
- }
- self.propertyAnimator = propertyAnimator
- }*/
+ super.init()
self.scrollNode.view.delegate = self
@@ -136,6 +143,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
self.scrollNode.addSubnode(self.actionsContainerNode)
self.scrollNode.addSubnode(self.contentContainerNode)
+ self.reactionContextNode.flatMap(self.addSubnode)
getController = { [weak controller] in
return controller
@@ -172,6 +180,24 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
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()
+ }
+ }
+ }
}
}
}
@@ -181,21 +207,43 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
recognizer.externalUpdated = nil
if strongSelf.didMoveFromInitialGesturePoint {
- if let (view, point) = viewAndPoint {
- let _ = strongSelf.view.convert(point, from: view)
+ 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 {
+ reactionContextNode.reactionSelected = { [weak self] reaction in
+ guard let _ = self else {
+ return
+ }
+ switch reaction {
+ case let .reaction(value, _, _):
+ reactionSelected(value)
+ default:
+ break
+ }
+ }
+ }
}
deinit {
@@ -229,11 +277,34 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
guard let strongSelf = self, let contentParentNode = contentParentNode, let parentSupernode = contentParentNode.supernode else {
return
}
+ if strongSelf.isAnimatingOut {
+ return
+ }
strongSelf.originalProjectedContentViewFrame = (parentSupernode.view.convert(contentParentNode.frame, to: strongSelf.view), contentParentNode.view.convert(contentParentNode.contentRect, to: strongSelf.view))
if let validLayout = strongSelf.validLayout {
strongSelf.updateLayout(layout: validLayout, transition: .animated(duration: 0.2, 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
+ reactionContextNode.allowsGroupOpacity = true
+ reactionContextNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, 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, completion: { [weak reactionContextNode] _ in
+ reactionContextNode?.allowsGroupOpacity = false
+ })
+ }
+ }
self.contentContainerNode.contentNode = takenViewInfo.contentContainingNode.contentNode
self.contentAreaInScreenSpace = takenViewInfo.contentAreaInScreenSpace
self.contentContainerNode.addSubnode(takenViewInfo.contentContainingNode.contentNode)
@@ -264,6 +335,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
} else {
UIView.animate(withDuration: 0.2, animations: {
self.effectView.effect = makeCustomZoomBlurEffect()
+ }, completion: { [weak self] _ in
+ self?.didCompleteAnimationIn = true
})
}
self.actionsContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
@@ -274,6 +347,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
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))
+ }
+
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 - contentParentNode.contentRect.minY)
self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: contentContainerOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true)
@@ -283,6 +360,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
func animateOut(result: ContextMenuActionResult, completion: @escaping () -> Void) {
self.isUserInteractionEnabled = false
+ self.isAnimatingOut = true
var completedEffect = false
var completedContentNode = false
@@ -357,6 +435,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
})
contentParentNode.updateAbsoluteRect?(self.contentContainerNode.frame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y + contentContainerOffset.y), self.bounds.size)
contentParentNode.applyAbsoluteOffset?(-contentContainerOffset.y, .easeInOut, 0.2)
+
+ 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)
@@ -370,9 +452,46 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
completedContentNode = true
intermediateCompletion()
})
+
+ if let reactionContextNode = self.reactionContextNode {
+ reactionContextNode.animateOut(to: nil, animatingOutToReaction: self.reactionContextNodeIsAnimatingOut)
+ }
}
}
+ func animateOutToReaction(value: String, into targetNode: ASImageNode, hideNode: Bool, completion: @escaping () -> Void) {
+ guard let reactionContextNode = self.reactionContextNode else {
+ self.animateOut(result: .default, completion: completion)
+ return
+ }
+ var contentCompleted = false
+ var reactionCompleted = false
+ let intermediateCompletion: () -> Void = {
+ if contentCompleted && reactionCompleted {
+ completion()
+ }
+ }
+
+ self.reactionContextNodeIsAnimatingOut = true
+ self.animateOut(result: .default, completion: {
+ contentCompleted = true
+ intermediateCompletion()
+ })
+ reactionContextNode.animateOutToReaction(value: value, targetNode: targetNode, hideNode: hideNode, completion: { [weak self] in
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.reactionContextNode?.removeFromSupernode()
+ strongSelf.reactionContextNode = nil
+ reactionCompleted = true
+ intermediateCompletion()
+ /*strongSelf.animateOut(result: .default, completion: {
+ reactionCompleted = true
+ intermediateCompletion()
+ })*/
+ })
+ }
+
func setItems(controller: ContextController, items: [ContextMenuItem]) {
self.items = items
@@ -406,9 +525,12 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(), size: layout.size))
- let contentActionsSpacing: CGFloat = 11.0
+ let contentActionsSpacing: CGFloat = 7.0
let actionsSideInset: CGFloat = 11.0
- let contentTopInset: CGFloat = max(11.0, layout.statusBarHeight ?? 0.0)
+ var contentTopInset: CGFloat = max(11.0, layout.statusBarHeight ?? 0.0)
+ if let _ = self.reactionContextNode {
+ contentTopInset += 34.0
+ }
let actionsBottomInset: CGFloat = 11.0
if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode {
@@ -452,7 +574,13 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
}
- contentParentNode.updateAbsoluteRect?(contentContainerFrame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y), layout.size)
+ let absoluteContentRect = contentContainerFrame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y)
+
+ contentParentNode.updateAbsoluteRect?(absoluteContentRect, layout.size)
+
+ if let reactionContextNode = self.reactionContextNode {
+ reactionContextNode.updateLayout(size: layout.size, anchorRect: CGRect(origin: CGPoint(x: absoluteContentRect.minX + contentParentNode.contentRect.minX, y: absoluteContentRect.minY + contentParentNode.contentRect.minY), size: contentParentNode.contentRect.size), transition: transition)
+ }
}
if let previousActionsContainerNode = previousActionsContainerNode {
@@ -483,6 +611,11 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
if !self.bounds.contains(point) {
return nil
}
+ if let reactionContextNode = self.reactionContextNode {
+ if let result = reactionContextNode.hitTest(self.view.convert(point, to: reactionContextNode.view), with: event) {
+ return result
+ }
+ }
let mappedPoint = self.view.convert(point, to: self.scrollNode.view)
if self.actionsContainerNode.frame.contains(mappedPoint) {
return self.actionsContainerNode.hitTest(self.view.convert(point, to: self.actionsContainerNode.view), with: event)
@@ -524,10 +657,12 @@ public protocol ContextControllerContentSource: class {
}
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 var reactionItems: [ReactionContextItem]
private weak var recognizer: TapLongTapOrDoubleTapGestureRecognizer?
@@ -538,11 +673,15 @@ public final class ContextController: ViewController {
return self.displayNode as! ContextControllerNode
}
- public init(theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], recognizer: TapLongTapOrDoubleTapGestureRecognizer? = nil) {
+ public var reactionSelected: ((String) -> Void)?
+
+ public init(account: Account, theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], reactionItems: [ReactionContextItem], recognizer: TapLongTapOrDoubleTapGestureRecognizer? = nil) {
+ self.account = account
self.theme = theme
self.strings = strings
self.source = source
self.items = items
+ self.reactionItems = reactionItems
self.recognizer = recognizer
super.init(navigationBarPresentationData: nil)
@@ -555,9 +694,14 @@ public final class ContextController: ViewController {
}
override public func loadDisplayNode() {
- self.displayNode = ContextControllerNode(controller: self, theme: self.theme, strings: self.strings, source: self.source, items: self.items, beginDismiss: { [weak self] result in
+ 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)
+ }, recognizer: self.recognizer, reactionSelected: { [weak self] value in
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.reactionSelected?(value)
+ })
self.displayNodeDidLoad()
}
@@ -600,4 +744,14 @@ public final class ContextController: ViewController {
override public func dismiss(completion: (() -> Void)? = nil) {
self.dismiss(result: .default, completion: completion)
}
+
+ public func dismissWithReaction(value: String, into targetNode: ASImageNode, hideNode: Bool, completion: (() -> Void)?) {
+ if !self.wasDismissed {
+ self.wasDismissed = true
+ self.controllerNode.animateOutToReaction(value: value, into: targetNode, hideNode: hideNode, completion: { [weak self] in
+ self?.presentingViewController?.dismiss(animated: false, completion: nil)
+ completion?()
+ })
+ }
+ }
}
diff --git a/submodules/CounterContollerTitleView/CounterContollerTitleView_Xcode.xcodeproj/project.pbxproj b/submodules/CounterContollerTitleView/CounterContollerTitleView_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..4efa9e443c
--- /dev/null
+++ b/submodules/CounterContollerTitleView/CounterContollerTitleView_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,559 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D03E48CA230863B50049C28B /* CounterContollerTitleView.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E48C8230863B50049C28B /* CounterContollerTitleView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D03E48D52308642B0049C28B /* CounterContollerTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E48D42308642B0049C28B /* CounterContollerTitleView.swift */; };
+ D03E48D82308644C0049C28B /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48D72308644C0049C28B /* TelegramPresentationData.framework */; };
+ D03E48DA230864550049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48D9230864550049C28B /* Foundation.framework */; };
+ D03E48DC230864570049C28B /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48DB230864570049C28B /* Display.framework */; };
+ D03E48DE2308645E0049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48DD2308645E0049C28B /* UIKit.framework */; };
+ D03E48E0230864650049C28B /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48DF230864650049C28B /* AsyncDisplayKit.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ D03E48C5230863B50049C28B /* CounterContollerTitleView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CounterContollerTitleView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48C8230863B50049C28B /* CounterContollerTitleView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CounterContollerTitleView.h; sourceTree = ""; };
+ D03E48C9230863B50049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D03E48D42308642B0049C28B /* CounterContollerTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CounterContollerTitleView.swift; sourceTree = ""; };
+ D03E48D72308644C0049C28B /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48D9230864550049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D03E48DB230864570049C28B /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48DD2308645E0049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ D03E48DF230864650049C28B /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E48C2230863B50049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E48E0230864650049C28B /* AsyncDisplayKit.framework in Frameworks */,
+ D03E48DE2308645E0049C28B /* UIKit.framework in Frameworks */,
+ D03E48DC230864570049C28B /* Display.framework in Frameworks */,
+ D03E48DA230864550049C28B /* Foundation.framework in Frameworks */,
+ D03E48D82308644C0049C28B /* TelegramPresentationData.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D03E48BB230863B50049C28B = {
+ isa = PBXGroup;
+ children = (
+ D03E48C9230863B50049C28B /* Info.plist */,
+ D03E48C7230863B50049C28B /* Sources */,
+ D03E48C6230863B50049C28B /* Products */,
+ D03E48D62308644C0049C28B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D03E48C6230863B50049C28B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D03E48C5230863B50049C28B /* CounterContollerTitleView.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D03E48C7230863B50049C28B /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D03E48D42308642B0049C28B /* CounterContollerTitleView.swift */,
+ D03E48C8230863B50049C28B /* CounterContollerTitleView.h */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D03E48D62308644C0049C28B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D03E48DF230864650049C28B /* AsyncDisplayKit.framework */,
+ D03E48DD2308645E0049C28B /* UIKit.framework */,
+ D03E48DB230864570049C28B /* Display.framework */,
+ D03E48D9230864550049C28B /* Foundation.framework */,
+ D03E48D72308644C0049C28B /* TelegramPresentationData.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D03E48C0230863B50049C28B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E48CA230863B50049C28B /* CounterContollerTitleView.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D03E48C4230863B50049C28B /* CounterContollerTitleView */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D03E48CD230863B50049C28B /* Build configuration list for PBXNativeTarget "CounterContollerTitleView" */;
+ buildPhases = (
+ D03E48C0230863B50049C28B /* Headers */,
+ D03E48C1230863B50049C28B /* Sources */,
+ D03E48C2230863B50049C28B /* Frameworks */,
+ D03E48C3230863B50049C28B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = CounterContollerTitleView;
+ productName = CounterContollerTitleView;
+ productReference = D03E48C5230863B50049C28B /* CounterContollerTitleView.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D03E48BC230863B50049C28B /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1030;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D03E48C4230863B50049C28B = {
+ CreatedOnToolsVersion = 10.3;
+ LastSwiftMigration = 1030;
+ };
+ };
+ };
+ buildConfigurationList = D03E48BF230863B50049C28B /* Build configuration list for PBXProject "CounterContollerTitleView_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D03E48BB230863B50049C28B;
+ productRefGroup = D03E48C6230863B50049C28B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D03E48C4230863B50049C28B /* CounterContollerTitleView */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D03E48C3230863B50049C28B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D03E48C1230863B50049C28B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E48D52308642B0049C28B /* CounterContollerTitleView.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D03E48CB230863B50049C28B /* 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;
+ };
+ D03E48CC230863B50049C28B /* 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;
+ };
+ D03E48CE230863B50049C28B /* 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.CounterContollerTitleView;
+ 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;
+ };
+ D03E48CF230863B50049C28B /* 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.CounterContollerTitleView;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E48D0230863E20049C28B /* 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;
+ };
+ D03E48D1230863E20049C28B /* 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.CounterContollerTitleView;
+ 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;
+ };
+ D03E48D2230863F10049C28B /* 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;
+ };
+ D03E48D3230863F10049C28B /* 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.CounterContollerTitleView;
+ 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 */
+ D03E48BF230863B50049C28B /* Build configuration list for PBXProject "CounterContollerTitleView_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E48CB230863B50049C28B /* DebugAppStoreLLC */,
+ D03E48D0230863E20049C28B /* DebugHockeyapp */,
+ D03E48CC230863B50049C28B /* ReleaseAppStoreLLC */,
+ D03E48D2230863F10049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D03E48CD230863B50049C28B /* Build configuration list for PBXNativeTarget "CounterContollerTitleView" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E48CE230863B50049C28B /* DebugAppStoreLLC */,
+ D03E48D1230863E20049C28B /* DebugHockeyapp */,
+ D03E48CF230863B50049C28B /* ReleaseAppStoreLLC */,
+ D03E48D3230863F10049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D03E48BC230863B50049C28B /* Project object */;
+}
diff --git a/submodules/CounterContollerTitleView/Info.plist b/submodules/CounterContollerTitleView/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/CounterContollerTitleView/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/CounterContollerTitleView/Sources/CounterContollerTitleView.h b/submodules/CounterContollerTitleView/Sources/CounterContollerTitleView.h
new file mode 100644
index 0000000000..c0ddce18a5
--- /dev/null
+++ b/submodules/CounterContollerTitleView/Sources/CounterContollerTitleView.h
@@ -0,0 +1,19 @@
+//
+// CounterContollerTitleView.h
+// CounterContollerTitleView
+//
+// Created by Peter on 8/17/19.
+// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
+//
+
+#import
+
+//! Project version number for CounterContollerTitleView.
+FOUNDATION_EXPORT double CounterContollerTitleViewVersionNumber;
+
+//! Project version string for CounterContollerTitleView.
+FOUNDATION_EXPORT const unsigned char CounterContollerTitleViewVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/TelegramUI/TelegramUI/CounterContollerTitleView.swift b/submodules/CounterContollerTitleView/Sources/CounterContollerTitleView.swift
similarity index 83%
rename from submodules/TelegramUI/TelegramUI/CounterContollerTitleView.swift
rename to submodules/CounterContollerTitleView/Sources/CounterContollerTitleView.swift
index 916d2066f6..2fd165435e 100644
--- a/submodules/TelegramUI/TelegramUI/CounterContollerTitleView.swift
+++ b/submodules/CounterContollerTitleView/Sources/CounterContollerTitleView.swift
@@ -4,17 +4,22 @@ import Display
import AsyncDisplayKit
import TelegramPresentationData
-struct CounterContollerTitle: Equatable {
- let title: String
- let counter: String
+public struct CounterContollerTitle: Equatable {
+ public var title: String
+ public var counter: String
+
+ public init(title: String, counter: String) {
+ self.title = title
+ self.counter = counter
+ }
}
-final class CounterContollerTitleView: UIView {
+public final class CounterContollerTitleView: UIView {
private var theme: PresentationTheme
private let titleNode: ImmediateTextNode
private let subtitleNode: ImmediateTextNode
- var title: CounterContollerTitle = CounterContollerTitle(title: "", counter: "") {
+ public var title: CounterContollerTitle = CounterContollerTitle(title: "", counter: "") {
didSet {
if self.title != oldValue {
self.titleNode.attributedText = NSAttributedString(string: self.title.title, font: Font.bold(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor)
@@ -28,7 +33,7 @@ final class CounterContollerTitleView: UIView {
}
}
- init(theme: PresentationTheme) {
+ public init(theme: PresentationTheme) {
self.theme = theme
self.titleNode = ImmediateTextNode()
@@ -52,11 +57,11 @@ final class CounterContollerTitleView: UIView {
self.addSubnode(self.subtitleNode)
}
- required init?(coder aDecoder: NSCoder) {
+ required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
- override func layoutSubviews() {
+ override public func layoutSubviews() {
super.layoutSubviews()
let size = self.bounds.size
diff --git a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj
index 4670f11c1a..ac6072ee0a 100644
--- a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj
@@ -225,6 +225,664 @@
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
+ D0208AAC2306E7EB00A23503 /* HockeyappMacAlpha */ = {
+ 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;
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = HockeyappMacAlpha;
+ };
+ D0208AAD2306E7EB00A23503 /* HockeyappMacAlpha */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ 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.Crc32;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = HockeyappMacAlpha;
+ };
+ D0208AAE2306E7EB00A23503 /* HockeyappMacAlpha */ = {
+ 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 = "Mac Developer";
+ CODE_SIGN_STYLE = Manual;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ FRAMEWORK_VERSION = A;
+ 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;
+ INFOPLIST_FILE = crc32mac/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.crc32mac;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SDKROOT = macosx;
+ SKIP_INSTALL = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = HockeyappMacAlpha;
+ };
+ D0208AAF2306E7F700A23503 /* DebugAppStore */ = {
+ 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;
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = DebugAppStore;
+ };
+ D0208AB02306E7F700A23503 /* DebugAppStore */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ 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.Crc32;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = DebugAppStore;
+ };
+ D0208AB12306E7F700A23503 /* DebugAppStore */ = {
+ 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 = "Mac Developer";
+ CODE_SIGN_STYLE = Manual;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ FRAMEWORK_VERSION = A;
+ 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;
+ INFOPLIST_FILE = crc32mac/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.crc32mac;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SDKROOT = macosx;
+ SKIP_INSTALL = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = DebugAppStore;
+ };
+ D0208AB22306E7FD00A23503 /* ReleaseAppStore */ = {
+ 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;
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = ReleaseAppStore;
+ };
+ D0208AB32306E7FD00A23503 /* ReleaseAppStore */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ 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.Crc32;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStore;
+ };
+ D0208AB42306E7FD00A23503 /* ReleaseAppStore */ = {
+ 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 = "Mac Developer";
+ CODE_SIGN_STYLE = Manual;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ FRAMEWORK_VERSION = A;
+ 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;
+ INFOPLIST_FILE = crc32mac/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.crc32mac;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SDKROOT = macosx;
+ SKIP_INSTALL = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = ReleaseAppStore;
+ };
+ D0208AB52306E80300A23503 /* ReleaseHockeyapp */ = {
+ 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;
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = ReleaseHockeyapp;
+ };
+ D0208AB62306E80300A23503 /* ReleaseHockeyapp */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ 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.Crc32;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseHockeyapp;
+ };
+ D0208AB72306E80300A23503 /* ReleaseHockeyapp */ = {
+ 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 = "Mac Developer";
+ CODE_SIGN_STYLE = Manual;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ FRAMEWORK_VERSION = A;
+ 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;
+ INFOPLIST_FILE = crc32mac/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MACH_O_TYPE = staticlib;
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = org.telegram.crc32mac;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SDKROOT = macosx;
+ SKIP_INSTALL = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = ReleaseHockeyapp;
+ };
D03E456A2305CC310049C28B /* DebugAppStoreLLC */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -636,6 +1294,7 @@
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
+ MACH_O_TYPE = staticlib;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
@@ -717,6 +1376,7 @@
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
+ MACH_O_TYPE = staticlib;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
@@ -792,6 +1452,7 @@
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
+ MACH_O_TYPE = staticlib;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
@@ -866,6 +1527,7 @@
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
+ MACH_O_TYPE = staticlib;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
@@ -887,7 +1549,11 @@
buildConfigurations = (
D03E456A2305CC310049C28B /* DebugAppStoreLLC */,
D03E456F2305CC4E0049C28B /* DebugHockeyapp */,
+ D0208AAF2306E7F700A23503 /* DebugAppStore */,
+ D0208AAC2306E7EB00A23503 /* HockeyappMacAlpha */,
D03E456B2305CC310049C28B /* ReleaseAppStoreLLC */,
+ D0208AB22306E7FD00A23503 /* ReleaseAppStore */,
+ D0208AB52306E80300A23503 /* ReleaseHockeyapp */,
D03E45712305CC590049C28B /* ReleaseHockeyappInternal */,
);
defaultConfigurationIsVisible = 0;
@@ -898,7 +1564,11 @@
buildConfigurations = (
D03E456D2305CC310049C28B /* DebugAppStoreLLC */,
D03E45702305CC4E0049C28B /* DebugHockeyapp */,
+ D0208AB02306E7F700A23503 /* DebugAppStore */,
+ D0208AAD2306E7EB00A23503 /* HockeyappMacAlpha */,
D03E456E2305CC310049C28B /* ReleaseAppStoreLLC */,
+ D0208AB32306E7FD00A23503 /* ReleaseAppStore */,
+ D0208AB62306E80300A23503 /* ReleaseHockeyapp */,
D03E45722305CC590049C28B /* ReleaseHockeyappInternal */,
);
defaultConfigurationIsVisible = 0;
@@ -909,7 +1579,11 @@
buildConfigurations = (
D03E46372306E0BB0049C28B /* DebugAppStoreLLC */,
D03E46382306E0BB0049C28B /* DebugHockeyapp */,
+ D0208AB12306E7F700A23503 /* DebugAppStore */,
+ D0208AAE2306E7EB00A23503 /* HockeyappMacAlpha */,
D03E46392306E0BB0049C28B /* ReleaseAppStoreLLC */,
+ D0208AB42306E7FD00A23503 /* ReleaseAppStore */,
+ D0208AB72306E80300A23503 /* ReleaseHockeyapp */,
D03E463A2306E0BB0049C28B /* ReleaseHockeyappInternal */,
);
defaultConfigurationIsVisible = 0;
diff --git a/submodules/Display/Display/ContainedViewLayoutTransition.swift b/submodules/Display/Display/ContainedViewLayoutTransition.swift
index ec438b5a21..147c8e762a 100644
--- a/submodules/Display/Display/ContainedViewLayoutTransition.swift
+++ b/submodules/Display/Display/ContainedViewLayoutTransition.swift
@@ -378,7 +378,7 @@ public extension ContainedViewLayoutTransition {
}
}
- func updateAlpha(node: ASDisplayNode, alpha: CGFloat, completion: ((Bool) -> Void)? = nil) {
+ func updateAlpha(node: ASDisplayNode, alpha: CGFloat, beginWithCurrentState: Bool = false, completion: ((Bool) -> Void)? = nil) {
if node.alpha.isEqual(to: alpha) {
if let completion = completion {
completion(true)
@@ -393,7 +393,12 @@ public extension ContainedViewLayoutTransition {
completion(true)
}
case let .animated(duration, curve):
- let previousAlpha = node.alpha
+ let previousAlpha: CGFloat
+ if beginWithCurrentState, let presentation = node.layer.presentation() {
+ previousAlpha = CGFloat(presentation.opacity)
+ } else {
+ previousAlpha = node.alpha
+ }
node.alpha = alpha
node.layer.animateAlpha(from: previousAlpha, to: alpha, duration: duration, timingFunction: curve.timingFunction, mediaTimingFunction: curve.mediaTimingFunction, completion: { result in
if let completion = completion {
diff --git a/submodules/Display/Display/TapLongTapOrDoubleTapGestureRecognizer.swift b/submodules/Display/Display/TapLongTapOrDoubleTapGestureRecognizer.swift
index 930240dcfd..add9373781 100644
--- a/submodules/Display/Display/TapLongTapOrDoubleTapGestureRecognizer.swift
+++ b/submodules/Display/Display/TapLongTapOrDoubleTapGestureRecognizer.swift
@@ -120,9 +120,9 @@ public final class TapLongTapOrDoubleTapGestureRecognizer: UIGestureRecognizer,
self.lastRecognizedGestureAndLocation = (.longTap, location)
if let longTap = self.longTap {
self.recognizedLongTap = true
+ self.state = .began
longTap(location, self)
cancelScrollViewGestures(view: self.view?.superview)
- self.state = .began
return
}
} else {
diff --git a/submodules/Display/Display/UIKitUtils.swift b/submodules/Display/Display/UIKitUtils.swift
index db471b3670..3c9f5ac627 100644
--- a/submodules/Display/Display/UIKitUtils.swift
+++ b/submodules/Display/Display/UIKitUtils.swift
@@ -329,6 +329,7 @@ private func makeLayerSubtreeSnapshot(layer: CALayer) -> CALayer? {
for sublayer in sublayers {
let subtree = makeLayerSubtreeSnapshot(layer: sublayer)
if let subtree = subtree {
+ subtree.transform = sublayer.transform
subtree.frame = sublayer.frame
subtree.bounds = sublayer.bounds
layer.addSublayer(subtree)
diff --git a/submodules/GridMessageSelectionNode/GridMessageSelectionNode_Xcode.xcodeproj/project.pbxproj b/submodules/GridMessageSelectionNode/GridMessageSelectionNode_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..5157cd080c
--- /dev/null
+++ b/submodules/GridMessageSelectionNode/GridMessageSelectionNode_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,563 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D03E48F4230865190049C28B /* GridMessageSelectionNode.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E48F2230865190049C28B /* GridMessageSelectionNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D03E48FF2308658E0049C28B /* GridMessageSelectionNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E48FE2308658D0049C28B /* GridMessageSelectionNode.swift */; };
+ D03E4902230865AE0049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4901230865AD0049C28B /* Foundation.framework */; };
+ D03E4904230865B50049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4903230865B40049C28B /* UIKit.framework */; };
+ D03E4906230865B60049C28B /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4905230865B60049C28B /* AsyncDisplayKit.framework */; };
+ D03E4908230865BC0049C28B /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4907230865BC0049C28B /* Display.framework */; };
+ D03E490A230865C70049C28B /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4909230865C70049C28B /* TelegramPresentationData.framework */; };
+ D03E490C230865CD0049C28B /* CheckNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E490B230865CD0049C28B /* CheckNode.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ D03E48EF230865190049C28B /* GridMessageSelectionNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GridMessageSelectionNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E48F2230865190049C28B /* GridMessageSelectionNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GridMessageSelectionNode.h; sourceTree = ""; };
+ D03E48F3230865190049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D03E48FE2308658D0049C28B /* GridMessageSelectionNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GridMessageSelectionNode.swift; sourceTree = ""; };
+ D03E4901230865AD0049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D03E4903230865B40049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ D03E4905230865B60049C28B /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4907230865BC0049C28B /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4909230865C70049C28B /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E490B230865CD0049C28B /* CheckNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CheckNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E48EC230865190049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E490C230865CD0049C28B /* CheckNode.framework in Frameworks */,
+ D03E490A230865C70049C28B /* TelegramPresentationData.framework in Frameworks */,
+ D03E4908230865BC0049C28B /* Display.framework in Frameworks */,
+ D03E4906230865B60049C28B /* AsyncDisplayKit.framework in Frameworks */,
+ D03E4904230865B50049C28B /* UIKit.framework in Frameworks */,
+ D03E4902230865AE0049C28B /* Foundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D03E48E5230865190049C28B = {
+ isa = PBXGroup;
+ children = (
+ D03E48F3230865190049C28B /* Info.plist */,
+ D03E48F1230865190049C28B /* Sources */,
+ D03E48F0230865190049C28B /* Products */,
+ D03E4900230865A80049C28B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D03E48F0230865190049C28B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D03E48EF230865190049C28B /* GridMessageSelectionNode.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D03E48F1230865190049C28B /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D03E48FE2308658D0049C28B /* GridMessageSelectionNode.swift */,
+ D03E48F2230865190049C28B /* GridMessageSelectionNode.h */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D03E4900230865A80049C28B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D03E490B230865CD0049C28B /* CheckNode.framework */,
+ D03E4909230865C70049C28B /* TelegramPresentationData.framework */,
+ D03E4907230865BC0049C28B /* Display.framework */,
+ D03E4905230865B60049C28B /* AsyncDisplayKit.framework */,
+ D03E4903230865B40049C28B /* UIKit.framework */,
+ D03E4901230865AD0049C28B /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D03E48EA230865190049C28B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E48F4230865190049C28B /* GridMessageSelectionNode.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D03E48EE230865190049C28B /* GridMessageSelectionNode */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D03E48F7230865190049C28B /* Build configuration list for PBXNativeTarget "GridMessageSelectionNode" */;
+ buildPhases = (
+ D03E48EA230865190049C28B /* Headers */,
+ D03E48EB230865190049C28B /* Sources */,
+ D03E48EC230865190049C28B /* Frameworks */,
+ D03E48ED230865190049C28B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = GridMessageSelectionNode;
+ productName = GridMessageSelectionNode;
+ productReference = D03E48EF230865190049C28B /* GridMessageSelectionNode.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D03E48E6230865190049C28B /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1030;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D03E48EE230865190049C28B = {
+ CreatedOnToolsVersion = 10.3;
+ LastSwiftMigration = 1030;
+ };
+ };
+ };
+ buildConfigurationList = D03E48E9230865190049C28B /* Build configuration list for PBXProject "GridMessageSelectionNode_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D03E48E5230865190049C28B;
+ productRefGroup = D03E48F0230865190049C28B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D03E48EE230865190049C28B /* GridMessageSelectionNode */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D03E48ED230865190049C28B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D03E48EB230865190049C28B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E48FF2308658E0049C28B /* GridMessageSelectionNode.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D03E48F5230865190049C28B /* 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;
+ };
+ D03E48F6230865190049C28B /* 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;
+ };
+ D03E48F8230865190049C28B /* 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.GridMessageSelectionNode;
+ 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;
+ };
+ D03E48F9230865190049C28B /* 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.GridMessageSelectionNode;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E48FA230865550049C28B /* 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;
+ };
+ D03E48FB230865550049C28B /* 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.GridMessageSelectionNode;
+ 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;
+ };
+ D03E48FC230865640049C28B /* 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;
+ };
+ D03E48FD230865640049C28B /* 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.GridMessageSelectionNode;
+ 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 */
+ D03E48E9230865190049C28B /* Build configuration list for PBXProject "GridMessageSelectionNode_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E48F5230865190049C28B /* DebugAppStoreLLC */,
+ D03E48FA230865550049C28B /* DebugHockeyapp */,
+ D03E48F6230865190049C28B /* ReleaseAppStoreLLC */,
+ D03E48FC230865640049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D03E48F7230865190049C28B /* Build configuration list for PBXNativeTarget "GridMessageSelectionNode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E48F8230865190049C28B /* DebugAppStoreLLC */,
+ D03E48FB230865550049C28B /* DebugHockeyapp */,
+ D03E48F9230865190049C28B /* ReleaseAppStoreLLC */,
+ D03E48FD230865640049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D03E48E6230865190049C28B /* Project object */;
+}
diff --git a/submodules/GridMessageSelectionNode/Info.plist b/submodules/GridMessageSelectionNode/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/GridMessageSelectionNode/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/GridMessageSelectionNode/Sources/GridMessageSelectionNode.h b/submodules/GridMessageSelectionNode/Sources/GridMessageSelectionNode.h
new file mode 100644
index 0000000000..7bc2834b05
--- /dev/null
+++ b/submodules/GridMessageSelectionNode/Sources/GridMessageSelectionNode.h
@@ -0,0 +1,19 @@
+//
+// GridMessageSelectionNode.h
+// GridMessageSelectionNode
+//
+// Created by Peter on 8/17/19.
+// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
+//
+
+#import
+
+//! Project version number for GridMessageSelectionNode.
+FOUNDATION_EXPORT double GridMessageSelectionNodeVersionNumber;
+
+//! Project version string for GridMessageSelectionNode.
+FOUNDATION_EXPORT const unsigned char GridMessageSelectionNodeVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/TelegramUI/TelegramUI/GridMessageSelectionNode.swift b/submodules/GridMessageSelectionNode/Sources/GridMessageSelectionNode.swift
similarity index 81%
rename from submodules/TelegramUI/TelegramUI/GridMessageSelectionNode.swift
rename to submodules/GridMessageSelectionNode/Sources/GridMessageSelectionNode.swift
index 274b0d01fc..312d959c2f 100644
--- a/submodules/TelegramUI/TelegramUI/GridMessageSelectionNode.swift
+++ b/submodules/GridMessageSelectionNode/Sources/GridMessageSelectionNode.swift
@@ -5,13 +5,13 @@ import Display
import TelegramPresentationData
import CheckNode
-final class GridMessageSelectionNode: ASDisplayNode {
+public final class GridMessageSelectionNode: ASDisplayNode {
private let toggle: (Bool) -> Void
private var selected = false
private let checkNode: CheckNode
- init(theme: PresentationTheme, toggle: @escaping (Bool) -> Void) {
+ public init(theme: PresentationTheme, toggle: @escaping (Bool) -> Void) {
self.toggle = toggle
self.checkNode = CheckNode(strokeColor: theme.list.itemCheckColors.strokeColor, fillColor: theme.list.itemCheckColors.fillColor, foregroundColor: theme.list.itemCheckColors.foregroundColor, style: .overlay)
self.checkNode.isUserInteractionEnabled = false
@@ -21,38 +21,38 @@ final class GridMessageSelectionNode: ASDisplayNode {
self.addSubnode(self.checkNode)
}
- override func didLoad() {
+ override public func didLoad() {
super.didLoad()
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:))))
}
- func animateIn() {
+ public func animateIn() {
self.checkNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring)
self.checkNode.layer.animateScale(from: 0.2, to: 1.0, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring)
}
- func animateOut(completion: @escaping () -> Void) {
+ public func animateOut(completion: @escaping () -> Void) {
self.checkNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false)
self.checkNode.layer.animateScale(from: 1.0, to: 0.2, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in
completion()
})
}
- func updateSelected(_ selected: Bool, animated: Bool) {
+ public func updateSelected(_ selected: Bool, animated: Bool) {
if self.selected != selected {
self.selected = selected
self.checkNode.setIsChecked(selected, animated: animated)
}
}
- @objc func tapGesture(_ recognizer: UITapGestureRecognizer) {
+ @objc private func tapGesture(_ recognizer: UITapGestureRecognizer) {
if case .ended = recognizer.state {
self.toggle(!self.selected)
}
}
- override func layout() {
+ override public func layout() {
super.layout()
let checkSize = CGSize(width: 32.0, height: 32.0)
diff --git a/submodules/HexColor/HexColor_Xcode.xcodeproj/project.pbxproj b/submodules/HexColor/HexColor_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..9358430255
--- /dev/null
+++ b/submodules/HexColor/HexColor_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,547 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D03E47FA2307690E0049C28B /* HexColor.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E47F82307690E0049C28B /* HexColor.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D03E4805230769790049C28B /* HexColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E4804230769780049C28B /* HexColor.swift */; };
+ D03E48082307698C0049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48072307698B0049C28B /* Foundation.framework */; };
+ D03E480A230769910049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4809230769910049C28B /* UIKit.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ D03E47F52307690E0049C28B /* HexColor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HexColor.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E47F82307690E0049C28B /* HexColor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HexColor.h; sourceTree = ""; };
+ D03E47F92307690E0049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D03E4804230769780049C28B /* HexColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HexColor.swift; sourceTree = ""; };
+ D03E48072307698B0049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D03E4809230769910049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E47F22307690E0049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E480A230769910049C28B /* UIKit.framework in Frameworks */,
+ D03E48082307698C0049C28B /* Foundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D03E47EB2307690E0049C28B = {
+ isa = PBXGroup;
+ children = (
+ D03E47F92307690E0049C28B /* Info.plist */,
+ D03E47F72307690E0049C28B /* Sources */,
+ D03E47F62307690E0049C28B /* Products */,
+ D03E4806230769880049C28B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D03E47F62307690E0049C28B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D03E47F52307690E0049C28B /* HexColor.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D03E47F72307690E0049C28B /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4804230769780049C28B /* HexColor.swift */,
+ D03E47F82307690E0049C28B /* HexColor.h */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D03E4806230769880049C28B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4809230769910049C28B /* UIKit.framework */,
+ D03E48072307698B0049C28B /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D03E47F02307690E0049C28B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E47FA2307690E0049C28B /* HexColor.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D03E47F42307690E0049C28B /* HexColor */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D03E47FD2307690E0049C28B /* Build configuration list for PBXNativeTarget "HexColor" */;
+ buildPhases = (
+ D03E47F02307690E0049C28B /* Headers */,
+ D03E47F12307690E0049C28B /* Sources */,
+ D03E47F22307690E0049C28B /* Frameworks */,
+ D03E47F32307690E0049C28B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = HexColor;
+ productName = HexColor;
+ productReference = D03E47F52307690E0049C28B /* HexColor.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D03E47EC2307690E0049C28B /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1030;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D03E47F42307690E0049C28B = {
+ CreatedOnToolsVersion = 10.3;
+ LastSwiftMigration = 1030;
+ };
+ };
+ };
+ buildConfigurationList = D03E47EF2307690E0049C28B /* Build configuration list for PBXProject "HexColor_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D03E47EB2307690E0049C28B;
+ productRefGroup = D03E47F62307690E0049C28B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D03E47F42307690E0049C28B /* HexColor */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D03E47F32307690E0049C28B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D03E47F12307690E0049C28B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E4805230769790049C28B /* HexColor.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D03E47FB2307690E0049C28B /* 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;
+ };
+ D03E47FC2307690E0049C28B /* 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;
+ };
+ D03E47FE2307690E0049C28B /* 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.HexColor;
+ 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;
+ };
+ D03E47FF2307690E0049C28B /* 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.HexColor;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E4800230769470049C28B /* 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;
+ };
+ D03E4801230769470049C28B /* 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.HexColor;
+ 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;
+ };
+ D03E4802230769510049C28B /* 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;
+ };
+ D03E4803230769510049C28B /* 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.HexColor;
+ 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 */
+ D03E47EF2307690E0049C28B /* Build configuration list for PBXProject "HexColor_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E47FB2307690E0049C28B /* DebugAppStoreLLC */,
+ D03E4800230769470049C28B /* DebugHockeyapp */,
+ D03E47FC2307690E0049C28B /* ReleaseAppStoreLLC */,
+ D03E4802230769510049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D03E47FD2307690E0049C28B /* Build configuration list for PBXNativeTarget "HexColor" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E47FE2307690E0049C28B /* DebugAppStoreLLC */,
+ D03E4801230769470049C28B /* DebugHockeyapp */,
+ D03E47FF2307690E0049C28B /* ReleaseAppStoreLLC */,
+ D03E4803230769510049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D03E47EC2307690E0049C28B /* Project object */;
+}
diff --git a/submodules/HexColor/Info.plist b/submodules/HexColor/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/HexColor/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/HexColor/Sources/HexColor.h b/submodules/HexColor/Sources/HexColor.h
new file mode 100644
index 0000000000..add4edae03
--- /dev/null
+++ b/submodules/HexColor/Sources/HexColor.h
@@ -0,0 +1,19 @@
+//
+// HexColor.h
+// HexColor
+//
+// Created by Peter on 8/17/19.
+// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
+//
+
+#import
+
+//! Project version number for HexColor.
+FOUNDATION_EXPORT double HexColorVersionNumber;
+
+//! Project version string for HexColor.
+FOUNDATION_EXPORT const unsigned char HexColorVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/TelegramUI/TelegramUI/HexColor.swift b/submodules/HexColor/Sources/HexColor.swift
similarity index 58%
rename from submodules/TelegramUI/TelegramUI/HexColor.swift
rename to submodules/HexColor/Sources/HexColor.swift
index 25daf3d89c..24fa5263c8 100644
--- a/submodules/TelegramUI/TelegramUI/HexColor.swift
+++ b/submodules/HexColor/Sources/HexColor.swift
@@ -1,7 +1,7 @@
import Foundation
import UIKit
-extension String {
+private extension String {
func rightJustified(width: Int, pad: String = " ", truncate: Bool = false) -> String {
guard width > count else {
return truncate ? String(suffix(width)) : self
@@ -17,8 +17,15 @@ extension String {
}
}
-extension UIColor {
+public extension UIColor {
var hexString: String {
- return String(self.rgb, radix: 16, uppercase: false).rightJustified(width: 6, pad: "0")
+ var red: CGFloat = 0.0
+ var green: CGFloat = 0.0
+ var blue: CGFloat = 0.0
+ self.getRed(&red, green: &green, blue: &blue, alpha: nil)
+
+ let rgb: UInt32 = (UInt32(red * 255.0) << 16) | (UInt32(green * 255.0) << 8) | (UInt32(blue * 255.0))
+
+ return String(rgb, radix: 16, uppercase: false).rightJustified(width: 6, pad: "0")
}
}
diff --git a/submodules/InstantPageCache/Info.plist b/submodules/InstantPageCache/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/InstantPageCache/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/InstantPageCache/InstantPageCache_Xcode.xcodeproj/project.pbxproj b/submodules/InstantPageCache/InstantPageCache_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..0ac44e60b5
--- /dev/null
+++ b/submodules/InstantPageCache/InstantPageCache_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,567 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D03E4920230866B60049C28B /* InstantPageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E491E230866B60049C28B /* InstantPageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D03E492B230867260049C28B /* CachedInstantPages.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E492A230867260049C28B /* CachedInstantPages.swift */; };
+ D03E492E2308673A0049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E492D230867390049C28B /* Foundation.framework */; };
+ D03E4930230867410049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E492F230867400049C28B /* UIKit.framework */; };
+ D03E4932230867420049C28B /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4931230867420049C28B /* SwiftSignalKit.framework */; };
+ D03E4934230867490049C28B /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4933230867490049C28B /* Postbox.framework */; };
+ D03E4936230867520049C28B /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E4935230867520049C28B /* TelegramCore.framework */; };
+ D03E49382308675E0049C28B /* TelegramUIPreferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E49372308675E0049C28B /* TelegramUIPreferences.framework */; };
+ D03E495B230868CF0049C28B /* PersistentStringHash.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E495A230868CF0049C28B /* PersistentStringHash.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ D03E491B230866B60049C28B /* InstantPageCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = InstantPageCache.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E491E230866B60049C28B /* InstantPageCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InstantPageCache.h; sourceTree = ""; };
+ D03E491F230866B60049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D03E492A230867260049C28B /* CachedInstantPages.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedInstantPages.swift; sourceTree = ""; };
+ D03E492D230867390049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D03E492F230867400049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ D03E4931230867420049C28B /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4933230867490049C28B /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E4935230867520049C28B /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E49372308675E0049C28B /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E495A230868CF0049C28B /* PersistentStringHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PersistentStringHash.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E4918230866B60049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E495B230868CF0049C28B /* PersistentStringHash.framework in Frameworks */,
+ D03E49382308675E0049C28B /* TelegramUIPreferences.framework in Frameworks */,
+ D03E4936230867520049C28B /* TelegramCore.framework in Frameworks */,
+ D03E4934230867490049C28B /* Postbox.framework in Frameworks */,
+ D03E4932230867420049C28B /* SwiftSignalKit.framework in Frameworks */,
+ D03E4930230867410049C28B /* UIKit.framework in Frameworks */,
+ D03E492E2308673A0049C28B /* Foundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D03E4911230866B60049C28B = {
+ isa = PBXGroup;
+ children = (
+ D03E491F230866B60049C28B /* Info.plist */,
+ D03E491D230866B60049C28B /* Sources */,
+ D03E491C230866B60049C28B /* Products */,
+ D03E492C230867350049C28B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D03E491C230866B60049C28B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D03E491B230866B60049C28B /* InstantPageCache.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D03E491D230866B60049C28B /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D03E492A230867260049C28B /* CachedInstantPages.swift */,
+ D03E491E230866B60049C28B /* InstantPageCache.h */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D03E492C230867350049C28B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D03E495A230868CF0049C28B /* PersistentStringHash.framework */,
+ D03E49372308675E0049C28B /* TelegramUIPreferences.framework */,
+ D03E4935230867520049C28B /* TelegramCore.framework */,
+ D03E4933230867490049C28B /* Postbox.framework */,
+ D03E4931230867420049C28B /* SwiftSignalKit.framework */,
+ D03E492F230867400049C28B /* UIKit.framework */,
+ D03E492D230867390049C28B /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D03E4916230866B60049C28B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E4920230866B60049C28B /* InstantPageCache.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D03E491A230866B60049C28B /* InstantPageCache */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D03E4923230866B60049C28B /* Build configuration list for PBXNativeTarget "InstantPageCache" */;
+ buildPhases = (
+ D03E4916230866B60049C28B /* Headers */,
+ D03E4917230866B60049C28B /* Sources */,
+ D03E4918230866B60049C28B /* Frameworks */,
+ D03E4919230866B60049C28B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = InstantPageCache;
+ productName = InstantPageCache;
+ productReference = D03E491B230866B60049C28B /* InstantPageCache.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D03E4912230866B60049C28B /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1030;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D03E491A230866B60049C28B = {
+ CreatedOnToolsVersion = 10.3;
+ LastSwiftMigration = 1030;
+ };
+ };
+ };
+ buildConfigurationList = D03E4915230866B60049C28B /* Build configuration list for PBXProject "InstantPageCache_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D03E4911230866B60049C28B;
+ productRefGroup = D03E491C230866B60049C28B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D03E491A230866B60049C28B /* InstantPageCache */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D03E4919230866B60049C28B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D03E4917230866B60049C28B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E492B230867260049C28B /* CachedInstantPages.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D03E4921230866B60049C28B /* 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;
+ };
+ D03E4922230866B60049C28B /* 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;
+ };
+ D03E4924230866B60049C28B /* 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.InstantPageCache;
+ 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;
+ };
+ D03E4925230866B60049C28B /* 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.InstantPageCache;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E4926230866E50049C28B /* 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;
+ };
+ D03E4927230866E50049C28B /* 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.InstantPageCache;
+ 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;
+ };
+ D03E4928230866F40049C28B /* 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;
+ };
+ D03E4929230866F40049C28B /* 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.InstantPageCache;
+ 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 */
+ D03E4915230866B60049C28B /* Build configuration list for PBXProject "InstantPageCache_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E4921230866B60049C28B /* DebugAppStoreLLC */,
+ D03E4926230866E50049C28B /* DebugHockeyapp */,
+ D03E4922230866B60049C28B /* ReleaseAppStoreLLC */,
+ D03E4928230866F40049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D03E4923230866B60049C28B /* Build configuration list for PBXNativeTarget "InstantPageCache" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E4924230866B60049C28B /* DebugAppStoreLLC */,
+ D03E4927230866E50049C28B /* DebugHockeyapp */,
+ D03E4925230866B60049C28B /* ReleaseAppStoreLLC */,
+ D03E4929230866F40049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D03E4912230866B60049C28B /* Project object */;
+}
diff --git a/submodules/TelegramUI/TelegramUI/CachedInstantPages.swift b/submodules/InstantPageCache/Sources/CachedInstantPages.swift
similarity index 75%
rename from submodules/TelegramUI/TelegramUI/CachedInstantPages.swift
rename to submodules/InstantPageCache/Sources/CachedInstantPages.swift
index a912c88f36..8b528633c6 100644
--- a/submodules/TelegramUI/TelegramUI/CachedInstantPages.swift
+++ b/submodules/InstantPageCache/Sources/CachedInstantPages.swift
@@ -4,28 +4,29 @@ import SwiftSignalKit
import Postbox
import TelegramCore
import TelegramUIPreferences
+import PersistentStringHash
-final class CachedInstantPage: PostboxCoding {
- let webPage: TelegramMediaWebpage
- let timestamp: Int32
+public final class CachedInstantPage: PostboxCoding {
+ public let webPage: TelegramMediaWebpage
+ public let timestamp: Int32
- init(webPage: TelegramMediaWebpage, timestamp: Int32) {
+ public init(webPage: TelegramMediaWebpage, timestamp: Int32) {
self.webPage = webPage
self.timestamp = timestamp
}
- init(decoder: PostboxDecoder) {
+ public init(decoder: PostboxDecoder) {
self.webPage = decoder.decodeObjectForKey("webpage", decoder: { TelegramMediaWebpage(decoder: $0) }) as! TelegramMediaWebpage
self.timestamp = decoder.decodeInt32ForKey("timestamp", orElse: 0)
}
- func encode(_ encoder: PostboxEncoder) {
+ public func encode(_ encoder: PostboxEncoder) {
encoder.encodeObject(self.webPage, forKey: "webpage")
encoder.encodeInt32(self.timestamp, forKey: "timestamp")
}
}
-func cachedInstantPage(postbox: Postbox, url: String) -> Signal {
+public func cachedInstantPage(postbox: Postbox, url: String) -> Signal {
return postbox.transaction { transaction -> CachedInstantPage? in
let key = ValueBoxKey(length: 8)
key.setInt64(0, value: Int64(bitPattern: url.persistentHashValue))
@@ -39,7 +40,7 @@ func cachedInstantPage(postbox: Postbox, url: String) -> Signal Signal {
+public func updateCachedInstantPage(postbox: Postbox, url: String, webPage: TelegramMediaWebpage?) -> Signal {
return postbox.transaction { transaction -> Void in
let key = ValueBoxKey(length: 8)
key.setInt64(0, value: Int64(bitPattern: url.persistentHashValue))
diff --git a/submodules/InstantPageCache/Sources/InstantPageCache.h b/submodules/InstantPageCache/Sources/InstantPageCache.h
new file mode 100644
index 0000000000..370730c351
--- /dev/null
+++ b/submodules/InstantPageCache/Sources/InstantPageCache.h
@@ -0,0 +1,19 @@
+//
+// InstantPageCache.h
+// InstantPageCache
+//
+// Created by Peter on 8/17/19.
+// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
+//
+
+#import
+
+//! Project version number for InstantPageCache.
+FOUNDATION_EXPORT double InstantPageCacheVersionNumber;
+
+//! Project version string for InstantPageCache.
+FOUNDATION_EXPORT const unsigned char InstantPageCacheVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift
index 91b50ea909..ce5115a171 100644
--- a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift
+++ b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift
@@ -582,7 +582,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode {
animationNode = AnimatedStickerNode()
strongSelf.animationNode = animationNode
strongSelf.addSubnode(animationNode)
- animationNode.setup(account: item.account, resource: resource, width: 80, height: 80, mode: .cached)
+ animationNode.setup(account: item.account, resource: .resource(resource), width: 80, height: 80, mode: .cached)
}
animationNode.visibility = strongSelf.visibility != .none && item.playAnimatedStickers
animationNode.isHidden = !item.playAnimatedStickers
diff --git a/submodules/LocalMediaResources/LocalMediaResources_Xcode.xcodeproj/project.pbxproj b/submodules/LocalMediaResources/LocalMediaResources_Xcode.xcodeproj/project.pbxproj
index 2bc9e12c6e..e20d4c7ba8 100644
--- a/submodules/LocalMediaResources/LocalMediaResources_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/LocalMediaResources/LocalMediaResources_Xcode.xcodeproj/project.pbxproj
@@ -13,6 +13,10 @@
D03E3FE82304C7DD0049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3FE72304C7DD0049C28B /* UIKit.framework */; };
D03E3FEA2304C7DF0049C28B /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3FE92304C7DF0049C28B /* Postbox.framework */; };
D03E3FEC2304C7E50049C28B /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3FEB2304C7E50049C28B /* TelegramCore.framework */; };
+ D03E487423076D350049C28B /* FetchPhotoLibraryImageResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E487323076D350049C28B /* FetchPhotoLibraryImageResource.swift */; };
+ D03E487623076D430049C28B /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E487523076D420049C28B /* Photos.framework */; };
+ D03E487823076D470049C28B /* ImageCompression.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E487723076D470049C28B /* ImageCompression.framework */; };
+ D03E487A23076D550049C28B /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E487923076D550049C28B /* SwiftSignalKit.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -24,6 +28,10 @@
D03E3FE72304C7DD0049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
D03E3FE92304C7DF0049C28B /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D03E3FEB2304C7E50049C28B /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E487323076D350049C28B /* FetchPhotoLibraryImageResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchPhotoLibraryImageResource.swift; sourceTree = ""; };
+ D03E487523076D420049C28B /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; };
+ D03E487723076D470049C28B /* ImageCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ImageCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E487923076D550049C28B /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -31,6 +39,9 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ D03E487A23076D550049C28B /* SwiftSignalKit.framework in Frameworks */,
+ D03E487823076D470049C28B /* ImageCompression.framework in Frameworks */,
+ D03E487623076D430049C28B /* Photos.framework in Frameworks */,
D03E3FEC2304C7E50049C28B /* TelegramCore.framework in Frameworks */,
D03E3FEA2304C7DF0049C28B /* Postbox.framework in Frameworks */,
D03E3FE82304C7DD0049C28B /* UIKit.framework in Frameworks */,
@@ -62,6 +73,7 @@
D03E3FD52304C76E0049C28B /* Sources */ = {
isa = PBXGroup;
children = (
+ D03E487323076D350049C28B /* FetchPhotoLibraryImageResource.swift */,
D03E3FE22304C7CA0049C28B /* MediaResources.swift */,
D03E3FD62304C76E0049C28B /* LocalMediaResources.h */,
);
@@ -71,6 +83,9 @@
D03E3FE42304C7D90049C28B /* Frameworks */ = {
isa = PBXGroup;
children = (
+ D03E487923076D550049C28B /* SwiftSignalKit.framework */,
+ D03E487723076D470049C28B /* ImageCompression.framework */,
+ D03E487523076D420049C28B /* Photos.framework */,
D03E3FEB2304C7E50049C28B /* TelegramCore.framework */,
D03E3FE92304C7DF0049C28B /* Postbox.framework */,
D03E3FE72304C7DD0049C28B /* UIKit.framework */,
@@ -160,6 +175,7 @@
buildActionMask = 2147483647;
files = (
D03E3FE32304C7CA0049C28B /* MediaResources.swift in Sources */,
+ D03E487423076D350049C28B /* FetchPhotoLibraryImageResource.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/submodules/TelegramUI/TelegramUI/FetchPhotoLibraryImageResource.swift b/submodules/LocalMediaResources/Sources/FetchPhotoLibraryImageResource.swift
similarity index 96%
rename from submodules/TelegramUI/TelegramUI/FetchPhotoLibraryImageResource.swift
rename to submodules/LocalMediaResources/Sources/FetchPhotoLibraryImageResource.swift
index f8c647d057..90c0cbb583 100644
--- a/submodules/TelegramUI/TelegramUI/FetchPhotoLibraryImageResource.swift
+++ b/submodules/LocalMediaResources/Sources/FetchPhotoLibraryImageResource.swift
@@ -10,7 +10,7 @@ private final class RequestId {
var invalidated: Bool = false
}
-func fetchPhotoLibraryResource(localIdentifier: String) -> Signal {
+public func fetchPhotoLibraryResource(localIdentifier: String) -> Signal {
return Signal { subscriber in
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [localIdentifier], options: nil)
let requestId = Atomic(value: RequestId())
@@ -105,7 +105,7 @@ func fetchPhotoLibraryResource(localIdentifier: String) -> Signal Signal<(UIImage, Bool)?, NoError> {
+public func fetchPhotoLibraryImage(localIdentifier: String, thumbnail: Bool) -> Signal<(UIImage, Bool)?, NoError> {
return Signal { subscriber in
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [localIdentifier], options: nil)
let requestId = Atomic(value: RequestId())
diff --git a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj
index 60b6cfeae6..3927679786 100644
--- a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj
@@ -461,10 +461,10 @@
D0CD98CB1D74BA9500F41187 /* MTTcpConnectionBehaviour.h in Headers */ = {isa = PBXBuildFile; fileRef = D063A39718B1650400C65116 /* MTTcpConnectionBehaviour.h */; };
D0CD98CC1D74BA9700F41187 /* MTTcpConnectionBehaviour.m in Sources */ = {isa = PBXBuildFile; fileRef = D063A39818B1650400C65116 /* MTTcpConnectionBehaviour.m */; };
D0CD98CD1D74BA9700F41187 /* MTTcpConnectionBehaviour.m in Sources */ = {isa = PBXBuildFile; fileRef = D063A39818B1650400C65116 /* MTTcpConnectionBehaviour.m */; };
- D0CD98DE1D74BAEA00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
- D0CD98DF1D74BAEA00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
- D0CD98E21D74BAEB00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
- D0CD98E31D74BAEB00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ D0CD98DE1D74BAEA00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; };
+ D0CD98DF1D74BAEA00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; };
+ D0CD98E21D74BAEB00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; };
+ D0CD98E31D74BAEB00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; };
D0CD98E41D74BAF400F41187 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F818AFF259007F1076 /* GCDAsyncSocket.m */; };
D0CD98E51D74BAF400F41187 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F818AFF259007F1076 /* GCDAsyncSocket.m */; };
D0CD98E81D75C0BB00F41187 /* MTMessageService.h in Headers */ = {isa = PBXBuildFile; fileRef = D063A35018B1631900C65116 /* MTMessageService.h */; settings = {ATTRIBUTES = (Public, ); }; };
diff --git a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m
index 59d5fa4058..c7a03d6126 100644
--- a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m
+++ b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m
@@ -187,8 +187,6 @@ static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperat
if (_outputStream) {
[_outputStream close];
}
-
- [super dealloc];
}
diff --git a/submodules/PersistentStringHash/Info.plist b/submodules/PersistentStringHash/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/PersistentStringHash/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/PersistentStringHash/PersistentStringHash_Xcode.xcodeproj/project.pbxproj b/submodules/PersistentStringHash/PersistentStringHash_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..c21cac14d5
--- /dev/null
+++ b/submodules/PersistentStringHash/PersistentStringHash_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,541 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D03E494C230868170049C28B /* PersistentStringHash.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E494A230868170049C28B /* PersistentStringHash.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D03E4957230868A70049C28B /* StringHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E4956230868A60049C28B /* StringHash.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ D03E4947230868170049C28B /* PersistentStringHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PersistentStringHash.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E494A230868170049C28B /* PersistentStringHash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PersistentStringHash.h; sourceTree = ""; };
+ D03E494B230868170049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D03E4956230868A60049C28B /* StringHash.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringHash.swift; sourceTree = ""; };
+ D03E4959230868BB0049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E4944230868170049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D03E493D230868170049C28B = {
+ isa = PBXGroup;
+ children = (
+ D03E494B230868170049C28B /* Info.plist */,
+ D03E4949230868170049C28B /* Sources */,
+ D03E4948230868170049C28B /* Products */,
+ D03E4958230868B20049C28B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D03E4948230868170049C28B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4947230868170049C28B /* PersistentStringHash.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D03E4949230868170049C28B /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4956230868A60049C28B /* StringHash.swift */,
+ D03E494A230868170049C28B /* PersistentStringHash.h */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D03E4958230868B20049C28B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4959230868BB0049C28B /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D03E4942230868170049C28B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E494C230868170049C28B /* PersistentStringHash.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D03E4946230868170049C28B /* PersistentStringHash */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D03E494F230868170049C28B /* Build configuration list for PBXNativeTarget "PersistentStringHash" */;
+ buildPhases = (
+ D03E4942230868170049C28B /* Headers */,
+ D03E4943230868170049C28B /* Sources */,
+ D03E4944230868170049C28B /* Frameworks */,
+ D03E4945230868170049C28B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = PersistentStringHash;
+ productName = PersistentStringHash;
+ productReference = D03E4947230868170049C28B /* PersistentStringHash.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D03E493E230868170049C28B /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1030;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D03E4946230868170049C28B = {
+ CreatedOnToolsVersion = 10.3;
+ LastSwiftMigration = 1030;
+ };
+ };
+ };
+ buildConfigurationList = D03E4941230868170049C28B /* Build configuration list for PBXProject "PersistentStringHash_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D03E493D230868170049C28B;
+ productRefGroup = D03E4948230868170049C28B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D03E4946230868170049C28B /* PersistentStringHash */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D03E4945230868170049C28B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D03E4943230868170049C28B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E4957230868A70049C28B /* StringHash.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D03E494D230868170049C28B /* 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;
+ };
+ D03E494E230868170049C28B /* 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;
+ };
+ D03E4950230868170049C28B /* 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.PersistentStringHash;
+ 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;
+ };
+ D03E4951230868170049C28B /* 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.PersistentStringHash;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E49522308684B0049C28B /* 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;
+ };
+ D03E49532308684B0049C28B /* 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.PersistentStringHash;
+ 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;
+ };
+ D03E49542308685A0049C28B /* 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;
+ };
+ D03E49552308685A0049C28B /* 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.PersistentStringHash;
+ 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 */
+ D03E4941230868170049C28B /* Build configuration list for PBXProject "PersistentStringHash_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E494D230868170049C28B /* DebugAppStoreLLC */,
+ D03E49522308684B0049C28B /* DebugHockeyapp */,
+ D03E494E230868170049C28B /* ReleaseAppStoreLLC */,
+ D03E49542308685A0049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D03E494F230868170049C28B /* Build configuration list for PBXNativeTarget "PersistentStringHash" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E4950230868170049C28B /* DebugAppStoreLLC */,
+ D03E49532308684B0049C28B /* DebugHockeyapp */,
+ D03E4951230868170049C28B /* ReleaseAppStoreLLC */,
+ D03E49552308685A0049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D03E493E230868170049C28B /* Project object */;
+}
diff --git a/submodules/PersistentStringHash/Sources/PersistentStringHash.h b/submodules/PersistentStringHash/Sources/PersistentStringHash.h
new file mode 100644
index 0000000000..5ddb521e30
--- /dev/null
+++ b/submodules/PersistentStringHash/Sources/PersistentStringHash.h
@@ -0,0 +1,19 @@
+//
+// PersistentStringHash.h
+// PersistentStringHash
+//
+// Created by Peter on 8/17/19.
+// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
+//
+
+#import
+
+//! Project version number for PersistentStringHash.
+FOUNDATION_EXPORT double PersistentStringHashVersionNumber;
+
+//! Project version string for PersistentStringHash.
+FOUNDATION_EXPORT const unsigned char PersistentStringHashVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/TelegramUI/TelegramUI/StringHash.swift b/submodules/PersistentStringHash/Sources/StringHash.swift
similarity index 90%
rename from submodules/TelegramUI/TelegramUI/StringHash.swift
rename to submodules/PersistentStringHash/Sources/StringHash.swift
index 86f168c8e1..7d66b9132f 100644
--- a/submodules/TelegramUI/TelegramUI/StringHash.swift
+++ b/submodules/PersistentStringHash/Sources/StringHash.swift
@@ -1,6 +1,6 @@
import Foundation
-extension String {
+public extension String {
var persistentHashValue: UInt64 {
var result = UInt64 (5381)
let buf = [UInt8](self.utf8)
diff --git a/submodules/Postbox/Postbox/Message.swift b/submodules/Postbox/Postbox/Message.swift
index aef32af5b9..e620971f06 100644
--- a/submodules/Postbox/Postbox/Message.swift
+++ b/submodules/Postbox/Postbox/Message.swift
@@ -370,6 +370,9 @@ public struct MessageFlags: OptionSet {
if flags.contains(StoreMessageFlags.CanBeGroupedIntoFeed) {
rawValue |= MessageFlags.CanBeGroupedIntoFeed.rawValue
}
+ if flags.contains(StoreMessageFlags.WasScheduled) {
+ rawValue |= MessageFlags.WasScheduled.rawValue
+ }
self.rawValue = rawValue
}
@@ -380,6 +383,7 @@ public struct MessageFlags: OptionSet {
public static let TopIndexable = MessageFlags(rawValue: 16)
public static let Sending = MessageFlags(rawValue: 32)
public static let CanBeGroupedIntoFeed = MessageFlags(rawValue: 64)
+ public static let WasScheduled = MessageFlags(rawValue: 128)
}
@@ -564,6 +568,9 @@ public struct StoreMessageFlags: OptionSet {
if flags.contains(.CanBeGroupedIntoFeed) {
rawValue |= StoreMessageFlags.CanBeGroupedIntoFeed.rawValue
}
+ if flags.contains(.WasScheduled) {
+ rawValue |= StoreMessageFlags.WasScheduled.rawValue
+ }
self.rawValue = rawValue
}
@@ -574,6 +581,7 @@ public struct StoreMessageFlags: OptionSet {
public static let TopIndexable = StoreMessageFlags(rawValue: 16)
public static let Sending = StoreMessageFlags(rawValue: 32)
public static let CanBeGroupedIntoFeed = StoreMessageFlags(rawValue: 64)
+ public static let WasScheduled = StoreMessageFlags(rawValue: 128)
}
public enum StoreMessageId {
diff --git a/submodules/QrCode/Info.plist b/submodules/QrCode/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/QrCode/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/QrCode/QrCode_Xcode.xcodeproj/project.pbxproj b/submodules/QrCode/QrCode_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..189eecc362
--- /dev/null
+++ b/submodules/QrCode/QrCode_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,559 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D03E481E230769ED0049C28B /* QrCode.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E481C230769ED0049C28B /* QrCode.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D03E482923076A950049C28B /* QRCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E482823076A950049C28B /* QRCode.swift */; };
+ D03E482C23076AA80049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E482B23076AA80049C28B /* Foundation.framework */; };
+ D03E482E23076AAE0049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E482D23076AAE0049C28B /* UIKit.framework */; };
+ D03E483023076AB50049C28B /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E482F23076AB50049C28B /* CoreImage.framework */; };
+ D03E483223076AB60049C28B /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E483123076AB60049C28B /* SwiftSignalKit.framework */; };
+ D03E483423076ABE0049C28B /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E483323076ABE0049C28B /* Display.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ D03E4819230769ED0049C28B /* QrCode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = QrCode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E481C230769ED0049C28B /* QrCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QrCode.h; sourceTree = ""; };
+ D03E481D230769ED0049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D03E482823076A950049C28B /* QRCode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCode.swift; sourceTree = ""; };
+ D03E482B23076AA80049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D03E482D23076AAE0049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ D03E482F23076AB50049C28B /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+ D03E483123076AB60049C28B /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D03E483323076ABE0049C28B /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E4816230769ED0049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E483423076ABE0049C28B /* Display.framework in Frameworks */,
+ D03E483223076AB60049C28B /* SwiftSignalKit.framework in Frameworks */,
+ D03E483023076AB50049C28B /* CoreImage.framework in Frameworks */,
+ D03E482E23076AAE0049C28B /* UIKit.framework in Frameworks */,
+ D03E482C23076AA80049C28B /* Foundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D03E480F230769ED0049C28B = {
+ isa = PBXGroup;
+ children = (
+ D03E481D230769ED0049C28B /* Info.plist */,
+ D03E481B230769ED0049C28B /* Sources */,
+ D03E481A230769ED0049C28B /* Products */,
+ D03E482A23076AA60049C28B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ D03E481A230769ED0049C28B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D03E4819230769ED0049C28B /* QrCode.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D03E481B230769ED0049C28B /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ D03E482823076A950049C28B /* QRCode.swift */,
+ D03E481C230769ED0049C28B /* QrCode.h */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ D03E482A23076AA60049C28B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D03E483323076ABE0049C28B /* Display.framework */,
+ D03E483123076AB60049C28B /* SwiftSignalKit.framework */,
+ D03E482F23076AB50049C28B /* CoreImage.framework */,
+ D03E482D23076AAE0049C28B /* UIKit.framework */,
+ D03E482B23076AA80049C28B /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D03E4814230769ED0049C28B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E481E230769ED0049C28B /* QrCode.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D03E4818230769ED0049C28B /* QrCode */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D03E4821230769ED0049C28B /* Build configuration list for PBXNativeTarget "QrCode" */;
+ buildPhases = (
+ D03E4814230769ED0049C28B /* Headers */,
+ D03E4815230769ED0049C28B /* Sources */,
+ D03E4816230769ED0049C28B /* Frameworks */,
+ D03E4817230769ED0049C28B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = QrCode;
+ productName = QrCode;
+ productReference = D03E4819230769ED0049C28B /* QrCode.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D03E4810230769ED0049C28B /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ DefaultBuildSystemTypeForWorkspace = Latest;
+ LastUpgradeCheck = 1030;
+ ORGANIZATIONNAME = "Telegram Messenger LLP";
+ TargetAttributes = {
+ D03E4818230769ED0049C28B = {
+ CreatedOnToolsVersion = 10.3;
+ LastSwiftMigration = 1030;
+ };
+ };
+ };
+ buildConfigurationList = D03E4813230769ED0049C28B /* Build configuration list for PBXProject "QrCode_Xcode" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = D03E480F230769ED0049C28B;
+ productRefGroup = D03E481A230769ED0049C28B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D03E4818230769ED0049C28B /* QrCode */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D03E4817230769ED0049C28B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D03E4815230769ED0049C28B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D03E482923076A950049C28B /* QRCode.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ D03E481F230769ED0049C28B /* 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;
+ };
+ D03E4820230769ED0049C28B /* 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;
+ };
+ D03E4822230769ED0049C28B /* 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.QrCode;
+ 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;
+ };
+ D03E4823230769ED0049C28B /* 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.QrCode;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = ReleaseAppStoreLLC;
+ };
+ D03E482423076A5D0049C28B /* 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;
+ };
+ D03E482523076A5D0049C28B /* 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.QrCode;
+ 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;
+ };
+ D03E482623076A670049C28B /* 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;
+ };
+ D03E482723076A670049C28B /* 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.QrCode;
+ 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 */
+ D03E4813230769ED0049C28B /* Build configuration list for PBXProject "QrCode_Xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E481F230769ED0049C28B /* DebugAppStoreLLC */,
+ D03E482423076A5D0049C28B /* DebugHockeyapp */,
+ D03E4820230769ED0049C28B /* ReleaseAppStoreLLC */,
+ D03E482623076A670049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+ D03E4821230769ED0049C28B /* Build configuration list for PBXNativeTarget "QrCode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D03E4822230769ED0049C28B /* DebugAppStoreLLC */,
+ D03E482523076A5D0049C28B /* DebugHockeyapp */,
+ D03E4823230769ED0049C28B /* ReleaseAppStoreLLC */,
+ D03E482723076A670049C28B /* ReleaseHockeyappInternal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = ReleaseAppStoreLLC;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = D03E4810230769ED0049C28B /* Project object */;
+}
diff --git a/submodules/TelegramUI/TelegramUI/QRCode.swift b/submodules/QrCode/Sources/QRCode.swift
similarity index 96%
rename from submodules/TelegramUI/TelegramUI/QRCode.swift
rename to submodules/QrCode/Sources/QRCode.swift
index dc15fd7997..9475cd4e44 100644
--- a/submodules/TelegramUI/TelegramUI/QRCode.swift
+++ b/submodules/QrCode/Sources/QRCode.swift
@@ -4,7 +4,7 @@ import CoreImage
import SwiftSignalKit
import Display
-func qrCode(string: String, color: UIColor, backgroundColor: UIColor? = nil, scale: CGFloat = 0.0) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> {
+public func qrCode(string: String, color: UIColor, backgroundColor: UIColor? = nil, scale: CGFloat = 0.0) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> {
return Signal { subscriber in
if let data = string.data(using: .isoLatin1, allowLossyConversion: false), let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
diff --git a/submodules/QrCode/Sources/QrCode.h b/submodules/QrCode/Sources/QrCode.h
new file mode 100644
index 0000000000..9544fd4cf1
--- /dev/null
+++ b/submodules/QrCode/Sources/QrCode.h
@@ -0,0 +1,19 @@
+//
+// QrCode.h
+// QrCode
+//
+// Created by Peter on 8/17/19.
+// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
+//
+
+#import
+
+//! Project version number for QrCode.
+FOUNDATION_EXPORT double QrCodeVersionNumber;
+
+//! Project version string for QrCode.
+FOUNDATION_EXPORT const unsigned char QrCodeVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/ReactionSelectionNode/ReactionSelectionNode_Xcode.xcodeproj/project.pbxproj b/submodules/ReactionSelectionNode/ReactionSelectionNode_Xcode.xcodeproj/project.pbxproj
index e16fea7138..e892d700cf 100644
--- a/submodules/ReactionSelectionNode/ReactionSelectionNode_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/ReactionSelectionNode/ReactionSelectionNode_Xcode.xcodeproj/project.pbxproj
@@ -19,6 +19,8 @@
D03E46082305EEDD0049C28B /* ReactionSelectionParentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46072305EEDD0049C28B /* ReactionSelectionParentNode.swift */; };
D03E460A2305EF900049C28B /* ReactionSwipeGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46092305EF900049C28B /* ReactionSwipeGestureRecognizer.swift */; };
D03E460C2305EFD80049C28B /* ReactionGestureItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E460B2305EFD80049C28B /* ReactionGestureItem.swift */; };
+ D0624F8F230C0316000FC2BD /* ReactionContextNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0624F8E230C0316000FC2BD /* ReactionContextNode.swift */; };
+ D0624F91230C0472000FC2BD /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0624F90230C0472000FC2BD /* TelegramPresentationData.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -36,6 +38,8 @@
D03E46072305EEDD0049C28B /* ReactionSelectionParentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionSelectionParentNode.swift; sourceTree = ""; };
D03E46092305EF900049C28B /* ReactionSwipeGestureRecognizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionSwipeGestureRecognizer.swift; sourceTree = ""; };
D03E460B2305EFD80049C28B /* ReactionGestureItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionGestureItem.swift; sourceTree = ""; };
+ D0624F8E230C0316000FC2BD /* ReactionContextNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionContextNode.swift; sourceTree = ""; };
+ D0624F90230C0472000FC2BD /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -43,6 +47,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ D0624F91230C0472000FC2BD /* TelegramPresentationData.framework in Frameworks */,
D03E46042305EE790049C28B /* TelegramCore.framework in Frameworks */,
D03E46022305EE750049C28B /* Postbox.framework in Frameworks */,
D03E46002305EE710049C28B /* AnimationUI.framework in Frameworks */,
@@ -78,10 +83,11 @@
isa = PBXGroup;
children = (
D03E45F42305EB7C0049C28B /* ReactionSelectionNode.swift */,
- D03E45E82305E3F30049C28B /* ReactionSelectionNode.h */,
+ D0624F8E230C0316000FC2BD /* ReactionContextNode.swift */,
D03E46072305EEDD0049C28B /* ReactionSelectionParentNode.swift */,
D03E46092305EF900049C28B /* ReactionSwipeGestureRecognizer.swift */,
D03E460B2305EFD80049C28B /* ReactionGestureItem.swift */,
+ D03E45E82305E3F30049C28B /* ReactionSelectionNode.h */,
);
path = Sources;
sourceTree = "";
@@ -89,6 +95,7 @@
D03E45F62305EB870049C28B /* Frameworks */ = {
isa = PBXGroup;
children = (
+ D0624F90230C0472000FC2BD /* TelegramPresentationData.framework */,
D03E46032305EE790049C28B /* TelegramCore.framework */,
D03E46012305EE750049C28B /* Postbox.framework */,
D03E45FF2305EE710049C28B /* AnimationUI.framework */,
@@ -183,6 +190,7 @@
D03E460A2305EF900049C28B /* ReactionSwipeGestureRecognizer.swift in Sources */,
D03E46082305EEDD0049C28B /* ReactionSelectionParentNode.swift in Sources */,
D03E460C2305EFD80049C28B /* ReactionGestureItem.swift in Sources */,
+ D0624F8F230C0316000FC2BD /* ReactionContextNode.swift in Sources */,
D03E45F52305EB7C0049C28B /* ReactionSelectionNode.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
diff --git a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift
new file mode 100644
index 0000000000..8c958722c4
--- /dev/null
+++ b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift
@@ -0,0 +1,423 @@
+import Foundation
+import AsyncDisplayKit
+import Display
+import AnimationUI
+import TelegramCore
+import TelegramPresentationData
+
+public final class ReactionContextItem {
+ public let value: String
+ public let text: String
+ public let path: String
+
+ public init(value: String, text: String, path: String) {
+ self.value = value
+ self.text = text
+ self.path = path
+ }
+}
+
+private let largeCircleSize: CGFloat = 16.0
+private let smallCircleSize: CGFloat = 8.0
+
+private func generateBackgroundImage(foreground: 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.setBlendMode(.copy)
+ context.setFillColor(foreground.cgColor)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur + diameter, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ context.fill(CGRect(origin: CGPoint(x: shadowBlur + diameter / 2.0, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ })?.stretchableImage(withLeftCapWidth: Int(diameter + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0))
+}
+
+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.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.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur + diameter, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ context.fill(CGRect(origin: CGPoint(x: shadowBlur + diameter / 2.0, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+
+ context.setFillColor(UIColor.clear.cgColor)
+ context.setBlendMode(.copy)
+
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur + diameter, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ context.fill(CGRect(origin: CGPoint(x: shadowBlur + diameter / 2.0, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ })?.stretchableImage(withLeftCapWidth: Int(diameter + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0))
+}
+
+private func generateBubbleImage(foreground: 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(foreground.cgColor)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ })?.stretchableImage(withLeftCapWidth: Int(diameter / 2.0 + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0))
+}
+
+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.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)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ context.setFillColor(UIColor.clear.cgColor)
+ context.setBlendMode(.copy)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter)))
+ })?.stretchableImage(withLeftCapWidth: Int(diameter / 2.0 + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0))
+}
+
+public final class ReactionContextNode: ASDisplayNode {
+ private let theme: PresentationTheme
+ private let items: [ReactionContextItem]
+
+ private let backgroundNode: ASImageNode
+ private let backgroundShadowNode: ASImageNode
+ private let backgroundContainerNode: ASDisplayNode
+
+ private let largeCircleNode: ASImageNode
+ private let largeCircleShadowNode: ASImageNode
+
+ private let smallCircleNode: ASImageNode
+ private let smallCircleShadowNode: ASImageNode
+
+ private var itemNodes: [ReactionNode] = []
+
+ private var isExpanded: Bool = false
+ private var highlightedReaction: String?
+ private var validLayout: (CGSize, CGRect)?
+
+ public var reactionSelected: ((ReactionGestureItem) -> Void)?
+
+ private let hapticFeedback = HapticFeedback()
+
+ public init(account: Account, theme: PresentationTheme, items: [ReactionContextItem]) {
+ self.theme = theme
+ self.items = items
+
+ let shadowBlur: CGFloat = 5.0
+
+ self.backgroundNode = ASImageNode()
+ self.backgroundNode.displayWithoutProcessing = true
+ self.backgroundNode.displaysAsynchronously = false
+
+ self.backgroundShadowNode = ASImageNode()
+ self.backgroundShadowNode.displayWithoutProcessing = true
+ self.backgroundShadowNode.displaysAsynchronously = false
+
+ self.backgroundContainerNode = ASDisplayNode()
+ self.backgroundContainerNode.allowsGroupOpacity = true
+
+ self.largeCircleNode = ASImageNode()
+ self.largeCircleNode.displayWithoutProcessing = true
+ self.largeCircleNode.displaysAsynchronously = false
+
+ self.largeCircleShadowNode = ASImageNode()
+ self.largeCircleShadowNode.displayWithoutProcessing = true
+ self.largeCircleShadowNode.displaysAsynchronously = false
+
+ self.smallCircleNode = ASImageNode()
+ self.smallCircleNode.displayWithoutProcessing = true
+ self.smallCircleNode.displaysAsynchronously = false
+
+ self.smallCircleShadowNode = ASImageNode()
+ self.smallCircleShadowNode.displayWithoutProcessing = true
+ self.smallCircleShadowNode.displaysAsynchronously = false
+
+ self.backgroundNode.image = generateBackgroundImage(foreground: theme.contextMenu.backgroundColor.withAlphaComponent(1.0), diameter: 52.0, shadowBlur: shadowBlur)
+
+ self.backgroundShadowNode.image = generateBackgroundShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: 52.0, shadowBlur: shadowBlur)
+
+ self.largeCircleNode.image = generateBubbleImage(foreground: theme.contextMenu.backgroundColor.withAlphaComponent(1.0), diameter: largeCircleSize, shadowBlur: shadowBlur)
+ self.smallCircleNode.image = generateBubbleImage(foreground: theme.contextMenu.backgroundColor.withAlphaComponent(1.0), diameter: smallCircleSize, shadowBlur: shadowBlur)
+
+ self.largeCircleShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: largeCircleSize, shadowBlur: shadowBlur)
+ self.smallCircleShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: smallCircleSize, shadowBlur: shadowBlur)
+
+ super.init()
+
+ self.addSubnode(self.smallCircleShadowNode)
+ self.addSubnode(self.largeCircleShadowNode)
+ self.addSubnode(self.backgroundShadowNode)
+
+ self.backgroundContainerNode.addSubnode(self.smallCircleNode)
+ self.backgroundContainerNode.addSubnode(self.largeCircleNode)
+ self.backgroundContainerNode.addSubnode(self.backgroundNode)
+ self.addSubnode(self.backgroundContainerNode)
+
+ self.itemNodes = self.items.map { item in
+ return ReactionNode(account: account, theme: theme, reaction: .reaction(value: item.value, text: item.text, path: item.path), maximizedReactionSize: 30.0 - 18.0, loadFirstFrame: false)
+ }
+ self.itemNodes.forEach(self.addSubnode)
+ }
+
+ override public func didLoad() {
+ super.didLoad()
+
+ self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:))))
+ }
+
+ public func updateLayout(size: CGSize, anchorRect: CGRect, transition: ContainedViewLayoutTransition) {
+ self.updateLayout(size: size, anchorRect: anchorRect, transition: transition, animateInFromAnchorRect: nil, animateOutToAnchorRect: nil)
+ }
+
+ private func calculateBackgroundFrame(containerSize: CGSize, anchorRect: CGRect, contentSize: CGSize) -> (CGRect, Bool) {
+ let sideInset: CGFloat = 12.0
+ let backgroundOffset: CGPoint = CGPoint(x: 22.0, y: -7.0)
+
+ var rect: CGRect
+ let isLeftAligned: Bool
+ if anchorRect.maxX < containerSize.width - backgroundOffset.x - sideInset {
+ rect = CGRect(origin: CGPoint(x: anchorRect.maxX - contentSize.width + backgroundOffset.x, y: anchorRect.minY - contentSize.height + backgroundOffset.y), size: contentSize)
+ isLeftAligned = true
+ } else {
+ rect = CGRect(origin: CGPoint(x: anchorRect.minX - backgroundOffset.x, y: anchorRect.minY - contentSize.height + backgroundOffset.y), size: contentSize)
+ isLeftAligned = false
+ }
+ rect.origin.x = max(sideInset, rect.origin.x)
+ rect.origin.y = max(sideInset, rect.origin.y)
+ rect.origin.x = min(containerSize.width - contentSize.width - sideInset, rect.origin.x)
+ return (rect, isLeftAligned)
+ }
+
+ private func updateLayout(size: CGSize, anchorRect: CGRect, transition: ContainedViewLayoutTransition, animateInFromAnchorRect: CGRect?, animateOutToAnchorRect: CGRect?, animateReactionHighlight: Bool = false) {
+ self.validLayout = (size, anchorRect)
+
+ let sideInset: CGFloat = 10.0
+ let itemSpacing: CGFloat = 6.0
+ let minimizedItemSize: CGFloat = 30.0
+ let maximizedItemSize: CGFloat = 30.0 - 18.0
+ let shadowBlur: CGFloat = 5.0
+ let rowHeight: CGFloat = 52.0
+
+ let columnCount = min(7, self.items.count)
+ let contentWidth = CGFloat(columnCount) * minimizedItemSize + (CGFloat(columnCount) - 1.0) * itemSpacing + sideInset * 2.0
+ let rowCount = self.items.count / columnCount + (self.items.count % columnCount == 0 ? 0 : 1)
+ let contentHeight = rowHeight * CGFloat(rowCount)
+
+ let (backgroundFrame, isLeftAligned) = self.calculateBackgroundFrame(containerSize: size, anchorRect: anchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight))
+
+ for i in 0 ..< self.items.count {
+ let row = CGFloat(i / columnCount)
+ let column = CGFloat(i % columnCount)
+
+ var reactionValue: String?
+ switch self.itemNodes[i].reaction {
+ case let .reaction(value, _, _):
+ reactionValue = value
+ default:
+ break
+ }
+
+ let isHighlighted = reactionValue != nil && self.highlightedReaction == reactionValue
+
+ var itemSize: CGFloat = minimizedItemSize
+ var itemOffset: CGFloat = 0.0
+ if isHighlighted {
+ let updatedSize = itemSize * 1.15
+ itemOffset = (updatedSize - itemSize) / 2.0
+ itemSize = updatedSize
+ }
+
+ transition.updateFrame(node: self.itemNodes[i], frame: CGRect(origin: CGPoint(x: backgroundFrame.minX + sideInset + column * (minimizedItemSize + itemSpacing) - itemOffset, y: backgroundFrame.minY + row * rowHeight + floor((rowHeight - minimizedItemSize) / 2.0) - itemOffset), size: CGSize(width: itemSize, height: itemSize)), beginWithCurrentState: true)
+ self.itemNodes[i].updateLayout(size: CGSize(width: itemSize, height: itemSize), scale: itemSize / (maximizedItemSize + 18.0), transition: transition, displayText: false)
+ self.itemNodes[i].updateIsAnimating(true, animated: false)
+ if row != 0 {
+ if self.isExpanded {
+ self.itemNodes[i].alpha = 1.0
+ } else {
+ self.itemNodes[i].alpha = 0.0
+ }
+ } else {
+ self.itemNodes[i].alpha = 1.0
+ }
+ }
+
+ let isInOverflow = backgroundFrame.maxY > anchorRect.minY
+ let backgroundAlpha: CGFloat = isInOverflow ? 1.0 : 0.8
+ let shadowAlpha: CGFloat = isInOverflow ? 1.0 : 0.0
+ transition.updateAlpha(node: self.backgroundContainerNode, alpha: backgroundAlpha)
+ transition.updateAlpha(node: self.backgroundShadowNode, alpha: shadowAlpha)
+ transition.updateAlpha(node: self.largeCircleShadowNode, alpha: shadowAlpha)
+ transition.updateAlpha(node: self.smallCircleShadowNode, alpha: shadowAlpha)
+
+ transition.updateFrame(node: self.backgroundContainerNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: size.width, height: size.height)))
+
+ transition.updateFrame(node: self.backgroundNode, frame: backgroundFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur))
+ transition.updateFrame(node: self.backgroundShadowNode, frame: backgroundFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur))
+
+ let largeCircleFrame: CGRect
+ let smallCircleFrame: CGRect
+ if isLeftAligned {
+ largeCircleFrame = CGRect(origin: CGPoint(x: anchorRect.maxX + 22.0 - rowHeight + floor((rowHeight - largeCircleSize) / 2.0), y: backgroundFrame.maxY - largeCircleSize / 2.0), size: CGSize(width: largeCircleSize, height: largeCircleSize))
+ smallCircleFrame = CGRect(origin: CGPoint(x: largeCircleFrame.maxX - 3.0, y: largeCircleFrame.maxY + 2.0), size: CGSize(width: smallCircleSize, height: smallCircleSize))
+ } else {
+ largeCircleFrame = CGRect(origin: CGPoint(x: anchorRect.minX - 24.0 + floor((rowHeight - largeCircleSize) / 2.0), y: backgroundFrame.maxY - largeCircleSize / 2.0), size: CGSize(width: largeCircleSize, height: largeCircleSize))
+ smallCircleFrame = CGRect(origin: CGPoint(x: largeCircleFrame.minX + 3.0 - smallCircleSize, y: largeCircleFrame.maxY + 2.0), size: CGSize(width: smallCircleSize, height: smallCircleSize))
+ }
+
+ transition.updateFrame(node: self.largeCircleNode, frame: largeCircleFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur))
+ transition.updateFrame(node: self.largeCircleShadowNode, frame: largeCircleFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur))
+ transition.updateFrame(node: self.smallCircleNode, frame: smallCircleFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur))
+ transition.updateFrame(node: self.smallCircleShadowNode, frame: smallCircleFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur))
+
+ if let animateInFromAnchorRect = animateInFromAnchorRect {
+ let springDuration: Double = 0.42
+ let springDamping: CGFloat = 104.0
+
+ let sourceBackgroundFrame = self.calculateBackgroundFrame(containerSize: size, anchorRect: animateInFromAnchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)).0
+
+ self.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: sourceBackgroundFrame.minX - backgroundFrame.minX, y: sourceBackgroundFrame.minY - backgroundFrame.minY)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true)
+ } else if let animateOutToAnchorRect = animateOutToAnchorRect {
+ let targetBackgroundFrame = self.calculateBackgroundFrame(containerSize: size, anchorRect: animateOutToAnchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)).0
+
+ self.layer.animatePosition(from: CGPoint(), to: CGPoint(x: targetBackgroundFrame.minX - backgroundFrame.minX, y: targetBackgroundFrame.minY - backgroundFrame.minY), duration: 0.2, removeOnCompletion: false, additive: true)
+ }
+ }
+
+ public func animateIn(from sourceAnchorRect: CGRect) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
+
+ if let (size, anchorRect) = self.validLayout {
+ self.updateLayout(size: size, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: sourceAnchorRect, animateOutToAnchorRect: nil)
+ }
+ }
+
+ public func animateOut(to targetAnchorRect: CGRect?, animatingOutToReaction: Bool) {
+ for itemNode in self.itemNodes {
+ self.backgroundNode.layer.animateAlpha(from: self.backgroundNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ self.backgroundShadowNode.layer.animateAlpha(from: self.backgroundShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ self.largeCircleNode.layer.animateAlpha(from: self.largeCircleNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ self.largeCircleShadowNode.layer.animateAlpha(from: self.largeCircleShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ self.smallCircleNode.layer.animateAlpha(from: self.smallCircleNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ self.smallCircleShadowNode.layer.animateAlpha(from: self.smallCircleShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ itemNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ }
+
+ if let targetAnchorRect = targetAnchorRect, let (size, anchorRect) = self.validLayout {
+ self.updateLayout(size: size, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: nil, animateOutToAnchorRect: targetAnchorRect)
+ }
+ }
+
+ public func animateOutToReaction(value: String, targetNode: ASImageNode, hideNode: Bool, completion: @escaping () -> Void) {
+ for itemNode in self.itemNodes {
+ switch itemNode.reaction {
+ case let .reaction(itemValue, _, _):
+ if itemValue == value {
+ if let snapshotView = itemNode.view.snapshotContentTree(keepTransform: true) {
+ let targetSnapshotView = UIImageView()
+ targetSnapshotView.image = targetNode.image
+ targetSnapshotView.frame = self.view.convert(targetNode.bounds, from: targetNode.view)
+ itemNode.isHidden = true
+ self.view.addSubview(targetSnapshotView)
+ self.view.addSubview(snapshotView)
+
+ var completedTarget = false
+ let intermediateCompletion: () -> Void = {
+ if completedTarget {
+ completion()
+ }
+ }
+
+ let targetPosition = self.view.convert(targetNode.bounds.center, from: targetNode.view)
+ let duration: Double = 0.3
+ if hideNode {
+ targetNode.isHidden = true
+ }
+
+ snapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25, removeOnCompletion: false)
+ targetSnapshotView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
+ targetSnapshotView.layer.animateScale(from: snapshotView.bounds.width / targetSnapshotView.bounds.width, to: 0.5, duration: 0.3, removeOnCompletion: false)
+
+ let sourcePoint = snapshotView.center
+ let midPoint = CGPoint(x: (sourcePoint.x + targetPosition.x) / 2.0, y: sourcePoint.y - 30.0)
+
+ let x1 = sourcePoint.x
+ let y1 = sourcePoint.y
+ let x2 = midPoint.x
+ let y2 = midPoint.y
+ let x3 = targetPosition.x
+ let y3 = targetPosition.y
+
+ let a = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / ((x1 - x2) * (x1 - x3) * (x2 - x3))
+ let b = (x1 * x1 * (y2 - y3) + x3 * x3 * (y1 - y2) + x2 * x2 * (y3 - y1)) / ((x1 - x2) * (x1 - x3) * (x2 - x3))
+ let c = (x2 * x2 * (x3 * y1 - x1 * y3) + x2 * (x1 * x1 * y3 - x3 * x3 * y1) + x1 * x3 * (x3 - x1) * y2) / ((x1 - x2) * (x1 - x3) * (x2 - x3))
+
+ var keyframes: [AnyObject] = []
+ for i in 0 ..< 10 {
+ let k = CGFloat(i) / CGFloat(10 - 1)
+ let x = sourcePoint.x * (1.0 - k) + targetPosition.x * k
+ let y = a * x * x + b * x + c
+ keyframes.append(NSValue(cgPoint: CGPoint(x: x, y: y)))
+ }
+
+ snapshotView.layer.animateKeyframes(values: keyframes, duration: 0.3, keyPath: "position", removeOnCompletion: false, completion: { [weak self] _ in
+ if let strongSelf = self {
+ strongSelf.hapticFeedback.tap()
+ }
+ completedTarget = true
+ if hideNode {
+ targetNode.isHidden = false
+ targetNode.layer.animateSpring(from: 0.5 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: duration, initialVelocity: 0.0, damping: 90.0)
+ }
+ intermediateCompletion()
+ })
+ targetSnapshotView.layer.animateKeyframes(values: keyframes, duration: 0.3, keyPath: "position", removeOnCompletion: false)
+
+ snapshotView.layer.animateScale(from: 1.0, to: (targetSnapshotView.bounds.width * 0.5) / snapshotView.bounds.width, duration: 0.3, removeOnCompletion: false)
+ } else {
+ completion()
+ }
+ return
+ }
+ default:
+ break
+ }
+ }
+ completion()
+ }
+
+ override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+ for itemNode in self.itemNodes {
+ if itemNode.frame.contains(point) {
+ return self.view
+ }
+ }
+ return nil
+ }
+
+ @objc private func tapGesture(_ recognizer: UITapGestureRecognizer) {
+ if case .ended = recognizer.state {
+ let point = recognizer.location(in: self.view)
+ if let reaction = self.reaction(at: point) {
+ self.reactionSelected?(reaction)
+ }
+ }
+ }
+
+ public func reaction(at point: CGPoint) -> ReactionGestureItem? {
+ for itemNode in self.itemNodes {
+ if itemNode.frame.contains(point) {
+ return itemNode.reaction
+ }
+ }
+ for itemNode in self.itemNodes {
+ if itemNode.frame.insetBy(dx: -8.0, dy: -8.0).contains(point) {
+ return itemNode.reaction
+ }
+ }
+ return nil
+ }
+
+ public func setHighlightedReaction(_ value: String?) {
+ self.highlightedReaction = value
+ if let (size, anchorRect) = self.validLayout {
+ self.updateLayout(size: size, anchorRect: anchorRect, transition: .animated(duration: 0.18, curve: .easeInOut), animateInFromAnchorRect: nil, animateOutToAnchorRect: nil, animateReactionHighlight: true)
+ }
+ }
+}
diff --git a/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift b/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift
index a9ec62c03f..9b058db8ca 100644
--- a/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift
+++ b/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift
@@ -2,22 +2,7 @@ import Foundation
import Postbox
import TelegramCore
-public struct ReactionGestureItemValue {
- public var value: String
- public var text: String
- public var file: TelegramMediaFile
-
- public init(value: String, text: String, file: TelegramMediaFile) {
- self.value = value
- self.text = text
- self.file = file
- }
-}
-
-public final class ReactionGestureItem {
- public let value: ReactionGestureItemValue
-
- public init(value: ReactionGestureItemValue) {
- self.value = value
- }
+public enum ReactionGestureItem {
+ case reaction(value: String, text: String, path: String)
+ case reply
}
diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift
index 340530113c..d8d0a005a3 100644
--- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift
+++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift
@@ -4,12 +4,9 @@ import AnimationUI
import Display
import Postbox
import TelegramCore
+import TelegramPresentationData
-private let shadowBlur: CGFloat = 8.0
-private let minimizedReactionSize: CGFloat = 30.0
-private let maximizedReactionSize: CGFloat = 60.0
-
-private func generateBubbleImage(foreground: UIColor, diameter: CGFloat) -> UIImage? {
+private func generateBubbleImage(foreground: 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(foreground.cgColor)
@@ -17,7 +14,7 @@ private func generateBubbleImage(foreground: UIColor, diameter: CGFloat) -> UIIm
})?.stretchableImage(withLeftCapWidth: Int(diameter / 2.0 + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0))
}
-private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat) -> UIImage? {
+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)
@@ -31,50 +28,115 @@ private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat) -> UI
})?.stretchableImage(withLeftCapWidth: Int(diameter / 2.0 + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0))
}
-private final class ReactionNode: ASDisplayNode {
+private let font = Font.medium(13.0)
+
+final class ReactionNode: ASDisplayNode {
let reaction: ReactionGestureItem
+ private let textBackgroundNode: ASImageNode
+ private let textNode: ImmediateTextNode
private let animationNode: AnimatedStickerNode
+ private let imageNode: ASImageNode
var isMaximized: Bool?
private let intrinsicSize: CGSize
private let intrinsicOffset: CGPoint
- init(account: Account, reaction: ReactionGestureItem) {
+ init(account: Account, theme: PresentationTheme, reaction: ReactionGestureItem, maximizedReactionSize: CGFloat, loadFirstFrame: Bool) {
self.reaction = reaction
+ self.textBackgroundNode = ASImageNode()
+ self.textBackgroundNode.displaysAsynchronously = false
+ self.textBackgroundNode.displayWithoutProcessing = true
+ self.textBackgroundNode.image = generateStretchableFilledCircleImage(diameter: 20.0, color: theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillFloating.withAlphaComponent(0.8))
+ self.textBackgroundNode.alpha = 0.0
+
+ self.textNode = ImmediateTextNode()
+ self.textNode.displaysAsynchronously = false
+ self.textNode.isUserInteractionEnabled = false
+
+ let reactionText: String
+ switch reaction {
+ case let .reaction(_, text, _):
+ reactionText = text
+ case .reply:
+ reactionText = "Reply"
+ }
+
+ self.textNode.attributedText = NSAttributedString(string: reactionText, font: font, textColor: theme.chat.serviceMessage.dateTextColor.withWallpaper)
+ let textSize = self.textNode.updateLayout(CGSize(width: 200.0, height: 100.0))
+ let textBackgroundSize = CGSize(width: textSize.width + 12.0, height: 20.0)
+ let textBackgroundFrame = CGRect(origin: CGPoint(), size: textBackgroundSize)
+ let textFrame = CGRect(origin: CGPoint(x: floor((textBackgroundFrame.width - textSize.width) / 2.0), y: floor((textBackgroundFrame.height - textSize.height) / 2.0)), size: textSize)
+ self.textBackgroundNode.frame = textBackgroundFrame
+ self.textNode.frame = textFrame
+ self.textNode.alpha = 0.0
+
self.animationNode = AnimatedStickerNode()
- self.animationNode.automaticallyLoadFirstFrame = true
+ self.animationNode.automaticallyLoadFirstFrame = loadFirstFrame
self.animationNode.playToCompletionOnStop = true
- //self.animationNode.backgroundColor = .lightGray
var intrinsicSize = CGSize(width: maximizedReactionSize + 18.0, height: maximizedReactionSize + 18.0)
- switch reaction.value.value {
- case "😳":
- intrinsicSize.width += 8.0
- intrinsicSize.height += 8.0
- self.intrinsicOffset = CGPoint(x: 0.0, y: -4.0)
- case "👍":
- intrinsicSize.width += 20.0
- intrinsicSize.height += 20.0
- self.intrinsicOffset = CGPoint(x: 0.0, y: 4.0)
- default:
+
+ self.imageNode = ASImageNode()
+ switch reaction {
+ case let .reaction(value, _, path):
+ switch value {
+ case "😒":
+ intrinsicSize.width *= 1.7
+ intrinsicSize.height *= 1.7
+ self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0)
+ case "😳":
+ intrinsicSize.width *= 1.15
+ intrinsicSize.height *= 1.15
+ self.intrinsicOffset = CGPoint(x: 0.0, y: -0.05 * intrinsicSize.width)
+ case "😂":
+ intrinsicSize.width *= 1.2
+ intrinsicSize.height *= 1.2
+ self.intrinsicOffset = CGPoint(x: 0.0 * intrinsicSize.width, y: 0.0 * intrinsicSize.width)
+ case "👍":
+ intrinsicSize.width *= 1.256
+ intrinsicSize.height *= 1.256
+ self.intrinsicOffset = CGPoint(x: 0.0, y: 0.05 * intrinsicSize.width)
+ default:
+ self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0)
+ }
+
+ var renderSize: CGSize = CGSize(width: intrinsicSize.width * 2.0, height: intrinsicSize.height * 2.0)
+ if UIScreen.main.scale.isEqual(to: 3.0) {
+ if maximizedReactionSize < 40.0 {
+ renderSize = CGSize(width: intrinsicSize.width * 2.5, height: intrinsicSize.height * 2.5)
+ }
+ }
+ self.animationNode.setup(account: account, resource: .localFile(path), width: Int(renderSize.width), height: Int(renderSize.height), mode: .direct)
+ case .reply:
self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0)
+ self.imageNode.image = UIImage(named: "Chat/Context Menu/ReactionReply", in: Bundle(for: ReactionNode.self), compatibleWith: nil)
}
+
self.intrinsicSize = intrinsicSize
super.init()
- //self.backgroundColor = .green
+ self.textBackgroundNode.addSubnode(self.textNode)
+ self.addSubnode(self.textBackgroundNode)
self.addSubnode(self.animationNode)
- self.animationNode.visibility = true
- self.animationNode.setup(account: account, resource: reaction.value.file.resource, width: Int(self.intrinsicSize.width) * 2, height: Int(self.intrinsicSize.height) * 2, mode: .direct)
+ self.addSubnode(self.imageNode)
self.animationNode.updateLayout(size: self.intrinsicSize)
self.animationNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicSize)
+ self.imageNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicSize)
}
- func updateLayout(size: CGSize, scale: CGFloat, transition: ContainedViewLayoutTransition) {
+ func updateLayout(size: CGSize, scale: CGFloat, transition: ContainedViewLayoutTransition, displayText: Bool) {
transition.updatePosition(node: self.animationNode, position: CGPoint(x: size.width / 2.0 + self.intrinsicOffset.x * scale, y: size.height / 2.0 + self.intrinsicOffset.y * scale), beginWithCurrentState: true)
transition.updateTransformScale(node: self.animationNode, scale: scale, beginWithCurrentState: true)
+ transition.updatePosition(node: self.imageNode, position: CGPoint(x: size.width / 2.0 + self.intrinsicOffset.x * scale, y: size.height / 2.0 + self.intrinsicOffset.y * scale), beginWithCurrentState: true)
+ transition.updateTransformScale(node: self.imageNode, scale: scale, beginWithCurrentState: true)
+
+ transition.updatePosition(node: self.textBackgroundNode, position: CGPoint(x: size.width / 2.0, y: displayText ? -24.0 : (size.height / 2.0)), beginWithCurrentState: true)
+ transition.updateTransformScale(node: self.textBackgroundNode, scale: displayText ? 1.0 : 0.1, beginWithCurrentState: true)
+
+ transition.updateAlpha(node: self.textBackgroundNode, alpha: displayText ? 1.0 : 0.0, beginWithCurrentState: true)
+ transition.updateAlpha(node: self.textNode, alpha: displayText ? 1.0 : 0.0, beginWithCurrentState: true)
}
func updateIsAnimating(_ isAnimating: Bool, animated: Bool) {
@@ -87,43 +149,50 @@ private final class ReactionNode: ASDisplayNode {
}
final class ReactionSelectionNode: ASDisplayNode {
+ private let account: Account
+ private let theme: PresentationTheme
+ private let reactions: [ReactionGestureItem]
+
private let backgroundNode: ASImageNode
private let backgroundShadowNode: ASImageNode
private let bubbleNodes: [(ASImageNode, ASImageNode)]
- private let reactionNodes: [ReactionNode]
+ private var reactionNodes: [ReactionNode] = []
private var hasSelectedNode = false
private let hapticFeedback = HapticFeedback()
- public init(account: Account, reactions: [ReactionGestureItem]) {
+ private var shadowBlur: CGFloat = 8.0
+ private var minimizedReactionSize: CGFloat = 30.0
+ private var maximizedReactionSize: CGFloat = 60.0
+ private var smallCircleSize: CGFloat = 8.0
+
+ private var isRightAligned: Bool = false
+
+ public init(account: Account, theme: PresentationTheme, reactions: [ReactionGestureItem]) {
+ self.account = account
+ self.theme = theme
+ self.reactions = reactions
+
self.backgroundNode = ASImageNode()
self.backgroundNode.displaysAsynchronously = false
self.backgroundNode.displayWithoutProcessing = true
- self.backgroundNode.image = generateBubbleImage(foreground: .white, diameter: 42.0)
self.backgroundShadowNode = ASImageNode()
self.backgroundShadowNode.displaysAsynchronously = false
self.backgroundShadowNode.displayWithoutProcessing = true
- self.backgroundShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: 42.0)
self.bubbleNodes = (0 ..< 2).map { i -> (ASImageNode, ASImageNode) in
let imageNode = ASImageNode()
- imageNode.image = generateBubbleImage(foreground: .white, diameter: CGFloat(i + 1) * 8.0)
imageNode.displaysAsynchronously = false
imageNode.displayWithoutProcessing = true
let shadowNode = ASImageNode()
- shadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: CGFloat(i + 1) * 8.0)
shadowNode.displaysAsynchronously = false
shadowNode.displayWithoutProcessing = true
return (imageNode, shadowNode)
}
- self.reactionNodes = reactions.map { reaction -> ReactionNode in
- return ReactionNode(account: account, reaction: reaction)
- }
-
super.init()
self.bubbleNodes.forEach { _, shadow in
@@ -134,19 +203,53 @@ final class ReactionSelectionNode: ASDisplayNode {
self.addSubnode(foreground)
}
self.addSubnode(self.backgroundNode)
- self.reactionNodes.forEach(self.addSubnode(_:))
}
func updateLayout(constrainedSize: CGSize, startingPoint: CGPoint, offsetFromStart: CGFloat, isInitial: Bool) {
- let backgroundHeight: CGFloat = 42.0
- let reactionSpacing: CGFloat = 6.0
+ let initialAnchorX = startingPoint.x
+
+ if isInitial && self.reactionNodes.isEmpty {
+ let availableContentWidth = constrainedSize.width //max(100.0, initialAnchorX)
+ var minimizedReactionSize = (availableContentWidth - self.maximizedReactionSize) / (CGFloat(self.reactions.count - 1) + CGFloat(self.reactions.count + 1) * 0.2)
+ minimizedReactionSize = max(16.0, floor(minimizedReactionSize))
+ minimizedReactionSize = min(30.0, minimizedReactionSize)
+
+ self.minimizedReactionSize = minimizedReactionSize
+ self.shadowBlur = floor(minimizedReactionSize * 0.26)
+ self.smallCircleSize = 8.0
+
+ let backgroundHeight = floor(minimizedReactionSize * 1.4)
+
+ self.backgroundNode.image = generateBubbleImage(foreground: .white, diameter: backgroundHeight, shadowBlur: self.shadowBlur)
+ self.backgroundShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: backgroundHeight, shadowBlur: self.shadowBlur)
+ for i in 0 ..< self.bubbleNodes.count {
+ self.bubbleNodes[i].0.image = generateBubbleImage(foreground: .white, diameter: CGFloat(i + 1) * self.smallCircleSize, shadowBlur: self.shadowBlur)
+ self.bubbleNodes[i].1.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: CGFloat(i + 1) * self.smallCircleSize, shadowBlur: self.shadowBlur)
+ }
+
+ self.reactionNodes = self.reactions.map { reaction -> ReactionNode in
+ return ReactionNode(account: self.account, theme: self.theme, reaction: reaction, maximizedReactionSize: self.maximizedReactionSize, loadFirstFrame: true)
+ }
+ self.reactionNodes.forEach(self.addSubnode(_:))
+ }
+
+ let backgroundHeight: CGFloat = floor(self.minimizedReactionSize * 1.4)
+
+ let reactionSpacing: CGFloat = floor(self.minimizedReactionSize * 0.2)
let minimizedReactionVerticalInset: CGFloat = floor((backgroundHeight - minimizedReactionSize) / 2.0)
let contentWidth: CGFloat = CGFloat(self.reactionNodes.count - 1) * (minimizedReactionSize) + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * reactionSpacing
var backgroundFrame = CGRect(origin: CGPoint(x: -shadowBlur, y: -shadowBlur), size: CGSize(width: contentWidth + shadowBlur * 2.0, height: backgroundHeight + shadowBlur * 2.0))
- backgroundFrame = backgroundFrame.offsetBy(dx: startingPoint.x - contentWidth + backgroundHeight / 2.0 - 52.0, dy: startingPoint.y - backgroundHeight - 16.0)
+ var isRightAligned = false
+ if initialAnchorX > constrainedSize.width / 2.0 {
+ isRightAligned = true
+ backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - contentWidth + backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0)
+ } else {
+ backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0)
+ }
+ self.isRightAligned = isRightAligned
self.backgroundNode.frame = backgroundFrame
self.backgroundShadowNode.frame = backgroundFrame
@@ -155,7 +258,7 @@ final class ReactionSelectionNode: ASDisplayNode {
let anchorX = max(anchorMinX, min(anchorMaxX, offsetFromStart))
var reactionX: CGFloat = backgroundFrame.minX + shadowBlur + reactionSpacing
- if offsetFromStart > backgroundFrame.maxX - shadowBlur {
+ if offsetFromStart > backgroundFrame.maxX - shadowBlur || offsetFromStart < backgroundFrame.minX {
self.hasSelectedNode = false
} else {
self.hasSelectedNode = true
@@ -164,8 +267,12 @@ final class ReactionSelectionNode: ASDisplayNode {
var maximizedIndex = Int(((anchorX - anchorMinX) / (anchorMaxX - anchorMinX)) * CGFloat(self.reactionNodes.count))
maximizedIndex = max(0, min(self.reactionNodes.count - 1, maximizedIndex))
- for i in 0 ..< self.reactionNodes.count {
+ for iterationIndex in 0 ..< self.reactionNodes.count {
+ var i = iterationIndex
let isMaximized = i == maximizedIndex
+ if !isRightAligned {
+ i = self.reactionNodes.count - 1 - i
+ }
let reactionSize: CGFloat
if isMaximized {
@@ -194,18 +301,18 @@ final class ReactionSelectionNode: ASDisplayNode {
reactionFrame.origin.x -= 9.0
reactionFrame.size.width += 18.0
}
- self.reactionNodes[i].updateLayout(size: reactionFrame.size, scale: reactionFrame.size.width / (maximizedReactionSize + 18.0), transition: transition)
+ self.reactionNodes[i].updateLayout(size: reactionFrame.size, scale: reactionFrame.size.width / (maximizedReactionSize + 18.0), transition: transition, displayText: isMaximized)
transition.updateFrame(node: self.reactionNodes[i], frame: reactionFrame, beginWithCurrentState: true)
reactionX += reactionSize + reactionSpacing
}
- let mainBubbleFrame = CGRect(origin: CGPoint(x: anchorX - 8.0 - shadowBlur, y: backgroundFrame.maxY - shadowBlur - 8.0 - shadowBlur), size: CGSize(width: 16.0 + shadowBlur * 2.0, height: 16.0 + shadowBlur * 2.0))
+ let mainBubbleFrame = CGRect(origin: CGPoint(x: anchorX - self.smallCircleSize - shadowBlur, y: backgroundFrame.maxY - shadowBlur - self.smallCircleSize - shadowBlur), size: CGSize(width: self.smallCircleSize * 2.0 + shadowBlur * 2.0, height: self.smallCircleSize * 2.0 + shadowBlur * 2.0))
self.bubbleNodes[1].0.frame = mainBubbleFrame
self.bubbleNodes[1].1.frame = mainBubbleFrame
- let secondaryBubbleFrame = CGRect(origin: CGPoint(x: mainBubbleFrame.midX - 9.0 - (8.0 + shadowBlur * 2.0) / 2.0, y: mainBubbleFrame.midY + 12.0 - (8.0 + shadowBlur * 2.0) / 2.0), size: CGSize(width: 8.0 + shadowBlur * 2.0, height: 8.0 + shadowBlur * 2.0))
+ let secondaryBubbleFrame = CGRect(origin: CGPoint(x: mainBubbleFrame.midX - 10.0 - (self.smallCircleSize + shadowBlur * 2.0) / 2.0, y: mainBubbleFrame.midY + 10.0 - (self.smallCircleSize + shadowBlur * 2.0) / 2.0), size: CGSize(width: self.smallCircleSize + shadowBlur * 2.0, height: self.smallCircleSize + shadowBlur * 2.0))
self.bubbleNodes[0].0.frame = secondaryBubbleFrame
self.bubbleNodes[0].1.frame = secondaryBubbleFrame
}
@@ -217,15 +324,25 @@ final class ReactionSelectionNode: ASDisplayNode {
self.bubbleNodes[0].0.layer.animateScale(from: 0.01, to: 1.0, duration: 0.11, delay: 0.05, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue)
self.bubbleNodes[0].1.layer.animateScale(from: 0.01, to: 1.0, duration: 0.11, delay: 0.05, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue)
- let backgroundOffset = CGPoint(x: (self.backgroundNode.frame.width - shadowBlur) / 2.0 - 42.0, y: (self.backgroundNode.frame.height - shadowBlur) / 2.0)
+ let backgroundOffset: CGPoint
+ if self.isRightAligned {
+ backgroundOffset = CGPoint(x: (self.backgroundNode.frame.width - shadowBlur) / 2.0 - 42.0, y: (self.backgroundNode.frame.height - shadowBlur) / 2.0)
+ } else {
+ backgroundOffset = CGPoint(x: -(self.backgroundNode.frame.width - shadowBlur) / 2.0 + 42.0, y: (self.backgroundNode.frame.height - shadowBlur) / 2.0)
+ }
let damping: CGFloat = 100.0
for i in 0 ..< self.reactionNodes.count {
let animationOffset: Double = 1.0 - Double(i) / Double(self.reactionNodes.count - 1)
- var nodeOffset = CGPoint(x: self.reactionNodes[i].frame.minX - (self.backgroundNode.frame.maxX - shadowBlur) / 2.0 - 42.0, y: self.reactionNodes[i].frame.minY - self.backgroundNode.frame.maxY - shadowBlur)
+ var nodeOffset: CGPoint
+ if self.isRightAligned {
+ nodeOffset = CGPoint(x: self.reactionNodes[i].frame.minX - (self.backgroundNode.frame.maxX - shadowBlur) / 2.0 - 42.0, y: self.reactionNodes[i].frame.minY - self.backgroundNode.frame.maxY - shadowBlur)
+ } else {
+ nodeOffset = CGPoint(x: self.reactionNodes[i].frame.minX - (self.backgroundNode.frame.minX + shadowBlur) / 2.0 - 42.0, y: self.reactionNodes[i].frame.minY - self.backgroundNode.frame.maxY - shadowBlur)
+ }
nodeOffset.x = -nodeOffset.x
nodeOffset.y = 30.0
- self.reactionNodes[i].layer.animateSpring(from: 0.01 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.5 + animationOffset * 0.08, initialVelocity: 0.0, damping: damping)
+ self.reactionNodes[i].layer.animateSpring(from: 0.01 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.5 + animationOffset * 0.28, initialVelocity: 0.0, damping: damping)
self.reactionNodes[i].layer.animateSpring(from: NSValue(cgPoint: nodeOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: 0.5, initialVelocity: 0.0, damping: damping, additive: true)
}
diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionParentNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionParentNode.swift
index 8a0f78779a..02719c5884 100644
--- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionParentNode.swift
+++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionParentNode.swift
@@ -3,17 +3,20 @@ import AsyncDisplayKit
import Display
import Postbox
import TelegramCore
+import TelegramPresentationData
public final class ReactionSelectionParentNode: ASDisplayNode {
private let account: Account
+ private let theme: PresentationTheme
private var currentNode: ReactionSelectionNode?
private var currentLocation: (CGPoint, CGFloat)?
private var validLayout: (size: CGSize, insets: UIEdgeInsets)?
- public init(account: Account) {
+ public init(account: Account, theme: PresentationTheme) {
self.account = account
+ self.theme = theme
super.init()
}
@@ -24,7 +27,7 @@ public final class ReactionSelectionParentNode: ASDisplayNode {
self.currentNode = nil
}
- let reactionNode = ReactionSelectionNode(account: self.account, reactions: reactions)
+ let reactionNode = ReactionSelectionNode(account: self.account, theme: self.theme, reactions: reactions)
self.addSubnode(reactionNode)
self.currentNode = reactionNode
self.currentLocation = (point, point.x)
diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift
index 61b67da170..ceb67815f1 100644
--- a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift
+++ b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift
@@ -6,13 +6,16 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer {
private var validatedGesture = false
private var firstLocation: CGPoint = CGPoint()
+ private var currentLocation: CGPoint = CGPoint()
private var currentReactions: [ReactionGestureItem] = []
private var isActivated = false
private var isAwaitingCompletion = false
private weak var currentContainer: ReactionSelectionParentNode?
+ private var activationTimer: Timer?
public var availableReactions: (() -> [ReactionGestureItem])?
public var getReactionContainer: (() -> ReactionSelectionParentNode?)?
+ public var began: (() -> Void)?
public var updateOffset: ((CGFloat, Bool) -> Void)?
public var completed: ((ReactionGestureItem?) -> Void)?
public var displayReply: ((CGFloat) -> Void)?
@@ -31,6 +34,8 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer {
self.currentReactions = []
self.isActivated = false
self.isAwaitingCompletion = false
+ self.activationTimer?.invalidate()
+ self.activationTimer = nil
}
override public func touchesBegan(_ touches: Set, with event: UIEvent) {
@@ -40,6 +45,7 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer {
self.currentReactions = availableReactions
let touch = touches.first!
self.firstLocation = touch.location(in: nil)
+ self.currentLocation = self.firstLocation
} else {
self.state = .failed
}
@@ -55,6 +61,7 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer {
guard let location = touches.first?.location(in: nil) else {
return
}
+ self.currentLocation = location
var translation = CGPoint(x: location.x - self.firstLocation.x, y: location.y - self.firstLocation.y)
@@ -72,8 +79,38 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer {
self.validatedGesture = true
self.firstLocation = location
translation = CGPoint()
+ self.began?()
self.updateOffset?(0.0, false)
updatedOffset = true
+
+ self.activationTimer?.invalidate()
+ final class TimerTarget: NSObject {
+ let f: () -> Void
+
+ init(_ f: @escaping () -> Void) {
+ self.f = f
+ }
+
+ @objc func event() {
+ self.f()
+ }
+ }
+ let activationTimer = Timer(timeInterval: 0.3, target: TimerTarget { [weak self] in
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.activationTimer = nil
+ if strongSelf.validatedGesture {
+ let location = strongSelf.currentLocation
+ if !strongSelf.currentReactions.isEmpty, let reactionContainer = strongSelf.getReactionContainer?() {
+ strongSelf.currentContainer = reactionContainer
+ let reactionContainerLocation = reactionContainer.view.convert(location, from: nil)
+ reactionContainer.displayReactions(strongSelf.currentReactions, at: reactionContainerLocation)
+ }
+ }
+ }, selector: #selector(TimerTarget.event), userInfo: nil, repeats: false)
+ self.activationTimer = activationTimer
+ RunLoop.main.add(activationTimer, forMode: .common)
}
}
@@ -85,11 +122,6 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer {
if absTranslationX > 40.0 {
self.isActivated = true
self.displayReply?(-min(0.0, translation.x))
- if !self.currentReactions.isEmpty, let reactionContainer = self.getReactionContainer?() {
- self.currentContainer = reactionContainer
- let reactionContainerLocation = reactionContainer.view.convert(location, from: nil)
- reactionContainer.displayReactions(self.currentReactions, at: reactionContainerLocation)
- }
}
} else {
if let reactionContainer = self.currentContainer {
@@ -111,8 +143,8 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer {
if self.validatedGesture {
let translation = CGPoint(x: location.x - self.firstLocation.x, y: location.y - self.firstLocation.y)
if let reaction = self.currentContainer?.selectedReaction() {
- self.completed?(reaction)
self.isAwaitingCompletion = true
+ self.completed?(reaction)
} else {
if translation.x < -40.0 {
self.currentContainer?.dismissReactions(into: nil, hideTarget: false)
@@ -138,4 +170,8 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer {
self.state = .ended
}
}
+
+ public func cancel() {
+ self.state = .cancelled
+ }
}
diff --git a/submodules/SettingsUI/Info.plist b/submodules/SettingsUI/Info.plist
new file mode 100644
index 0000000000..e1fe4cfb7b
--- /dev/null
+++ b/submodules/SettingsUI/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/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..cc24ab68cd
--- /dev/null
+++ b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,1351 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 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 */; };
+ D03E468423075EF60049C28B /* LanguageSuggestionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468323075EF60049C28B /* LanguageSuggestionController.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 */; };
+ D03E47B8230766870049C28B /* FrameworkBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E47B7230766870049C28B /* FrameworkBundle.swift */; };
+ 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 */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 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 = ""; };
+ D03E468323075EF60049C28B /* LanguageSuggestionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageSuggestionController.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; };
+ D03E47B7230766870049C28B /* FrameworkBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameworkBundle.swift; sourceTree = ""; };
+ 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; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D03E464A23075D930049C28B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 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 */,
+ D03E467523075E920049C28B /* Language Suggestion */,
+ 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 */,
+ D03E47B7230766870049C28B /* FrameworkBundle.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 = "";
+ };
+ D03E467523075E920049C28B /* Language Suggestion */ = {
+ isa = PBXGroup;
+ children = (
+ D03E468323075EF60049C28B /* LanguageSuggestionController.swift */,
+ );
+ path = "Language Suggestion";
+ 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 */,
+ );
+ 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 = (
+ 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 */,
+ D03E47B8230766870049C28B /* FrameworkBundle.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 */,
+ 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 */,
+ D03E468423075EF60049C28B /* LanguageSuggestionController.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/TelegramUI/TelegramUI/AccountUtils.swift b/submodules/SettingsUI/Sources/AccountUtils.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/AccountUtils.swift
rename to submodules/SettingsUI/Sources/AccountUtils.swift
diff --git a/submodules/TelegramUI/TelegramUI/BlurredImageNode.swift b/submodules/SettingsUI/Sources/BlurredImageNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/BlurredImageNode.swift
rename to submodules/SettingsUI/Sources/BlurredImageNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/CachedFaqInstantPage.swift b/submodules/SettingsUI/Sources/CachedFaqInstantPage.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/CachedFaqInstantPage.swift
rename to submodules/SettingsUI/Sources/CachedFaqInstantPage.swift
index ba5dfdec83..5392fced23 100644
--- a/submodules/TelegramUI/TelegramUI/CachedFaqInstantPage.swift
+++ b/submodules/SettingsUI/Sources/CachedFaqInstantPage.swift
@@ -4,6 +4,8 @@ import Postbox
import TelegramCore
import AccountContext
import InstantPageUI
+import InstantPageCache
+import UrlHandling
private func extractAnchor(string: String) -> (String, String?) {
var anchorValue: String?
diff --git a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberCodeController.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/ChangePhoneNumberCodeController.swift
rename to submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift
index 1ed1569514..6eff637800 100644
--- a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberCodeController.swift
+++ b/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift
@@ -9,6 +9,7 @@ import ItemListUI
import OverlayStatusController
import AccountContext
import AlertUI
+import AuthorizationUI
private final class ChangePhoneNumberCodeControllerArguments {
let updateEntryText: (String) -> Void
@@ -167,7 +168,7 @@ private func timeoutSignal(codeData: ChangeAccountPhoneNumberData) -> Signal String {
var link: String
diff --git a/submodules/TelegramUI/TelegramUI/ProxySettingsActionItem.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsActionItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ProxySettingsActionItem.swift
rename to submodules/SettingsUI/Sources/Data and Storage/ProxySettingsActionItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/ProxySettingsServerItem.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsServerItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ProxySettingsServerItem.swift
rename to submodules/SettingsUI/Sources/Data and Storage/ProxySettingsServerItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/SaveIncomingMediaController.swift b/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/SaveIncomingMediaController.swift
rename to submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift
diff --git a/submodules/TelegramUI/TelegramUI/ShareProxyServerActionSheetController.swift b/submodules/SettingsUI/Sources/Data and Storage/ShareProxyServerActionSheetController.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/ShareProxyServerActionSheetController.swift
rename to submodules/SettingsUI/Sources/Data and Storage/ShareProxyServerActionSheetController.swift
index 4e535d3771..29c12410f7 100644
--- a/submodules/TelegramUI/TelegramUI/ShareProxyServerActionSheetController.swift
+++ b/submodules/SettingsUI/Sources/Data and Storage/ShareProxyServerActionSheetController.swift
@@ -7,6 +7,7 @@ import AsyncDisplayKit
import UIKit
import SwiftSignalKit
import TelegramPresentationData
+import QrCode
public final class ShareProxyServerActionSheetController: ActionSheetController {
private var presentationDisposable: Disposable?
diff --git a/submodules/TelegramUI/TelegramUI/StorageUsageController.swift b/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/StorageUsageController.swift
rename to submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift
index ce0f7758fb..4587623003 100644
--- a/submodules/TelegramUI/TelegramUI/StorageUsageController.swift
+++ b/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift
@@ -268,7 +268,7 @@ private func stringForCategory(strings: PresentationStrings, category: PeerCache
}
}
-func storageUsageController(context: AccountContext, isModal: Bool = false) -> ViewController {
+public func storageUsageController(context: AccountContext, isModal: Bool = false) -> ViewController {
let cacheSettingsPromise = Promise()
cacheSettingsPromise.set(context.sharedContext.accountManager.sharedData(keys: [SharedDataKeys.cacheStorageSettings])
|> map { sharedData -> CacheStorageSettings in
diff --git a/submodules/TelegramUI/TelegramUI/VoiceCallDataSavingController.swift b/submodules/SettingsUI/Sources/Data and Storage/VoiceCallDataSavingController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/VoiceCallDataSavingController.swift
rename to submodules/SettingsUI/Sources/Data and Storage/VoiceCallDataSavingController.swift
diff --git a/submodules/TelegramUI/TelegramUI/DebugAccountsController.swift b/submodules/SettingsUI/Sources/DebugAccountsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/DebugAccountsController.swift
rename to submodules/SettingsUI/Sources/DebugAccountsController.swift
diff --git a/submodules/TelegramUI/TelegramUI/DebugController.swift b/submodules/SettingsUI/Sources/DebugController.swift
similarity index 97%
rename from submodules/TelegramUI/TelegramUI/DebugController.swift
rename to submodules/SettingsUI/Sources/DebugController.swift
index 0c96ed38dd..0c998414cc 100644
--- a/submodules/TelegramUI/TelegramUI/DebugController.swift
+++ b/submodules/SettingsUI/Sources/DebugController.swift
@@ -149,7 +149,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated()
- let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled])
+ let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled]))
controller.peerSelected = { [weak controller] peerId in
if let strongController = controller {
strongController.dismiss()
@@ -198,7 +198,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated()
- let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled])
+ let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled]))
controller.peerSelected = { [weak controller] peerId in
if let strongController = controller {
strongController.dismiss()
@@ -243,7 +243,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
guard let context = arguments.context else {
return
}
- let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled])
+ let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled]))
controller.peerSelected = { [weak controller] peerId in
if let strongController = controller {
strongController.dismiss()
@@ -273,7 +273,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated()
- let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled])
+ let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled]))
controller.peerSelected = { [weak controller] peerId in
if let strongController = controller {
strongController.dismiss()
@@ -491,7 +491,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
return
}
- let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled])
+ let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled]))
controller.peerSelected = { [weak controller] peerId in
if let strongController = controller {
strongController.dismiss()
diff --git a/submodules/TelegramUI/TelegramUI/EditSettingsController.swift b/submodules/SettingsUI/Sources/EditSettingsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/EditSettingsController.swift
rename to submodules/SettingsUI/Sources/EditSettingsController.swift
diff --git a/submodules/SettingsUI/Sources/FrameworkBundle.swift b/submodules/SettingsUI/Sources/FrameworkBundle.swift
new file mode 100644
index 0000000000..8ca13d7d92
--- /dev/null
+++ b/submodules/SettingsUI/Sources/FrameworkBundle.swift
@@ -0,0 +1,13 @@
+import Foundation
+import UIKit
+
+private class FrameworkBundleClass: NSObject {
+}
+
+let frameworkBundle: Bundle = Bundle(for: FrameworkBundleClass.self)
+
+extension UIImage {
+ convenience init?(bundleImageName: String) {
+ self.init(named: bundleImageName, in: frameworkBundle, compatibleWith: nil)
+ }
+}
diff --git a/submodules/TelegramUI/TelegramUI/LocalizationListController.swift b/submodules/SettingsUI/Sources/Language Selection/LocalizationListController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/LocalizationListController.swift
rename to submodules/SettingsUI/Sources/Language Selection/LocalizationListController.swift
diff --git a/submodules/TelegramUI/TelegramUI/LocalizationListControllerNode.swift b/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/LocalizationListControllerNode.swift
rename to submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/LocalizationListItem.swift b/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/LocalizationListItem.swift
rename to submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/LanguageSuggestionController.swift b/submodules/SettingsUI/Sources/Language Suggestion/LanguageSuggestionController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/LanguageSuggestionController.swift
rename to submodules/SettingsUI/Sources/Language Suggestion/LanguageSuggestionController.swift
diff --git a/submodules/TelegramUI/TelegramUI/LogoutOptionsController.swift b/submodules/SettingsUI/Sources/LogoutOptionsController.swift
similarity index 97%
rename from submodules/TelegramUI/TelegramUI/LogoutOptionsController.swift
rename to submodules/SettingsUI/Sources/LogoutOptionsController.swift
index 652dd361f7..c68485e932 100644
--- a/submodules/TelegramUI/TelegramUI/LogoutOptionsController.swift
+++ b/submodules/SettingsUI/Sources/LogoutOptionsController.swift
@@ -10,6 +10,7 @@ import ItemListUI
import OverlayStatusController
import AccountContext
import AlertUI
+import UrlHandling
private struct LogoutOptionsItemArguments {
let addAccount: () -> Void
@@ -190,9 +191,9 @@ func logoutOptionsController(context: AccountContext, navigationController: Navi
supportPeerDisposable.set((supportPeer.get()
|> take(1)
|> deliverOnMainQueue).start(next: { peerId in
- if let peerId = peerId {
+ if let peerId = peerId, let navigationController = navigationController {
dismissImpl?()
- pushControllerImpl?(ChatControllerImpl(context: context, chatLocation: .peer(peerId)))
+ context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
}
}))
})
diff --git a/submodules/TelegramUI/TelegramUI/NotificationExceptionControllerNode.swift b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/NotificationExceptionControllerNode.swift
rename to submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift
index 0026cd939f..a9f4d0df0f 100644
--- a/submodules/TelegramUI/TelegramUI/NotificationExceptionControllerNode.swift
+++ b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift
@@ -859,7 +859,7 @@ final class NotificationExceptionsControllerNode: ViewControllerTracingNode {
case .channels:
filter.insert(.onlyChannels)
}
- let controller = PeerSelectionController(context: context, filter: filter, hasContactSelector: false, title: presentationData.strings.Notifications_AddExceptionTitle)
+ let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: filter, hasContactSelector: false, title: presentationData.strings.Notifications_AddExceptionTitle))
controller.peerSelected = { [weak controller] peerId in
presentPeerSettings(peerId, {
controller?.dismiss()
diff --git a/submodules/TelegramUI/TelegramUI/NotificationExceptionSettingsController.swift b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionSettingsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/NotificationExceptionSettingsController.swift
rename to submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionSettingsController.swift
diff --git a/submodules/TelegramUI/TelegramUI/NotificationExceptions.swift b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptions.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/NotificationExceptions.swift
rename to submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptions.swift
diff --git a/submodules/TelegramUI/TelegramUI/NotificationSearchItem.swift b/submodules/SettingsUI/Sources/Notifications/NotificationSearchItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/NotificationSearchItem.swift
rename to submodules/SettingsUI/Sources/Notifications/NotificationSearchItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/NotificationsAndSounds.swift b/submodules/SettingsUI/Sources/Notifications/NotificationsAndSounds.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/NotificationsAndSounds.swift
rename to submodules/SettingsUI/Sources/Notifications/NotificationsAndSounds.swift
diff --git a/submodules/TelegramUI/TelegramUI/OpenSettings.swift b/submodules/SettingsUI/Sources/OpenSettings.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/OpenSettings.swift
rename to submodules/SettingsUI/Sources/OpenSettings.swift
diff --git a/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift b/submodules/SettingsUI/Sources/Privacy and Security/BlockedPeersController.swift
similarity index 98%
rename from submodules/TelegramUI/TelegramUI/BlockedPeersController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/BlockedPeersController.swift
index 87cf3fe738..d47d531956 100644
--- a/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift
+++ b/submodules/SettingsUI/Sources/Privacy and Security/BlockedPeersController.swift
@@ -224,7 +224,7 @@ public func blockedPeersController(context: AccountContext, blockedPeersContext:
}
}, addPeer: {
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
- let controller = PeerSelectionController(context: context, filter: [.onlyPrivateChats, .excludeSavedMessages, .removeSearchHeader, .excludeRecent], title: presentationData.strings.BlockedUsers_SelectUserTitle)
+ let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyPrivateChats, .excludeSavedMessages, .removeSearchHeader, .excludeRecent], title: presentationData.strings.BlockedUsers_SelectUserTitle))
controller.peerSelected = { [weak controller] peerId in
guard let strongController = controller else {
return
diff --git a/submodules/TelegramUI/TelegramUI/ConfirmPhoneNumberController.swift b/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift
similarity index 98%
rename from submodules/TelegramUI/TelegramUI/ConfirmPhoneNumberController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift
index 67aac7f6fb..aba918c2e4 100644
--- a/submodules/TelegramUI/TelegramUI/ConfirmPhoneNumberController.swift
+++ b/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift
@@ -8,6 +8,7 @@ import TelegramPresentationData
import ItemListUI
import AccountContext
import AlertUI
+import AuthorizationUI
private final class ConfirmPhoneNumberCodeControllerArguments {
let updateEntryText: (String) -> Void
@@ -175,7 +176,7 @@ private final class ConfirmPhoneNumberCodeControllerImpl: ItemListController ViewController {
+public func confirmPhoneNumberCodeController(context: AccountContext, phoneNumber: String, codeData: CancelAccountResetData) -> ViewController {
let initialState = ConfirmPhoneNumberCodeControllerState(codeText: "", checking: false)
let statePromise = ValuePromise(initialState, ignoreRepeated: true)
diff --git a/submodules/TelegramUI/TelegramUI/CreatePasswordController.swift b/submodules/SettingsUI/Sources/Privacy and Security/CreatePasswordController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/CreatePasswordController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/CreatePasswordController.swift
diff --git a/submodules/TelegramUI/TelegramUI/DataPrivacySettingsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/DataPrivacySettingsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/DataPrivacySettingsController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/DataPrivacySettingsController.swift
diff --git a/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift
similarity index 91%
rename from submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift
index 1923fc8fbd..090195a21d 100644
--- a/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift
+++ b/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift
@@ -86,8 +86,6 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
private var item: ForwardPrivacyChatPreviewItem?
- private let controllerInteraction: ChatControllerInteraction
-
init() {
self.backgroundNode = ASImageNode()
self.backgroundNode.isLayerBacked = true
@@ -104,8 +102,6 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
self.containerNode = ASDisplayNode()
self.containerNode.subnodeTransform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0)
- self.controllerInteraction = ChatControllerInteraction.default
-
self.tooltipContainerNode = ContextMenuContainerNode()
self.tooltipContainerNode.backgroundColor = UIColor(white: 0.0, alpha: 0.8)
@@ -128,7 +124,6 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
func asyncLayout() -> (_ item: ForwardPrivacyChatPreviewItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
let currentItem = self.item
- let controllerInteraction = self.controllerInteraction
let currentNode = self.messageNode
let makeTextLayout = TextNode.asyncLayout(self.measureTextNode)
@@ -150,9 +145,7 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
let forwardInfo = MessageForwardInfo(author: item.linkEnabled ? peers[peerId] : nil, source: nil, sourceMessageId: nil, date: 0, authorSignature: item.linkEnabled ? nil : item.peerName)
- let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: item.theme, wallpaper: item.wallpaper), fontSize: item.fontSize, strings: item.strings, dateTimeFormat: item.dateTimeFormat, nameDisplayOrder: item.nameDisplayOrder, disableAnimations: false, largeEmoji: false)
-
- let messageItem = ChatMessageItem(presentationData: chatPresentationData, context: item.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: forwardInfo, author: nil, text: item.strings.Privacy_Forwards_PreviewMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: true)
+ let messageItem = item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: forwardInfo, author: nil, text: item.strings.Privacy_Forwards_PreviewMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: item.theme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil)
var node: ListViewItemNode?
if let current = currentNode {
@@ -266,7 +259,7 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
let contentSize = CGSize(width: textSize.width + 12.0, height: textSize.height + 34.0)
var sourceRect: CGRect
- if let messageNode = strongSelf.messageNode as? ChatMessageBubbleItemNode, let forwardInfoNode = messageNode.forwardInfoNode {
+ if let messageNode = strongSelf.messageNode as? ChatMessagePrevewItemNode, let forwardInfoNode = messageNode.forwardInfoReferenceNode {
sourceRect = forwardInfoNode.convert(forwardInfoNode.bounds, to: strongSelf)
if let authorNameCenter = authorNameCenter {
sourceRect.origin = CGPoint(x: sourceRect.minX + authorNameCenter, y: sourceRect.minY)
diff --git a/submodules/TelegramUI/TelegramUI/PasscodeOptionsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/PasscodeOptionsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/PasscodeOptionsController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/PasscodeOptionsController.swift
diff --git a/submodules/TelegramUI/TelegramUI/PrivacyAndSecurityController.swift b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/PrivacyAndSecurityController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift
diff --git a/submodules/TelegramUI/TelegramUI/PrivacyIntroController.swift b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyIntroController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/PrivacyIntroController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/PrivacyIntroController.swift
diff --git a/submodules/TelegramUI/TelegramUI/PrivacyIntroControllerNode.swift b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyIntroControllerNode.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/PrivacyIntroControllerNode.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/PrivacyIntroControllerNode.swift
index d2380e956c..c6ad09bdfd 100644
--- a/submodules/TelegramUI/TelegramUI/PrivacyIntroControllerNode.swift
+++ b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyIntroControllerNode.swift
@@ -7,6 +7,7 @@ import TelegramCore
import SwiftSignalKit
import TelegramPresentationData
import AccountContext
+import AuthorizationUI
private func generateButtonImage(backgroundColor: UIColor, borderColor: UIColor, highlightColor: UIColor?) -> UIImage? {
return generateImage(CGSize(width: 1.0, height: 44.0), contextGenerator: { size, context in
diff --git a/submodules/TelegramUI/TelegramUI/ItemListRecentSessionItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListRecentSessionItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ItemListRecentSessionItem.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListRecentSessionItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/ItemListWebsiteItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListWebsiteItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ItemListWebsiteItem.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListWebsiteItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/RecentSessionsController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift
diff --git a/submodules/TelegramUI/TelegramUI/RecentSessionsEmptyStateItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/RecentSessionsEmptyStateItem.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift
diff --git a/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsPeersController.swift b/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsPeersController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsPeersController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsPeersController.swift
diff --git a/submodules/TelegramUI/TelegramUI/TwoStepVerificationPasswordEntryController.swift b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationPasswordEntryController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/TwoStepVerificationPasswordEntryController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationPasswordEntryController.swift
diff --git a/submodules/TelegramUI/TelegramUI/TwoStepVerificationResetController.swift b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/TwoStepVerificationResetController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift
diff --git a/submodules/TelegramUI/TelegramUI/TwoStepVerificationUnlockController.swift b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/TwoStepVerificationUnlockController.swift
rename to submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift
diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchItem.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/SettingsSearchItem.swift
rename to submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchRecentItem.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchRecentItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/SettingsSearchRecentItem.swift
rename to submodules/SettingsUI/Sources/Search/SettingsSearchRecentItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchRecentQueries.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchRecentQueries.swift
similarity index 96%
rename from submodules/TelegramUI/TelegramUI/SettingsSearchRecentQueries.swift
rename to submodules/SettingsUI/Sources/Search/SettingsSearchRecentQueries.swift
index 38679d8a0b..a13843c491 100644
--- a/submodules/TelegramUI/TelegramUI/SettingsSearchRecentQueries.swift
+++ b/submodules/SettingsUI/Sources/Search/SettingsSearchRecentQueries.swift
@@ -21,8 +21,8 @@ private struct SettingsSearchRecentQueryItemId {
}
}
-final class RecentSettingsSearchQueryItem: OrderedItemListEntryContents {
- init() {
+public final class RecentSettingsSearchQueryItem: OrderedItemListEntryContents {
+ public init() {
}
public init(decoder: PostboxDecoder) {
diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchResultItem.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchResultItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/SettingsSearchResultItem.swift
rename to submodules/SettingsUI/Sources/Search/SettingsSearchResultItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchableItems.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/SettingsSearchableItems.swift
rename to submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift
index 3045df777a..7e3eeb0e65 100644
--- a/submodules/TelegramUI/TelegramUI/SettingsSearchableItems.swift
+++ b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift
@@ -812,7 +812,7 @@ func settingsSearchableItems(context: AccountContext, notificationExceptionsList
allItems.append(contentsOf: profileItems)
let savedMessages = SettingsSearchableItem(id: .savedMessages(0), title: strings.Settings_SavedMessages, alternate: synonyms(strings.SettingsSearch_Synonyms_SavedMessages), icon: .savedMessages, breadcrumbs: [], present: { context, _, present in
- present(.push, ChatControllerImpl(context: context, chatLocation: .peer(context.account.peerId)))
+ present(.push, context.sharedContext.makeChatController(context: context, chatLocation: .peer(context.account.peerId), subject: nil, botStart: nil, mode: .standard(previewing: false)))
})
allItems.append(savedMessages)
@@ -856,7 +856,7 @@ func settingsSearchableItems(context: AccountContext, notificationExceptionsList
let _ = (supportPeerId(account: context.account)
|> deliverOnMainQueue).start(next: { peerId in
if let peerId = peerId {
- present(.push, ChatControllerImpl(context: context, chatLocation: .peer(peerId)))
+ present(.push, context.sharedContext.makeChatController(context: context, chatLocation: .peer(peerId), subject: nil, botStart: nil, mode: .standard(previewing: false)))
}
})
})
diff --git a/submodules/TelegramUI/TelegramUI/SettingsController.swift b/submodules/SettingsUI/Sources/SettingsController.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/SettingsController.swift
rename to submodules/SettingsUI/Sources/SettingsController.swift
index 617811e201..d7f09ae637 100644
--- a/submodules/TelegramUI/TelegramUI/SettingsController.swift
+++ b/submodules/SettingsUI/Sources/SettingsController.swift
@@ -616,7 +616,7 @@ private final class SettingsControllerImpl: ItemListController, S
}
}
-public func settingsController(context: AccountContext, accountManager: AccountManager) -> SettingsController & ViewController {
+public func settingsController(context: AccountContext, accountManager: AccountManager, enableDebugActions: Bool) -> SettingsController & ViewController {
let initialState = SettingsState(updatingAvatar: nil, accountIdWithRevealedOptions: nil, isSearching: false)
let statePromise = ValuePromise(initialState, ignoreRepeated: true)
let stateValue = Atomic(value: initialState)
@@ -824,7 +824,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM
}), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {
supportPeerDisposable.set((supportPeer.get() |> take(1) |> deliverOnMainQueue).start(next: { peerId in
if let peerId = peerId {
- pushControllerImpl?(ChatControllerImpl(context: context, chatLocation: .peer(peerId)))
+ pushControllerImpl?(context.sharedContext.makeChatController(context: context, chatLocation: .peer(peerId), subject: nil, botStart: nil, mode: .standard(previewing: false)))
}
}))
})]), nil)
@@ -1389,7 +1389,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM
})
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: !GlobalExperimentalSettings.isAppStoreBuild)
+ let chatListController = accountContext.sharedContext.makeChatListController(context: accountContext, groupId: .root, controlsHistoryPreload: false, hideNetworkActivityStatus: true, enableDebugActions: enableDebugActions)
return chatListController
}
}
diff --git a/submodules/SettingsUI/Sources/SettingsUI.h b/submodules/SettingsUI/Sources/SettingsUI.h
new file mode 100644
index 0000000000..899048f6a5
--- /dev/null
+++ b/submodules/SettingsUI/Sources/SettingsUI.h
@@ -0,0 +1,19 @@
+//
+// SettingsUI.h
+// SettingsUI
+//
+// Created by Peter on 8/17/19.
+// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
+//
+
+#import
+
+//! Project version number for SettingsUI.
+FOUNDATION_EXPORT double SettingsUIVersionNumber;
+
+//! Project version string for SettingsUI.
+FOUNDATION_EXPORT const unsigned char SettingsUIVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift b/submodules/SettingsUI/Sources/Stickers/ArchivedStickerPacksController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift
rename to submodules/SettingsUI/Sources/Stickers/ArchivedStickerPacksController.swift
diff --git a/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift b/submodules/SettingsUI/Sources/Stickers/FeaturedStickerPacksController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift
rename to submodules/SettingsUI/Sources/Stickers/FeaturedStickerPacksController.swift
diff --git a/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift b/submodules/SettingsUI/Sources/Stickers/InstalledStickerPacksController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift
rename to submodules/SettingsUI/Sources/Stickers/InstalledStickerPacksController.swift
diff --git a/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift b/submodules/SettingsUI/Sources/TabBarAccountSwitchController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift
rename to submodules/SettingsUI/Sources/TabBarAccountSwitchController.swift
diff --git a/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchControllerNode.swift b/submodules/SettingsUI/Sources/TabBarAccountSwitchControllerNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/TabBarAccountSwitchControllerNode.swift
rename to submodules/SettingsUI/Sources/TabBarAccountSwitchControllerNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/TermsOfServiceController.swift b/submodules/SettingsUI/Sources/Terms of Service/TermsOfServiceController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/TermsOfServiceController.swift
rename to submodules/SettingsUI/Sources/Terms of Service/TermsOfServiceController.swift
diff --git a/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift b/submodules/SettingsUI/Sources/Terms of Service/TermsOfServiceControllerNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift
rename to submodules/SettingsUI/Sources/Terms of Service/TermsOfServiceControllerNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift b/submodules/SettingsUI/Sources/Themes/CustomWallpaperPicker.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift
rename to submodules/SettingsUI/Sources/Themes/CustomWallpaperPicker.swift
index c350a554b8..e12af5fe34 100644
--- a/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift
+++ b/submodules/SettingsUI/Sources/Themes/CustomWallpaperPicker.swift
@@ -10,6 +10,7 @@ import MediaResources
import AccountContext
import LegacyUI
import LegacyMediaPickerUI
+import LocalMediaResources
func presentCustomWallpaperPicker(context: AccountContext, present: @escaping (ViewController) -> Void) {
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
diff --git a/submodules/TelegramUI/TelegramUI/SettingsThemeWallpaperNode.swift b/submodules/SettingsUI/Sources/Themes/SettingsThemeWallpaperNode.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/SettingsThemeWallpaperNode.swift
rename to submodules/SettingsUI/Sources/Themes/SettingsThemeWallpaperNode.swift
index ad27e97209..26b84afe35 100644
--- a/submodules/TelegramUI/TelegramUI/SettingsThemeWallpaperNode.swift
+++ b/submodules/SettingsUI/Sources/Themes/SettingsThemeWallpaperNode.swift
@@ -8,6 +8,7 @@ import SwiftSignalKit
import TelegramPresentationData
import AccountContext
import RadialStatusNode
+import WallpaperResources
private func whiteColorImage(theme: PresentationTheme) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> {
return .single({ arguments in
diff --git a/submodules/TelegramUI/TelegramUI/ThemeAccentColorController.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeAccentColorController.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift
similarity index 81%
rename from submodules/TelegramUI/TelegramUI/ThemeAccentColorControllerNode.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift
index 4a8f1b21a4..3416696089 100644
--- a/submodules/TelegramUI/TelegramUI/ThemeAccentColorControllerNode.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift
@@ -239,7 +239,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate
}
private func updateMessagesLayout(layout: ContainerViewLayout, bottomInset: CGFloat, transition: ContainedViewLayoutTransition) {
- var items: [ChatMessageItem] = []
+ var items: [ListViewItem] = []
let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: 1)
let otherPeerId = self.context.account.peerId
var peers = SimpleDictionary()
@@ -250,21 +250,28 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyText, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [])
- let controllerInteraction = ChatControllerInteraction.default
- let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.theme, wallpaper: self.theme.chat.defaultWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false, isPreview: true)
+ let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ let message2 = Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message2, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ let message3 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])
+
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message3, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 14, title: nil, performer: nil, waveform: MemoryBuffer())]
let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: nil, attributes: voiceAttributes)
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ let message4 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: [])
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)))
+
+ //items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)), controllerInteraction: controllerInteraction, content: .message(message: , read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+
+ let message5 = Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message5, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right)
if let messageNodes = self.messageNodes {
diff --git a/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeAutoNightTimeSelectionActionSheet.swift b/submodules/SettingsUI/Sources/Themes/ThemeAutoNightTimeSelectionActionSheet.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeAutoNightTimeSelectionActionSheet.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeAutoNightTimeSelectionActionSheet.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeColorsGridController.swift b/submodules/SettingsUI/Sources/Themes/ThemeColorsGridController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeColorsGridController.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeColorsGridController.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerItem.swift
similarity index 98%
rename from submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerItem.swift
index 55ea164977..357f37a975 100644
--- a/submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerItem.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerItem.swift
@@ -6,6 +6,7 @@ import SwiftSignalKit
import AsyncDisplayKit
import Postbox
import AccountContext
+import GridMessageSelectionNode
final class ThemeColorsGridControllerItem: GridItem {
let context: AccountContext
diff --git a/submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerNode.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridController.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridController.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/ThemeGridController.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeGridController.swift
index 22577ed6be..e8a2c66b8a 100644
--- a/submodules/TelegramUI/TelegramUI/ThemeGridController.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeGridController.swift
@@ -12,6 +12,7 @@ import OverlayStatusController
import AccountContext
import ShareController
import SearchUI
+import HexColor
final class ThemeGridController: ViewController {
private var controllerNode: ThemeGridControllerNode {
diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridControllerItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridControllerItem.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/ThemeGridControllerItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeGridControllerItem.swift
index 6e588ee22f..2c16bb784f 100644
--- a/submodules/TelegramUI/TelegramUI/ThemeGridControllerItem.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeGridControllerItem.swift
@@ -6,6 +6,7 @@ import SwiftSignalKit
import AsyncDisplayKit
import Postbox
import AccountContext
+import GridMessageSelectionNode
final class ThemeGridControllerItem: GridItem {
let context: AccountContext
diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeGridControllerNode.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridSearchColorsItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridSearchColorsItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeGridSearchColorsItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeGridSearchColorsItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridSearchContentNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridSearchContentNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeGridSearchContentNode.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeGridSearchContentNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridSearchItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridSearchItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeGridSearchItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeGridSearchItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridSelectionPanelNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridSelectionPanelNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeGridSelectionPanelNode.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeGridSelectionPanelNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift
similarity index 91%
rename from submodules/TelegramUI/TelegramUI/ThemePreviewController.swift
rename to submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift
index 05d3bc15ca..41199e1961 100644
--- a/submodules/TelegramUI/TelegramUI/ThemePreviewController.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift
@@ -9,8 +9,9 @@ import TelegramPresentationData
import TelegramUIPreferences
import AccountContext
import ShareController
+import CounterContollerTitleView
-final class ThemePreviewController: ViewController {
+public final class ThemePreviewController: ViewController {
private let context: AccountContext
private let previewTheme: PresentationTheme
private let media: AnyMediaReference
@@ -24,7 +25,7 @@ final class ThemePreviewController: ViewController {
private var presentationData: PresentationData
private var presentationDataDisposable: Disposable?
- init(context: AccountContext, previewTheme: PresentationTheme, media: AnyMediaReference) {
+ public init(context: AccountContext, previewTheme: PresentationTheme, media: AnyMediaReference) {
self.context = context
self.previewTheme = previewTheme
self.media = media
@@ -54,7 +55,7 @@ final class ThemePreviewController: ViewController {
})
}
- required init(coder aDecoder: NSCoder) {
+ required public init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@@ -62,7 +63,7 @@ final class ThemePreviewController: ViewController {
self.presentationDataDisposable?.dispose()
}
- public override func viewDidAppear(_ animated: Bool) {
+ override public func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let presentationArguments = self.presentationArguments as? ViewControllerPresentationArguments, !self.didPlayPresentationAnimation {
@@ -73,7 +74,7 @@ final class ThemePreviewController: ViewController {
}
}
- override func loadDisplayNode() {
+ override public func loadDisplayNode() {
super.loadDisplayNode()
self.displayNode = ThemePreviewControllerNode(context: self.context, previewTheme: self.previewTheme, dismiss: { [weak self] in
@@ -114,7 +115,7 @@ final class ThemePreviewController: ViewController {
})
}
- override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
+ override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
super.containerLayoutUpdated(layout, transition: transition)
self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition)
diff --git a/submodules/TelegramUI/TelegramUI/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift
similarity index 79%
rename from submodules/TelegramUI/TelegramUI/ThemePreviewControllerNode.swift
rename to submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift
index 80a6dd75bc..1911169468 100644
--- a/submodules/TelegramUI/TelegramUI/ThemePreviewControllerNode.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift
@@ -186,7 +186,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
}
private func updateMessagesLayout(layout: ContainerViewLayout, bottomInset: CGFloat, transition: ContainedViewLayoutTransition) {
- var items: [ChatMessageItem] = []
+ var items: [ListViewItem] = []
let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: 1)
let otherPeerId = self.context.account.peerId
var peers = SimpleDictionary()
@@ -197,21 +197,20 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [])
- let controllerInteraction = ChatControllerInteraction.default
- let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.previewTheme, wallpaper: self.previewTheme.chat.defaultWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false)
+ //let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.previewTheme, wallpaper: self.previewTheme.chat.defaultWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false)
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 14, title: nil, performer: nil, waveform: MemoryBuffer())]
let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: nil, attributes: voiceAttributes)
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)))
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right)
if let messageNodes = self.messageNodes {
diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAccentColorItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeSettingsAccentColorItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsBrightnessItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsBrightnessItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeSettingsBrightnessItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeSettingsBrightnessItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift
similarity index 81%
rename from submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift
index 5258348745..3cf4de2a2d 100644
--- a/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift
+++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift
@@ -79,8 +79,6 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
private var item: ThemeSettingsChatPreviewItem?
- private let controllerInteraction: ChatControllerInteraction
-
init() {
self.backgroundNode = ASImageNode()
self.backgroundNode.isLayerBacked = true
@@ -97,8 +95,6 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
self.containerNode = ASDisplayNode()
self.containerNode.subnodeTransform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0)
- self.controllerInteraction = ChatControllerInteraction.default
-
super.init(layerBacked: false, dynamicBounce: false)
self.addSubnode(self.containerNode)
@@ -107,7 +103,6 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
func asyncLayout() -> (_ item: ThemeSettingsChatPreviewItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
let currentItem = self.item
- let controllerInteraction = self.controllerInteraction
let currentNode1 = self.messageNode1
let currentNode2 = self.messageNode2
@@ -129,10 +124,15 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: item.strings.Appearance_PreviewReplyText, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [])
- let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: item.componentTheme, wallpaper: item.wallpaper), fontSize: item.fontSize, strings: item.strings, dateTimeFormat: item.dateTimeFormat, nameDisplayOrder: item.nameDisplayOrder, disableAnimations: false, largeEmoji: false)
+ //let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: item.componentTheme, wallpaper: item.wallpaper), fontSize: item.fontSize, strings: item.strings, dateTimeFormat: item.dateTimeFormat, nameDisplayOrder: item.nameDisplayOrder, disableAnimations: false, largeEmoji: false)
- let item2: ChatMessageItem = ChatMessageItem(presentationData: chatPresentationData, context: item.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: nil, text: item.strings.Appearance_PreviewIncomingText, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: true)
- let item1: ChatMessageItem = ChatMessageItem(presentationData: chatPresentationData, context: item.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: TelegramUser(id: item.context.account.peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []), text: item.strings.Appearance_PreviewOutgoingText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: true)
+ //let item2: ChatMessageItem = ChatMessageItem(presentationData: chatPresentationData, context: item.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: nil, text: item.strings.Appearance_PreviewIncomingText, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: true)
+ let message2 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: nil, text: item.strings.Appearance_PreviewIncomingText, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])
+ let message1 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: TelegramUser(id: item.context.account.peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []), text: item.strings.Appearance_PreviewOutgoingText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])
+
+ let item2 = item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, message: message2, theme: item.componentTheme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil)
+
+ let item1 = item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, message: message1, theme: item.componentTheme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil)
var node1: ListViewItemNode?
if let current = currentNode1 {
diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsFontSizeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsFontSizeItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeSettingsFontSizeItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeSettingsFontSizeItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift
rename to submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift
index d077697d90..5e6f5e0ec5 100644
--- a/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift
+++ b/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift
@@ -4,6 +4,7 @@ import AsyncDisplayKit
import SwiftSignalKit
import Display
import TelegramPresentationData
+import HexColor
private var currentTextInputBackgroundImage: (UIColor, UIColor, CGFloat, UIImage)?
private func textInputBackgroundImage(fieldColor: UIColor, strokeColor: UIColor, diameter: CGFloat) -> UIImage? {
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperColorPickerNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperColorPickerNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/WallpaperColorPickerNode.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperColorPickerNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperCropNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperCropNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/WallpaperCropNode.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperCropNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift
similarity index 93%
rename from submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift
index 7611d47d9d..0e37ac7eda 100644
--- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift
+++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift
@@ -13,13 +13,15 @@ import MediaResources
import AccountContext
import ShareController
import GalleryUI
+import HexColor
+import CounterContollerTitleView
-enum WallpaperListType {
+public enum WallpaperListType {
case wallpapers(WallpaperPresentationOptions?)
case colors
}
-enum WallpaperListSource {
+public enum WallpaperListSource {
case list(wallpapers: [TelegramWallpaper], central: TelegramWallpaper, type: WallpaperListType)
case wallpaper(TelegramWallpaper, WallpaperPresentationOptions?, UIColor?, Int32?, Message?)
case slug(String, TelegramMediaFile?, WallpaperPresentationOptions?, UIColor?, Int32?, Message?)
@@ -44,7 +46,7 @@ private func areMessagesEqual(_ lhsMessage: Message?, _ rhsMessage: Message?) ->
return true
}
-enum WallpaperGalleryEntry: Equatable {
+public enum WallpaperGalleryEntry: Equatable {
case wallpaper(TelegramWallpaper, Message?)
case asset(PHAsset)
case contextResult(ChatContextResult)
@@ -117,17 +119,17 @@ private func updatedFileWallpaper(id: Int64? = nil, accessHash: Int64? = nil, sl
return .file(id: id ?? 0, accessHash: accessHash ?? 0, isCreator: false, isDefault: false, isPattern: isPattern, isDark: false, slug: slug, file: file, settings: WallpaperSettings(blur: false, motion: false, color: colorValue, intensity: intensityValue))
}
-class WallpaperGalleryController: ViewController {
+public class WallpaperGalleryController: ViewController {
private var galleryNode: GalleryControllerNode {
return self.displayNode as! GalleryControllerNode
}
private let context: AccountContext
private let source: WallpaperListSource
- var apply: ((WallpaperGalleryEntry, WallpaperPresentationOptions, CGRect?) -> Void)?
+ public var apply: ((WallpaperGalleryEntry, WallpaperPresentationOptions, CGRect?) -> Void)?
private let _ready = Promise()
- override var ready: Promise {
+ override public var ready: Promise {
return self._ready
}
private var didSetReady = false
@@ -160,7 +162,7 @@ class WallpaperGalleryController: ViewController {
private var colorPanelEnabled = false
private var patternPanelEnabled = false
- init(context: AccountContext, source: WallpaperListSource) {
+ public init(context: AccountContext, source: WallpaperListSource) {
self.context = context
self.source = source
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
@@ -258,7 +260,7 @@ class WallpaperGalleryController: ViewController {
}))
}
- required init(coder aDecoder: NSCoder) {
+ required public init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@@ -296,7 +298,7 @@ class WallpaperGalleryController: ViewController {
return GalleryPagerTransaction(deleteItems: [], insertItems: [], updateItems: updateItems, focusOnItem: self.galleryNode.pager.centralItemNode()?.index)
}
- override func loadDisplayNode() {
+ override public func loadDisplayNode() {
let controllerInteraction = GalleryControllerInteraction(presentController: { [weak self] controller, arguments in
if let strongSelf = self {
strongSelf.present(controller, in: .window(.root), with: arguments, blockInteraction: true)
@@ -482,7 +484,7 @@ class WallpaperGalleryController: ViewController {
}
}
- override func viewDidAppear(_ animated: Bool) {
+ override public func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.galleryNode.modalAnimateIn()
@@ -569,7 +571,7 @@ class WallpaperGalleryController: ViewController {
}
private func updateMessagesLayout(layout: ContainerViewLayout, bottomInset: CGFloat, transition: ContainedViewLayoutTransition) {
- var items: [ChatMessageItem] = []
+ var items: [ListViewItem] = []
let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: 1)
let otherPeerId = self.context.account.peerId
var peers = SimpleDictionary()
@@ -582,8 +584,7 @@ class WallpaperGalleryController: ViewController {
currentWallpaper = wallpaper
}
- let controllerInteraction = ChatControllerInteraction.default
- let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.presentationData.theme, wallpaper: currentWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false)
+ //let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.presentationData.theme, wallpaper: currentWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false)
var topMessageText: String
var bottomMessageText: String
@@ -613,9 +614,12 @@ class WallpaperGalleryController: ViewController {
bottomMessageText = presentationData.strings.WallpaperPreview_CustomColorBottomText
}
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: bottomMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ let message1 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: bottomMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: currentWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
- items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: topMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false))
+ let message2 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: topMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])
+
+ items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message2, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: currentWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil))
let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right)
if let messageNodes = self.messageNodes {
@@ -664,7 +668,7 @@ class WallpaperGalleryController: ViewController {
}
}
- override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
+ override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
let hadLayout = self.validLayout != nil
super.containerLayoutUpdated(layout, transition: transition)
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryDecorationNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryDecorationNode.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/WallpaperGalleryDecorationNode.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperGalleryDecorationNode.swift
index 3155579a95..ec1a347b00 100644
--- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryDecorationNode.swift
+++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryDecorationNode.swift
@@ -4,6 +4,7 @@ import Display
import AsyncDisplayKit
import SwiftSignalKit
import Postbox
+import CheckNode
enum WallpaperOptionButtonValue {
case check(Bool)
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift
similarity index 99%
rename from submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift
index a250b52045..4ee75d07a7 100644
--- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift
+++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift
@@ -15,6 +15,7 @@ import RadialStatusNode
import PhotoResources
import GalleryUI
import LocalMediaResources
+import WallpaperResources
struct WallpaperGalleryItemArguments {
let colorPreview: Bool
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryToolbarNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryToolbarNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/WallpaperGalleryToolbarNode.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperGalleryToolbarNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperPatternPanelNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/WallpaperPatternPanelNode.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift
diff --git a/submodules/TelegramUI/TelegramUI/WallpaperSearchRecentQueries.swift b/submodules/SettingsUI/Sources/Themes/WallpaperSearchRecentQueries.swift
similarity index 96%
rename from submodules/TelegramUI/TelegramUI/WallpaperSearchRecentQueries.swift
rename to submodules/SettingsUI/Sources/Themes/WallpaperSearchRecentQueries.swift
index 7cceae91bc..8dd9078b9e 100644
--- a/submodules/TelegramUI/TelegramUI/WallpaperSearchRecentQueries.swift
+++ b/submodules/SettingsUI/Sources/Themes/WallpaperSearchRecentQueries.swift
@@ -23,8 +23,8 @@ private struct WallpaperSearchRecentQueryItemId {
}
}
-final class RecentWallpaperSearchQueryItem: OrderedItemListEntryContents {
- init() {
+public final class RecentWallpaperSearchQueryItem: OrderedItemListEntryContents {
+ public init() {
}
public init(decoder: PostboxDecoder) {
diff --git a/submodules/TelegramUI/TelegramUI/UsernameSetupController.swift b/submodules/SettingsUI/Sources/UsernameSetupController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/UsernameSetupController.swift
rename to submodules/SettingsUI/Sources/UsernameSetupController.swift
diff --git a/submodules/TelegramUI/TelegramUI/WatchSettingsController.swift b/submodules/SettingsUI/Sources/Watch/WatchSettingsController.swift
similarity index 100%
rename from submodules/TelegramUI/TelegramUI/WatchSettingsController.swift
rename to submodules/SettingsUI/Sources/Watch/WatchSettingsController.swift
diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift
index d8f5105cf4..cab64f5a93 100644
--- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift
+++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift
@@ -108,7 +108,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode {
}
}
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))
- self.animationNode?.setup(account: account, resource: stickerItem.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
+ self.animationNode?.setup(account: account, resource: .resource(stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
self.animationNode?.visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start())
} else {
diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift
index d7ee4cdc8c..9fc4f6d0e6 100644
--- a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift
+++ b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift
@@ -91,7 +91,7 @@ private final class StickerPreviewPeekContentNode: ASDisplayNode, PeekController
let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 400.0, height: 400.0))
- self.animationNode?.setup(account: account, resource: item.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct)
+ self.animationNode?.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct)
self.animationNode?.visibility = true
self.animationNode?.addSubnode(self.textNode)
} else {
diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift
index 2748d65e98..a5b0363284 100644
--- a/submodules/TelegramApi/Sources/Api3.swift
+++ b/submodules/TelegramApi/Sources/Api3.swift
@@ -3034,17 +3034,14 @@ public extension Api {
})
}
- public static func sendReaction(peer: Api.InputPeer, msgId: Int32, reaction: [String]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ public static func sendReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, reaction: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
let buffer = Buffer()
- buffer.appendInt32(666939980)
+ buffer.appendInt32(627641572)
+ serializeInt32(flags, buffer: buffer, boxed: false)
peer.serialize(buffer, true)
serializeInt32(msgId, buffer: buffer, boxed: false)
- buffer.appendInt32(481674261)
- buffer.appendInt32(Int32(reaction.count))
- for item in reaction {
- serializeString(item, buffer: buffer, boxed: false)
- }
- return (FunctionDescription(name: "messages.sendReaction", parameters: [("peer", peer), ("msgId", msgId), ("reaction", reaction)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
+ 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() {
diff --git a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift
index 4ba684656c..e41c667825 100644
--- a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift
+++ b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift
@@ -514,6 +514,7 @@ struct AccountFinalState {
struct AccountReplayedFinalState {
let state: AccountFinalState
let addedIncomingMessageIds: [MessageId]
+ let wasScheduledMessageIds: [MessageId]
let addedSecretMessageIds: [MessageId]
let updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]]
let updatedWebpages: [MediaId: TelegramMediaWebpage]
@@ -525,6 +526,7 @@ struct AccountReplayedFinalState {
struct AccountFinalStateEvents {
let addedIncomingMessageIds: [MessageId]
+ let wasScheduledMessageIds:[MessageId]
let updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]]
let updatedWebpages: [MediaId: TelegramMediaWebpage]
let updatedCalls: [Api.PhoneCall]
@@ -537,11 +539,12 @@ struct AccountFinalStateEvents {
let externallyUpdatedPeerId: Set
var isEmpty: Bool {
- return self.addedIncomingMessageIds.isEmpty && self.updatedTypingActivities.isEmpty && self.updatedWebpages.isEmpty && self.updatedCalls.isEmpty && self.updatedPeersNearby?.isEmpty ?? true && self.isContactUpdates.isEmpty && self.displayAlerts.isEmpty && delayNotificatonsUntil == nil && self.updatedMaxMessageId == nil && self.updatedQts == nil && self.externallyUpdatedPeerId.isEmpty
+ return self.addedIncomingMessageIds.isEmpty && self.wasScheduledMessageIds.isEmpty && self.updatedTypingActivities.isEmpty && self.updatedWebpages.isEmpty && self.updatedCalls.isEmpty && self.updatedPeersNearby?.isEmpty ?? true && self.isContactUpdates.isEmpty && self.displayAlerts.isEmpty && delayNotificatonsUntil == nil && self.updatedMaxMessageId == nil && self.updatedQts == nil && self.externallyUpdatedPeerId.isEmpty
}
- init(addedIncomingMessageIds: [MessageId] = [], updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]] = [:], updatedWebpages: [MediaId: TelegramMediaWebpage] = [:], updatedCalls: [Api.PhoneCall] = [], updatedPeersNearby: [PeerNearby]? = nil, isContactUpdates: [(PeerId, Bool)] = [], displayAlerts: [(text: String, isDropAuth: Bool)] = [], delayNotificatonsUntil: Int32? = nil, updatedMaxMessageId: Int32? = nil, updatedQts: Int32? = nil, externallyUpdatedPeerId: Set = Set()) {
+ init(addedIncomingMessageIds: [MessageId] = [], wasScheduledMessageIds: [MessageId] = [], updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]] = [:], updatedWebpages: [MediaId: TelegramMediaWebpage] = [:], updatedCalls: [Api.PhoneCall] = [], updatedPeersNearby: [PeerNearby]? = nil, isContactUpdates: [(PeerId, Bool)] = [], displayAlerts: [(text: String, isDropAuth: Bool)] = [], delayNotificatonsUntil: Int32? = nil, updatedMaxMessageId: Int32? = nil, updatedQts: Int32? = nil, externallyUpdatedPeerId: Set = Set()) {
self.addedIncomingMessageIds = addedIncomingMessageIds
+ self.wasScheduledMessageIds = wasScheduledMessageIds
self.updatedTypingActivities = updatedTypingActivities
self.updatedWebpages = updatedWebpages
self.updatedCalls = updatedCalls
@@ -556,6 +559,7 @@ struct AccountFinalStateEvents {
init(state: AccountReplayedFinalState) {
self.addedIncomingMessageIds = state.addedIncomingMessageIds
+ self.wasScheduledMessageIds = state.wasScheduledMessageIds
self.updatedTypingActivities = state.updatedTypingActivities
self.updatedWebpages = state.updatedWebpages
self.updatedCalls = state.updatedCalls
@@ -590,6 +594,6 @@ struct AccountFinalStateEvents {
let externallyUpdatedPeerId = self.externallyUpdatedPeerId.union(other.externallyUpdatedPeerId)
- return AccountFinalStateEvents(addedIncomingMessageIds: self.addedIncomingMessageIds + other.addedIncomingMessageIds, updatedTypingActivities: self.updatedTypingActivities, updatedWebpages: self.updatedWebpages, updatedCalls: self.updatedCalls + other.updatedCalls, isContactUpdates: self.isContactUpdates + other.isContactUpdates, displayAlerts: self.displayAlerts + other.displayAlerts, delayNotificatonsUntil: delayNotificatonsUntil, updatedMaxMessageId: updatedMaxMessageId, updatedQts: updatedQts, externallyUpdatedPeerId: externallyUpdatedPeerId)
+ return AccountFinalStateEvents(addedIncomingMessageIds: self.addedIncomingMessageIds + other.addedIncomingMessageIds, wasScheduledMessageIds: self.wasScheduledMessageIds + other.wasScheduledMessageIds, updatedTypingActivities: self.updatedTypingActivities, updatedWebpages: self.updatedWebpages, updatedCalls: self.updatedCalls + other.updatedCalls, isContactUpdates: self.isContactUpdates + other.isContactUpdates, displayAlerts: self.displayAlerts + other.displayAlerts, delayNotificatonsUntil: delayNotificatonsUntil, updatedMaxMessageId: updatedMaxMessageId, updatedQts: updatedQts, externallyUpdatedPeerId: externallyUpdatedPeerId)
}
}
diff --git a/submodules/TelegramCore/TelegramCore/AccountManager.swift b/submodules/TelegramCore/TelegramCore/AccountManager.swift
index 4e7f876d51..e7053b31fe 100644
--- a/submodules/TelegramCore/TelegramCore/AccountManager.swift
+++ b/submodules/TelegramCore/TelegramCore/AccountManager.swift
@@ -149,6 +149,7 @@ private var declaredEncodables: Void = {
declareEncodable(CloudStickerPackThumbnailMediaResource.self, f: { CloudStickerPackThumbnailMediaResource(decoder: $0) })
declareEncodable(AccountBackupDataAttribute.self, f: { AccountBackupDataAttribute(decoder: $0) })
declareEncodable(ContentRequiresValidationMessageAttribute.self, f: { ContentRequiresValidationMessageAttribute(decoder: $0) })
+ declareEncodable(WasScheduledMessageAttribute.self, f: { WasScheduledMessageAttribute(decoder: $0) })
declareEncodable(OutgoingScheduleInfoMessageAttribute.self, f: { OutgoingScheduleInfoMessageAttribute(decoder: $0) })
declareEncodable(UpdateMessageReactionsAction.self, f: { UpdateMessageReactionsAction(decoder: $0) })
declareEncodable(RestrictedContentMessageAttribute.self, f: { RestrictedContentMessageAttribute(decoder: $0) })
diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift
index d5a5384b50..2539e788bb 100644
--- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift
+++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift
@@ -2124,16 +2124,24 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP
}
}
+ var wasOpearationScheduledMessegeIds: [MessageId] = []
+
+
var addedOperationIncomingMessageIds: [MessageId] = []
for operation in finalState.state.operations {
switch operation {
case let .AddMessages(messages, location):
if case .UpperHistoryBlock = location {
for message in messages {
- if case let .Id(id) = message.id, message.flags.contains(.Incoming) {
- addedOperationIncomingMessageIds.append(id)
- if let authorId = message.authorId {
- recordPeerActivityTimestamp(peerId: authorId, timestamp: message.timestamp, into: &peerActivityTimestamps)
+ if case let .Id(id) = message.id {
+ if message.flags.contains(.Incoming) {
+ addedOperationIncomingMessageIds.append(id)
+ if let authorId = message.authorId {
+ recordPeerActivityTimestamp(peerId: authorId, timestamp: message.timestamp, into: &peerActivityTimestamps)
+ }
+ }
+ if message.flags.contains(.WasScheduled) {
+ wasOpearationScheduledMessegeIds.append(id)
}
}
}
@@ -2142,7 +2150,17 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP
break
}
}
+ var wasScheduledMessageIds:[MessageId] = []
var addedIncomingMessageIds: [MessageId] = []
+
+ if !wasOpearationScheduledMessegeIds.isEmpty {
+ let existingIds = transaction.filterStoredMessageIds(Set(wasOpearationScheduledMessegeIds))
+ for id in wasOpearationScheduledMessegeIds {
+ if !existingIds.contains(id) {
+ wasScheduledMessageIds.append(id)
+ }
+ }
+ }
if !addedOperationIncomingMessageIds.isEmpty {
let existingIds = transaction.filterStoredMessageIds(Set(addedOperationIncomingMessageIds))
for id in addedOperationIncomingMessageIds {
@@ -2912,5 +2930,5 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP
addedIncomingMessageIds.append(contentsOf: addedSecretMessageIds)
- return AccountReplayedFinalState(state: finalState, addedIncomingMessageIds: addedIncomingMessageIds, addedSecretMessageIds: addedSecretMessageIds, updatedTypingActivities: updatedTypingActivities, updatedWebpages: updatedWebpages, updatedCalls: updatedCalls, updatedPeersNearby: updatedPeersNearby, isContactUpdates: isContactUpdates, delayNotificatonsUntil: delayNotificatonsUntil)
+ return AccountReplayedFinalState(state: finalState, addedIncomingMessageIds: addedIncomingMessageIds, wasScheduledMessageIds: wasScheduledMessageIds, addedSecretMessageIds: addedSecretMessageIds, updatedTypingActivities: updatedTypingActivities, updatedWebpages: updatedWebpages, updatedCalls: updatedCalls, updatedPeersNearby: updatedPeersNearby, isContactUpdates: isContactUpdates, delayNotificatonsUntil: delayNotificatonsUntil)
}
diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManager.swift b/submodules/TelegramCore/TelegramCore/AccountStateManager.swift
index 51882c6f63..ea9df950c1 100644
--- a/submodules/TelegramCore/TelegramCore/AccountStateManager.swift
+++ b/submodules/TelegramCore/TelegramCore/AccountStateManager.swift
@@ -681,6 +681,15 @@ public final class AccountStateManager {
messageList.append((messages, .root, notify))
}
}
+ var wasScheduledMessages: [Message] = []
+ for id in events.wasScheduledMessageIds {
+ if let message = transaction.getMessage(id) {
+ wasScheduledMessages.append(message)
+ }
+ }
+ if !wasScheduledMessages.isEmpty {
+ messageList.append((wasScheduledMessages, .root, true))
+ }
return messageList
}
diff --git a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m
index 926270cc1d..31f9d8c847 100644
--- a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m
+++ b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m
@@ -1,6 +1,10 @@
#import "FormatPhoneNumber.h"
+#if TARGET_OS_IOS
#import
+#else
+#import
+#endif
static NBPhoneNumberUtil *getNBPhoneNumberUtil() {
static NBPhoneNumberUtil *value;
diff --git a/submodules/TelegramCore/TelegramCore/InteractivePhoneFormatter.swift b/submodules/TelegramCore/TelegramCore/InteractivePhoneFormatter.swift
index 24405329bb..28ea06c4c5 100644
--- a/submodules/TelegramCore/TelegramCore/InteractivePhoneFormatter.swift
+++ b/submodules/TelegramCore/TelegramCore/InteractivePhoneFormatter.swift
@@ -1,5 +1,10 @@
import Foundation
+
+#if os(macOS)
+import libphonenumbermac
+#else
import libphonenumber
+#endif
public final class InteractivePhoneFormatter {
private let formatter = NBAsYouTypeFormatter(regionCode: "US")!
diff --git a/submodules/TelegramCore/TelegramCore/MacInternalUpdater.swift b/submodules/TelegramCore/TelegramCore/MacInternalUpdater.swift
new file mode 100644
index 0000000000..d4c1493e7c
--- /dev/null
+++ b/submodules/TelegramCore/TelegramCore/MacInternalUpdater.swift
@@ -0,0 +1,166 @@
+import TelegramApiMac
+import SwiftSignalKitMac
+import PostboxMac
+
+public enum InternalUpdaterError {
+ case generic
+ case xmlLoad
+ case archiveLoad
+}
+
+public func requestUpdatesXml(account: Account, source: String) -> Signal {
+ return resolvePeerByName(account: account, name: source)
+ |> introduceError(InternalUpdaterError.self)
+ |> mapToSignal { peerId -> Signal in
+ return account.postbox.transaction { transaction in
+ return peerId != nil ? transaction.getPeer(peerId!) : nil
+ } |> introduceError(InternalUpdaterError.self)
+ }
+ |> mapToSignal { peer in
+ if let peer = peer, let inputPeer = apiInputPeer(peer) {
+ return account.network.request(Api.functions.messages.getHistory(peer: inputPeer, offsetId: 0, offsetDate: 0, addOffset: 0, limit: 1, maxId: Int32.max, minId: 0, hash: 0))
+ |> retryRequest
+ |> introduceError(InternalUpdaterError.self)
+ |> mapToSignal { result in
+ switch result {
+ case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
+ if let apiMessage = apiMessages.first, let storeMessage = StoreMessage(apiMessage: apiMessage) {
+
+ var peers: [PeerId: Peer] = [:]
+ for chat in apiChats {
+ if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) {
+ peers[groupOrChannel.id] = groupOrChannel
+ }
+ }
+ for user in apiUsers {
+ let telegramUser = TelegramUser(user: user)
+ peers[telegramUser.id] = telegramUser
+ }
+
+ if let message = locallyRenderedMessage(message: storeMessage, peers: peers), let media = message.media.first as? TelegramMediaFile {
+ return Signal { subscriber in
+ let fetchDispsable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: MediaResourceReference.media(media: AnyMediaReference.message(message: MessageReference(message), media: media), resource: media.resource)).start()
+
+ let dataDisposable = account.postbox.mediaBox.resourceData(media.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { data in
+ if data.complete {
+ if let data = try? Data(contentsOf: URL.init(fileURLWithPath: data.path)) {
+ subscriber.putNext(data)
+ subscriber.putCompletion()
+ } else {
+ subscriber.putError(.xmlLoad)
+ }
+ }
+ })
+ return ActionDisposable {
+ fetchDispsable.dispose()
+ dataDisposable.dispose()
+ }
+ }
+ }
+ }
+ default:
+ break
+ }
+ return .fail(.xmlLoad)
+ }
+ } else {
+ return .fail(.xmlLoad)
+ }
+ }
+}
+
+public enum AppUpdateDownloadResult {
+ case started(Int)
+ case progress(Int, Int)
+ case finished(String)
+}
+
+public func downloadAppUpdate(account: Account, source: String, fileName: String) -> Signal {
+ return resolvePeerByName(account: account, name: source)
+ |> introduceError(InternalUpdaterError.self)
+ |> mapToSignal { peerId -> Signal in
+ return account.postbox.transaction { transaction in
+ return peerId != nil ? transaction.getPeer(peerId!) : nil
+ } |> introduceError(InternalUpdaterError.self)
+ }
+ |> mapToSignal { peer in
+ if let peer = peer, let inputPeer = apiInputPeer(peer) {
+ return account.network.request(Api.functions.messages.getHistory(peer: inputPeer, offsetId: 0, offsetDate: 0, addOffset: 0, limit: 10, maxId: Int32.max, minId: 0, hash: 0))
+ |> retryRequest
+ |> introduceError(InternalUpdaterError.self)
+ |> mapToSignal { result in
+ switch result {
+ case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
+
+ var peers: [PeerId: Peer] = [:]
+ for chat in apiChats {
+ if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) {
+ peers[groupOrChannel.id] = groupOrChannel
+ }
+ }
+ for user in apiUsers {
+ let telegramUser = TelegramUser(user: user)
+ peers[telegramUser.id] = telegramUser
+ }
+
+ let messageAndFile:(Message, TelegramMediaFile)? = apiMessages.compactMap { value in
+ return StoreMessage(apiMessage: value)
+ }.compactMap { value in
+ return locallyRenderedMessage(message: value, peers: peers)
+ }.sorted(by: {
+ $0.id > $1.id
+ }).first(where: { value -> Bool in
+ if let file = value.media.first as? TelegramMediaFile, file.fileName == fileName {
+ return true
+ } else {
+ return false
+ }
+ }).map { ($0, $0.media.first as! TelegramMediaFile )}
+
+ if let (message, media) = messageAndFile {
+ return Signal { subscriber in
+
+ let reference = MediaResourceReference.media(media: .message(message: MessageReference(message), media: media), resource: media.resource)
+
+ let fetchDispsable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: reference).start()
+
+ let statusDisposable = account.postbox.mediaBox.resourceStatus(media.resource).start(next: { status in
+ switch status {
+ case let .Fetching(_, progress):
+ if let size = media.size {
+ if progress == 0 {
+ subscriber.putNext(.started(size))
+ } else {
+ subscriber.putNext(.progress(Int(progress * Float(size)), Int(size)))
+ }
+ }
+ default:
+ break
+ }
+ })
+
+ let dataDisposable = account.postbox.mediaBox.resourceData(media.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { data in
+ if data.complete {
+ subscriber.putNext(.finished(data.path))
+ subscriber.putCompletion()
+ }
+ })
+ return ActionDisposable {
+ fetchDispsable.dispose()
+ dataDisposable.dispose()
+ statusDisposable.dispose()
+ }
+ }
+ } else {
+ return .fail(.archiveLoad)
+ }
+ default:
+ break
+ }
+ return .fail(.archiveLoad)
+ }
+ } else {
+ return .fail(.archiveLoad)
+ }
+ }
+}
diff --git a/submodules/TelegramCore/TelegramCore/MessageReactions.swift b/submodules/TelegramCore/TelegramCore/MessageReactions.swift
index b73ffb3e73..bb804ff08c 100644
--- a/submodules/TelegramCore/TelegramCore/MessageReactions.swift
+++ b/submodules/TelegramCore/TelegramCore/MessageReactions.swift
@@ -34,7 +34,7 @@ final class UpdateMessageReactionsAction: PendingMessageActionData {
}
}
-public func updateMessageReactionsInteractively(postbox: Postbox, messageId: MessageId, reactions: [String]) -> Signal {
+public func updateMessageReactionsInteractively(postbox: Postbox, messageId: MessageId, reaction: String?) -> Signal {
return postbox.transaction { transaction -> Void in
transaction.setPendingMessageAction(type: .updateReaction, id: messageId, action: UpdateMessageReactionsAction())
transaction.updateMessage(messageId, update: { currentMessage in
@@ -49,7 +49,7 @@ public func updateMessageReactionsInteractively(postbox: Postbox, messageId: Mes
break loop
}
}
- attributes.append(PendingReactionsMessageAttribute(values: reactions))
+ attributes.append(PendingReactionsMessageAttribute(value: reaction))
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
})
}
@@ -61,25 +61,25 @@ private enum RequestUpdateMessageReactionError {
}
private func requestUpdateMessageReaction(postbox: Postbox, network: Network, stateManager: AccountStateManager, messageId: MessageId) -> Signal {
- return postbox.transaction { transaction -> (Peer, [String])? in
+ return postbox.transaction { transaction -> (Peer, String?)? in
guard let peer = transaction.getPeer(messageId.peerId) else {
return nil
}
guard let message = transaction.getMessage(messageId) else {
return nil
}
- var values: [String] = []
+ var value: String?
for attribute in message.attributes {
if let attribute = attribute as? PendingReactionsMessageAttribute {
- values = attribute.values
+ value = attribute.value
break
}
}
- return (peer, values)
+ return (peer, value)
}
|> introduceError(RequestUpdateMessageReactionError.self)
- |> mapToSignal { peerAndValues in
- guard let (peer, values) = peerAndValues else {
+ |> mapToSignal { peerAndValue in
+ guard let (peer, value) = peerAndValue else {
return .fail(.generic)
}
guard let inputPeer = apiInputPeer(peer) else {
@@ -88,7 +88,7 @@ private func requestUpdateMessageReaction(postbox: Postbox, network: Network, st
if messageId.namespace != Namespaces.Message.Cloud {
return .fail(.generic)
}
- return network.request(Api.functions.messages.sendReaction(peer: inputPeer, msgId: messageId.id, reaction: values))
+ return network.request(Api.functions.messages.sendReaction(flags: value == nil ? 0 : 1, peer: inputPeer, msgId: messageId.id, reaction: value))
|> mapError { _ -> RequestUpdateMessageReactionError in
return .generic
}
diff --git a/submodules/TelegramCore/TelegramCore/OutgoingMessageWithChatContextResult.swift b/submodules/TelegramCore/TelegramCore/OutgoingMessageWithChatContextResult.swift
index 480e69bec7..fcfcf3ccd5 100644
--- a/submodules/TelegramCore/TelegramCore/OutgoingMessageWithChatContextResult.swift
+++ b/submodules/TelegramCore/TelegramCore/OutgoingMessageWithChatContextResult.swift
@@ -13,12 +13,15 @@ private func aspectFitSize(_ size: CGSize, to: CGSize) -> CGSize {
return CGSize(width: floor(size.width * scale), height: floor(size.height * scale))
}
-public func outgoingMessageWithChatContextResult(to peerId: PeerId, results: ChatContextResultCollection, result: ChatContextResult, hideVia: Bool = false) -> EnqueueMessage? {
+public func outgoingMessageWithChatContextResult(to peerId: PeerId, results: ChatContextResultCollection, result: ChatContextResult, hideVia: Bool = false, scheduleTime: Int32? = nil) -> EnqueueMessage? {
var attributes: [MessageAttribute] = []
attributes.append(OutgoingChatContextResultMessageAttribute(queryId: result.queryId, id: result.id, hideVia: hideVia))
if !hideVia {
attributes.append(InlineBotMessageAttribute(peerId: results.botId, title: nil))
}
+ if let scheduleTime = scheduleTime {
+ attributes.append(OutgoingScheduleInfoMessageAttribute(scheduleTime: scheduleTime))
+ }
switch result.message {
case let .auto(caption, entities, replyMarkup):
if let entities = entities {
diff --git a/submodules/TelegramCore/TelegramCore/PhoneNumbers.swift b/submodules/TelegramCore/TelegramCore/PhoneNumbers.swift
index fd0afc5e50..47c68731b9 100644
--- a/submodules/TelegramCore/TelegramCore/PhoneNumbers.swift
+++ b/submodules/TelegramCore/TelegramCore/PhoneNumbers.swift
@@ -1,5 +1,9 @@
import Foundation
+#if os(macOS)
+import libphonenumbermac
+#else
import libphonenumber
+#endif
private let phoneNumberUtil = NBPhoneNumberUtil()
diff --git a/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift
index 83f97059b7..92cd9f78cd 100644
--- a/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift
+++ b/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift
@@ -90,7 +90,7 @@ public func mergedMessageReactions(attributes: [MessageAttribute]) -> ReactionsM
if let pending = pending {
var reactions = current?.reactions ?? []
- for value in pending.values {
+ if let value = pending.value {
var found = false
for i in 0 ..< reactions.count {
if reactions[i].value == value {
@@ -106,7 +106,7 @@ public func mergedMessageReactions(attributes: [MessageAttribute]) -> ReactionsM
}
}
for i in (0 ..< reactions.count).reversed() {
- if reactions[i].isSelected, !pending.values.contains(reactions[i].value) {
+ if reactions[i].isSelected, pending.value != reactions[i].value {
if reactions[i].count == 1 {
reactions.remove(at: i)
} else {
@@ -128,18 +128,22 @@ public func mergedMessageReactions(attributes: [MessageAttribute]) -> ReactionsM
}
public final class PendingReactionsMessageAttribute: MessageAttribute {
- public let values: [String]
+ public let value: String?
- init(values: [String]) {
- self.values = values
+ init(value: String?) {
+ self.value = value
}
required public init(decoder: PostboxDecoder) {
- self.values = decoder.decodeStringArrayForKey("v")
+ self.value = decoder.decodeOptionalStringForKey("v")
}
public func encode(_ encoder: PostboxEncoder) {
- encoder.encodeStringArray(self.values, forKey: "v")
+ if let value = self.value {
+ encoder.encodeString(value, forKey: "v")
+ } else {
+ encoder.encodeNil(forKey: "v")
+ }
}
}
diff --git a/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift
index 7ffbf0f5dc..20c3ca2bcb 100644
--- a/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift
+++ b/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift
@@ -78,7 +78,7 @@ public struct ReplyMarkupButton: PostboxCoding, Equatable {
public let titleWhenForwarded: String?
public let action: ReplyMarkupButtonAction
- init(title: String, titleWhenForwarded: String?, action: ReplyMarkupButtonAction) {
+ public init(title: String, titleWhenForwarded: String?, action: ReplyMarkupButtonAction) {
self.title = title
self.titleWhenForwarded = titleWhenForwarded
self.action = action
@@ -108,7 +108,7 @@ public struct ReplyMarkupButton: PostboxCoding, Equatable {
public struct ReplyMarkupRow: PostboxCoding, Equatable {
public let buttons: [ReplyMarkupButton]
- init(buttons: [ReplyMarkupButton]) {
+ public init(buttons: [ReplyMarkupButton]) {
self.buttons = buttons
}
diff --git a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift
index 748231955d..bf568a19d6 100644
--- a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift
+++ b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift
@@ -537,6 +537,8 @@ extension StoreMessage {
attributes.append(ContentRequiresValidationMessageAttribute())
}
+
+
if let reactions = reactions {
attributes.append(ReactionsMessageAttribute(apiReactions: reactions))
}
@@ -565,6 +567,10 @@ extension StoreMessage {
storeFlags.insert(.Incoming)
}
+ if (flags & (1 << 18)) != 0 {
+ storeFlags.insert(.WasScheduled)
+ }
+
if (flags & (1 << 4)) != 0 || (flags & (1 << 13)) != 0 {
var notificationFlags: NotificationInfoMessageAttributeFlags = []
if (flags & (1 << 4)) != 0 {
@@ -621,6 +627,7 @@ extension StoreMessage {
attributes.append(ContentRequiresValidationMessageAttribute())
}
+
var storeFlags = StoreMessageFlags()
if (flags & 2) == 0 {
let _ = storeFlags.insert(.Incoming)
@@ -646,6 +653,10 @@ extension StoreMessage {
storeFlags.insert(.CanBeGroupedIntoFeed)
+ if (flags & (1 << 18)) != 0 {
+ storeFlags.insert(.WasScheduled)
+ }
+
self.init(id: MessageId(peerId: peerId, namespace: namespace, id: id), globallyUniqueId: nil, groupingKey: nil, timestamp: date, flags: storeFlags, tags: tags, globalTags: globalTags, localTags: [], forwardInfo: nil, authorId: authorId, text: "", attributes: attributes, media: media)
}
}
diff --git a/submodules/TelegramCore/TelegramCore/WasScheduledMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/WasScheduledMessageAttribute.swift
new file mode 100644
index 0000000000..1bff00104e
--- /dev/null
+++ b/submodules/TelegramCore/TelegramCore/WasScheduledMessageAttribute.swift
@@ -0,0 +1,17 @@
+import Foundation
+#if os(macOS)
+import PostboxMac
+#else
+import Postbox
+#endif
+
+public class WasScheduledMessageAttribute: MessageAttribute {
+ public init() {
+ }
+
+ required public init(decoder: PostboxDecoder) {
+ }
+
+ public func encode(_ encoder: PostboxEncoder) {
+ }
+}
diff --git a/submodules/TelegramCore/TelegramCoreMac/TelegramCoreMac.h b/submodules/TelegramCore/TelegramCoreMac/TelegramCoreMac.h
index 2cef829046..1a7e5b057d 100644
--- a/submodules/TelegramCore/TelegramCoreMac/TelegramCoreMac.h
+++ b/submodules/TelegramCore/TelegramCoreMac/TelegramCoreMac.h
@@ -17,3 +17,7 @@ FOUNDATION_EXPORT const unsigned char TelegramCoreMacVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import
+#import
+#import
+#import
+#import
diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj
index e39dd695d5..93fa992764 100644
--- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj
+++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj
@@ -180,9 +180,13 @@
D01C7F051EFC1C49008305F1 /* DeviceContact.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C7F031EFC1C49008305F1 /* DeviceContact.swift */; };
D01D6BF91E42A713006151C6 /* SearchStickers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01D6BF81E42A713006151C6 /* SearchStickers.swift */; };
D01D6BFA1E42A718006151C6 /* SearchStickers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01D6BF81E42A713006151C6 /* SearchStickers.swift */; };
+ D0208AF42306E92B00A23503 /* libphonenumbermac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0208AF32306E92B00A23503 /* libphonenumbermac.framework */; };
D020F00722F19C8F00BE699A /* ManagedAnimatedEmojiUpdates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0925903622F0D02D003D6283 /* ManagedAnimatedEmojiUpdates.swift */; };
D021E0DF1DB539FC00C6B04F /* StickerPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0DE1DB539FC00C6B04F /* StickerPack.swift */; };
D021E0E21DB5401A00C6B04F /* StickerManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0E11DB5401A00C6B04F /* StickerManagement.swift */; };
+ D021E7E82306EC03002F8BD1 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FC986A22FD882200915E37 /* OutgoingScheduleInfoMessageAttribute.swift */; };
+ D021E7E92306EC03002F8BD1 /* ScheduledMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FC986C22FD99D400915E37 /* ScheduledMessages.swift */; };
+ D021E7EA2306EC03002F8BD1 /* ValidateAddressNameInteractive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E416B2304D5B30049C28B /* ValidateAddressNameInteractive.swift */; };
D0223A981EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A971EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift */; };
D0223A991EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A971EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift */; };
D0223A9B1EA5654D00211D94 /* TelegramMediaResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A9A1EA5654D00211D94 /* TelegramMediaResource.swift */; };
@@ -295,7 +299,7 @@
D03E416C2304D5B30049C28B /* ValidateAddressNameInteractive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E416B2304D5B30049C28B /* ValidateAddressNameInteractive.swift */; };
D03E452E2305C15A0049C28B /* FormatPhoneNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E452C2305C15A0049C28B /* FormatPhoneNumber.h */; settings = {ATTRIBUTES = (Public, ); }; };
D03E452F2305C15A0049C28B /* FormatPhoneNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E452D2305C15A0049C28B /* FormatPhoneNumber.m */; };
- D03E45302305C1630049C28B /* FormatPhoneNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E452C2305C15A0049C28B /* FormatPhoneNumber.h */; };
+ D03E45302305C1630049C28B /* FormatPhoneNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E452C2305C15A0049C28B /* FormatPhoneNumber.h */; settings = {ATTRIBUTES = (Public, ); }; };
D03E45D42305D44A0049C28B /* libphonenumber.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E45D32305D44A0049C28B /* libphonenumber.framework */; };
D03E45D82305D66D0049C28B /* Crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = D02609BB20C6EB97006C34AC /* Crypto.h */; settings = {ATTRIBUTES = (Public, ); }; };
D03E45D92305D66E0049C28B /* Crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = D02609BB20C6EB97006C34AC /* Crypto.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -343,6 +347,10 @@
D049EAF61E44DF3300A2CD3A /* AccountState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D049EAF41E44DF3300A2CD3A /* AccountState.swift */; };
D04CAA5A1E83310D0047E51F /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CAA591E83310D0047E51F /* MD5.swift */; };
D04CAA5B1E83310D0047E51F /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CAA591E83310D0047E51F /* MD5.swift */; };
+ D04D21372306EC9A00609388 /* MacInternalUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D21362306EC9A00609388 /* MacInternalUpdater.swift */; };
+ D04D21382306ECF600609388 /* FormatPhoneNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E452D2305C15A0049C28B /* FormatPhoneNumber.m */; };
+ D04D213C230AC35A00609388 /* WasScheduledMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D213B230AC35A00609388 /* WasScheduledMessageAttribute.swift */; };
+ D04D213D230AC35A00609388 /* WasScheduledMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D213B230AC35A00609388 /* WasScheduledMessageAttribute.swift */; };
D04D8FF4209A4B0700865719 /* NetworkSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D8FF3209A4B0700865719 /* NetworkSettings.swift */; };
D04D8FF5209A4B0700865719 /* NetworkSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D8FF3209A4B0700865719 /* NetworkSettings.swift */; };
D050F2101E48AB0600988324 /* InteractivePhoneFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D050F20F1E48AB0600988324 /* InteractivePhoneFormatter.swift */; };
@@ -868,6 +876,7 @@
D01C7ED51EF5E468008305F1 /* ProxySettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxySettings.swift; sourceTree = ""; };
D01C7F031EFC1C49008305F1 /* DeviceContact.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceContact.swift; sourceTree = ""; };
D01D6BF81E42A713006151C6 /* SearchStickers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchStickers.swift; sourceTree = "