package Ġcom . rog ert alk . ro ger . repo Ċ Ċ import Ġandroid . os . System Clock Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . load . engine . Disk Cache Strategy Ċ import Ġcom . google . gson . internal . Linked TreeMap Ċ import Ġcom . rog ert alk . ro ger . event . broadcast s . streams . Streams Changed Event Ċ import Ġcom . rog ert alk . ro ger . manager . Runtime Vars Manager Ċ import Ġcom . rog ert alk . ro ger . manager . Stream Manager Ċ import Ġcom . rog ert alk . ro ger . manager . audio . Aut oplay Manager Ċ import Ġcom . rog ert alk . ro ger . models . data . Attachment Type Ċ import Ġcom . rog ert alk . ro ger . models . data . Avatar Size Ċ import Ġcom . rog ert alk . ro ger . models . json . Account Ċ import Ġcom . rog ert alk . ro ger . models . json . Chunk Ċ import Ġcom . rog ert alk . ro ger . models . json . Stream Ċ import Ġcom . rog ert alk . ro ger . network . Connectivity Helper Ċ import Ġcom . rog ert alk . ro ger . network . request . Single Stream Request Ċ import Ġcom . rog ert alk . ro ger . utils . cache . Stream Cache Ċ import Ġcom . rog ert alk . ro ger . utils . constant . Attachment Constants Ċ import Ġcom . rog ert alk . ro ger . utils . constant . NO _ ID Ċ import Ġcom . rog ert alk . ro ger . utils . constant . NO _ TIME Ċ import Ġcom . rog ert alk . ro ger . utils . constant . R og er Constants Ċ import Ġcom . rog ert alk . ro ger . utils . extensions . app Controller Ċ import Ġcom . rog ert alk . ro ger . utils . extensions . post Event Ċ import Ġcom . rog ert alk . ro ger . utils . log .* Ċ import Ġjava . util .* Ċ Ċ object ĠStream Cache Repo Ġ{ ĊĊĠĠĠ Ġ// ĠTODO : ĠRemove Ġand Ġmaintain Ġtemporary Ġstream Ġpure ly Ġin ĠUI Ġcode ĊĠĠĠ Ġvar Ġtemporary Stream : ĠStream ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠTime Ġfor Ġwhich Ġstream Ġdata Ġshould Ġbe Ġconsidered Ġfresh Ġ( to Ġavoid Ġunnecessary Ġcalls ) ĊĠĠĠ Ġprivate Ġval ĠST REAM _ F RESH NESS _ TIMES PAN Ġ= Ġ 5 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġlast Stream Refresh Ġ= ĠNO _ TIME ĊĊĠĠĠ Ġ// ĠHidden Ġvariable Ġ( only Ġupdated Ġinternally ) ĊĠĠĠ Ġprivate Ġvar Ġreached List End Value Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġgot Cursor Once Value Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġstream Ġcache Ġis Ġstill Ġfresh , Ġie , Ġno Ġneed Ġto Ġrefresh Ġit Ġexplicitly ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġstream Cache Fresh : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem Clock . elapsed Realtime () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelapsed Time Ġ= Ġnow Ġ- Ġlast Stream Refresh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelapsed Time Ġ< ĠST REAM _ F RESH NESS _ TIMES PAN ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRead - only Ġvalue ĊĠĠĠ Ġval Ġreached List End : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġreached List End Value ĊĊĠĠĠ Ġval Ġgot Cursor Once : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġgot Cursor Once Value ĊĊĠĠĠ Ġvar Ġnext Cursor : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġnever Ġwant Ġthe Ġvalue Ġto Ġbecome Ġnull Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNever Ġnull ify Ġthe Ġvalue , Ġthis Ġalso Ġsymbol izes Ġwe Ġreached Ġthe Ġend Ġof Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreached List End Value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Warn Ġ{ Ġ" RE ACHED ĠEND ĠOF ĠLIST " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgot Cursor Once Value Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġhave Ġa Ġcursor , Ġso Ġdefinitely Ġthis Ġis Ġnot Ġthe Ġend Ġof Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreached List End Value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġghost Ġstream Ġalready Ġexists Ġon ĠStream Cache , Ġif Ġso , Ġremove Ġghost Ġstream ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġevaluate Ghost Availability () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġghost Ġ= Ġtemporary Stream ĊĠĠĠĠĠĠĠ Ġif Ġ( ghost Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġget Stream Raw ( ghost . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary Stream Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠPUBLIC ĠMETHO DS ĊĠĠĠ Ġ// ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠH ides Ġghost Ġand Ġremoves Ġthe Ġsame Ġinstance Ġfrom Ġcached Ġstreams ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġproperly Hide Ghost () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Stream Ġ= Ġtemporary Stream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tmp Stream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġstream Ġfrom Ġcache Ġas Ġwell ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Stream ( tmp Stream . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary Stream Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Local Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary Stream Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . delete Streams () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġa Ġparticipant Ġfrom Ġa Ġstream Ġlocally , Ġand Ġpers ists Ġit ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Participant ( accountId : ĠLong , Ġstream Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Of Streams Ġ= Ġget Cached Copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( stream Ġin Ġcopy Of Streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== Ġstream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" RE MOVED !!!! " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Others Ġ= Ġstream . others OrEmpty . filter Ġ{ Ġit . id Ġ!= ĠaccountId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . others Ġ= Ġnew Others ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Streams ( copyOf Streams , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġa Ġgiven Ġstream Ġfrom Ġcache ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Stream ( stream Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Cached (). removeAll Ġ{ Ġit . id Ġ== Ġstream Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . persist Streams () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġcurrent Ġstream Ġfrom ĠStream ĠManager ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Manager . remove Stream ( stream Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTell Ġapp Ġto Ġupdate Ġcontent Ġdisplay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Event ( Streams Changed Event ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġcached Ġstreams ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Cached (): ĠLinkedList < Stream > Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStream Cache . streams List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġcopy Ġof Ġcached Ġstreams . Ġ[ get Cached ] Ġreturns Ġa Ġpointer Ġto Ġthe Ġactual Ġcache ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Cached Copy (): ĠLinkedList < Stream > Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLinkedList ( Stream Cache . streams List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate ĠCached Ġstreams ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Cache ( streams : ĠList < Stream >) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Streams ( streams , Ġpersist After Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate ĠCached Ġstreams Ġbut Ġonly Ġits Ġmemory Ġcounter part ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Cache Memory Only ( streams : ĠList < Stream >) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Streams ( streams , Ġpersist After Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġa Ġgiven Ġstream Ġid Ġis Ġalready Ġpart Ġof Ġthe Ġcached Ġstreams . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcontains Stream Id ( stream Id : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream List Ġ= Ġget Cached () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( stream Ġin Ġstream List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== Ġstream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġa Ġcached Ġstream Ġgiven Ġits ĠID ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Stream ( stream Id : ĠLong ?): ĠStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stream Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġcheck Ġfor Ġthe Ġtemporary Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary Stream ?. let Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== Ġstream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġcached Ġstreams Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Stream Raw ( stream Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReceive Ġa Ġnew Ġor Ġupdated Ġstream , Ġand Ġupdate Ġthe Ġstream Ġcache Ġwe Ġhad Ġbefore ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Stream In Streams ( stream : ĠStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== Ġtemporary Stream ?. id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġreceived Ġstream Ġis Ġthe Ġsame Ġas Ġghost , Ġso Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== ĠNO _ ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error Ġ{ Ġ" Got Ġa ĠNO _ ID Ġstream " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġreceived Ġstream Ġis Ġthe Ġsame Ġas Ġghost , Ġso Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmerge Stream With Streams ( stream , Ġpersist After Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġpost Event ( Streams Changed Event ()) ĊĠĠĠĠĠĠĠ Ġupdate Stream Manager ( stream ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Stream Manager ( stream : ĠStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== ĠStream Manager . selected Stream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Manager . selected Stream Ġ= Ġstream ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Stream Manager ( stream Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stream Id Ġ== ĠStream Manager . selected Stream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Manager . selected Stream Ġ= Ġget Stream ( stream Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġcan Ġalso Ġbe Ġused Ġto Ġinsert Ġa Ġtemporary Ġ( fake ) Ġparticipant Ġinto Ġa ĠStream ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Participant To Stream ( stream Id : ĠLong , Ġparticipant : ĠAccount ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream List Ġ= Ġget Cached () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor cycle @ for Ġ( stream Ġin Ġstream List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== Ġstream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" Will Ġadd Ġnew Ġparticipant Ġto Ġan Ġexisting Ġstream " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved Others Ġ= ĠArrayList ( stream . others ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Others . add ( participant ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . others Ġ= Ġsaved Others . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stream Manager ( stream Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Attachment For Stream ( stream Id : ĠLong , Ġnew Attachments : ĠHashMap < String , ĠLinked TreeMap < String , ĠString >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream List Ġ= Ġget Cached () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor cycle @ for Ġ( stream Ġin Ġstream List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== Ġstream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" Will Ġadd Ġnew Ġattachment Ġto Ġan Ġexisting Ġstream " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . attachments Ġ= Ġnew Attachments ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPre load Ġattachment Ġimage Ġfor Ġfuture Ġuse Ġ( even Ġif Ġoffline ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Connectivity Helper . can Use Extra Data ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattachment Link Ġ= Ġstream . attachment Link ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Image Ġ= Ġstream . attachment Type Ġ!= Ġnull Ġ&& Ġstream . attachment Type Ġ== ĠAttachment Type . IMAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Image Ġ&& Ġattachment Link Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" Connected Ġto Ġgood Ġnetwork , Ġpre - loading Ġattachment Ġimage " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( app Controller ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( attachment Link ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. override ( Attachment Constants . ATTACHMENT _ PH OTO _ WIDTH , ĠAttachment Constants . ATTACHMENT _ PH OTO _ HEIGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. disk Cache Strategy ( Disk Cache Strategy . ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. preload () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPre - load Ġsmaller Ġversion Ġas Ġwell ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrop Size Ġ= ĠRuntime Vars Manager . get Dimension For Avatar Size ( Avatar Size . CONTACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( app Controller ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( attachment Link ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. override ( crop Size , Ġcrop Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. disk Cache Strategy ( Disk Cache Strategy . ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. preload () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ for cycle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stream Manager ( stream Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInform Ġthe Ġapp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Event ( Streams Changed Event ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . persist Streams () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġchunk Ġto Ġan Ġexisting Ġstream ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġwas Ġable Ġto Ġadd Ġthis Ġchunk , ĠFalse Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Chunk To Streams ( new Chunk : ĠChunk , Ġstream Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream List Ġ= Ġget Cached () ĊĠĠĠĠĠĠĠ Ġvar Ġposition Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġfound Stream Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor cycle @ for Ġ( stream Ġin Ġstream List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== Ġstream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Chunk List Ġ= ĠArrayList < Chunk >( stream . chunks . size Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġall Ġprevious Ġexiting Ġchunks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Chunk List . addAll ( stream . chunks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Is Act ually New Ġ= Ġ( stream . chunks . filter Ġ{ Ġit . id Ġ== Ġnew Chunk . id Ġ}). isEmpty () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġnew Ġchunk Ġis Ġdifferent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk Is Act ually New ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" New Ġchunk Ġis Ġactually Ġnew " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Chunk List . add ( new Chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . last Interaction Ġ>= Ġnew Chunk . end ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info Ġ{ Ġ" Stream Ġlast Ġinteraction Ġwas ĠNOT Ġupdated " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info Ġ{ Ġ" Stream Ġlast Ġinteraction Ġwas Ġupdated " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . last Interaction Ġ= Ġnew Chunk . end ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPart icipant Ġorder Ġshould Ġbe Ġadjusted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparticipant Who Spo ke Ġ= Ġstream . others OrEmpty . first OrNull () Ġ{ Ġit . id Ġ== Ġnew Chunk . sender Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( participant Who Spo ke Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Others Ġ= ĠArrayList < Account >( stream . others ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġthat Ġparticipant Ġto Ġthe Ġfront ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Others . remove ( participant Who Spo ke ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Others . add ( 0 , Ġparticipant Who Spo ke ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . others Ġ= Ġnew Others . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Warn Ġ{ Ġ" New Ġchunk Ġalready Ġexisted !" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . chunks Ġ= Ġnew Chunk List ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Stream Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ for cycle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( found Stream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġthis Ġstream Ġto Ġthe Ġfront ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Stream To Front ( position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPers ist Ġthis Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stream Fresh ness () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . persist Streams () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġautoplay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Stream Aut oplay ( stream List . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġstream Ġmanager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stream Manager ( stream Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInform Ġthe Ġapp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Event ( Streams Changed Event ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġstream Ġdoesn 't Ġexist , Ġissue Ġa Ġstream Ġupdate Ġinstead ĊĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" Stream Ġto Ġadd Ġchunk Ġnot Ġfound . ĠWill Ġrefresh Ġthe Ġentire Ġstream Ġinstead ." Ġ} ĊĠĠĠĠĠĠĠ ĠSingle Stream Request ( stream Id ). enqueue Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠWe Ġshould Ġupdate Ġindividual ĠStream Ġtimestamps Ġand Ġreorder Ġstreams Ġlocally Ġinstead . ĊĠĠĠ Ġfun Ġmove Stream To Front ( stream Pos : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stream Pos Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit Ġalready Ġis Ġin Ġthe Ġfront ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsafety Ġchecks ĊĠĠĠĠĠĠĠ Ġif Ġ( stream Pos Ġ>= Ġget Cached (). size Ġ|| Ġstream Pos Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠArray Index OutOfBoundsException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġget Cached ()[ stream Pos ] ĊĠĠĠĠĠĠĠ Ġget Cached (). remove At ( stream Pos ) ĊĠĠĠĠĠĠĠ Ġget Cached (). add First ( stream ) ĊĊĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" Added Ġstream Ġto Ġfront " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġaccount Ġfor Ġthe Ġspecified Ġaccount ĠID Ġfrom Ġcache ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Account ById ( accountId : ĠLong ): ĠAccount ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġaccount Ġis Ġfrom Ġcurrent Ġuser Ġfirst ĊĠĠĠĠĠĠĠ Ġval Ġown Id Ġ= ĠUser Account Repo . id () ĊĠĠĠĠĠĠĠ Ġif Ġ( own Id Ġ!= Ġnull Ġ&& Ġown Id Ġ== ĠaccountId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUser Account Repo . current () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstreams Ġ= Ġget Cached () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( stream Ġin Ġstreams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( participant Ġin Ġstream . others OrEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( participant . id Ġ== ĠaccountId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġfound Ġthe ĠAC COUNT Ġwe Ġwere Ġlooking Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparticipant ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġfound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġstreams Ġwith Ġnew Ġstream Ġobject , Ġmerging Ġdata Ġand Ġre ordering Ġthe Ġstreams Ġif Ġnecessary . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmerge Stream With Streams ( new Stream : ĠStream , Ġpersist After : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Stream Index Ġ= ĠStream Cache . streams List . indexOf First Ġ{ Ġit . id Ġ== Ġnew Stream . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( original Stream Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStream Ġis Ġalready Ġpresent Ġon Ġthe Ġlist . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Stream Ġ= ĠStream Cache . streams List [ original Stream Index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġupdate Ġif Ġthe Ġone Ġwe Ġgot Ġis Ġactually Ġnewer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Stream . last Interaction Ġ< Ġold Stream . last Interaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" This Ġstream Ġlast Ġinteraction Ġwas Ġolder Ġthan Ġthe Ġcurrent Ġone " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Stream . last Interaction Ġ= Ġold Stream . last Interaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMerge ĠOTHER S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Stream . others Ġ== Ġnull Ġ&& Ġold Stream . others Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Stream . others Ġ= Ġold Stream . others ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMER GE ĠChunk s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpiration Date Ġ= ĠDate (). time Ġ- Ġ( 1 . 7 2 8 e + 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPre serve Ġthe Ġold Ġchunks Ġthat Ġare Ġnewer Ġthan Ġ 4 8 Ġhours Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat Ġdo Ġnot Ġexist Ġin Ġthe Ġnewer Ġchunk Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid Chunks Ġ= Ġold Stream . chunks . filter Ġ{ Ġit . end Ġ> Ġ( expiration Date ) Ġ&& Ġ! new Stream . chunks . contains ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Chunk List Ġ= ĠArrayList < Chunk >( valid Chunks . size Ġ+ Ġnew Stream . chunks . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Chunk List . addAll ( valid Chunks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Chunk List . addAll ( new Stream . chunks ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe - order Ġchunks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Chunk List . sortBy Ġ{ Ġit . end Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Stream . chunks Ġ= Ġfinal Chunk List ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMER GE Ġlocally - change able Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Play ed Until Ġ= ĠMath . max ( new Stream . play ed Until , Ġold Stream . play ed Until ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Last Interaction Ġ= ĠMath . max ( new Stream . last Interaction , Ġold Stream . last Interaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Stream . play ed Until Ġ= Ġfinal Play ed Until ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Stream . last Interaction Ġ= Ġfinal Last Interaction ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPre serve Ġattachments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Stream . attachments . isEmpty () Ġ&& Ġold Stream . attachments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Stream . attachments Ġ= Ġold Stream . attachments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġit Ġfrom Ġcurrent Ġposition , Ġwe 'll Ġre - add Ġit Ġin Ġa Ġnew Ġposition Ġafter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . streams List . remove At ( original Stream Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe order Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Stream Cache . streams List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrent Ġstream Ġlist Ġis ĠNOT Ġempty , Ġinsert Ġthe Ġnew Ġstream Ġin Ġthe Ġappropriate Ġposition Ġ( ordered Ġby Ġinteraction Ġtimestamp ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Index Ġ= ĠStream Cache . streams List . indexOf First Ġ{ Ġit . last Interaction Ġ< Ġnew Stream . last Interaction Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . streams List . add ( new Index , Ġnew Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġwas Ġno Ġstream Ġolder Ġthan Ġthis Ġone , Ġso Ġput Ġit Ġat Ġthe Ġend . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . streams List . add ( new Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrent Ġstream Ġlist Ġwas Ġempty , Ġsimply Ġinsert Ġthis Ġstream Ġat Ġthe Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . streams List . add ( new Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDec ide Ġif Ġwe Ġshould Ġpersist Ġthat Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( persist After ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stream Fresh ness () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cache . persist Streams () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate ĠStream Ġmanager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stream Manager ( new Stream . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠPRIVATE ĠMETHO DS ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Stream Aut oplay ( stream : ĠStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Pref Repo . live Playback Ġ&& Ġstream . un play ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" Will Ġattempt Ġautoplay Ġof Ġnew Ġstream Ġcontent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAut oplay Manager . autoplay Stream ( stream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Streams ( new Streams : ĠList < Stream >, Ġpersist After : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( persist After ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsanitize Streams ( new Streams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMerge Ġeach Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( stream Ġin Ġnew Streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Stream With Streams ( stream , Ġpersist After ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrans ver ses Ġthe Ġfirst Ġstreams Ġbatch Ġand Ġremoves Ġthose Ġwhich Ġare Ġnot ĊĠĠĠĠ Ġ* Ġpart Ġof Ġthe Ġserver 's Ġresponse . ĊĠĠĠĠ Ġ* ĠThis Ġeffectively Ġremoves Ġstreams Ġthat Ġwere Ġremoved Ġrem otely . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsanitize Streams ( new Streams : ĠList < Stream >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog MethodCall () ĊĠĠĠĠĠĠĠ Ġval Ġsanitized List Ġ= ĠLinkedList < Stream >() ĊĠĠĠĠĠĠĠ Ġval Ġprevious List Ġ= Ġget Cached Copy () ĊĊĠĠĠĠĠĠĠ Ġval Ġstill Fresh Timestamp Ġ= ĠDate (). time Ġ- Ġ( 6 0 0 0 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġprevious List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelem Ġ= Ġprevious List [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< ĠR og er Constants . FIXED _ STREAM _ PAGE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstill Fresh Ġ= Ġelem . last Interaction Ġ> Ġstill Fresh Timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Streams . contains ( elem ) Ġ|| Ġstill Fresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsanitized List . add ( elem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġall Ġsubsequent Ġelement Ġ( from Ġconversations Ġpaging ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsanitized List . add ( elem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġstreams Ġlist ĊĠĠĠĠĠĠĠ ĠStream Cache . streams List Ġ= Ġsanitized List ĊĠĠĠĠĠĠĠ Ġupdate Stream Fresh ness () ĊĠĠĠĠĠĠĠ ĠStream Cache . persist Streams () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOnly Ġfor Ġinternal Ġuse , Ġwill Ġsearch Ġwithin Ġthe Ġcache Ġalone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Stream Raw ( stream Id : ĠLong ): ĠStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( Stream Cache . streams List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream List Ġ= Ġget Cached () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( stream Ġin Ġstream List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . id Ġ== Ġstream Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Stream Fresh ness () Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Stream Refresh Ġ= ĠSystem Clock . elapsed Realtime () ĊĠĠĠ Ġ} Ċ }