package Ġxyz . ji en an . xk cd . list Ċ Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . animation . do On Cancel Ċ import Ġandroidx . core . animation . do On End Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . St agger ed Grid LayoutManager Ċ import Ġxyz . ji en an . xk cd . R Ċ Ċ class ĠRecyclerView Fast Scroller Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) Ġ: ĊĠĠĠĠĠĠĠ ĠLinearLayout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbubble Ġby Ġlazy Ġ{ ĠfindViewById < TextView >( R . id . fast sc roller _ bubble ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhandle Ġby Ġlazy Ġ{ ĠfindViewById < View >( R . id . fast sc roller _ handle ) Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġre cyclerView : ĠRecyclerView ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġon Scroll Listener Ġ= Ġobject Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Bubble And Handle Position () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Animator : ĠObject Animator ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠLayoutInflater . from ( context ). inflate ( R . layout . rv _ sc roller , Ġthis , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġorientation Ġ= ĠH ORIZONTAL ĊĠĠĠĠĠĠĠ Ġclip Children Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠĠĠĠĠ Ġupdate Bubble And Handle Position () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . x Ġ< Ġhandle !!. x Ġ- ĠView Compat . get Padding Start ( handle !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Animator Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Animator !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bubble Ġ!= Ġnull Ġ&& Ġbubble !!. visibility Ġ== ĠView . IN VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Bubble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle !!. isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Bubble And Handle Position ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset RecyclerView Position ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Bubble And Handle Position ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset RecyclerView Position ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle !!. isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Bubble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . re cyclerView Ġ!== Ġre cyclerView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . re cyclerView Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . re cyclerView !!. remove On Scroll Listener ( on Scroll Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . re cyclerView Ġ= Ġre cyclerView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . re cyclerView Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . add On Scroll Listener ( on Scroll Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView !!. remove On Scroll Listener ( on Scroll Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset RecyclerView Position ( y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Count Ġ= Ġre cyclerView !!. adapter !!. item Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproportion Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle !!. y Ġ== Ġ 0 f Ġ-> Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle !!. y Ġ+ Ġhandle !!. height Ġ>= Ġheight Ġ- ĠTR ACK _ SNAP _ RANGE Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġy Ġ/ Ġheight . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Pos Ġ= ĠgetValue InRange ( 0 , Ġitem Count Ġ- Ġ 1 , Ġ( pro portion Ġ* Ġitem Count . toFloat ()). toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView !!. layout Manager ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Manager Ġis ĠSt agger ed Grid LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager . scrollTo Position With Offset ( target Pos , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( layout Manager Ġis ĠLinearLayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager . scrollTo Position With Offset ( target Pos , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbubble . text Ġ= Ġ( re cyclerView !!. adapter Ġas ĠB ubble Text Getter ). getText To Show In Bubble ( target Pos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetValue InRange ( min : ĠInt , Ġmax : ĠInt , Ġvalue : ĠInt ) Ġ= Ġvalue . coerce In ( min , Ġmax ) ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Bubble And Handle Position () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bubble Ġ== Ġnull Ġ|| Ġhandle !!. isSelected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġvertical Scroll Offset Ġ= Ġre cyclerView !!. compute Vertical Scroll Offset () ĊĠĠĠĠĠĠĠ Ġval Ġvertical Scroll Range Ġ= Ġre cyclerView !!. compute Vertical Scroll Range () ĊĠĠĠĠĠĠĠ Ġval Ġproportion Ġ= Ġvertical Scroll Offset . toFloat () Ġ/ Ġ( vertical Scroll Range . toFloat () Ġ- Ġheight ) ĊĠĠĠĠĠĠĠ Ġset Bubble And Handle Position ( height Ġ* Ġproportion ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Bubble And Handle Position ( y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Height Ġ= Ġhandle !!. height ĊĠĠĠĠĠĠĠ Ġhandle !!. y Ġ= Ġ( y Ġ- Ġhandle Height Ġ/ Ġ 2 ). coerce In ( 0 f , Ġ( height Ġ- Ġhandle Height ). toFloat ()) ĊĠĠĠĠĠĠĠ Ġval Ġbubble Height Ġ= Ġbubble !!. height ĊĠĠĠĠĠĠĠ Ġbubble !!. y Ġ= Ġ( y Ġ- Ġbubble Height ). coerce In ( 0 f , Ġheight Ġ- Ġbubble Height Ġ- Ġhandle Height Ġ/ Ġ 2 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Bubble () Ġ{ ĊĠĠĠĠĠĠĠ Ġbubble !!. visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Animator Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Animator !!. cancel () ĊĊĠĠĠĠĠĠĠ Ġcurrent Animator Ġ= ĠObject Animator . of Float ( bubble , ĠView . ALPHA , Ġ 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( BU BB LE _ ANIM ATION _ DURATION ). apply Ġ{ Ġstart () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Bubble () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Animator Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Animator !!. cancel () ĊĊĠĠĠĠĠĠĠ Ġcurrent Animator Ġ= ĠObject Animator . of Float ( bubble , ĠView . ALPHA , Ġ 1 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( BU BB LE _ ANIM ATION _ DURATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo On End Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbubble !!. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo On Cancel Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbubble !!. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠB ubble Text Getter Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠgetText To Show In Bubble ( pos : ĠInt ): ĠString ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠB UB BLE _ ANIM ATION _ DURATION Ġ= Ġ 1 0 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTR ACK _ SNAP _ RANGE Ġ= Ġ 5 ĊĠĠĠ Ġ} Ċ }