From 57c628780e68459d9ae683365659c9f04683932c Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 9 Aug 2019 11:19:31 +0300 Subject: [PATCH 01/16] - initialized visibility changed [skip ci] --- .../TelegramCore/ReplyMarkupMessageAttribute.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 } From 6e448c207236eedc8d3a11f08d789071ec5a15e6 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Mon, 12 Aug 2019 17:29:43 +0300 Subject: [PATCH 02/16] no message --- .../TelegramCore_Xcode.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 65ed88a7fb..0155284224 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -208,6 +208,9 @@ D02D60AC206BA64100FEFE1E /* VerifySecureIdValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02D60AA206BA64100FEFE1E /* VerifySecureIdValue.swift */; }; D02DADC12139A1FC00116225 /* ContactSyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02DADC02139A1FC00116225 /* ContactSyncManager.swift */; }; D02DADC22139A1FC00116225 /* ContactSyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02DADC02139A1FC00116225 /* ContactSyncManager.swift */; }; + D02E88522301AAA7000259C5 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FC986A22FD882200915E37 /* OutgoingScheduleInfoMessageAttribute.swift */; }; + D02E88532301AAA7000259C5 /* RegisterNotificationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02B198F21FB1D520094A764 /* RegisterNotificationToken.swift */; }; + D02E88542301AAA7000259C5 /* ScheduledMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FC986C22FD99D400915E37 /* ScheduledMessages.swift */; }; D03121021DA57E93006A2A60 /* TelegramPeerNotificationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03121011DA57E93006A2A60 /* TelegramPeerNotificationSettings.swift */; }; D0329EA222FC5A7C00F9F071 /* MessageReactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0329EA122FC5A7C00F9F071 /* MessageReactions.swift */; }; D0329EA322FC5A7C00F9F071 /* MessageReactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0329EA122FC5A7C00F9F071 /* MessageReactions.swift */; }; @@ -2637,6 +2640,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D02E88522301AAA7000259C5 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */, + D02E88532301AAA7000259C5 /* RegisterNotificationToken.swift in Sources */, + D02E88542301AAA7000259C5 /* ScheduledMessages.swift in Sources */, D020F00722F19C8F00BE699A /* ManagedAnimatedEmojiUpdates.swift in Sources */, D05FDC3922CA45070060BFE3 /* AppUpdate.swift in Sources */, D014193922AE6B85008667CB /* ChannelOwnershipTransfer.swift in Sources */, From bdd94a86acaf737b43cea2a637ba430b5913bffd Mon Sep 17 00:00:00 2001 From: overtake <> Date: Wed, 14 Aug 2019 16:51:43 +0300 Subject: [PATCH 03/16] no message --- .../TelegramCore/OutgoingMessageWithChatContextResult.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 { From 84136efce3bca6c5901e1744d70394b3aa86b8c7 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 13:27:46 +0300 Subject: [PATCH 04/16] - mac internal updater [skip ci] --- .../TelegramCore/MacInternalUpdater.swift | 166 ++++++++++++++++++ .../project.pbxproj | 12 ++ 2 files changed, 178 insertions(+) create mode 100644 submodules/TelegramCore/TelegramCore/MacInternalUpdater.swift 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_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 02937c4bd6..6831a79195 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -114,6 +114,7 @@ D00BDA1A1EE593D600C64C5E /* TelegramChannelAdminRights.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00BDA181EE593D600C64C5E /* TelegramChannelAdminRights.swift */; }; D00BDA1C1EE5952A00C64C5E /* TelegramChannelBannedRights.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00BDA1B1EE5952A00C64C5E /* TelegramChannelBannedRights.swift */; }; D00BDA1D1EE5952A00C64C5E /* TelegramChannelBannedRights.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00BDA1B1EE5952A00C64C5E /* TelegramChannelBannedRights.swift */; }; + D00C73BB23055AA8004B1E2B /* MacInternalUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C73BA23055AA8004B1E2B /* MacInternalUpdater.swift */; }; D00C7CCC1E3620C30080C3D5 /* CachedChannelParticipants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */; }; D00C7CCD1E3620C30080C3D5 /* CachedChannelParticipants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */; }; D00C7CE01E3785710080C3D5 /* MarkMessageContentAsConsumedInteractively.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CDF1E3785700080C3D5 /* MarkMessageContentAsConsumedInteractively.swift */; }; @@ -885,6 +886,7 @@ D00580AD21E2A08900CB7CD3 /* AccountEnvironmentAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountEnvironmentAttribute.swift; sourceTree = ""; }; D00BDA181EE593D600C64C5E /* TelegramChannelAdminRights.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramChannelAdminRights.swift; sourceTree = ""; }; D00BDA1B1EE5952A00C64C5E /* TelegramChannelBannedRights.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramChannelBannedRights.swift; sourceTree = ""; }; + D00C73BA23055AA8004B1E2B /* MacInternalUpdater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacInternalUpdater.swift; sourceTree = ""; }; D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedChannelParticipants.swift; sourceTree = ""; }; D00C7CDF1E3785700080C3D5 /* MarkMessageContentAsConsumedInteractively.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkMessageContentAsConsumedInteractively.swift; sourceTree = ""; }; D00C7CEA1E37A8540080C3D5 /* SetSecretChatMessageAutoremoveTimeoutInteractively.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetSecretChatMessageAutoremoveTimeoutInteractively.swift; sourceTree = ""; }; @@ -1314,6 +1316,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + D00C73B923055A60004B1E2B /* Mac Internal Updates */ = { + isa = PBXGroup; + children = ( + D00C73BA23055AA8004B1E2B /* MacInternalUpdater.swift */, + ); + name = "Mac Internal Updates"; + sourceTree = ""; + }; D01B27A01E394D7B0022A4C0 /* Settings */ = { isa = PBXGroup; children = ( @@ -1879,6 +1889,7 @@ D09D8C031D4FAB1D0081DBEC /* TelegramCore */ = { isa = PBXGroup; children = ( + D00C73B923055A60004B1E2B /* Mac Internal Updates */, D03B0C791D62153400955575 /* third-party */, D03B0CB71D62232000955575 /* Utils */, D03B0CCF1D62242200955575 /* Objects */, @@ -3014,6 +3025,7 @@ D0FA8BA21E1F99E1001E855B /* SecretChatFileReference.swift in Sources */, D0B844301DAB91E0005F29E1 /* NBNumberFormat.m in Sources */, D001F3F71E128A1C007A8C60 /* ApplyUpdateMessage.swift in Sources */, + D00C73BB23055AA8004B1E2B /* MacInternalUpdater.swift in Sources */, D0B418971D7E0580004562A4 /* TelegramMediaImage.swift in Sources */, D01843A92190C28100278AFF /* ConfirmTwoStepRecoveryEmail.swift in Sources */, D041E3F91E535A88008C24B4 /* RemovePeerMember.swift in Sources */, From 02f87073971d5a9d49e46fb7311e90209e7e489b Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 16:48:30 +0300 Subject: [PATCH 05/16] - modules refactor [skip ci] --- .../Crc32_Xcode.xcodeproj/project.pbxproj | 666 ++++++++++++++++ .../TelegramCore/FormatPhoneNumber.m | 4 + .../InteractivePhoneFormatter.swift | 5 + .../TelegramCore/PhoneNumbers.swift | 4 + .../project.pbxproj | 4 + .../libphonenumber/Sources/NBPhoneNumber.h | 5 +- .../Sources/NBPhoneNumberUtil.h | 5 +- .../project.pbxproj | 722 +++++++++++++++++- .../libphonenumbermac/Info.plist | 24 + .../libphonenumbermac/libphonenumbermac.h | 12 + submodules/sqlcipher/Sources/sqlite3.c | 5 +- .../sqlcipher_Xcode.xcodeproj/project.pbxproj | 722 ++++++++++++++++++ 12 files changed, 2174 insertions(+), 4 deletions(-) create mode 100644 submodules/libphonenumber/libphonenumbermac/Info.plist create mode 100644 submodules/libphonenumber/libphonenumbermac/libphonenumbermac.h diff --git a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj index 4670f11c1a..a393207e5e 100644 --- a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj +++ b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj @@ -225,6 +225,660 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + D0208AAC2306E7EB00A23503 /* HockeyappAlphaMac */ = { + 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 = HockeyappAlphaMac; + }; + D0208AAD2306E7EB00A23503 /* HockeyappAlphaMac */ = { + 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 = HockeyappAlphaMac; + }; + D0208AAE2306E7EB00A23503 /* HockeyappAlphaMac */ = { + 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", + ); + 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 = HockeyappAlphaMac; + }; + 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", + ); + 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", + ); + 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", + ); + 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 = { @@ -887,7 +1541,11 @@ buildConfigurations = ( D03E456A2305CC310049C28B /* DebugAppStoreLLC */, D03E456F2305CC4E0049C28B /* DebugHockeyapp */, + D0208AAF2306E7F700A23503 /* DebugAppStore */, + D0208AAC2306E7EB00A23503 /* HockeyappAlphaMac */, D03E456B2305CC310049C28B /* ReleaseAppStoreLLC */, + D0208AB22306E7FD00A23503 /* ReleaseAppStore */, + D0208AB52306E80300A23503 /* ReleaseHockeyapp */, D03E45712305CC590049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -898,7 +1556,11 @@ buildConfigurations = ( D03E456D2305CC310049C28B /* DebugAppStoreLLC */, D03E45702305CC4E0049C28B /* DebugHockeyapp */, + D0208AB02306E7F700A23503 /* DebugAppStore */, + D0208AAD2306E7EB00A23503 /* HockeyappAlphaMac */, D03E456E2305CC310049C28B /* ReleaseAppStoreLLC */, + D0208AB32306E7FD00A23503 /* ReleaseAppStore */, + D0208AB62306E80300A23503 /* ReleaseHockeyapp */, D03E45722305CC590049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -909,7 +1571,11 @@ buildConfigurations = ( D03E46372306E0BB0049C28B /* DebugAppStoreLLC */, D03E46382306E0BB0049C28B /* DebugHockeyapp */, + D0208AB12306E7F700A23503 /* DebugAppStore */, + D0208AAE2306E7EB00A23503 /* HockeyappAlphaMac */, D03E46392306E0BB0049C28B /* ReleaseAppStoreLLC */, + D0208AB42306E7FD00A23503 /* ReleaseAppStore */, + D0208AB72306E80300A23503 /* ReleaseHockeyapp */, D03E463A2306E0BB0049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; diff --git a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m index 926270cc1d..58e9d3d7e0 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/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_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index e39dd695d5..f25af74257 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -180,6 +180,7 @@ 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 */; }; @@ -868,6 +869,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 = ""; }; + D0208AF32306E92B00A23503 /* libphonenumbermac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = libphonenumbermac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D021E0DE1DB539FC00C6B04F /* StickerPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerPack.swift; sourceTree = ""; }; D021E0E11DB5401A00C6B04F /* StickerManagement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerManagement.swift; sourceTree = ""; }; D0223A971EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaResourceNetworkStatsTag.swift; sourceTree = ""; }; @@ -1227,6 +1229,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D0208AF42306E92B00A23503 /* libphonenumbermac.framework in Frameworks */, D0CC4ADC22BA47280088F36D /* TelegramApiMac.framework in Frameworks */, D0B4187F1D7E054E004562A4 /* MtProtoKitMac.framework in Frameworks */, D0B418721D7E0409004562A4 /* PostboxMac.framework in Frameworks */, @@ -1653,6 +1656,7 @@ D06706631D512ADA00DED3E3 /* Frameworks */ = { isa = PBXGroup; children = ( + D0208AF32306E92B00A23503 /* libphonenumbermac.framework */, D03E45D32305D44A0049C28B /* libphonenumber.framework */, D03E45D02305D34C0049C28B /* libphonenumber_iOS.framework */, D0CC4ADB22BA47280088F36D /* TelegramApiMac.framework */, diff --git a/submodules/libphonenumber/Sources/NBPhoneNumber.h b/submodules/libphonenumber/Sources/NBPhoneNumber.h index 51b3a2ac46..abff40ed9b 100755 --- a/submodules/libphonenumber/Sources/NBPhoneNumber.h +++ b/submodules/libphonenumber/Sources/NBPhoneNumber.h @@ -5,8 +5,11 @@ // #import +#if TARGET_OS_IOS #import - +#else +#import +#endif @interface NBPhoneNumber : NSObject diff --git a/submodules/libphonenumber/Sources/NBPhoneNumberUtil.h b/submodules/libphonenumber/Sources/NBPhoneNumberUtil.h index 4d1ce4fea0..fea42a7444 100755 --- a/submodules/libphonenumber/Sources/NBPhoneNumberUtil.h +++ b/submodules/libphonenumber/Sources/NBPhoneNumberUtil.h @@ -7,8 +7,11 @@ // #import +#if TARGET_OS_IOS #import - +#else +#import +#endif @class NBPhoneMetaData, NBPhoneNumber; diff --git a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj index 032c923888..315dab9d6d 100644 --- a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj +++ b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,36 @@ objects = { /* Begin PBXBuildFile section */ + D0208ABB2306E84F00A23503 /* libphonenumbermac.h in Headers */ = {isa = PBXBuildFile; fileRef = D0208AB92306E84F00A23503 /* libphonenumbermac.h */; }; + D0208ABC2306E84F00A23503 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D0208ABA2306E84F00A23503 /* Info.plist */; }; + D0208ABF2306E85800A23503 /* NBMetadataCoreTest.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459B2305D1EF0049C28B /* NBMetadataCoreTest.h */; }; + D0208AC02306E85800A23503 /* NBPhoneMetaDataGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A22305D1EF0049C28B /* NBPhoneMetaDataGenerator.h */; }; + D0208AC12306E85800A23503 /* NBNumberFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45992305D1EF0049C28B /* NBNumberFormat.h */; }; + D0208AC32306E85800A23503 /* NBPhoneNumberUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A62305D1F00049C28B /* NBPhoneNumberUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC42306E85800A23503 /* libphonenumbermac.h in Headers */ = {isa = PBXBuildFile; fileRef = D0208AB92306E84F00A23503 /* libphonenumbermac.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC52306E85800A23503 /* NBMetadataCoreMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A02305D1EF0049C28B /* NBMetadataCoreMapper.h */; }; + D0208AC62306E85800A23503 /* NBAsYouTypeFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459D2305D1EF0049C28B /* NBAsYouTypeFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC72306E85800A23503 /* NBPhoneNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45AA2305D1F10049C28B /* NBPhoneNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC82306E85800A23503 /* NBPhoneNumberDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459C2305D1EF0049C28B /* NBPhoneNumberDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC92306E85800A23503 /* NBMetadataCore.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459E2305D1EF0049C28B /* NBMetadataCore.h */; }; + D0208ACA2306E85800A23503 /* NBPhoneMetaData.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45B02305D1F10049C28B /* NBPhoneMetaData.h */; }; + D0208ACB2306E85800A23503 /* NBPhoneNumberDesc.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A72305D1F00049C28B /* NBPhoneNumberDesc.h */; }; + D0208ACC2306E85800A23503 /* NBMetadataHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459A2305D1EF0049C28B /* NBMetadataHelper.h */; }; + D0208ACD2306E85800A23503 /* NBMetadataCoreTestMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A82305D1F00049C28B /* NBMetadataCoreTestMapper.h */; }; + D0208ACF2306E85800A23503 /* NBMetadataCoreMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A42305D1F00049C28B /* NBMetadataCoreMapper.m */; }; + D0208AD02306E85800A23503 /* NBMetadataCoreTestMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A32305D1F00049C28B /* NBMetadataCoreTestMapper.m */; }; + D0208AD12306E85800A23503 /* NBPhoneNumberDefines.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A12305D1EF0049C28B /* NBPhoneNumberDefines.m */; }; + D0208AD22306E85800A23503 /* NBNumberFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AE2305D1F10049C28B /* NBNumberFormat.m */; }; + D0208AD32306E85800A23503 /* NBAsYouTypeFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45B12305D1F10049C28B /* NBAsYouTypeFormatter.m */; }; + D0208AD42306E85800A23503 /* NBMetadataCore.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A92305D1F00049C28B /* NBMetadataCore.m */; }; + D0208AD52306E85800A23503 /* NBPhoneNumberDesc.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E459F2305D1EF0049C28B /* NBPhoneNumberDesc.m */; }; + D0208AD62306E85800A23503 /* NBPhoneNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AD2305D1F10049C28B /* NBPhoneNumber.m */; }; + D0208AD72306E85800A23503 /* NBPhoneMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AF2305D1F10049C28B /* NBPhoneMetaData.m */; }; + D0208AD82306E85800A23503 /* NBMetadataCoreTest.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45B22305D1F10049C28B /* NBMetadataCoreTest.m */; }; + D0208AD92306E85800A23503 /* NBPhoneMetaDataGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AB2305D1F10049C28B /* NBPhoneMetaDataGenerator.m */; }; + D0208ADA2306E85800A23503 /* NBMetadataHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AC2305D1F10049C28B /* NBMetadataHelper.m */; }; + D0208ADB2306E85800A23503 /* NBPhoneNumberUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A52305D1F00049C28B /* NBPhoneNumberUtil.m */; }; + D0208ADD2306E85800A23503 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E45CE2305D32D0049C28B /* Foundation.framework */; }; D03E458F2305CE840049C28B /* libphonenumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E458D2305CE840049C28B /* libphonenumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E45B32305D1F20049C28B /* NBNumberFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45992305D1EF0049C28B /* NBNumberFormat.h */; }; D03E45B42305D1F20049C28B /* NBMetadataHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459A2305D1EF0049C28B /* NBMetadataHelper.h */; }; @@ -38,6 +68,9 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + D0208AB92306E84F00A23503 /* libphonenumbermac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libphonenumbermac.h; sourceTree = ""; }; + D0208ABA2306E84F00A23503 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0208AE52306E85800A23503 /* libphonenumbermac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libphonenumbermac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E458A2305CE830049C28B /* libphonenumber.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libphonenumber.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E458D2305CE840049C28B /* libphonenumber.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libphonenumber.h; sourceTree = ""; }; D03E458E2305CE840049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -71,6 +104,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + D0208ADC2306E85800A23503 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0208ADD2306E85800A23503 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D03E45872305CE830049C28B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -82,10 +123,20 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + D0208AB82306E84F00A23503 /* libphonenumbermac */ = { + isa = PBXGroup; + children = ( + D0208AB92306E84F00A23503 /* libphonenumbermac.h */, + D0208ABA2306E84F00A23503 /* Info.plist */, + ); + path = libphonenumbermac; + sourceTree = ""; + }; D03E45802305CE830049C28B = { isa = PBXGroup; children = ( D03E458E2305CE840049C28B /* Info.plist */, + D0208AB82306E84F00A23503 /* libphonenumbermac */, D03E458C2305CE840049C28B /* Sources */, D03E458B2305CE830049C28B /* Products */, D03E45CD2305D32D0049C28B /* Frameworks */, @@ -96,6 +147,7 @@ isa = PBXGroup; children = ( D03E458A2305CE830049C28B /* libphonenumber.framework */, + D0208AE52306E85800A23503 /* libphonenumbermac.framework */, ); name = Products; sourceTree = ""; @@ -145,6 +197,27 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + D0208ABE2306E85800A23503 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0208AC42306E85800A23503 /* libphonenumbermac.h in Headers */, + D0208ABF2306E85800A23503 /* NBMetadataCoreTest.h in Headers */, + D0208AC02306E85800A23503 /* NBPhoneMetaDataGenerator.h in Headers */, + D0208AC12306E85800A23503 /* NBNumberFormat.h in Headers */, + D0208AC32306E85800A23503 /* NBPhoneNumberUtil.h in Headers */, + D0208AC52306E85800A23503 /* NBMetadataCoreMapper.h in Headers */, + D0208AC62306E85800A23503 /* NBAsYouTypeFormatter.h in Headers */, + D0208AC72306E85800A23503 /* NBPhoneNumber.h in Headers */, + D0208AC82306E85800A23503 /* NBPhoneNumberDefines.h in Headers */, + D0208AC92306E85800A23503 /* NBMetadataCore.h in Headers */, + D0208ACA2306E85800A23503 /* NBPhoneMetaData.h in Headers */, + D0208ACB2306E85800A23503 /* NBPhoneNumberDesc.h in Headers */, + D0208ACC2306E85800A23503 /* NBMetadataHelper.h in Headers */, + D0208ACD2306E85800A23503 /* NBMetadataCoreTestMapper.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D03E45852305CE830049C28B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -154,6 +227,7 @@ D03E45B32305D1F20049C28B /* NBNumberFormat.h in Headers */, D03E458F2305CE840049C28B /* libphonenumber.h in Headers */, D03E45C02305D1F20049C28B /* NBPhoneNumberUtil.h in Headers */, + D0208ABB2306E84F00A23503 /* libphonenumbermac.h in Headers */, D03E45BA2305D1F20049C28B /* NBMetadataCoreMapper.h in Headers */, D03E45B72305D1F20049C28B /* NBAsYouTypeFormatter.h in Headers */, D03E45C42305D1F20049C28B /* NBPhoneNumber.h in Headers */, @@ -169,6 +243,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + D0208ABD2306E85800A23503 /* libphonenumbermac */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0208AE02306E85800A23503 /* Build configuration list for PBXNativeTarget "libphonenumbermac" */; + buildPhases = ( + D0208ABE2306E85800A23503 /* Headers */, + D0208ACE2306E85800A23503 /* Sources */, + D0208ADC2306E85800A23503 /* Frameworks */, + D0208ADE2306E85800A23503 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = libphonenumbermac; + productName = "libphonenumber-iOS"; + productReference = D0208AE52306E85800A23503 /* libphonenumbermac.framework */; + productType = "com.apple.product-type.framework"; + }; D03E45892305CE830049C28B /* libphonenumber */ = { isa = PBXNativeTarget; buildConfigurationList = D03E45922305CE840049C28B /* Build configuration list for PBXNativeTarget "libphonenumber" */; @@ -215,21 +307,50 @@ projectRoot = ""; targets = ( D03E45892305CE830049C28B /* libphonenumber */, + D0208ABD2306E85800A23503 /* libphonenumbermac */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - D03E45882305CE830049C28B /* Resources */ = { + D0208ADE2306E85800A23503 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; + D03E45882305CE830049C28B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0208ABC2306E84F00A23503 /* Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + D0208ACE2306E85800A23503 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0208ACF2306E85800A23503 /* NBMetadataCoreMapper.m in Sources */, + D0208AD02306E85800A23503 /* NBMetadataCoreTestMapper.m in Sources */, + D0208AD12306E85800A23503 /* NBPhoneNumberDefines.m in Sources */, + D0208AD22306E85800A23503 /* NBNumberFormat.m in Sources */, + D0208AD32306E85800A23503 /* NBAsYouTypeFormatter.m in Sources */, + D0208AD42306E85800A23503 /* NBMetadataCore.m in Sources */, + D0208AD52306E85800A23503 /* NBPhoneNumberDesc.m in Sources */, + D0208AD62306E85800A23503 /* NBPhoneNumber.m in Sources */, + D0208AD72306E85800A23503 /* NBPhoneMetaData.m in Sources */, + D0208AD82306E85800A23503 /* NBMetadataCoreTest.m in Sources */, + D0208AD92306E85800A23503 /* NBPhoneMetaDataGenerator.m in Sources */, + D0208ADA2306E85800A23503 /* NBMetadataHelper.m in Sources */, + D0208ADB2306E85800A23503 /* NBPhoneNumberUtil.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D03E45862305CE830049C28B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -253,6 +374,578 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + D0208AE12306E85800A23503 /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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 = libphonenumbermac/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.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0208AE22306E85800A23503 /* DebugHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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 = libphonenumbermac/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.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0208AE32306E85800A23503 /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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 = libphonenumbermac/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.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D0208AE42306E85800A23503 /* ReleaseHockeyappInternal */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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 = libphonenumbermac/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.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0208AE72306E86800A23503 /* 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; + }; + D0208AE82306E86800A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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.libphonenumber; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0208AE92306E86800A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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 = libphonenumbermac/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.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0208AEA2306E87100A23503 /* HockeyappAlphaMac */ = { + 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 = HockeyappAlphaMac; + }; + D0208AEB2306E87100A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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.libphonenumber; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappAlphaMac; + }; + D0208AEC2306E87100A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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 = libphonenumbermac/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.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappAlphaMac; + }; + D0208AED2306E87700A23503 /* 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; + }; + D0208AEE2306E87700A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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.libphonenumber; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0208AEF2306E87700A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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 = libphonenumbermac/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.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0208AF02306E87E00A23503 /* 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; + }; + D0208AF12306E87E00A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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.libphonenumber; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; + D0208AF22306E87E00A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = 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 = libphonenumbermac/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.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; D03E45902305CE840049C28B /* DebugAppStoreLLC */ = { isa = XCBuildConfiguration; buildSettings = { @@ -306,6 +999,7 @@ 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; @@ -362,6 +1056,7 @@ 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; @@ -478,6 +1173,7 @@ 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; @@ -561,6 +1257,7 @@ 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; @@ -600,12 +1297,31 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + D0208AE02306E85800A23503 /* Build configuration list for PBXNativeTarget "libphonenumbermac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0208AE12306E85800A23503 /* DebugAppStoreLLC */, + D0208AE22306E85800A23503 /* DebugHockeyapp */, + D0208AEC2306E87100A23503 /* HockeyappAlphaMac */, + D0208AE92306E86800A23503 /* DebugAppStore */, + D0208AE32306E85800A23503 /* ReleaseAppStoreLLC */, + D0208AEF2306E87700A23503 /* ReleaseAppStore */, + D0208AF22306E87E00A23503 /* ReleaseHockeyapp */, + D0208AE42306E85800A23503 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; D03E45842305CE830049C28B /* Build configuration list for PBXProject "libphonenumber_Xcode" */ = { isa = XCConfigurationList; buildConfigurations = ( D03E45902305CE840049C28B /* DebugAppStoreLLC */, D03E45952305CE9A0049C28B /* DebugHockeyapp */, + D0208AEA2306E87100A23503 /* HockeyappAlphaMac */, + D0208AE72306E86800A23503 /* DebugAppStore */, D03E45912305CE840049C28B /* ReleaseAppStoreLLC */, + D0208AED2306E87700A23503 /* ReleaseAppStore */, + D0208AF02306E87E00A23503 /* ReleaseHockeyapp */, D03E45972305CEA30049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -616,7 +1332,11 @@ buildConfigurations = ( D03E45932305CE840049C28B /* DebugAppStoreLLC */, D03E45962305CE9A0049C28B /* DebugHockeyapp */, + D0208AEB2306E87100A23503 /* HockeyappAlphaMac */, + D0208AE82306E86800A23503 /* DebugAppStore */, D03E45942305CE840049C28B /* ReleaseAppStoreLLC */, + D0208AEE2306E87700A23503 /* ReleaseAppStore */, + D0208AF12306E87E00A23503 /* ReleaseHockeyapp */, D03E45982305CEA30049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; diff --git a/submodules/libphonenumber/libphonenumbermac/Info.plist b/submodules/libphonenumber/libphonenumbermac/Info.plist new file mode 100644 index 0000000000..5371a6e108 --- /dev/null +++ b/submodules/libphonenumber/libphonenumbermac/Info.plist @@ -0,0 +1,24 @@ + + + + + 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) + NSHumanReadableCopyright + Copyright © 2019 Telegram Messenger LLP. All rights reserved. + + diff --git a/submodules/libphonenumber/libphonenumbermac/libphonenumbermac.h b/submodules/libphonenumber/libphonenumbermac/libphonenumbermac.h new file mode 100644 index 0000000000..520bbb7cd2 --- /dev/null +++ b/submodules/libphonenumber/libphonenumbermac/libphonenumbermac.h @@ -0,0 +1,12 @@ +#import + +//! Project version number for libphonenumber_Mac. +FOUNDATION_EXPORT double libphonenumbermac_VersionNumber; + +//! Project version string for libphonenumber_Mac. +FOUNDATION_EXPORT const unsigned char libphonenumbermac_VersionString[]; + +#import +#import +#import +#import diff --git a/submodules/sqlcipher/Sources/sqlite3.c b/submodules/sqlcipher/Sources/sqlite3.c index 64b5ac6297..6d86b973f0 100644 --- a/submodules/sqlcipher/Sources/sqlite3.c +++ b/submodules/sqlcipher/Sources/sqlite3.c @@ -17,8 +17,11 @@ ** language. The code for the "sqlite3" command-line shell is also in a ** separate file. This file contains only code for the core SQLite library. */ +#if TARGET_OS_IOS #include - +#else +#include +#endif #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 #ifndef SQLITE_PRIVATE diff --git a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj index fca9d0b6aa..ae83a099c3 100644 --- a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj +++ b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj @@ -243,6 +243,716 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + D0208AA02306E7B400A23503 /* HockeyappAlphaMac */ = { + 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 = HockeyappAlphaMac; + }; + D0208AA12306E7B400A23503 /* HockeyappAlphaMac */ = { + 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; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlcipher; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappAlphaMac; + }; + D0208AA22306E7B400A23503 /* HockeyappAlphaMac */ = { + 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 = sqlciphermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlciphermac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappAlphaMac; + }; + D0208AA32306E7CA00A23503 /* 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; + }; + D0208AA42306E7CA00A23503 /* 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; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlcipher; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0208AA52306E7CA00A23503 /* 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 = sqlciphermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlciphermac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStore; + }; + D0208AA62306E7D400A23503 /* 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; + }; + D0208AA72306E7D400A23503 /* 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; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlcipher; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0208AA82306E7D400A23503 /* 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 = sqlciphermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlciphermac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStore; + }; + D0208AA92306E7D900A23503 /* 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; + }; + D0208AAA2306E7D900A23503 /* 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; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlcipher; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; + D0208AAB2306E7D900A23503 /* 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 = sqlciphermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlciphermac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyapp; + }; D03E45412305C6E40049C28B /* DebugAppStoreLLC */ = { isa = XCBuildConfiguration; buildSettings = { @@ -961,7 +1671,11 @@ buildConfigurations = ( D03E45412305C6E40049C28B /* DebugAppStoreLLC */, D03E45462305C7090049C28B /* DebugHockeyapp */, + D0208AA02306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA32306E7CA00A23503 /* DebugAppStore */, D03E45422305C6E40049C28B /* ReleaseAppStoreLLC */, + D0208AA62306E7D400A23503 /* ReleaseAppStore */, + D0208AA92306E7D900A23503 /* ReleaseHockeyapp */, D03E45482305C7130049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -972,7 +1686,11 @@ buildConfigurations = ( D03E45442305C6E40049C28B /* DebugAppStoreLLC */, D03E45472305C7090049C28B /* DebugHockeyapp */, + D0208AA12306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA42306E7CA00A23503 /* DebugAppStore */, D03E45452305C6E40049C28B /* ReleaseAppStoreLLC */, + D0208AA72306E7D400A23503 /* ReleaseAppStore */, + D0208AAA2306E7D900A23503 /* ReleaseHockeyapp */, D03E45492305C7130049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -983,7 +1701,11 @@ buildConfigurations = ( D03E461B2306DF740049C28B /* DebugAppStoreLLC */, D03E461C2306DF740049C28B /* DebugHockeyapp */, + D0208AA22306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA52306E7CA00A23503 /* DebugAppStore */, D03E461D2306DF740049C28B /* ReleaseAppStoreLLC */, + D0208AA82306E7D400A23503 /* ReleaseAppStore */, + D0208AAB2306E7D900A23503 /* ReleaseHockeyapp */, D03E461E2306DF740049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; From e6ec0f77e72cbeb8a159aeef4e6eb669340f2474 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 16:50:31 +0300 Subject: [PATCH 06/16] no message --- .../TelegramCore_Xcode.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index f25af74257..892f4f74b5 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -184,6 +184,9 @@ 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 */; }; @@ -2492,6 +2495,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D021E7E82306EC03002F8BD1 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */, + D021E7E92306EC03002F8BD1 /* ScheduledMessages.swift in Sources */, + D021E7EA2306EC03002F8BD1 /* ValidateAddressNameInteractive.swift in Sources */, D020F00722F19C8F00BE699A /* ManagedAnimatedEmojiUpdates.swift in Sources */, D05FDC3922CA45070060BFE3 /* AppUpdate.swift in Sources */, D014193922AE6B85008667CB /* ChannelOwnershipTransfer.swift in Sources */, From 2087a7034156f4feaf89f99ea750622fed76cd29 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 22:23:56 +0300 Subject: [PATCH 07/16] no message --- .../Crc32_Xcode.xcodeproj/project.pbxproj | 26 ++++++++++++------- .../TelegramCore/FormatPhoneNumber.m | 2 +- .../TelegramCoreMac/TelegramCoreMac.h | 4 +++ .../project.pbxproj | 16 +++++++++++- .../project.pbxproj | 18 ++++++------- .../sqlcipher_Xcode.xcodeproj/project.pbxproj | 18 ++++++------- 6 files changed, 55 insertions(+), 29 deletions(-) diff --git a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj index a393207e5e..ac6072ee0a 100644 --- a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj +++ b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj @@ -225,7 +225,7 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ - D0208AAC2306E7EB00A23503 /* HockeyappAlphaMac */ = { + D0208AAC2306E7EB00A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -286,9 +286,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AAD2306E7EB00A23503 /* HockeyappAlphaMac */ = { + D0208AAD2306E7EB00A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -312,9 +312,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AAE2306E7EB00A23503 /* HockeyappAlphaMac */ = { + D0208AAE2306E7EB00A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -381,6 +381,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; @@ -393,7 +394,7 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; D0208AAF2306E7F700A23503 /* DebugAppStore */ = { isa = XCBuildConfiguration; @@ -551,6 +552,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; @@ -709,6 +711,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 +869,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; @@ -1290,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; @@ -1371,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; @@ -1446,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; @@ -1520,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; @@ -1542,7 +1550,7 @@ D03E456A2305CC310049C28B /* DebugAppStoreLLC */, D03E456F2305CC4E0049C28B /* DebugHockeyapp */, D0208AAF2306E7F700A23503 /* DebugAppStore */, - D0208AAC2306E7EB00A23503 /* HockeyappAlphaMac */, + D0208AAC2306E7EB00A23503 /* HockeyappMacAlpha */, D03E456B2305CC310049C28B /* ReleaseAppStoreLLC */, D0208AB22306E7FD00A23503 /* ReleaseAppStore */, D0208AB52306E80300A23503 /* ReleaseHockeyapp */, @@ -1557,7 +1565,7 @@ D03E456D2305CC310049C28B /* DebugAppStoreLLC */, D03E45702305CC4E0049C28B /* DebugHockeyapp */, D0208AB02306E7F700A23503 /* DebugAppStore */, - D0208AAD2306E7EB00A23503 /* HockeyappAlphaMac */, + D0208AAD2306E7EB00A23503 /* HockeyappMacAlpha */, D03E456E2305CC310049C28B /* ReleaseAppStoreLLC */, D0208AB32306E7FD00A23503 /* ReleaseAppStore */, D0208AB62306E80300A23503 /* ReleaseHockeyapp */, @@ -1572,7 +1580,7 @@ D03E46372306E0BB0049C28B /* DebugAppStoreLLC */, D03E46382306E0BB0049C28B /* DebugHockeyapp */, D0208AB12306E7F700A23503 /* DebugAppStore */, - D0208AAE2306E7EB00A23503 /* HockeyappAlphaMac */, + D0208AAE2306E7EB00A23503 /* HockeyappMacAlpha */, D03E46392306E0BB0049C28B /* ReleaseAppStoreLLC */, D0208AB42306E7FD00A23503 /* ReleaseAppStore */, D0208AB72306E80300A23503 /* ReleaseHockeyapp */, diff --git a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m index 58e9d3d7e0..31f9d8c847 100644 --- a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m +++ b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m @@ -3,7 +3,7 @@ #if TARGET_OS_IOS #import #else -#import +#import #endif static NBPhoneNumberUtil *getNBPhoneNumberUtil() { 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 892f4f74b5..01709b9ca6 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -299,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, ); }; }; @@ -347,6 +347,8 @@ 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 */; }; 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 */; }; @@ -983,6 +985,7 @@ D049EAEA1E44B71B00A2CD3A /* RecentlySearchedPeerIds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentlySearchedPeerIds.swift; sourceTree = ""; }; D049EAF41E44DF3300A2CD3A /* AccountState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountState.swift; sourceTree = ""; }; D04CAA591E83310D0047E51F /* MD5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MD5.swift; sourceTree = ""; }; + D04D21362306EC9A00609388 /* MacInternalUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacInternalUpdater.swift; sourceTree = ""; }; D04D8FF3209A4B0700865719 /* NetworkSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSettings.swift; sourceTree = ""; }; D050F20F1E48AB0600988324 /* InteractivePhoneFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InteractivePhoneFormatter.swift; sourceTree = ""; }; D050F2501E4A59C200988324 /* JoinLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinLink.swift; sourceTree = ""; }; @@ -1636,6 +1639,14 @@ name = Accounts; sourceTree = ""; }; + D04D21352306EC8700609388 /* Mac Internal Updater */ = { + isa = PBXGroup; + children = ( + D04D21362306EC9A00609388 /* MacInternalUpdater.swift */, + ); + name = "Mac Internal Updater"; + sourceTree = ""; + }; D05A32DF1E6F096B002760B4 /* Settings */ = { isa = PBXGroup; children = ( @@ -1767,6 +1778,7 @@ D09D8C031D4FAB1D0081DBEC /* TelegramCore */ = { isa = PBXGroup; children = ( + D04D21352306EC8700609388 /* Mac Internal Updater */, D03B0CB71D62232000955575 /* Utils */, D03B0CCF1D62242200955575 /* Objects */, D03B0CFE1D62252200955575 /* State */, @@ -2495,6 +2507,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D04D21382306ECF600609388 /* FormatPhoneNumber.m in Sources */, D021E7E82306EC03002F8BD1 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */, D021E7E92306EC03002F8BD1 /* ScheduledMessages.swift in Sources */, D021E7EA2306EC03002F8BD1 /* ValidateAddressNameInteractive.swift in Sources */, @@ -2825,6 +2838,7 @@ D054648F20738626002ECC1E /* SecureIdDriversLicenseValue.swift in Sources */, D0529D2821A4141800D7C3C4 /* ManagedSynchronizeRecentlyUsedMediaOperations.swift in Sources */, D050F2641E4A5AEB00988324 /* ManagedSynchronizePinnedChatsOperations.swift in Sources */, + D04D21372306EC9A00609388 /* MacInternalUpdater.swift in Sources */, D0575AF21E9FFA5D006F2541 /* SynchronizeSavedGifsOperation.swift in Sources */, D0528E661E65C82400E2FEF5 /* UpdateContactName.swift in Sources */, D0EE7FC82098853100981319 /* SecureIdTemporaryRegistrationValue.swift in Sources */, diff --git a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj index 315dab9d6d..1a04b246b5 100644 --- a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj +++ b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj @@ -604,7 +604,7 @@ }; name = DebugAppStore; }; - D0208AEA2306E87100A23503 /* HockeyappAlphaMac */ = { + D0208AEA2306E87100A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -665,9 +665,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AEB2306E87100A23503 /* HockeyappAlphaMac */ = { + D0208AEB2306E87100A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; @@ -692,9 +692,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AEC2306E87100A23503 /* HockeyappAlphaMac */ = { + D0208AEC2306E87100A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; @@ -720,7 +720,7 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; D0208AED2306E87700A23503 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; @@ -1302,7 +1302,7 @@ buildConfigurations = ( D0208AE12306E85800A23503 /* DebugAppStoreLLC */, D0208AE22306E85800A23503 /* DebugHockeyapp */, - D0208AEC2306E87100A23503 /* HockeyappAlphaMac */, + D0208AEC2306E87100A23503 /* HockeyappMacAlpha */, D0208AE92306E86800A23503 /* DebugAppStore */, D0208AE32306E85800A23503 /* ReleaseAppStoreLLC */, D0208AEF2306E87700A23503 /* ReleaseAppStore */, @@ -1317,7 +1317,7 @@ buildConfigurations = ( D03E45902305CE840049C28B /* DebugAppStoreLLC */, D03E45952305CE9A0049C28B /* DebugHockeyapp */, - D0208AEA2306E87100A23503 /* HockeyappAlphaMac */, + D0208AEA2306E87100A23503 /* HockeyappMacAlpha */, D0208AE72306E86800A23503 /* DebugAppStore */, D03E45912305CE840049C28B /* ReleaseAppStoreLLC */, D0208AED2306E87700A23503 /* ReleaseAppStore */, @@ -1332,7 +1332,7 @@ buildConfigurations = ( D03E45932305CE840049C28B /* DebugAppStoreLLC */, D03E45962305CE9A0049C28B /* DebugHockeyapp */, - D0208AEB2306E87100A23503 /* HockeyappAlphaMac */, + D0208AEB2306E87100A23503 /* HockeyappMacAlpha */, D0208AE82306E86800A23503 /* DebugAppStore */, D03E45942305CE840049C28B /* ReleaseAppStoreLLC */, D0208AEE2306E87700A23503 /* ReleaseAppStore */, diff --git a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj index ae83a099c3..6ce127aa97 100644 --- a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj +++ b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj @@ -243,7 +243,7 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ - D0208AA02306E7B400A23503 /* HockeyappAlphaMac */ = { + D0208AA02306E7B400A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -304,9 +304,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AA12306E7B400A23503 /* HockeyappAlphaMac */ = { + D0208AA12306E7B400A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -337,9 +337,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AA22306E7B400A23503 /* HockeyappAlphaMac */ = { + D0208AA22306E7B400A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -425,7 +425,7 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; D0208AA32306E7CA00A23503 /* DebugAppStore */ = { isa = XCBuildConfiguration; @@ -1671,7 +1671,7 @@ buildConfigurations = ( D03E45412305C6E40049C28B /* DebugAppStoreLLC */, D03E45462305C7090049C28B /* DebugHockeyapp */, - D0208AA02306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA02306E7B400A23503 /* HockeyappMacAlpha */, D0208AA32306E7CA00A23503 /* DebugAppStore */, D03E45422305C6E40049C28B /* ReleaseAppStoreLLC */, D0208AA62306E7D400A23503 /* ReleaseAppStore */, @@ -1686,7 +1686,7 @@ buildConfigurations = ( D03E45442305C6E40049C28B /* DebugAppStoreLLC */, D03E45472305C7090049C28B /* DebugHockeyapp */, - D0208AA12306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA12306E7B400A23503 /* HockeyappMacAlpha */, D0208AA42306E7CA00A23503 /* DebugAppStore */, D03E45452305C6E40049C28B /* ReleaseAppStoreLLC */, D0208AA72306E7D400A23503 /* ReleaseAppStore */, @@ -1701,7 +1701,7 @@ buildConfigurations = ( D03E461B2306DF740049C28B /* DebugAppStoreLLC */, D03E461C2306DF740049C28B /* DebugHockeyapp */, - D0208AA22306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA22306E7B400A23503 /* HockeyappMacAlpha */, D0208AA52306E7CA00A23503 /* DebugAppStore */, D03E461D2306DF740049C28B /* ReleaseAppStoreLLC */, D0208AA82306E7D400A23503 /* ReleaseAppStore */, From 7b8a1de82bc204879fcb2d4e8157c6d88a45264e Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 22:36:50 +0300 Subject: [PATCH 08/16] - static library [skip ci] --- .../sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj index 6ce127aa97..9f8501a6de 100644 --- a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj +++ b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj @@ -406,6 +406,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; @@ -590,6 +591,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; @@ -762,6 +764,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; @@ -933,6 +936,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; @@ -1392,6 +1396,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; @@ -1480,6 +1485,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; @@ -1562,6 +1568,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; @@ -1643,6 +1650,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; From c3bd5685eb5f23e9c2ec0c6f4de5b7168eda44b8 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sat, 17 Aug 2019 20:31:41 +0300 Subject: [PATCH 09/16] Refactor SettingsUI and related modules --- .../contents.xcworkspacedata | 40 +- .../project.pbxproj | 4 + .../Sources/AccountContext.swift | 2 + .../Sources/ChatController.swift | 26 + .../Sources/PeerSelectionController.swift | 47 + .../project.pbxproj | 571 +++++++ submodules/AuthorizationUI/Info.plist | 22 + .../Sources}/AuthorizationLayout.swift | 48 +- .../Sources/AuthorizationOptionText.swift | 47 + .../AuthorizationUI/Sources/AuthorizationUI.h | 19 + .../Sources/Node/ChatListNode.swift | 24 - .../CheckNode_Xcode.xcodeproj/project.pbxproj | 8 + .../Sources}/ModernCheckNode.swift | 51 +- .../project.pbxproj | 559 +++++++ .../CounterContollerTitleView/Info.plist | 22 + .../Sources/CounterContollerTitleView.h | 19 + .../Sources}/CounterContollerTitleView.swift | 21 +- .../project.pbxproj | 563 +++++++ .../GridMessageSelectionNode/Info.plist | 22 + .../Sources/GridMessageSelectionNode.h | 19 + .../Sources}/GridMessageSelectionNode.swift | 16 +- .../HexColor_Xcode.xcodeproj/project.pbxproj | 547 +++++++ submodules/HexColor/Info.plist | 22 + submodules/HexColor/Sources/HexColor.h | 19 + .../Sources}/HexColor.swift | 13 +- submodules/InstantPageCache/Info.plist | 22 + .../project.pbxproj | 567 +++++++ .../Sources}/CachedInstantPages.swift | 17 +- .../Sources/InstantPageCache.h | 19 + .../project.pbxproj | 16 + .../FetchPhotoLibraryImageResource.swift | 4 +- submodules/PersistentStringHash/Info.plist | 22 + .../project.pbxproj | 541 +++++++ .../Sources/PersistentStringHash.h | 19 + .../Sources}/StringHash.swift | 2 +- submodules/QrCode/Info.plist | 22 + .../QrCode_Xcode.xcodeproj/project.pbxproj | 559 +++++++ .../Sources}/QRCode.swift | 2 +- submodules/QrCode/Sources/QrCode.h | 19 + submodules/SettingsUI/Info.plist | 22 + .../project.pbxproj | 1355 +++++++++++++++++ .../Sources}/AccountUtils.swift | 0 .../Sources}/BlurredImageNode.swift | 0 .../Sources}/CachedFaqInstantPage.swift | 2 + .../ChangePhoneNumberCodeController.swift | 3 +- .../ChangePhoneNumberController.swift | 0 .../ChangePhoneNumberControllerNode.swift | 0 .../ChangePhoneNumberIntroController.swift | 0 ...AutodownloadConnectionTypeController.swift | 0 .../AutodownloadDataUsagePickerItem.swift | 0 .../AutodownloadMediaCategoryController.swift | 0 .../AutodownloadSizeLimitItem.swift | 0 .../CalculatingCacheSizeItem.swift | 0 .../DataAndStorageSettingsController.swift | 0 .../NetworkUsageStatsController.swift | 0 .../ProxyListSettingsController.swift | 0 .../ProxyServerActionSheetController.swift | 2 +- .../ProxyServerSettingsController.swift | 1 + .../ProxySettingsActionItem.swift | 0 .../ProxySettingsServerItem.swift | 0 .../SaveIncomingMediaController.swift | 0 ...hareProxyServerActionSheetController.swift | 1 + .../StorageUsageController.swift | 2 +- .../VoiceCallDataSavingController.swift | 0 .../Sources}/DebugAccountsController.swift | 0 .../Sources}/DebugController.swift | 10 +- .../Sources}/EditSettingsController.swift | 0 .../SettingsUI/Sources/FrameworkBundle.swift | 13 + .../LocalizationListController.swift | 0 .../LocalizationListControllerNode.swift | 0 .../LocalizationListItem.swift | 0 .../LanguageSuggestionController.swift | 0 .../Sources}/LogoutOptionsController.swift | 5 +- .../NotificationExceptionControllerNode.swift | 2 +- ...ificationExceptionSettingsController.swift | 0 .../Exceptions}/NotificationExceptions.swift | 0 .../NotificationSearchItem.swift | 0 .../NotificationsAndSounds.swift | 0 .../Sources}/OpenSettings.swift | 0 .../BlockedPeersController.swift | 2 +- .../ConfirmPhoneNumberController.swift | 3 +- .../CreatePasswordController.swift | 0 .../DataPrivacySettingsController.swift | 0 .../ForwardPrivacyChatPreviewItem.swift | 11 +- .../PasscodeOptionsController.swift | 0 .../PrivacyAndSecurityController.swift | 0 .../PrivacyIntroController.swift | 0 .../PrivacyIntroControllerNode.swift | 1 + .../ItemListRecentSessionItem.swift | 0 .../ItemListWebsiteItem.swift | 0 .../RecentSessionsController.swift | 0 .../RecentSessionsEmptyStateItem.swift | 0 .../SelectivePrivacySettingsController.swift | 0 ...ectivePrivacySettingsPeersController.swift | 0 ...pVerificationPasswordEntryController.swift | 0 .../TwoStepVerificationResetController.swift | 0 .../TwoStepVerificationUnlockController.swift | 0 .../Sources/Search}/SettingsSearchItem.swift | 0 .../Search}/SettingsSearchRecentItem.swift | 0 .../Search}/SettingsSearchRecentQueries.swift | 4 +- .../Search}/SettingsSearchResultItem.swift | 0 .../Search}/SettingsSearchableItems.swift | 4 +- .../Sources}/SettingsController.swift | 6 +- submodules/SettingsUI/Sources/SettingsUI.h | 19 + .../ArchivedStickerPacksController.swift | 0 .../FeaturedStickerPacksController.swift | 0 .../InstalledStickerPacksController.swift | 0 .../TabBarAccountSwitchController.swift | 0 .../TabBarAccountSwitchControllerNode.swift | 0 .../TermsOfServiceController.swift | 0 .../TermsOfServiceControllerNode.swift | 0 .../Themes}/CustomWallpaperPicker.swift | 1 + .../Themes}/SettingsThemeWallpaperNode.swift | 1 + .../Themes}/ThemeAccentColorActionSheet.swift | 0 .../Themes}/ThemeAccentColorController.swift | 0 .../ThemeAccentColorControllerNode.swift | 23 +- .../ThemeAutoNightSettingsController.swift | 0 ...emeAutoNightTimeSelectionActionSheet.swift | 0 .../Themes}/ThemeColorsGridController.swift | 0 .../ThemeColorsGridControllerItem.swift | 1 + .../ThemeColorsGridControllerNode.swift | 0 .../Sources/Themes}/ThemeGridController.swift | 1 + .../Themes}/ThemeGridControllerItem.swift | 1 + .../Themes}/ThemeGridControllerNode.swift | 0 .../Themes}/ThemeGridSearchColorsItem.swift | 0 .../Themes}/ThemeGridSearchContentNode.swift | 0 .../Sources/Themes}/ThemeGridSearchItem.swift | 0 .../Themes}/ThemeGridSelectionPanelNode.swift | 0 .../Themes}/ThemePreviewController.swift | 13 +- .../Themes}/ThemePreviewControllerNode.swift | 15 +- .../ThemeSettingsAccentColorItem.swift | 0 .../Themes}/ThemeSettingsAppIconItem.swift | 0 .../Themes}/ThemeSettingsBrightnessItem.swift | 0 .../ThemeSettingsChatPreviewItem.swift | 16 +- .../Themes}/ThemeSettingsController.swift | 0 .../Themes}/ThemeSettingsFontSizeItem.swift | 0 .../Themes}/ThemeSettingsThemeItem.swift | 0 .../Themes}/WallpaperColorPanelNode.swift | 1 + .../Themes}/WallpaperColorPickerNode.swift | 0 .../Sources/Themes}/WallpaperCropNode.swift | 0 .../Themes}/WallpaperGalleryController.swift | 36 +- .../WallpaperGalleryDecorationNode.swift | 1 + .../Themes}/WallpaperGalleryItem.swift | 1 + .../Themes}/WallpaperGalleryToolbarNode.swift | 0 .../Themes}/WallpaperPatternPanelNode.swift | 0 .../WallpaperSearchRecentQueries.swift | 4 +- .../Sources}/UsernameSetupController.swift | 0 .../Watch}/WatchSettingsController.swift | 0 .../TelegramUI/TelegramUI/AppDelegate.swift | 1 + .../TelegramUI/ApplicationContext.swift | 1 + ...ceAwaitingAccountResetControllerNode.swift | 1 + ...ationSequenceCodeEntryControllerNode.swift | 45 +- .../AuthorizationSequenceController.swift | 1 + ...nSequencePasswordEntryControllerNode.swift | 1 + ...quencePasswordRecoveryControllerNode.swift | 1 + ...rizationSequencePhoneEntryController.swift | 1 + ...tionSequencePhoneEntryControllerNode.swift | 1 + .../TelegramUI/ChatController.swift | 5 +- .../TelegramUI/ChatMediaInputNode.swift | 1 + .../ChatMessageBubbleItemNode.swift | 9 +- .../ChatMessageInteractiveMediaNode.swift | 1 + .../TelegramUI/ChatMessageItem.swift | 1 + .../ChatMessageMediaBubbleContentNode.swift | 1 + .../ChatMessageWebpageBubbleContentNode.swift | 1 + .../TelegramUI/CheckDiskSpace.swift | 1 + .../ContactMultiselectionController.swift | 1 + .../TelegramUI/DeclareEncodables.swift | 2 + .../FetchCachedRepresentations.swift | 1 + .../TelegramUI/FileMediaResourceStatus.swift | 15 - .../TelegramUI/GridMessageItem.swift | 1 + .../ListMessageSnippetItemNode.swift | 1 + .../TelegramUI/NavigateToChatController.swift | 1 + .../TelegramUI/OpenChatMessage.swift | 1 + .../TelegramUI/OpenResolvedUrl.swift | 5 +- .../TelegramUI/TelegramUI/OpenUrl.swift | 1 + .../PeerMediaCollectionController.swift | 2 +- .../TelegramUI/PeerSelectionController.swift | 20 +- .../TelegramUI/ShareExtensionContext.swift | 1 + .../TelegramUI/SharedAccountContext.swift | 12 + .../TelegramUI/TelegramRootController.swift | 3 +- .../project.pbxproj | 616 +------- submodules/UrlHandling/Info.plist | 22 + submodules/UrlHandling/Sources/UrlHandling.h | 19 + .../Sources}/UrlHandling.swift | 16 +- .../project.pbxproj | 575 +++++++ submodules/WallpaperResources/Info.plist | 22 + .../Sources/FrameworkBundle.swift | 13 + .../Sources/WallpaperResources.h | 19 + .../Sources}/WallpaperResources.swift | 16 +- .../project.pbxproj | 587 +++++++ 190 files changed, 7362 insertions(+), 848 deletions(-) create mode 100644 submodules/AccountContext/Sources/PeerSelectionController.swift create mode 100644 submodules/AuthorizationUI/AuthorizationUI_Xcode.xcodeproj/project.pbxproj create mode 100644 submodules/AuthorizationUI/Info.plist rename submodules/{TelegramUI/TelegramUI => AuthorizationUI/Sources}/AuthorizationLayout.swift (80%) create mode 100644 submodules/AuthorizationUI/Sources/AuthorizationOptionText.swift create mode 100644 submodules/AuthorizationUI/Sources/AuthorizationUI.h rename submodules/{TelegramUI/TelegramUI => CheckNode/Sources}/ModernCheckNode.swift (78%) create mode 100644 submodules/CounterContollerTitleView/CounterContollerTitleView_Xcode.xcodeproj/project.pbxproj create mode 100644 submodules/CounterContollerTitleView/Info.plist create mode 100644 submodules/CounterContollerTitleView/Sources/CounterContollerTitleView.h rename submodules/{TelegramUI/TelegramUI => CounterContollerTitleView/Sources}/CounterContollerTitleView.swift (83%) create mode 100644 submodules/GridMessageSelectionNode/GridMessageSelectionNode_Xcode.xcodeproj/project.pbxproj create mode 100644 submodules/GridMessageSelectionNode/Info.plist create mode 100644 submodules/GridMessageSelectionNode/Sources/GridMessageSelectionNode.h rename submodules/{TelegramUI/TelegramUI => GridMessageSelectionNode/Sources}/GridMessageSelectionNode.swift (81%) create mode 100644 submodules/HexColor/HexColor_Xcode.xcodeproj/project.pbxproj create mode 100644 submodules/HexColor/Info.plist create mode 100644 submodules/HexColor/Sources/HexColor.h rename submodules/{TelegramUI/TelegramUI => HexColor/Sources}/HexColor.swift (58%) create mode 100644 submodules/InstantPageCache/Info.plist create mode 100644 submodules/InstantPageCache/InstantPageCache_Xcode.xcodeproj/project.pbxproj rename submodules/{TelegramUI/TelegramUI => InstantPageCache/Sources}/CachedInstantPages.swift (75%) create mode 100644 submodules/InstantPageCache/Sources/InstantPageCache.h rename submodules/{TelegramUI/TelegramUI => LocalMediaResources/Sources}/FetchPhotoLibraryImageResource.swift (96%) create mode 100644 submodules/PersistentStringHash/Info.plist create mode 100644 submodules/PersistentStringHash/PersistentStringHash_Xcode.xcodeproj/project.pbxproj create mode 100644 submodules/PersistentStringHash/Sources/PersistentStringHash.h rename submodules/{TelegramUI/TelegramUI => PersistentStringHash/Sources}/StringHash.swift (90%) create mode 100644 submodules/QrCode/Info.plist create mode 100644 submodules/QrCode/QrCode_Xcode.xcodeproj/project.pbxproj rename submodules/{TelegramUI/TelegramUI => QrCode/Sources}/QRCode.swift (96%) create mode 100644 submodules/QrCode/Sources/QrCode.h create mode 100644 submodules/SettingsUI/Info.plist create mode 100644 submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/AccountUtils.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/BlurredImageNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/CachedFaqInstantPage.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/ChangePhoneNumberCodeController.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/ChangePhoneNumberController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/ChangePhoneNumberControllerNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/ChangePhoneNumberIntroController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/AutodownloadConnectionTypeController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/AutodownloadDataUsagePickerItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/AutodownloadMediaCategoryController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/AutodownloadSizeLimitItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/CalculatingCacheSizeItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/DataAndStorageSettingsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/NetworkUsageStatsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/ProxyListSettingsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/ProxyServerActionSheetController.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/ProxyServerSettingsController.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/ProxySettingsActionItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/ProxySettingsServerItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/SaveIncomingMediaController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/ShareProxyServerActionSheetController.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/StorageUsageController.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Data and Storage}/VoiceCallDataSavingController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/DebugAccountsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/DebugController.swift (97%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/EditSettingsController.swift (100%) create mode 100644 submodules/SettingsUI/Sources/FrameworkBundle.swift rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Language Selection}/LocalizationListController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Language Selection}/LocalizationListControllerNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Language Selection}/LocalizationListItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Language Suggestion}/LanguageSuggestionController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/LogoutOptionsController.swift (97%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Notifications/Exceptions}/NotificationExceptionControllerNode.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Notifications/Exceptions}/NotificationExceptionSettingsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Notifications/Exceptions}/NotificationExceptions.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Notifications}/NotificationSearchItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Notifications}/NotificationsAndSounds.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/OpenSettings.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/BlockedPeersController.swift (98%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/ConfirmPhoneNumberController.swift (98%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/CreatePasswordController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/DataPrivacySettingsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/ForwardPrivacyChatPreviewItem.swift (91%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/PasscodeOptionsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/PrivacyAndSecurityController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/PrivacyIntroController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/PrivacyIntroControllerNode.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security/Recent Sessions}/ItemListRecentSessionItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security/Recent Sessions}/ItemListWebsiteItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security/Recent Sessions}/RecentSessionsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security/Recent Sessions}/RecentSessionsEmptyStateItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/SelectivePrivacySettingsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/SelectivePrivacySettingsPeersController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/TwoStepVerificationPasswordEntryController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/TwoStepVerificationResetController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Privacy and Security}/TwoStepVerificationUnlockController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Search}/SettingsSearchItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Search}/SettingsSearchRecentItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Search}/SettingsSearchRecentQueries.swift (96%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Search}/SettingsSearchResultItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Search}/SettingsSearchableItems.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/SettingsController.swift (99%) create mode 100644 submodules/SettingsUI/Sources/SettingsUI.h rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Stickers}/ArchivedStickerPacksController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Stickers}/FeaturedStickerPacksController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Stickers}/InstalledStickerPacksController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/TabBarAccountSwitchController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/TabBarAccountSwitchControllerNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Terms of Service}/TermsOfServiceController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Terms of Service}/TermsOfServiceControllerNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/CustomWallpaperPicker.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/SettingsThemeWallpaperNode.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeAccentColorActionSheet.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeAccentColorController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeAccentColorControllerNode.swift (81%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeAutoNightSettingsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeAutoNightTimeSelectionActionSheet.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeColorsGridController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeColorsGridControllerItem.swift (98%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeColorsGridControllerNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeGridController.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeGridControllerItem.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeGridControllerNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeGridSearchColorsItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeGridSearchContentNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeGridSearchItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeGridSelectionPanelNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemePreviewController.swift (91%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemePreviewControllerNode.swift (79%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeSettingsAccentColorItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeSettingsAppIconItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeSettingsBrightnessItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeSettingsChatPreviewItem.swift (81%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeSettingsController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeSettingsFontSizeItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/ThemeSettingsThemeItem.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperColorPanelNode.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperColorPickerNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperCropNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperGalleryController.swift (93%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperGalleryDecorationNode.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperGalleryItem.swift (99%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperGalleryToolbarNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperPatternPanelNode.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Themes}/WallpaperSearchRecentQueries.swift (96%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources}/UsernameSetupController.swift (100%) rename submodules/{TelegramUI/TelegramUI => SettingsUI/Sources/Watch}/WatchSettingsController.swift (100%) create mode 100644 submodules/UrlHandling/Info.plist create mode 100644 submodules/UrlHandling/Sources/UrlHandling.h rename submodules/{TelegramUI/TelegramUI => UrlHandling/Sources}/UrlHandling.swift (97%) create mode 100644 submodules/UrlHandling/UrlHandling_Xcode.xcodeproj/project.pbxproj create mode 100644 submodules/WallpaperResources/Info.plist create mode 100644 submodules/WallpaperResources/Sources/FrameworkBundle.swift create mode 100644 submodules/WallpaperResources/Sources/WallpaperResources.h rename submodules/{TelegramUI/TelegramUI => WallpaperResources/Sources}/WallpaperResources.swift (96%) create mode 100644 submodules/WallpaperResources/WallpaperResources_Xcode.xcodeproj/project.pbxproj 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 52a97a46bd..b450f8a3bf 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/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/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/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/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/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/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/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..add060d92c --- /dev/null +++ b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,1355 @@ +// !$*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 */; }; + D03E470A23075FE40049C28B /* ThemeAccentColorActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46E723075FD50049C28B /* ThemeAccentColorActionSheet.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 = ""; }; + D03E46E723075FD50049C28B /* ThemeAccentColorActionSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeAccentColorActionSheet.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 */, + D03E46E723075FD50049C28B /* ThemeAccentColorActionSheet.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 */, + D03E470A23075FE40049C28B /* ThemeAccentColorActionSheet.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 125465f295..0a9c1e81c0 100644 --- a/submodules/TelegramUI/TelegramUI/DebugController.swift +++ b/submodules/SettingsUI/Sources/DebugController.swift @@ -152,7 +152,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() @@ -201,7 +201,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() @@ -246,7 +246,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() @@ -276,7 +276,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() @@ -500,7 +500,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/ThemeAccentColorActionSheet.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorActionSheet.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/ThemeAccentColorActionSheet.swift rename to submodules/SettingsUI/Sources/Themes/ThemeAccentColorActionSheet.swift 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 192cce6b3b..6a9bd7fb5d 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -233,7 +233,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() @@ -244,21 +244,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) + 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 68e8369cfd..23e6b75303 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, UIColor, CGFloat, UIImage)? private func textInputBackgroundImage(backgroundColor: UIColor, 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/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index 4f4f85a995..80e1b842af 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -22,6 +22,7 @@ import LegacyUI import PassportUI import WatchBridge import LegacyDataImport +import SettingsUI private let handleVoipNotifications = false diff --git a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift index d4cc28d80b..89aba444c0 100644 --- a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift @@ -18,6 +18,7 @@ import TelegramPermissionsUI import PasscodeUI import ImageBlur import WatchBridge +import SettingsUI func isAccessLocked(data: PostboxAccessChallengeData, at timestamp: Int32) -> Bool { if data.isLockable, let autolockDeadline = data.autolockDeadline, autolockDeadline <= timestamp { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetControllerNode.swift index edb4817fb7..d41d1388b4 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import SwiftSignalKit import TelegramPresentationData +import AuthorizationUI private func timerValueString(days: Int32, hours: Int32, minutes: Int32, color: UIColor, strings: PresentationStrings) -> NSAttributedString { var daysString = "" diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift index 1c400a069e..4bcfcf0b83 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift @@ -6,50 +6,7 @@ import TelegramCore import SwiftSignalKit import TelegramPresentationData import TextFormat - -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) - } -} - -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) - } - } -} - - +import AuthorizationUI final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextFieldDelegate { private let strings: PresentationStrings diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift index 3ec6dc4228..fceecad702 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift @@ -16,6 +16,7 @@ import TelegramPresentationData import TextFormat import AccountContext import CountrySelectionUI +import SettingsUI private enum InnerState: Equatable { case state(UnauthorizedAccountStateContents) diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift index a5ac857177..db8d6c3575 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramPresentationData +import AuthorizationUI final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UITextFieldDelegate { private let strings: PresentationStrings diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift index 672a1f7f02..6c1d2baef2 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramPresentationData +import AuthorizationUI final class AuthorizationSequencePasswordRecoveryControllerNode: ASDisplayNode, UITextFieldDelegate { private let strings: PresentationStrings diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift index 2b4db3f9c8..a7b68c24c6 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import ProgressNavigationButtonNode import AccountContext import CountrySelectionUI +import SettingsUI final class AuthorizationSequencePhoneEntryController: ViewController { private var controllerNode: AuthorizationSequencePhoneEntryControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift index b87aed2345..6ecb2c7cfd 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift @@ -6,6 +6,7 @@ import TelegramCore import TelegramPresentationData import PhoneInputNode import CountrySelectionUI +import AuthorizationUI private func emojiFlagForISOCountryCode(_ countryCode: NSString) -> String { if countryCode.length != 2 { diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 9ae957ac83..f665b50f30 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -42,6 +42,7 @@ import Emoji import PeerAvatarGalleryUI import PeerInfoUI import RaiseToListen +import UrlHandling public enum ChatControllerPeekActions { case standard @@ -5995,7 +5996,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } private func forwardMessages(messageIds: [MessageId], resetCurrent: Bool = false) { - let controller = PeerSelectionController(context: self.context, filter: [.onlyWriteable, .excludeDisabled, .includeSavedMessages]) + let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, filter: [.onlyWriteable, .excludeDisabled, .includeSavedMessages])) controller.peerSelected = { [weak self, weak controller] peerId in guard let strongSelf = self, let strongController = controller else { return @@ -6150,7 +6151,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G break case let .chat(textInputState, _): if let textInputState = textInputState { - let controller = PeerSelectionController(context: self.context) + let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context)) controller.peerSelected = { [weak self, weak controller] peerId in if let strongSelf = self, let strongController = controller { if case let .peer(currentPeerId) = strongSelf.chatLocation, peerId == currentPeerId { diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift index b30fe77c18..6f08bba0a8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift @@ -10,6 +10,7 @@ import MergeLists import AccountContext import StickerPackPreviewUI import PeerInfoUI +import SettingsUI private struct PeerSpecificPackData { let peer: Peer diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 56be379212..314bc7f4bc 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -17,6 +17,8 @@ import TextSelectionNode import PlatformRestrictionMatching import Emoji import ReactionSelectionNode +import PersistentStringHash +import GridMessageSelectionNode private func contentNodeMessagesAndClassesForItem(_ item: ChatMessageItem) -> [(Message, AnyClass)] { var result: [(Message, AnyClass)] = [] @@ -143,7 +145,7 @@ private enum ContentNodeOperation { case insert(index: Int, node: ChatMessageBubbleContentNode) } -class ChatMessageBubbleItemNode: ChatMessageItemView { +class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode { private let contextSourceNode: ContextContentContainingNode private let backgroundWallpaperNode: ChatMessageBubbleBackdrop private let backgroundNode: ChatMessageBackground @@ -157,7 +159,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { private var nameNode: TextNode? private var adminBadgeNode: TextNode? private var credibilityIconNode: ASImageNode? - var forwardInfoNode: ChatMessageForwardInfoNode? + private var forwardInfoNode: ChatMessageForwardInfoNode? + var forwardInfoReferenceNode: ASDisplayNode? { + return self.forwardInfoNode + } private var replyInfoNode: ChatMessageReplyInfoNode? private var contentNodes: [ChatMessageBubbleContentNode] = [] diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 1c2aa18e95..8dca768f0c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -18,6 +18,7 @@ import TelegramStringFormatting import GalleryUI import AnimationUI import LocalMediaResources +import WallpaperResources private struct FetchControls { let fetch: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift index 0af69211ca..acbd7c32b2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import TelegramUIPreferences import AccountContext import Emoji +import PersistentStringHash public enum ChatMessageItemContent: Sequence { case message(message: Message, read: Bool, selection: ChatHistoryMessageSelection, attributes: ChatMessageEntryAttributes) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift index 2443bbb718..5f1ee57306 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift @@ -7,6 +7,7 @@ import Postbox import TelegramCore import TelegramUIPreferences import AccountContext +import GridMessageSelectionNode class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { override var supportsMosaic: Bool { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift index a47131df82..c9f047d38c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift @@ -10,6 +10,7 @@ import TextFormat import AccountContext import WebsiteType import InstantPageUI +import UrlHandling enum InstantPageType { case generic diff --git a/submodules/TelegramUI/TelegramUI/CheckDiskSpace.swift b/submodules/TelegramUI/TelegramUI/CheckDiskSpace.swift index 616b14a728..0e1351bb98 100644 --- a/submodules/TelegramUI/TelegramUI/CheckDiskSpace.swift +++ b/submodules/TelegramUI/TelegramUI/CheckDiskSpace.swift @@ -3,6 +3,7 @@ import Display import TelegramCore import AccountContext import AlertUI +import SettingsUI func totalDiskSpace() -> Int64 { do { diff --git a/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift b/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift index f7206140dd..1090b75511 100644 --- a/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift +++ b/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift @@ -10,6 +10,7 @@ import ProgressNavigationButtonNode import AccountContext import AlertUI import ContactListUI +import CounterContollerTitleView class ContactMultiselectionControllerImpl: ViewController, ContactMultiselectionController { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift b/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift index 900f768a58..11cc745962 100644 --- a/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift +++ b/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift @@ -6,6 +6,8 @@ import InstantPageUI import AccountContext import LocalMediaResources import WebSearchUI +import InstantPageCache +import SettingsUI private var telegramUIDeclaredEncodables: Void = { declareEncodable(InAppNotificationSettings.self, f: { InAppNotificationSettings(decoder: $0) }) diff --git a/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift b/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift index 279a572d03..298f544eff 100644 --- a/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift +++ b/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift @@ -17,6 +17,7 @@ import MediaResources import PhotoResources import ImageBlur import AnimationUI +import WallpaperResources public func fetchCachedResourceRepresentation(account: Account, resource: MediaResource, representation: CachedMediaResourceRepresentation) -> Signal { if let representation = representation as? CachedStickerAJpegRepresentation { diff --git a/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift b/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift index 1bf2cf5aab..3267a245de 100644 --- a/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift +++ b/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift @@ -6,21 +6,6 @@ import SwiftSignalKit import UniversalMediaPlayer import AccountContext -enum FileMediaResourcePlaybackStatus: Equatable { - case playing - case paused -} - -struct FileMediaResourceStatus: Equatable { - let mediaStatus: FileMediaResourceMediaStatus - let fetchStatus: MediaResourceStatus -} - -enum FileMediaResourceMediaStatus: Equatable { - case fetchStatus(MediaResourceStatus) - case playbackStatus(FileMediaResourcePlaybackStatus) -} - private func internalMessageFileMediaPlaybackStatus(context: AccountContext, file: TelegramMediaFile, message: Message, isRecentActions: Bool) -> Signal { guard let playerType = peerMessageMediaPlayerType(message) else { return .single(nil) diff --git a/submodules/TelegramUI/TelegramUI/GridMessageItem.swift b/submodules/TelegramUI/TelegramUI/GridMessageItem.swift index b96d53a789..0f8326e261 100644 --- a/submodules/TelegramUI/TelegramUI/GridMessageItem.swift +++ b/submodules/TelegramUI/TelegramUI/GridMessageItem.swift @@ -10,6 +10,7 @@ import TelegramStringFormatting import AccountContext import RadialStatusNode import PhotoResources +import GridMessageSelectionNode private func mediaForMessage(_ message: Message) -> Media? { for media in message.media { diff --git a/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift b/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift index 1e0d5259ef..8c53706927 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift @@ -10,6 +10,7 @@ import ItemListUI import TextFormat import PhotoResources import WebsiteType +import UrlHandling private let titleFont = Font.medium(16.0) private let descriptionFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift index 48d8e757b3..65ccf135f4 100644 --- a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift +++ b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift @@ -8,6 +8,7 @@ import GalleryUI import InstantPageUI import ChatListUI import PeerAvatarGalleryUI +import SettingsUI public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParams) { var found = false diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index dfa8455669..c0461ff305 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -15,6 +15,7 @@ import LocationUI import StickerPackPreviewUI import PeerAvatarGalleryUI import PeerInfoUI +import SettingsUI private enum ChatMessageGalleryControllerData { case url(String) diff --git a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift index c8e6f00fd6..2a79a99b3c 100644 --- a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift @@ -13,6 +13,7 @@ import InstantPageUI import StickerPackPreviewUI import JoinLinkPreviewUI import LanguageLinkPreviewUI +import SettingsUI private func defaultNavigationForPeerId(_ peerId: PeerId?, navigation: ChatControllerInteractionNavigateToPeer) -> ChatControllerInteractionNavigateToPeer { if case .default = navigation { @@ -46,7 +47,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur case let .botStart(peerId, payload): openPeer(peerId, .withBotStartPayload(ChatControllerInitialBotStart(payload: payload, behavior: .interactive))) case let .groupBotStart(botPeerId, payload): - let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .onlyGroups, .onlyManageable], title: presentationData.strings.UserInfo_InviteBotToGroup) + let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .onlyGroups, .onlyManageable], title: presentationData.strings.UserInfo_InviteBotToGroup)) controller.peerSelected = { [weak controller] peerId in if payload.isEmpty { if peerId.namespace == Namespaces.Peer.CloudGroup { @@ -194,7 +195,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur } }) } else { - 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/OpenUrl.swift b/submodules/TelegramUI/TelegramUI/OpenUrl.swift index dff3178505..111903e658 100644 --- a/submodules/TelegramUI/TelegramUI/OpenUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenUrl.swift @@ -13,6 +13,7 @@ import TelegramPresentationData import AccountContext import UrlEscaping import PassportUI +import UrlHandling public struct ParsedSecureIdUrl { public let peerId: PeerId diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index f44edfbf6a..2b0e3a7908 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -656,7 +656,7 @@ public class PeerMediaCollectionController: TelegramBaseController { } let forwardMessageIds = Array(messageIds).sorted() - let controller = PeerSelectionController(context: strongSelf.context, filter: [.onlyWriteable, .excludeDisabled]) + let controller = strongSelf.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: strongSelf.context, filter: [.onlyWriteable, .excludeDisabled])) controller.peerSelected = { [weak controller] peerId in if let strongSelf = self, let _ = controller { let _ = (strongSelf.context.account.postbox.transaction({ transaction -> Void in diff --git a/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift b/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift index 75b41c4ef3..fc34c4ba87 100644 --- a/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift @@ -10,7 +10,7 @@ import AccountContext import SearchUI import ChatListUI -public final class PeerSelectionController: ViewController { +public final class PeerSelectionControllerImpl: ViewController, PeerSelectionController { private let context: AccountContext private var presentationData: PresentationData @@ -18,10 +18,10 @@ public final class PeerSelectionController: ViewController { private var customTitle: String? - var peerSelected: ((PeerId) -> Void)? + public var peerSelected: ((PeerId) -> Void)? private let filter: ChatListNodePeersFilter - var inProgress: Bool = false { + public var inProgress: Bool = false { didSet { if self.inProgress != oldValue { if self.isNodeLoaded { @@ -52,16 +52,16 @@ public final class PeerSelectionController: ViewController { private var searchContentNode: NavigationBarSearchContentNode? - public init(context: AccountContext, filter: ChatListNodePeersFilter = [.onlyWriteable], hasContactSelector: Bool = true, title: String? = nil) { - self.context = context - self.filter = filter - self.hasContactSelector = hasContactSelector - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + public init(_ params: PeerSelectionControllerParams) { + self.context = params.context + self.filter = params.filter + self.hasContactSelector = params.hasContactSelector + self.presentationData = self.context.sharedContext.currentPresentationData.with { $0 } super.init(navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData)) self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style - self.customTitle = title + self.customTitle = params.title self.title = self.customTitle ?? self.presentationData.strings.Conversation_ForwardTitle self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Cancel, style: .plain, target: self, action: #selector(self.cancelPressed)) @@ -75,7 +75,7 @@ public final class PeerSelectionController: ViewController { } } - self.presentationDataDisposable = (context.sharedContext.presentationData + self.presentationDataDisposable = (self.context.sharedContext.presentationData |> deliverOnMainQueue).start(next: { [weak self] presentationData in if let strongSelf = self { let previousTheme = strongSelf.presentationData.theme diff --git a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift index 648708c081..32aca3c406 100644 --- a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift +++ b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift @@ -10,6 +10,7 @@ import ShareController import LegacyUI import PeerInfoUI import ShareItems +import SettingsUI private let inForeground = ValuePromise(false, ignoreRepeated: true) diff --git a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift index 36f85e9a51..0f7f11eb34 100644 --- a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift +++ b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift @@ -12,6 +12,8 @@ import LegacyUI import ChatListUI import PeersNearbyUI import PeerInfoUI +import SettingsUI +import UrlHandling private enum CallStatusText: Equatable { case none @@ -1000,4 +1002,14 @@ public final class SharedAccountContextImpl: SharedAccountContext { public func makeChatListController(context: AccountContext, groupId: PeerGroupId, controlsHistoryPreload: Bool, hideNetworkActivityStatus: Bool, enableDebugActions: Bool) -> ChatListController { return ChatListControllerImpl(context: context, groupId: groupId, controlsHistoryPreload: controlsHistoryPreload, hideNetworkActivityStatus: hideNetworkActivityStatus, enableDebugActions: enableDebugActions) } + + public func makePeerSelectionController(_ params: PeerSelectionControllerParams) -> PeerSelectionController { + return PeerSelectionControllerImpl(params) + } + + public func makeChatMessagePreviewItem(context: AccountContext, message: Message, theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, dateTimeFormat: PresentationDateTimeFormat, nameOrder: PresentationPersonNameOrder, forcedResourceStatus: FileMediaResourceStatus?) -> ListViewItem { + return ChatMessageItem(presentationData: ChatPresentationData(theme: ChatPresentationThemeData(theme: theme, wallpaper: wallpaper), fontSize: fontSize, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameOrder, disableAnimations: false, largeEmoji: false, animatedEmojiScale: 1.0), context: context, chatLocation: .peer(message.id.peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, isScheduledMessages: false, contactsPeerIds: Set(), animatedEmojiStickers: [:], forcedResourceStatus: forcedResourceStatus), controllerInteraction: defaultChatControllerInteraction, content: .message(message: message, read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: true, additionalContent: nil) + } } + +private let defaultChatControllerInteraction = ChatControllerInteraction.default diff --git a/submodules/TelegramUI/TelegramUI/TelegramRootController.swift b/submodules/TelegramUI/TelegramUI/TelegramRootController.swift index 8570b08578..264e1570c3 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramRootController.swift +++ b/submodules/TelegramUI/TelegramUI/TelegramRootController.swift @@ -9,6 +9,7 @@ import AccountContext import ContactListUI import CallListUI import ChatListUI +import SettingsUI public final class TelegramRootController: NavigationController { private let context: AccountContext @@ -111,7 +112,7 @@ public final class TelegramRootController: NavigationController { sharedContext.switchingData = (nil, nil, nil) } - let accountSettingsController = restoreSettignsController ?? settingsController(context: self.context, accountManager: context.sharedContext.accountManager) + let accountSettingsController = restoreSettignsController ?? settingsController(context: self.context, accountManager: context.sharedContext.accountManager, enableDebugActions: !GlobalExperimentalSettings.isAppStoreBuild) controllers.append(accountSettingsController) tabBarController.setControllers(controllers, selectedIndex: restoreSettignsController != nil ? (controllers.count - 1) : (controllers.count - 2)) diff --git a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj index 2a6ac4b0a8..79fe602828 100644 --- a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj @@ -7,18 +7,10 @@ objects = { /* Begin PBXBuildFile section */ - 0900678D21ED5EA800530762 /* WallpaperColorPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0900678C21ED5EA800530762 /* WallpaperColorPanelNode.swift */; }; - 0900678F21ED8E0E00530762 /* HexColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0900678E21ED8E0E00530762 /* HexColor.swift */; }; - 0902838821931D960067EFBD /* LanguageSuggestionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0902838721931D960067EFBD /* LanguageSuggestionController.swift */; }; 090B48C82200BCA8005083FA /* WallpaperUploadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090B48C72200BCA8005083FA /* WallpaperUploadManager.swift */; }; 090E63EE2196FE3A00E3C035 /* OpenAddContact.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E63ED2196FE3A00E3C035 /* OpenAddContact.swift */; }; - 090E777922A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E777822A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift */; }; 090E778C22AA842300CD99F5 /* anim_success.json in Resources */ = {isa = PBXBuildFile; fileRef = 090E778B22AA842200CD99F5 /* anim_success.json */; }; 0910B0ED21FA178C00F8F87D /* WallpaperPreviewMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0910B0EC21FA178C00F8F87D /* WallpaperPreviewMedia.swift */; }; - 0910B0EF21FA532D00F8F87D /* WallpaperResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0910B0EE21FA532D00F8F87D /* WallpaperResources.swift */; }; - 0910B0F121FB3DE100F8F87D /* WallpaperPatternPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0910B0F021FB3DE100F8F87D /* WallpaperPatternPanelNode.swift */; }; - 091417F221EF4E5D00C8325A /* WallpaperGalleryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091417F121EF4E5D00C8325A /* WallpaperGalleryController.swift */; }; - 091417F421EF4F5F00C8325A /* WallpaperGalleryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091417F321EF4F5F00C8325A /* WallpaperGalleryItem.swift */; }; 091BEAB3214552D9003AEA30 /* Vision.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D02DADBE2138D76F00116225 /* Vision.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 0921F60E228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0921F60D228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift */; }; 092F368D2154AAEA001A9F49 /* SFCompactRounded-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 092F368C2154AAE9001A9F49 /* SFCompactRounded-Semibold.otf */; }; @@ -37,17 +29,11 @@ 094735162275D72100EA2312 /* anim_unmute.json in Resources */ = {isa = PBXBuildFile; fileRef = 0947350C2275D72100EA2312 /* anim_unmute.json */; }; 094735172275D72100EA2312 /* anim_pin.json in Resources */ = {isa = PBXBuildFile; fileRef = 0947350D2275D72100EA2312 /* anim_pin.json */; }; 094735192277483C00EA2312 /* anim_infotip.json in Resources */ = {isa = PBXBuildFile; fileRef = 094735182277483B00EA2312 /* anim_infotip.json */; }; - 0947FCAE224043450086741C /* SettingsSearchRecentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0947FCAD224043450086741C /* SettingsSearchRecentItem.swift */; }; - 0947FCB0224055990086741C /* StringHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0947FCAF224055990086741C /* StringHash.swift */; }; 09510B0F22F9347E0078CAB7 /* BundleResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09510B0E22F9347E0078CAB7 /* BundleResource.swift */; }; 09510B1322F96E5B0078CAB7 /* ChatScheduleTimeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09510B1222F96E5B0078CAB7 /* ChatScheduleTimeController.swift */; }; 09510B1522F96E6C0078CAB7 /* ChatScheduleTimeControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09510B1422F96E6C0078CAB7 /* ChatScheduleTimeControllerNode.swift */; }; - 0957DE2322DE28FB001B4D57 /* ThemePreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0957DE2222DE28FB001B4D57 /* ThemePreviewController.swift */; }; - 0957DE2522DE2909001B4D57 /* ThemePreviewControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0957DE2422DE2909001B4D57 /* ThemePreviewControllerNode.swift */; }; 0962E67921B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E67821B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift */; }; 09749BC521F0E024008FDDE9 /* StickersChatInputContextPanelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09749BC421F0E024008FDDE9 /* StickersChatInputContextPanelItem.swift */; }; - 09749BCD21F23139008FDDE9 /* WallpaperGalleryDecorationNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09749BCC21F23139008FDDE9 /* WallpaperGalleryDecorationNode.swift */; }; - 09749BCF21F236F2008FDDE9 /* ModernCheckNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09749BCE21F236F2008FDDE9 /* ModernCheckNode.swift */; }; 09874E4F21078FA100E190B8 /* Generic.html in Resources */ = {isa = PBXBuildFile; fileRef = 0979788321065F8C0077D77F /* Generic.html */; }; 09874E5021078FA100E190B8 /* GenericUserScript.js in Resources */ = {isa = PBXBuildFile; fileRef = 0979788821065F8C0077D77F /* GenericUserScript.js */; }; 09874E5121078FA100E190B8 /* Instagram.html in Resources */ = {isa = PBXBuildFile; fileRef = 0979788421065F8C0077D77F /* Instagram.html */; }; @@ -57,61 +43,23 @@ 09874E5521078FA100E190B8 /* VimeoUserScript.js in Resources */ = {isa = PBXBuildFile; fileRef = 0979788021065F8B0077D77F /* VimeoUserScript.js */; }; 09874E5621078FA100E190B8 /* Youtube.html in Resources */ = {isa = PBXBuildFile; fileRef = 0979788721065F8C0077D77F /* Youtube.html */; }; 09874E5721078FA100E190B8 /* YoutubeUserScript.js in Resources */ = {isa = PBXBuildFile; fileRef = 0979788121065F8B0077D77F /* YoutubeUserScript.js */; }; - 098CF79222B924E200AF6134 /* ThemeSettingsAccentColorItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 098CF79122B924E200AF6134 /* ThemeSettingsAccentColorItem.swift */; }; - 099529AA21CDB27900805E13 /* ShareProxyServerActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099529A921CDB27900805E13 /* ShareProxyServerActionSheetController.swift */; }; - 099529AC21CDBBB200805E13 /* QRCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099529AB21CDBBB200805E13 /* QRCode.swift */; }; 099529B021D2123E00805E13 /* ChatMessageUnsupportedBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099529AF21D2123E00805E13 /* ChatMessageUnsupportedBubbleContentNode.swift */; }; 099529B421D3E5D800805E13 /* CheckDiskSpace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099529B321D3E5D800805E13 /* CheckDiskSpace.swift */; }; 09A218D9229EE1B600DE6898 /* HorizontalStickerGridItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A218D7229EE1B500DE6898 /* HorizontalStickerGridItem.swift */; }; 09A218DA229EE1B600DE6898 /* HorizontalStickersChatContextPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A218D8229EE1B500DE6898 /* HorizontalStickersChatContextPanelNode.swift */; }; - 09A218F522A15F1400DE6898 /* ThemeSettingsAppIconItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A218F422A15F1400DE6898 /* ThemeSettingsAppIconItem.swift */; }; - 09B4819323028A4200D5B32B /* ThemeAccentColorController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4819223028A4200D5B32B /* ThemeAccentColorController.swift */; }; - 09B4819523028A8A00D5B32B /* ThemeAccentColorControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4819423028A8A00D5B32B /* ThemeAccentColorControllerNode.swift */; }; - 09B4EE4721A6D33F00847FA6 /* RecentSessionsEmptyStateItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4EE4621A6D33F00847FA6 /* RecentSessionsEmptyStateItem.swift */; }; - 09C500242142BA6400EF253E /* ItemListWebsiteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C500232142BA6400EF253E /* ItemListWebsiteItem.swift */; }; 09CE95002232729A00A7D2C3 /* StickerPaneSearchContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE94FF2232729A00A7D2C3 /* StickerPaneSearchContentNode.swift */; }; 09CE9502223272B700A7D2C3 /* GifPaneSearchContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE9501223272B700A7D2C3 /* GifPaneSearchContentNode.swift */; }; - 09CE95042236C6B300A7D2C3 /* CachedInstantPages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE95032236C6B300A7D2C3 /* CachedInstantPages.swift */; }; - 09CE95062236D47F00A7D2C3 /* SettingsSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE95052236D47F00A7D2C3 /* SettingsSearchItem.swift */; }; - 09CE95082237A53900A7D2C3 /* SettingsSearchableItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE95072237A53900A7D2C3 /* SettingsSearchableItems.swift */; }; - 09CE950A2237B93500A7D2C3 /* SettingsSearchResultItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE95092237B93500A7D2C3 /* SettingsSearchResultItem.swift */; }; - 09CE950E2237E45E00A7D2C3 /* CachedFaqInstantPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE950D2237E45E00A7D2C3 /* CachedFaqInstantPage.swift */; }; - 09CE95112237F3C100A7D2C3 /* SettingsSearchRecentQueries.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE95102237F3C100A7D2C3 /* SettingsSearchRecentQueries.swift */; }; - 09CE9513223825B700A7D2C3 /* CustomWallpaperPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE9512223825B700A7D2C3 /* CustomWallpaperPicker.swift */; }; 09D304152173C0E900C00567 /* WatchManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D304142173C0E900C00567 /* WatchManager.swift */; }; - 09D304182173C15700C00567 /* WatchSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D304172173C15700C00567 /* WatchSettingsController.swift */; }; 09D96899221DE92600B1458A /* ID3ArtworkReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D96898221DE92600B1458A /* ID3ArtworkReader.swift */; }; 09DD5D5021ECC3C400D7007A /* SuppressContactsWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DD5D4F21ECC3C400D7007A /* SuppressContactsWarning.swift */; }; - 09DD5D5221ED175300D7007A /* WallpaperColorPickerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DD5D5121ED175300D7007A /* WallpaperColorPickerNode.swift */; }; - 09DE2F272269D5730045E975 /* PrivacyIntroController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DE2F262269D5730045E975 /* PrivacyIntroController.swift */; }; - 09DE2F292269D5E30045E975 /* PrivacyIntroControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DE2F282269D5E30045E975 /* PrivacyIntroControllerNode.swift */; }; 09E2D9EF226F1AFA00EA0AA4 /* Emoji.mapping in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9ED226F1AF300EA0AA4 /* Emoji.mapping */; }; 09E2D9F1226F214000EA0AA4 /* EmojiResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E2D9F0226F214000EA0AA4 /* EmojiResources.swift */; }; 09E2DA132273367900EA0AA4 /* anim_archiveAvatar.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2DA122273367900EA0AA4 /* anim_archiveAvatar.json */; }; - 09E4A803223B833B0038140F /* ForwardPrivacyChatPreviewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E4A802223B833B0038140F /* ForwardPrivacyChatPreviewItem.swift */; }; - 09E4A805223D4A5A0038140F /* OpenSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E4A804223D4A5A0038140F /* OpenSettings.swift */; }; - 09E4A807223D4B860038140F /* AccountUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E4A806223D4B860038140F /* AccountUtils.swift */; }; 09EC0DED22CB583C00E7185B /* TextLinkHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EC0DEC22CB583C00E7185B /* TextLinkHandling.swift */; }; - 09EDAD26220D30980012A50B /* AutodownloadConnectionTypeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EDAD25220D30980012A50B /* AutodownloadConnectionTypeController.swift */; }; 09EDAD2A220DA6A40012A50B /* VolumeButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EDAD29220DA6A40012A50B /* VolumeButtons.swift */; }; - 09EDAD2C2211552F0012A50B /* AutodownloadMediaCategoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EDAD2B2211552F0012A50B /* AutodownloadMediaCategoryController.swift */; }; - 09EDAD2E221164440012A50B /* AutodownloadSizeLimitItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EDAD2D221164440012A50B /* AutodownloadSizeLimitItem.swift */; }; - 09EDAD30221164530012A50B /* AutodownloadDataUsagePickerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EDAD2F221164530012A50B /* AutodownloadDataUsagePickerItem.swift */; }; 09F2158D225CF5BC00AEDF6D /* Pasteboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F2158C225CF5BC00AEDF6D /* Pasteboard.swift */; }; - 09F664C021EAAFAF00AB7E26 /* ThemeColorsGridController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F664BF21EAAFAF00AB7E26 /* ThemeColorsGridController.swift */; }; - 09F664C221EAAFCB00AB7E26 /* ThemeColorsGridControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F664C121EAAFCB00AB7E26 /* ThemeColorsGridControllerNode.swift */; }; - 09F664C421EAB98300AB7E26 /* ThemeColorsGridControllerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F664C321EAB98300AB7E26 /* ThemeColorsGridControllerItem.swift */; }; - 09F664C621EB400A00AB7E26 /* ThemeGridSearchContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F664C521EB400A00AB7E26 /* ThemeGridSearchContentNode.swift */; }; - 09F664C821EB4A2600AB7E26 /* ThemeGridSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F664C721EB4A2600AB7E26 /* ThemeGridSearchItem.swift */; }; - 09F664CA21EB4F2700AB7E26 /* ThemeGridSearchColorsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F664C921EB4F2700AB7E26 /* ThemeGridSearchColorsItem.swift */; }; - 09F664CC21EB552C00AB7E26 /* WallpaperSearchRecentQueries.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F664CB21EB552C00AB7E26 /* WallpaperSearchRecentQueries.swift */; }; - 09F664D021EBCFB900AB7E26 /* WallpaperCropNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F664CF21EBCFB900AB7E26 /* WallpaperCropNode.swift */; }; - 09F85BA521E7821500D73170 /* ThemeGridSelectionPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F85BA421E7821500D73170 /* ThemeGridSelectionPanelNode.swift */; }; - 09F85BA721E7DA5F00D73170 /* BlurredImageNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F85BA621E7DA5F00D73170 /* BlurredImageNode.swift */; }; 09FFBCD1227B7F9900C33B4B /* anim_archiveswipe.json in Resources */ = {isa = PBXBuildFile; fileRef = 09FFBCCF227B7F9000C33B4B /* anim_archiveswipe.json */; }; 09FFBCD72281BB2D00C33B4B /* ChatTextLinkEditController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FFBCD62281BB2D00C33B4B /* ChatTextLinkEditController.swift */; }; - 9F06830921A404AB001D8EDB /* NotificationExceptionControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F06830821A404AB001D8EDB /* NotificationExceptionControllerNode.swift */; }; - 9F06830B21A404C4001D8EDB /* NotificationExceptionSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F06830A21A404C4001D8EDB /* NotificationExceptionSettingsController.swift */; }; D000CABC21F158AD0011B15D /* PrepareSecretThumbnailData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D000CABB21F158AD0011B15D /* PrepareSecretThumbnailData.swift */; }; D0068FA821760FA300D1B315 /* StoreDownloadedMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0068FA721760FA300D1B315 /* StoreDownloadedMedia.swift */; }; D007019C2029E8F2006B9E34 /* LegacyICloudFileController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D007019B2029E8F2006B9E34 /* LegacyICloudFileController.swift */; }; @@ -131,9 +79,6 @@ D017734C22049BF800DA06A7 /* UpgradedAccounts.swift in Sources */ = {isa = PBXBuildFile; fileRef = D017734B22049BF800DA06A7 /* UpgradedAccounts.swift */; }; D01776BE1F1E76920044446D /* PeerMediaCollectionSectionsNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01776BD1F1E76920044446D /* PeerMediaCollectionSectionsNode.swift */; }; D01848E821A03BDA00B6DEBD /* ChatSearchState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01848E721A03BDA00B6DEBD /* ChatSearchState.swift */; }; - D0185E882089ED5F005E1A6C /* ProxyListSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0185E872089ED5F005E1A6C /* ProxyListSettingsController.swift */; }; - D0185E8A208A01AF005E1A6C /* ProxySettingsActionItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0185E89208A01AF005E1A6C /* ProxySettingsActionItem.swift */; }; - D0185E8C208A025A005E1A6C /* ProxySettingsServerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0185E8B208A025A005E1A6C /* ProxySettingsServerItem.swift */; }; D018BE58218C7BD800C02DDC /* ChatMessageDeliveryFailedNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018BE57218C7BD800C02DDC /* ChatMessageDeliveryFailedNode.swift */; }; D0192D44210A5AA50005FA10 /* DeviceContactDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0192D43210A5AA50005FA10 /* DeviceContactDataManager.swift */; }; D01C06B51FBB7720001561AB /* ChatMediaInputSettingsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C06B41FBB7720001561AB /* ChatMediaInputSettingsItem.swift */; }; @@ -149,8 +94,6 @@ D02B198A21F1DA9E0094A764 /* SharedAccountContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02B198921F1DA9E0094A764 /* SharedAccountContext.swift */; }; D02B2B9820810DA00062476B /* StickerPaneSearchStickerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02B2B9720810DA00062476B /* StickerPaneSearchStickerItem.swift */; }; D02B676320800A00001A864A /* PaneSearchBarPlaceholderItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02B676220800A00001A864A /* PaneSearchBarPlaceholderItem.swift */; }; - D02C81712177729000CD1006 /* NotificationExceptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02C81702177729000CD1006 /* NotificationExceptions.swift */; }; - D02C81732177AC5900CD1006 /* NotificationSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02C81722177AC5900CD1006 /* NotificationSearchItem.swift */; }; D02D634A22B85B94006BE519 /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D02D634922B85B94006BE519 /* PushKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; D02F4AE91FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02F4AE81FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift */; }; D0380DAD204ED434000414AB /* LegacyLiveUploadInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0380DAC204ED434000414AB /* LegacyLiveUploadInterface.swift */; }; @@ -196,6 +139,16 @@ D03E44E22305BC900049C28B /* LegacyDataImport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E44E12305BC900049C28B /* LegacyDataImport.framework */; }; D03E45252305C07A0049C28B /* ShareItems.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E45242305C07A0049C28B /* ShareItems.framework */; }; D03E46102305FD360049C28B /* ReactionSelectionNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E460F2305FD360049C28B /* ReactionSelectionNode.framework */; }; + D03E47B62307636E0049C28B /* SettingsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47B52307636E0049C28B /* SettingsUI.framework */; }; + D03E47D7230767FF0049C28B /* UrlHandling.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47D6230767FF0049C28B /* UrlHandling.framework */; }; + D03E480E230769AF0049C28B /* HexColor.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E480D230769AF0049C28B /* HexColor.framework */; }; + D03E483823076AF30049C28B /* QrCode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E483723076AF30049C28B /* QrCode.framework */; }; + D03E487023076C500049C28B /* WallpaperResources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E486F23076C500049C28B /* WallpaperResources.framework */; }; + D03E48A4230774380049C28B /* AuthorizationUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48A3230774380049C28B /* AuthorizationUI.framework */; }; + D03E48E4230864AB0049C28B /* CounterContollerTitleView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E48E3230864AB0049C28B /* CounterContollerTitleView.framework */; }; + D03E4910230866280049C28B /* GridMessageSelectionNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E490F230866280049C28B /* GridMessageSelectionNode.framework */; }; + D03E493C2308679D0049C28B /* InstantPageCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E493B2308679D0049C28B /* InstantPageCache.framework */; }; + D03E495D230868DF0049C28B /* PersistentStringHash.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E495C230868DF0049C28B /* PersistentStringHash.framework */; }; D04203152037162700490EA5 /* MediaInputPaneTrendingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04203142037162700490EA5 /* MediaInputPaneTrendingItem.swift */; }; D04281F4200E5AB0009DDE36 /* ChatRecentActionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04281F3200E5AB0009DDE36 /* ChatRecentActionsController.swift */; }; D04281F6200E5AC2009DDE36 /* ChatRecentActionsControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04281F5200E5AC2009DDE36 /* ChatRecentActionsControllerNode.swift */; }; @@ -203,7 +156,6 @@ D04281FC200E61BC009DDE36 /* ChatRecentActionsInteraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04281FB200E61BC009DDE36 /* ChatRecentActionsInteraction.swift */; }; D04281FE200E639A009DDE36 /* ChatRecentActionsTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04281FD200E639A009DDE36 /* ChatRecentActionsTitleView.swift */; }; D0428200200E6A00009DDE36 /* ChatRecentActionsHistoryTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04281FF200E6A00009DDE36 /* ChatRecentActionsHistoryTransition.swift */; }; - D04554A421B42982007A6DD9 /* ConfirmPhoneNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04554A321B42982007A6DD9 /* ConfirmPhoneNumberController.swift */; }; D0471B541EFD8ECA0074D609 /* currencies.json in Resources */ = {isa = PBXBuildFile; fileRef = D0471B531EFD8ECA0074D609 /* currencies.json */; }; D048B339203C532800038D05 /* ChatMediaInputPane.swift in Sources */ = {isa = PBXBuildFile; fileRef = D048B338203C532800038D05 /* ChatMediaInputPane.swift */; }; D04B4D131EEA0A6500711AF6 /* ChatMessageMapBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04B4D121EEA0A6500711AF6 /* ChatMessageMapBubbleContentNode.swift */; }; @@ -215,9 +167,6 @@ D056CD781FF2A6EE00880D28 /* ChatMessageSwipeToReplyNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056CD771FF2A6EE00880D28 /* ChatMessageSwipeToReplyNode.swift */; }; D056CD7A1FF3CC2A00880D28 /* ListMessagePlaybackOverlayNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056CD791FF3CC2A00880D28 /* ListMessagePlaybackOverlayNode.swift */; }; D05B077421BFC38600B1D27C /* FFMpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D05B077321BFC38600B1D27C /* FFMpeg.framework */; }; - D05D8B3A2192FC460064586F /* LocalizationListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05D8B392192FC460064586F /* LocalizationListController.swift */; }; - D05D8B3F2192FC6E0064586F /* LocalizationListControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05D8B3E2192FC6E0064586F /* LocalizationListControllerNode.swift */; }; - D05D8B412192FC8A0064586F /* LocalizationListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05D8B402192FC8A0064586F /* LocalizationListItem.swift */; }; D060184022F35D1C00796784 /* MergeLists.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D060183F22F35D1C00796784 /* MergeLists.framework */; }; D060184222F35D2000796784 /* ActivityIndicator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D060184122F35D2000796784 /* ActivityIndicator.framework */; }; D060184422F35D2400796784 /* ProgressNavigationButtonNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D060184322F35D2400796784 /* ProgressNavigationButtonNode.framework */; }; @@ -228,11 +177,7 @@ D069F5D0212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D069F5CF212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift */; }; D06BB8821F58994B0084FC30 /* LegacyInstantVideoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06BB8811F58994B0084FC30 /* LegacyInstantVideoController.swift */; }; D06E0F8E1F79ABFB003CF3DD /* ChatLoadingNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06E0F8D1F79ABFB003CF3DD /* ChatLoadingNode.swift */; }; - D06E4C332134A59700088087 /* ThemeAccentColorActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06E4C322134A59700088087 /* ThemeAccentColorActionSheet.swift */; }; - D06E4C352134AE3C00088087 /* ThemeAutoNightSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06E4C342134AE3C00088087 /* ThemeAutoNightSettingsController.swift */; }; D06F1EA41F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06F1EA31F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift */; }; - D06F31E4213597FF001A0F12 /* ThemeAutoNightTimeSelectionActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06F31E3213597FF001A0F12 /* ThemeAutoNightTimeSelectionActionSheet.swift */; }; - D06F31E62135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06F31E52135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift */; }; D0750C7822B2A13300BE5F6E /* UniversalMediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0750C7722B2A13300BE5F6E /* UniversalMediaPlayer.framework */; }; D0750C7A22B2A14300BE5F6E /* DeviceAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0750C7922B2A14300BE5F6E /* DeviceAccess.framework */; }; D0750C7C22B2A14300BE5F6E /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0750C7B22B2A14300BE5F6E /* TelegramPresentationData.framework */; }; @@ -246,7 +191,6 @@ D0754D221EEDF89900884F6E /* ChatMessageInvoiceBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0754D211EEDF89900884F6E /* ChatMessageInvoiceBubbleContentNode.swift */; }; D077C5C122B59A800097D617 /* ApplicationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D077C5C022B59A800097D617 /* ApplicationContext.swift */; }; D07BCBFE1F2B792300ED97AA /* LegacyComponents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D07BCBFD1F2B792300ED97AA /* LegacyComponents.framework */; }; - D07E413D208A494D00FCA8F0 /* ProxyServerActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07E413C208A494D00FCA8F0 /* ProxyServerActionSheetController.swift */; }; D08799F022F649A600C4D6B3 /* TelegramBaseController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D08799EF22F649A600C4D6B3 /* TelegramBaseController.framework */; }; D0879A0D22F64E4C00C4D6B3 /* DeviceLocationManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0879A0C22F64E4C00C4D6B3 /* DeviceLocationManager.framework */; }; D0879B1F22F7189600C4D6B3 /* AvatarNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0879B1E22F7189600C4D6B3 /* AvatarNode.framework */; }; @@ -261,18 +205,14 @@ D0879C9622F875C000C4D6B3 /* PeerPresenceStatusManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0879C9522F875C000C4D6B3 /* PeerPresenceStatusManager.framework */; }; D0879CCC22F876DD00C4D6B3 /* ChatListSearchRecentPeersNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0879CCB22F876DD00C4D6B3 /* ChatListSearchRecentPeersNode.framework */; }; D08803C51F6064CF00DD7951 /* TelegramUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D0FC40821D5B8E7400261D9D /* TelegramUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D08984F02114AE0C00918162 /* DataPrivacySettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08984EF2114AE0C00918162 /* DataPrivacySettingsController.swift */; }; D08BDF641FA37BEA009D08E1 /* ChatRecordingPreviewInputPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08BDF631FA37BEA009D08E1 /* ChatRecordingPreviewInputPanelNode.swift */; }; - D08BDF661FA8CB10009D08E1 /* EditSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08BDF651FA8CB10009D08E1 /* EditSettingsController.swift */; }; D091C7A41F8EBB1E00D7DE13 /* ChatPresentationData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D091C7A31F8EBB1E00D7DE13 /* ChatPresentationData.swift */; }; - D091C7A61F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D091C7A51F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift */; }; D09250061FE5371D003F693F /* GlobalExperimentalSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09250051FE5371D003F693F /* GlobalExperimentalSettings.swift */; }; D0943B001FDAE852001522CC /* ChatFeedNavigationInputPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0943AFF1FDAE852001522CC /* ChatFeedNavigationInputPanelNode.swift */; }; D0943B051FDDFDA0001522CC /* OverlayInstantVideoNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0943B041FDDFDA0001522CC /* OverlayInstantVideoNode.swift */; }; D0943B071FDEC529001522CC /* InstantVideoRadialStatusNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0943B061FDEC528001522CC /* InstantVideoRadialStatusNode.swift */; }; D0955FB521912B6000F89427 /* PresentationStrings.mapping in Resources */ = {isa = PBXBuildFile; fileRef = D0955FB32191278C00F89427 /* PresentationStrings.mapping */; }; D099E220229405BB00561B75 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099E21F229405BB00561B75 /* Weak.swift */; }; - D09D88731F86D56B00BEB4C9 /* AuthorizationLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09D88721F86D56B00BEB4C9 /* AuthorizationLayout.swift */; }; D09E637C1F0E7C28003444CD /* SharedMediaPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09E637B1F0E7C28003444CD /* SharedMediaPlayer.swift */; }; D09E637F1F0E8C9F003444CD /* PeerMessagesMediaPlaylist.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09E637E1F0E8C9F003444CD /* PeerMessagesMediaPlaylist.swift */; }; D09E63B01F1010FE003444CD /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E63AF1F1010FE003444CD /* Contacts.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; @@ -295,7 +235,6 @@ D09E77A922FA5CEA00B9CCA7 /* TextFormat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E77A822FA5CEA00B9CCA7 /* TextFormat.framework */; }; D09E77AB22FA5CEA00B9CCA7 /* Tuples.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E77AA22FA5CEA00B9CCA7 /* Tuples.framework */; }; D09E77AD22FA5CEA00B9CCA7 /* UrlEscaping.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E77AC22FA5CEA00B9CCA7 /* UrlEscaping.framework */; }; - D0A8998D217A294100759EE6 /* SaveIncomingMediaController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A8998C217A294100759EE6 /* SaveIncomingMediaController.swift */; }; D0AA840C1FEB2BA3005C6E91 /* OverlayPlayerControlsNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AA840B1FEB2BA3005C6E91 /* OverlayPlayerControlsNode.swift */; }; D0AB262921C307D7008F6685 /* ChatMessagePollBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AB262821C307D7008F6685 /* ChatMessagePollBubbleContentNode.swift */; }; D0ACCB1C1EC5FF4B0079D8BF /* ChatMessageCallBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ACCB1B1EC5FF4B0079D8BF /* ChatMessageCallBubbleContentNode.swift */; }; @@ -309,13 +248,7 @@ D0AEAE272080D6970013176E /* PaneSearchBarNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AEAE262080D6970013176E /* PaneSearchBarNode.swift */; }; D0AEAE292080FD660013176E /* StickerPaneSearchGlobaltem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AEAE282080FD660013176E /* StickerPaneSearchGlobaltem.swift */; }; D0AF323A1FB1D8D60097362B /* ChatOverlayNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AF32391FB1D8D60097362B /* ChatOverlayNavigationBar.swift */; }; - D0B21B15220D85DD003F741D /* TabBarAccountSwitchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B14220D85DD003F741D /* TabBarAccountSwitchController.swift */; }; - D0B21B17220D85E7003F741D /* TabBarAccountSwitchControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B16220D85E7003F741D /* TabBarAccountSwitchControllerNode.swift */; }; D0B21B1F22156D92003F741D /* LegacyCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B1E22156D92003F741D /* LegacyCache.swift */; }; - D0B21B212215B539003F741D /* LogoutOptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B202215B539003F741D /* LogoutOptionsController.swift */; }; - D0B37C5C1F8D22AE004252DF /* ThemeSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B37C5B1F8D22AE004252DF /* ThemeSettingsController.swift */; }; - D0B37C5E1F8D26A8004252DF /* ThemeSettingsChatPreviewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B37C5D1F8D26A8004252DF /* ThemeSettingsChatPreviewItem.swift */; }; - D0B37C601F8D286E004252DF /* ThemeSettingsFontSizeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B37C5F1F8D286E004252DF /* ThemeSettingsFontSizeItem.swift */; }; D0B4AF861EC111FA00D51FF6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D0AB0BBA1D6719B5002C78E7 /* Images.xcassets */; }; D0B4AF881EC112EE00D51FF6 /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B4AF871EC112ED00D51FF6 /* CallKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; D0B69C3920EBB397003632C7 /* ChatMessageInteractiveInstantVideoNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B69C3820EBB397003632C7 /* ChatMessageInteractiveInstantVideoNode.swift */; }; @@ -331,7 +264,6 @@ D0C0B59B1EE019E5000F4D2C /* ChatSearchNavigationContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C0B59A1EE019E5000F4D2C /* ChatSearchNavigationContentNode.swift */; }; D0C0B59F1EE082F5000F4D2C /* ChatSearchInputPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C0B59E1EE082F5000F4D2C /* ChatSearchInputPanelNode.swift */; }; D0C0B5B11EE1C421000F4D2C /* ChatDateSelectionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C0B5B01EE1C421000F4D2C /* ChatDateSelectionSheet.swift */; }; - D0C0B5B71EE1DEF1000F4D2C /* ThemeGridControllerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C0B5B61EE1DEF1000F4D2C /* ThemeGridControllerItem.swift */; }; D0C12A1D1F33A85600B3F66D /* ChatWallpaperBuiltin0.jpg in Resources */ = {isa = PBXBuildFile; fileRef = D0C12A1B1F33964900B3F66D /* ChatWallpaperBuiltin0.jpg */; }; D0C12EB01F9A8D1300600BB2 /* ListMessageDateHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C12EAF1F9A8D1300600BB2 /* ListMessageDateHeader.swift */; }; D0C26D571FDF2388004ABF18 /* OpenChatMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C26D561FDF2388004ABF18 /* OpenChatMessage.swift */; }; @@ -388,19 +320,14 @@ D0C9CBB62302B65600FAB518 /* LanguageSuggestionUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CBB52302B65600FAB518 /* LanguageSuggestionUI.framework */; }; D0C9CBD72302C09000FAB518 /* TextSelectionNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CBD62302C09000FAB518 /* TextSelectionNode.framework */; }; D0CAD90120AEECAC00ACD96E /* ChatEditInterfaceMessageState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CAD90020AEECAC00ACD96E /* ChatEditInterfaceMessageState.swift */; }; - D0CB27CF20C17A4A001ACF93 /* TermsOfServiceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CB27CE20C17A4A001ACF93 /* TermsOfServiceController.swift */; }; - D0CB27D220C17A7F001ACF93 /* TermsOfServiceControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CB27D120C17A7F001ACF93 /* TermsOfServiceControllerNode.swift */; }; D0CCD61B222E8B4500EE1E08 /* TimeBasedVideoPreload.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CCD61A222E8B4500EE1E08 /* TimeBasedVideoPreload.swift */; }; D0CE67941F7DB45100FFB557 /* ChatMessageContactBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE67931F7DB45100FFB557 /* ChatMessageContactBubbleContentNode.swift */; }; - D0CE6F70213EEE5000BCD44B /* CreatePasswordController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE6F6F213EEE5000BCD44B /* CreatePasswordController.swift */; }; D0CE8CE51F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE8CE41F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift */; }; D0CE8CE71F6F35A300AA2DB0 /* ChatTextInputPanelState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE8CE61F6F35A300AA2DB0 /* ChatTextInputPanelState.swift */; }; D0CFBB911FD881A600B65C0D /* AudioRecordningToneData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFBB901FD881A600B65C0D /* AudioRecordningToneData.swift */; }; D0CFBB951FD8B05000B65C0D /* OverlayInstantVideoDecoration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFBB941FD8B05000B65C0D /* OverlayInstantVideoDecoration.swift */; }; D0D3281422F31B3000D07EE2 /* TelegramUpdateUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D3281322F31B3000D07EE2 /* TelegramUpdateUI.framework */; }; - D0D4345C1F97CEAA00CC1806 /* ProxyServerSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4345B1F97CEAA00CC1806 /* ProxyServerSettingsController.swift */; }; D0DE66061F9A51E200EF4AE9 /* GalleryHiddenMediaManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DE66051F9A51E200EF4AE9 /* GalleryHiddenMediaManager.swift */; }; - D0DFD5E21FCE2BA50039B3B1 /* CalculatingCacheSizeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DFD5E11FCE2BA50039B3B1 /* CalculatingCacheSizeItem.swift */; }; D0E2CE6C222930540084E3DD /* PrefetchManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E2CE6B222930540084E3DD /* PrefetchManager.swift */; }; D0E8174C2011F8A300B82BBB /* ChatMessageEventLogPreviousMessageContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8174B2011F8A300B82BBB /* ChatMessageEventLogPreviousMessageContentNode.swift */; }; D0E8174E2011FC3800B82BBB /* ChatMessageEventLogPreviousDescriptionContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8174D2011FC3800B82BBB /* ChatMessageEventLogPreviousDescriptionContentNode.swift */; }; @@ -457,7 +384,6 @@ D0EC6CCC1EB9F58800EBF1C3 /* ServiceSoundManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D073CE641DCBC26B007511FD /* ServiceSoundManager.swift */; }; D0EC6CCD1EB9F58800EBF1C3 /* DeclareEncodables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D073CE701DCBF23F007511FD /* DeclareEncodables.swift */; }; D0EC6CCE1EB9F58800EBF1C3 /* AccountContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05811931DD5F9380057C769 /* AccountContext.swift */; }; - D0EC6CD11EB9F58800EBF1C3 /* UrlHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D023836F1DDF0462004018B6 /* UrlHandling.swift */; }; D0EC6CDC1EB9F58800EBF1C3 /* TelegramAccountAuxiliaryMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F3A8AA1E82D83E00B4C64C /* TelegramAccountAuxiliaryMethods.swift */; }; D0EC6CF91EB9F58800EBF1C3 /* MediaManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CD61D6B87D30046BCD6 /* MediaManager.swift */; }; D0EC6CFB1EB9F58800EBF1C3 /* ManagedAudioRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D03AE41DECAE8900220C46 /* ManagedAudioRecorder.swift */; }; @@ -468,7 +394,6 @@ D0EC6D261EB9F58800EBF1C3 /* TransformOutgoingMessageMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04662801E68BA64006FAFC4 /* TransformOutgoingMessageMedia.swift */; }; D0EC6D271EB9F58800EBF1C3 /* FetchResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F3A8B51E83120A00B4C64C /* FetchResource.swift */; }; D0EC6D291EB9F58800EBF1C3 /* FetchVideoMediaResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F3A8B91E831E6300B4C64C /* FetchVideoMediaResource.swift */; }; - D0EC6D2A1EB9F58800EBF1C3 /* FetchPhotoLibraryImageResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06E4AC31E84806300627D1D /* FetchPhotoLibraryImageResource.swift */; }; D0EC6D2B1EB9F58800EBF1C3 /* FileMediaResourceStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0177B831DFB095000A5083A /* FileMediaResourceStatus.swift */; }; D0EC6D301EB9F58800EBF1C3 /* RadialProgressNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69DC41D6B89E10046BCD6 /* RadialProgressNode.swift */; }; D0EC6D311EB9F58800EBF1C3 /* RadialTimeoutNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CE51E378FD00080C3D5 /* RadialTimeoutNode.swift */; }; @@ -488,7 +413,6 @@ D0EC6D5E1EB9F58800EBF1C3 /* ListMessageHoleItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02383831DDFA22C004018B6 /* ListMessageHoleItem.swift */; }; D0EC6D5F1EB9F58800EBF1C3 /* GridMessageItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02BE0761D9190EF000889C2 /* GridMessageItem.swift */; }; D0EC6D601EB9F58800EBF1C3 /* GridHoleItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DE76F61D91BA3D002B8809 /* GridHoleItem.swift */; }; - D0EC6D611EB9F58800EBF1C3 /* GridMessageSelectionNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DE77281D932923002B8809 /* GridMessageSelectionNode.swift */; }; D0EC6D681EB9F58800EBF1C3 /* AuthorizationSequenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D049EAF21E44DE2500A2CD3A /* AuthorizationSequenceController.swift */; }; D0EC6D691EB9F58800EBF1C3 /* AuthorizationSequenceSplashController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2B21E44E56200650E93 /* AuthorizationSequenceSplashController.swift */; }; D0EC6D6A1EB9F58800EBF1C3 /* AuthorizationSequenceSplashControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2BA1E44EA2400650E93 /* AuthorizationSequenceSplashControllerNode.swift */; }; @@ -611,7 +535,6 @@ D0EC6DF91EB9F58900EBF1C3 /* PeerMediaCollectionInterfaceStateButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DE77241D93225E002B8809 /* PeerMediaCollectionInterfaceStateButtons.swift */; }; D0EC6E2B1EB9F58900EBF1C3 /* ComposeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D087750F1E3F46A400A97350 /* ComposeController.swift */; }; D0EC6E2C1EB9F58900EBF1C3 /* ComposeControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08775111E3F46AB00A97350 /* ComposeControllerNode.swift */; }; - D0EC6E2D1EB9F58900EBF1C3 /* CounterContollerTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D087751D1E3F579300A97350 /* CounterContollerTitleView.swift */; }; D0EC6E2E1EB9F58900EBF1C3 /* ContactMultiselectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08775181E3F53FC00A97350 /* ContactMultiselectionController.swift */; }; D0EC6E2F1EB9F58900EBF1C3 /* ContactMultiselectionControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D087751B1E3F542500A97350 /* ContactMultiselectionControllerNode.swift */; }; D0EC6E301EB9F58900EBF1C3 /* ContactSelectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC387E1E40F1CF0044D6FE /* ContactSelectionController.swift */; }; @@ -620,35 +543,6 @@ D0EC6E331EB9F58900EBF1C3 /* CreateChannelController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018D3341E6489EC00C5E089 /* CreateChannelController.swift */; }; D0EC6E581EB9F58900EBF1C3 /* PeerSelectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07CFF731DCA207200761F81 /* PeerSelectionController.swift */; }; D0EC6E591EB9F58900EBF1C3 /* PeerSelectionControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07CFF751DCA224100761F81 /* PeerSelectionControllerNode.swift */; }; - D0EC6E5D1EB9F58900EBF1C3 /* PrivacyAndSecurityController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05A32DD1E6F0097002760B4 /* PrivacyAndSecurityController.swift */; }; - D0EC6E5E1EB9F58900EBF1C3 /* ItemListRecentSessionItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05A32ED1E6F25A0002760B4 /* ItemListRecentSessionItem.swift */; }; - D0EC6E5F1EB9F58900EBF1C3 /* RecentSessionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05A32E91E6F143C002760B4 /* RecentSessionsController.swift */; }; - D0EC6E601EB9F58900EBF1C3 /* BlockedPeersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05A32EB1E6F1462002760B4 /* BlockedPeersController.swift */; }; - D0EC6E611EB9F58900EBF1C3 /* SelectivePrivacySettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B724C1E720393000BD3AD /* SelectivePrivacySettingsController.swift */; }; - D0EC6E621EB9F58900EBF1C3 /* SelectivePrivacySettingsPeersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EF40DC1E72F00E000DFCD4 /* SelectivePrivacySettingsPeersController.swift */; }; - D0EC6E631EB9F58900EBF1C3 /* TwoStepVerificationUnlockController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C2AAA1E75E010001F6F9A /* TwoStepVerificationUnlockController.swift */; }; - D0EC6E641EB9F58900EBF1C3 /* TwoStepVerificationPasswordEntryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA0ABE1E76E17F005BB9B7 /* TwoStepVerificationPasswordEntryController.swift */; }; - D0EC6E651EB9F58900EBF1C3 /* TwoStepVerificationResetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA0AC01E7725AA005BB9B7 /* TwoStepVerificationResetController.swift */; }; - D0EC6E661EB9F58900EBF1C3 /* PasscodeOptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0760B231E9D015D00F1F3C4 /* PasscodeOptionsController.swift */; }; - D0EC6E671EB9F58900EBF1C3 /* DataAndStorageSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9323B1E0B4AE90074F044 /* DataAndStorageSettingsController.swift */; }; - D0EC6E681EB9F58900EBF1C3 /* VoiceCallDataSavingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A951EA54D0D00211D94 /* VoiceCallDataSavingController.swift */; }; - D0EC6E691EB9F58900EBF1C3 /* NetworkUsageStatsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A9D1EA5732300211D94 /* NetworkUsageStatsController.swift */; }; - D0EC6E6A1EB9F58900EBF1C3 /* StorageUsageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA35001EA6127000E56FFA /* StorageUsageController.swift */; }; - D0EC6E6B1EB9F58900EBF1C3 /* InstalledStickerPacksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA0AC41E77431A005BB9B7 /* InstalledStickerPacksController.swift */; }; - D0EC6E6C1EB9F58900EBF1C3 /* FeaturedStickerPacksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E23DD71E805E2600B9B6D2 /* FeaturedStickerPacksController.swift */; }; - D0EC6E6E1EB9F58900EBF1C3 /* ArchivedStickerPacksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E23DDC1E8081A200B9B6D2 /* ArchivedStickerPacksController.swift */; }; - D0EC6E731EB9F58900EBF1C3 /* WallpaperGalleryToolbarNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05174AA1EAA5B4700A1BF36 /* WallpaperGalleryToolbarNode.swift */; }; - D0EC6E741EB9F58900EBF1C3 /* ThemeGridController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B351EB88D0A00EBF1C3 /* ThemeGridController.swift */; }; - D0EC6E751EB9F58900EBF1C3 /* ThemeGridControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B371EB88D1600EBF1C3 /* ThemeGridControllerNode.swift */; }; - D0EC6E761EB9F58900EBF1C3 /* SettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01B279A1E39386C0022A4C0 /* SettingsController.swift */; }; - D0EC6E771EB9F58900EBF1C3 /* NotificationsAndSounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01B279C1E394A500022A4C0 /* NotificationsAndSounds.swift */; }; - D0EC6E7A1EB9F58900EBF1C3 /* DebugController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE1BD21E51BC6100404327 /* DebugController.swift */; }; - D0EC6E7B1EB9F58900EBF1C3 /* DebugAccountsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E5E081E55C49C0029569A /* DebugAccountsController.swift */; }; - D0EC6E7C1EB9F58900EBF1C3 /* UsernameSetupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0528E671E65CB2C00E2FEF5 /* UsernameSetupController.swift */; }; - D0EC6E7D1EB9F58900EBF1C3 /* ChangePhoneNumberIntroController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A11BF91E7836C20081CE03 /* ChangePhoneNumberIntroController.swift */; }; - D0EC6E7E1EB9F58900EBF1C3 /* ChangePhoneNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A11BFB1E7840750081CE03 /* ChangePhoneNumberController.swift */; }; - D0EC6E7F1EB9F58900EBF1C3 /* ChangePhoneNumberControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A11BFD1E7840A50081CE03 /* ChangePhoneNumberControllerNode.swift */; }; - D0EC6E801EB9F58900EBF1C3 /* ChangePhoneNumberCodeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F53BEB1E784DA900117362 /* ChangePhoneNumberCodeController.swift */; }; D0EC6E811EB9F58900EBF1C3 /* NotificationContainerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C50E371E93CB1500F62E39 /* NotificationContainerController.swift */; }; D0EC6E821EB9F58900EBF1C3 /* NotificationContainerControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C50E391E93CB4300F62E39 /* NotificationContainerControllerNode.swift */; }; D0EC6E831EB9F58900EBF1C3 /* NotificationItemContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C50E3D1E93D09200F62E39 /* NotificationItemContainerNode.swift */; }; @@ -679,18 +573,10 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 0900678C21ED5EA800530762 /* WallpaperColorPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperColorPanelNode.swift; sourceTree = ""; }; - 0900678E21ED8E0E00530762 /* HexColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HexColor.swift; sourceTree = ""; }; - 0902838721931D960067EFBD /* LanguageSuggestionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageSuggestionController.swift; sourceTree = ""; }; 090B48C72200BCA8005083FA /* WallpaperUploadManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperUploadManager.swift; sourceTree = ""; }; 090E63ED2196FE3A00E3C035 /* OpenAddContact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenAddContact.swift; sourceTree = ""; }; - 090E777822A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsThemeItem.swift; sourceTree = ""; }; 090E778B22AA842200CD99F5 /* anim_success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_success.json; sourceTree = ""; }; 0910B0EC21FA178C00F8F87D /* WallpaperPreviewMedia.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperPreviewMedia.swift; sourceTree = ""; }; - 0910B0EE21FA532D00F8F87D /* WallpaperResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperResources.swift; sourceTree = ""; }; - 0910B0F021FB3DE100F8F87D /* WallpaperPatternPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperPatternPanelNode.swift; sourceTree = ""; }; - 091417F121EF4E5D00C8325A /* WallpaperGalleryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryController.swift; sourceTree = ""; }; - 091417F321EF4F5F00C8325A /* WallpaperGalleryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryItem.swift; sourceTree = ""; }; 0921F60D228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageActionUrlAuthController.swift; sourceTree = ""; }; 092F368C2154AAE9001A9F49 /* SFCompactRounded-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SFCompactRounded-Semibold.otf"; sourceTree = ""; }; 09310D1A213BC5DE0020033A /* anim_ungroup.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_ungroup.json; sourceTree = ""; }; @@ -708,17 +594,11 @@ 0947350C2275D72100EA2312 /* anim_unmute.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_unmute.json; sourceTree = ""; }; 0947350D2275D72100EA2312 /* anim_pin.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_pin.json; sourceTree = ""; }; 094735182277483B00EA2312 /* anim_infotip.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_infotip.json; sourceTree = ""; }; - 0947FCAD224043450086741C /* SettingsSearchRecentItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSearchRecentItem.swift; sourceTree = ""; }; - 0947FCAF224055990086741C /* StringHash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringHash.swift; sourceTree = ""; }; 09510B0E22F9347E0078CAB7 /* BundleResource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleResource.swift; sourceTree = ""; }; 09510B1222F96E5B0078CAB7 /* ChatScheduleTimeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatScheduleTimeController.swift; sourceTree = ""; }; 09510B1422F96E6C0078CAB7 /* ChatScheduleTimeControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatScheduleTimeControllerNode.swift; sourceTree = ""; }; - 0957DE2222DE28FB001B4D57 /* ThemePreviewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePreviewController.swift; sourceTree = ""; }; - 0957DE2422DE2909001B4D57 /* ThemePreviewControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePreviewControllerNode.swift; sourceTree = ""; }; 0962E67821B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageAnimatedStickerItemNode.swift; sourceTree = ""; }; 09749BC421F0E024008FDDE9 /* StickersChatInputContextPanelItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickersChatInputContextPanelItem.swift; sourceTree = ""; }; - 09749BCC21F23139008FDDE9 /* WallpaperGalleryDecorationNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryDecorationNode.swift; sourceTree = ""; }; - 09749BCE21F236F2008FDDE9 /* ModernCheckNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModernCheckNode.swift; sourceTree = ""; }; 0979788021065F8B0077D77F /* VimeoUserScript.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = VimeoUserScript.js; sourceTree = ""; }; 0979788121065F8B0077D77F /* YoutubeUserScript.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = YoutubeUserScript.js; sourceTree = ""; }; 0979788221065F8C0077D77F /* Vimeo.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = Vimeo.html; sourceTree = ""; }; @@ -728,61 +608,23 @@ 0979788621065F8C0077D77F /* TwitchUserScript.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = TwitchUserScript.js; sourceTree = ""; }; 0979788721065F8C0077D77F /* Youtube.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = Youtube.html; sourceTree = ""; }; 0979788821065F8C0077D77F /* GenericUserScript.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = GenericUserScript.js; sourceTree = ""; }; - 098CF79122B924E200AF6134 /* ThemeSettingsAccentColorItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsAccentColorItem.swift; sourceTree = ""; }; - 099529A921CDB27900805E13 /* ShareProxyServerActionSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareProxyServerActionSheetController.swift; sourceTree = ""; }; - 099529AB21CDBBB200805E13 /* QRCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCode.swift; sourceTree = ""; }; 099529AF21D2123E00805E13 /* ChatMessageUnsupportedBubbleContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageUnsupportedBubbleContentNode.swift; sourceTree = ""; }; 099529B321D3E5D800805E13 /* CheckDiskSpace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckDiskSpace.swift; sourceTree = ""; }; 09A218D7229EE1B500DE6898 /* HorizontalStickerGridItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalStickerGridItem.swift; sourceTree = ""; }; 09A218D8229EE1B500DE6898 /* HorizontalStickersChatContextPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalStickersChatContextPanelNode.swift; sourceTree = ""; }; - 09A218F422A15F1400DE6898 /* ThemeSettingsAppIconItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsAppIconItem.swift; sourceTree = ""; }; - 09B4819223028A4200D5B32B /* ThemeAccentColorController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeAccentColorController.swift; sourceTree = ""; }; - 09B4819423028A8A00D5B32B /* ThemeAccentColorControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeAccentColorControllerNode.swift; sourceTree = ""; }; - 09B4EE4621A6D33F00847FA6 /* RecentSessionsEmptyStateItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentSessionsEmptyStateItem.swift; sourceTree = ""; }; - 09C500232142BA6400EF253E /* ItemListWebsiteItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListWebsiteItem.swift; sourceTree = ""; }; 09CE94FF2232729A00A7D2C3 /* StickerPaneSearchContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerPaneSearchContentNode.swift; sourceTree = ""; }; 09CE9501223272B700A7D2C3 /* GifPaneSearchContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GifPaneSearchContentNode.swift; sourceTree = ""; }; - 09CE95032236C6B300A7D2C3 /* CachedInstantPages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedInstantPages.swift; sourceTree = ""; }; - 09CE95052236D47F00A7D2C3 /* SettingsSearchItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSearchItem.swift; sourceTree = ""; }; - 09CE95072237A53900A7D2C3 /* SettingsSearchableItems.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSearchableItems.swift; sourceTree = ""; }; - 09CE95092237B93500A7D2C3 /* SettingsSearchResultItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSearchResultItem.swift; sourceTree = ""; }; - 09CE950D2237E45E00A7D2C3 /* CachedFaqInstantPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedFaqInstantPage.swift; sourceTree = ""; }; - 09CE95102237F3C100A7D2C3 /* SettingsSearchRecentQueries.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSearchRecentQueries.swift; sourceTree = ""; }; - 09CE9512223825B700A7D2C3 /* CustomWallpaperPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomWallpaperPicker.swift; sourceTree = ""; }; 09D304142173C0E900C00567 /* WatchManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchManager.swift; sourceTree = ""; }; - 09D304172173C15700C00567 /* WatchSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchSettingsController.swift; sourceTree = ""; }; 09D96898221DE92600B1458A /* ID3ArtworkReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ID3ArtworkReader.swift; sourceTree = ""; }; 09DD5D4F21ECC3C400D7007A /* SuppressContactsWarning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuppressContactsWarning.swift; sourceTree = ""; }; - 09DD5D5121ED175300D7007A /* WallpaperColorPickerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperColorPickerNode.swift; sourceTree = ""; }; - 09DE2F262269D5730045E975 /* PrivacyIntroController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyIntroController.swift; sourceTree = ""; }; - 09DE2F282269D5E30045E975 /* PrivacyIntroControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyIntroControllerNode.swift; sourceTree = ""; }; 09E2D9ED226F1AF300EA0AA4 /* Emoji.mapping */ = {isa = PBXFileReference; lastKnownFileType = file; name = Emoji.mapping; path = TelegramUI/Resources/Emoji.mapping; sourceTree = ""; }; 09E2D9F0226F214000EA0AA4 /* EmojiResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiResources.swift; sourceTree = ""; }; 09E2DA122273367900EA0AA4 /* anim_archiveAvatar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_archiveAvatar.json; sourceTree = ""; }; - 09E4A802223B833B0038140F /* ForwardPrivacyChatPreviewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardPrivacyChatPreviewItem.swift; sourceTree = ""; }; - 09E4A804223D4A5A0038140F /* OpenSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenSettings.swift; sourceTree = ""; }; - 09E4A806223D4B860038140F /* AccountUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountUtils.swift; sourceTree = ""; }; 09EC0DEC22CB583C00E7185B /* TextLinkHandling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextLinkHandling.swift; sourceTree = ""; }; - 09EDAD25220D30980012A50B /* AutodownloadConnectionTypeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutodownloadConnectionTypeController.swift; sourceTree = ""; }; 09EDAD29220DA6A40012A50B /* VolumeButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VolumeButtons.swift; sourceTree = ""; }; - 09EDAD2B2211552F0012A50B /* AutodownloadMediaCategoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutodownloadMediaCategoryController.swift; sourceTree = ""; }; - 09EDAD2D221164440012A50B /* AutodownloadSizeLimitItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutodownloadSizeLimitItem.swift; sourceTree = ""; }; - 09EDAD2F221164530012A50B /* AutodownloadDataUsagePickerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutodownloadDataUsagePickerItem.swift; sourceTree = ""; }; 09F2158C225CF5BC00AEDF6D /* Pasteboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pasteboard.swift; sourceTree = ""; }; - 09F664BF21EAAFAF00AB7E26 /* ThemeColorsGridController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeColorsGridController.swift; sourceTree = ""; }; - 09F664C121EAAFCB00AB7E26 /* ThemeColorsGridControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeColorsGridControllerNode.swift; sourceTree = ""; }; - 09F664C321EAB98300AB7E26 /* ThemeColorsGridControllerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeColorsGridControllerItem.swift; sourceTree = ""; }; - 09F664C521EB400A00AB7E26 /* ThemeGridSearchContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeGridSearchContentNode.swift; sourceTree = ""; }; - 09F664C721EB4A2600AB7E26 /* ThemeGridSearchItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeGridSearchItem.swift; sourceTree = ""; }; - 09F664C921EB4F2700AB7E26 /* ThemeGridSearchColorsItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeGridSearchColorsItem.swift; sourceTree = ""; }; - 09F664CB21EB552C00AB7E26 /* WallpaperSearchRecentQueries.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperSearchRecentQueries.swift; sourceTree = ""; }; - 09F664CF21EBCFB900AB7E26 /* WallpaperCropNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperCropNode.swift; sourceTree = ""; }; - 09F85BA421E7821500D73170 /* ThemeGridSelectionPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeGridSelectionPanelNode.swift; sourceTree = ""; }; - 09F85BA621E7DA5F00D73170 /* BlurredImageNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlurredImageNode.swift; sourceTree = ""; }; 09FFBCCF227B7F9000C33B4B /* anim_archiveswipe.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_archiveswipe.json; sourceTree = ""; }; 09FFBCD62281BB2D00C33B4B /* ChatTextLinkEditController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatTextLinkEditController.swift; sourceTree = ""; }; - 9F06830821A404AB001D8EDB /* NotificationExceptionControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptionControllerNode.swift; sourceTree = ""; }; - 9F06830A21A404C4001D8EDB /* NotificationExceptionSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptionSettingsController.swift; sourceTree = ""; }; D000CABB21F158AD0011B15D /* PrepareSecretThumbnailData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepareSecretThumbnailData.swift; sourceTree = ""; }; D002A0D21E9BBE6700A81812 /* MultiplexedSoftwareVideoSourceManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultiplexedSoftwareVideoSourceManager.swift; sourceTree = ""; }; D002A0D41E9BD48400A81812 /* SampleBufferPool.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleBufferPool.swift; sourceTree = ""; }; @@ -817,20 +659,14 @@ D01776BD1F1E76920044446D /* PeerMediaCollectionSectionsNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerMediaCollectionSectionsNode.swift; sourceTree = ""; }; D0177B831DFB095000A5083A /* FileMediaResourceStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileMediaResourceStatus.swift; sourceTree = ""; }; D01848E721A03BDA00B6DEBD /* ChatSearchState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatSearchState.swift; sourceTree = ""; }; - D0185E872089ED5F005E1A6C /* ProxyListSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyListSettingsController.swift; sourceTree = ""; }; - D0185E89208A01AF005E1A6C /* ProxySettingsActionItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxySettingsActionItem.swift; sourceTree = ""; }; - D0185E8B208A025A005E1A6C /* ProxySettingsServerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxySettingsServerItem.swift; sourceTree = ""; }; D018BE57218C7BD800C02DDC /* ChatMessageDeliveryFailedNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageDeliveryFailedNode.swift; sourceTree = ""; }; D018D3311E6460B300C5E089 /* ChatUnblockInputPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatUnblockInputPanelNode.swift; sourceTree = ""; }; D018D3341E6489EC00C5E089 /* CreateChannelController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateChannelController.swift; sourceTree = ""; }; D0192D43210A5AA50005FA10 /* DeviceContactDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceContactDataManager.swift; sourceTree = ""; }; D01AC9171DD5033100E8160F /* ChatMessageActionButtonsNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageActionButtonsNode.swift; sourceTree = ""; }; D01AC91E1DD5E09000E8160F /* EditAccessoryPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditAccessoryPanelNode.swift; sourceTree = ""; }; - D01B279A1E39386C0022A4C0 /* SettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsController.swift; sourceTree = ""; }; - D01B279C1E394A500022A4C0 /* NotificationsAndSounds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationsAndSounds.swift; sourceTree = ""; }; D01C06B41FBB7720001561AB /* ChatMediaInputSettingsItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMediaInputSettingsItem.swift; sourceTree = ""; }; D01C2AA01E758F90001F6F9A /* NavigateToChatController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigateToChatController.swift; sourceTree = ""; }; - D01C2AAA1E75E010001F6F9A /* TwoStepVerificationUnlockController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoStepVerificationUnlockController.swift; sourceTree = ""; }; D01DBA9A209CC6AD00C64E64 /* ChatLinkPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatLinkPreview.swift; sourceTree = ""; }; D01F66121DE8903300345CBE /* ChatTextInputMediaRecordingButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatTextInputMediaRecordingButton.swift; sourceTree = ""; }; D01FB436217CEC62009C6134 /* FetchVideoThumbnail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchVideoThumbnail.swift; sourceTree = ""; }; @@ -840,10 +676,7 @@ D021E0CF1DB413BC00C6B04F /* ChatInputNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInputNode.swift; sourceTree = ""; }; D021E0D11DB4147500C6B04F /* ChatInterfaceInputNodes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInterfaceInputNodes.swift; sourceTree = ""; }; D021E0E41DB55D0A00C6B04F /* ChatMediaInputStickerPackItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputStickerPackItem.swift; sourceTree = ""; }; - D0223A951EA54D0D00211D94 /* VoiceCallDataSavingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoiceCallDataSavingController.swift; sourceTree = ""; }; - D0223A9D1EA5732300211D94 /* NetworkUsageStatsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkUsageStatsController.swift; sourceTree = ""; }; D02298361E0C34E900707F91 /* ChatMessageBackground.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageBackground.swift; sourceTree = ""; }; - D023836F1DDF0462004018B6 /* UrlHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UrlHandling.swift; sourceTree = ""; }; D02383721DDF0D8A004018B6 /* ChatInfoTitlePanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInfoTitlePanelNode.swift; sourceTree = ""; }; D02383741DDF0E5E004018B6 /* ChatInterfaceTitlePanelNodes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInterfaceTitlePanelNodes.swift; sourceTree = ""; }; D02383761DDF16B2004018B6 /* ChatControllerTitlePanelNodeContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatControllerTitlePanelNodeContainer.swift; sourceTree = ""; }; @@ -860,8 +693,6 @@ D02B676220800A00001A864A /* PaneSearchBarPlaceholderItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaneSearchBarPlaceholderItem.swift; sourceTree = ""; }; D02BE0701D91814C000889C2 /* ChatHistoryGridNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatHistoryGridNode.swift; sourceTree = ""; }; D02BE0761D9190EF000889C2 /* GridMessageItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GridMessageItem.swift; sourceTree = ""; }; - D02C81702177729000CD1006 /* NotificationExceptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationExceptions.swift; sourceTree = ""; }; - D02C81722177AC5900CD1006 /* NotificationSearchItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSearchItem.swift; sourceTree = ""; }; D02D634922B85B94006BE519 /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; D02DADBE2138D76F00116225 /* Vision.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Vision.framework; path = System/Library/Frameworks/Vision.framework; sourceTree = SDKROOT; }; D02F4AE81FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageInteractiveMediaBadge.swift; sourceTree = ""; }; @@ -917,7 +748,16 @@ D03E44E12305BC900049C28B /* LegacyDataImport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LegacyDataImport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E45242305C07A0049C28B /* ShareItems.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ShareItems.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E460F2305FD360049C28B /* ReactionSelectionNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ReactionSelectionNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D03E5E081E55C49C0029569A /* DebugAccountsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugAccountsController.swift; sourceTree = ""; }; + D03E47B52307636E0049C28B /* SettingsUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SettingsUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E47D6230767FF0049C28B /* UrlHandling.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UrlHandling.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E480D230769AF0049C28B /* HexColor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = HexColor.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E483723076AF30049C28B /* QrCode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = QrCode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E486F23076C500049C28B /* WallpaperResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WallpaperResources.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E48A3230774380049C28B /* AuthorizationUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AuthorizationUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E48E3230864AB0049C28B /* CounterContollerTitleView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CounterContollerTitleView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E490F230866280049C28B /* GridMessageSelectionNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GridMessageSelectionNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E493B2308679D0049C28B /* InstantPageCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = InstantPageCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E495C230868DF0049C28B /* PersistentStringHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PersistentStringHash.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D04203142037162700490EA5 /* MediaInputPaneTrendingItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaInputPaneTrendingItem.swift; sourceTree = ""; }; D04281F3200E5AB0009DDE36 /* ChatRecentActionsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecentActionsController.swift; sourceTree = ""; }; D04281F5200E5AC2009DDE36 /* ChatRecentActionsControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecentActionsControllerNode.swift; sourceTree = ""; }; @@ -926,7 +766,6 @@ D04281FD200E639A009DDE36 /* ChatRecentActionsTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecentActionsTitleView.swift; sourceTree = ""; }; D04281FF200E6A00009DDE36 /* ChatRecentActionsHistoryTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecentActionsHistoryTransition.swift; sourceTree = ""; }; D045549921B2F173007A6DD9 /* libturbojpeg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libturbojpeg.a; path = "third-party/libjpeg-turbo/libturbojpeg.a"; sourceTree = ""; }; - D04554A321B42982007A6DD9 /* ConfirmPhoneNumberController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfirmPhoneNumberController.swift; sourceTree = ""; }; D04662801E68BA64006FAFC4 /* TransformOutgoingMessageMedia.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransformOutgoingMessageMedia.swift; sourceTree = ""; }; D0471B531EFD8ECA0074D609 /* currencies.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = currencies.json; path = TelegramUI/Resources/currencies.json; sourceTree = ""; }; D048B338203C532800038D05 /* ChatMediaInputPane.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMediaInputPane.swift; sourceTree = ""; }; @@ -943,11 +782,9 @@ D04BB2C21E45020A00650E93 /* AuthorizationSequencePasswordEntryController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizationSequencePasswordEntryController.swift; sourceTree = ""; }; D04BB2C41E45022C00650E93 /* AuthorizationSequencePasswordEntryControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizationSequencePasswordEntryControllerNode.swift; sourceTree = ""; }; D04ECD711FFBF22B00DE9029 /* OpenUrl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenUrl.swift; sourceTree = ""; }; - D05174AA1EAA5B4700A1BF36 /* WallpaperGalleryToolbarNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryToolbarNode.swift; sourceTree = ""; }; D05174C21EAE583800A1BF36 /* TelegramRootController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramRootController.swift; sourceTree = ""; }; D0528E551E65750600E2FEF5 /* SecretChatHandshakeStatusInputPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretChatHandshakeStatusInputPanelNode.swift; sourceTree = ""; }; D0528E571E65773300E2FEF5 /* DeleteChatInputPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeleteChatInputPanelNode.swift; sourceTree = ""; }; - D0528E671E65CB2C00E2FEF5 /* UsernameSetupController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UsernameSetupController.swift; sourceTree = ""; }; D0528E6C1E65DE3B00E2FEF5 /* WebpagePreviewAccessoryPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebpagePreviewAccessoryPanelNode.swift; sourceTree = ""; }; D053B4361F1A9CA000E2D58A /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; D053DADB201AAAB100993D32 /* ChatTextInputMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatTextInputMenu.swift; sourceTree = ""; }; @@ -960,16 +797,8 @@ D0575AEE1E9FF881006F2541 /* ChatMediaInputTrendingItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputTrendingItem.swift; sourceTree = ""; }; D0575AF61EA0ED4F006F2541 /* ChatMessageInstantVideoItemNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageInstantVideoItemNode.swift; sourceTree = ""; }; D05811931DD5F9380057C769 /* AccountContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountContext.swift; sourceTree = ""; }; - D05A32DD1E6F0097002760B4 /* PrivacyAndSecurityController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacyAndSecurityController.swift; sourceTree = ""; }; - D05A32E91E6F143C002760B4 /* RecentSessionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentSessionsController.swift; sourceTree = ""; }; - D05A32EB1E6F1462002760B4 /* BlockedPeersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlockedPeersController.swift; sourceTree = ""; }; - D05A32ED1E6F25A0002760B4 /* ItemListRecentSessionItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListRecentSessionItem.swift; sourceTree = ""; }; D05B077121BFB9F600B1D27C /* FFMpeg.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = FFMpeg.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D05B077321BFC38600B1D27C /* FFMpeg.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = FFMpeg.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D05B724C1E720393000BD3AD /* SelectivePrivacySettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectivePrivacySettingsController.swift; sourceTree = ""; }; - D05D8B392192FC460064586F /* LocalizationListController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationListController.swift; sourceTree = ""; }; - D05D8B3E2192FC6E0064586F /* LocalizationListControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationListControllerNode.swift; sourceTree = ""; }; - D05D8B402192FC8A0064586F /* LocalizationListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationListItem.swift; sourceTree = ""; }; D060183F22F35D1C00796784 /* MergeLists.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MergeLists.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D060184122F35D2000796784 /* ActivityIndicator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ActivityIndicator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D060184322F35D2400796784 /* ProgressNavigationButtonNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ProgressNavigationButtonNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -981,12 +810,7 @@ D069F5CF212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerPanePeerSpecificSetupGridItem.swift; sourceTree = ""; }; D06BB8811F58994B0084FC30 /* LegacyInstantVideoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyInstantVideoController.swift; sourceTree = ""; }; D06E0F8D1F79ABFB003CF3DD /* ChatLoadingNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatLoadingNode.swift; sourceTree = ""; }; - D06E4AC31E84806300627D1D /* FetchPhotoLibraryImageResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchPhotoLibraryImageResource.swift; sourceTree = ""; }; - D06E4C322134A59700088087 /* ThemeAccentColorActionSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeAccentColorActionSheet.swift; sourceTree = ""; }; - D06E4C342134AE3C00088087 /* ThemeAutoNightSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeAutoNightSettingsController.swift; sourceTree = ""; }; D06F1EA31F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatHistorySearchContainerNode.swift; sourceTree = ""; }; - D06F31E3213597FF001A0F12 /* ThemeAutoNightTimeSelectionActionSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeAutoNightTimeSelectionActionSheet.swift; sourceTree = ""; }; - D06F31E52135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsBrightnessItem.swift; sourceTree = ""; }; D073CE621DCBBE5D007511FD /* MessageSent.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = MessageSent.caf; path = TelegramUI/Sounds/MessageSent.caf; sourceTree = ""; }; D073CE641DCBC26B007511FD /* ServiceSoundManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceSoundManager.swift; sourceTree = ""; }; D073CE701DCBF23F007511FD /* DeclareEncodables.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeclareEncodables.swift; sourceTree = ""; }; @@ -1004,7 +828,6 @@ D07551871DDA4BB50073E051 /* TelegramLegacyComponents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TelegramLegacyComponents.framework; path = "../TelegramLegacyComponents/build/Debug-iphoneos/TelegramLegacyComponents.framework"; sourceTree = ""; }; D075518E1DDA4F9E0073E051 /* SSignalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SSignalKit.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/SSignalKit.framework"; sourceTree = ""; }; D07551901DDA4FC70073E051 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; - D0760B231E9D015D00F1F3C4 /* PasscodeOptionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasscodeOptionsController.swift; sourceTree = ""; }; D077C5C022B59A800097D617 /* ApplicationContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationContext.swift; sourceTree = ""; }; D07827C61E01CD5900071108 /* VerticalListContextResultsChatInputPanelButtonItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerticalListContextResultsChatInputPanelButtonItem.swift; sourceTree = ""; }; D07A7DA21D957671005BCD27 /* ListMessageSnippetItemNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListMessageSnippetItemNode.swift; sourceTree = ""; }; @@ -1013,12 +836,10 @@ D07CFF731DCA207200761F81 /* PeerSelectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerSelectionController.swift; sourceTree = ""; }; D07CFF751DCA224100761F81 /* PeerSelectionControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerSelectionControllerNode.swift; sourceTree = ""; }; D07CFF861DCAAE5E00761F81 /* ForwardAccessoryPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ForwardAccessoryPanelNode.swift; sourceTree = ""; }; - D07E413C208A494D00FCA8F0 /* ProxyServerActionSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyServerActionSheetController.swift; sourceTree = ""; }; D087750F1E3F46A400A97350 /* ComposeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposeController.swift; sourceTree = ""; }; D08775111E3F46AB00A97350 /* ComposeControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposeControllerNode.swift; sourceTree = ""; }; D08775181E3F53FC00A97350 /* ContactMultiselectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactMultiselectionController.swift; sourceTree = ""; }; D087751B1E3F542500A97350 /* ContactMultiselectionControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactMultiselectionControllerNode.swift; sourceTree = ""; }; - D087751D1E3F579300A97350 /* CounterContollerTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CounterContollerTitleView.swift; sourceTree = ""; }; D08799EF22F649A600C4D6B3 /* TelegramBaseController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramBaseController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0879A0C22F64E4C00C4D6B3 /* DeviceLocationManager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeviceLocationManager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0879B1E22F7189600C4D6B3 /* AvatarNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AvatarNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1032,9 +853,7 @@ D0879C7322F874E100C4D6B3 /* PeerOnlineMarkerNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PeerOnlineMarkerNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0879C9522F875C000C4D6B3 /* PeerPresenceStatusManager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PeerPresenceStatusManager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0879CCB22F876DD00C4D6B3 /* ChatListSearchRecentPeersNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ChatListSearchRecentPeersNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D08984EF2114AE0C00918162 /* DataPrivacySettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataPrivacySettingsController.swift; sourceTree = ""; }; D08BDF631FA37BEA009D08E1 /* ChatRecordingPreviewInputPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecordingPreviewInputPanelNode.swift; sourceTree = ""; }; - D08BDF651FA8CB10009D08E1 /* EditSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditSettingsController.swift; sourceTree = ""; }; D08C367E1DB66A820064C744 /* ChatMediaInputPanelEntries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputPanelEntries.swift; sourceTree = ""; }; D08C36801DB66AAC0064C744 /* ChatMediaInputGridEntries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputGridEntries.swift; sourceTree = ""; }; D08C36821DB66AD40064C744 /* ChatMediaInputStickerGridItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputStickerGridItem.swift; sourceTree = ""; }; @@ -1044,7 +863,6 @@ D08D452C1D5E340300A7428A /* SwiftSignalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftSignalKit.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/SwiftSignalKit.framework"; sourceTree = ""; }; D08D452D1D5E340300A7428A /* TelegramCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TelegramCore.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/TelegramCore.framework"; sourceTree = ""; }; D091C7A31F8EBB1E00D7DE13 /* ChatPresentationData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatPresentationData.swift; sourceTree = ""; }; - D091C7A51F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsThemeWallpaperNode.swift; sourceTree = ""; }; D09250051FE5371D003F693F /* GlobalExperimentalSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalExperimentalSettings.swift; sourceTree = ""; }; D0943AFF1FDAE852001522CC /* ChatFeedNavigationInputPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatFeedNavigationInputPanelNode.swift; sourceTree = ""; }; D0943B041FDDFDA0001522CC /* OverlayInstantVideoNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayInstantVideoNode.swift; sourceTree = ""; }; @@ -1053,7 +871,6 @@ D099E21F229405BB00561B75 /* Weak.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Weak.swift; sourceTree = ""; }; D099EA1E1DE7450B001AF5A8 /* HorizontalListContextResultsChatInputContextPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalListContextResultsChatInputContextPanelNode.swift; sourceTree = ""; }; D099EA201DE7451D001AF5A8 /* HorizontalListContextResultsChatInputPanelItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalListContextResultsChatInputPanelItem.swift; sourceTree = ""; }; - D09D88721F86D56B00BEB4C9 /* AuthorizationLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorizationLayout.swift; sourceTree = ""; }; D09E637B1F0E7C28003444CD /* SharedMediaPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedMediaPlayer.swift; sourceTree = ""; }; D09E637E1F0E8C9F003444CD /* PeerMessagesMediaPlaylist.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerMessagesMediaPlaylist.swift; sourceTree = ""; }; D09E63AF1F1010FE003444CD /* Contacts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Contacts.framework; path = System/Library/Frameworks/Contacts.framework; sourceTree = SDKROOT; }; @@ -1076,10 +893,6 @@ D09E77A822FA5CEA00B9CCA7 /* TextFormat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TextFormat.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D09E77AA22FA5CEA00B9CCA7 /* Tuples.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Tuples.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D09E77AC22FA5CEA00B9CCA7 /* UrlEscaping.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UrlEscaping.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D0A11BF91E7836C20081CE03 /* ChangePhoneNumberIntroController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberIntroController.swift; sourceTree = ""; }; - D0A11BFB1E7840750081CE03 /* ChangePhoneNumberController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberController.swift; sourceTree = ""; }; - D0A11BFD1E7840A50081CE03 /* ChangePhoneNumberControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberControllerNode.swift; sourceTree = ""; }; - D0A8998C217A294100759EE6 /* SaveIncomingMediaController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveIncomingMediaController.swift; sourceTree = ""; }; D0AA840B1FEB2BA3005C6E91 /* OverlayPlayerControlsNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayPlayerControlsNode.swift; sourceTree = ""; }; D0AB0BB01D6718DA002C78E7 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; D0AB0BB21D6718EB002C78E7 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; @@ -1099,13 +912,7 @@ D0AEAE262080D6970013176E /* PaneSearchBarNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaneSearchBarNode.swift; sourceTree = ""; }; D0AEAE282080FD660013176E /* StickerPaneSearchGlobaltem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerPaneSearchGlobaltem.swift; sourceTree = ""; }; D0AF32391FB1D8D60097362B /* ChatOverlayNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatOverlayNavigationBar.swift; sourceTree = ""; }; - D0B21B14220D85DD003F741D /* TabBarAccountSwitchController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarAccountSwitchController.swift; sourceTree = ""; }; - D0B21B16220D85E7003F741D /* TabBarAccountSwitchControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarAccountSwitchControllerNode.swift; sourceTree = ""; }; D0B21B1E22156D92003F741D /* LegacyCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyCache.swift; sourceTree = ""; }; - D0B21B202215B539003F741D /* LogoutOptionsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoutOptionsController.swift; sourceTree = ""; }; - D0B37C5B1F8D22AE004252DF /* ThemeSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsController.swift; sourceTree = ""; }; - D0B37C5D1F8D26A8004252DF /* ThemeSettingsChatPreviewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsChatPreviewItem.swift; sourceTree = ""; }; - D0B37C5F1F8D286E004252DF /* ThemeSettingsFontSizeItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsFontSizeItem.swift; sourceTree = ""; }; D0B417C21D7DE54E004562A4 /* ChatPresentationInterfaceState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatPresentationInterfaceState.swift; sourceTree = ""; }; D0B4AF871EC112ED00D51FF6 /* CallKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CallKit.framework; path = System/Library/Frameworks/CallKit.framework; sourceTree = SDKROOT; }; D0B69C3820EBB397003632C7 /* ChatMessageInteractiveInstantVideoNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageInteractiveInstantVideoNode.swift; sourceTree = ""; }; @@ -1130,7 +937,6 @@ D0C0B59A1EE019E5000F4D2C /* ChatSearchNavigationContentNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatSearchNavigationContentNode.swift; sourceTree = ""; }; D0C0B59E1EE082F5000F4D2C /* ChatSearchInputPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatSearchInputPanelNode.swift; sourceTree = ""; }; D0C0B5B01EE1C421000F4D2C /* ChatDateSelectionSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatDateSelectionSheet.swift; sourceTree = ""; }; - D0C0B5B61EE1DEF1000F4D2C /* ThemeGridControllerItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridControllerItem.swift; sourceTree = ""; }; D0C12A1B1F33964900B3F66D /* ChatWallpaperBuiltin0.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = ChatWallpaperBuiltin0.jpg; path = TelegramUI/Resources/ChatWallpaperBuiltin0.jpg; sourceTree = ""; }; D0C12EAF1F9A8D1300600BB2 /* ListMessageDateHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListMessageDateHeader.swift; sourceTree = ""; }; D0C26D561FDF2388004ABF18 /* OpenChatMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenChatMessage.swift; sourceTree = ""; }; @@ -1145,7 +951,6 @@ D0C50E431E93FCD200F62E39 /* notification.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = notification.caf; path = TelegramUI/Sounds/notification.caf; sourceTree = ""; }; D0C932351E0988C60074F044 /* ChatButtonKeyboardInputNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatButtonKeyboardInputNode.swift; sourceTree = ""; }; D0C932371E09E0EA0074F044 /* ChatBotInfoItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatBotInfoItem.swift; sourceTree = ""; }; - D0C9323B1E0B4AE90074F044 /* DataAndStorageSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataAndStorageSettingsController.swift; sourceTree = ""; }; D0C9BFAC22FE316E00FAB518 /* ComposePollUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ComposePollUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0C9BFDE22FE349C00FAB518 /* AlertUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AlertUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0C9C00222FE37A500FAB518 /* TouchDownGesture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TouchDownGesture.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1199,12 +1004,8 @@ D0C9CBB52302B65600FAB518 /* LanguageSuggestionUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LanguageSuggestionUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0C9CBD62302C09000FAB518 /* TextSelectionNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TextSelectionNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0CAD90020AEECAC00ACD96E /* ChatEditInterfaceMessageState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatEditInterfaceMessageState.swift; sourceTree = ""; }; - D0CB27CE20C17A4A001ACF93 /* TermsOfServiceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfServiceController.swift; sourceTree = ""; }; - D0CB27D120C17A7F001ACF93 /* TermsOfServiceControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfServiceControllerNode.swift; sourceTree = ""; }; D0CCD61A222E8B4500EE1E08 /* TimeBasedVideoPreload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeBasedVideoPreload.swift; sourceTree = ""; }; - D0CE1BD21E51BC6100404327 /* DebugController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugController.swift; sourceTree = ""; }; D0CE67931F7DB45100FFB557 /* ChatMessageContactBubbleContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageContactBubbleContentNode.swift; sourceTree = ""; }; - D0CE6F6F213EEE5000BCD44B /* CreatePasswordController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatePasswordController.swift; sourceTree = ""; }; D0CE8CE41F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatTextInputAccessoryItem.swift; sourceTree = ""; }; D0CE8CE61F6F35A300AA2DB0 /* ChatTextInputPanelState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatTextInputPanelState.swift; sourceTree = ""; }; D0CFBB901FD881A600B65C0D /* AudioRecordningToneData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecordningToneData.swift; sourceTree = ""; }; @@ -1218,7 +1019,6 @@ D0D2686D1D7898A900C422DA /* ChatMessageSelectionNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageSelectionNode.swift; sourceTree = ""; }; D0D268991D79CF9F00C422DA /* ChatPanelInterfaceInteraction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatPanelInterfaceInteraction.swift; sourceTree = ""; }; D0D3281322F31B3000D07EE2 /* TelegramUpdateUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUpdateUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D0D4345B1F97CEAA00CC1806 /* ProxyServerSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyServerSettingsController.swift; sourceTree = ""; }; D0DC35431DE32230000195EB /* ChatInterfaceStateContextQueries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInterfaceStateContextQueries.swift; sourceTree = ""; }; D0DC35451DE35805000195EB /* MentionChatInputPanelItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MentionChatInputPanelItem.swift; sourceTree = ""; }; D0DC35491DE366CD000195EB /* CommandChatInputContextPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandChatInputContextPanelNode.swift; sourceTree = ""; }; @@ -1229,7 +1029,6 @@ D0DE77221D932043002B8809 /* PeerMediaCollectionInterfaceState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerMediaCollectionInterfaceState.swift; sourceTree = ""; }; D0DE77241D93225E002B8809 /* PeerMediaCollectionInterfaceStateButtons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerMediaCollectionInterfaceStateButtons.swift; sourceTree = ""; }; D0DE77261D932627002B8809 /* ChatHistoryNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatHistoryNode.swift; sourceTree = ""; }; - D0DE77281D932923002B8809 /* GridMessageSelectionNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GridMessageSelectionNode.swift; sourceTree = ""; }; D0DE772F1D934DEF002B8809 /* ListMessageItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListMessageItem.swift; sourceTree = ""; }; D0DE77311D940295002B8809 /* ListMessageFileItemNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListMessageFileItemNode.swift; sourceTree = ""; }; D0DF0C941D81B063008AEB01 /* ChatInterfaceStateContextMenus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInterfaceStateContextMenus.swift; sourceTree = ""; }; @@ -1239,9 +1038,6 @@ D0DF0C9D1D82141F008AEB01 /* ChatInterfaceInputContexts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInterfaceInputContexts.swift; sourceTree = ""; }; D0DF0CA01D821B28008AEB01 /* HashtagChatInputPanelItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HashtagChatInputPanelItem.swift; sourceTree = ""; }; D0DF0CA31D82BCD0008AEB01 /* MentionChatInputContextPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MentionChatInputContextPanelNode.swift; sourceTree = ""; }; - D0DFD5E11FCE2BA50039B3B1 /* CalculatingCacheSizeItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalculatingCacheSizeItem.swift; sourceTree = ""; }; - D0E23DD71E805E2600B9B6D2 /* FeaturedStickerPacksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeaturedStickerPacksController.swift; sourceTree = ""; }; - D0E23DDC1E8081A200B9B6D2 /* ArchivedStickerPacksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArchivedStickerPacksController.swift; sourceTree = ""; }; D0E2CE6B222930540084E3DD /* PrefetchManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefetchManager.swift; sourceTree = ""; }; D0E35A061DE4803400BC6096 /* VerticalListContextResultsChatInputContextPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerticalListContextResultsChatInputContextPanelNode.swift; sourceTree = ""; }; D0E35A081DE4804900BC6096 /* VerticalListContextResultsChatInputPanelItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerticalListContextResultsChatInputPanelItem.swift; sourceTree = ""; }; @@ -1299,8 +1095,6 @@ D0EB42041F3143AB00838FE6 /* LegacyComponentsResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = LegacyComponentsResources.bundle; path = ../LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle; sourceTree = ""; }; D0EB5ADE1F798033004E89B6 /* PeerMediaCollectionEmptyNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerMediaCollectionEmptyNode.swift; sourceTree = ""; }; D0EC55A2210231D600D1992C /* SearchPeerMembers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPeerMembers.swift; sourceTree = ""; }; - D0EC6B351EB88D0A00EBF1C3 /* ThemeGridController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridController.swift; sourceTree = ""; }; - D0EC6B371EB88D1600EBF1C3 /* ThemeGridControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridControllerNode.swift; sourceTree = ""; }; D0EC6B401EB8F7D700EBF1C3 /* VoipDynamic.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VoipDynamic.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/VoipDynamic.framework"; sourceTree = ""; }; D0EC6B421EB92DF600EBF1C3 /* OverlayMediaController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayMediaController.swift; sourceTree = ""; }; D0EC6B441EB92E5A00EBF1C3 /* OverlayMediaControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayMediaControllerNode.swift; sourceTree = ""; }; @@ -1310,7 +1104,6 @@ D0EC6EBC1EBA100F00EBF1C3 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; D0EE97191D88BCA0006C18E1 /* ChatInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInfo.swift; sourceTree = ""; }; D0EEE9A02165585F001292A6 /* DocumentPreviewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPreviewController.swift; sourceTree = ""; }; - D0EF40DC1E72F00E000DFCD4 /* SelectivePrivacySettingsPeersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectivePrivacySettingsPeersController.swift; sourceTree = ""; }; D0EF40DE1E73100D000DFCD4 /* ChatHistoryNavigationStack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatHistoryNavigationStack.swift; sourceTree = ""; }; D0F02CCB1E96EF350065DEE2 /* ChatMediaInputStickerPane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputStickerPane.swift; sourceTree = ""; }; D0F02CCD1E96FACE0065DEE2 /* ChatMediaInputGifPane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputGifPane.swift; sourceTree = ""; }; @@ -1318,7 +1111,6 @@ D0F3A8AA1E82D83E00B4C64C /* TelegramAccountAuxiliaryMethods.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramAccountAuxiliaryMethods.swift; sourceTree = ""; }; D0F3A8B51E83120A00B4C64C /* FetchResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchResource.swift; sourceTree = ""; }; D0F3A8B91E831E6300B4C64C /* FetchVideoMediaResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchVideoMediaResource.swift; sourceTree = ""; }; - D0F53BEB1E784DA900117362 /* ChangePhoneNumberCodeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberCodeController.swift; sourceTree = ""; }; D0F53BF61E79593500117362 /* AuthorizationSequenceSignUpController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizationSequenceSignUpController.swift; sourceTree = ""; }; D0F53BF81E79593F00117362 /* AuthorizationSequenceSignUpControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizationSequenceSignUpControllerNode.swift; sourceTree = ""; }; D0F69CD61D6B87D30046BCD6 /* MediaManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaManager.swift; sourceTree = ""; }; @@ -1360,10 +1152,6 @@ D0F7AB381DCFF87B009AD9A1 /* ChatMessageDateHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageDateHeader.swift; sourceTree = ""; }; D0FA08C7204982DC00DD23FC /* ChatTextInputActionButtonsNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatTextInputActionButtonsNode.swift; sourceTree = ""; }; D0FA08C92049BEAC00DD23FC /* ChatEmptyNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatEmptyNode.swift; sourceTree = ""; }; - D0FA0ABE1E76E17F005BB9B7 /* TwoStepVerificationPasswordEntryController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoStepVerificationPasswordEntryController.swift; sourceTree = ""; }; - D0FA0AC01E7725AA005BB9B7 /* TwoStepVerificationResetController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoStepVerificationResetController.swift; sourceTree = ""; }; - D0FA0AC41E77431A005BB9B7 /* InstalledStickerPacksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstalledStickerPacksController.swift; sourceTree = ""; }; - D0FA35001EA6127000E56FFA /* StorageUsageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageUsageController.swift; sourceTree = ""; }; D0FAB13D22EBC25300D8BED2 /* ChatMessageBubbleBackdrop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageBubbleBackdrop.swift; sourceTree = ""; }; D0FC194C201F82A000FEDBB2 /* OpenResolvedUrl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenResolvedUrl.swift; sourceTree = ""; }; D0FC40821D5B8E7400261D9D /* TelegramUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TelegramUI.h; sourceTree = ""; }; @@ -1379,6 +1167,16 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D03E495D230868DF0049C28B /* PersistentStringHash.framework in Frameworks */, + D03E493C2308679D0049C28B /* InstantPageCache.framework in Frameworks */, + D03E4910230866280049C28B /* GridMessageSelectionNode.framework in Frameworks */, + D03E48E4230864AB0049C28B /* CounterContollerTitleView.framework in Frameworks */, + D03E48A4230774380049C28B /* AuthorizationUI.framework in Frameworks */, + D03E487023076C500049C28B /* WallpaperResources.framework in Frameworks */, + D03E483823076AF30049C28B /* QrCode.framework in Frameworks */, + D03E480E230769AF0049C28B /* HexColor.framework in Frameworks */, + D03E47D7230767FF0049C28B /* UrlHandling.framework in Frameworks */, + D03E47B62307636E0049C28B /* SettingsUI.framework in Frameworks */, D03E46102305FD360049C28B /* ReactionSelectionNode.framework in Frameworks */, D03E45252305C07A0049C28B /* ShareItems.framework in Frameworks */, D03E44E22305BC900049C28B /* LegacyDataImport.framework in Frameworks */, @@ -1548,14 +1346,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0902838921931DA30067EFBD /* Language Suggestion */ = { - isa = PBXGroup; - children = ( - 0902838721931D960067EFBD /* LanguageSuggestionController.swift */, - ); - name = "Language Suggestion"; - sourceTree = ""; - }; 092F368B2154AAD6001A9F49 /* Fonts */ = { isa = PBXGroup; children = ( @@ -1606,37 +1396,6 @@ path = TelegramUI/Resources/WebEmbed; sourceTree = ""; }; - 09B4EE4821A6D34900847FA6 /* Recent Sessions */ = { - isa = PBXGroup; - children = ( - D05A32E91E6F143C002760B4 /* RecentSessionsController.swift */, - 09B4EE4621A6D33F00847FA6 /* RecentSessionsEmptyStateItem.swift */, - D05A32ED1E6F25A0002760B4 /* ItemListRecentSessionItem.swift */, - 09C500232142BA6400EF253E /* ItemListWebsiteItem.swift */, - ); - name = "Recent Sessions"; - sourceTree = ""; - }; - 09CE950F2237F3A300A7D2C3 /* Search */ = { - isa = PBXGroup; - children = ( - 09CE95052236D47F00A7D2C3 /* SettingsSearchItem.swift */, - 09CE95072237A53900A7D2C3 /* SettingsSearchableItems.swift */, - 09CE95092237B93500A7D2C3 /* SettingsSearchResultItem.swift */, - 09CE95102237F3C100A7D2C3 /* SettingsSearchRecentQueries.swift */, - 0947FCAD224043450086741C /* SettingsSearchRecentItem.swift */, - ); - name = Search; - sourceTree = ""; - }; - 09D304162173C13500C00567 /* Watch */ = { - isa = PBXGroup; - children = ( - 09D304172173C15700C00567 /* WatchSettingsController.swift */, - ); - name = Watch; - sourceTree = ""; - }; 09D9689B221F74AA00B1458A /* Title Activity Indicator */ = { isa = PBXGroup; children = ( @@ -1659,8 +1418,6 @@ D0C26D561FDF2388004ABF18 /* OpenChatMessage.swift */, D04ECD711FFBF22B00DE9029 /* OpenUrl.swift */, D0FC194C201F82A000FEDBB2 /* OpenResolvedUrl.swift */, - D023836F1DDF0462004018B6 /* UrlHandling.swift */, - 09E4A804223D4A5A0038140F /* OpenSettings.swift */, 09EC0DEC22CB583C00E7185B /* TextLinkHandling.swift */, ); name = Routing; @@ -1672,7 +1429,6 @@ D09250051FE5371D003F693F /* GlobalExperimentalSettings.swift */, D0068FA721760FA300D1B315 /* StoreDownloadedMedia.swift */, D0EC55A2210231D600D1992C /* SearchPeerMembers.swift */, - 09CE950D2237E45E00A7D2C3 /* CachedFaqInstantPage.swift */, ); name = Data; sourceTree = ""; @@ -1718,8 +1474,6 @@ children = ( D0BCC3D1203F0A6C008126C2 /* StringForMessageTimestampStatus.swift */, D00ACA592022897D0045D427 /* ProcessedPeerRestrictionText.swift */, - 0900678E21ED8E0E00530762 /* HexColor.swift */, - 0947FCAF224055990086741C /* StringHash.swift */, 09F2158C225CF5BC00AEDF6D /* Pasteboard.swift */, ); name = Strings; @@ -1825,21 +1579,10 @@ children = ( D02BE0761D9190EF000889C2 /* GridMessageItem.swift */, D0DE76F61D91BA3D002B8809 /* GridHoleItem.swift */, - D0DE77281D932923002B8809 /* GridMessageSelectionNode.swift */, ); name = "Grid Items"; sourceTree = ""; }; - D02C816F2177715A00CD1006 /* Notifications */ = { - isa = PBXGroup; - children = ( - D0579E6D2179178700495DC7 /* Exceptions */, - D01B279C1E394A500022A4C0 /* NotificationsAndSounds.swift */, - D02C81722177AC5900CD1006 /* NotificationSearchItem.swift */, - ); - name = Notifications; - sourceTree = ""; - }; D0383EE2207D291100C45548 /* Emojis */ = { isa = PBXGroup; children = ( @@ -1978,65 +1721,6 @@ name = Root; sourceTree = ""; }; - D0579E6D2179178700495DC7 /* Exceptions */ = { - isa = PBXGroup; - children = ( - 9F06830A21A404C4001D8EDB /* NotificationExceptionSettingsController.swift */, - 9F06830821A404AB001D8EDB /* NotificationExceptionControllerNode.swift */, - D02C81702177729000CD1006 /* NotificationExceptions.swift */, - ); - name = Exceptions; - sourceTree = ""; - }; - D05BFB4F1EA96EC100909D38 /* Themes */ = { - isa = PBXGroup; - children = ( - D091C7A51F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift */, - D0B37C5B1F8D22AE004252DF /* ThemeSettingsController.swift */, - D0B37C5D1F8D26A8004252DF /* ThemeSettingsChatPreviewItem.swift */, - D0B37C5F1F8D286E004252DF /* ThemeSettingsFontSizeItem.swift */, - D06F31E52135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift */, - 09A218F422A15F1400DE6898 /* ThemeSettingsAppIconItem.swift */, - 098CF79122B924E200AF6134 /* ThemeSettingsAccentColorItem.swift */, - 090E777822A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift */, - D06E4C322134A59700088087 /* ThemeAccentColorActionSheet.swift */, - D06E4C342134AE3C00088087 /* ThemeAutoNightSettingsController.swift */, - D06F31E3213597FF001A0F12 /* ThemeAutoNightTimeSelectionActionSheet.swift */, - D0EC6B351EB88D0A00EBF1C3 /* ThemeGridController.swift */, - D0EC6B371EB88D1600EBF1C3 /* ThemeGridControllerNode.swift */, - D0C0B5B61EE1DEF1000F4D2C /* ThemeGridControllerItem.swift */, - 09F85BA421E7821500D73170 /* ThemeGridSelectionPanelNode.swift */, - 09F664BF21EAAFAF00AB7E26 /* ThemeColorsGridController.swift */, - 09F664C121EAAFCB00AB7E26 /* ThemeColorsGridControllerNode.swift */, - 09F664C321EAB98300AB7E26 /* ThemeColorsGridControllerItem.swift */, - 09F664C521EB400A00AB7E26 /* ThemeGridSearchContentNode.swift */, - 09F664C721EB4A2600AB7E26 /* ThemeGridSearchItem.swift */, - 09F664C921EB4F2700AB7E26 /* ThemeGridSearchColorsItem.swift */, - 09F664CB21EB552C00AB7E26 /* WallpaperSearchRecentQueries.swift */, - 09F664CF21EBCFB900AB7E26 /* WallpaperCropNode.swift */, - 09DD5D5121ED175300D7007A /* WallpaperColorPickerNode.swift */, - 0900678C21ED5EA800530762 /* WallpaperColorPanelNode.swift */, - 0910B0F021FB3DE100F8F87D /* WallpaperPatternPanelNode.swift */, - 091417F121EF4E5D00C8325A /* WallpaperGalleryController.swift */, - 09749BCC21F23139008FDDE9 /* WallpaperGalleryDecorationNode.swift */, - 091417F321EF4F5F00C8325A /* WallpaperGalleryItem.swift */, - D05174AA1EAA5B4700A1BF36 /* WallpaperGalleryToolbarNode.swift */, - 09CE9512223825B700A7D2C3 /* CustomWallpaperPicker.swift */, - 0957DE2222DE28FB001B4D57 /* ThemePreviewController.swift */, - 0957DE2422DE2909001B4D57 /* ThemePreviewControllerNode.swift */, - 09B4819223028A4200D5B32B /* ThemeAccentColorController.swift */, - 09B4819423028A8A00D5B32B /* ThemeAccentColorControllerNode.swift */, - ); - name = Themes; - sourceTree = ""; - }; - D05D8B792195E00C0064586F /* Setup Two Step Verification */ = { - isa = PBXGroup; - children = ( - ); - name = "Setup Two Step Verification"; - sourceTree = ""; - }; D073CE611DCBBE09007511FD /* Sounds */ = { isa = PBXGroup; children = ( @@ -2061,7 +1745,6 @@ D07827CC1E03F32C00071108 /* Instant Page */ = { isa = PBXGroup; children = ( - 09CE95032236C6B300A7D2C3 /* CachedInstantPages.swift */, ); name = "Instant Page"; sourceTree = ""; @@ -2078,7 +1761,6 @@ D087751A1E3F540900A97350 /* Contact Multiselection */ = { isa = PBXGroup; children = ( - D087751D1E3F579300A97350 /* CounterContollerTitleView.swift */, D08775181E3F53FC00A97350 /* ContactMultiselectionController.swift */, D087751B1E3F542500A97350 /* ContactMultiselectionControllerNode.swift */, ); @@ -2088,6 +1770,16 @@ D08D45281D5E340200A7428A /* Frameworks */ = { isa = PBXGroup; children = ( + D03E495C230868DF0049C28B /* PersistentStringHash.framework */, + D03E493B2308679D0049C28B /* InstantPageCache.framework */, + D03E490F230866280049C28B /* GridMessageSelectionNode.framework */, + D03E48E3230864AB0049C28B /* CounterContollerTitleView.framework */, + D03E48A3230774380049C28B /* AuthorizationUI.framework */, + D03E486F23076C500049C28B /* WallpaperResources.framework */, + D03E483723076AF30049C28B /* QrCode.framework */, + D03E480D230769AF0049C28B /* HexColor.framework */, + D03E47D6230767FF0049C28B /* UrlHandling.framework */, + D03E47B52307636E0049C28B /* SettingsUI.framework */, D03E460F2305FD360049C28B /* ReactionSelectionNode.framework */, D03E45242305C07A0049C28B /* ShareItems.framework */, D03E44E12305BC900049C28B /* LegacyDataImport.framework */, @@ -2285,16 +1977,6 @@ name = "Shared Media Player"; sourceTree = ""; }; - D0AF7C441ED84BB000CD8E0F /* Language Selection */ = { - isa = PBXGroup; - children = ( - D05D8B392192FC460064586F /* LocalizationListController.swift */, - D05D8B3E2192FC6E0064586F /* LocalizationListControllerNode.swift */, - D05D8B402192FC8A0064586F /* LocalizationListItem.swift */, - ); - name = "Language Selection"; - sourceTree = ""; - }; D0B69C3A20EBD8B3003632C7 /* Device */ = { isa = PBXGroup; children = ( @@ -2413,38 +2095,6 @@ name = "Button Keyboard"; sourceTree = ""; }; - D0C9323A1E0B4AD40074F044 /* Data and Storage */ = { - isa = PBXGroup; - children = ( - D0C9323B1E0B4AE90074F044 /* DataAndStorageSettingsController.swift */, - D0223A951EA54D0D00211D94 /* VoiceCallDataSavingController.swift */, - D0223A9D1EA5732300211D94 /* NetworkUsageStatsController.swift */, - D0FA35001EA6127000E56FFA /* StorageUsageController.swift */, - D0DFD5E11FCE2BA50039B3B1 /* CalculatingCacheSizeItem.swift */, - D0185E872089ED5F005E1A6C /* ProxyListSettingsController.swift */, - D0D4345B1F97CEAA00CC1806 /* ProxyServerSettingsController.swift */, - D0185E89208A01AF005E1A6C /* ProxySettingsActionItem.swift */, - D0185E8B208A025A005E1A6C /* ProxySettingsServerItem.swift */, - D07E413C208A494D00FCA8F0 /* ProxyServerActionSheetController.swift */, - D0A8998C217A294100759EE6 /* SaveIncomingMediaController.swift */, - 099529A921CDB27900805E13 /* ShareProxyServerActionSheetController.swift */, - 09EDAD25220D30980012A50B /* AutodownloadConnectionTypeController.swift */, - 09EDAD2B2211552F0012A50B /* AutodownloadMediaCategoryController.swift */, - 09EDAD2D221164440012A50B /* AutodownloadSizeLimitItem.swift */, - 09EDAD2F221164530012A50B /* AutodownloadDataUsagePickerItem.swift */, - ); - name = "Data and Storage"; - sourceTree = ""; - }; - D0CB27D020C17A6D001ACF93 /* Terms of Service */ = { - isa = PBXGroup; - children = ( - D0CB27CE20C17A4A001ACF93 /* TermsOfServiceController.swift */, - D0CB27D120C17A7F001ACF93 /* TermsOfServiceControllerNode.swift */, - ); - name = "Terms of Service"; - sourceTree = ""; - }; D0D2686A1D788F6600C422DA /* Title Accessory Panels */ = { isa = PBXGroup; children = ( @@ -2671,8 +2321,6 @@ D0568AAC1DF198130022E7DA /* AudioWaveformNode.swift */, D0BC38621E3F9EFA0044D6FE /* EditableTokenListNode.swift */, D056CD6F1FF147B000880D28 /* IconButtonNode.swift */, - 09F85BA621E7DA5F00D73170 /* BlurredImageNode.swift */, - 09749BCE21F236F2008FDDE9 /* ModernCheckNode.swift */, ); name = Nodes; sourceTree = ""; @@ -2689,7 +2337,6 @@ D0F69E4E1D6B8BB90046BCD6 /* Media */, D0BC38681E3FB92B0044D6FE /* Compose */, D0D2689B1D79D31500C422DA /* Peer Selection */, - D0F69E791D6B8C3B0046BCD6 /* Settings */, D0C50E361E93CAF200F62E39 /* Notifications */, ); name = Controllers; @@ -2698,7 +2345,6 @@ D0F69DE71D6B8A590046BCD6 /* Authorization */ = { isa = PBXGroup; children = ( - D09D88721F86D56B00BEB4C9 /* AuthorizationLayout.swift */, D049EAF21E44DE2500A2CD3A /* AuthorizationSequenceController.swift */, D04BB2B61E44E5BB00650E93 /* Splash */, D04BB2B71E44E5CB00650E93 /* Phone Entry */, @@ -2866,35 +2512,6 @@ name = Items; sourceTree = ""; }; - D0F69E791D6B8C3B0046BCD6 /* Settings */ = { - isa = PBXGroup; - children = ( - 09CE950F2237F3A300A7D2C3 /* Search */, - 0902838921931DA30067EFBD /* Language Suggestion */, - D02C816F2177715A00CD1006 /* Notifications */, - D0FA0AC21E7742CE005BB9B7 /* Privacy and Security */, - D0C9323A1E0B4AD40074F044 /* Data and Storage */, - D0FA0AC31E7742EE005BB9B7 /* Stickers */, - D05BFB4F1EA96EC100909D38 /* Themes */, - 09D304162173C13500C00567 /* Watch */, - D0AF7C441ED84BB000CD8E0F /* Language Selection */, - D0CB27D020C17A6D001ACF93 /* Terms of Service */, - D01B279A1E39386C0022A4C0 /* SettingsController.swift */, - D08BDF651FA8CB10009D08E1 /* EditSettingsController.swift */, - D0CE1BD21E51BC6100404327 /* DebugController.swift */, - D03E5E081E55C49C0029569A /* DebugAccountsController.swift */, - D0528E671E65CB2C00E2FEF5 /* UsernameSetupController.swift */, - D0A11BF91E7836C20081CE03 /* ChangePhoneNumberIntroController.swift */, - D0A11BFB1E7840750081CE03 /* ChangePhoneNumberController.swift */, - D0A11BFD1E7840A50081CE03 /* ChangePhoneNumberControllerNode.swift */, - D0F53BEB1E784DA900117362 /* ChangePhoneNumberCodeController.swift */, - D0B21B14220D85DD003F741D /* TabBarAccountSwitchController.swift */, - D0B21B16220D85E7003F741D /* TabBarAccountSwitchControllerNode.swift */, - D0B21B202215B539003F741D /* LogoutOptionsController.swift */, - ); - name = Settings; - sourceTree = ""; - }; D0F69E7E1D6B8C500046BCD6 /* Supporting Files */ = { isa = PBXGroup; children = ( @@ -2920,7 +2537,6 @@ D01DBA9A209CC6AD00C64E64 /* ChatLinkPreview.swift */, 090B48C72200BCA8005083FA /* WallpaperUploadManager.swift */, 09D96898221DE92600B1458A /* ID3ArtworkReader.swift */, - 09E4A806223D4B860038140F /* AccountUtils.swift */, D099E21F229405BB00561B75 /* Weak.swift */, ); name = Utils; @@ -2933,11 +2549,8 @@ D04662801E68BA64006FAFC4 /* TransformOutgoingMessageMedia.swift */, D0F3A8B51E83120A00B4C64C /* FetchResource.swift */, D0F3A8B91E831E6300B4C64C /* FetchVideoMediaResource.swift */, - D06E4AC31E84806300627D1D /* FetchPhotoLibraryImageResource.swift */, D007019D2029EFDD006B9E34 /* ICloudResources.swift */, D01FB436217CEC62009C6134 /* FetchVideoThumbnail.swift */, - 099529AB21CDBBB200805E13 /* QRCode.swift */, - 0910B0EE21FA532D00F8F87D /* WallpaperResources.swift */, D0CCD61A222E8B4500EE1E08 /* TimeBasedVideoPreload.swift */, 09E2D9F0226F214000EA0AA4 /* EmojiResources.swift */, 09510B0E22F9347E0078CAB7 /* BundleResource.swift */, @@ -2945,39 +2558,6 @@ name = Resources; sourceTree = ""; }; - D0FA0AC21E7742CE005BB9B7 /* Privacy and Security */ = { - isa = PBXGroup; - children = ( - 09B4EE4821A6D34900847FA6 /* Recent Sessions */, - D05A32DD1E6F0097002760B4 /* PrivacyAndSecurityController.swift */, - D08984EF2114AE0C00918162 /* DataPrivacySettingsController.swift */, - D05A32EB1E6F1462002760B4 /* BlockedPeersController.swift */, - D05B724C1E720393000BD3AD /* SelectivePrivacySettingsController.swift */, - D0EF40DC1E72F00E000DFCD4 /* SelectivePrivacySettingsPeersController.swift */, - 09E4A802223B833B0038140F /* ForwardPrivacyChatPreviewItem.swift */, - D01C2AAA1E75E010001F6F9A /* TwoStepVerificationUnlockController.swift */, - D0FA0ABE1E76E17F005BB9B7 /* TwoStepVerificationPasswordEntryController.swift */, - D0FA0AC01E7725AA005BB9B7 /* TwoStepVerificationResetController.swift */, - D0760B231E9D015D00F1F3C4 /* PasscodeOptionsController.swift */, - D0CE6F6F213EEE5000BCD44B /* CreatePasswordController.swift */, - D04554A321B42982007A6DD9 /* ConfirmPhoneNumberController.swift */, - D05D8B792195E00C0064586F /* Setup Two Step Verification */, - 09DE2F262269D5730045E975 /* PrivacyIntroController.swift */, - 09DE2F282269D5E30045E975 /* PrivacyIntroControllerNode.swift */, - ); - name = "Privacy and Security"; - sourceTree = ""; - }; - D0FA0AC31E7742EE005BB9B7 /* Stickers */ = { - isa = PBXGroup; - children = ( - D0FA0AC41E77431A005BB9B7 /* InstalledStickerPacksController.swift */, - D0E23DD71E805E2600B9B6D2 /* FeaturedStickerPacksController.swift */, - D0E23DDC1E8081A200B9B6D2 /* ArchivedStickerPacksController.swift */, - ); - name = Stickers; - sourceTree = ""; - }; D0FC40751D5B8E7400261D9D = { isa = PBXGroup; children = ( @@ -3219,14 +2799,9 @@ D0383EE6207D299600C45548 /* EmojisChatInputPanelItem.swift in Sources */, D03E3D2B23045B120049C28B /* ChatMessageRestrictedBubbleContentNode.swift in Sources */, 09EDAD2A220DA6A40012A50B /* VolumeButtons.swift in Sources */, - D06E4C352134AE3C00088087 /* ThemeAutoNightSettingsController.swift in Sources */, D04281F6200E5AC2009DDE36 /* ChatRecentActionsControllerNode.swift in Sources */, - 09DD5D5221ED175300D7007A /* WallpaperColorPickerNode.swift in Sources */, D01848E821A03BDA00B6DEBD /* ChatSearchState.swift in Sources */, - 09D304182173C15700C00567 /* WatchSettingsController.swift in Sources */, - D0C0B5B71EE1DEF1000F4D2C /* ThemeGridControllerItem.swift in Sources */, D0943B001FDAE852001522CC /* ChatFeedNavigationInputPanelNode.swift in Sources */, - D0B37C601F8D286E004252DF /* ThemeSettingsFontSizeItem.swift in Sources */, D0EC6CC11EB9F58800EBF1C3 /* LegacyCamera.swift in Sources */, D0754D1E1EEDDF6200884F6E /* ChatMessageAttachedContentNode.swift in Sources */, D0CFBB911FD881A600B65C0D /* AudioRecordningToneData.swift in Sources */, @@ -3239,15 +2814,10 @@ D0EC6CCD1EB9F58800EBF1C3 /* DeclareEncodables.swift in Sources */, D0CFBB951FD8B05000B65C0D /* OverlayInstantVideoDecoration.swift in Sources */, D0EC6CCE1EB9F58800EBF1C3 /* AccountContext.swift in Sources */, - D0EC6CD11EB9F58800EBF1C3 /* UrlHandling.swift in Sources */, - 09F85BA521E7821500D73170 /* ThemeGridSelectionPanelNode.swift in Sources */, - 09CE950E2237E45E00A7D2C3 /* CachedFaqInstantPage.swift in Sources */, - 09F664CA21EB4F2700AB7E26 /* ThemeGridSearchColorsItem.swift in Sources */, D025402922E1F7F500AC0195 /* ChatTextInputSlowmodePlaceholderNode.swift in Sources */, D0380DB8204EE0A5000414AB /* ChatInstantVideoMessageDurationNode.swift in Sources */, D0EC6CDC1EB9F58800EBF1C3 /* TelegramAccountAuxiliaryMethods.swift in Sources */, D0642EFC1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift in Sources */, - D05D8B3F2192FC6E0064586F /* LocalizationListControllerNode.swift in Sources */, D0AA840C1FEB2BA3005C6E91 /* OverlayPlayerControlsNode.swift in Sources */, 09DD5D5021ECC3C400D7007A /* SuppressContactsWarning.swift in Sources */, D02B198A21F1DA9E0094A764 /* SharedAccountContext.swift in Sources */, @@ -3260,61 +2830,39 @@ D0EC6CFB1EB9F58800EBF1C3 /* ManagedAudioRecorder.swift in Sources */, D048B339203C532800038D05 /* ChatMediaInputPane.swift in Sources */, D0E817502012027900B82BBB /* ChatMessageEventLogPreviousLinkContentNode.swift in Sources */, - 0947FCAE224043450086741C /* SettingsSearchRecentItem.swift in Sources */, D0EC6CFD1EB9F58800EBF1C3 /* AudioWaveform.swift in Sources */, D0EC6CFF1EB9F58800EBF1C3 /* OverlayMediaController.swift in Sources */, D0EC6D001EB9F58800EBF1C3 /* OverlayMediaControllerNode.swift in Sources */, - D02C81712177729000CD1006 /* NotificationExceptions.swift in Sources */, - 09CE95112237F3C100A7D2C3 /* SettingsSearchRecentQueries.swift in Sources */, - 0910B0EF21FA532D00F8F87D /* WallpaperResources.swift in Sources */, - 09E4A807223D4B860038140F /* AccountUtils.swift in Sources */, D069F5D0212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift in Sources */, D06018B522F3659900796784 /* ChatTextFormat.swift in Sources */, D0750C8322B2E4EE00BE5F6E /* SharedNotificationManager.swift in Sources */, - D0A8998D217A294100759EE6 /* SaveIncomingMediaController.swift in Sources */, - D0185E8A208A01AF005E1A6C /* ProxySettingsActionItem.swift in Sources */, - 09DE2F272269D5730045E975 /* PrivacyIntroController.swift in Sources */, - 09E4A803223B833B0038140F /* ForwardPrivacyChatPreviewItem.swift in Sources */, - 09C500242142BA6400EF253E /* ItemListWebsiteItem.swift in Sources */, 09FFBCD72281BB2D00C33B4B /* ChatTextLinkEditController.swift in Sources */, - 09CE95042236C6B300A7D2C3 /* CachedInstantPages.swift in Sources */, D0B69C3920EBB397003632C7 /* ChatMessageInteractiveInstantVideoNode.swift in Sources */, D056CD701FF147B000880D28 /* IconButtonNode.swift in Sources */, D0FA08CA2049BEAC00DD23FC /* ChatEmptyNode.swift in Sources */, 09CE95002232729A00A7D2C3 /* StickerPaneSearchContentNode.swift in Sources */, D053DADC201AAAB100993D32 /* ChatTextInputMenu.swift in Sources */, D0C0B59B1EE019E5000F4D2C /* ChatSearchNavigationContentNode.swift in Sources */, - 09F664CC21EB552C00AB7E26 /* WallpaperSearchRecentQueries.swift in Sources */, D056CD781FF2A6EE00880D28 /* ChatMessageSwipeToReplyNode.swift in Sources */, D0CE67941F7DB45100FFB557 /* ChatMessageContactBubbleContentNode.swift in Sources */, - 09749BCD21F23139008FDDE9 /* WallpaperGalleryDecorationNode.swift in Sources */, - 09EDAD26220D30980012A50B /* AutodownloadConnectionTypeController.swift in Sources */, - D05D8B3A2192FC460064586F /* LocalizationListController.swift in Sources */, - D0B21B15220D85DD003F741D /* TabBarAccountSwitchController.swift in Sources */, D0ADF966212E05A300310BBC /* TonePlayer.swift in Sources */, D007019E2029EFDD006B9E34 /* ICloudResources.swift in Sources */, D0EC6D251EB9F58800EBF1C3 /* FetchCachedRepresentations.swift in Sources */, D0EC6D261EB9F58800EBF1C3 /* TransformOutgoingMessageMedia.swift in Sources */, D0EC6D271EB9F58800EBF1C3 /* FetchResource.swift in Sources */, - D09D88731F86D56B00BEB4C9 /* AuthorizationLayout.swift in Sources */, D0EC6D291EB9F58800EBF1C3 /* FetchVideoMediaResource.swift in Sources */, - 09EDAD2E221164440012A50B /* AutodownloadSizeLimitItem.swift in Sources */, 099529B421D3E5D800805E13 /* CheckDiskSpace.swift in Sources */, - D0EC6D2A1EB9F58800EBF1C3 /* FetchPhotoLibraryImageResource.swift in Sources */, D0EC6D2B1EB9F58800EBF1C3 /* FileMediaResourceStatus.swift in Sources */, 09510B0F22F9347E0078CAB7 /* BundleResource.swift in Sources */, D025402522E1E00100AC0195 /* ChatSlowmodeHintController.swift in Sources */, D0EC6D301EB9F58800EBF1C3 /* RadialProgressNode.swift in Sources */, D0EC6D311EB9F58800EBF1C3 /* RadialTimeoutNode.swift in Sources */, - 09CE950A2237B93500A7D2C3 /* SettingsSearchResultItem.swift in Sources */, - D0185E8C208A025A005E1A6C /* ProxySettingsServerItem.swift in Sources */, 090E63EE2196FE3A00E3C035 /* OpenAddContact.swift in Sources */, D06F1EA41F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift in Sources */, D0EC6D3A1EB9F58800EBF1C3 /* AudioWaveformNode.swift in Sources */, D0EC6D3B1EB9F58800EBF1C3 /* EditableTokenListNode.swift in Sources */, D0E2CE6C222930540084E3DD /* PrefetchManager.swift in Sources */, D0CE8CE51F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift in Sources */, - 09F664C621EB400A00AB7E26 /* ThemeGridSearchContentNode.swift in Sources */, 0962E67921B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift in Sources */, D0AEAE272080D6970013176E /* PaneSearchBarNode.swift in Sources */, D0EC6D531EB9F58800EBF1C3 /* ChatHistoryViewForLocation.swift in Sources */, @@ -3329,7 +2877,6 @@ D0EC6D591EB9F58800EBF1C3 /* ChatMessageThrottledProcessingManager.swift in Sources */, D025402722E1F23000AC0195 /* ChatSendButtonRadialStatusNode.swift in Sources */, D0BFAE4620AB04FB00793CF2 /* ChatRestrictedInputPanelNode.swift in Sources */, - 09EDAD30221164530012A50B /* AutodownloadDataUsagePickerItem.swift in Sources */, D06E0F8E1F79ABFB003CF3DD /* ChatLoadingNode.swift in Sources */, D0EC6D5A1EB9F58800EBF1C3 /* ListMessageItem.swift in Sources */, D0EC6D5B1EB9F58800EBF1C3 /* ListMessageNode.swift in Sources */, @@ -3339,24 +2886,16 @@ D0EC6D5E1EB9F58800EBF1C3 /* ListMessageHoleItem.swift in Sources */, D0EC6D5F1EB9F58800EBF1C3 /* GridMessageItem.swift in Sources */, D0EC6D601EB9F58800EBF1C3 /* GridHoleItem.swift in Sources */, - D0EC6D611EB9F58800EBF1C3 /* GridMessageSelectionNode.swift in Sources */, D0754D201EEDEBA000884F6E /* ChatMessageGameBubbleContentNode.swift in Sources */, D0B85C1E1FF6F76600E795B4 /* AuthorizationSequencePasswordRecoveryControllerNode.swift in Sources */, - 09B4EE4721A6D33F00847FA6 /* RecentSessionsEmptyStateItem.swift in Sources */, - 09F664C421EAB98300AB7E26 /* ThemeColorsGridControllerItem.swift in Sources */, - D07E413D208A494D00FCA8F0 /* ProxyServerActionSheetController.swift in Sources */, - D02C81732177AC5900CD1006 /* NotificationSearchItem.swift in Sources */, D018BE58218C7BD800C02DDC /* ChatMessageDeliveryFailedNode.swift in Sources */, D0EC6D681EB9F58800EBF1C3 /* AuthorizationSequenceController.swift in Sources */, - 09F664C021EAAFAF00AB7E26 /* ThemeColorsGridController.swift in Sources */, D0EC6D691EB9F58800EBF1C3 /* AuthorizationSequenceSplashController.swift in Sources */, - 09E4A805223D4A5A0038140F /* OpenSettings.swift in Sources */, D0EC6D6A1EB9F58800EBF1C3 /* AuthorizationSequenceSplashControllerNode.swift in Sources */, D0EC6D6D1EB9F58800EBF1C3 /* AuthorizationSequencePhoneEntryController.swift in Sources */, D0EC6D6E1EB9F58800EBF1C3 /* AuthorizationSequencePhoneEntryControllerNode.swift in Sources */, D0B85C211FF70BEC00E795B4 /* AuthorizationSequenceAwaitingAccountResetControllerNode.swift in Sources */, D0EC6D6F1EB9F58800EBF1C3 /* AuthorizationSequenceCodeEntryController.swift in Sources */, - 09F85BA721E7DA5F00D73170 /* BlurredImageNode.swift in Sources */, D0068FA821760FA300D1B315 /* StoreDownloadedMedia.swift in Sources */, D0EC6D701EB9F58800EBF1C3 /* AuthorizationSequenceCodeEntryControllerNode.swift in Sources */, D0EC6D711EB9F58800EBF1C3 /* AuthorizationSequencePasswordEntryController.swift in Sources */, @@ -3368,7 +2907,6 @@ D03AA4DF202DBF6F0056C405 /* ChatContextResultPeekContentNode.swift in Sources */, 0910B0ED21FA178C00F8F87D /* WallpaperPreviewMedia.swift in Sources */, D0EC6D811EB9F58800EBF1C3 /* ChatController.swift in Sources */, - D0B37C5E1F8D26A8004252DF /* ThemeSettingsChatPreviewItem.swift in Sources */, D0EC6D821EB9F58800EBF1C3 /* ChatControllerInteraction.swift in Sources */, D0EC6D831EB9F58800EBF1C3 /* ChatControllerNode.swift in Sources */, D0EC6D841EB9F58800EBF1C3 /* ChatHistoryEntry.swift in Sources */, @@ -3377,7 +2915,6 @@ D0EC6D861EB9F58800EBF1C3 /* ChatAvatarNavigationNode.swift in Sources */, D0EC6D871EB9F58800EBF1C3 /* ChatTitleView.swift in Sources */, D0EC6D881EB9F58800EBF1C3 /* ChatControllerTitlePanelNodeContainer.swift in Sources */, - 9F06830B21A404C4001D8EDB /* NotificationExceptionSettingsController.swift in Sources */, D0EC6D891EB9F58800EBF1C3 /* ChatSecretAutoremoveTimerActionSheet.swift in Sources */, D0EC6D8A1EB9F58800EBF1C3 /* ChatInfo.swift in Sources */, D0EC6D8B1EB9F58800EBF1C3 /* ChatHistoryNavigationStack.swift in Sources */, @@ -3388,7 +2925,6 @@ D0EC6D8E1EB9F58800EBF1C3 /* ChatMessageAvatarAccessoryItem.swift in Sources */, D0EC6D8F1EB9F58800EBF1C3 /* ChatMessageBubbleContentCalclulateImageCorners.swift in Sources */, D00817DD22B47A14008A895F /* LockedWindowCoveringView.swift in Sources */, - 0902838821931D960067EFBD /* LanguageSuggestionController.swift in Sources */, D0F19F6420E5A15B00EEC860 /* ChatMediaInputPeerSpecificItem.swift in Sources */, D0AEAE252080D6830013176E /* PaneSearchContainerNode.swift in Sources */, D01DBA9B209CC6AD00C64E64 /* ChatLinkPreview.swift in Sources */, @@ -3408,7 +2944,6 @@ D0E8174E2011FC3800B82BBB /* ChatMessageEventLogPreviousDescriptionContentNode.swift in Sources */, D0EC6D981EB9F58900EBF1C3 /* ChatMessageItemView.swift in Sources */, 09D304152173C0E900C00567 /* WatchManager.swift in Sources */, - 9F06830921A404AB001D8EDB /* NotificationExceptionControllerNode.swift in Sources */, D0EC6D991EB9F58900EBF1C3 /* ChatMessageMediaBubbleContentNode.swift in Sources */, D0EC6D9A1EB9F58900EBF1C3 /* ChatMessageReplyInfoNode.swift in Sources */, D0FE4DE41F0AEBB900E8A0B3 /* SharedVideoContextManager.swift in Sources */, @@ -3417,7 +2952,6 @@ D0EC6D9C1EB9F58900EBF1C3 /* ChatMessageInstantVideoItemNode.swift in Sources */, D0750C8222B2E4EE00BE5F6E /* SharedWakeupManager.swift in Sources */, D0EC6D9D1EB9F58900EBF1C3 /* ChatMessageTextBubbleContentNode.swift in Sources */, - 09F664D021EBCFB900AB7E26 /* WallpaperCropNode.swift in Sources */, D0EC6D9E1EB9F58900EBF1C3 /* ChatMessageWebpageBubbleContentNode.swift in Sources */, D0750C8722B2E76300BE5F6E /* ShareExtensionContext.swift in Sources */, D0EC6D9F1EB9F58900EBF1C3 /* ChatUnreadItem.swift in Sources */, @@ -3427,22 +2961,17 @@ D0EC6DA31EB9F58900EBF1C3 /* ChatMessageDateHeader.swift in Sources */, D0EC6DA41EB9F58900EBF1C3 /* ChatMessageActionButtonsNode.swift in Sources */, D0EC6DA51EB9F58900EBF1C3 /* ChatBotInfoItem.swift in Sources */, - D0B21B212215B539003F741D /* LogoutOptionsController.swift in Sources */, D0EC6DA71EB9F58900EBF1C3 /* ChatMessageBackground.swift in Sources */, D0EC6DA81EB9F58900EBF1C3 /* ChatInterfaceState.swift in Sources */, - D08BDF661FA8CB10009D08E1 /* EditSettingsController.swift in Sources */, D0EC6DA91EB9F58900EBF1C3 /* ChatPresentationInterfaceState.swift in Sources */, D0EC6DAA1EB9F58900EBF1C3 /* ChatPanelInterfaceInteraction.swift in Sources */, D0EC6DAB1EB9F58900EBF1C3 /* ChatInterfaceStateAccessoryPanels.swift in Sources */, D0EC6DAC1EB9F58900EBF1C3 /* ChatInterfaceStateInputPanels.swift in Sources */, D056CD761FF2A30900880D28 /* ChatSwipeToReplyRecognizer.swift in Sources */, D091C7A41F8EBB1E00D7DE13 /* ChatPresentationData.swift in Sources */, - 09A218F522A15F1400DE6898 /* ThemeSettingsAppIconItem.swift in Sources */, D0EC6DAD1EB9F58900EBF1C3 /* ChatInterfaceStateNavigationButtons.swift in Sources */, D0EC6DAE1EB9F58900EBF1C3 /* ChatInterfaceStateContextMenus.swift in Sources */, - 09DE2F292269D5E30045E975 /* PrivacyIntroControllerNode.swift in Sources */, D0EC6DAF1EB9F58900EBF1C3 /* ChatInterfaceInputContexts.swift in Sources */, - 09B4819323028A4200D5B32B /* ThemeAccentColorController.swift in Sources */, 0921F60E228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift in Sources */, D0EC6DB01EB9F58900EBF1C3 /* ChatInterfaceInputContextPanels.swift in Sources */, D0EC6DB11EB9F58900EBF1C3 /* ChatInterfaceInputNodes.swift in Sources */, @@ -3455,33 +2984,27 @@ D0EC6DB71EB9F58900EBF1C3 /* EditAccessoryPanelNode.swift in Sources */, D0EC6DB81EB9F58900EBF1C3 /* WebpagePreviewAccessoryPanelNode.swift in Sources */, D0EC6DB91EB9F58900EBF1C3 /* ChatInputNode.swift in Sources */, - 099529AC21CDBBB200805E13 /* QRCode.swift in Sources */, D0EC6DBA1EB9F58900EBF1C3 /* ChatMediaInputNode.swift in Sources */, D0EC6DBB1EB9F58900EBF1C3 /* ChatMediaInputStickerPane.swift in Sources */, - 0910B0F121FB3DE100F8F87D /* WallpaperPatternPanelNode.swift in Sources */, D0EC6DBC1EB9F58900EBF1C3 /* ChatMediaInputGifPane.swift in Sources */, D0EC6DBD1EB9F58900EBF1C3 /* ChatMediaInputPanelEntries.swift in Sources */, D008178222B47464008A895F /* NotificationContentContext.swift in Sources */, D0EC6DBE1EB9F58900EBF1C3 /* ChatMediaInputGridEntries.swift in Sources */, D0EC6DBF1EB9F58900EBF1C3 /* ChatMediaInputMetaSectionItemNode.swift in Sources */, D0EC6DC01EB9F58900EBF1C3 /* ChatMediaInputRecentGifsItem.swift in Sources */, - D06F31E4213597FF001A0F12 /* ThemeAutoNightTimeSelectionActionSheet.swift in Sources */, D0EC6DC11EB9F58900EBF1C3 /* ChatMediaInputTrendingItem.swift in Sources */, D0BCC3D620404CD8008126C2 /* ChatMessageActionSheetControllerNode.swift in Sources */, D0EC6DC21EB9F58900EBF1C3 /* ChatMediaInputStickerPackItem.swift in Sources */, D0EC6DC31EB9F58900EBF1C3 /* ChatMediaInputStickerGridItem.swift in Sources */, - 0947FCB0224055990086741C /* StringHash.swift in Sources */, D0C0B59F1EE082F5000F4D2C /* ChatSearchInputPanelNode.swift in Sources */, D0EC6DC61EB9F58900EBF1C3 /* MultiplexedSoftwareVideoSourceManager.swift in Sources */, D0EC6DC71EB9F58900EBF1C3 /* SampleBufferPool.swift in Sources */, - 0900678F21ED8E0E00530762 /* HexColor.swift in Sources */, D0EC6DC81EB9F58900EBF1C3 /* MultiplexedVideoNode.swift in Sources */, D0EC6DC91EB9F58900EBF1C3 /* SoftwareVideoLayerFrameManager.swift in Sources */, D0EC6DCA1EB9F58900EBF1C3 /* SoftwareVideoThumbnailLayer.swift in Sources */, D0754D221EEDF89900884F6E /* ChatMessageInvoiceBubbleContentNode.swift in Sources */, D0EC6DCB1EB9F58900EBF1C3 /* ChatMediaInputTrendingPane.swift in Sources */, D0EC6DCC1EB9F58900EBF1C3 /* ChatButtonKeyboardInputNode.swift in Sources */, - 099529AA21CDB27900805E13 /* ShareProxyServerActionSheetController.swift in Sources */, D0EC6DCD1EB9F58900EBF1C3 /* ChatInputContextPanelNode.swift in Sources */, D0EEE9A12165585F001292A6 /* DocumentPreviewController.swift in Sources */, D0EC6DCE1EB9F58900EBF1C3 /* StickersChatInputContextPanelNode.swift in Sources */, @@ -3499,7 +3022,6 @@ D04281F4200E5AB0009DDE36 /* ChatRecentActionsController.swift in Sources */, D0BFAE4E20AB1D7B00793CF2 /* DisabledContextResultsChatInputContextPanelNode.swift in Sources */, D020A9DA1FEAE675008C66F7 /* OverlayAudioPlayerController.swift in Sources */, - 09CE9513223825B700A7D2C3 /* CustomWallpaperPicker.swift in Sources */, D0E8174C2011F8A300B82BBB /* ChatMessageEventLogPreviousMessageContentNode.swift in Sources */, D0EC6DD91EB9F58900EBF1C3 /* HorizontalListContextResultsChatInputContextPanelNode.swift in Sources */, D0EC6DDA1EB9F58900EBF1C3 /* HorizontalListContextResultsChatInputPanelItem.swift in Sources */, @@ -3517,7 +3039,6 @@ D0EC6DE41EB9F58900EBF1C3 /* ChatUnblockInputPanelNode.swift in Sources */, D0CAD90120AEECAC00ACD96E /* ChatEditInterfaceMessageState.swift in Sources */, D0EC6DE51EB9F58900EBF1C3 /* SecretChatHandshakeStatusInputPanelNode.swift in Sources */, - 090E777922A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift in Sources */, D0EC6DE61EB9F58900EBF1C3 /* DeleteChatInputPanelNode.swift in Sources */, D0428200200E6A00009DDE36 /* ChatRecentActionsHistoryTransition.swift in Sources */, D0EC6DE71EB9F58900EBF1C3 /* ChatTitleAccessoryPanelNode.swift in Sources */, @@ -3530,39 +3051,26 @@ D0EC6DEC1EB9F58900EBF1C3 /* ChatToastAlertPanelNode.swift in Sources */, D0EC6DED1EB9F58900EBF1C3 /* ChatHistoryNavigationButtonNode.swift in Sources */, D0EC6DF51EB9F58900EBF1C3 /* PeerMediaCollectionController.swift in Sources */, - D06E4C332134A59700088087 /* ThemeAccentColorActionSheet.swift in Sources */, D0EC6DF61EB9F58900EBF1C3 /* PeerMediaCollectionControllerNode.swift in Sources */, D0EC6DF81EB9F58900EBF1C3 /* PeerMediaCollectionInterfaceState.swift in Sources */, D0EC6DF91EB9F58900EBF1C3 /* PeerMediaCollectionInterfaceStateButtons.swift in Sources */, - 09F664C821EB4A2600AB7E26 /* ThemeGridSearchItem.swift in Sources */, 09A218D9229EE1B600DE6898 /* HorizontalStickerGridItem.swift in Sources */, 09EC0DED22CB583C00E7185B /* TextLinkHandling.swift in Sources */, - D08984F02114AE0C00918162 /* DataPrivacySettingsController.swift in Sources */, - 09EDAD2C2211552F0012A50B /* AutodownloadMediaCategoryController.swift in Sources */, 090B48C82200BCA8005083FA /* WallpaperUploadManager.swift in Sources */, - D06F31E62135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift in Sources */, 09F2158D225CF5BC00AEDF6D /* Pasteboard.swift in Sources */, D0C26D571FDF2388004ABF18 /* OpenChatMessage.swift in Sources */, D007019C2029E8F2006B9E34 /* LegacyICloudFileController.swift in Sources */, - 09B4819523028A8A00D5B32B /* ThemeAccentColorControllerNode.swift in Sources */, D000CABC21F158AD0011B15D /* PrepareSecretThumbnailData.swift in Sources */, - D04554A421B42982007A6DD9 /* ConfirmPhoneNumberController.swift in Sources */, - D0D4345C1F97CEAA00CC1806 /* ProxyServerSettingsController.swift in Sources */, D08BDF641FA37BEA009D08E1 /* ChatRecordingPreviewInputPanelNode.swift in Sources */, D0943B071FDEC529001522CC /* InstantVideoRadialStatusNode.swift in Sources */, D0AD02EA1FFFEBEF00C1DCFF /* ChatMessageLiveLocationTextNode.swift in Sources */, D01C06B51FBB7720001561AB /* ChatMediaInputSettingsItem.swift in Sources */, - D091C7A61F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift in Sources */, D00817D922B47A14008A895F /* AppDelegate.swift in Sources */, - 091417F221EF4E5D00C8325A /* WallpaperGalleryController.swift in Sources */, D0FC194D201F82A000FEDBB2 /* OpenResolvedUrl.swift in Sources */, - 09CE95062236D47F00A7D2C3 /* SettingsSearchItem.swift in Sources */, D0AF323A1FB1D8D60097362B /* ChatOverlayNavigationBar.swift in Sources */, D0EC6E2B1EB9F58900EBF1C3 /* ComposeController.swift in Sources */, - 09749BCF21F236F2008FDDE9 /* ModernCheckNode.swift in Sources */, 0940932422E73DFB003846A3 /* ChatSendMessageActionSheetController.swift in Sources */, D0EC6E2C1EB9F58900EBF1C3 /* ComposeControllerNode.swift in Sources */, - D0EC6E2D1EB9F58900EBF1C3 /* CounterContollerTitleView.swift in Sources */, D0AEAE292080FD660013176E /* StickerPaneSearchGlobaltem.swift in Sources */, D0EC6E2E1EB9F58900EBF1C3 /* ContactMultiselectionController.swift in Sources */, D0EC6E2F1EB9F58900EBF1C3 /* ContactMultiselectionControllerNode.swift in Sources */, @@ -3574,84 +3082,40 @@ D00ACA5A2022897D0045D427 /* ProcessedPeerRestrictionText.swift in Sources */, D04203152037162700490EA5 /* MediaInputPaneTrendingItem.swift in Sources */, D0CE8CE71F6F35A300AA2DB0 /* ChatTextInputPanelState.swift in Sources */, - D0CE6F70213EEE5000BCD44B /* CreatePasswordController.swift in Sources */, 0940932622E73E12003846A3 /* ChatSendMessageActionSheetControllerNode.swift in Sources */, D00817D022B47A14008A895F /* WakeupManager.swift in Sources */, D0E8175920122FE100B82BBB /* ChatRecentActionsFilterController.swift in Sources */, - 0900678D21ED5EA800530762 /* WallpaperColorPanelNode.swift in Sources */, - 0957DE2522DE2909001B4D57 /* ThemePreviewControllerNode.swift in Sources */, 09A218DA229EE1B600DE6898 /* HorizontalStickersChatContextPanelNode.swift in Sources */, - 091417F421EF4F5F00C8325A /* WallpaperGalleryItem.swift in Sources */, D02F4AE91FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift in Sources */, 09510B1322F96E5B0078CAB7 /* ChatScheduleTimeController.swift in Sources */, - D0B37C5C1F8D22AE004252DF /* ThemeSettingsController.swift in Sources */, - D05D8B412192FC8A0064586F /* LocalizationListItem.swift in Sources */, D0380DAD204ED434000414AB /* LegacyLiveUploadInterface.swift in Sources */, - D0185E882089ED5F005E1A6C /* ProxyListSettingsController.swift in Sources */, D09250061FE5371D003F693F /* GlobalExperimentalSettings.swift in Sources */, D025A4231F79344500563950 /* FetchManager.swift in Sources */, - D0CB27CF20C17A4A001ACF93 /* TermsOfServiceController.swift in Sources */, D09E778F22FA239B00B9CCA7 /* ChatMessageContextControllerContentSource.swift in Sources */, D02B676320800A00001A864A /* PaneSearchBarPlaceholderItem.swift in Sources */, - 098CF79222B924E200AF6134 /* ThemeSettingsAccentColorItem.swift in Sources */, D0EC6E581EB9F58900EBF1C3 /* PeerSelectionController.swift in Sources */, D0EC6E591EB9F58900EBF1C3 /* PeerSelectionControllerNode.swift in Sources */, D0AB262921C307D7008F6685 /* ChatMessagePollBubbleContentNode.swift in Sources */, - D0EC6E5D1EB9F58900EBF1C3 /* PrivacyAndSecurityController.swift in Sources */, - D0EC6E5E1EB9F58900EBF1C3 /* ItemListRecentSessionItem.swift in Sources */, - D0EC6E5F1EB9F58900EBF1C3 /* RecentSessionsController.swift in Sources */, - D0EC6E601EB9F58900EBF1C3 /* BlockedPeersController.swift in Sources */, - D0EC6E611EB9F58900EBF1C3 /* SelectivePrivacySettingsController.swift in Sources */, - D0EC6E621EB9F58900EBF1C3 /* SelectivePrivacySettingsPeersController.swift in Sources */, - D0DFD5E21FCE2BA50039B3B1 /* CalculatingCacheSizeItem.swift in Sources */, - D0EC6E631EB9F58900EBF1C3 /* TwoStepVerificationUnlockController.swift in Sources */, - D0EC6E641EB9F58900EBF1C3 /* TwoStepVerificationPasswordEntryController.swift in Sources */, D01FB437217CEC62009C6134 /* FetchVideoThumbnail.swift in Sources */, - D0EC6E651EB9F58900EBF1C3 /* TwoStepVerificationResetController.swift in Sources */, - D0EC6E661EB9F58900EBF1C3 /* PasscodeOptionsController.swift in Sources */, - 09CE95082237A53900A7D2C3 /* SettingsSearchableItems.swift in Sources */, - D0EC6E671EB9F58900EBF1C3 /* DataAndStorageSettingsController.swift in Sources */, - D0EC6E681EB9F58900EBF1C3 /* VoiceCallDataSavingController.swift in Sources */, - D0EC6E691EB9F58900EBF1C3 /* NetworkUsageStatsController.swift in Sources */, - D0EC6E6A1EB9F58900EBF1C3 /* StorageUsageController.swift in Sources */, - D0EC6E6B1EB9F58900EBF1C3 /* InstalledStickerPacksController.swift in Sources */, - D0EC6E6C1EB9F58900EBF1C3 /* FeaturedStickerPacksController.swift in Sources */, D0B85C231FF70BF400E795B4 /* AuthorizationSequenceAwaitingAccountResetController.swift in Sources */, - D0EC6E6E1EB9F58900EBF1C3 /* ArchivedStickerPacksController.swift in Sources */, D0C0B5B11EE1C421000F4D2C /* ChatDateSelectionSheet.swift in Sources */, - D0EC6E731EB9F58900EBF1C3 /* WallpaperGalleryToolbarNode.swift in Sources */, D025A4261F79428E00563950 /* FetchManagerLocation.swift in Sources */, - D0EC6E741EB9F58900EBF1C3 /* ThemeGridController.swift in Sources */, - D0EC6E751EB9F58900EBF1C3 /* ThemeGridControllerNode.swift in Sources */, - D0EC6E761EB9F58900EBF1C3 /* SettingsController.swift in Sources */, D0FAB13E22EBC25300D8BED2 /* ChatMessageBubbleBackdrop.swift in Sources */, - D0EC6E771EB9F58900EBF1C3 /* NotificationsAndSounds.swift in Sources */, - D0EC6E7A1EB9F58900EBF1C3 /* DebugController.swift in Sources */, 09E2D9F1226F214000EA0AA4 /* EmojiResources.swift in Sources */, - D0EC6E7B1EB9F58900EBF1C3 /* DebugAccountsController.swift in Sources */, - D0EC6E7C1EB9F58900EBF1C3 /* UsernameSetupController.swift in Sources */, D0E8175B201254FA00B82BBB /* ChatRecentActionsEmptyNode.swift in Sources */, 09510B1522F96E6C0078CAB7 /* ChatScheduleTimeControllerNode.swift in Sources */, - D0EC6E7D1EB9F58900EBF1C3 /* ChangePhoneNumberIntroController.swift in Sources */, - D0EC6E7E1EB9F58900EBF1C3 /* ChangePhoneNumberController.swift in Sources */, - D0B21B17220D85E7003F741D /* TabBarAccountSwitchControllerNode.swift in Sources */, - D0EC6E7F1EB9F58900EBF1C3 /* ChangePhoneNumberControllerNode.swift in Sources */, - D0EC6E801EB9F58900EBF1C3 /* ChangePhoneNumberCodeController.swift in Sources */, D09E637C1F0E7C28003444CD /* SharedMediaPlayer.swift in Sources */, D0750C8522B2E52400BE5F6E /* ClearNotificationsManager.swift in Sources */, D0EC6E811EB9F58900EBF1C3 /* NotificationContainerController.swift in Sources */, D0EC6E821EB9F58900EBF1C3 /* NotificationContainerControllerNode.swift in Sources */, D0EC6E831EB9F58900EBF1C3 /* NotificationItemContainerNode.swift in Sources */, - D0CB27D220C17A7F001ACF93 /* TermsOfServiceControllerNode.swift in Sources */, D0EC6E841EB9F58900EBF1C3 /* NotificationItem.swift in Sources */, D0EC6E851EB9F58900EBF1C3 /* ChatMessageNotificationItem.swift in Sources */, D04281FE200E639A009DDE36 /* ChatRecentActionsTitleView.swift in Sources */, D0ACCB1C1EC5FF4B0079D8BF /* ChatMessageCallBubbleContentNode.swift in Sources */, D0EC6E891EB9F58900EBF1C3 /* FrameworkBundle.swift in Sources */, D0FA08C8204982DC00DD23FC /* ChatTextInputActionButtonsNode.swift in Sources */, - 09F664C221EAAFCB00AB7E26 /* ThemeColorsGridControllerNode.swift in Sources */, D0BCC3D420404CC7008126C2 /* ChatMessageActionSheetController.swift in Sources */, - 0957DE2322DE28FB001B4D57 /* ThemePreviewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/UrlHandling/Info.plist b/submodules/UrlHandling/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/UrlHandling/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/UrlHandling/Sources/UrlHandling.h b/submodules/UrlHandling/Sources/UrlHandling.h new file mode 100644 index 0000000000..55038fbe85 --- /dev/null +++ b/submodules/UrlHandling/Sources/UrlHandling.h @@ -0,0 +1,19 @@ +// +// UrlHandling.h +// UrlHandling +// +// Created by Peter on 8/17/19. +// Copyright © 2019 Telegram Messenger LLP. All rights reserved. +// + +#import + +//! Project version number for UrlHandling. +FOUNDATION_EXPORT double UrlHandlingVersionNumber; + +//! Project version string for UrlHandling. +FOUNDATION_EXPORT const unsigned char UrlHandlingVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/TelegramUI/TelegramUI/UrlHandling.swift b/submodules/UrlHandling/Sources/UrlHandling.swift similarity index 97% rename from submodules/TelegramUI/TelegramUI/UrlHandling.swift rename to submodules/UrlHandling/Sources/UrlHandling.swift index 9e818703f8..4a2c64af83 100644 --- a/submodules/TelegramUI/TelegramUI/UrlHandling.swift +++ b/submodules/UrlHandling/Sources/UrlHandling.swift @@ -12,13 +12,13 @@ import TelegramPresentationData import TelegramUIPreferences import AccountContext -enum ParsedInternalPeerUrlParameter { +public enum ParsedInternalPeerUrlParameter { case botStart(String) case groupBotStart(String) case channelMessage(Int32) } -enum ParsedInternalUrl { +public enum ParsedInternalUrl { case peerName(String, ParsedInternalPeerUrlParameter?) case peerId(PeerId) case privateMessage(MessageId) @@ -38,7 +38,7 @@ private enum ParsedUrl { case internalUrl(ParsedInternalUrl) } -func parseInternalUrl(query: String) -> ParsedInternalUrl? { +public func parseInternalUrl(query: String) -> ParsedInternalUrl? { var query = query if query.hasPrefix("s/") { query = String(query[query.index(query.startIndex, offsetBy: 2)...]) @@ -308,7 +308,7 @@ private func resolveInternalUrl(account: Account, url: ParsedInternalUrl) -> Sig } } -func isTelegramMeLink(_ url: String) -> Bool { +public func isTelegramMeLink(_ url: String) -> Bool { let schemes = ["http://", "https://", ""] let baseTelegramMePaths = ["telegram.me", "t.me"] for basePath in baseTelegramMePaths { @@ -322,7 +322,7 @@ func isTelegramMeLink(_ url: String) -> Bool { return false } -func parseProxyUrl(_ url: String) -> (host: String, port: Int32, username: String?, password: String?, secret: Data?)? { +public func parseProxyUrl(_ url: String) -> (host: String, port: Int32, username: String?, password: String?, secret: Data?)? { let schemes = ["http://", "https://", ""] let baseTelegramMePaths = ["telegram.me", "t.me"] for basePath in baseTelegramMePaths { @@ -344,7 +344,7 @@ func parseProxyUrl(_ url: String) -> (host: String, port: Int32, username: Strin return nil } -func parseWallpaperUrl(_ url: String) -> WallpaperUrlParameter? { +public func parseWallpaperUrl(_ url: String) -> WallpaperUrlParameter? { let schemes = ["http://", "https://", ""] let baseTelegramMePaths = ["telegram.me", "t.me"] for basePath in baseTelegramMePaths { @@ -366,7 +366,7 @@ func parseWallpaperUrl(_ url: String) -> WallpaperUrlParameter? { return nil } -func resolveUrlImpl(account: Account, url: String) -> Signal { +public func resolveUrlImpl(account: Account, url: String) -> Signal { let schemes = ["http://", "https://", ""] let baseTelegramMePaths = ["telegram.me", "t.me"] for basePath in baseTelegramMePaths { @@ -400,7 +400,7 @@ func resolveUrlImpl(account: Account, url: String) -> Signal Signal { +public func resolveInstantViewUrl(account: Account, url: String) -> Signal { return webpagePreview(account: account, url: url) |> mapToSignal { webpage -> Signal in if let webpage = webpage { diff --git a/submodules/UrlHandling/UrlHandling_Xcode.xcodeproj/project.pbxproj b/submodules/UrlHandling/UrlHandling_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..2c3ebf9469 --- /dev/null +++ b/submodules/UrlHandling/UrlHandling_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,575 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D03E47C82307677D0049C28B /* UrlHandling.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E47C62307677D0049C28B /* UrlHandling.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D03E47D3230767E90049C28B /* UrlHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E47D2230767E90049C28B /* UrlHandling.swift */; }; + D03E47DA230768180049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47D9230768170049C28B /* Foundation.framework */; }; + D03E47DC2307681E0049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47DB2307681D0049C28B /* UIKit.framework */; }; + D03E47DE2307681F0049C28B /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47DD2307681F0049C28B /* SwiftSignalKit.framework */; }; + D03E47E0230768230049C28B /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47DF230768230049C28B /* Postbox.framework */; }; + D03E47E22307682B0049C28B /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47E12307682B0049C28B /* TelegramCore.framework */; }; + D03E47E4230768330049C28B /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47E3230768330049C28B /* MtProtoKitDynamic.framework */; }; + D03E47E62307683B0049C28B /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47E52307683B0049C28B /* TelegramPresentationData.framework */; }; + D03E47E8230768420049C28B /* TelegramUIPreferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47E7230768420049C28B /* TelegramUIPreferences.framework */; }; + D03E47EA230768490049C28B /* AccountContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E47E9230768490049C28B /* AccountContext.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D03E47C32307677D0049C28B /* UrlHandling.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UrlHandling.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E47C62307677D0049C28B /* UrlHandling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UrlHandling.h; sourceTree = ""; }; + D03E47C72307677D0049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D03E47D2230767E90049C28B /* UrlHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UrlHandling.swift; sourceTree = ""; }; + D03E47D9230768170049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + D03E47DB2307681D0049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + D03E47DD2307681F0049C28B /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E47DF230768230049C28B /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E47E12307682B0049C28B /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E47E3230768330049C28B /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MtProtoKitDynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E47E52307683B0049C28B /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E47E7230768420049C28B /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E47E9230768490049C28B /* AccountContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AccountContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D03E47C02307677D0049C28B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D03E47EA230768490049C28B /* AccountContext.framework in Frameworks */, + D03E47E8230768420049C28B /* TelegramUIPreferences.framework in Frameworks */, + D03E47E62307683B0049C28B /* TelegramPresentationData.framework in Frameworks */, + D03E47E4230768330049C28B /* MtProtoKitDynamic.framework in Frameworks */, + D03E47E22307682B0049C28B /* TelegramCore.framework in Frameworks */, + D03E47E0230768230049C28B /* Postbox.framework in Frameworks */, + D03E47DE2307681F0049C28B /* SwiftSignalKit.framework in Frameworks */, + D03E47DC2307681E0049C28B /* UIKit.framework in Frameworks */, + D03E47DA230768180049C28B /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D03E47B92307677D0049C28B = { + isa = PBXGroup; + children = ( + D03E47C72307677D0049C28B /* Info.plist */, + D03E47C52307677D0049C28B /* Sources */, + D03E47C42307677D0049C28B /* Products */, + D03E47D8230768150049C28B /* Frameworks */, + ); + sourceTree = ""; + }; + D03E47C42307677D0049C28B /* Products */ = { + isa = PBXGroup; + children = ( + D03E47C32307677D0049C28B /* UrlHandling.framework */, + ); + name = Products; + sourceTree = ""; + }; + D03E47C52307677D0049C28B /* Sources */ = { + isa = PBXGroup; + children = ( + D03E47D2230767E90049C28B /* UrlHandling.swift */, + D03E47C62307677D0049C28B /* UrlHandling.h */, + ); + path = Sources; + sourceTree = ""; + }; + D03E47D8230768150049C28B /* Frameworks */ = { + isa = PBXGroup; + children = ( + D03E47E9230768490049C28B /* AccountContext.framework */, + D03E47E7230768420049C28B /* TelegramUIPreferences.framework */, + D03E47E52307683B0049C28B /* TelegramPresentationData.framework */, + D03E47E3230768330049C28B /* MtProtoKitDynamic.framework */, + D03E47E12307682B0049C28B /* TelegramCore.framework */, + D03E47DF230768230049C28B /* Postbox.framework */, + D03E47DD2307681F0049C28B /* SwiftSignalKit.framework */, + D03E47DB2307681D0049C28B /* UIKit.framework */, + D03E47D9230768170049C28B /* Foundation.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D03E47BE2307677D0049C28B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D03E47C82307677D0049C28B /* UrlHandling.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D03E47C22307677D0049C28B /* UrlHandling */ = { + isa = PBXNativeTarget; + buildConfigurationList = D03E47CB2307677D0049C28B /* Build configuration list for PBXNativeTarget "UrlHandling" */; + buildPhases = ( + D03E47BE2307677D0049C28B /* Headers */, + D03E47BF2307677D0049C28B /* Sources */, + D03E47C02307677D0049C28B /* Frameworks */, + D03E47C12307677D0049C28B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = UrlHandling; + productName = UrlHandling; + productReference = D03E47C32307677D0049C28B /* UrlHandling.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D03E47BA2307677D0049C28B /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1030; + ORGANIZATIONNAME = "Telegram Messenger LLP"; + TargetAttributes = { + D03E47C22307677D0049C28B = { + CreatedOnToolsVersion = 10.3; + LastSwiftMigration = 1030; + }; + }; + }; + buildConfigurationList = D03E47BD2307677D0049C28B /* Build configuration list for PBXProject "UrlHandling_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D03E47B92307677D0049C28B; + productRefGroup = D03E47C42307677D0049C28B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D03E47C22307677D0049C28B /* UrlHandling */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D03E47C12307677D0049C28B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D03E47BF2307677D0049C28B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D03E47D3230767E90049C28B /* UrlHandling.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D03E47C92307677D0049C28B /* 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; + }; + D03E47CA2307677D0049C28B /* 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; + }; + D03E47CC2307677D0049C28B /* 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.UrlHandling; + 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; + }; + D03E47CD2307677D0049C28B /* 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.UrlHandling; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D03E47CE230767B20049C28B /* 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; + }; + D03E47CF230767B20049C28B /* 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.UrlHandling; + 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; + }; + D03E47D0230767C00049C28B /* 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; + }; + D03E47D1230767C00049C28B /* 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.UrlHandling; + 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 */ + D03E47BD2307677D0049C28B /* Build configuration list for PBXProject "UrlHandling_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D03E47C92307677D0049C28B /* DebugAppStoreLLC */, + D03E47CE230767B20049C28B /* DebugHockeyapp */, + D03E47CA2307677D0049C28B /* ReleaseAppStoreLLC */, + D03E47D0230767C00049C28B /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D03E47CB2307677D0049C28B /* Build configuration list for PBXNativeTarget "UrlHandling" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D03E47CC2307677D0049C28B /* DebugAppStoreLLC */, + D03E47CF230767B20049C28B /* DebugHockeyapp */, + D03E47CD2307677D0049C28B /* ReleaseAppStoreLLC */, + D03E47D1230767C00049C28B /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D03E47BA2307677D0049C28B /* Project object */; +} diff --git a/submodules/WallpaperResources/Info.plist b/submodules/WallpaperResources/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/WallpaperResources/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/WallpaperResources/Sources/FrameworkBundle.swift b/submodules/WallpaperResources/Sources/FrameworkBundle.swift new file mode 100644 index 0000000000..8ca13d7d92 --- /dev/null +++ b/submodules/WallpaperResources/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/WallpaperResources/Sources/WallpaperResources.h b/submodules/WallpaperResources/Sources/WallpaperResources.h new file mode 100644 index 0000000000..90370b1a6e --- /dev/null +++ b/submodules/WallpaperResources/Sources/WallpaperResources.h @@ -0,0 +1,19 @@ +// +// WallpaperResources.h +// WallpaperResources +// +// Created by Peter on 8/17/19. +// Copyright © 2019 Telegram Messenger LLP. All rights reserved. +// + +#import + +//! Project version number for WallpaperResources. +FOUNDATION_EXPORT double WallpaperResourcesVersionNumber; + +//! Project version string for WallpaperResources. +FOUNDATION_EXPORT const unsigned char WallpaperResourcesVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/TelegramUI/TelegramUI/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift similarity index 96% rename from submodules/TelegramUI/TelegramUI/WallpaperResources.swift rename to submodules/WallpaperResources/Sources/WallpaperResources.swift index 3be6af48a8..d796c3a9fd 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -157,7 +157,7 @@ private func wallpaperDatas(account: Account, accountManager: AccountManager, fi } } -func wallpaperImage(account: Account, accountManager: AccountManager, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], alwaysShowThumbnailFirst: Bool = false, thumbnail: Bool = false, autoFetchFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { +public func wallpaperImage(account: Account, accountManager: AccountManager, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], alwaysShowThumbnailFirst: Bool = false, thumbnail: Bool = false, autoFetchFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { let signal = wallpaperDatas(account: account, accountManager: accountManager, fileReference: fileReference, representations: representations, alwaysShowThumbnailFirst: alwaysShowThumbnailFirst, thumbnail: thumbnail, autoFetchFullSize: autoFetchFullSize, synchronousLoad: synchronousLoad) return signal @@ -277,7 +277,7 @@ func wallpaperImage(account: Account, accountManager: AccountManager, fileRefere } } -enum PatternWallpaperDrawMode { +public enum PatternWallpaperDrawMode { case thumbnail case fastScreen case screen @@ -358,14 +358,14 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana } } -func patternWallpaperImage(account: Account, accountManager: AccountManager, representations: [ImageRepresentationWithReference], mode: PatternWallpaperDrawMode, autoFetchFullSize: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { +public func patternWallpaperImage(account: Account, accountManager: AccountManager, representations: [ImageRepresentationWithReference], mode: PatternWallpaperDrawMode, autoFetchFullSize: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { return patternWallpaperDatas(account: account, accountManager: accountManager, representations: representations, mode: mode, autoFetchFullSize: autoFetchFullSize) |> mapToSignal { (thumbnailData, fullSizeData, fullSizeComplete) in return patternWallpaperImageInternal(thumbnailData: thumbnailData, fullSizeData: fullSizeData, fullSizeComplete: fullSizeComplete, mode: mode) } } -func patternWallpaperImageInternal(thumbnailData: Data?, fullSizeData: Data?, fullSizeComplete: Bool, mode: PatternWallpaperDrawMode) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { +public func patternWallpaperImageInternal(thumbnailData: Data?, fullSizeData: Data?, fullSizeComplete: Bool, mode: PatternWallpaperDrawMode) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { var prominent = false if case .thumbnail = mode { prominent = true @@ -441,7 +441,7 @@ func patternWallpaperImageInternal(thumbnailData: Data?, fullSizeData: Data?, fu } } -func patternColor(for color: UIColor, intensity: CGFloat, prominent: Bool = false) -> UIColor { +public func patternColor(for color: UIColor, intensity: CGFloat, prominent: Bool = false) -> UIColor { var hue: CGFloat = 0.0 var saturation: CGFloat = 0.0 var brightness: CGFloat = 0.0 @@ -460,7 +460,7 @@ func patternColor(for color: UIColor, intensity: CGFloat, prominent: Bool = fals return .black } -func solidColor(_ color: UIColor) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { +public func solidColor(_ color: UIColor) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { return .single({ arguments in let context = DrawingContext(size: arguments.drawingSize, clear: true) @@ -486,7 +486,7 @@ private func builtinWallpaperData() -> Signal { } |> runOn(Queue.concurrentDefaultQueue()) } -func settingsBuiltinWallpaperImage(account: Account) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { +public func settingsBuiltinWallpaperImage(account: Account) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { return builtinWallpaperData() |> map { fullSizeImage in return { arguments in let context = DrawingContext(size: arguments.drawingSize, clear: true) @@ -517,7 +517,7 @@ func settingsBuiltinWallpaperImage(account: Account) -> Signal<(TransformImageAr } } -func photoWallpaper(postbox: Postbox, photoLibraryResource: PhotoLibraryMediaResource) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { +public func photoWallpaper(postbox: Postbox, photoLibraryResource: PhotoLibraryMediaResource) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { let thumbnail = fetchPhotoLibraryImage(localIdentifier: photoLibraryResource.localIdentifier, thumbnail: true) let fullSize = fetchPhotoLibraryImage(localIdentifier: photoLibraryResource.localIdentifier, thumbnail: false) diff --git a/submodules/WallpaperResources/WallpaperResources_Xcode.xcodeproj/project.pbxproj b/submodules/WallpaperResources/WallpaperResources_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..464d07d274 --- /dev/null +++ b/submodules/WallpaperResources/WallpaperResources_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,587 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D03E484A23076B4A0049C28B /* WallpaperResources.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E484823076B4A0049C28B /* WallpaperResources.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D03E485523076BB70049C28B /* WallpaperResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E485423076BB70049C28B /* WallpaperResources.swift */; }; + D03E485823076BCB0049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E485723076BCB0049C28B /* Foundation.framework */; }; + D03E485A23076BD00049C28B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E485923076BD00049C28B /* UIKit.framework */; }; + D03E485C23076BD10049C28B /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E485B23076BD10049C28B /* SwiftSignalKit.framework */; }; + D03E485E23076BD70049C28B /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E485D23076BD70049C28B /* Display.framework */; }; + D03E486023076BDD0049C28B /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E485F23076BDD0049C28B /* Postbox.framework */; }; + D03E486223076BE40049C28B /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E486123076BE40049C28B /* TelegramCore.framework */; }; + D03E486423076BEA0049C28B /* MediaResources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E486323076BEA0049C28B /* MediaResources.framework */; }; + D03E486623076BEF0049C28B /* ImageBlur.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E486523076BEF0049C28B /* ImageBlur.framework */; }; + D03E486823076BF60049C28B /* TinyThumbnail.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E486723076BF60049C28B /* TinyThumbnail.framework */; }; + D03E486A23076BFC0049C28B /* PhotoResources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E486923076BFC0049C28B /* PhotoResources.framework */; }; + D03E486C23076C020049C28B /* LocalMediaResources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E486B23076C020049C28B /* LocalMediaResources.framework */; }; + D03E487223076CF10049C28B /* FrameworkBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E487123076CF10049C28B /* FrameworkBundle.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D03E484523076B4A0049C28B /* WallpaperResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WallpaperResources.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E484823076B4A0049C28B /* WallpaperResources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WallpaperResources.h; sourceTree = ""; }; + D03E484923076B4A0049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D03E485423076BB70049C28B /* WallpaperResources.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperResources.swift; sourceTree = ""; }; + D03E485723076BCB0049C28B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + D03E485923076BD00049C28B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + D03E485B23076BD10049C28B /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E485D23076BD70049C28B /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E485F23076BDD0049C28B /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E486123076BE40049C28B /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E486323076BEA0049C28B /* MediaResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MediaResources.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E486523076BEF0049C28B /* ImageBlur.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ImageBlur.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E486723076BF60049C28B /* TinyThumbnail.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TinyThumbnail.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E486923076BFC0049C28B /* PhotoResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PhotoResources.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E486B23076C020049C28B /* LocalMediaResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LocalMediaResources.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03E487123076CF10049C28B /* FrameworkBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameworkBundle.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D03E484223076B4A0049C28B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D03E486C23076C020049C28B /* LocalMediaResources.framework in Frameworks */, + D03E486A23076BFC0049C28B /* PhotoResources.framework in Frameworks */, + D03E486823076BF60049C28B /* TinyThumbnail.framework in Frameworks */, + D03E486623076BEF0049C28B /* ImageBlur.framework in Frameworks */, + D03E486423076BEA0049C28B /* MediaResources.framework in Frameworks */, + D03E486223076BE40049C28B /* TelegramCore.framework in Frameworks */, + D03E486023076BDD0049C28B /* Postbox.framework in Frameworks */, + D03E485E23076BD70049C28B /* Display.framework in Frameworks */, + D03E485C23076BD10049C28B /* SwiftSignalKit.framework in Frameworks */, + D03E485A23076BD00049C28B /* UIKit.framework in Frameworks */, + D03E485823076BCB0049C28B /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D03E483B23076B4A0049C28B = { + isa = PBXGroup; + children = ( + D03E484923076B4A0049C28B /* Info.plist */, + D03E484723076B4A0049C28B /* Sources */, + D03E484623076B4A0049C28B /* Products */, + D03E485623076BC80049C28B /* Frameworks */, + ); + sourceTree = ""; + }; + D03E484623076B4A0049C28B /* Products */ = { + isa = PBXGroup; + children = ( + D03E484523076B4A0049C28B /* WallpaperResources.framework */, + ); + name = Products; + sourceTree = ""; + }; + D03E484723076B4A0049C28B /* Sources */ = { + isa = PBXGroup; + children = ( + D03E485423076BB70049C28B /* WallpaperResources.swift */, + D03E487123076CF10049C28B /* FrameworkBundle.swift */, + D03E484823076B4A0049C28B /* WallpaperResources.h */, + ); + path = Sources; + sourceTree = ""; + }; + D03E485623076BC80049C28B /* Frameworks */ = { + isa = PBXGroup; + children = ( + D03E486B23076C020049C28B /* LocalMediaResources.framework */, + D03E486923076BFC0049C28B /* PhotoResources.framework */, + D03E486723076BF60049C28B /* TinyThumbnail.framework */, + D03E486523076BEF0049C28B /* ImageBlur.framework */, + D03E486323076BEA0049C28B /* MediaResources.framework */, + D03E486123076BE40049C28B /* TelegramCore.framework */, + D03E485F23076BDD0049C28B /* Postbox.framework */, + D03E485D23076BD70049C28B /* Display.framework */, + D03E485B23076BD10049C28B /* SwiftSignalKit.framework */, + D03E485923076BD00049C28B /* UIKit.framework */, + D03E485723076BCB0049C28B /* Foundation.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D03E484023076B4A0049C28B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D03E484A23076B4A0049C28B /* WallpaperResources.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D03E484423076B4A0049C28B /* WallpaperResources */ = { + isa = PBXNativeTarget; + buildConfigurationList = D03E484D23076B4A0049C28B /* Build configuration list for PBXNativeTarget "WallpaperResources" */; + buildPhases = ( + D03E484023076B4A0049C28B /* Headers */, + D03E484123076B4A0049C28B /* Sources */, + D03E484223076B4A0049C28B /* Frameworks */, + D03E484323076B4A0049C28B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WallpaperResources; + productName = WallpaperResources; + productReference = D03E484523076B4A0049C28B /* WallpaperResources.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D03E483C23076B4A0049C28B /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1030; + ORGANIZATIONNAME = "Telegram Messenger LLP"; + TargetAttributes = { + D03E484423076B4A0049C28B = { + CreatedOnToolsVersion = 10.3; + LastSwiftMigration = 1030; + }; + }; + }; + buildConfigurationList = D03E483F23076B4A0049C28B /* Build configuration list for PBXProject "WallpaperResources_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D03E483B23076B4A0049C28B; + productRefGroup = D03E484623076B4A0049C28B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D03E484423076B4A0049C28B /* WallpaperResources */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D03E484323076B4A0049C28B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D03E484123076B4A0049C28B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D03E487223076CF10049C28B /* FrameworkBundle.swift in Sources */, + D03E485523076BB70049C28B /* WallpaperResources.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D03E484B23076B4A0049C28B /* 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; + }; + D03E484C23076B4A0049C28B /* 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; + }; + D03E484E23076B4A0049C28B /* 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.WallpaperResources; + 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; + }; + D03E484F23076B4A0049C28B /* 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.WallpaperResources; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D03E485023076B820049C28B /* 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; + }; + D03E485123076B820049C28B /* 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.WallpaperResources; + 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; + }; + D03E485223076B8D0049C28B /* 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; + }; + D03E485323076B8D0049C28B /* 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.WallpaperResources; + 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 */ + D03E483F23076B4A0049C28B /* Build configuration list for PBXProject "WallpaperResources_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D03E484B23076B4A0049C28B /* DebugAppStoreLLC */, + D03E485023076B820049C28B /* DebugHockeyapp */, + D03E484C23076B4A0049C28B /* ReleaseAppStoreLLC */, + D03E485223076B8D0049C28B /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D03E484D23076B4A0049C28B /* Build configuration list for PBXNativeTarget "WallpaperResources" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D03E484E23076B4A0049C28B /* DebugAppStoreLLC */, + D03E485123076B820049C28B /* DebugHockeyapp */, + D03E484F23076B4A0049C28B /* ReleaseAppStoreLLC */, + D03E485323076B8D0049C28B /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D03E483C23076B4A0049C28B /* Project object */; +} From d4060044488e9e6286f8275354eb6555bf217afa Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sun, 18 Aug 2019 23:19:55 +0300 Subject: [PATCH 10/16] Update reactions API --- .gitignore | 1 + .../MtProtoKit_Xcode.xcodeproj/project.pbxproj | 8 ++++---- .../AFNetworking/AFURLConnectionOperation.m | 2 -- submodules/TelegramApi/Sources/Api3.swift | 13 +++++-------- .../TelegramCore/MessageReactions.swift | 18 +++++++++--------- .../ReactionsMessageAttribute.swift | 18 +++++++++++------- .../TelegramUI/TelegramUI/ChatController.swift | 4 ++-- 7 files changed, 32 insertions(+), 32 deletions(-) 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/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/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/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/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/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 81d1c74510..9d97d9bba8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -542,7 +542,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: updatedMessages[0].id, reactions: [emoji]).start() + let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: updatedMessages[0].id, reaction: emoji).start() })) } actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ @@ -1530,7 +1530,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, reactions: [reaction]).start() + let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, reaction: reaction).start() }, requestMessageUpdate: { [weak self] id in if let strongSelf = self { strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(id) From 3086bfad29de65cfc334bbf85fe52d7db030a779 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Mon, 19 Aug 2019 12:19:48 +0300 Subject: [PATCH 11/16] mtprotokit fixes --- .../MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj | 4 ++-- .../thirdparty/AFNetworking/AFURLConnectionOperation.m | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj index 60b6cfeae6..21ab23b5a9 100644 --- a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj +++ b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj @@ -461,8 +461,8 @@ 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"; }; }; + 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 */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; D0CD98E31D74BAEB00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; D0CD98E41D74BAF400F41187 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F818AFF259007F1076 /* GCDAsyncSocket.m */; }; diff --git a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m index 59d5fa4058..1f3a5635a1 100644 --- a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m +++ b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m @@ -188,7 +188,7 @@ static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperat [_outputStream close]; } - [super dealloc]; + //[super dealloc]; } From 0230fa9b279d6f2cf079e7fd48666850b4e2a49d Mon Sep 17 00:00:00 2001 From: Peter <> Date: Mon, 19 Aug 2019 23:27:00 +0300 Subject: [PATCH 12/16] Update reactions animation --- .../Sources/ReactionGestureItem.swift | 21 +--- .../Sources/ReactionSelectionNode.swift | 113 ++++++++++++------ .../ReactionSwipeGestureRecognizer.swift | 44 ++++++- .../ReactionReply.imageset/Contents.json | 22 ++++ .../ReplyReaction@2x.png | Bin 0 -> 9714 bytes .../ReplyReaction@3x.png | Bin 0 -> 15430 bytes .../ChatMessageBubbleItemNode.swift | 48 ++++++-- 7 files changed, 179 insertions(+), 69 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@3x.png diff --git a/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift b/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift index a9ec62c03f..5a941f316c 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, file: TelegramMediaFile) + case reply } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift index 340530113c..1694dca4de 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift @@ -5,11 +5,7 @@ import Display import Postbox import TelegramCore -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 +13,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) @@ -34,11 +30,12 @@ private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat) -> UI private final class ReactionNode: ASDisplayNode { let reaction: ReactionGestureItem 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, reaction: ReactionGestureItem, maximizedReactionSize: CGFloat) { self.reaction = reaction self.animationNode = AnimatedStickerNode() @@ -47,18 +44,29 @@ private final class ReactionNode: ASDisplayNode { //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, _, file): + switch 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.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) + } + self.animationNode.visibility = true + self.animationNode.setup(account: account, resource: file.resource, width: Int(intrinsicSize.width) * 2, height: Int(intrinsicSize.height) * 2, 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() @@ -66,15 +74,17 @@ private final class ReactionNode: ASDisplayNode { //self.backgroundColor = .green 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) { 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) } func updateIsAnimating(_ isAnimating: Bool, animated: Bool) { @@ -87,43 +97,46 @@ private final class ReactionNode: ASDisplayNode { } final class ReactionSelectionNode: ASDisplayNode { + private let account: Account + 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() + private var shadowBlur: CGFloat = 8.0 + private var minimizedReactionSize: CGFloat = 30.0 + private var maximizedReactionSize: CGFloat = 60.0 + private var smallCircleSize: CGFloat = 8.0 + public init(account: Account, reactions: [ReactionGestureItem]) { + self.account = account + 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,18 +147,50 @@ 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 contentWidth: CGFloat = CGFloat(self.reactionNodes.count - 1) * (minimizedReactionSize) + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * reactionSpacing + + //contentWidth = CGFloat(self.reactionNodes.count - 1) * X + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * 0.2 * X + // contentWidth - maximizedReactionSize = CGFloat(self.reactionNodes.count - 1) * X + CGFloat(self.reactionNodes.count + 1) * 0.2 * X + // (contentWidth - maximizedReactionSize) / (CGFloat(self.reactionNodes.count - 1) + CGFloat(self.reactionNodes.count + 1) * 0.2) = X + let availableContentWidth = 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, reaction: reaction, maximizedReactionSize: self.maximizedReactionSize) + } + 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) + backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - contentWidth + backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0) self.backgroundNode.frame = backgroundFrame self.backgroundShadowNode.frame = backgroundFrame @@ -201,11 +246,11 @@ final class ReactionSelectionNode: ASDisplayNode { 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 - floor(self.smallCircleSize * 0.88) - (self.smallCircleSize + shadowBlur * 2.0) / 2.0, y: mainBubbleFrame.midY + floor(self.smallCircleSize * 4.0 / 3.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 } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift index 61b67da170..d9a0cc59bf 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) diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/Contents.json new file mode 100644 index 0000000000..41e8c1ebb6 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ReplyReaction@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ReplyReaction@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6578625abe9d2ed7fae04517643d19f26d4e072a GIT binary patch literal 9714 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d149f552b9a09e10fd2132151b70e4adb6ed6dfc GIT binary patch literal 15430 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 E0B3SAvj6}9 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 314bc7f4bc..6326abbc23 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -418,9 +418,6 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } } - if !item.controllerInteraction.canSetupReply(item.message) { - //return [] - } let reactions: [(String, String)] = [ ("😒", "Sad"), @@ -433,14 +430,23 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode var result: [ReactionGestureItem] = [] for (value, text) in reactions { if let file = item.associatedData.animatedEmojiStickers[value]?.file { - result.append(ReactionGestureItem(value: ReactionGestureItemValue(value: value, text: text, file: file))) + result.append(.reaction(value: value, text: text, file: file)) } } + if item.controllerInteraction.canSetupReply(item.message) { + result.append(.reply) + } return result } reactionRecognizer.getReactionContainer = { [weak self] in return self?.item?.controllerInteraction.reactionContainerNode() } + reactionRecognizer.began = { [weak self] in + guard let strongSelf = self, let item = strongSelf.item else { + return + } + item.controllerInteraction.cancelInteractiveKeyboardGestures() + } reactionRecognizer.updateOffset = { [weak self] offset, animated in guard let strongSelf = self else { return @@ -479,11 +485,11 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode guard let strongSelf = self, let item = strongSelf.item else { return } - if strongSelf.swipeToReplyNode == nil { - if strongSelf.swipeToReplyFeedback == nil { - strongSelf.swipeToReplyFeedback = HapticFeedback() - } - strongSelf.swipeToReplyFeedback?.tap() + if strongSelf.swipeToReplyFeedback == nil { + strongSelf.swipeToReplyFeedback = HapticFeedback() + } + strongSelf.swipeToReplyFeedback?.tap() + if strongSelf.swipeToReplyNode == nil, false { let swipeToReplyNode = ChatMessageSwipeToReplyNode(fillColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.shareButtonFillColor, wallpaper: item.presentationData.theme.wallpaper), strokeColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.shareButtonStrokeColor, wallpaper: item.presentationData.theme.wallpaper), foregroundColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.shareButtonForegroundColor, wallpaper: item.presentationData.theme.wallpaper)) strongSelf.swipeToReplyNode = swipeToReplyNode strongSelf.insertSubnode(swipeToReplyNode, belowSubnode: strongSelf.messageAccessibilityArea) @@ -497,8 +503,28 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode return } if let item = strongSelf.item, let reaction = reaction { - strongSelf.awaitingAppliedReaction = reaction.value.value - item.controllerInteraction.updateMessageReaction(item.message.id, reaction.value.value) + switch reaction { + case let .reaction(value, _, _): + strongSelf.awaitingAppliedReaction = value + item.controllerInteraction.updateMessageReaction(item.message.id, value) + case .reply: + strongSelf.reactionRecognizer?.complete(into: nil, hideTarget: false) + var bounds = strongSelf.bounds + let offset = bounds.origin.x + bounds.origin.x = 0.0 + strongSelf.bounds = bounds + if !offset.isZero { + strongSelf.layer.animateBoundsOriginXAdditive(from: offset, to: 0.0, duration: 0.2, timingFunction: kCAMediaTimingFunctionSpring) + } + if let swipeToReplyNode = strongSelf.swipeToReplyNode { + strongSelf.swipeToReplyNode = nil + swipeToReplyNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak swipeToReplyNode] _ in + swipeToReplyNode?.removeFromSupernode() + }) + swipeToReplyNode.layer.animateScale(from: 1.0, to: 0.2, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + } + item.controllerInteraction.setupReply(item.message.id) + } } else { strongSelf.reactionRecognizer?.complete(into: nil, hideTarget: false) var bounds = strongSelf.bounds From e85f81962362f104fa76e93768585c1d9ac6e39a Mon Sep 17 00:00:00 2001 From: overtake <> Date: Tue, 20 Aug 2019 19:05:30 +0300 Subject: [PATCH 13/16] - was scheduled flag for message. and local notifications either. [skip ci] --- submodules/Postbox/Postbox/Message.swift | 8 ++++++ .../AccountIntermediateState.swift | 10 +++++-- .../TelegramCore/AccountManager.swift | 1 + .../AccountStateManagementUtils.swift | 28 +++++++++++++++---- .../TelegramCore/AccountStateManager.swift | 9 ++++++ .../TelegramCore/StoreMessage_Telegram.swift | 11 ++++++++ .../WasScheduledMessageAttribute.swift | 17 +++++++++++ .../project.pbxproj | 6 ++++ 8 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 submodules/TelegramCore/TelegramCore/WasScheduledMessageAttribute.swift diff --git a/submodules/Postbox/Postbox/Message.swift b/submodules/Postbox/Postbox/Message.swift index d2f402bd53..e8aeba4e1a 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/TelegramCore/TelegramCore/AccountIntermediateState.swift b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift index 447163567f..1856238d8e 100644 --- a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift +++ b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift @@ -498,6 +498,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] @@ -509,6 +510,7 @@ struct AccountReplayedFinalState { struct AccountFinalStateEvents { let addedIncomingMessageIds: [MessageId] + let wasScheduledMessageIds:[MessageId] let updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]] let updatedWebpages: [MediaId: TelegramMediaWebpage] let updatedCalls: [Api.PhoneCall] @@ -521,11 +523,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 @@ -540,6 +543,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 @@ -574,6 +578,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 244df06a7f..5cb8d5b003 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -2110,16 +2110,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) } } } @@ -2128,7 +2136,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 { @@ -2888,5 +2906,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/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/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 01709b9ca6..93fa992764 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -349,6 +349,8 @@ 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 */; }; @@ -986,6 +988,7 @@ D049EAF41E44DF3300A2CD3A /* AccountState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountState.swift; sourceTree = ""; }; D04CAA591E83310D0047E51F /* MD5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MD5.swift; sourceTree = ""; }; D04D21362306EC9A00609388 /* MacInternalUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacInternalUpdater.swift; sourceTree = ""; }; + D04D213B230AC35A00609388 /* WasScheduledMessageAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WasScheduledMessageAttribute.swift; sourceTree = ""; }; D04D8FF3209A4B0700865719 /* NetworkSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSettings.swift; sourceTree = ""; }; D050F20F1E48AB0600988324 /* InteractivePhoneFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InteractivePhoneFormatter.swift; sourceTree = ""; }; D050F2501E4A59C200988324 /* JoinLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinLink.swift; sourceTree = ""; }; @@ -1409,6 +1412,7 @@ 09FC986A22FD882200915E37 /* OutgoingScheduleInfoMessageAttribute.swift */, D0329EA422FC5A9600F9F071 /* ReactionsMessageAttribute.swift */, D03E3D27230447960049C28B /* RestrictedContentMessageAttribute.swift */, + D04D213B230AC35A00609388 /* WasScheduledMessageAttribute.swift */, ); name = Attributes; sourceTree = ""; @@ -2273,6 +2277,7 @@ D049EAD81E43DAD200A2CD3A /* ManagedRecentStickers.swift in Sources */, D0BE303A20619EE800FBE6D8 /* SecureIdForm.swift in Sources */, D03DC9131F82F89D001D584C /* RegularChatState.swift in Sources */, + D04D213C230AC35A00609388 /* WasScheduledMessageAttribute.swift in Sources */, 0962E66721B59BAA00245FD9 /* ManagedAppConfigurationUpdates.swift in Sources */, D0613FCF1E60520700202CDB /* ChannelMembers.swift in Sources */, D0B2F7742052DEF700D3BFB9 /* TelegramDeviceContactImportInfo.swift in Sources */, @@ -2725,6 +2730,7 @@ 9F06831121A40DEC001D8EDB /* NotificationExceptionsList.swift in Sources */, D0AB262C21C3CE80008F6685 /* Polls.swift in Sources */, D073CE6C1DCBCF17007511FD /* TextEntitiesMessageAttribute.swift in Sources */, + D04D213D230AC35A00609388 /* WasScheduledMessageAttribute.swift in Sources */, D03C53751DAD5CA9004C17B3 /* TelegramUserPresence.swift in Sources */, D00580AF21E2A08900CB7CD3 /* AccountEnvironmentAttribute.swift in Sources */, D03E3D29230447960049C28B /* RestrictedContentMessageAttribute.swift in Sources */, From 606edad6cd68f8b55e6a59eb079aeaf2d944e385 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 20 Aug 2019 23:17:09 +0300 Subject: [PATCH 14/16] Reactions in context menu --- .../Sources/AnimatedStickerNode.swift | 48 +- .../ContextUI_Xcode.xcodeproj/project.pbxproj | 8 + .../ContextUI/Sources/ContextActionNode.swift | 2 +- .../Sources/ContextContentSourceNode.swift | 1 + .../ContextUI/Sources/ContextController.swift | 190 +++++++- .../ContainedViewLayoutTransition.swift | 9 +- ...pLongTapOrDoubleTapGestureRecognizer.swift | 2 +- submodules/Display/Display/UIKitUtils.swift | 1 + .../Sources/ItemListStickerPackItem.swift | 2 +- .../project.pbxproj | 10 +- .../Sources/ReactionContextNode.swift | 423 ++++++++++++++++++ .../Sources/ReactionGestureItem.swift | 2 +- .../Sources/ReactionSelectionNode.swift | 134 ++++-- .../Sources/ReactionSelectionParentNode.swift | 7 +- .../Sources/StickerPackPreviewGridItem.swift | 2 +- .../Sources/StickerPreviewPeekContent.swift | 2 +- .../Report.imageset/ic_lt_report.pdf | Bin 4498 -> 4091 bytes .../TelegramUI/ChatController.swift | 68 +-- .../TelegramUI/ChatControllerNode.swift | 2 +- .../ChatInterfaceStateContextMenus.swift | 4 +- .../ChatMediaInputStickerGridItem.swift | 2 +- .../ChatMediaInputStickerPackItem.swift | 2 +- .../ChatMessageAnimatedStickerItemNode.swift | 2 +- .../ChatMessageBubbleContentNode.swift | 2 + .../ChatMessageBubbleItemNode.swift | 43 +- .../ChatMessageInteractiveMediaNode.swift | 2 +- .../TelegramUI/ChatMessageItemView.swift | 6 + .../ChatMessageTextBubbleContentNode.swift | 5 +- ...ListContextResultsChatInputPanelItem.swift | 2 +- .../HorizontalStickerGridItem.swift | 2 +- .../MediaInputPaneTrendingItem.swift | 2 +- .../NotificationContentContext.swift | 2 +- .../Resources/BuiltinReactions/celebrate.tgs | Bin 0 -> 21678 bytes .../Resources/BuiltinReactions/cry.tgs | Bin 0 -> 15707 bytes .../Resources/BuiltinReactions/heart.tgs | Bin 0 -> 56205 bytes .../Resources/BuiltinReactions/lol.tgs | Bin 0 -> 13754 bytes .../Resources/BuiltinReactions/meh.tgs | Bin 0 -> 5601 bytes .../Resources/BuiltinReactions/ok.tgs | Bin 0 -> 4938 bytes .../Resources/BuiltinReactions/poker.tgs | Bin 0 -> 2896 bytes .../Resources/BuiltinReactions/poop.tgs | Bin 0 -> 24522 bytes .../Resources/BuiltinReactions/sad.tgs | Bin 0 -> 3210 bytes .../Resources/BuiltinReactions/smile.tgs | Bin 0 -> 15364 bytes .../Resources/BuiltinReactions/surprised.tgs | Bin 0 -> 8648 bytes .../Resources/BuiltinReactions/thumbsup.tgs | Bin 0 -> 17922 bytes .../StickerPaneSearchStickerItem.swift | 2 +- .../project.pbxproj | 4 + .../Sources/TextSelectionNode.swift | 6 +- 47 files changed, 867 insertions(+), 134 deletions(-) create mode 100644 submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/celebrate.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/cry.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/heart.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/lol.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/meh.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/ok.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/poker.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/poop.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/sad.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/smile.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/surprised.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/thumbsup.tgs 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/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/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/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/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 5a941f316c..9b058db8ca 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift @@ -3,6 +3,6 @@ import Postbox import TelegramCore public enum ReactionGestureItem { - case reaction(value: String, text: String, file: TelegramMediaFile) + 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 1694dca4de..d8d0a005a3 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift @@ -4,6 +4,7 @@ import AnimationUI import Display import Postbox import TelegramCore +import TelegramPresentationData 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 @@ -27,41 +28,85 @@ private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat, shado })?.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, maximizedReactionSize: CGFloat) { + 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) self.imageNode = ASImageNode() switch reaction { - case let .reaction(value, _, file): + 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 += 8.0 - intrinsicSize.height += 8.0 - self.intrinsicOffset = CGPoint(x: 0.0, y: -4.0) + 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 += 20.0 - intrinsicSize.height += 20.0 - self.intrinsicOffset = CGPoint(x: 0.0, y: 4.0) + 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) } - self.animationNode.visibility = true - self.animationNode.setup(account: account, resource: file.resource, width: Int(intrinsicSize.width) * 2, height: Int(intrinsicSize.height) * 2, mode: .direct) + + 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) @@ -71,7 +116,8 @@ private final class ReactionNode: ASDisplayNode { super.init() - //self.backgroundColor = .green + self.textBackgroundNode.addSubnode(self.textNode) + self.addSubnode(self.textBackgroundNode) self.addSubnode(self.animationNode) self.addSubnode(self.imageNode) @@ -80,11 +126,17 @@ private final class ReactionNode: ASDisplayNode { 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) { @@ -98,6 +150,7 @@ 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 @@ -113,8 +166,11 @@ final class ReactionSelectionNode: ASDisplayNode { private var maximizedReactionSize: CGFloat = 60.0 private var smallCircleSize: CGFloat = 8.0 - public init(account: Account, reactions: [ReactionGestureItem]) { + 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() @@ -153,12 +209,7 @@ final class ReactionSelectionNode: ASDisplayNode { let initialAnchorX = startingPoint.x if isInitial && self.reactionNodes.isEmpty { - //let contentWidth: CGFloat = CGFloat(self.reactionNodes.count - 1) * (minimizedReactionSize) + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * reactionSpacing - - //contentWidth = CGFloat(self.reactionNodes.count - 1) * X + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * 0.2 * X - // contentWidth - maximizedReactionSize = CGFloat(self.reactionNodes.count - 1) * X + CGFloat(self.reactionNodes.count + 1) * 0.2 * X - // (contentWidth - maximizedReactionSize) / (CGFloat(self.reactionNodes.count - 1) + CGFloat(self.reactionNodes.count + 1) * 0.2) = X - let availableContentWidth = max(100.0, initialAnchorX) + 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) @@ -177,7 +228,7 @@ final class ReactionSelectionNode: ASDisplayNode { } self.reactionNodes = self.reactions.map { reaction -> ReactionNode in - return ReactionNode(account: self.account, reaction: reaction, maximizedReactionSize: self.maximizedReactionSize) + return ReactionNode(account: self.account, theme: self.theme, reaction: reaction, maximizedReactionSize: self.maximizedReactionSize, loadFirstFrame: true) } self.reactionNodes.forEach(self.addSubnode(_:)) } @@ -190,8 +241,15 @@ final class ReactionSelectionNode: ASDisplayNode { 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: initialAnchorX - contentWidth + backgroundHeight / 2.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 @@ -200,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 @@ -209,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 { @@ -239,7 +301,7 @@ 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) @@ -250,7 +312,7 @@ final class ReactionSelectionNode: ASDisplayNode { self.bubbleNodes[1].0.frame = mainBubbleFrame self.bubbleNodes[1].1.frame = mainBubbleFrame - let secondaryBubbleFrame = CGRect(origin: CGPoint(x: mainBubbleFrame.midX - floor(self.smallCircleSize * 0.88) - (self.smallCircleSize + shadowBlur * 2.0) / 2.0, y: mainBubbleFrame.midY + floor(self.smallCircleSize * 4.0 / 3.0) - (self.smallCircleSize + shadowBlur * 2.0) / 2.0), size: CGSize(width: self.smallCircleSize + shadowBlur * 2.0, height: self.smallCircleSize + 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 } @@ -262,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/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/TelegramUI/Images.xcassets/Chat/Context Menu/Report.imageset/ic_lt_report.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Report.imageset/ic_lt_report.pdf index e64504330fd2a86e8562113fbe81083f67a7a2c8..baf196a44059ffa95da217b175f9af9f2c307ecf 100644 GIT binary patch delta 681 zcmbQF{9ArPKz(e`?cBo#Jb$i>#4K2)IdjtAxtyP_GO~zhJ`my9WFIieN;5CvfZe3> znwk8&E;U;m4QiS3((a>>x1Z_kx!%50D>^N;HF>Xu7eI}XE_y<1x|D;@@$E`4(H4v<$)7p5HC`*275go> zRyn(v2bl|2zMPb|D}S}}?D`204nDv8HdAo6D7$7wvsnduM)gz9^C!k z`}T`%?|nAxbvmA?6}O;!3QJnm=d*K#6@KqeDwE(XO+U!Fz(XP8cKjFbT`Ip8o*{lR7YTEv=A{&u6s0ESf>`-USzM+H z1_~hB*vJ4TWHfm_pXlZUW<4GbLjwZ~LnC98$cb|+Q$KC6iHH{W*pABEnNeHua@V@Bss?%iFZ|};0r?bNJcO9sa z=eN5Z{X6H#T_5Sd-#hlZZ$D`lJnz|?Ubp$eZhQ9272I(9TIQfP`S$loE2rk}&Ak52 z=e&1R`UmStrAD?!-nC1g#~xgH^J>=qn)R=Yiz4Iq+T5=0erKdp|7F6d?-#?iC(M02 zC0yPuk?-O%flXEO?Pi2uw!3=a{o;EWOmnV2pP^D>vrt;*9aHRyPZP|3H zL+1?~;jPVqyj=$al}t*$7QRTkcJqa5o{Eu|;rrR)%bBDL7tIt*T{yefTuCYa&B_a> zo}N7y)0$mnxFK?9*@4_mS38zJW{%ypYx%R%*G5VnpAT5BVh;YZQ16iiPv7F!%a0<= zzRxL}H#2Hi@|2Gv%QdDh|0mx6{|F-^N z-1hx%pRd=Kd9~i`)%UL%_A3q~%Pdl|oqr?NC~V7<$Lx1L{=4&S`=5LNwrv03b=1Lm zav!4J^=GBZoJRAlVh6Y9^CKi+b^VaK_7#Nr-7=VC6o&pz`VPIfkVuUVcY;I~X zc@>{(y@io6x}1Tf5f=5>)L9y!>oqnvz%b9)!q^f+orMKhOaR%T#+GI#ljHd9;u8&1 z%+r!BOq0_LED{Y;fvMZjEXlyaILXjF$=D#x)Q-!Bpb~{x1v@*g;*!Lol8U0#G%gch NIB}_}y863u0RSWOx1az3 diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 9d97d9bba8..f18def73d2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -43,6 +43,7 @@ import PeerAvatarGalleryUI import PeerInfoUI import RaiseToListen import UrlHandling +import ReactionSelectionNode public enum ChatControllerPeekActions { case standard @@ -523,40 +524,49 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G break } } - let _ = contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: strongSelf.presentationInterfaceState, context: strongSelf.context, messages: updatedMessages, controllerInteraction: strongSelf.controllerInteraction, selectAll: selectAll, interfaceInteraction: strongSelf.interfaceInteraction).start(next: { actions in + let _ = combineLatest(queue: .mainQueue(), contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: strongSelf.presentationInterfaceState, context: strongSelf.context, messages: updatedMessages, controllerInteraction: strongSelf.controllerInteraction, selectAll: selectAll, interfaceInteraction: strongSelf.interfaceInteraction), loadedStickerPack(postbox: strongSelf.context.account.postbox, network: strongSelf.context.account.network, reference: .animatedEmoji, forceActualized: false)).start(next: { actions, animatedEmojiStickers in guard let strongSelf = self, !actions.isEmpty else { return } - var actions = actions - if ![Namespaces.Message.ScheduledCloud, Namespaces.Message.ScheduledLocal].contains(message.id.namespace) { - actions.insert(.action(ContextMenuActionItem(text: "Reaction", icon: { _ in nil }, action: { _, f in - guard let strongSelf = self else { - return - } - let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme) - var items: [ActionSheetItem] = [] - let emojis = ["👍", "😊", "🤔", "😔", "❤️"] - for emoji in emojis { - items.append(ActionSheetButtonItem(title: "\(emoji)", color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - guard let strongSelf = self else { - return - } - let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: updatedMessages[0].id, reaction: emoji).start() - })) - } - actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - }) - ])]) - strongSelf.chatDisplayNode.dismissInput() - strongSelf.present(actionSheet, in: .window(.root)) - f(.dismissWithoutContent) - })), at: 0) + let reactions: [(String, String, String)] = [ + ("😒", "Sad", "sad"), + ("😳", "Surprised", "surprised"), + ("😂", "Fun", "lol"), + ("👍", "Like", "thumbsup"), + ("❤", "Love", "heart"), + ] + + var reactionItems: [ReactionContextItem] = [] + for (value, text, name) in reactions { + if let path = frameworkBundle.path(forResource: name, ofType: "tgs", inDirectory: "BuiltinReactions") { + reactionItems.append(ReactionContextItem(value: value, text: text, path: path)) + } } - let controller = ContextController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, recognizer: recognizer) + let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: reactionItems, recognizer: recognizer) strongSelf.currentContextController = controller + controller.reactionSelected = { [weak controller] value in + guard let strongSelf = self, let message = updatedMessages.first else { + return + } + strongSelf.chatDisplayNode.historyNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? ChatMessageItemView, let item = itemNode.item { + if item.message.id == message.id { + itemNode.awaitingAppliedReaction = (value, { [weak itemNode] in + guard let controller = controller else { + return + } + if let itemNode = itemNode, let (targetNode, count) = itemNode.targetReactionNode(value: value) { + controller.dismissWithReaction(value: value, into: targetNode, hideNode: count == 1, completion: { + }) + } else { + controller.dismiss() + } + }) + } + } + } + let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: message.id, reaction: value).start() + } strongSelf.window?.presentInGlobalOverlay(controller) }) } diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 67793a7438..3eca14e4cf 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -212,7 +212,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.historyNodeContainer = ASDisplayNode() self.historyNodeContainer.addSubnode(self.historyNode) - self.reactionContainerNode = ReactionSelectionParentNode(account: context.account) + self.reactionContainerNode = ReactionSelectionParentNode(account: context.account, theme: chatPresentationInterfaceState.theme) self.historyNodeContainer.addSubnode(self.reactionContainerNode) self.loadingNode = ChatLoadingNode(theme: self.chatPresentationInterfaceState.theme, chatWallpaper: self.chatPresentationInterfaceState.chatWallpaper) diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift index 596232963e..1ea930f970 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift @@ -592,7 +592,7 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: } if !data.messageActions.options.intersection([.deleteLocally, .deleteGlobally]).isEmpty && isAction { actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_ContextMenuDelete, textColor: .destructive, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.primaryTextColor) + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor) }, action: { controller, f in interfaceInteraction.deleteMessages(messages, controller, f) }))) @@ -654,7 +654,7 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: if !data.messageActions.options.intersection([.deleteLocally, .deleteGlobally]).isEmpty && !isAction { let title = message.flags.isSending ? chatPresentationInterfaceState.strings.Conversation_ContextMenuCancelSending : chatPresentationInterfaceState.strings.Conversation_ContextMenuDelete actions.append(.action(ContextMenuActionItem(text: title, textColor: .destructive, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.primaryTextColor) + return generateTintedImage(image: UIImage(bundleImageName: message.flags.isSending ? "Chat/Context Menu/Clear" : "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor) }, action: { controller, f in interfaceInteraction.deleteMessages(selectAll ? messages : [message], controller, f) }))) diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift index d1b0ab25f5..8fa2250297 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift @@ -299,7 +299,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { self.didSetUpAnimationNode = true let dimensions = item.stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - self.animationNode?.setup(account: item.account, resource: item.stickerItem.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + self.animationNode?.setup(account: item.account, resource: .resource(item.stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift index 6314859f33..762479af04 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift @@ -177,7 +177,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { self.animatedStickerNode = animatedStickerNode animatedStickerNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) self.addSubnode(animatedStickerNode) - animatedStickerNode.setup(account: account, resource: resource, width: 80, height: 80, mode: .cached) + animatedStickerNode.setup(account: account, resource: .resource(resource), width: 80, height: 80, mode: .cached) } animatedStickerNode.visibility = self.visibilityStatus && loopAnimatedStickers if let animatedStickerNode = self.animatedStickerNode { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 9c1ba28f25..bc06ed281d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -304,7 +304,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if let file = file { let dimensions = file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedSize = isEmoji ? dimensions.aspectFilled(CGSize(width: 384.0, height: 384.0)) : dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)) - self.animationNode.setup(account: item.context.account, resource: file.resource, fitzModifier: fitzModifier, width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) + self.animationNode.setup(account: item.context.account, resource: .resource(file.resource), fitzModifier: fitzModifier, width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift index 9c64baca75..c1ac9f8340 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift @@ -108,6 +108,8 @@ class ChatMessageBubbleContentNode: ASDisplayNode { var item: ChatMessageBubbleContentItem? + var updateIsTextSelectionActive: ((Bool) -> Void)? + required override init() { super.init() } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 6326abbc23..32e0f85787 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -186,8 +186,6 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode private var tapRecognizer: TapLongTapOrDoubleTapGestureRecognizer? private var reactionRecognizer: ReactionSwipeGestureRecognizer? - private var awaitingAppliedReaction: String? - override var visibility: ListViewItemNodeVisibility { didSet { if self.visibility != oldValue { @@ -419,24 +417,24 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } - let reactions: [(String, String)] = [ - ("😒", "Sad"), - ("😳", "Surprised"), - //("🥳", "Fun"), - ("👍", "Like"), - ("❤", "Love"), + let reactions: [(String, String, String)] = [ + ("😒", "Sad", "sad"), + ("😳", "Surprised", "surprised"), + ("😂", "Fun", "lol"), + ("👍", "Like", "thumbsup"), + ("❤", "Love", "heart"), ] - var result: [ReactionGestureItem] = [] - for (value, text) in reactions { - if let file = item.associatedData.animatedEmojiStickers[value]?.file { - result.append(.reaction(value: value, text: text, file: file)) + var reactionItems: [ReactionGestureItem] = [] + for (value, text, name) in reactions { + if let path = frameworkBundle.path(forResource: name, ofType: "tgs", inDirectory: "BuiltinReactions") { + reactionItems.append(.reaction(value: value, text: text, path: path)) } } if item.controllerInteraction.canSetupReply(item.message) { - result.append(.reply) + reactionItems.append(.reply) } - return result + return reactionItems } reactionRecognizer.getReactionContainer = { [weak self] in return self?.item?.controllerInteraction.reactionContainerNode() @@ -505,7 +503,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode if let item = strongSelf.item, let reaction = reaction { switch reaction { case let .reaction(value, _, _): - strongSelf.awaitingAppliedReaction = value + strongSelf.awaitingAppliedReaction = (value, {}) item.controllerInteraction.updateMessageReaction(item.message.id, value) case .reply: strongSelf.reactionRecognizer?.complete(into: nil, hideTarget: false) @@ -1763,6 +1761,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode strongSelf.contextSourceNode.contentNode.addSubnode(contentNode) contentNode.visibility = strongSelf.visibility + contentNode.updateIsTextSelectionActive = { [weak strongSelf] value in + strongSelf?.contextSourceNode.updateDistractionFreeMode?(value) + } contentNode.updateIsExtractedToContextPreview(strongSelf.contextSourceNode.isExtractedToContextPreview) } } @@ -1945,7 +1946,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode strongSelf.updateSearchTextHighlightState() - if let awaitingAppliedReaction = strongSelf.awaitingAppliedReaction { + if let (awaitingAppliedReaction, f) = strongSelf.awaitingAppliedReaction { var bounds = strongSelf.bounds let offset = bounds.origin.x bounds.origin.x = 0.0 @@ -1972,6 +1973,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } strongSelf.reactionRecognizer?.complete(into: targetNode, hideTarget: hideTarget) + f() } } @@ -2801,4 +2803,13 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode override func addAccessoryItemNode(_ accessoryItemNode: ListViewAccessoryItemNode) { self.contextSourceNode.contentNode.addSubnode(accessoryItemNode) } + + override func targetReactionNode(value: String) -> (ASImageNode, Int)? { + for contentNode in self.contentNodes { + if let (reactionNode, count) = contentNode.reactionTargetNode(value: value) { + return (reactionNode, count) + } + } + return nil + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 8dca768f0c..84061192a0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -715,7 +715,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio strongSelf.animatedStickerNode = animatedStickerNode let dimensions = updatedAnimatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)) - animatedStickerNode.setup(account: context.account, resource: updatedAnimatedStickerFile.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animatedStickerNode.setup(account: context.account, resource: .resource(updatedAnimatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) strongSelf.insertSubnode(animatedStickerNode, aboveSubnode: strongSelf.imageNode) animatedStickerNode.visibility = strongSelf.visibility } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift index d61b357811..592d3a429e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift @@ -611,6 +611,8 @@ public class ChatMessageItemView: ListViewItemNode { var item: ChatMessageItem? var accessibilityData: ChatMessageAccessibilityData? + var awaitingAppliedReaction: (String, () -> Void)? + public required convenience init() { self.init(layerBacked: false) } @@ -788,4 +790,8 @@ public class ChatMessageItemView: ListViewItemNode { } } } + + func targetReactionNode(value: String) -> (ASImageNode, Int)? { + return nil + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 2168a835ff..37b0c219c8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -521,7 +521,9 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { override func updateIsExtractedToContextPreview(_ value: Bool) { if value { if self.textSelectionNode == nil, let item = self.item, let rootNode = item.controllerInteraction.chatControllerNode() { - let textSelectionNode = TextSelectionNode(theme: TextSelectionTheme(selection: item.presentationData.theme.theme.list.itemAccentColor.withAlphaComponent(0.5), knob: item.presentationData.theme.theme.list.itemAccentColor), textNode: self.textNode, present: { [weak self] c, a in + let textSelectionNode = TextSelectionNode(theme: TextSelectionTheme(selection: item.presentationData.theme.theme.list.itemAccentColor.withAlphaComponent(0.5), knob: item.presentationData.theme.theme.list.itemAccentColor), textNode: self.textNode, updateIsActive: { [weak self] value in + self?.updateIsTextSelectionActive?(value) + }, present: { [weak self] c, a in self?.item?.controllerInteraction.presentGlobalOverlayController(c, a) }, rootNode: rootNode, performAction: { [weak self] text, action in guard let strongSelf = self, let item = strongSelf.item else { @@ -535,6 +537,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { } } else if let textSelectionNode = self.textSelectionNode { self.textSelectionNode = nil + self.updateIsTextSelectionActive?(false) textSelectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak textSelectionNode] _ in textSelectionNode?.removeFromSupernode() }) diff --git a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift index 923495c013..fdc1f556ef 100644 --- a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift @@ -386,7 +386,7 @@ final class HorizontalListContextResultsChatInputPanelItemNode: ListViewItemNode } let dimensions = animatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: item.account, resource: animatedStickerFile.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(account: item.account, resource: .resource(animatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) } } diff --git a/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift index 44d68c2eb5..bba9baf876 100755 --- a/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift @@ -111,7 +111,7 @@ final class HorizontalStickerGridItemNode: GridItemNode { } let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: account, resource: item.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start()) } else { diff --git a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift index ba165be0e8..c305fa7165 100644 --- a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift +++ b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift @@ -118,7 +118,7 @@ final class TrendingTopItemNode: ASDisplayNode { } let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: account, resource: item.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.loadDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start()) } else { self.imageNode.setSignal(chatMessageSticker(account: account, file: item.file, small: true, synchronousLoad: synchronousLoads), attemptSynchronously: synchronousLoads) diff --git a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift index 9cc9abaa99..55a05c1cbc 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift @@ -286,7 +286,7 @@ public final class NotificationViewControllerImpl { let dimensions = fileReference.media.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 512.0, height: 512.0)) strongSelf.imageNode.setSignal(chatMessageAnimatedSticker(postbox: accountAndImage.0.postbox, file: fileReference.media, small: false, size: fittedDimensions)) - animatedStickerNode.setup(account: accountAndImage.0, resource: fileReference.media.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + animatedStickerNode.setup(account: accountAndImage.0, resource: .resource(fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) animatedStickerNode.visibility = true accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/celebrate.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/celebrate.tgs new file mode 100755 index 0000000000000000000000000000000000000000..1b27435dc874a260376457ab869bd7b5d6edbe96 GIT binary patch literal 21678 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�SSeW!q^Y($?r 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
c`>pxCXL52V_A13Xp&M-i~`p*{VVN{Haxy5Sff) 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/lol.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/lol.tgs new file mode 100755 index 0000000000000000000000000000000000000000..0ef8e8530e6590dbcab579cf0d1483ee645975b6 GIT binary patch literal 13754 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 ns**!R>zS=<^wyD5BcajN%J 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

vL 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�N8s9*!L;9!5f<5?dnO*$_xY=17=*Oo(H zgR=~+ec@$SQdI4woq`=WTyCx9BRAeCl$)}-=0IHTy-b|c+B({w9+o}BYt<)xJ6;Dj z9GiQ=#qX**NU$xh@Kp^_tf){;&GU^|nDz>vj(2s{XU3mBbsBSc{`yLr*M*s4@=7J$ z_OqAZtzj$K_=Mf971ldKA3S#&%N^MJtjF0{CK7@E%|$S|cITj#ZP!4He5;Xhwb!WJ ZwLiZb$q$rgN6h@-J5Hui?v)Fy`9DvgAaDQx literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/sad.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/sad.tgs new file mode 100755 index 0000000000000000000000000000000000000000..65af870f4f2320f5a4d0bfa8643b3e7c0bc1a72e GIT binary patch literal 3210 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�uftYH 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 Av;Y7A literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/surprised.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/surprised.tgs new file mode 100755 index 0000000000000000000000000000000000000000..a6d874da62a025f9cb1bbcf0f9ffef17fb946bd6 GIT binary patch literal 8648 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 a&Zyq8ncTj~&~i!{-2VsDfB_=MQ2_v3Z15NW literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/thumbsup.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/thumbsup.tgs new file mode 100755 index 0000000000000000000000000000000000000000..614c2fe0e7261b9679069b4f026c19f77cc22a0b GIT binary patch literal 17922 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 Void private let present: (ViewController, Any?) -> Void private weak var rootNode: ASDisplayNode? private let performAction: (String, TextSelectionAction) -> Void @@ -196,9 +197,10 @@ public final class TextSelectionNode: ASDisplayNode { private var currentRange: (Int, Int)? private var currentRects: [CGRect]? - public init(theme: TextSelectionTheme, textNode: TextNode, present: @escaping (ViewController, Any?) -> Void, rootNode: ASDisplayNode, performAction: @escaping (String, TextSelectionAction) -> Void) { + public init(theme: TextSelectionTheme, textNode: TextNode, updateIsActive: @escaping (Bool) -> Void, present: @escaping (ViewController, Any?) -> Void, rootNode: ASDisplayNode, performAction: @escaping (String, TextSelectionAction) -> Void) { self.theme = theme self.textNode = textNode + self.updateIsActive = updateIsActive self.present = present self.rootNode = rootNode self.performAction = performAction @@ -311,9 +313,11 @@ public final class TextSelectionNode: ASDisplayNode { } strongSelf.updateSelection(range: resultRange) strongSelf.displayMenu() + strongSelf.updateIsActive(true) } recognizer.clearSelection = { [weak self] in self?.dismissSelection() + self?.updateIsActive(false) } self.view.addGestureRecognizer(recognizer) } From ab4381a5204feb6169dd271efd9c99c94907a2b4 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 20 Aug 2019 23:24:40 +0300 Subject: [PATCH 15/16] Fix build --- .../libphonenumber_Xcode.xcodeproj/project.pbxproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj index 1a04b246b5..0ab88d79ef 100644 --- a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj +++ b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ D0208ABB2306E84F00A23503 /* libphonenumbermac.h in Headers */ = {isa = PBXBuildFile; fileRef = D0208AB92306E84F00A23503 /* libphonenumbermac.h */; }; - D0208ABC2306E84F00A23503 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D0208ABA2306E84F00A23503 /* Info.plist */; }; D0208ABF2306E85800A23503 /* NBMetadataCoreTest.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459B2305D1EF0049C28B /* NBMetadataCoreTest.h */; }; D0208AC02306E85800A23503 /* NBPhoneMetaDataGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A22305D1EF0049C28B /* NBPhoneMetaDataGenerator.h */; }; D0208AC12306E85800A23503 /* NBNumberFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45992305D1EF0049C28B /* NBNumberFormat.h */; }; @@ -324,7 +323,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D0208ABC2306E84F00A23503 /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From caa75cbc862f9192425e4734bb8803c254b38e90 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 20 Aug 2019 23:57:30 +0300 Subject: [PATCH 16/16] Cancel reaction gesture after long tap --- .../Sources/ReactionSwipeGestureRecognizer.swift | 4 ++++ .../TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift | 1 + 2 files changed, 5 insertions(+) diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift index d9a0cc59bf..ceb67815f1 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift @@ -170,4 +170,8 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { self.state = .ended } } + + public func cancel() { + self.state = .cancelled + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 32e0f85787..99371d7cfa 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -354,6 +354,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode guard let strongSelf = self else { return } + strongSelf.reactionRecognizer?.cancel() if strongSelf.gestureRecognized(gesture: .longTap, location: point, recognizer: recognizer) { recognizer.cancel() }