package Ġweekend . coder . library Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . View Property Animator Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġkotlinx . android . synt hetic . main . wc _ view _ story . view . current View Ċ import Ġkotlinx . android . synt hetic . main . wc _ view _ story . view . drag Parent Ċ import Ġkotlinx . android . synt hetic . main . wc _ view _ story . view . progress Overlay Ċ import Ġweekend . coder . library . drag . Drag Listener Ċ import Ġweekend . coder . library . gesture . Story Change Direction Ċ import Ġweekend . coder . library . gesture . Story Touch Listener Ċ import Ġweekend . coder . library . progress . Story Horizontal Progress Ċ import Ġweekend . coder . library . progress . Story Progress Watcher Impl Ċ import Ġweekend . coder . library . utils . DEFAULT _ ST ORY _ INDEX Ċ import Ġweekend . coder . library . utils . cross Fade Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ class ĠSt ories View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattribute Set : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠConstraint Layout ( context , Ġattribute Set , Ġdef Style Attr ), ĠStory Action , ĠStory Builder , ĠDrag Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġparent View : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcross Fade Animator : ĠView Property Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġstory Callback : ĠStory Callback ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġstory Duration InSeconds Ġ= ĠDEFAULT _ ST ORY _ DURATION _ IN _ SECONDS ĊĠĠĠ Ġprivate Ġval Ġstory List : ĠMutable List < View > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġvar Ġduration Per Story : ĠList < Int >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcross Fade Duration : ĠLong Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġval Ġprogress Views : ĠMutable List < Story Horizontal Progress > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġvar ĠcurrentIndex Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġprevious Index Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġtouch Listener Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠStory Touch Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġprogress Watcher Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠStory Progress Watcher Impl ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize Attributes ( attribute Set ) ĊĠĠĠĠĠĠĠ Ġparent View Ġ= ĠView . inflate ( context , ĠR . layout . wc _ view _ story , Ġthis ) ĊĠĠĠĠĠĠĠ Ġparent View ?. current View ?. setOn Touch Listener ( touch Listener ) ĊĠĠĠĠĠĠĠ Ġparent View ?. drag Parent ?. set Drag Listener ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠLinearLayout . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . LayoutParams . MATCH _ PARENT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġthis . layout Params Ġ= Ġparams ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd View ( child : ĠView ?, Ġindex : ĠInt , Ġparams : ĠViewGroup . LayoutParams ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġparent View ?. let Ġ{ Ġmain View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . id Ġ== ĠNO _ ID ) Ġchild . id Ġ= ĠView . generate View Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Index Ġ= Ġmain View . current View . indexOf Child ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstory Index Ġ= Ġstory List . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstory List . add ( story Index , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress View Ġ= Ġprogress View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views . add ( progress View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain View . progress Overlay . addView ( progress View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain View . current View . addView ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( story Index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġsuper . addView ( child , Ġindex , Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Drag ( drag Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( drag Offset Ġ== Ġ 0 f ) Ġresume () Ġelse Ġpause () ĊĠĠĠĠĠĠĠ Ġstory Callback ?. on Drag ( drag Offset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Drag Dismiss () Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress Views [ currentIndex ]. cancel Progress () ĊĠĠĠĠĠĠĠ Ġstory Callback ?. on Drag Dismiss () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Story Dur ations InSeconds ( dur ations : ĠList < Int >): ĠSt ories View Ġ{ ĊĠĠĠĠĠĠĠ Ġduration Per Story Ġ= Ġdur ations ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcross Fade Duration In Millis ( cross Fade Duration : ĠLong ): ĠSt ories View Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . cross Fade Duration Ġ= Ġcross Fade Duration ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Callback ( callback : ĠStory Callback ): ĠSt ories View Ġ{ ĊĠĠĠĠĠĠĠ Ġstory Callback Ġ= Ġcallback ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart ( from : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset Drag () ĊĠĠĠĠĠĠĠ Ġprevious Index Ġ= ĠcurrentIndex ĊĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġif ( from Ġ>= Ġ 0 Ġ&& Ġfrom Ġ< Ġstory List . size ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ ST ORY _ INDEX ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow Current ( Story Change Direction . INIT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġreset Drag () ĊĠĠĠĠĠĠĠ Ġprevious Index Ġ= ĠcurrentIndex ĊĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= ĠDEFAULT _ ST ORY _ INDEX ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Drag () Ġ{ ĊĠĠĠĠĠĠĠ Ġparent View ?. drag Parent ?. change Drag View Alpha ( 0 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ< Ġstory List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views [ currentIndex ]. pause Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ< Ġstory List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views [ currentIndex ]. resume Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresume With New Duration ( duration InSeconds : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ< Ġstory List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views [ currentIndex ]. resume With Updated Duration ( duration InSeconds ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnext () Ġ{ ĊĠĠĠĠĠĠĠ Ġprevious Index Ġ= ĠcurrentIndex ĊĠĠĠĠĠĠĠ ĠcurrentIndex ++ ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ>= Ġstory List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġprevious Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow Current ( Story Change Direction . NEXT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprevious () Ġ{ ĊĠĠĠĠĠĠĠ Ġprevious Index Ġ= ĠcurrentIndex ĊĠĠĠĠĠĠĠ ĠcurrentIndex -- ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Index Ġ= ĠcurrentIndex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresume () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow Current ( Story Change Direction . PREVIOUS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Current ( direction : ĠStory Change Direction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtotal St ories Ġ= Ġstory List . size ĊĠĠĠĠĠĠĠ Ġif Ġ( total St ories Ġ== Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. max ( 0 , ĠcurrentIndex Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views [ i ]. progress Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views [ i ]. cancel Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ!= Ġtotal St ories Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠcurrentIndex Ġ+ Ġ 1 Ġuntil Ġtotal St ories ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views [ i ]. progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views [ i ]. cancel Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ< Ġtotal St ories ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent View Ġ= Ġstory List [ currentIndex ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Views [ currentIndex ]. start Progress ( get Story Duration ( currentIndex )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstory Callback ?. on Story Change ( current View , ĠcurrentIndex , Ġdirection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent View ?. let Ġ{ Ġmain View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev View Ġ= Ġmain View . current View . getChild At ( previous Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur View Ġ= Ġmain View . current View . getChild At ( currentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Index Ġ!= ĠcurrentIndex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfade Duration Ġ= Ġif Ġ( cross Fade Duration Ġ< Ġ 0 ) Ġ 0 L Ġelse Ġcross Fade Duration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross Fade Animator ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross Fade Animator Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev View . cross Fade ( cur View , Ġfade Duration , Ġprevious Index Ġ> ĠcurrentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur View . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprogress View (): ĠStory Horizontal Progress Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStory Horizontal Progress ( context ). apply Ġ{ Ġprogress Watcher ( progress Watcher ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠ Ġstory Callback ?. on Story End () ĊĠĠĠĠĠĠĠ Ġfor Ġ( progress Bar Ġin Ġprogress Views ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . cancel Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . progress Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Story Duration ( index : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġduration Per Story ?. let Ġ{ Ġduration List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġduration List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration List [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstory Duration InSeconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġstory Duration InSeconds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes ĠXML Ġattributes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinitialize Attributes ( attrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( attrs , ĠR . style able . St ories View , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstory Duration InSeconds Ġ= Ġarray . getInteger ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . St ories View _ story Duration In Sec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ ST ORY _ DURATION _ IN _ SECONDS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ ST ORY _ DURATION _ IN _ SECONDS Ġ= Ġ 5 ĊĠĠĠ Ġ} Ċ }