diff --git a/submodules/PeerAvatarGalleryUI/Sources/PeerAvatarImageGalleryItem.swift b/submodules/PeerAvatarGalleryUI/Sources/PeerAvatarImageGalleryItem.swift index e6ce8a014f..ea9fe74891 100644 --- a/submodules/PeerAvatarGalleryUI/Sources/PeerAvatarImageGalleryItem.swift +++ b/submodules/PeerAvatarGalleryUI/Sources/PeerAvatarImageGalleryItem.swift @@ -437,7 +437,8 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { }) } else if case let .roundRect(cornerRadius) = self.sourceCorners { let scale = scaledLocalImageViewBounds.width / transformedCopyViewFinalFrame.width - self.contentNode.layer.animate(from: (cornerRadius * scale) as NSNumber, to: 0.0 as NSNumber, keyPath: "cornerRadius", timingFunction: CAMediaTimingFunctionName.default.rawValue, duration: 0.18, removeOnCompletion: false, completion: { [weak self] value in + let selfScale = transformedCopyViewFinalFrame.width / transformedSelfFrame.width + self.contentNode.layer.animate(from: (cornerRadius * scale * selfScale) as NSNumber, to: 0.0 as NSNumber, keyPath: "cornerRadius", timingFunction: CAMediaTimingFunctionName.default.rawValue, duration: 0.18, removeOnCompletion: false, completion: { [weak self] value in if value { self?.contentNode.clipsToBounds = false } @@ -466,13 +467,19 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { let copyView = maybeCopyView! - if case .round = self.sourceCorners { + var sourceHasRoundCorners = false + if case .none = self.sourceCorners { + } else { + sourceHasRoundCorners = true + } + + if sourceHasRoundCorners { self.view.insertSubview(copyView, belowSubview: self.scrollNode.view) } copyView.frame = transformedSelfFrame let surfaceCopyView = node.2().0! - if case .none = self.sourceCorners { + if !sourceHasRoundCorners { addToTransitionSurface(surfaceCopyView) } @@ -539,7 +546,8 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { self.contentNode.layer.animate(from: 0.0 as NSNumber, to: (self.contentNode.frame.width / 2.0) as NSNumber, keyPath: "cornerRadius", timingFunction: CAMediaTimingFunctionName.default.rawValue, duration: 0.18 * durationFactor, removeOnCompletion: false) } else if case let .roundRect(cornerRadius) = self.sourceCorners { let scale = scaledLocalImageViewBounds.width / transformedCopyViewInitialFrame.width - self.contentNode.layer.animate(from: 0.0 as NSNumber, to: (cornerRadius * scale) as NSNumber, keyPath: "cornerRadius", timingFunction: CAMediaTimingFunctionName.default.rawValue, duration: 0.18 * durationFactor, removeOnCompletion: false) + let selfScale = transformedCopyViewInitialFrame.width / transformedSelfFrame.width + self.contentNode.layer.animate(from: 0.0 as NSNumber, to: (cornerRadius * scale * selfScale) as NSNumber, keyPath: "cornerRadius", timingFunction: CAMediaTimingFunctionName.default.rawValue, duration: 0.18 * durationFactor, removeOnCompletion: false) } self.statusNodeContainer.layer.animatePosition(from: self.statusNodeContainer.position, to: CGPoint(x: transformedSuperFrame.midX, y: transformedSuperFrame.midY), duration: 0.25, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) diff --git a/submodules/TelegramCore/Sources/PeerPhotoUpdater.swift b/submodules/TelegramCore/Sources/PeerPhotoUpdater.swift index ec25679668..9aac08971b 100644 --- a/submodules/TelegramCore/Sources/PeerPhotoUpdater.swift +++ b/submodules/TelegramCore/Sources/PeerPhotoUpdater.swift @@ -263,22 +263,24 @@ public func updatePeerPhotoInternal(postbox: Postbox, network: Network, stateMan } } |> mapToSignal { result, resource, videoResource -> Signal in - if case .complete = result, let videoResource = videoResource { + if case .complete = result { return fetchAndUpdateCachedPeerData(accountPeerId: accountPeerId, peerId: peer.id, network: network, postbox: postbox) |> castError(UploadPeerPhotoError.self) |> mapToSignal { status -> Signal in return postbox.transaction { transaction in - let cachedData = transaction.getPeerCachedData(peerId: peer.id) - if let cachedData = cachedData as? CachedChannelData { - if let photo = cachedData.photo { - for representation in photo.videoRepresentations { - postbox.mediaBox.copyResourceData(from: videoResource.id, to: representation.resource.id, synchronous: true) + if let videoResource = videoResource { + let cachedData = transaction.getPeerCachedData(peerId: peer.id) + if let cachedData = cachedData as? CachedChannelData { + if let photo = cachedData.photo { + for representation in photo.videoRepresentations { + postbox.mediaBox.copyResourceData(from: videoResource.id, to: representation.resource.id, synchronous: true) + } } - } - } else if let cachedData = cachedData as? CachedGroupData { - if let photo = cachedData.photo { - for representation in photo.videoRepresentations { - postbox.mediaBox.copyResourceData(from: videoResource.id, to: representation.resource.id, synchronous: true) + } else if let cachedData = cachedData as? CachedGroupData { + if let photo = cachedData.photo { + for representation in photo.videoRepresentations { + postbox.mediaBox.copyResourceData(from: videoResource.id, to: representation.resource.id, synchronous: true) + } } } } diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift index d9b539d3a9..96626880ae 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift @@ -1237,7 +1237,6 @@ final class PeerInfoEditingAvatarOverlayNode: ASDisplayNode { self.addSubnode(self.imageNode) self.addSubnode(self.updatingAvatarOverlay) self.addSubnode(self.statusNode) - self.addSubnode(self.iconNode) } func updateTransitionFraction(_ fraction: CGFloat, transition: ContainedViewLayoutTransition) { @@ -1255,11 +1254,9 @@ final class PeerInfoEditingAvatarOverlayNode: ASDisplayNode { let transition = ContainedViewLayoutTransition.animated(duration: 0.2, curve: .linear) if canEditPeerInfo(context: self.context, peer: peer) { - var overlayHidden = false - var iconHidden = false + var overlayHidden = true if let updatingAvatar = updatingAvatar { overlayHidden = false - iconHidden = true self.statusNode.transitionToState(.progress(color: .white, lineWidth: nil, value: max(0.027, uploadProgress ?? 0.0), cancelEnabled: true)) @@ -1272,35 +1269,18 @@ final class PeerInfoEditingAvatarOverlayNode: ASDisplayNode { } } - transition.updateAlpha(node: self.iconNode, alpha: iconHidden ? 0.0 : 1.0) transition.updateAlpha(node: self.updatingAvatarOverlay, alpha: overlayHidden ? 0.0 : 1.0) } else { - var immediately = self.currentRepresentation == nil - if isEditing { - immediately = immediately || peer.profileImageRepresentations.isEmpty - iconHidden = peer.profileImageRepresentations.isEmpty - overlayHidden = peer.profileImageRepresentations.isEmpty - } else { - iconHidden = true - overlayHidden = true - } - - let targetIconAlpha: CGFloat = iconHidden ? 0.0 : 1.0 let targetOverlayAlpha: CGFloat = overlayHidden ? 0.0 : 1.0 - if self.updatingAvatarOverlay.alpha != targetOverlayAlpha || self.iconNode.alpha != targetIconAlpha { + if self.updatingAvatarOverlay.alpha != targetOverlayAlpha { let update = { self.statusNode.transitionToState(.none) self.currentRepresentation = nil self.imageNode.setSignal(.single(nil)) - transition.updateAlpha(node: self.iconNode, alpha: iconHidden ? 0.0 : 1.0) transition.updateAlpha(node: self.updatingAvatarOverlay, alpha: overlayHidden ? 0.0 : 1.0) } - if immediately { + Queue.mainQueue().after(0.3) { update() - } else { - Queue.mainQueue().after(0.3) { - update() - } } } } @@ -2121,6 +2101,8 @@ final class PeerInfoHeaderEditingContentNode: ASDisplayNode { private let context: AccountContext private let requestUpdateLayout: () -> Void + var requestEditing: (() -> Void)? + let avatarNode: PeerInfoEditingAvatarNode let avatarTextNode: ImmediateTextNode let avatarButtonNode: HighlightableButtonNode @@ -2145,7 +2127,7 @@ final class PeerInfoHeaderEditingContentNode: ASDisplayNode { } @objc private func textPressed() { - self.avatarNode.tapped?(true) + self.requestEditing?() } func editingTextForKey(_ key: PeerInfoHeaderTextFieldNodeKey) -> String? { @@ -2414,10 +2396,13 @@ final class PeerInfoHeaderNode: ASDisplayNode { self.addSubnode(self.separatorNode) self.avatarListNode.avatarContainerNode.tapped = { [weak self] in - self?.initiateAvatarExpansion() + self?.initiateAvatarExpansion(gallery: false) } self.editingContentNode.avatarNode.tapped = { [weak self] confirm in - self?.requestOpenAvatarForEditing?(confirm) + self?.initiateAvatarExpansion(gallery: true) + } + self.editingContentNode.requestEditing = { [weak self] in + self?.requestOpenAvatarForEditing?(true) } self.avatarListNode.itemsUpdated = { [weak self] items in @@ -2450,8 +2435,8 @@ final class PeerInfoHeaderNode: ASDisplayNode { } } - func initiateAvatarExpansion() { - if self.isAvatarExpanded { + func initiateAvatarExpansion(gallery: Bool) { + if self.isAvatarExpanded || gallery { if let currentEntry = self.avatarListNode.listContainerNode.currentEntry { self.requestAvatarExpansion?(true, self.avatarListNode.listContainerNode.galleryEntries, self.avatarListNode.listContainerNode.currentEntry, self.avatarTransitionArguments(entry: currentEntry)) } @@ -2493,8 +2478,10 @@ final class PeerInfoHeaderNode: ASDisplayNode { func updateAvatarIsHidden(entry: AvatarGalleryEntry?) { if let entry = entry { self.avatarListNode.avatarContainerNode.avatarNode.isHidden = entry == self.avatarListNode.listContainerNode.galleryEntries.first + self.editingContentNode.avatarNode.isHidden = entry == self.avatarListNode.listContainerNode.galleryEntries.first } else { self.avatarListNode.avatarContainerNode.avatarNode.isHidden = false + self.editingContentNode.avatarNode.isHidden = false } self.avatarListNode.listContainerNode.updateEntryIsHidden(entry: entry) } diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 51ebdb14be..1f930e4d78 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -2074,7 +2074,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD } self.headerNode.requestAvatarExpansion = { [weak self] gallery, entries, centralEntry, _ in - guard let strongSelf = self, let peer = strongSelf.data?.peer, peer.smallProfileImage != nil else { + guard let strongSelf = self, let peer = strongSelf.data?.peer else { return } @@ -2085,7 +2085,13 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD strongSelf.containerLayoutUpdated(layout: layout, navigationHeight: navigationHeight, transition: .immediate, additive: false) } return - } else if !gallery { + } + + guard peer.smallProfileImage != nil else { + return + } + + if !gallery { let transition: ContainedViewLayoutTransition = .animated(duration: 0.35, curve: .spring) strongSelf.headerNode.updateIsAvatarExpanded(true, transition: transition) strongSelf.updateNavigationExpansionPresentation(isExpanded: true, animated: true) @@ -5282,20 +5288,17 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD let _ = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: layout.safeInsets.left, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: navigationHeight, isModalOverlay: layout.isModalOverlay, isMediaOnly: self.isMediaOnly, contentOffset: self.isMediaOnly ? 212.0 : offsetY, presentationData: self.presentationData, peer: self.data?.peer, cachedData: self.data?.cachedData, notificationSettings: self.data?.notificationSettings, statusData: self.data?.status, isContact: self.data?.isContact ?? false, isSettings: self.isSettings, state: self.state, transition: transition, additive: additive) } + let paneAreaExpansionDistance: CGFloat = 32.0 let effectiveAreaExpansionFraction: CGFloat - if self.isSettings { - let paneAreaExpansionDistance: CGFloat = 32.0 + if self.state.isEditing { + effectiveAreaExpansionFraction = 0.0 + } else if self.isSettings { var paneAreaExpansionDelta = (self.headerNode.frame.maxY - navigationHeight) - self.scrollNode.view.contentOffset.y paneAreaExpansionDelta = max(0.0, min(paneAreaExpansionDelta, paneAreaExpansionDistance)) - effectiveAreaExpansionFraction = 1.0 - paneAreaExpansionDelta / paneAreaExpansionDistance - } else if self.state.isEditing { - effectiveAreaExpansionFraction = 0.0 } else { - let paneAreaExpansionDistance: CGFloat = 32.0 var paneAreaExpansionDelta = (self.paneContainerNode.frame.minY - navigationHeight) - self.scrollNode.view.contentOffset.y paneAreaExpansionDelta = max(0.0, min(paneAreaExpansionDelta, paneAreaExpansionDistance)) - effectiveAreaExpansionFraction = 1.0 - paneAreaExpansionDelta / paneAreaExpansionDistance } @@ -5396,7 +5399,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD self.canOpenAvatarByDragging = false let contentOffset = scrollView.contentOffset.y scrollView.panGestureRecognizer.isEnabled = false - self.headerNode.initiateAvatarExpansion() + self.headerNode.initiateAvatarExpansion(gallery: true) scrollView.panGestureRecognizer.isEnabled = true scrollView.contentOffset = CGPoint(x: 0.0, y: contentOffset) UIView.animate(withDuration: 0.1) {