@@ -273,6 +273,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
273273 var resolvePeerByNameDisposable : MetaDisposable ?
274274 let navigationActionDisposable = MetaDisposable ( )
275275 let enqueueMediaMessageDisposable = MetaDisposable ( )
276+ private let openSavedMusicDisposable = MetaDisposable ( )
276277
277278 private( set) var validLayout : ( ContainerViewLayout , CGFloat ) ?
278279 /// While an expansion has the profile's views they are held still: layouts wait, and the last one is applied when
@@ -2701,6 +2702,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
27012702 self . resolvePeerByNameDisposable ? . dispose ( )
27022703 self . navigationActionDisposable . dispose ( )
27032704 self . enqueueMediaMessageDisposable . dispose ( )
2705+ self . openSavedMusicDisposable . dispose ( )
27042706 self . supportPeerDisposable . dispose ( )
27052707 self . tipsPeerDisposable . dispose ( )
27062708 self . shareStatusDisposable ? . dispose ( )
@@ -2920,6 +2922,10 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
29202922 if ( previousBusinessLocation == nil ) != ( currentBusinessLocation != nil ) {
29212923 infoUpdated = true
29222924 }
2925+ // The music strip arriving or leaving changes the header's height, and the page moves with it.
2926+ if self . hasProfileMusic ( data : previousData ) != self . hasProfileMusic ( data : data ) {
2927+ infoUpdated = true
2928+ }
29232929 }
29242930
29252931 self . containerLayoutUpdated ( layout : layout , navigationHeight : navigationHeight , transition : self . didSetReady && ( membersUpdated || infoUpdated ) ? . animated ( duration : 0.3 , curve : . spring ) : . immediate )
@@ -3088,6 +3094,10 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
30883094 }
30893095 }
30903096
3097+ private func hasProfileMusic ( data : PeerInfoScreenData ? ) -> Bool {
3098+ return self . headerNode . profileMusic ( peer : data ? . savedMessagesPeer ?? data ? . peer , screenData : data ) != nil
3099+ }
3100+
30913101 var previousSavedMusicTimestamp : Double ?
30923102 private func displaySavedMusic ( ) {
30933103 guard let savedMusicContext = self . data ? . savedMusicContext else {
@@ -3100,15 +3110,21 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
31003110 }
31013111 self . previousSavedMusicTimestamp = currentTimestamp
31023112
3103- let _ = ( self . context . sharedContext . mediaManager . globalMediaPlayerState
3113+ // Until the list answers, the strip shows the full user's track (`peerInfoProfileMusic`); the player plays the
3114+ // list, so it waits for it.
3115+ let answeredList = savedMusicContext . state
3116+ |> filter { state in
3117+ return ! state . files . isEmpty || state . dataState != . loading
3118+ }
31043119 |> take ( 1 )
3105- |> deliverOnMainQueue ) . start ( next : { [ weak self ] accountStateAndType in
3120+ self . openSavedMusicDisposable . set ( ( combineLatest ( answeredList , self . context . sharedContext . mediaManager . globalMediaPlayerState |> take ( 1 ) )
3121+ |> deliverOnMainQueue ) . start ( next : { [ weak self ] listState , accountStateAndType in
31063122 guard let self else {
31073123 return
31083124 }
31093125 let peerId = self . peerId
31103126 var initialId : Int32
3111- if let initialFileId = self . data ? . savedMusicState ? . files . first ? . fileId {
3127+ if let initialFileId = listState . files . first ? . fileId {
31123128 initialId = Int32 ( clamping : initialFileId . id % Int64 ( Int32 . max ) )
31133129 } else {
31143130 initialId = 0
@@ -3139,7 +3155,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
31393155 musicController . navigationPresentation = . flatModal
31403156 self . controller ? . push ( musicController )
31413157 }
3142- } )
3158+ } ) )
31433159 }
31443160
31453161 func openAutoremove ( currentValue : Int32 ? ) {
@@ -5568,7 +5584,10 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
55685584 self . contentOffsetWhenLent = nil
55695585 if let held = self . layoutHeldDuringExpansion ?? self . validLayout . flatMap ( { ( layout : $0 . 0 , navigationHeight : $0 . 1 ) } ) {
55705586 self . layoutHeldDuringExpansion = nil
5571- self . containerLayoutUpdated ( layout : held . layout , navigationHeight : held . navigationHeight , transition : . immediate )
5587+ // The music strip arrived or left while the views were lent (the header still has what it had when they were
5588+ // lent): it moves in as it does outside an expansion, instead of appearing in one frame.
5589+ let stripChanged = self . headerNode . hasBottomStrip != self . hasProfileMusic ( data : self . data )
5590+ self . containerLayoutUpdated ( layout : held . layout , navigationHeight : held . navigationHeight , transition : stripChanged ? . animated ( duration : 0.3 , curve : . spring ) : . immediate )
55725591 }
55735592 let actions = self . actionsAfterExpansion
55745593 self . actionsAfterExpansion = [ ]
0 commit comments