Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios

This commit is contained in:
Ilya Laktyushin 2023-03-10 18:32:06 +04:00
commit 35f21a6cb6
2 changed files with 50 additions and 5 deletions

View File

@ -18,7 +18,7 @@ import HierarchyTrackingLayer
private let motionAmount: CGFloat = 32.0 private let motionAmount: CGFloat = 32.0
private func generateBlurredContents(image: UIImage) -> UIImage? { private func generateBlurredContents(image: UIImage, dimColor: UIColor?) -> UIImage? {
let size = image.size.aspectFitted(CGSize(width: 64.0, height: 64.0)) let size = image.size.aspectFitted(CGSize(width: 64.0, height: 64.0))
guard let context = DrawingContext(size: size, scale: 1.0, opaque: true, clear: false) else { guard let context = DrawingContext(size: size, scale: 1.0, opaque: true, clear: false) else {
return nil return nil
@ -32,6 +32,13 @@ private func generateBlurredContents(image: UIImage) -> UIImage? {
adjustSaturationInContext(context: context, saturation: 1.7) adjustSaturationInContext(context: context, saturation: 1.7)
if let dimColor {
context.withFlippedContext { c in
c.setFillColor(dimColor.cgColor)
c.fill(CGRect(origin: CGPoint(), size: size))
}
}
return context.generateImage() return context.generateImage()
} }
@ -323,6 +330,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
private var cleanWallpaperNode: ASDisplayNode? private var cleanWallpaperNode: ASDisplayNode?
private var gradientWallpaperNode: GradientBackgroundNode.CloneNode? private var gradientWallpaperNode: GradientBackgroundNode.CloneNode?
private var overlayNode: ASDisplayNode?
private weak var backgroundNode: WallpaperBackgroundNodeImpl? private weak var backgroundNode: WallpaperBackgroundNodeImpl?
private var index: SparseBag<BubbleBackgroundNodeImpl>.Index? private var index: SparseBag<BubbleBackgroundNodeImpl>.Index?
@ -370,10 +378,13 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
return return
} }
var overlayColor: UIColor?
if let bubbleTheme = backgroundNode.bubbleTheme, let bubbleCorners = backgroundNode.bubbleCorners { if let bubbleTheme = backgroundNode.bubbleTheme, let bubbleCorners = backgroundNode.bubbleCorners {
let wallpaper = backgroundNode.wallpaper ?? bubbleTheme.chat.defaultWallpaper let wallpaper = backgroundNode.wallpaper ?? bubbleTheme.chat.defaultWallpaper
let graphics = PresentationResourcesChat.principalGraphics(theme: bubbleTheme, wallpaper: wallpaper, bubbleCorners: bubbleCorners) let graphics = PresentationResourcesChat.principalGraphics(theme: bubbleTheme, wallpaper: wallpaper, bubbleCorners: bubbleCorners)
var needsCleanBackground = false var needsCleanBackground = false
switch self.bubbleType { switch self.bubbleType {
case .incoming: case .incoming:
@ -401,6 +412,10 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
self.contentNode.image = nil self.contentNode.image = nil
self.contentNode.backgroundColor = nil self.contentNode.backgroundColor = nil
needsCleanBackground = true needsCleanBackground = true
//if wallpaper.isBuiltin {
overlayColor = selectDateFillStaticColor(theme: bubbleTheme, wallpaper: wallpaper)
//}
} }
var isInvertedGradient = false var isInvertedGradient = false
@ -491,6 +506,21 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
} }
} }
if let overlayColor {
let overlayNode: ASDisplayNode
if let current = self.overlayNode {
overlayNode = current
} else {
overlayNode = ASDisplayNode()
self.overlayNode = overlayNode
self.addSubnode(overlayNode)
}
overlayNode.backgroundColor = overlayColor
} else if let overlayNode = self.overlayNode {
self.overlayNode = nil
overlayNode.removeFromSupernode()
}
if let (rect, containerSize) = self.currentLayout { if let (rect, containerSize) = self.currentLayout {
self.update(rect: rect, within: containerSize) self.update(rect: rect, within: containerSize)
} }
@ -521,6 +551,9 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
gradientWallpaperNode.layer.contentsRect = shiftedContentsRect gradientWallpaperNode.layer.contentsRect = shiftedContentsRect
} }
} }
if let overlayNode = self.overlayNode {
transition.updateFrame(layer: overlayNode.layer, frame: self.bounds, delay: delay)
}
} }
func update(rect: CGRect, within containerSize: CGSize, animator: ControlledTransitionAnimator) { func update(rect: CGRect, within containerSize: CGSize, animator: ControlledTransitionAnimator) {
@ -538,6 +571,9 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
animator.updateFrame(layer: gradientWallpaperNode.layer, frame: self.bounds, completion: nil) animator.updateFrame(layer: gradientWallpaperNode.layer, frame: self.bounds, completion: nil)
animator.updateContentsRect(layer: gradientWallpaperNode.layer, contentsRect: shiftedContentsRect, completion: nil) animator.updateContentsRect(layer: gradientWallpaperNode.layer, contentsRect: shiftedContentsRect, completion: nil)
} }
if let overlayNode = self.overlayNode {
animator.updateFrame(layer: overlayNode.layer, frame: self.bounds, completion: nil)
}
} }
func update(rect: CGRect, within containerSize: CGSize, transition: CombinedTransition) { func update(rect: CGRect, within containerSize: CGSize, transition: CombinedTransition) {
@ -555,6 +591,9 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
transition.updateFrame(layer: gradientWallpaperNode.layer, frame: self.bounds) transition.updateFrame(layer: gradientWallpaperNode.layer, frame: self.bounds)
gradientWallpaperNode.layer.contentsRect = shiftedContentsRect gradientWallpaperNode.layer.contentsRect = shiftedContentsRect
} }
if let overlayNode = self.overlayNode {
transition.updateFrame(layer: overlayNode.layer, frame: self.bounds)
}
} }
func offset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { func offset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) {
@ -865,6 +904,8 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
var gradientColors: [UInt32] = [] var gradientColors: [UInt32] = []
var gradientAngle: Int32 = 0 var gradientAngle: Int32 = 0
let wallpaperDimColor: UIColor? = nil
if case let .color(color) = wallpaper { if case let .color(color) = wallpaper {
gradientColors = [color] gradientColors = [color]
self._isReady.set(true) self._isReady.set(true)
@ -936,14 +977,14 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
self.contentNode.backgroundColor = .white self.contentNode.backgroundColor = .white
if let image = chatControllerBackgroundImage(theme: nil, wallpaper: wallpaper, mediaBox: self.context.sharedContext.accountManager.mediaBox, knockoutMode: false) { if let image = chatControllerBackgroundImage(theme: nil, wallpaper: wallpaper, mediaBox: self.context.sharedContext.accountManager.mediaBox, knockoutMode: false) {
self.contentNode.contents = image.cgImage self.contentNode.contents = image.cgImage
self.blurredBackgroundContents = generateBlurredContents(image: image) self.blurredBackgroundContents = generateBlurredContents(image: image, dimColor: wallpaperDimColor)
self.wallpaperDisposable.set(nil) self.wallpaperDisposable.set(nil)
Queue.mainQueue().justDispatch { Queue.mainQueue().justDispatch {
self._isReady.set(true) self._isReady.set(true)
} }
} else if let image = chatControllerBackgroundImage(theme: nil, wallpaper: wallpaper, mediaBox: self.context.account.postbox.mediaBox, knockoutMode: false) { } else if let image = chatControllerBackgroundImage(theme: nil, wallpaper: wallpaper, mediaBox: self.context.account.postbox.mediaBox, knockoutMode: false) {
self.contentNode.contents = image.cgImage self.contentNode.contents = image.cgImage
self.blurredBackgroundContents = generateBlurredContents(image: image) self.blurredBackgroundContents = generateBlurredContents(image: image, dimColor: wallpaperDimColor)
self.wallpaperDisposable.set(nil) self.wallpaperDisposable.set(nil)
Queue.mainQueue().justDispatch { Queue.mainQueue().justDispatch {
self._isReady.set(true) self._isReady.set(true)
@ -956,7 +997,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
} }
strongSelf.contentNode.contents = image?.0?.cgImage strongSelf.contentNode.contents = image?.0?.cgImage
if let image = image?.0 { if let image = image?.0 {
strongSelf.blurredBackgroundContents = generateBlurredContents(image: image) strongSelf.blurredBackgroundContents = generateBlurredContents(image: image, dimColor: wallpaperDimColor)
} else { } else {
strongSelf.blurredBackgroundContents = nil strongSelf.blurredBackgroundContents = nil
} }
@ -1432,6 +1473,10 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
} }
func makeFreeBackground() -> PortalView? { func makeFreeBackground() -> PortalView? {
if !self.hasBubbleBackground(for: .free) {
return nil
}
if let sourceView = self.freeBackgroundPortalSourceView, let portalView = PortalView(matchPosition: true) { if let sourceView = self.freeBackgroundPortalSourceView, let portalView = PortalView(matchPosition: true) {
sourceView.addPortal(view: portalView) sourceView.addPortal(view: portalView)
return portalView return portalView

View File

@ -1,5 +1,5 @@
{ {
"app": "9.5.1", "app": "9.5.2",
"bazel": "5.3.1", "bazel": "5.3.1",
"xcode": "14.2" "xcode": "14.2"
} }