Skip to content

Commit 510dadd

Browse files
committed
Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios
2 parents 14be023 + facd51e commit 510dadd

37 files changed

Lines changed: 833 additions & 89 deletions

File tree

Random.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1e13d2cafc34e31a
1+
06de25b179c80e56

Telegram/NotificationService/Sources/NotificationService.swift

Lines changed: 657 additions & 15 deletions
Large diffs are not rendered by default.

submodules/AuthorizationUI/Sources/AuthorizationSequenceEmailEntryControllerNode.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ final class AuthorizationSequenceEmailEntryControllerNode: ASDisplayNode, UIText
113113
(self.signInWithAppleButton as? ASAuthorizationAppleIDButton)?.cornerRadius = 11
114114
}
115115

116-
self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: self.theme), glass: true, height: 50.0, cornerRadius: 50.0 * 0.5)
116+
self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: self.theme), glass: false, height: 50.0, cornerRadius: 50.0 * 0.5)
117117
self.proceedNode.progressType = .embedded
118118

119119
self.codeSeparatorNode = ASDisplayNode()

submodules/AuthorizationUI/Sources/AuthorizationSequencePasswordEntryControllerNode.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UIT
107107
self.codeField.textField.tintColor = self.theme.list.itemAccentColor
108108
self.codeField.textField.accessibilityHint = self.strings.Login_VoiceOver_Password
109109

110-
self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: self.theme), glass: true, height: 50.0, cornerRadius: 50.0 * 0.5)
110+
self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: self.theme), glass: false, height: 50.0, cornerRadius: 50.0 * 0.5)
111111
self.proceedNode.progressType = .embedded
112112
self.proceedNode.isEnabled = false
113113

submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ final class AuthorizationSequencePhoneEntryControllerNode: ASDisplayNode {
423423

424424
self.phoneAndCountryNode = PhoneAndCountryNode(strings: strings, theme: theme)
425425

426-
self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: self.theme), glass: true, height: 50.0, cornerRadius: 50 * 0.5)
426+
self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: self.theme), glass: false, height: 50.0, cornerRadius: 50 * 0.5)
427427
self.proceedNode.progressType = .embedded
428428
self.proceedNode.isEnabled = false
429429

@@ -857,7 +857,7 @@ final class PhoneConfirmationController: ViewController {
857857
self.cancelButton.accessibilityTraits = [.button]
858858
self.cancelButton.accessibilityLabel = strings.Login_Edit
859859

860-
self.proceedNode = SolidRoundedButtonNode(title: strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: theme), glass: true, height: 50.0, cornerRadius: 50.0 * 0.5)
860+
self.proceedNode = SolidRoundedButtonNode(title: strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: theme), glass: false, height: 50.0, cornerRadius: 50.0 * 0.5)
861861
self.proceedNode.progressType = .embedded
862862

863863
let font = Font.with(size: 20.0, design: .regular, traits: [.monospacedNumbers])

submodules/AuthorizationUI/Sources/AuthorizationSequenceSignUpControllerNode.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
152152
self.addPhotoButton.addSubnode(self.currentPhotoNode)
153153
self.addPhotoButton.allowsGroupOpacity = true
154154

155-
self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: self.theme), glass: true, height: 50.0, cornerRadius: 50.0 * 0.5)
155+
self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_Continue, theme: SolidRoundedButtonTheme(theme: self.theme), glass: false, height: 50.0, cornerRadius: 50.0 * 0.5)
156156
self.proceedNode.progressType = .embedded
157157

158158
super.init()

