mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-07-25 20:50:47 +00:00
Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios
This commit is contained in:
commit
2a610b46b9
@ -250,10 +250,10 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func setVisibilityAlpha(_ alpha: CGFloat) {
|
override func setVisibilityAlpha(_ alpha: CGFloat, animated: Bool) {
|
||||||
self.visibilityAlpha = alpha
|
self.visibilityAlpha = alpha
|
||||||
self.contentNode.alpha = alpha
|
self.contentNode.alpha = alpha
|
||||||
self.scrubberView?.setCollapsed(alpha < 1.0 ? true : false, animated: true)
|
self.scrubberView?.setCollapsed(alpha < 1.0 ? true : false, animated: animated)
|
||||||
}
|
}
|
||||||
|
|
||||||
init(context: AccountContext, presentationData: PresentationData, present: @escaping (ViewController, Any?) -> Void = { _, _ in }) {
|
init(context: AccountContext, presentationData: PresentationData, present: @escaping (ViewController, Any?) -> Void = { _, _ in }) {
|
||||||
|
@ -120,13 +120,32 @@ final class ChatVideoGalleryItemScrubberView: UIView {
|
|||||||
self.fetchStatusDisposable.dispose()
|
self.fetchStatusDisposable.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var collapsed: Bool = false
|
||||||
func setCollapsed(_ collapsed: Bool, animated: Bool) {
|
func setCollapsed(_ collapsed: Bool, animated: Bool) {
|
||||||
let alpha: CGFloat = collapsed ? 0.0 : 1.0
|
guard self.collapsed != collapsed else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
self.scrubberNode.setCollapsed(collapsed, animated: animated)
|
self.collapsed = collapsed
|
||||||
|
|
||||||
|
let alpha: CGFloat = collapsed ? 0.0 : 1.0
|
||||||
self.leftTimestampNode.alpha = alpha
|
self.leftTimestampNode.alpha = alpha
|
||||||
self.rightTimestampNode.alpha = alpha
|
self.rightTimestampNode.alpha = alpha
|
||||||
self.infoNode.alpha = alpha
|
self.infoNode.alpha = alpha
|
||||||
|
self.updateScrubberVisibility(animated: animated)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateScrubberVisibility(animated: Bool) {
|
||||||
|
var collapsed = self.collapsed
|
||||||
|
var alpha: CGFloat = 1.0
|
||||||
|
if let playbackStatus = self.playbackStatus, playbackStatus.duration <= 30.0 {
|
||||||
|
} else {
|
||||||
|
alpha = self.collapsed ? 0.0 : 1.0
|
||||||
|
collapsed = false
|
||||||
|
}
|
||||||
|
self.scrubberNode.setCollapsed(collapsed, animated: animated)
|
||||||
|
let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.3, curve: .linear) : .immediate
|
||||||
|
transition.updateAlpha(node: self.scrubberNode, alpha: alpha)
|
||||||
}
|
}
|
||||||
|
|
||||||
func setStatusSignal(_ status: Signal<MediaPlayerStatus, NoError>?) {
|
func setStatusSignal(_ status: Signal<MediaPlayerStatus, NoError>?) {
|
||||||
@ -232,7 +251,7 @@ final class ChatVideoGalleryItemScrubberView: UIView {
|
|||||||
self.containerLayout = (size, leftInset, rightInset)
|
self.containerLayout = (size, leftInset, rightInset)
|
||||||
|
|
||||||
let scrubberHeight: CGFloat = 14.0
|
let scrubberHeight: CGFloat = 14.0
|
||||||
let scrubberInset: CGFloat
|
var scrubberInset: CGFloat
|
||||||
let leftTimestampOffset: CGFloat
|
let leftTimestampOffset: CGFloat
|
||||||
let rightTimestampOffset: CGFloat
|
let rightTimestampOffset: CGFloat
|
||||||
let infoOffset: CGFloat
|
let infoOffset: CGFloat
|
||||||
@ -257,7 +276,7 @@ final class ChatVideoGalleryItemScrubberView: UIView {
|
|||||||
let infoSize = self.infoNode.measure(infoConstrainedSize)
|
let infoSize = self.infoNode.measure(infoConstrainedSize)
|
||||||
self.infoNode.bounds = CGRect(origin: CGPoint(), size: infoSize)
|
self.infoNode.bounds = CGRect(origin: CGPoint(), size: infoSize)
|
||||||
transition.updatePosition(node: self.infoNode, position: CGPoint(x: size.width / 2.0, y: infoOffset + infoSize.height / 2.0))
|
transition.updatePosition(node: self.infoNode, position: CGPoint(x: size.width / 2.0, y: infoOffset + infoSize.height / 2.0))
|
||||||
self.infoNode.alpha = size.width < size.height ? 1.0 : 0.0
|
self.infoNode.alpha = size.width < size.height && !self.collapsed ? 1.0 : 0.0
|
||||||
|
|
||||||
self.scrubberNode.frame = CGRect(origin: CGPoint(x: scrubberInset, y: 6.0), size: CGSize(width: size.width - leftInset - rightInset - scrubberInset * 2.0, height: scrubberHeight))
|
self.scrubberNode.frame = CGRect(origin: CGPoint(x: scrubberInset, y: 6.0), size: CGSize(width: size.width - leftInset - rightInset - scrubberInset * 2.0, height: scrubberHeight))
|
||||||
}
|
}
|
||||||
|
@ -253,7 +253,7 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture
|
|||||||
if displayThumbnailPanel {
|
if displayThumbnailPanel {
|
||||||
thumbnailPanelHeight = 52.0
|
thumbnailPanelHeight = 52.0
|
||||||
}
|
}
|
||||||
let thumbnailsFrame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - 40.0 - panelHeight + 4.0 - layout.intrinsicInsets.bottom + (self.areControlsHidden ? 54.0 : 0.0)), size: CGSize(width: layout.size.width, height: panelHeight - 4.0))
|
let thumbnailsFrame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - 40.0 - panelHeight + 4.0 - layout.intrinsicInsets.bottom + (self.areControlsHidden ? 106.0 : 0.0)), size: CGSize(width: layout.size.width, height: panelHeight - 4.0))
|
||||||
transition.updateFrame(node: currentThumbnailContainerNode, frame: thumbnailsFrame)
|
transition.updateFrame(node: currentThumbnailContainerNode, frame: thumbnailsFrame)
|
||||||
currentThumbnailContainerNode.updateLayout(size: thumbnailsFrame.size, transition: transition)
|
currentThumbnailContainerNode.updateLayout(size: thumbnailsFrame.size, transition: transition)
|
||||||
|
|
||||||
@ -279,6 +279,9 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture
|
|||||||
}
|
}
|
||||||
|
|
||||||
open func setControlsHidden(_ hidden: Bool, animated: Bool) {
|
open func setControlsHidden(_ hidden: Bool, animated: Bool) {
|
||||||
|
guard self.areControlsHidden != hidden else {
|
||||||
|
return
|
||||||
|
}
|
||||||
self.areControlsHidden = hidden
|
self.areControlsHidden = hidden
|
||||||
self.controlsVisibilityChanged?(!hidden)
|
self.controlsVisibilityChanged?(!hidden)
|
||||||
if animated {
|
if animated {
|
||||||
@ -286,7 +289,7 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture
|
|||||||
let alpha: CGFloat = self.areControlsHidden ? 0.0 : 1.0
|
let alpha: CGFloat = self.areControlsHidden ? 0.0 : 1.0
|
||||||
self.navigationBar?.alpha = alpha
|
self.navigationBar?.alpha = alpha
|
||||||
self.statusBar?.updateAlpha(alpha, transition: .animated(duration: 0.3, curve: .easeInOut))
|
self.statusBar?.updateAlpha(alpha, transition: .animated(duration: 0.3, curve: .easeInOut))
|
||||||
self.footerNode.setVisibilityAlpha(alpha)
|
self.footerNode.setVisibilityAlpha(alpha, animated: animated)
|
||||||
self.updateThumbnailContainerNodeAlpha(.immediate)
|
self.updateThumbnailContainerNodeAlpha(.immediate)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -297,7 +300,7 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture
|
|||||||
let alpha: CGFloat = self.areControlsHidden ? 0.0 : 1.0
|
let alpha: CGFloat = self.areControlsHidden ? 0.0 : 1.0
|
||||||
self.navigationBar?.alpha = alpha
|
self.navigationBar?.alpha = alpha
|
||||||
self.statusBar?.updateAlpha(alpha, transition: .immediate)
|
self.statusBar?.updateAlpha(alpha, transition: .immediate)
|
||||||
self.footerNode.setVisibilityAlpha(alpha)
|
self.footerNode.setVisibilityAlpha(alpha, animated: animated)
|
||||||
self.updateThumbnailContainerNodeAlpha(.immediate)
|
self.updateThumbnailContainerNodeAlpha(.immediate)
|
||||||
|
|
||||||
if let (navigationBarHeight, layout) = self.containerLayout {
|
if let (navigationBarHeight, layout) = self.containerLayout {
|
||||||
|
@ -21,7 +21,7 @@ open class GalleryFooterContentNode: ASDisplayNode {
|
|||||||
public var controllerInteraction: GalleryControllerInteraction?
|
public var controllerInteraction: GalleryControllerInteraction?
|
||||||
|
|
||||||
var visibilityAlpha: CGFloat = 1.0
|
var visibilityAlpha: CGFloat = 1.0
|
||||||
open func setVisibilityAlpha(_ alpha: CGFloat) {
|
open func setVisibilityAlpha(_ alpha: CGFloat, animated: Bool) {
|
||||||
self.visibilityAlpha = alpha
|
self.visibilityAlpha = alpha
|
||||||
self.alpha = alpha
|
self.alpha = alpha
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,10 @@ public final class GalleryFooterNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private var visibilityAlpha: CGFloat = 1.0
|
private var visibilityAlpha: CGFloat = 1.0
|
||||||
public func setVisibilityAlpha(_ alpha: CGFloat) {
|
public func setVisibilityAlpha(_ alpha: CGFloat, animated: Bool) {
|
||||||
self.visibilityAlpha = alpha
|
self.visibilityAlpha = alpha
|
||||||
self.backgroundNode.alpha = alpha
|
self.backgroundNode.alpha = alpha
|
||||||
self.currentFooterContentNode?.setVisibilityAlpha(alpha)
|
self.currentFooterContentNode?.setVisibilityAlpha(alpha, animated: true)
|
||||||
self.currentOverlayContentNode?.setVisibilityAlpha(alpha)
|
self.currentOverlayContentNode?.setVisibilityAlpha(alpha)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ public final class GalleryFooterNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
self.currentFooterContentNode = footerContentNode
|
self.currentFooterContentNode = footerContentNode
|
||||||
if let footerContentNode = footerContentNode {
|
if let footerContentNode = footerContentNode {
|
||||||
footerContentNode.setVisibilityAlpha(self.visibilityAlpha)
|
footerContentNode.setVisibilityAlpha(self.visibilityAlpha, animated: transition.isAnimated)
|
||||||
footerContentNode.controllerInteraction = self.controllerInteraction
|
footerContentNode.controllerInteraction = self.controllerInteraction
|
||||||
footerContentNode.requestLayout = { [weak self] transition in
|
footerContentNode.requestLayout = { [weak self] transition in
|
||||||
if let strongSelf = self, let (currentLayout, currentThumbnailPanelHeight, isHidden) = strongSelf.currentLayout {
|
if let strongSelf = self, let (currentLayout, currentThumbnailPanelHeight, isHidden) = strongSelf.currentLayout {
|
||||||
@ -67,7 +67,7 @@ public final class GalleryFooterNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var backgroundHeight: CGFloat = 0.0
|
var backgroundHeight: CGFloat = 0.0
|
||||||
let verticalOffset: CGFloat = isHidden ? (layout.size.width > layout.size.height ? 44.0 : 54.0) : 0.0
|
let verticalOffset: CGFloat = isHidden ? (layout.size.width > layout.size.height ? 44.0 : (thumbnailPanelHeight > 0.0 ? 106.0 : 54.0)) : 0.0
|
||||||
if let footerContentNode = self.currentFooterContentNode {
|
if let footerContentNode = self.currentFooterContentNode {
|
||||||
backgroundHeight = footerContentNode.updateLayout(size: layout.size, metrics: layout.metrics, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: cleanInsets.bottom, contentInset: thumbnailPanelHeight, transition: transition)
|
backgroundHeight = footerContentNode.updateLayout(size: layout.size, metrics: layout.metrics, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: cleanInsets.bottom, contentInset: thumbnailPanelHeight, transition: transition)
|
||||||
transition.updateFrame(node: footerContentNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - backgroundHeight + verticalOffset), size: CGSize(width: layout.size.width, height: backgroundHeight)))
|
transition.updateFrame(node: footerContentNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - backgroundHeight + verticalOffset), size: CGSize(width: layout.size.width, height: backgroundHeight)))
|
||||||
|
@ -5069,11 +5069,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
self.keepPeerInfoScreenDataHotDisposable.set(keepPeerInfoScreenDataHot(context: context, peerId: peerId).start())
|
self.keepPeerInfoScreenDataHotDisposable.set(keepPeerInfoScreenDataHot(context: context, peerId: peerId).start())
|
||||||
self.preloadAvatarDisposable.set((peerInfoProfilePhotosWithCache(context: context, peerId: peerId)
|
self.preloadAvatarDisposable.set((peerInfoProfilePhotosWithCache(context: context, peerId: peerId)
|
||||||
|> mapToSignal { result -> Signal<Never, NoError> in
|
|> mapToSignal { result -> Signal<Never, NoError> in
|
||||||
if let video = result.first?.videoRepresentations.first {
|
var signals: [Signal<Never, NoError>] = [.complete()]
|
||||||
let duration: Double = (video.representation.startTimestamp ?? 0.0) + 4.0
|
for i in 0 ..< min(5, result.count) {
|
||||||
return preloadVideoResource(postbox: context.account.postbox, resourceReference: video.reference, duration: duration)
|
if let video = result[i].videoRepresentations.first {
|
||||||
|
let duration: Double = (video.representation.startTimestamp ?? 0.0) + (i == 0 ? 4.0 : 2.0)
|
||||||
|
signals.append(preloadVideoResource(postbox: context.account.postbox, resourceReference: video.reference, duration: duration))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return combineLatest(signals) |> mapToSignal { _ in
|
||||||
|
return .never()
|
||||||
}
|
}
|
||||||
return .complete()
|
|
||||||
}).start())
|
}).start())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1002,7 +1002,8 @@ final class PeerInfoAvatarListContainerNode: ASDisplayNode {
|
|||||||
var additiveTransitionOffset: CGFloat = 0.0
|
var additiveTransitionOffset: CGFloat = 0.0
|
||||||
var itemsAdded = false
|
var itemsAdded = false
|
||||||
if self.currentIndex >= 0 && self.currentIndex < self.items.count {
|
if self.currentIndex >= 0 && self.currentIndex < self.items.count {
|
||||||
for i in max(0, self.currentIndex - 1) ... min(self.currentIndex + 1, self.items.count - 1) {
|
let preloadSpan: Int = 2
|
||||||
|
for i in max(0, self.currentIndex - preloadSpan) ... min(self.currentIndex + preloadSpan, self.items.count - 1) {
|
||||||
validIds.append(self.items[i].id)
|
validIds.append(self.items[i].id)
|
||||||
var itemNode: PeerInfoAvatarListItemNode?
|
var itemNode: PeerInfoAvatarListItemNode?
|
||||||
var wasAdded = false
|
var wasAdded = false
|
||||||
@ -2576,8 +2577,9 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
|
|
||||||
func initiateAvatarExpansion(gallery: Bool) {
|
func initiateAvatarExpansion(gallery: Bool) {
|
||||||
if self.isAvatarExpanded || gallery {
|
if self.isAvatarExpanded || gallery {
|
||||||
if let currentEntry = self.avatarListNode.listContainerNode.currentEntry {
|
if let currentEntry = self.avatarListNode.listContainerNode.currentEntry, let firstEntry = self.avatarListNode.listContainerNode.galleryEntries.first {
|
||||||
self.requestAvatarExpansion?(true, self.avatarListNode.listContainerNode.galleryEntries, self.avatarListNode.listContainerNode.currentEntry, self.avatarTransitionArguments(entry: currentEntry))
|
let entry = gallery ? firstEntry : currentEntry
|
||||||
|
self.requestAvatarExpansion?(true, self.avatarListNode.listContainerNode.galleryEntries, entry, self.avatarTransitionArguments(entry: currentEntry))
|
||||||
}
|
}
|
||||||
} else if let entry = self.avatarListNode.listContainerNode.galleryEntries.first {
|
} else if let entry = self.avatarListNode.listContainerNode.galleryEntries.first {
|
||||||
let _ = self.avatarListNode.avatarContainerNode.avatarNode
|
let _ = self.avatarListNode.avatarContainerNode.avatarNode
|
||||||
|
Loading…
x
Reference in New Issue
Block a user