mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-05 05:51:42 +00:00
Refactoring
This commit is contained in:
parent
cd215242ac
commit
a7f9e0fed6
@ -365,6 +365,8 @@ swift_library(
|
|||||||
"//submodules/TelegramUI/Components/Chat/InstantVideoRadialStatusNode",
|
"//submodules/TelegramUI/Components/Chat/InstantVideoRadialStatusNode",
|
||||||
"//submodules/TelegramUI/Components/Chat/ChatMessageInteractiveFileNode",
|
"//submodules/TelegramUI/Components/Chat/ChatMessageInteractiveFileNode",
|
||||||
"//submodules/TelegramUI/Components/Chat/ChatMessageFileBubbleContentNode",
|
"//submodules/TelegramUI/Components/Chat/ChatMessageFileBubbleContentNode",
|
||||||
|
"//submodules/TelegramUI/Components/Chat/ChatMessageInteractiveMediaNode",
|
||||||
|
"//submodules/TelegramUI/Components/WallpaperPreviewMedia",
|
||||||
] + select({
|
] + select({
|
||||||
"@build_bazel_rules_apple//apple:ios_arm64": appcenter_targets,
|
"@build_bazel_rules_apple//apple:ios_arm64": appcenter_targets,
|
||||||
"//build-system:ios_sim_arm64": [],
|
"//build-system:ios_sim_arm64": [],
|
||||||
|
|||||||
@ -0,0 +1,46 @@
|
|||||||
|
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
|
||||||
|
|
||||||
|
swift_library(
|
||||||
|
name = "ChatMessageInteractiveMediaNode",
|
||||||
|
module_name = "ChatMessageInteractiveMediaNode",
|
||||||
|
srcs = glob([
|
||||||
|
"Sources/**/*.swift",
|
||||||
|
]),
|
||||||
|
copts = [
|
||||||
|
"-warnings-as-errors",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//submodules/AsyncDisplayKit",
|
||||||
|
"//submodules/Postbox",
|
||||||
|
"//submodules/SSignalKit/SwiftSignalKit",
|
||||||
|
"//submodules/Display",
|
||||||
|
"//submodules/TelegramCore",
|
||||||
|
"//submodules/TelegramPresentationData",
|
||||||
|
"//submodules/TelegramUIPreferences",
|
||||||
|
"//submodules/MediaPlayer:UniversalMediaPlayer",
|
||||||
|
"//submodules/TextFormat",
|
||||||
|
"//submodules/AccountContext",
|
||||||
|
"//submodules/RadialStatusNode",
|
||||||
|
"//submodules/StickerResources",
|
||||||
|
"//submodules/PhotoResources",
|
||||||
|
"//submodules/TelegramUniversalVideoContent",
|
||||||
|
"//submodules/TelegramStringFormatting",
|
||||||
|
"//submodules/GalleryUI",
|
||||||
|
"//submodules/AnimatedStickerNode",
|
||||||
|
"//submodules/TelegramAnimatedStickerNode",
|
||||||
|
"//submodules/LocalMediaResources",
|
||||||
|
"//submodules/WallpaperResources",
|
||||||
|
"//submodules/ChatMessageInteractiveMediaBadge",
|
||||||
|
"//submodules/ContextUI",
|
||||||
|
"//submodules/InvisibleInkDustNode",
|
||||||
|
"//submodules/TelegramUI/Components/ChatControllerInteraction",
|
||||||
|
"//submodules/TelegramUI/Components/Stories/StoryContainerScreen",
|
||||||
|
"//submodules/TelegramUI/Components/Chat/ChatMessageDateAndStatusNode",
|
||||||
|
"//submodules/TelegramUI/Components/Chat/ChatHistoryEntry",
|
||||||
|
"//submodules/TelegramUI/Components/Chat/ChatMessageItemCommon",
|
||||||
|
"//submodules/TelegramUI/Components/WallpaperPreviewMedia",
|
||||||
|
],
|
||||||
|
visibility = [
|
||||||
|
"//visibility:public",
|
||||||
|
],
|
||||||
|
)
|
||||||
@ -28,22 +28,23 @@ import StoryContainerScreen
|
|||||||
import ChatMessageDateAndStatusNode
|
import ChatMessageDateAndStatusNode
|
||||||
import ChatHistoryEntry
|
import ChatHistoryEntry
|
||||||
import ChatMessageItemCommon
|
import ChatMessageItemCommon
|
||||||
|
import WallpaperPreviewMedia
|
||||||
|
|
||||||
private struct FetchControls {
|
private struct FetchControls {
|
||||||
let fetch: (Bool) -> Void
|
let fetch: (Bool) -> Void
|
||||||
let cancel: () -> Void
|
let cancel: () -> Void
|
||||||
}
|
}
|
||||||
|
|
||||||
enum InteractiveMediaNodeSizeCalculation {
|
public enum InteractiveMediaNodeSizeCalculation {
|
||||||
case constrained(CGSize)
|
case constrained(CGSize)
|
||||||
case unconstrained
|
case unconstrained
|
||||||
}
|
}
|
||||||
|
|
||||||
enum InteractiveMediaNodeContentMode {
|
public enum InteractiveMediaNodeContentMode {
|
||||||
case aspectFit
|
case aspectFit
|
||||||
case aspectFill
|
case aspectFill
|
||||||
|
|
||||||
var bubbleVideoDecorationContentMode: ChatBubbleVideoDecorationContentMode {
|
public var bubbleVideoDecorationContentMode: ChatBubbleVideoDecorationContentMode {
|
||||||
switch self {
|
switch self {
|
||||||
case .aspectFit:
|
case .aspectFit:
|
||||||
return .aspectFit
|
return .aspectFit
|
||||||
@ -53,32 +54,52 @@ enum InteractiveMediaNodeContentMode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum InteractiveMediaNodeActivateContent {
|
public enum InteractiveMediaNodeActivateContent {
|
||||||
case `default`
|
case `default`
|
||||||
case stream
|
case stream
|
||||||
case automaticPlayback
|
case automaticPlayback
|
||||||
}
|
}
|
||||||
|
|
||||||
enum InteractiveMediaNodeAutodownloadMode {
|
public enum InteractiveMediaNodeAutodownloadMode {
|
||||||
case none
|
case none
|
||||||
case prefetch
|
case prefetch
|
||||||
case full
|
case full
|
||||||
}
|
}
|
||||||
|
|
||||||
enum InteractiveMediaNodePlayWithSoundMode {
|
public enum InteractiveMediaNodePlayWithSoundMode {
|
||||||
case single
|
case single
|
||||||
case loop
|
case loop
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ChatMessageDateAndStatus {
|
public struct ChatMessageDateAndStatus {
|
||||||
var type: ChatMessageDateAndStatusType
|
public var type: ChatMessageDateAndStatusType
|
||||||
var edited: Bool
|
public var edited: Bool
|
||||||
var viewCount: Int?
|
public var viewCount: Int?
|
||||||
var dateReactions: [MessageReaction]
|
public var dateReactions: [MessageReaction]
|
||||||
var dateReactionPeers: [(MessageReaction.Reaction, EnginePeer)]
|
public var dateReactionPeers: [(MessageReaction.Reaction, EnginePeer)]
|
||||||
var dateReplies: Int
|
public var dateReplies: Int
|
||||||
var isPinned: Bool
|
public var isPinned: Bool
|
||||||
var dateText: String
|
public var dateText: String
|
||||||
|
|
||||||
|
public init(
|
||||||
|
type: ChatMessageDateAndStatusType,
|
||||||
|
edited: Bool,
|
||||||
|
viewCount: Int?,
|
||||||
|
dateReactions: [MessageReaction],
|
||||||
|
dateReactionPeers: [(MessageReaction.Reaction, EnginePeer)],
|
||||||
|
dateReplies: Int,
|
||||||
|
isPinned: Bool,
|
||||||
|
dateText: String
|
||||||
|
) {
|
||||||
|
self.type = type
|
||||||
|
self.edited = edited
|
||||||
|
self.viewCount = viewCount
|
||||||
|
self.dateReactions = dateReactions
|
||||||
|
self.dateReactionPeers = dateReactionPeers
|
||||||
|
self.dateReplies = dateReplies
|
||||||
|
self.isPinned = isPinned
|
||||||
|
self.dateText = dateText
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func roundedRectCgPath(roundRect rect: CGRect, topLeftRadius: CGFloat = 0.0, topRightRadius: CGFloat = 0.0, bottomLeftRadius: CGFloat = 0.0, bottomRightRadius: CGFloat = 0.0) -> CGPath {
|
public func roundedRectCgPath(roundRect rect: CGRect, topLeftRadius: CGFloat = 0.0, topRightRadius: CGFloat = 0.0, bottomLeftRadius: CGFloat = 0.0, bottomRightRadius: CGFloat = 0.0) -> CGPath {
|
||||||
@ -348,7 +369,7 @@ private class ExtendedMediaOverlayNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitionNode {
|
public final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitionNode {
|
||||||
private let pinchContainerNode: PinchSourceContainerNode
|
private let pinchContainerNode: PinchSourceContainerNode
|
||||||
private let imageNode: TransformImageNode
|
private let imageNode: TransformImageNode
|
||||||
private var currentImageArguments: TransformImageArguments?
|
private var currentImageArguments: TransformImageArguments?
|
||||||
@ -360,11 +381,11 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
private var videoContent: NativeVideoContent?
|
private var videoContent: NativeVideoContent?
|
||||||
private var animatedStickerNode: AnimatedStickerNode?
|
private var animatedStickerNode: AnimatedStickerNode?
|
||||||
private var statusNode: RadialStatusNode?
|
private var statusNode: RadialStatusNode?
|
||||||
var videoNodeDecoration: ChatBubbleVideoDecoration?
|
public var videoNodeDecoration: ChatBubbleVideoDecoration?
|
||||||
var decoration: UniversalVideoDecoration? {
|
public var decoration: UniversalVideoDecoration? {
|
||||||
return self.videoNodeDecoration
|
return self.videoNodeDecoration
|
||||||
}
|
}
|
||||||
let dateAndStatusNode: ChatMessageDateAndStatusNode
|
public let dateAndStatusNode: ChatMessageDateAndStatusNode
|
||||||
private var badgeNode: ChatMessageInteractiveMediaBadge?
|
private var badgeNode: ChatMessageInteractiveMediaBadge?
|
||||||
|
|
||||||
private var extendedMediaOverlayNode: ExtendedMediaOverlayNode?
|
private var extendedMediaOverlayNode: ExtendedMediaOverlayNode?
|
||||||
@ -377,7 +398,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
private var sizeCalculation: InteractiveMediaNodeSizeCalculation?
|
private var sizeCalculation: InteractiveMediaNodeSizeCalculation?
|
||||||
private var wideLayout: Bool?
|
private var wideLayout: Bool?
|
||||||
private var automaticDownload: InteractiveMediaNodeAutodownloadMode?
|
private var automaticDownload: InteractiveMediaNodeAutodownloadMode?
|
||||||
var automaticPlayback: Bool?
|
public var automaticPlayback: Bool?
|
||||||
|
|
||||||
private let statusDisposable = MetaDisposable()
|
private let statusDisposable = MetaDisposable()
|
||||||
private let fetchControls = Atomic<FetchControls?>(value: nil)
|
private let fetchControls = Atomic<FetchControls?>(value: nil)
|
||||||
@ -404,8 +425,8 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
|
|
||||||
private var secretTimer: SwiftSignalKit.Timer?
|
private var secretTimer: SwiftSignalKit.Timer?
|
||||||
|
|
||||||
var visibilityPromise = ValuePromise<Bool>(false, ignoreRepeated: true)
|
public var visibilityPromise = ValuePromise<Bool>(false, ignoreRepeated: true)
|
||||||
var visibility: Bool = false {
|
public var visibility: Bool = false {
|
||||||
didSet {
|
didSet {
|
||||||
self.updateVisibility()
|
self.updateVisibility()
|
||||||
}
|
}
|
||||||
@ -431,11 +452,11 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
self.visibilityPromise.set(visibility)
|
self.visibilityPromise.set(visibility)
|
||||||
}
|
}
|
||||||
|
|
||||||
var activateLocalContent: (InteractiveMediaNodeActivateContent) -> Void = { _ in }
|
public var activateLocalContent: (InteractiveMediaNodeActivateContent) -> Void = { _ in }
|
||||||
var activatePinch: ((PinchSourceContainerNode) -> Void)?
|
public var activatePinch: ((PinchSourceContainerNode) -> Void)?
|
||||||
var updateMessageReaction: ((Message, ChatControllerInteractionReaction) -> Void)?
|
public var updateMessageReaction: ((Message, ChatControllerInteractionReaction) -> Void)?
|
||||||
|
|
||||||
override init() {
|
override public init() {
|
||||||
self.pinchContainerNode = PinchSourceContainerNode()
|
self.pinchContainerNode = PinchSourceContainerNode()
|
||||||
|
|
||||||
self.dateAndStatusNode = ChatMessageDateAndStatusNode()
|
self.dateAndStatusNode = ChatMessageDateAndStatusNode()
|
||||||
@ -541,15 +562,15 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
self.secretTimer?.invalidate()
|
self.secretTimer?.invalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
func isAvailableForGalleryTransition() -> Bool {
|
public func isAvailableForGalleryTransition() -> Bool {
|
||||||
return self.automaticPlayback ?? false
|
return self.automaticPlayback ?? false
|
||||||
}
|
}
|
||||||
|
|
||||||
func isAvailableForInstantPageTransition() -> Bool {
|
public func isAvailableForInstantPageTransition() -> Bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
override func didLoad() {
|
override public func didLoad() {
|
||||||
super.didLoad()
|
super.didLoad()
|
||||||
|
|
||||||
self.imageNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.imageTap(_:))))
|
self.imageNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.imageTap(_:))))
|
||||||
@ -615,7 +636,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func imageTap(_ recognizer: UITapGestureRecognizer) {
|
@objc private func imageTap(_ recognizer: UITapGestureRecognizer) {
|
||||||
if case .ended = recognizer.state {
|
if case .ended = recognizer.state {
|
||||||
let point = recognizer.location(in: self.imageNode.view)
|
let point = recognizer.location(in: self.imageNode.view)
|
||||||
if let _ = self.attributes?.updatingMedia {
|
if let _ = self.attributes?.updatingMedia {
|
||||||
@ -660,7 +681,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func asyncLayout() -> (_ context: AccountContext, _ presentationData: ChatPresentationData, _ dateTimeFormat: PresentationDateTimeFormat, _ message: Message, _ associatedData: ChatMessageItemAssociatedData, _ attributes: ChatMessageEntryAttributes, _ media: Media, _ dateAndStatus: ChatMessageDateAndStatus?, _ automaticDownload: InteractiveMediaNodeAutodownloadMode, _ peerType: MediaAutoDownloadPeerType, _ peerId: EnginePeer.Id?, _ sizeCalculation: InteractiveMediaNodeSizeCalculation, _ layoutConstants: ChatMessageItemLayoutConstants, _ contentMode: InteractiveMediaNodeContentMode, _ presentationContext: ChatPresentationContext) -> (CGSize, CGFloat, (CGSize, Bool, Bool, ImageCorners) -> (CGFloat, (CGFloat) -> (CGSize, (ListViewItemUpdateAnimation, Bool) -> Void))) {
|
public func asyncLayout() -> (_ context: AccountContext, _ presentationData: ChatPresentationData, _ dateTimeFormat: PresentationDateTimeFormat, _ message: Message, _ associatedData: ChatMessageItemAssociatedData, _ attributes: ChatMessageEntryAttributes, _ media: Media, _ dateAndStatus: ChatMessageDateAndStatus?, _ automaticDownload: InteractiveMediaNodeAutodownloadMode, _ peerType: MediaAutoDownloadPeerType, _ peerId: EnginePeer.Id?, _ sizeCalculation: InteractiveMediaNodeSizeCalculation, _ layoutConstants: ChatMessageItemLayoutConstants, _ contentMode: InteractiveMediaNodeContentMode, _ presentationContext: ChatPresentationContext) -> (CGSize, CGFloat, (CGSize, Bool, Bool, ImageCorners) -> (CGFloat, (CGFloat) -> (CGSize, (ListViewItemUpdateAnimation, Bool) -> Void))) {
|
||||||
let currentMessage = self.message
|
let currentMessage = self.message
|
||||||
let currentMedia = self.media
|
let currentMedia = self.media
|
||||||
let imageLayout = self.imageNode.asyncLayout()
|
let imageLayout = self.imageNode.asyncLayout()
|
||||||
@ -2200,7 +2221,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static func asyncLayout(_ node: ChatMessageInteractiveMediaNode?) -> (_ context: AccountContext, _ presentationData: ChatPresentationData, _ dateTimeFormat: PresentationDateTimeFormat, _ message: Message, _ associatedData: ChatMessageItemAssociatedData, _ attributes: ChatMessageEntryAttributes, _ media: Media, _ dateAndStatus: ChatMessageDateAndStatus?, _ automaticDownload: InteractiveMediaNodeAutodownloadMode, _ peerType: MediaAutoDownloadPeerType, _ peerId: EnginePeer.Id?, _ sizeCalculation: InteractiveMediaNodeSizeCalculation, _ layoutConstants: ChatMessageItemLayoutConstants, _ contentMode: InteractiveMediaNodeContentMode, _ presentationContext: ChatPresentationContext) -> (CGSize, CGFloat, (CGSize, Bool, Bool, ImageCorners) -> (CGFloat, (CGFloat) -> (CGSize, (ListViewItemUpdateAnimation, Bool) -> ChatMessageInteractiveMediaNode))) {
|
public static func asyncLayout(_ node: ChatMessageInteractiveMediaNode?) -> (_ context: AccountContext, _ presentationData: ChatPresentationData, _ dateTimeFormat: PresentationDateTimeFormat, _ message: Message, _ associatedData: ChatMessageItemAssociatedData, _ attributes: ChatMessageEntryAttributes, _ media: Media, _ dateAndStatus: ChatMessageDateAndStatus?, _ automaticDownload: InteractiveMediaNodeAutodownloadMode, _ peerType: MediaAutoDownloadPeerType, _ peerId: EnginePeer.Id?, _ sizeCalculation: InteractiveMediaNodeSizeCalculation, _ layoutConstants: ChatMessageItemLayoutConstants, _ contentMode: InteractiveMediaNodeContentMode, _ presentationContext: ChatPresentationContext) -> (CGSize, CGFloat, (CGSize, Bool, Bool, ImageCorners) -> (CGFloat, (CGFloat) -> (CGSize, (ListViewItemUpdateAnimation, Bool) -> ChatMessageInteractiveMediaNode))) {
|
||||||
let currentAsyncLayout = node?.asyncLayout()
|
let currentAsyncLayout = node?.asyncLayout()
|
||||||
|
|
||||||
return { context, presentationData, dateTimeFormat, message, associatedData, attributes, media, dateAndStatus, automaticDownload, peerType, peerId, sizeCalculation, layoutConstants, contentMode, presentationContext in
|
return { context, presentationData, dateTimeFormat, message, associatedData, attributes, media, dateAndStatus, automaticDownload, peerType, peerId, sizeCalculation, layoutConstants, contentMode, presentationContext in
|
||||||
@ -2232,11 +2253,11 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func setOverlayColor(_ color: UIColor?, animated: Bool) {
|
public func setOverlayColor(_ color: UIColor?, animated: Bool) {
|
||||||
self.imageNode.setOverlayColor(color, animated: animated)
|
self.imageNode.setOverlayColor(color, animated: animated)
|
||||||
}
|
}
|
||||||
|
|
||||||
func isReadyForInteractivePreview() -> Bool {
|
public func isReadyForInteractivePreview() -> Bool {
|
||||||
if let fetchStatus = self.fetchStatus, case .Local = fetchStatus {
|
if let fetchStatus = self.fetchStatus, case .Local = fetchStatus {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
@ -2244,7 +2265,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateIsHidden(_ isHidden: Bool) {
|
public func updateIsHidden(_ isHidden: Bool) {
|
||||||
if isHidden && !self.internallyVisible {
|
if isHidden && !self.internallyVisible {
|
||||||
self.internallyVisible = true
|
self.internallyVisible = true
|
||||||
self.updateVisibility()
|
self.updateVisibility()
|
||||||
@ -2278,7 +2299,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func transitionNode(adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
public func transitionNode(adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
var bounds: CGRect
|
var bounds: CGRect
|
||||||
if let currentImageArguments = self.currentImageArguments {
|
if let currentImageArguments = self.currentImageArguments {
|
||||||
if adjustRect {
|
if adjustRect {
|
||||||
@ -2336,7 +2357,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func playMediaWithSound() -> (action: (Double?) -> Void, soundEnabled: Bool, isVideoMessage: Bool, isUnread: Bool, badgeNode: ASDisplayNode?)? {
|
public func playMediaWithSound() -> (action: (Double?) -> Void, soundEnabled: Bool, isVideoMessage: Bool, isUnread: Bool, badgeNode: ASDisplayNode?)? {
|
||||||
var isAnimated = false
|
var isAnimated = false
|
||||||
if let file = self.media as? TelegramMediaFile, file.isAnimated {
|
if let file = self.media as? TelegramMediaFile, file.isAnimated {
|
||||||
isAnimated = true
|
isAnimated = true
|
||||||
19
submodules/TelegramUI/Components/WallpaperPreviewMedia/BUILD
Normal file
19
submodules/TelegramUI/Components/WallpaperPreviewMedia/BUILD
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
|
||||||
|
|
||||||
|
swift_library(
|
||||||
|
name = "WallpaperPreviewMedia",
|
||||||
|
module_name = "WallpaperPreviewMedia",
|
||||||
|
srcs = glob([
|
||||||
|
"Sources/**/*.swift",
|
||||||
|
]),
|
||||||
|
copts = [
|
||||||
|
"-warnings-as-errors",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//submodules/Postbox",
|
||||||
|
"//submodules/TelegramCore",
|
||||||
|
],
|
||||||
|
visibility = [
|
||||||
|
"//visibility:public",
|
||||||
|
],
|
||||||
|
)
|
||||||
@ -3,7 +3,7 @@ import UIKit
|
|||||||
import Postbox
|
import Postbox
|
||||||
import TelegramCore
|
import TelegramCore
|
||||||
|
|
||||||
enum WallpaperPreviewMediaContent: Equatable {
|
public enum WallpaperPreviewMediaContent: Equatable {
|
||||||
case file(file: TelegramMediaFile, colors: [UInt32], rotation: Int32?, intensity: Int32?, Bool, Bool)
|
case file(file: TelegramMediaFile, colors: [UInt32], rotation: Int32?, intensity: Int32?, Bool, Bool)
|
||||||
case image(representations: [TelegramMediaImageRepresentation])
|
case image(representations: [TelegramMediaImageRepresentation])
|
||||||
case color(UIColor)
|
case color(UIColor)
|
||||||
@ -11,23 +11,23 @@ enum WallpaperPreviewMediaContent: Equatable {
|
|||||||
case themeSettings(TelegramThemeSettings)
|
case themeSettings(TelegramThemeSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
final class WallpaperPreviewMedia: Media {
|
public final class WallpaperPreviewMedia: Media {
|
||||||
var id: MediaId? {
|
public var id: MediaId? {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
let peerIds: [PeerId] = []
|
public let peerIds: [PeerId] = []
|
||||||
|
|
||||||
let content: WallpaperPreviewMediaContent
|
public let content: WallpaperPreviewMediaContent
|
||||||
|
|
||||||
init(content: WallpaperPreviewMediaContent) {
|
public init(content: WallpaperPreviewMediaContent) {
|
||||||
self.content = content
|
self.content = content
|
||||||
}
|
}
|
||||||
|
|
||||||
init(decoder: PostboxDecoder) {
|
public init(decoder: PostboxDecoder) {
|
||||||
self.content = .color(.clear)
|
self.content = .color(.clear)
|
||||||
}
|
}
|
||||||
|
|
||||||
func encode(_ encoder: PostboxEncoder) {
|
public func encode(_ encoder: PostboxEncoder) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public func isEqual(to other: Media) -> Bool {
|
public func isEqual(to other: Media) -> Bool {
|
||||||
@ -47,7 +47,13 @@ final class WallpaperPreviewMedia: Media {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension WallpaperPreviewMedia {
|
private extension UIColor {
|
||||||
|
convenience init(rgb: UInt32) {
|
||||||
|
self.init(red: CGFloat((rgb >> 16) & 0xff) / 255.0, green: CGFloat((rgb >> 8) & 0xff) / 255.0, blue: CGFloat(rgb & 0xff) / 255.0, alpha: 1.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public extension WallpaperPreviewMedia {
|
||||||
convenience init?(wallpaper: TelegramWallpaper) {
|
convenience init?(wallpaper: TelegramWallpaper) {
|
||||||
switch wallpaper {
|
switch wallpaper {
|
||||||
case let .color(color):
|
case let .color(color):
|
||||||
@ -10,6 +10,56 @@ import WallpaperBackgroundNode
|
|||||||
|
|
||||||
private let titleFont = Font.medium(16.0)
|
private let titleFont = Font.medium(16.0)
|
||||||
|
|
||||||
|
private extension UIBezierPath {
|
||||||
|
convenience init(roundRect rect: CGRect, topLeftRadius: CGFloat = 0.0, topRightRadius: CGFloat = 0.0, bottomLeftRadius: CGFloat = 0.0, bottomRightRadius: CGFloat = 0.0) {
|
||||||
|
self.init()
|
||||||
|
|
||||||
|
let path = CGMutablePath()
|
||||||
|
|
||||||
|
let topLeft = rect.origin
|
||||||
|
let topRight = CGPoint(x: rect.maxX, y: rect.minY)
|
||||||
|
let bottomRight = CGPoint(x: rect.maxX, y: rect.maxY)
|
||||||
|
let bottomLeft = CGPoint(x: rect.minX, y: rect.maxY)
|
||||||
|
|
||||||
|
if topLeftRadius != .zero {
|
||||||
|
path.move(to: CGPoint(x: topLeft.x+topLeftRadius, y: topLeft.y))
|
||||||
|
} else {
|
||||||
|
path.move(to: CGPoint(x: topLeft.x, y: topLeft.y))
|
||||||
|
}
|
||||||
|
|
||||||
|
if topRightRadius != .zero {
|
||||||
|
path.addLine(to: CGPoint(x: topRight.x-topRightRadius, y: topRight.y))
|
||||||
|
path.addCurve(to: CGPoint(x: topRight.x, y: topRight.y+topRightRadius), control1: CGPoint(x: topRight.x, y: topRight.y), control2:CGPoint(x: topRight.x, y: topRight.y + topRightRadius))
|
||||||
|
} else {
|
||||||
|
path.addLine(to: CGPoint(x: topRight.x, y: topRight.y))
|
||||||
|
}
|
||||||
|
|
||||||
|
if bottomRightRadius != .zero {
|
||||||
|
path.addLine(to: CGPoint(x: bottomRight.x, y: bottomRight.y-bottomRightRadius))
|
||||||
|
path.addCurve(to: CGPoint(x: bottomRight.x-bottomRightRadius, y: bottomRight.y), control1: CGPoint(x: bottomRight.x, y: bottomRight.y), control2: CGPoint(x: bottomRight.x-bottomRightRadius, y: bottomRight.y))
|
||||||
|
} else {
|
||||||
|
path.addLine(to: CGPoint(x: bottomRight.x, y: bottomRight.y))
|
||||||
|
}
|
||||||
|
|
||||||
|
if bottomLeftRadius != .zero {
|
||||||
|
path.addLine(to: CGPoint(x: bottomLeft.x+bottomLeftRadius, y: bottomLeft.y))
|
||||||
|
path.addCurve(to: CGPoint(x: bottomLeft.x, y: bottomLeft.y-bottomLeftRadius), control1: CGPoint(x: bottomLeft.x, y: bottomLeft.y), control2: CGPoint(x: bottomLeft.x, y: bottomLeft.y-bottomLeftRadius))
|
||||||
|
} else {
|
||||||
|
path.addLine(to: CGPoint(x: bottomLeft.x, y: bottomLeft.y))
|
||||||
|
}
|
||||||
|
|
||||||
|
if topLeftRadius != .zero {
|
||||||
|
path.addLine(to: CGPoint(x: topLeft.x, y: topLeft.y+topLeftRadius))
|
||||||
|
path.addCurve(to: CGPoint(x: topLeft.x+topLeftRadius, y: topLeft.y) , control1: CGPoint(x: topLeft.x, y: topLeft.y) , control2: CGPoint(x: topLeft.x+topLeftRadius, y: topLeft.y))
|
||||||
|
} else {
|
||||||
|
path.addLine(to: CGPoint(x: topLeft.x, y: topLeft.y))
|
||||||
|
}
|
||||||
|
|
||||||
|
path.closeSubpath()
|
||||||
|
self.cgPath = path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final class ChatMessageActionButtonNode: ASDisplayNode {
|
private final class ChatMessageActionButtonNode: ASDisplayNode {
|
||||||
//private let backgroundBlurNode: NavigationBackgroundNode
|
//private let backgroundBlurNode: NavigationBackgroundNode
|
||||||
private var backgroundBlurView: PortalView?
|
private var backgroundBlurView: PortalView?
|
||||||
|
|||||||
@ -25,6 +25,8 @@ import ChatMessageItemCommon
|
|||||||
import ChatMessageBubbleContentNode
|
import ChatMessageBubbleContentNode
|
||||||
import ChatMessageInteractiveInstantVideoNode
|
import ChatMessageInteractiveInstantVideoNode
|
||||||
import ChatMessageInteractiveFileNode
|
import ChatMessageInteractiveFileNode
|
||||||
|
import ChatMessageInteractiveMediaNode
|
||||||
|
import WallpaperPreviewMedia
|
||||||
|
|
||||||
private let buttonFont = Font.semibold(13.0)
|
private let buttonFont = Font.semibold(13.0)
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import ChatControllerInteraction
|
|||||||
import ChatMessageDateAndStatusNode
|
import ChatMessageDateAndStatusNode
|
||||||
import ChatMessageBubbleContentNode
|
import ChatMessageBubbleContentNode
|
||||||
import ChatMessageItemCommon
|
import ChatMessageItemCommon
|
||||||
|
import ChatMessageInteractiveMediaNode
|
||||||
|
|
||||||
class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode {
|
class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode {
|
||||||
override var supportsMosaic: Bool {
|
override var supportsMosaic: Bool {
|
||||||
|
|||||||
@ -20,6 +20,7 @@ import ComponentFlow
|
|||||||
import AudioTranscriptionPendingIndicatorComponent
|
import AudioTranscriptionPendingIndicatorComponent
|
||||||
import ChatMessageBubbleContentNode
|
import ChatMessageBubbleContentNode
|
||||||
import ChatMessageItemCommon
|
import ChatMessageItemCommon
|
||||||
|
import WallpaperPreviewMedia
|
||||||
|
|
||||||
class ChatMessageWallpaperBubbleContentNode: ChatMessageBubbleContentNode {
|
class ChatMessageWallpaperBubbleContentNode: ChatMessageBubbleContentNode {
|
||||||
private var mediaBackgroundContent: WallpaperBubbleBackgroundNode?
|
private var mediaBackgroundContent: WallpaperBubbleBackgroundNode?
|
||||||
|
|||||||
@ -15,6 +15,8 @@ import GalleryData
|
|||||||
import TelegramPresentationData
|
import TelegramPresentationData
|
||||||
import ChatMessageBubbleContentNode
|
import ChatMessageBubbleContentNode
|
||||||
import ChatMessageItemCommon
|
import ChatMessageItemCommon
|
||||||
|
import WallpaperPreviewMedia
|
||||||
|
import ChatMessageInteractiveMediaNode
|
||||||
|
|
||||||
private let titleFont: UIFont = Font.semibold(15.0)
|
private let titleFont: UIFont = Font.semibold(15.0)
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import TelegramUIPreferences
|
|||||||
import AccountContext
|
import AccountContext
|
||||||
import PhotoResources
|
import PhotoResources
|
||||||
import UniversalMediaPlayer
|
import UniversalMediaPlayer
|
||||||
|
import ChatMessageInteractiveMediaNode
|
||||||
|
|
||||||
private final class PrefetchMediaContext {
|
private final class PrefetchMediaContext {
|
||||||
let fetchDisposable = MetaDisposable()
|
let fetchDisposable = MetaDisposable()
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import PhotoResources
|
|||||||
import StickerResources
|
import StickerResources
|
||||||
import Emoji
|
import Emoji
|
||||||
import UniversalMediaPlayer
|
import UniversalMediaPlayer
|
||||||
|
import ChatMessageInteractiveMediaNode
|
||||||
|
|
||||||
private final class PrefetchMediaContext {
|
private final class PrefetchMediaContext {
|
||||||
let fetchDisposable = MetaDisposable()
|
let fetchDisposable = MetaDisposable()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user