submodules/AuthorizationUI/Sources/AuthorizationSequenceSplashController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public final class AuthorizationSequenceSplashController: ViewController {
7373

7474
self.controller = RMIntroViewController(backgroundColor: theme.list.plainBackgroundColor, primaryColor: theme.list.itemPrimaryTextColor, buttonColor: theme.intro.startButtonColor, accentColor: theme.list.itemAccentColor, regularDotColor: theme.intro.dotColor, highlightedDotColor: theme.list.itemAccentColor, suggestedLocalizationSignal: localizationSignal)
7575

76-
self.startButton = SolidRoundedButtonNode(title: "Start Messaging", theme: SolidRoundedButtonTheme(theme: theme), glass: true, height: 50.0, cornerRadius: 50.0 * 0.5, isShimmering: true)
76+
self.startButton = SolidRoundedButtonNode(title: "Start Messaging", theme: SolidRoundedButtonTheme(theme: theme), glass: false, height: 50.0, cornerRadius: 50.0 * 0.5, isShimmering: true)
7777

7878
super.init(navigationBarPresentationData: nil)
7979

submodules/CallListUI/Sources/CallListControllerNode.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,7 @@ final class CallListControllerNode: ASDisplayNode {
665665
}
666666
}
667667

668-
self.listNode.visibleContentOffsetChanged = { [weak self] offset in
668+
self.listNode.visibleContentOffsetChanged = { [weak self] offset, _ in
669669
if let strongSelf = self {
670670
var previousContentOffsetValue: CGFloat?
671671
if let previousContentOffset = strongSelf.previousContentOffset, case let .known(value) = previousContentOffset {

submodules/ChatListUI/Sources/ChatListControllerNode.swift

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
165165
previousItemNode.listNode.updatePeerGrouping = nil
166166
previousItemNode.listNode.contentOffsetChanged = nil
167167
previousItemNode.listNode.contentScrollingEnded = nil
168+
previousItemNode.listNode.pinnedHeaderDisplayFractionUpdated = nil
168169
previousItemNode.listNode.didBeginInteractiveDragging = nil
169170
previousItemNode.listNode.endedInteractiveDragging = { _ in }
170171
previousItemNode.listNode.shouldStopScrolling = nil
@@ -327,11 +328,12 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
327328
}
328329

329330
return self.contentScrollingEnded?(listView) ?? false
330-
//DispatchQueue.main.async { [weak self] in
331-
// let _ = self?.contentScrollingEnded?(listView)
332-
//}
333-
334-
//return false
331+
}
332+
itemNode.listNode.pinnedHeaderDisplayFractionUpdated = { [weak self] transition in
333+
guard let self else {
334+
return
335+
}
336+
self.pinnedHeaderDisplayFractionUpdated?(transition)
335337
}
336338
itemNode.listNode.activateChatPreview = { [weak self] item, threadId, sourceNode, gesture, location in
337339
self?.activateChatPreview?(item, threadId, sourceNode, gesture, location)
@@ -427,6 +429,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
427429
var contentOffset: ListViewVisibleContentOffset?
428430
public var contentOffsetChanged: ((ListViewVisibleContentOffset, ListView) -> Void)?
429431
public var contentScrollingEnded: ((ListView) -> Bool)?
432+
public var pinnedHeaderDisplayFractionUpdated: ((ContainedViewLayoutTransition) -> Void)?
430433
var didBeginInteractiveDragging: ((ListView) -> Void)?
431434
var endedInteractiveDragging: ((ListView) -> Void)?
432435
var shouldStopScrolling: ((ListView, CGFloat) -> Bool)?
@@ -443,6 +446,34 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
443446
var canExpandHiddenItems: (() -> Bool)?
444447
public var displayFilterLimit: (() -> Void)?
445448

449+
public var pinnedHeaderDisplayFraction: CGFloat {
450+
guard let currentItemNodeValue = self.currentItemNodeValue else {
451+
return 0.0
452+
}
453+
if self.transitionFraction != 0.0 {
454+
var nextItemNode: ChatListContainerItemNode?
455+
if let selectedIndex = self.availableFilters.firstIndex(where: { $0.id == self.selectedId }) {
456+
if self.transitionFraction < 0.0 {
457+
if selectedIndex + 1 < self.availableFilters.count {
458+
nextItemNode = self.itemNodes[self.availableFilters[selectedIndex + 1].id]
459+
}
460+
} else {
461+
if selectedIndex > 0 {
462+
nextItemNode = self.itemNodes[self.availableFilters[selectedIndex - 1].id]
463+
}
464+
}
465+
}
466+
467+
if let nextItemNode {
468+
let absTransitionFraction = abs(self.transitionFraction)
469+
return (1.0 - absTransitionFraction) * currentItemNodeValue.listNode.pinnedScrollFraction + absTransitionFraction * nextItemNode.listNode.pinnedScrollFraction
470+
} else {
471+
return currentItemNodeValue.listNode.pinnedScrollFraction
472+
}
473+
}
474+
return currentItemNodeValue.listNode.pinnedScrollFraction
475+
}
476+
446477
public init(
447478
context: AccountContext,
448479
controller: ChatListControllerImpl?,
@@ -584,6 +615,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
584615
self.update(layout: layout, navigationBarHeight: navigationBarHeight, visualNavigationHeight: visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight: cleanNavigationBarHeight, insets: insets, isReorderingFilters: isReorderingFilters, isEditing: isEditing, inlineNavigationLocation: inlineNavigationLocation, inlineNavigationTransitionFraction: inlineNavigationTransitionFraction, storiesInset: storiesInset, transition: .immediate)
585616
self.isSwitchingCurrentItemFilterByDragging = true
586617
self.currentItemFilterUpdated?(self.currentItemFilter, self.transitionFraction, .immediate, true)
618+
self.pinnedHeaderDisplayFractionUpdated?(.immediate)
587619
}
588620
}
589621
}
@@ -661,6 +693,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
661693
self.update(layout: layout, navigationBarHeight: navigationBarHeight, visualNavigationHeight: visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight: cleanNavigationBarHeight, insets: insets, isReorderingFilters: isReorderingFilters, isEditing: isEditing, inlineNavigationLocation: inlineNavigationLocation, inlineNavigationTransitionFraction: inlineNavigationTransitionFraction, storiesInset: storiesInset, transition: .immediate)
662694
self.isSwitchingCurrentItemFilterByDragging = true
663695
self.currentItemFilterUpdated?(self.currentItemFilter, self.transitionFraction, transition, false)
696+
self.pinnedHeaderDisplayFractionUpdated?(transition)
664697
}
665698
case .cancelled, .ended:
666699
if let (layout, navigationBarHeight, visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight, insets, isReorderingFilters, isEditing, inlineNavigationLocation, inlineNavigationTransitionFraction, storiesInset) = self.validLayout, let selectedIndex = self.availableFilters.firstIndex(where: { $0.id == self.selectedId }) {
@@ -723,6 +756,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
723756
}
724757
self.isSwitchingCurrentItemFilterByDragging = false
725758
self.currentItemFilterUpdated?(self.currentItemFilter, self.transitionFraction, transition, false)
759+
self.pinnedHeaderDisplayFractionUpdated?(transition)
726760
}
727761
default:
728762
break
@@ -843,6 +877,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
843877
let transition: ContainedViewLayoutTransition = .animated(duration: 0.35, curve: .spring)
844878
self.update(layout: layout, navigationBarHeight: navigationBarHeight, visualNavigationHeight: visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight: cleanNavigationBarHeight, insets: insets, isReorderingFilters: isReorderingFilters, isEditing: isEditing, inlineNavigationLocation: inlineNavigationLocation, inlineNavigationTransitionFraction: inlineNavigationTransitionFraction, storiesInset: storiesInset, transition: transition)
845879
self.currentItemFilterUpdated?(self.currentItemFilter, self.transitionFraction, transition, false)
880+
self.pinnedHeaderDisplayFractionUpdated?(transition)
846881
itemNode.emptyNode?.restartAnimation()
847882
completion?()
848883
} else if self.pendingItemNode == nil {
@@ -889,6 +924,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
889924
strongSelf.selectedId = id
890925
strongSelf.applyItemNodeAsCurrent(id: id, itemNode: itemNode)
891926
strongSelf.currentItemFilterUpdated?(strongSelf.currentItemFilter, strongSelf.transitionFraction, .immediate, false)
927+
strongSelf.pinnedHeaderDisplayFractionUpdated?(.immediate)
892928

893929
completion?()
894930
return
@@ -945,6 +981,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
945981
strongSelf.update(layout: layout, navigationBarHeight: navigationBarHeight, visualNavigationHeight: visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight: cleanNavigationBarHeight, insets: insets, isReorderingFilters: isReorderingFilters, isEditing: isEditing, inlineNavigationLocation: inlineNavigationLocation, inlineNavigationTransitionFraction: inlineNavigationTransitionFraction, storiesInset: storiesInset, transition: .immediate)
946982

947983
strongSelf.currentItemFilterUpdated?(strongSelf.currentItemFilter, strongSelf.transitionFraction, transition, false)
984+
strongSelf.pinnedHeaderDisplayFractionUpdated?(transition)
948985
}
949986

