mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Refactor CallListUI
This commit is contained in:
parent
733f1a47c6
commit
d4d1be5300
@ -382,6 +382,9 @@
|
||||
<FileRef
|
||||
location = "group:submodules/PasscodeUI/PasscodeUI_Xcode.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:submodules/CallListUI/CallListUI_Xcode.xcodeproj">
|
||||
</FileRef>
|
||||
</Group>
|
||||
<FileRef
|
||||
location = "group:submodules/TelegramUI/TelegramUI_Xcode.xcodeproj">
|
||||
|
@ -35,6 +35,7 @@
|
||||
D0C9C12322FE414700FAB518 /* PresentationSurfaceLevels.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9C12222FE414700FAB518 /* PresentationSurfaceLevels.swift */; };
|
||||
D0C9C3D72300CC2500FAB518 /* FetchMediaUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9C3D62300CC2400FAB518 /* FetchMediaUtils.swift */; };
|
||||
D0C9C3D92300CC6000FAB518 /* IsMediaStreamable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9C3D82300CC6000FAB518 /* IsMediaStreamable.swift */; };
|
||||
D0C9CA8A2302314400FAB518 /* ContactSelectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA892302314400FAB518 /* ContactSelectionController.swift */; };
|
||||
D0D3285422F329A900D07EE2 /* AccountContext.h in Headers */ = {isa = PBXBuildFile; fileRef = D0D3285222F329A900D07EE2 /* AccountContext.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
D0D3285F22F335B000D07EE2 /* AccountContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D3285E22F335B000D07EE2 /* AccountContext.swift */; };
|
||||
D0D3289D22F3461700D07EE2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D3289C22F3461700D07EE2 /* Foundation.framework */; };
|
||||
@ -73,6 +74,7 @@
|
||||
D0C9C12222FE414700FAB518 /* PresentationSurfaceLevels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationSurfaceLevels.swift; sourceTree = "<group>"; };
|
||||
D0C9C3D62300CC2400FAB518 /* FetchMediaUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchMediaUtils.swift; sourceTree = "<group>"; };
|
||||
D0C9C3D82300CC6000FAB518 /* IsMediaStreamable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IsMediaStreamable.swift; sourceTree = "<group>"; };
|
||||
D0C9CA892302314400FAB518 /* ContactSelectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactSelectionController.swift; sourceTree = "<group>"; };
|
||||
D0D3284F22F329A900D07EE2 /* AccountContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AccountContext.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0D3285222F329A900D07EE2 /* AccountContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccountContext.h; sourceTree = "<group>"; };
|
||||
D0D3285322F329A900D07EE2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
@ -149,6 +151,7 @@
|
||||
D0C9C12222FE414700FAB518 /* PresentationSurfaceLevels.swift */,
|
||||
D0C9C3D62300CC2400FAB518 /* FetchMediaUtils.swift */,
|
||||
D0C9C3D82300CC6000FAB518 /* IsMediaStreamable.swift */,
|
||||
D0C9CA892302314400FAB518 /* ContactSelectionController.swift */,
|
||||
);
|
||||
path = Sources;
|
||||
sourceTree = "<group>";
|
||||
@ -258,6 +261,7 @@
|
||||
D0879B7122F8425B00C4D6B3 /* WallpaperUploadManager.swift in Sources */,
|
||||
D0879B6722F7AE6400C4D6B3 /* PresentationCallManager.swift in Sources */,
|
||||
D0879B2922F77C8300C4D6B3 /* FetchManager.swift in Sources */,
|
||||
D0C9CA8A2302314400FAB518 /* ContactSelectionController.swift in Sources */,
|
||||
D0C9C12322FE414700FAB518 /* PresentationSurfaceLevels.swift in Sources */,
|
||||
D0879B6522F7AC8700C4D6B3 /* OverlayMediaManager.swift in Sources */,
|
||||
D0879B7322F842FF00C4D6B3 /* WatchManager.swift in Sources */,
|
||||
|
@ -238,6 +238,135 @@ public enum DeviceContactInfoSubject {
|
||||
}
|
||||
}
|
||||
|
||||
public enum PeerInfoControllerMode {
|
||||
case generic
|
||||
case calls(messages: [Message])
|
||||
}
|
||||
|
||||
public enum ContactListActionItemInlineIconPosition {
|
||||
case left
|
||||
case right
|
||||
}
|
||||
|
||||
public enum ContactListActionItemIcon : Equatable {
|
||||
case none
|
||||
case generic(UIImage)
|
||||
case inline(UIImage, ContactListActionItemInlineIconPosition)
|
||||
|
||||
public var image: UIImage? {
|
||||
switch self {
|
||||
case .none:
|
||||
return nil
|
||||
case let .generic(image):
|
||||
return image
|
||||
case let .inline(image, _):
|
||||
return image
|
||||
}
|
||||
}
|
||||
|
||||
public static func ==(lhs: ContactListActionItemIcon, rhs: ContactListActionItemIcon) -> Bool {
|
||||
switch lhs {
|
||||
case .none:
|
||||
if case .none = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .generic(image):
|
||||
if case .generic(image) = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .inline(image, position):
|
||||
if case .inline(image, position) = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public struct ContactListAdditionalOption: Equatable {
|
||||
public let title: String
|
||||
public let icon: ContactListActionItemIcon
|
||||
public let action: () -> Void
|
||||
|
||||
public init(title: String, icon: ContactListActionItemIcon, action: @escaping () -> Void) {
|
||||
self.title = title
|
||||
self.icon = icon
|
||||
self.action = action
|
||||
}
|
||||
|
||||
public static func ==(lhs: ContactListAdditionalOption, rhs: ContactListAdditionalOption) -> Bool {
|
||||
return lhs.title == rhs.title && lhs.icon == rhs.icon
|
||||
}
|
||||
}
|
||||
|
||||
public enum ContactListPeerId: Hashable {
|
||||
case peer(PeerId)
|
||||
case deviceContact(DeviceContactStableId)
|
||||
}
|
||||
|
||||
public enum ContactListPeer: Equatable {
|
||||
case peer(peer: Peer, isGlobal: Bool, participantCount: Int32?)
|
||||
case deviceContact(DeviceContactStableId, DeviceContactBasicData)
|
||||
|
||||
public var id: ContactListPeerId {
|
||||
switch self {
|
||||
case let .peer(peer, _, _):
|
||||
return .peer(peer.id)
|
||||
case let .deviceContact(id, _):
|
||||
return .deviceContact(id)
|
||||
}
|
||||
}
|
||||
|
||||
public var indexName: PeerIndexNameRepresentation {
|
||||
switch self {
|
||||
case let .peer(peer, _, _):
|
||||
return peer.indexName
|
||||
case let .deviceContact(_, contact):
|
||||
return .personName(first: contact.firstName, last: contact.lastName, addressName: "", phoneNumber: "")
|
||||
}
|
||||
}
|
||||
|
||||
public static func ==(lhs: ContactListPeer, rhs: ContactListPeer) -> Bool {
|
||||
switch lhs {
|
||||
case let .peer(lhsPeer, lhsIsGlobal, lhsParticipantCount):
|
||||
if case let .peer(rhsPeer, rhsIsGlobal, rhsParticipantCount) = rhs, lhsPeer.isEqual(rhsPeer), lhsIsGlobal == rhsIsGlobal, lhsParticipantCount == rhsParticipantCount {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .deviceContact(id, contact):
|
||||
if case .deviceContact(id, contact) = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final class ContactSelectionControllerParams {
|
||||
public let context: AccountContext
|
||||
public let autoDismiss: Bool
|
||||
public let title: (PresentationStrings) -> String
|
||||
public let options: [ContactListAdditionalOption]
|
||||
public let displayDeviceContacts: Bool
|
||||
public let confirmation: (ContactListPeer) -> Signal<Bool, NoError>
|
||||
|
||||
public init(context: AccountContext, autoDismiss: Bool = true, title: @escaping (PresentationStrings) -> String, options: [ContactListAdditionalOption] = [], displayDeviceContacts: Bool = false, confirmation: @escaping (ContactListPeer) -> Signal<Bool, NoError> = { _ in .single(true) }) {
|
||||
self.context = context
|
||||
self.autoDismiss = autoDismiss
|
||||
self.title = title
|
||||
self.options = options
|
||||
self.displayDeviceContacts = displayDeviceContacts
|
||||
self.confirmation = confirmation
|
||||
}
|
||||
}
|
||||
|
||||
public protocol SharedAccountContext: class {
|
||||
var basePath: String { get }
|
||||
var mainWindow: Window1? { get }
|
||||
@ -273,10 +402,11 @@ public protocol SharedAccountContext: class {
|
||||
func openChatMessage(_ params: OpenChatMessageParams) -> Bool
|
||||
func messageFromPreloadedChatHistoryViewForLocation(id: MessageId, location: ChatHistoryLocationInput, account: Account, chatLocation: ChatLocation, tagMask: MessageTags?) -> Signal<(MessageIndex?, Bool), NoError>
|
||||
func makeOverlayAudioPlayerController(context: AccountContext, peerId: PeerId, type: MediaManagerPlayerType, initialMessageId: MessageId, initialOrder: MusicPlaybackSettingsOrder, parentNavigationController: NavigationController?) -> ViewController & OverlayAudioPlayerController
|
||||
func makePeerInfoController(context: AccountContext, peer: Peer) -> ViewController?
|
||||
func makePeerInfoController(context: AccountContext, peer: Peer, mode: PeerInfoControllerMode) -> ViewController?
|
||||
func makeDeviceContactInfoController(context: AccountContext, subject: DeviceContactInfoSubject, completed: (() -> Void)?, cancelled: (() -> Void)?) -> ViewController
|
||||
func makePeersNearbyController(context: AccountContext) -> ViewController
|
||||
func makeChatController(context: AccountContext, chatLocation: ChatLocation, subject: ChatControllerSubject?, botStart: ChatControllerInitialBotStart?, mode: ChatControllerPresentationMode) -> ChatController
|
||||
func makeContactSelectionController(_ params: ContactSelectionControllerParams) -> ContactSelectionController
|
||||
func navigateToChatController(_ params: NavigateToChatControllerParams)
|
||||
func openExternalUrl(context: AccountContext, urlContext: OpenURLContext, url: String, forceExternal: Bool, presentationData: PresentationData, navigationController: NavigationController?, dismissInput: @escaping () -> Void)
|
||||
func chatAvailableMessageActions(postbox: Postbox, accountPeerId: PeerId, messageIds: Set<MessageId>) -> Signal<ChatAvailableMessageActions, NoError>
|
||||
|
@ -0,0 +1,9 @@
|
||||
import Foundation
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
|
||||
public protocol ContactSelectionController: ViewController {
|
||||
var result: Signal<ContactListPeer?, NoError> { get }
|
||||
|
||||
func dismissSearch()
|
||||
}
|
631
submodules/CallListUI/CallListUI_Xcode.xcodeproj/project.pbxproj
Normal file
631
submodules/CallListUI/CallListUI_Xcode.xcodeproj/project.pbxproj
Normal file
@ -0,0 +1,631 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 50;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
D0C9CA4A23022CEB00FAB518 /* CallListUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D0C9CA4823022CEB00FAB518 /* CallListUI.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
D0C9CA5A23022D5F00FAB518 /* CallListCallItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA5423022D5E00FAB518 /* CallListCallItem.swift */; };
|
||||
D0C9CA5B23022D5F00FAB518 /* CallListNodeEntries.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA5523022D5E00FAB518 /* CallListNodeEntries.swift */; };
|
||||
D0C9CA5C23022D5F00FAB518 /* CallListNodeLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA5623022D5E00FAB518 /* CallListNodeLocation.swift */; };
|
||||
D0C9CA5D23022D5F00FAB518 /* CallListViewTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA5723022D5E00FAB518 /* CallListViewTransition.swift */; };
|
||||
D0C9CA5E23022D5F00FAB518 /* CallListControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA5823022D5F00FAB518 /* CallListControllerNode.swift */; };
|
||||
D0C9CA5F23022D5F00FAB518 /* CallListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA5923022D5F00FAB518 /* CallListController.swift */; };
|
||||
D0C9CA6223022D7200FAB518 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA6123022D7200FAB518 /* Foundation.framework */; };
|
||||
D0C9CA6423022D7600FAB518 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA6323022D7600FAB518 /* UIKit.framework */; };
|
||||
D0C9CA6623022D7700FAB518 /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA6523022D7700FAB518 /* AsyncDisplayKit.framework */; };
|
||||
D0C9CA6823022D7B00FAB518 /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA6723022D7B00FAB518 /* Postbox.framework */; };
|
||||
D0C9CA6A23022D8100FAB518 /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA6923022D8100FAB518 /* Display.framework */; };
|
||||
D0C9CA6C23022D8700FAB518 /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA6B23022D8700FAB518 /* SwiftSignalKit.framework */; };
|
||||
D0C9CA6E23022D8D00FAB518 /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA6D23022D8D00FAB518 /* TelegramCore.framework */; };
|
||||
D0C9CA7023022D9500FAB518 /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA6F23022D9500FAB518 /* TelegramPresentationData.framework */; };
|
||||
D0C9CA7223022D9C00FAB518 /* ItemListUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA7123022D9C00FAB518 /* ItemListUI.framework */; };
|
||||
D0C9CA7423022DA300FAB518 /* AvatarNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA7323022DA300FAB518 /* AvatarNode.framework */; };
|
||||
D0C9CA7623022DAA00FAB518 /* TelegramStringFormatting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA7523022DAA00FAB518 /* TelegramStringFormatting.framework */; };
|
||||
D0C9CA7823022DBA00FAB518 /* AlertUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA7723022DBA00FAB518 /* AlertUI.framework */; };
|
||||
D0C9CA7A23022DC400FAB518 /* AccountContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA7923022DC400FAB518 /* AccountContext.framework */; };
|
||||
D0C9CA7C23022DCC00FAB518 /* TelegramUIPreferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA7B23022DCC00FAB518 /* TelegramUIPreferences.framework */; };
|
||||
D0C9CA7E23022DD900FAB518 /* TelegramNotices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA7D23022DD900FAB518 /* TelegramNotices.framework */; };
|
||||
D0C9CA8023022E1F00FAB518 /* MergeLists.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA7F23022E1F00FAB518 /* MergeLists.framework */; };
|
||||
D0C9CA8423022E6600FAB518 /* FrameworkBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA8323022E6600FAB518 /* FrameworkBundle.swift */; };
|
||||
D0C9CA8623022FCD00FAB518 /* CallListHoleItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CA8523022FCD00FAB518 /* CallListHoleItem.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
D0C9CA4523022CEB00FAB518 /* CallListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CallListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA4823022CEB00FAB518 /* CallListUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CallListUI.h; sourceTree = "<group>"; };
|
||||
D0C9CA4923022CEB00FAB518 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
D0C9CA5423022D5E00FAB518 /* CallListCallItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListCallItem.swift; sourceTree = "<group>"; };
|
||||
D0C9CA5523022D5E00FAB518 /* CallListNodeEntries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListNodeEntries.swift; sourceTree = "<group>"; };
|
||||
D0C9CA5623022D5E00FAB518 /* CallListNodeLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListNodeLocation.swift; sourceTree = "<group>"; };
|
||||
D0C9CA5723022D5E00FAB518 /* CallListViewTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListViewTransition.swift; sourceTree = "<group>"; };
|
||||
D0C9CA5823022D5F00FAB518 /* CallListControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListControllerNode.swift; sourceTree = "<group>"; };
|
||||
D0C9CA5923022D5F00FAB518 /* CallListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListController.swift; sourceTree = "<group>"; };
|
||||
D0C9CA6123022D7200FAB518 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
D0C9CA6323022D7600FAB518 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||
D0C9CA6523022D7700FAB518 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA6723022D7B00FAB518 /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA6923022D8100FAB518 /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA6B23022D8700FAB518 /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA6D23022D8D00FAB518 /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA6F23022D9500FAB518 /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA7123022D9C00FAB518 /* ItemListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ItemListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA7323022DA300FAB518 /* AvatarNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AvatarNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA7523022DAA00FAB518 /* TelegramStringFormatting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramStringFormatting.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA7723022DBA00FAB518 /* AlertUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AlertUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA7923022DC400FAB518 /* AccountContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AccountContext.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA7B23022DCC00FAB518 /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA7D23022DD900FAB518 /* TelegramNotices.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramNotices.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA7F23022E1F00FAB518 /* MergeLists.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MergeLists.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA8323022E6600FAB518 /* FrameworkBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameworkBundle.swift; sourceTree = "<group>"; };
|
||||
D0C9CA8523022FCD00FAB518 /* CallListHoleItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallListHoleItem.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
D0C9CA4223022CEB00FAB518 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D0C9CA8023022E1F00FAB518 /* MergeLists.framework in Frameworks */,
|
||||
D0C9CA7E23022DD900FAB518 /* TelegramNotices.framework in Frameworks */,
|
||||
D0C9CA7C23022DCC00FAB518 /* TelegramUIPreferences.framework in Frameworks */,
|
||||
D0C9CA7A23022DC400FAB518 /* AccountContext.framework in Frameworks */,
|
||||
D0C9CA7823022DBA00FAB518 /* AlertUI.framework in Frameworks */,
|
||||
D0C9CA7623022DAA00FAB518 /* TelegramStringFormatting.framework in Frameworks */,
|
||||
D0C9CA7423022DA300FAB518 /* AvatarNode.framework in Frameworks */,
|
||||
D0C9CA7223022D9C00FAB518 /* ItemListUI.framework in Frameworks */,
|
||||
D0C9CA7023022D9500FAB518 /* TelegramPresentationData.framework in Frameworks */,
|
||||
D0C9CA6E23022D8D00FAB518 /* TelegramCore.framework in Frameworks */,
|
||||
D0C9CA6C23022D8700FAB518 /* SwiftSignalKit.framework in Frameworks */,
|
||||
D0C9CA6A23022D8100FAB518 /* Display.framework in Frameworks */,
|
||||
D0C9CA6823022D7B00FAB518 /* Postbox.framework in Frameworks */,
|
||||
D0C9CA6623022D7700FAB518 /* AsyncDisplayKit.framework in Frameworks */,
|
||||
D0C9CA6423022D7600FAB518 /* UIKit.framework in Frameworks */,
|
||||
D0C9CA6223022D7200FAB518 /* Foundation.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
D0C9CA3B23022CEB00FAB518 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D0C9CA4923022CEB00FAB518 /* Info.plist */,
|
||||
D0C9CA4723022CEB00FAB518 /* Sources */,
|
||||
D0C9CA4623022CEB00FAB518 /* Products */,
|
||||
D0C9CA6023022D6F00FAB518 /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D0C9CA4623022CEB00FAB518 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D0C9CA4523022CEB00FAB518 /* CallListUI.framework */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D0C9CA4723022CEB00FAB518 /* Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D0C9CA5423022D5E00FAB518 /* CallListCallItem.swift */,
|
||||
D0C9CA8523022FCD00FAB518 /* CallListHoleItem.swift */,
|
||||
D0C9CA5923022D5F00FAB518 /* CallListController.swift */,
|
||||
D0C9CA5823022D5F00FAB518 /* CallListControllerNode.swift */,
|
||||
D0C9CA5523022D5E00FAB518 /* CallListNodeEntries.swift */,
|
||||
D0C9CA5623022D5E00FAB518 /* CallListNodeLocation.swift */,
|
||||
D0C9CA5723022D5E00FAB518 /* CallListViewTransition.swift */,
|
||||
D0C9CA8323022E6600FAB518 /* FrameworkBundle.swift */,
|
||||
D0C9CA4823022CEB00FAB518 /* CallListUI.h */,
|
||||
);
|
||||
path = Sources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D0C9CA6023022D6F00FAB518 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D0C9CA7F23022E1F00FAB518 /* MergeLists.framework */,
|
||||
D0C9CA7D23022DD900FAB518 /* TelegramNotices.framework */,
|
||||
D0C9CA7B23022DCC00FAB518 /* TelegramUIPreferences.framework */,
|
||||
D0C9CA7923022DC400FAB518 /* AccountContext.framework */,
|
||||
D0C9CA7723022DBA00FAB518 /* AlertUI.framework */,
|
||||
D0C9CA7523022DAA00FAB518 /* TelegramStringFormatting.framework */,
|
||||
D0C9CA7323022DA300FAB518 /* AvatarNode.framework */,
|
||||
D0C9CA7123022D9C00FAB518 /* ItemListUI.framework */,
|
||||
D0C9CA6F23022D9500FAB518 /* TelegramPresentationData.framework */,
|
||||
D0C9CA6D23022D8D00FAB518 /* TelegramCore.framework */,
|
||||
D0C9CA6B23022D8700FAB518 /* SwiftSignalKit.framework */,
|
||||
D0C9CA6923022D8100FAB518 /* Display.framework */,
|
||||
D0C9CA6723022D7B00FAB518 /* Postbox.framework */,
|
||||
D0C9CA6523022D7700FAB518 /* AsyncDisplayKit.framework */,
|
||||
D0C9CA6323022D7600FAB518 /* UIKit.framework */,
|
||||
D0C9CA6123022D7200FAB518 /* Foundation.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
D0C9CA4023022CEB00FAB518 /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D0C9CA4A23022CEB00FAB518 /* CallListUI.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
D0C9CA4423022CEB00FAB518 /* CallListUI */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = D0C9CA4D23022CEB00FAB518 /* Build configuration list for PBXNativeTarget "CallListUI" */;
|
||||
buildPhases = (
|
||||
D0C9CA4023022CEB00FAB518 /* Headers */,
|
||||
D0C9CA4123022CEB00FAB518 /* Sources */,
|
||||
D0C9CA4223022CEB00FAB518 /* Frameworks */,
|
||||
D0C9CA4323022CEB00FAB518 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = CallListUI;
|
||||
productName = CallListUI;
|
||||
productReference = D0C9CA4523022CEB00FAB518 /* CallListUI.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
D0C9CA3C23022CEB00FAB518 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
DefaultBuildSystemTypeForWorkspace = Latest;
|
||||
LastUpgradeCheck = 1030;
|
||||
ORGANIZATIONNAME = "Telegram Messenger LLP";
|
||||
TargetAttributes = {
|
||||
D0C9CA4423022CEB00FAB518 = {
|
||||
CreatedOnToolsVersion = 10.3;
|
||||
LastSwiftMigration = 1030;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = D0C9CA3F23022CEB00FAB518 /* Build configuration list for PBXProject "CallListUI_Xcode" */;
|
||||
compatibilityVersion = "Xcode 9.3";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = D0C9CA3B23022CEB00FAB518;
|
||||
productRefGroup = D0C9CA4623022CEB00FAB518 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
D0C9CA4423022CEB00FAB518 /* CallListUI */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
D0C9CA4323022CEB00FAB518 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
D0C9CA4123022CEB00FAB518 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D0C9CA8623022FCD00FAB518 /* CallListHoleItem.swift in Sources */,
|
||||
D0C9CA5C23022D5F00FAB518 /* CallListNodeLocation.swift in Sources */,
|
||||
D0C9CA5D23022D5F00FAB518 /* CallListViewTransition.swift in Sources */,
|
||||
D0C9CA5B23022D5F00FAB518 /* CallListNodeEntries.swift in Sources */,
|
||||
D0C9CA5F23022D5F00FAB518 /* CallListController.swift in Sources */,
|
||||
D0C9CA5E23022D5F00FAB518 /* CallListControllerNode.swift in Sources */,
|
||||
D0C9CA8423022E6600FAB518 /* FrameworkBundle.swift in Sources */,
|
||||
D0C9CA5A23022D5F00FAB518 /* CallListCallItem.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
D0C9CA4B23022CEB00FAB518 /* 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;
|
||||
};
|
||||
D0C9CA4C23022CEB00FAB518 /* 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;
|
||||
};
|
||||
D0C9CA4E23022CEB00FAB518 /* 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.CallListUI;
|
||||
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;
|
||||
};
|
||||
D0C9CA4F23022CEB00FAB518 /* 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.CallListUI;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = ReleaseAppStoreLLC;
|
||||
};
|
||||
D0C9CA5023022D2300FAB518 /* 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;
|
||||
};
|
||||
D0C9CA5123022D2300FAB518 /* 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.CallListUI;
|
||||
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;
|
||||
};
|
||||
D0C9CA5223022D3100FAB518 /* 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;
|
||||
};
|
||||
D0C9CA5323022D3100FAB518 /* 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.CallListUI;
|
||||
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 */
|
||||
D0C9CA3F23022CEB00FAB518 /* Build configuration list for PBXProject "CallListUI_Xcode" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
D0C9CA4B23022CEB00FAB518 /* DebugAppStoreLLC */,
|
||||
D0C9CA5023022D2300FAB518 /* DebugHockeyapp */,
|
||||
D0C9CA4C23022CEB00FAB518 /* ReleaseAppStoreLLC */,
|
||||
D0C9CA5223022D3100FAB518 /* ReleaseHockeyappInternal */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = ReleaseAppStoreLLC;
|
||||
};
|
||||
D0C9CA4D23022CEB00FAB518 /* Build configuration list for PBXNativeTarget "CallListUI" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
D0C9CA4E23022CEB00FAB518 /* DebugAppStoreLLC */,
|
||||
D0C9CA5123022D2300FAB518 /* DebugHockeyapp */,
|
||||
D0C9CA4F23022CEB00FAB518 /* ReleaseAppStoreLLC */,
|
||||
D0C9CA5323022D3100FAB518 /* ReleaseHockeyappInternal */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = ReleaseAppStoreLLC;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = D0C9CA3C23022CEB00FAB518 /* Project object */;
|
||||
}
|
22
submodules/CallListUI/Info.plist
Normal file
22
submodules/CallListUI/Info.plist
Normal file
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
</dict>
|
||||
</plist>
|
@ -54,12 +54,7 @@ public final class CallListController: ViewController {
|
||||
if case .tab = self.mode {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: PresentationResourcesRootController.navigationCallIcon(self.presentationData.theme), style: .plain, target: self, action: #selector(self.callPressed))
|
||||
|
||||
let icon: UIImage?
|
||||
if (useSpecialTabBarIcons()) {
|
||||
icon = UIImage(bundleImageName: "Chat List/Tabs/NY/IconCalls")
|
||||
} else {
|
||||
icon = UIImage(bundleImageName: "Chat List/Tabs/IconCalls")
|
||||
}
|
||||
let icon: UIImage? = UIImage(bundleImageName: "Chat List/Tabs/IconCalls")
|
||||
|
||||
self.tabBarItem.title = self.presentationData.strings.Calls_TabTitle
|
||||
self.tabBarItem.image = icon
|
||||
@ -150,9 +145,8 @@ public final class CallListController: ViewController {
|
||||
let _ = (strongSelf.context.account.postbox.loadedPeerWithId(peerId)
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { peer in
|
||||
if let strongSelf = self {
|
||||
let infoController = userInfoController(context: strongSelf.context, peerId: peer.id, mode: .calls(messages: messages))
|
||||
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
|
||||
if let strongSelf = self, let controller = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .calls(messages: messages)) {
|
||||
(strongSelf.navigationController as? NavigationController)?.pushViewController(controller)
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -198,7 +192,7 @@ public final class CallListController: ViewController {
|
||||
}
|
||||
|
||||
@objc func callPressed() {
|
||||
let controller = ContactSelectionController(context: self.context, title: { $0.Calls_NewCall })
|
||||
let controller = self.context.sharedContext.makeContactSelectionController(ContactSelectionControllerParams(context: self.context, title: { $0.Calls_NewCall }))
|
||||
self.createActionDisposable.set((controller.result
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { [weak controller, weak self] peer in
|
@ -123,7 +123,7 @@ private func mappedInsertEntries(account: Account, showSettings: Bool, nodeInter
|
||||
case let .messageEntry(topMessage, messages, theme, strings, dateTimeFormat, editing, hasActiveRevealControls):
|
||||
return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: CallListCallItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, account: account, style: showSettings ? .blocks : .plain, topMessage: topMessage, messages: messages, editing: editing, revealed: hasActiveRevealControls, interaction: nodeInteraction), directionHint: entry.directionHint)
|
||||
case let .holeEntry(_, theme):
|
||||
return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatListHoleItem(theme: theme), directionHint: entry.directionHint)
|
||||
return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: CallListHoleItem(theme: theme), directionHint: entry.directionHint)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -140,7 +140,7 @@ private func mappedUpdateEntries(account: Account, showSettings: Bool, nodeInter
|
||||
case let .messageEntry(topMessage, messages, theme, strings, dateTimeFormat, editing, hasActiveRevealControls):
|
||||
return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: CallListCallItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, account: account, style: showSettings ? .blocks : .plain, topMessage: topMessage, messages: messages, editing: editing, revealed: hasActiveRevealControls, interaction: nodeInteraction), directionHint: entry.directionHint)
|
||||
case let .holeEntry(_, theme):
|
||||
return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatListHoleItem(theme: theme), directionHint: entry.directionHint)
|
||||
return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: CallListHoleItem(theme: theme), directionHint: entry.directionHint)
|
||||
}
|
||||
}
|
||||
}
|
128
submodules/CallListUI/Sources/CallListHoleItem.swift
Normal file
128
submodules/CallListUI/Sources/CallListHoleItem.swift
Normal file
@ -0,0 +1,128 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
import AsyncDisplayKit
|
||||
import Postbox
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
|
||||
private let titleFont = Font.regular(17.0)
|
||||
|
||||
class CallListHoleItem: ListViewItem {
|
||||
let theme: PresentationTheme
|
||||
|
||||
let selectable: Bool = false
|
||||
|
||||
init(theme: PresentationTheme) {
|
||||
self.theme = theme
|
||||
}
|
||||
|
||||
func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal<Void, NoError>?, (ListViewItemApply) -> Void)) -> Void) {
|
||||
async {
|
||||
let node = CallListHoleItemNode()
|
||||
node.relativePosition = (first: previousItem == nil, last: nextItem == nil)
|
||||
node.insets = UIEdgeInsets()
|
||||
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
|
||||
Queue.mainQueue().async {
|
||||
completion(node, {
|
||||
return (nil, { _ in })
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
|
||||
Queue.mainQueue().async {
|
||||
assert(node() is CallListHoleItemNode)
|
||||
if let nodeValue = node() as? CallListHoleItemNode {
|
||||
|
||||
let layout = nodeValue.asyncLayout()
|
||||
async {
|
||||
let first = previousItem == nil
|
||||
let last = nextItem == nil
|
||||
|
||||
let (nodeLayout, apply) = layout(self, params, first, last)
|
||||
Queue.mainQueue().async {
|
||||
completion(nodeLayout, { _ in
|
||||
apply()
|
||||
if let nodeValue = node() as? CallListHoleItemNode {
|
||||
nodeValue.updateBackgroundAndSeparatorsLayout()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private let separatorHeight = 1.0 / UIScreen.main.scale
|
||||
|
||||
class CallListHoleItemNode: ListViewItemNode {
|
||||
let separatorNode: ASDisplayNode
|
||||
let labelNode: TextNode
|
||||
|
||||
var relativePosition: (first: Bool, last: Bool) = (false, false)
|
||||
|
||||
required init() {
|
||||
self.separatorNode = ASDisplayNode()
|
||||
self.separatorNode.backgroundColor = UIColor(rgb: 0xc8c7cc)
|
||||
self.separatorNode.isLayerBacked = true
|
||||
|
||||
self.labelNode = TextNode()
|
||||
|
||||
super.init(layerBacked: false, dynamicBounce: false)
|
||||
|
||||
self.addSubnode(self.separatorNode)
|
||||
self.addSubnode(self.labelNode)
|
||||
}
|
||||
|
||||
override func layoutForParams(_ params: ListViewItemLayoutParams, item: ListViewItem, previousItem: ListViewItem?, nextItem: ListViewItem?) {
|
||||
let layout = self.asyncLayout()
|
||||
let (_, apply) = layout(item as! CallListHoleItem, params, self.relativePosition.first, self.relativePosition.last)
|
||||
apply()
|
||||
}
|
||||
|
||||
func asyncLayout() -> (_ item: CallListHoleItem, _ params: ListViewItemLayoutParams, _ first: Bool, _ last: Bool) -> (ListViewItemNodeLayout, () -> Void) {
|
||||
let labelNodeLayout = TextNode.asyncLayout(self.labelNode)
|
||||
|
||||
return { item, params, first, last in
|
||||
let baseWidth = params.width - params.leftInset - params.rightInset
|
||||
|
||||
let (labelLayout, labelApply) = labelNodeLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "", font: titleFont, textColor: item.theme.chatList.messageTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: baseWidth, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
|
||||
|
||||
let insets = UIEdgeInsets()
|
||||
let layout = ListViewItemNodeLayout(contentSize: CGSize(width: params.width, height: 68.0), insets: insets)
|
||||
|
||||
let separatorInset: CGFloat
|
||||
if last {
|
||||
separatorInset = 0.0
|
||||
} else {
|
||||
separatorInset = 80.0 + params.leftInset
|
||||
}
|
||||
|
||||
return (layout, { [weak self] in
|
||||
if let strongSelf = self {
|
||||
strongSelf.relativePosition = (first, last)
|
||||
|
||||
let _ = labelApply()
|
||||
|
||||
strongSelf.separatorNode.backgroundColor = item.theme.chatList.itemSeparatorColor
|
||||
|
||||
strongSelf.labelNode.frame = CGRect(origin: CGPoint(x: floor((params.width - labelLayout.size.width) / 2.0), y: floor((layout.contentSize.height - labelLayout.size.height) / 2.0)), size: labelLayout.size)
|
||||
|
||||
strongSelf.separatorNode.frame = CGRect(origin: CGPoint(x: separatorInset, y: 68.0 - separatorHeight), size: CGSize(width: params.width - separatorInset, height: separatorHeight))
|
||||
|
||||
strongSelf.contentSize = layout.contentSize
|
||||
strongSelf.insets = layout.insets
|
||||
strongSelf.updateBackgroundAndSeparatorsLayout()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func updateBackgroundAndSeparatorsLayout() {
|
||||
//let size = self.bounds.size
|
||||
//let insets = self.insets
|
||||
}
|
||||
}
|
19
submodules/CallListUI/Sources/CallListUI.h
Normal file
19
submodules/CallListUI/Sources/CallListUI.h
Normal file
@ -0,0 +1,19 @@
|
||||
//
|
||||
// CallListUI.h
|
||||
// CallListUI
|
||||
//
|
||||
// Created by Peter on 8/13/19.
|
||||
// Copyright © 2019 Telegram Messenger LLP. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
//! Project version number for CallListUI.
|
||||
FOUNDATION_EXPORT double CallListUIVersionNumber;
|
||||
|
||||
//! Project version string for CallListUI.
|
||||
FOUNDATION_EXPORT const unsigned char CallListUIVersionString[];
|
||||
|
||||
// In this header, you should import all the public headers of your framework using statements like #import <CallListUI/PublicHeader.h>
|
||||
|
||||
|
13
submodules/CallListUI/Sources/FrameworkBundle.swift
Normal file
13
submodules/CallListUI/Sources/FrameworkBundle.swift
Normal file
@ -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)
|
||||
}
|
||||
}
|
@ -6,57 +6,13 @@ import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import ItemListUI
|
||||
import ContactsPeerItem
|
||||
|
||||
public enum ContactListActionItemInlineIconPosition {
|
||||
case left
|
||||
case right
|
||||
}
|
||||
import AccountContext
|
||||
|
||||
public enum ContactListActionItemHighlight {
|
||||
case cell
|
||||
case alpha
|
||||
}
|
||||
|
||||
public enum ContactListActionItemIcon : Equatable {
|
||||
case none
|
||||
case generic(UIImage)
|
||||
case inline(UIImage, ContactListActionItemInlineIconPosition)
|
||||
|
||||
var image: UIImage? {
|
||||
switch self {
|
||||
case .none:
|
||||
return nil
|
||||
case let .generic(image):
|
||||
return image
|
||||
case let .inline(image, _):
|
||||
return image
|
||||
}
|
||||
}
|
||||
|
||||
public static func ==(lhs: ContactListActionItemIcon, rhs: ContactListActionItemIcon) -> Bool {
|
||||
switch lhs {
|
||||
case .none:
|
||||
if case .none = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .generic(image):
|
||||
if case .generic(image) = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .inline(image, position):
|
||||
if case .inline(image, position) = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ContactListActionItem: ListViewItem, ListViewItemWithHeader {
|
||||
let theme: PresentationTheme
|
||||
let title: String
|
||||
|
@ -115,51 +115,6 @@ enum ContactListAnimation {
|
||||
case insertion
|
||||
}
|
||||
|
||||
public enum ContactListPeerId: Hashable {
|
||||
case peer(PeerId)
|
||||
case deviceContact(DeviceContactStableId)
|
||||
}
|
||||
|
||||
public enum ContactListPeer: Equatable {
|
||||
case peer(peer: Peer, isGlobal: Bool, participantCount: Int32?)
|
||||
case deviceContact(DeviceContactStableId, DeviceContactBasicData)
|
||||
|
||||
public var id: ContactListPeerId {
|
||||
switch self {
|
||||
case let .peer(peer, _, _):
|
||||
return .peer(peer.id)
|
||||
case let .deviceContact(id, _):
|
||||
return .deviceContact(id)
|
||||
}
|
||||
}
|
||||
|
||||
public var indexName: PeerIndexNameRepresentation {
|
||||
switch self {
|
||||
case let .peer(peer, _, _):
|
||||
return peer.indexName
|
||||
case let .deviceContact(_, contact):
|
||||
return .personName(first: contact.firstName, last: contact.lastName, addressName: "", phoneNumber: "")
|
||||
}
|
||||
}
|
||||
|
||||
public static func ==(lhs: ContactListPeer, rhs: ContactListPeer) -> Bool {
|
||||
switch lhs {
|
||||
case let .peer(lhsPeer, lhsIsGlobal, lhsParticipantCount):
|
||||
if case let .peer(rhsPeer, rhsIsGlobal, rhsParticipantCount) = rhs, lhsPeer.isEqual(rhsPeer), lhsIsGlobal == rhsIsGlobal, lhsParticipantCount == rhsParticipantCount {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .deviceContact(id, contact):
|
||||
if case .deviceContact(id, contact) = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum ContactListNodeEntry: Comparable, Identifiable {
|
||||
case search(PresentationTheme, PresentationStrings)
|
||||
case sort(PresentationTheme, PresentationStrings, ContactsSortOrder)
|
||||
@ -688,22 +643,6 @@ private struct ContactsListNodeTransition {
|
||||
let animation: ContactListAnimation
|
||||
}
|
||||
|
||||
public struct ContactListAdditionalOption: Equatable {
|
||||
public let title: String
|
||||
public let icon: ContactListActionItemIcon
|
||||
public let action: () -> Void
|
||||
|
||||
public init(title: String, icon: ContactListActionItemIcon, action: @escaping () -> Void) {
|
||||
self.title = title
|
||||
self.icon = icon
|
||||
self.action = action
|
||||
}
|
||||
|
||||
public static func ==(lhs: ContactListAdditionalOption, rhs: ContactListAdditionalOption) -> Bool {
|
||||
return lhs.title == rhs.title && lhs.icon == rhs.icon
|
||||
}
|
||||
}
|
||||
|
||||
public enum ContactListPresentation {
|
||||
case orderedByPresence(options: [ContactListAdditionalOption])
|
||||
case natural(options: [ContactListAdditionalOption], includeChatList: Bool)
|
||||
|
@ -525,7 +525,7 @@ public class ContactsController: ViewController {
|
||||
return
|
||||
}
|
||||
if let peer = peer {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
|
||||
}
|
||||
} else {
|
||||
|
@ -1211,7 +1211,7 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
let _ = (strongSelf.context.account.postbox.loadedPeerWithId(peerId)
|
||||
|> deliverOnMainQueue).start(next: { peer in
|
||||
if let strongSelf = self {
|
||||
if let controller = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let controller = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
strongSelf.getNavigationController()?.pushViewController(controller)
|
||||
}
|
||||
}
|
||||
|
@ -327,7 +327,7 @@ public final class SecureIdAuthController: ViewController {
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
}
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
|
||||
}
|
||||
})
|
||||
|
@ -255,7 +255,7 @@ public func blockedPeersController(context: AccountContext, blockedPeersContext:
|
||||
}
|
||||
}))
|
||||
}, openPeer: { peer in
|
||||
if let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
pushControllerImpl?(controller)
|
||||
}
|
||||
})
|
||||
|
@ -361,7 +361,7 @@ public func channelBlacklistController(context: AccountContext, peerId: PeerId)
|
||||
}
|
||||
items.append(ActionSheetButtonItem(title: presentationData.strings.GroupRemoved_ViewUserInfo, action: { [weak actionSheet] in
|
||||
actionSheet?.dismissAnimated()
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: participant.peer) {
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: participant.peer, mode: .generic) {
|
||||
pushControllerImpl?(infoController)
|
||||
}
|
||||
}))
|
||||
|
@ -445,7 +445,7 @@ public func channelMembersController(context: AccountContext, peerId: PeerId) ->
|
||||
}
|
||||
}))
|
||||
}, openPeer: { peer in
|
||||
if let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
pushControllerImpl?(controller)
|
||||
}
|
||||
}, inviteViaLink: {
|
||||
@ -497,9 +497,8 @@ public func channelMembersController(context: AccountContext, peerId: PeerId) ->
|
||||
return state.withUpdatedSearchingMembers(false)
|
||||
}
|
||||
}, openPeer: { peer, _ in
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
pushControllerImpl?(infoController)
|
||||
// arguments.pushController(infoController)
|
||||
}
|
||||
}, present: { c, a in
|
||||
presentControllerImpl?(c, a)
|
||||
|
@ -654,7 +654,7 @@ public func channelPermissionsController(context: AccountContext, peerId origina
|
||||
}), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||
})
|
||||
}, openPeerInfo: { peer in
|
||||
if let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
pushControllerImpl?(controller)
|
||||
}
|
||||
}, openKicked: {
|
||||
|
@ -4650,7 +4650,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { [weak self] peerView in
|
||||
if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText == nil && !strongSelf.presentationInterfaceState.isNotAccessible {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
|
||||
}
|
||||
}
|
||||
@ -5101,7 +5101,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
}
|
||||
|
||||
private func presentContactPicker() {
|
||||
let contactsController = ContactSelectionController(context: self.context, title: { $0.Contacts_Title }, displayDeviceContacts: true)
|
||||
let contactsController = ContactSelectionControllerImpl(ContactSelectionControllerParams(context: self.context, title: { $0.Contacts_Title }, displayDeviceContacts: true))
|
||||
self.chatDisplayNode.dismissInput()
|
||||
self.present(contactsController, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||
self.controllerNavigationDisposable.set((contactsController.result |> deliverOnMainQueue).start(next: { [weak self] peer in
|
||||
@ -6059,7 +6059,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
}
|
||||
self.navigationActionDisposable.set((peerSignal |> take(1) |> deliverOnMainQueue).start(next: { [weak self] peer in
|
||||
if let strongSelf = self, let peer = peer {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
|
||||
}
|
||||
}
|
||||
@ -6464,7 +6464,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { [weak self] peer in
|
||||
if let strongSelf = self, peer.restrictionText == nil {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
|
||||
}
|
||||
}
|
||||
|
@ -658,7 +658,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
|
||||
if peer is TelegramChannel, let navigationController = strongSelf.getNavigationController() {
|
||||
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer.id), animated: true))
|
||||
} else {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
strongSelf.pushController(infoController)
|
||||
}
|
||||
}
|
||||
@ -680,7 +680,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
|
||||
|> deliverOnMainQueue).start(next: { [weak self] peer in
|
||||
if let strongSelf = self {
|
||||
if let peer = peer {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
strongSelf.pushController(infoController)
|
||||
}
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ public class ComposeController: ViewController {
|
||||
|
||||
self.contactsNode.openCreateNewSecretChat = { [weak self] in
|
||||
if let strongSelf = self {
|
||||
let controller = ContactSelectionController(context: strongSelf.context, title: { $0.Compose_NewEncryptedChatTitle })
|
||||
let controller = ContactSelectionControllerImpl(ContactSelectionControllerParams(context: strongSelf.context, title: { $0.Compose_NewEncryptedChatTitle }))
|
||||
strongSelf.createActionDisposable.set((controller.result
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { [weak controller] peer in
|
||||
|
@ -11,7 +11,7 @@ import AccountContext
|
||||
import ContactListUI
|
||||
import SearchUI
|
||||
|
||||
class ContactSelectionController: ViewController, PresentableController {
|
||||
class ContactSelectionControllerImpl: ViewController, ContactSelectionController, PresentableController {
|
||||
private let context: AccountContext
|
||||
private let autoDismiss: Bool
|
||||
|
||||
@ -67,13 +67,13 @@ class ContactSelectionController: ViewController, PresentableController {
|
||||
}
|
||||
}
|
||||
|
||||
init(context: AccountContext, autoDismiss: Bool = true, title: @escaping (PresentationStrings) -> String, options: [ContactListAdditionalOption] = [], displayDeviceContacts: Bool = false, confirmation: @escaping (ContactListPeer) -> Signal<Bool, NoError> = { _ in .single(true) }) {
|
||||
self.context = context
|
||||
self.autoDismiss = autoDismiss
|
||||
self.titleProducer = title
|
||||
self.options = options
|
||||
self.displayDeviceContacts = displayDeviceContacts
|
||||
self.confirmation = confirmation
|
||||
init(_ params: ContactSelectionControllerParams) {
|
||||
self.context = params.context
|
||||
self.autoDismiss = params.autoDismiss
|
||||
self.titleProducer = params.title
|
||||
self.options = params.options
|
||||
self.displayDeviceContacts = params.displayDeviceContacts
|
||||
self.confirmation = params.confirmation
|
||||
|
||||
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
|
||||
|
@ -1289,7 +1289,7 @@ public func deviceContactInfoController(context: AccountContext, subject: Device
|
||||
}
|
||||
|
||||
private func addContactToExisting(context: AccountContext, parentController: ViewController, contactData: DeviceContactExtendedData, completion: @escaping (Peer?, DeviceContactStableId, DeviceContactExtendedData) -> Void) {
|
||||
let contactsController = ContactSelectionController(context: context, title: { $0.Contacts_Title }, displayDeviceContacts: true)
|
||||
let contactsController = ContactSelectionControllerImpl(ContactSelectionControllerParams(context: context, title: { $0.Contacts_Title }, displayDeviceContacts: true))
|
||||
parentController.present(contactsController, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||
let _ = (contactsController.result
|
||||
|> deliverOnMainQueue).start(next: { peer in
|
||||
|
@ -569,7 +569,7 @@ private enum GroupInfoEntry: ItemListNodeEntry {
|
||||
}))
|
||||
}
|
||||
return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer, presence: presence, text: .presence, label: label == nil ? .none : .text(label!), editing: editing, revealOptions: ItemListPeerItemRevealOptions(options: options), switchValue: nil, enabled: enabled, selectable: selectable, sectionId: self.section, action: {
|
||||
if let infoController = arguments.context.sharedContext.makePeerInfoController(context: arguments.context, peer: peer), selectable {
|
||||
if let infoController = arguments.context.sharedContext.makePeerInfoController(context: arguments.context, peer: peer, mode: .generic), selectable {
|
||||
arguments.pushController(infoController)
|
||||
}
|
||||
}, setPeerIdWithRevealedOptions: { peerId, fromPeerId in
|
||||
@ -1596,13 +1596,13 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId:
|
||||
|
||||
let contactsController: ViewController
|
||||
if peerView.peerId.namespace == Namespaces.Peer.CloudGroup {
|
||||
contactsController = ContactSelectionController(context: context, autoDismiss: false, title: { $0.GroupInfo_AddParticipantTitle }, options: options, confirmation: { peer in
|
||||
contactsController = ContactSelectionControllerImpl(ContactSelectionControllerParams(context: context, autoDismiss: false, title: { $0.GroupInfo_AddParticipantTitle }, options: options, confirmation: { peer in
|
||||
if let confirmationImpl = confirmationImpl, case let .peer(peer, _, _) = peer {
|
||||
return confirmationImpl(peer.id)
|
||||
} else {
|
||||
return .single(false)
|
||||
}
|
||||
})
|
||||
}))
|
||||
} else {
|
||||
contactsController = ContactMultiselectionController(context: context, mode: .peerSelection(searchChatList: false, searchGroups: false), options: options, filters: [.excludeSelf, .disable(recentIds)])
|
||||
}
|
||||
@ -1803,7 +1803,7 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId:
|
||||
}
|
||||
|
||||
presentControllerImpl?(contactsController, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||
if let contactsController = contactsController as? ContactSelectionController {
|
||||
if let contactsController = contactsController as? ContactSelectionControllerImpl {
|
||||
selectAddMemberDisposable.set((contactsController.result
|
||||
|> deliverOnMainQueue).start(next: { [weak contactsController] memberPeer in
|
||||
guard let memberPeer = memberPeer else {
|
||||
@ -2243,7 +2243,7 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId:
|
||||
return state.withUpdatedSearchingMembers(false)
|
||||
}
|
||||
}, openPeer: { peer, _ in
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
arguments.pushController(infoController)
|
||||
}
|
||||
}, present: { c, a in
|
||||
|
@ -15,7 +15,7 @@ func openAddContact(context: AccountContext, firstName: String = "", lastName: S
|
||||
let contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: firstName, lastName: lastName, phoneNumbers: [DeviceContactPhoneNumberData(label: label, value: phoneNumber)]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: [])
|
||||
present(deviceContactInfoController(context: context, subject: .create(peer: nil, contactData: contactData, isSharing: false, shareViaException: false, completion: { peer, stableId, contactData in
|
||||
if let peer = peer {
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
pushController(infoController)
|
||||
}
|
||||
} else {
|
||||
|
@ -193,7 +193,7 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
|
||||
case .info:
|
||||
let _ = (context.account.postbox.loadedPeerWithId(peerId)
|
||||
|> deliverOnMainQueue).start(next: { peer in
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
context.sharedContext.applicationBindings.dismissNativeController()
|
||||
navigationController?.pushViewController(infoController)
|
||||
}
|
||||
@ -474,7 +474,7 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
|
||||
return transaction.getPeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: idValue))
|
||||
}
|
||||
|> deliverOnMainQueue).start(next: { peer in
|
||||
if let peer = peer, let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let peer = peer, let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
navigationController?.pushViewController(controller)
|
||||
}
|
||||
})
|
||||
|
@ -6,7 +6,7 @@ import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import AccountContext
|
||||
|
||||
func peerInfoControllerImpl(context: AccountContext, peer: Peer) -> ViewController? {
|
||||
func peerInfoControllerImpl(context: AccountContext, peer: Peer, mode: PeerInfoControllerMode) -> ViewController? {
|
||||
if let _ = peer as? TelegramGroup {
|
||||
return groupInfoController(context: context, peerId: peer.id)
|
||||
} else if let channel = peer as? TelegramChannel {
|
||||
@ -16,7 +16,7 @@ func peerInfoControllerImpl(context: AccountContext, peer: Peer) -> ViewControll
|
||||
return channelInfoController(context: context, peerId: peer.id)
|
||||
}
|
||||
} else if peer is TelegramUser || peer is TelegramSecretChat {
|
||||
return userInfoController(context: context, peerId: peer.id)
|
||||
return userInfoController(context: context, peerId: peer.id, mode: mode)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -608,7 +608,7 @@ public class PeerMediaCollectionController: TelegramBaseController {
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { [weak self] peer in
|
||||
if let strongSelf = self, peer.restrictionText == nil {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) {
|
||||
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
|
||||
}
|
||||
}
|
||||
|
@ -337,7 +337,7 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
|
||||
return transaction.getPeer(peerId)
|
||||
}
|
||||
|> deliverOnMainQueue).start(next: { peer in
|
||||
guard let peer = peer, let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer) else {
|
||||
guard let peer = peer, let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) else {
|
||||
return
|
||||
}
|
||||
pushControllerImpl?(controller)
|
||||
|
@ -25,6 +25,7 @@ import LegacyUI
|
||||
import PassportUI
|
||||
import SearchUI
|
||||
import ItemListPeerItem
|
||||
import CallListUI
|
||||
|
||||
private let maximumNumberOfAccounts = 3
|
||||
|
||||
|
@ -10,6 +10,7 @@ import OverlayStatusController
|
||||
import AccountContext
|
||||
import PassportUI
|
||||
import LocalAuth
|
||||
import CallListUI
|
||||
|
||||
private let maximumNumberOfAccounts = 3
|
||||
|
||||
|
@ -936,8 +936,8 @@ public final class SharedAccountContextImpl: SharedAccountContext {
|
||||
handleTextLinkActionImpl(context: context, peerId: peerId, navigateDisposable: navigateDisposable, controller: controller, action: action, itemLink: itemLink)
|
||||
}
|
||||
|
||||
public func makePeerInfoController(context: AccountContext, peer: Peer) -> ViewController? {
|
||||
return peerInfoControllerImpl(context: context, peer: peer)
|
||||
public func makePeerInfoController(context: AccountContext, peer: Peer, mode: PeerInfoControllerMode) -> ViewController? {
|
||||
return peerInfoControllerImpl(context: context, peer: peer, mode: mode)
|
||||
}
|
||||
|
||||
public func openExternalUrl(context: AccountContext, urlContext: OpenURLContext, url: String, forceExternal: Bool, presentationData: PresentationData, navigationController: NavigationController?, dismissInput: @escaping () -> Void) {
|
||||
@ -975,4 +975,8 @@ public final class SharedAccountContextImpl: SharedAccountContext {
|
||||
public func presentContactsWarningSuppression(context: AccountContext, present: (ViewController, Any?) -> Void) {
|
||||
presentContactsWarningSuppressionImpl(context: context, present: present)
|
||||
}
|
||||
|
||||
public func makeContactSelectionController(_ params: ContactSelectionControllerParams) -> ContactSelectionController {
|
||||
return ContactSelectionControllerImpl(params)
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import TelegramPresentationData
|
||||
import TelegramUIPrivateModule
|
||||
import AccountContext
|
||||
import ContactListUI
|
||||
import CallListUI
|
||||
|
||||
public final class TelegramRootController: NavigationController {
|
||||
private let context: AccountContext
|
||||
|
@ -28,7 +28,7 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigate
|
||||
peerSignal = context.account.postbox.loadedPeerWithId(peerId) |> map(Optional.init)
|
||||
navigateDisposable.set((peerSignal |> take(1) |> deliverOnMainQueue).start(next: { peer in
|
||||
if let controller = controller, let peer = peer {
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer) {
|
||||
if let infoController = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) {
|
||||
(controller.navigationController as? NavigationController)?.pushViewController(infoController)
|
||||
}
|
||||
}
|
||||
|
@ -565,7 +565,7 @@ private func stringForBlockAction(strings: PresentationStrings, action: Destruct
|
||||
}
|
||||
}
|
||||
|
||||
private func userInfoEntries(account: Account, presentationData: PresentationData, view: PeerView, cachedPeerData: CachedPeerData?, deviceContacts: [(DeviceContactStableId, DeviceContactBasicData)], mode: UserInfoControllerMode, state: UserInfoState, peerChatState: PostboxCoding?, globalNotificationSettings: GlobalNotificationSettings) -> [UserInfoEntry] {
|
||||
private func userInfoEntries(account: Account, presentationData: PresentationData, view: PeerView, cachedPeerData: CachedPeerData?, deviceContacts: [(DeviceContactStableId, DeviceContactBasicData)], mode: PeerInfoControllerMode, state: UserInfoState, peerChatState: PostboxCoding?, globalNotificationSettings: GlobalNotificationSettings) -> [UserInfoEntry] {
|
||||
var entries: [UserInfoEntry] = []
|
||||
|
||||
guard let peer = view.peers[view.peerId], let user = peerViewMainPeer(view) as? TelegramUser else {
|
||||
@ -762,12 +762,7 @@ private func getUserPeer(postbox: Postbox, peerId: PeerId) -> Signal<(Peer?, Cac
|
||||
}
|
||||
}
|
||||
|
||||
public enum UserInfoControllerMode {
|
||||
case generic
|
||||
case calls(messages: [Message])
|
||||
}
|
||||
|
||||
public func userInfoController(context: AccountContext, peerId: PeerId, mode: UserInfoControllerMode = .generic) -> ViewController {
|
||||
public func userInfoController(context: AccountContext, peerId: PeerId, mode: PeerInfoControllerMode = .generic) -> ViewController {
|
||||
let statePromise = ValuePromise(UserInfoState(), ignoreRepeated: true)
|
||||
let stateValue = Atomic(value: UserInfoState())
|
||||
let updateState: ((UserInfoState) -> UserInfoState) -> Void = { f in
|
||||
|
@ -214,12 +214,6 @@
|
||||
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 */; };
|
||||
D01BAA181ECC8E0000295217 /* CallListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01BAA171ECC8E0000295217 /* CallListController.swift */; };
|
||||
D01BAA1A1ECC8E0D00295217 /* CallListControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01BAA191ECC8E0D00295217 /* CallListControllerNode.swift */; };
|
||||
D01BAA1C1ECC92F700295217 /* CallListViewTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01BAA1B1ECC92F700295217 /* CallListViewTransition.swift */; };
|
||||
D01BAA1E1ECC931D00295217 /* CallListNodeEntries.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01BAA1D1ECC931D00295217 /* CallListNodeEntries.swift */; };
|
||||
D01BAA201ECC9A2500295217 /* CallListNodeLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01BAA1F1ECC9A2500295217 /* CallListNodeLocation.swift */; };
|
||||
D01BAA221ECE076100295217 /* CallListCallItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01BAA211ECE076100295217 /* CallListCallItem.swift */; };
|
||||
D01C06AF1FBB461E001561AB /* JoinLinkPreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C06AE1FBB461E001561AB /* JoinLinkPreviewController.swift */; };
|
||||
D01C06B11FBB4643001561AB /* JoinLinkPreviewControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C06B01FBB4643001561AB /* JoinLinkPreviewControllerNode.swift */; };
|
||||
D01C06B31FBB49A5001561AB /* JoinLinkPreviewPeerContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C06B21FBB49A5001561AB /* JoinLinkPreviewPeerContentNode.swift */; };
|
||||
@ -510,6 +504,7 @@
|
||||
D0C9C9BB2302168100FAB518 /* PeersNearbyIconNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9C9BA2302168100FAB518 /* PeersNearbyIconNode.framework */; };
|
||||
D0C9C9DE2302267200FAB518 /* SolidRoundedButtonNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9C9DD2302267200FAB518 /* SolidRoundedButtonNode.framework */; };
|
||||
D0C9CA192302297C00FAB518 /* PasscodeUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA182302297C00FAB518 /* PasscodeUI.framework */; };
|
||||
D0C9CA8223022E3900FAB518 /* CallListUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CA8123022E3900FAB518 /* CallListUI.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 */; };
|
||||
@ -1112,12 +1107,6 @@
|
||||
D01AC91E1DD5E09000E8160F /* EditAccessoryPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditAccessoryPanelNode.swift; sourceTree = "<group>"; };
|
||||
D01B279A1E39386C0022A4C0 /* SettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsController.swift; sourceTree = "<group>"; };
|
||||
D01B279C1E394A500022A4C0 /* NotificationsAndSounds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationsAndSounds.swift; sourceTree = "<group>"; };
|
||||
D01BAA171ECC8E0000295217 /* CallListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListController.swift; sourceTree = "<group>"; };
|
||||
D01BAA191ECC8E0D00295217 /* CallListControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListControllerNode.swift; sourceTree = "<group>"; };
|
||||
D01BAA1B1ECC92F700295217 /* CallListViewTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListViewTransition.swift; sourceTree = "<group>"; };
|
||||
D01BAA1D1ECC931D00295217 /* CallListNodeEntries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListNodeEntries.swift; sourceTree = "<group>"; };
|
||||
D01BAA1F1ECC9A2500295217 /* CallListNodeLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListNodeLocation.swift; sourceTree = "<group>"; };
|
||||
D01BAA211ECE076100295217 /* CallListCallItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListCallItem.swift; sourceTree = "<group>"; };
|
||||
D01C06AE1FBB461E001561AB /* JoinLinkPreviewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinLinkPreviewController.swift; sourceTree = "<group>"; };
|
||||
D01C06B01FBB4643001561AB /* JoinLinkPreviewControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinLinkPreviewControllerNode.swift; sourceTree = "<group>"; };
|
||||
D01C06B21FBB49A5001561AB /* JoinLinkPreviewPeerContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinLinkPreviewPeerContentNode.swift; sourceTree = "<group>"; };
|
||||
@ -1553,6 +1542,7 @@
|
||||
D0C9C9BA2302168100FAB518 /* PeersNearbyIconNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PeersNearbyIconNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9C9DD2302267200FAB518 /* SolidRoundedButtonNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SolidRoundedButtonNode.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA182302297C00FAB518 /* PasscodeUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PasscodeUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0C9CA8123022E3900FAB518 /* CallListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CallListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0CAD90020AEECAC00ACD96E /* ChatEditInterfaceMessageState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatEditInterfaceMessageState.swift; sourceTree = "<group>"; };
|
||||
D0CB27CE20C17A4A001ACF93 /* TermsOfServiceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfServiceController.swift; sourceTree = "<group>"; };
|
||||
D0CB27D120C17A7F001ACF93 /* TermsOfServiceControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfServiceControllerNode.swift; sourceTree = "<group>"; };
|
||||
@ -1790,6 +1780,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D0C9CA8223022E3900FAB518 /* CallListUI.framework in Frameworks */,
|
||||
D0C9CA192302297C00FAB518 /* PasscodeUI.framework in Frameworks */,
|
||||
D0C9C9DE2302267200FAB518 /* SolidRoundedButtonNode.framework in Frameworks */,
|
||||
D0C9C9BB2302168100FAB518 /* PeersNearbyIconNode.framework in Frameworks */,
|
||||
@ -2243,19 +2234,6 @@
|
||||
name = "Item List";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D01BAA161ECC8DED00295217 /* Call List */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D01BAA171ECC8E0000295217 /* CallListController.swift */,
|
||||
D01BAA191ECC8E0D00295217 /* CallListControllerNode.swift */,
|
||||
D01BAA1B1ECC92F700295217 /* CallListViewTransition.swift */,
|
||||
D01BAA1D1ECC931D00295217 /* CallListNodeEntries.swift */,
|
||||
D01BAA1F1ECC9A2500295217 /* CallListNodeLocation.swift */,
|
||||
D01BAA211ECE076100295217 /* CallListCallItem.swift */,
|
||||
);
|
||||
name = "Call List";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D01C06AD1FBB45ED001561AB /* Join Link Preview */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -2681,6 +2659,7 @@
|
||||
D08D45281D5E340200A7428A /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D0C9CA8123022E3900FAB518 /* CallListUI.framework */,
|
||||
D0C9CA182302297C00FAB518 /* PasscodeUI.framework */,
|
||||
D0C9C9DD2302267200FAB518 /* SolidRoundedButtonNode.framework */,
|
||||
D0C9C9BA2302168100FAB518 /* PeersNearbyIconNode.framework */,
|
||||
@ -3493,7 +3472,6 @@
|
||||
D0BC38681E3FB92B0044D6FE /* Compose */,
|
||||
D0EE97131D88BB1A006C18E1 /* Peer Info */,
|
||||
D0D2689B1D79D31500C422DA /* Peer Selection */,
|
||||
D01BAA161ECC8DED00295217 /* Call List */,
|
||||
D0F69E791D6B8C3B0046BCD6 /* Settings */,
|
||||
D0C50E361E93CAF200F62E39 /* Notifications */,
|
||||
090E778422A9B94700CD99F5 /* Peers Nearby */,
|
||||
@ -4189,7 +4167,6 @@
|
||||
D025402922E1F7F500AC0195 /* ChatTextInputSlowmodePlaceholderNode.swift in Sources */,
|
||||
D0380DB8204EE0A5000414AB /* ChatInstantVideoMessageDurationNode.swift in Sources */,
|
||||
D0EC6CDC1EB9F58800EBF1C3 /* TelegramAccountAuxiliaryMethods.swift in Sources */,
|
||||
D01BAA1A1ECC8E0D00295217 /* CallListControllerNode.swift in Sources */,
|
||||
D0642EFC1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift in Sources */,
|
||||
D03AA4E5202DF8840056C405 /* StickerPreviewPeekContent.swift in Sources */,
|
||||
D025402322E1C92D00AC0195 /* ChatSlowmodeItem.swift in Sources */,
|
||||
@ -4199,7 +4176,6 @@
|
||||
D02B198A21F1DA9E0094A764 /* SharedAccountContext.swift in Sources */,
|
||||
D0F67FF21EE6B915000E5906 /* ChannelMembersSearchControllerNode.swift in Sources */,
|
||||
D0E8B8BF20447A4600605593 /* SecretChatKeyControllerNode.swift in Sources */,
|
||||
D01BAA1E1ECC931D00295217 /* CallListNodeEntries.swift in Sources */,
|
||||
D02B2B9820810DA00062476B /* StickerPaneSearchStickerItem.swift in Sources */,
|
||||
D020A9DC1FEAE6E7008C66F7 /* OverlayPlayerControllerNode.swift in Sources */,
|
||||
09D968A1221F7FF100B1458A /* ChatTypingActivityContentNode.swift in Sources */,
|
||||
@ -4271,7 +4247,6 @@
|
||||
D007019E2029EFDD006B9E34 /* ICloudResources.swift in Sources */,
|
||||
D0F760DD222034980074F7E5 /* ChannelStatsControllerNode.swift in Sources */,
|
||||
D01590A622BD460C0017C33E /* MetalAnimationRenderer.swift in Sources */,
|
||||
D01BAA201ECC9A2500295217 /* CallListNodeLocation.swift in Sources */,
|
||||
D0EC6D251EB9F58800EBF1C3 /* FetchCachedRepresentations.swift in Sources */,
|
||||
D0EC6D261EB9F58800EBF1C3 /* TransformOutgoingMessageMedia.swift in Sources */,
|
||||
D0EC6D271EB9F58800EBF1C3 /* FetchResource.swift in Sources */,
|
||||
@ -4308,7 +4283,6 @@
|
||||
D0CE8CE51F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift in Sources */,
|
||||
D097C26820DD0A1D007BB4B8 /* PeerReportController.swift in Sources */,
|
||||
09F664C621EB400A00AB7E26 /* ThemeGridSearchContentNode.swift in Sources */,
|
||||
D01BAA181ECC8E0000295217 /* CallListController.swift in Sources */,
|
||||
D0EC6D4B1EB9F58800EBF1C3 /* ChatListNode.swift in Sources */,
|
||||
D0EC6D4D1EB9F58800EBF1C3 /* ChatListHoleItem.swift in Sources */,
|
||||
0962E67921B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift in Sources */,
|
||||
@ -4445,7 +4419,6 @@
|
||||
D0EC6D9C1EB9F58900EBF1C3 /* ChatMessageInstantVideoItemNode.swift in Sources */,
|
||||
D0750C8222B2E4EE00BE5F6E /* SharedWakeupManager.swift in Sources */,
|
||||
D0EC6D9D1EB9F58900EBF1C3 /* ChatMessageTextBubbleContentNode.swift in Sources */,
|
||||
D01BAA1C1ECC92F700295217 /* CallListViewTransition.swift in Sources */,
|
||||
D00817DE22B47A14008A895F /* TGBridgeServer.m in Sources */,
|
||||
D0FBE84F2273395C00B33B52 /* ChatListArchiveInfoItem.swift in Sources */,
|
||||
09F664D021EBCFB900AB7E26 /* WallpaperCropNode.swift in Sources */,
|
||||
@ -4541,7 +4514,6 @@
|
||||
D0EC6DD91EB9F58900EBF1C3 /* HorizontalListContextResultsChatInputContextPanelNode.swift in Sources */,
|
||||
D0EC6DDA1EB9F58900EBF1C3 /* HorizontalListContextResultsChatInputPanelItem.swift in Sources */,
|
||||
D0EC6DDB1EB9F58900EBF1C3 /* ChatInputPanelNode.swift in Sources */,
|
||||
D01BAA221ECE076100295217 /* CallListCallItem.swift in Sources */,
|
||||
D0EC6DDC1EB9F58900EBF1C3 /* ChatTextInputPanelNode.swift in Sources */,
|
||||
D06350AE2229A7F800FA2B32 /* InChatPrefetchManager.swift in Sources */,
|
||||
D0EB41F51F30D26A00838FE6 /* LegacySuggestionContext.swift in Sources */,
|
||||
|
Loading…
x
Reference in New Issue
Block a user