950987
completion?()
@@ -1177,6 +1214,9 @@ final class ChatListControllerNode: ASDisplayNode, ASGestureRecognizerDelegate {
11771214
self.mainContainerNode.contentScrollingEnded = { [weak self] listView in
11781215
return self?.contentScrollingEnded(listView: listView, isPrimary: true) ?? false
11791216
}
1217+
self.mainContainerNode.pinnedHeaderDisplayFractionUpdated = { [weak self] transition in
1218+
self?.pinnedHeaderDisplayFractionUpdated(transition: transition)
1219+
}
11801220
self.mainContainerNode.didBeginInteractiveDragging = { [weak self] listView in
11811221
self?.didBeginInteractiveDragging(listView: listView, isPrimary: true)
11821222
}
@@ -2172,6 +2212,19 @@ final class ChatListControllerNode: ASDisplayNode, ASGestureRecognizerDelegate {
21722212
return false
21732213
}
21742214

2215+
private func pinnedHeaderDisplayFractionUpdated(transition: ContainedViewLayoutTransition) {
2216+
var pinnedFraction: CGFloat = 0.0
2217+
if let inlineStackContainerNode = self.inlineStackContainerNode, self.inlineStackContainerTransitionFraction != 0.0 {
2218+
pinnedFraction = (1.0 - self.inlineStackContainerTransitionFraction) * self.mainContainerNode.pinnedHeaderDisplayFraction + self.inlineStackContainerTransitionFraction * inlineStackContainerNode.pinnedHeaderDisplayFraction
2219+
} else {
2220+
pinnedFraction = self.mainContainerNode.pinnedHeaderDisplayFraction
2221+
}
2222+
2223+
if let navigationBarComponentView = self.navigationBarView.view as? ChatListNavigationBar.View {
2224+
navigationBarComponentView.updateEdgeEffectForPinnedFraction(pinnedFraction: pinnedFraction, transition: ComponentTransition(transition))
2225+
}
2226+
}
2227+
21752228
func makeInlineChatList(location: ChatListControllerLocation) -> ChatListContainerNode {
21762229
var forumPeerId: EnginePeer.Id?
21772230
if case let .forum(peerId) = location {
@@ -2220,6 +2273,9 @@ final class ChatListControllerNode: ASDisplayNode, ASGestureRecognizerDelegate {
22202273
inlineStackContainerNode.contentScrollingEnded = { [weak self] listView in
22212274
return self?.contentScrollingEnded(listView: listView, isPrimary: false) ?? false
22222275
}
2276+
inlineStackContainerNode.pinnedHeaderDisplayFractionUpdated = { [weak self] transition in
2277+
self?.pinnedHeaderDisplayFractionUpdated(transition: transition)
2278+
}
22232279

22242280
inlineStackContainerNode.activateChatPreview = self.mainContainerNode.activateChatPreview
22252281
inlineStackContainerNode.openStories = self.mainContainerNode.openStories

submodules/ChatListUI/Sources/Node/ChatListNode.swift

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,6 +1251,8 @@ public final class ChatListNode: ListView {
12511251
}
12521252

12531253
public var contentOffsetChanged: ((ListViewVisibleContentOffset) -> Void)?
1254+
public private(set) var pinnedScrollFraction: CGFloat = 0.0
1255+
public var pinnedHeaderDisplayFractionUpdated: ((ContainedViewLayoutTransition) -> Void)?
12541256
public var contentScrollingEnded: ((ListView) -> Bool)?
12551257
public var didBeginInteractiveDragging: ((ListView) -> Void)?
12561258

@@ -2937,7 +2939,6 @@ public final class ChatListNode: ListView {
29372939
return .single(false)
29382940
}
29392941
}
2940-
var startedScrollingWithCanExpandHiddenItems = false
29412942

29422943
self.beganInteractiveDragging = { [weak self] _ in
29432944
guard let strongSelf = self else {
@@ -2950,12 +2951,6 @@ public final class ChatListNode: ListView {
29502951
strongSelf.startedScrollingAtUpperBound = value <= 0.001
29512952
}
29522953

2953-
if let canExpandHiddenItems = strongSelf.canExpandHiddenItems {
2954-
startedScrollingWithCanExpandHiddenItems = canExpandHiddenItems()
2955-
} else {
2956-
startedScrollingWithCanExpandHiddenItems = true
2957-
}
2958-
29592954
if strongSelf.currentState.peerIdWithRevealedOptions != nil {
29602955
strongSelf.updateState { state in
29612956
var state = state
@@ -2999,29 +2994,43 @@ public final class ChatListNode: ListView {
29992994
}
30002995
})
30012996

3002-
self.visibleContentOffsetChanged = { [weak self] offset in
2997+
self.visibleContentOffsetChanged = { [weak self] offset, transition in
30032998
guard let strongSelf = self else {
30042999
return
30053000
}
30063001
if !strongSelf.dequeuedInitialTransitionOnLayout {
30073002
return
30083003
}
30093004
let atTop: Bool
3010-
var revealHiddenItems: Bool = false
30113005
switch offset {
3012-
case .none, .unknown:
3013-
atTop = false
3014-
case let .known(value):
3006+
case .none, .unknown:
3007+
atTop = false
3008+
case let .known(value):
30153009
atTop = value <= -strongSelf.tempTopInset
3016-
if strongSelf.startedScrollingAtUpperBound && startedScrollingWithCanExpandHiddenItems && strongSelf.isTracking {
3017-
revealHiddenItems = value <= -strongSelf.tempTopInset - 60.0
3018-
}
30193010
}
30203011
strongSelf.scrolledAtTopValue = atTop
3021-
strongSelf.contentOffsetChanged?(offset)
3022-
if revealHiddenItems && !strongSelf.currentState.hiddenItemShouldBeTemporaryRevealed {
3023-
//strongSelf.revealScrollHiddenItem()
3012+
3013+
var maxPinnedOffset: CGFloat = 0.0
3014+
strongSelf.forEachItemNode { itemNode in
3015+
if let itemNode = itemNode as? ChatListItemNode, let item = itemNode.item {
3016+
if item.isPinned {
3017+
maxPinnedOffset = max(maxPinnedOffset, itemNode.frame.maxY)
3018+
}
3019+
}
30243020
}
3021+
maxPinnedOffset = max(0.0, maxPinnedOffset)
3022+
var pinnedScrollFraction = 1.0
3023+
if strongSelf.insets.top == 0.0 {
3024+
pinnedScrollFraction = 0.0
3025+
} else {
3026+
if maxPinnedOffset < strongSelf.insets.top {
3027+
pinnedScrollFraction = maxPinnedOffset / strongSelf.insets.top
3028+
}
3029+
}
3030+
3031+
strongSelf.contentOffsetChanged?(offset)
3032+
strongSelf.pinnedScrollFraction = pinnedScrollFraction
3033+
strongSelf.pinnedHeaderDisplayFractionUpdated?(transition)
30253034
}
30263035

30273036
self.dynamicVisualInsets = { [weak self] in

0 commit comments

Comments
 (0)