/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠQu iph ĠMedia ĠP vt ĠLtd Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . qt alk . recyclerview fast sc roller Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Typed Array Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . support . annotation .* Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 4 . widget . TextView Compat Ċ import Ġandroid . support . v 7 . widget . AppCompat ImageView Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . On Touch Listener Ċ import Ġandroid . view . View Property Animator Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroid . widget . TextView Ċ Ċ /** Ċ Ġ* ĠSets Ġa Ġcustom Ġsc roller Ġfor Ġ[ RecyclerView ]. Ċ Ġ* Ċ Ġ* ĠFor Ġbest Ġresults Ġuse Ġthe ĠFast Scroller Ġwithout Ġa Ġscrollbar Ġset Ġin Ġthe Ġ[ RecyclerView ] Ċ Ġ* Ċ Ġ* ĠTo Ġset Ġprogram matically Ġcall Ġthe Ġ[ attach Fast Scroller To RecyclerView ] Ġonce Ġthe Ġ[ RecyclerView . LayoutManager ] Ġand Ġ[ RecyclerView . Adapter ] Ġare Ġinitialized , Ġelse Ġif Ġa Ġchild Ġof Ġthis Ġview Ġis Ġa Ġ[ RecyclerView ] Ġthen Ġthe Ġmethod Ġis Ġcalled Ġdirectly , Ċ Ġ* Ġwithout Ġthe Ġprogrammer Ġexplicitly Ġneeding Ġto Ġcall Ġit . Ċ Ġ* Ċ Ġ* Ġ** Direction :** ĠThe Ġdirection Ġof Ġthe Ġ[ RecyclerView Fast Scroller ] Ġcan Ġbe Ġset Ġusing Ġthe Ġ[ R . style able . RecyclerView Fast Scroller _ fast Scroll Direction ] Ġview Ġattrib . Ċ Ġ* Ċ Ġ* Ġ** Scroll Ġlayout Ġdrawing :** ĠThe Ġdrawing Ġof Ġthe Ġscrollbar Ġlayout Ġcan Ġbe Ġchanged Ġduring Ġlayout Ġcreation Ġusing Ġthe Ġ[ R . style able . RecyclerView Fast Scroller _ popup Position ] Ġparam Ġwhich Ġtakes Ċ Ġ* Ġ` Popup Position . BEFORE _ TRACK ` Ġand Ġ` Popup Position . AFTER _ TRACK ` Ġat tribs Ċ Ġ* Ċ Ġ* Ġ** Layout Ġcustom izations :** Ċ Ġ* ĠĠ 1 . ĠPopup ĠLayout : ĠThe Ġpopup Ġlayout Ġbackground Ġcan Ġbe Ġchanged Ġboth Ġprogram matically Ġwith Ġ[ RecyclerView Fast Scroller . popup Drawable ] Ġand Ġusing Ġthe Ġ[ R . style able . RecyclerView Fast Scroller _ popup Drawable ] Ġview Ġattrib . Ċ Ġ* ĠĠ 2 . ĠHandle ĠLayout : ĠThe Ġhandle Ġlayout Ġbackground Ġcan Ġbe Ġchanged Ġboth Ġprogram matically Ġwith Ġ[ RecyclerView Fast Scroller . handle Drawable ] Ġand Ġusing Ġthe Ġ[ R . style able . RecyclerView Fast Scroller _ handle Drawable ] Ġview Ġattrib . Ċ Ġ* ĠĠ 3 . ĠTrack ĠLayout : ĠThe Ġtrack Ġlayout Ġbackground Ġcan Ġbe Ġchanged Ġboth Ġprogram matically Ġwith Ġ[ RecyclerView Fast Scroller . track Drawable ] Ġand Ġusing Ġthe Ġ[ R . style able . RecyclerView Fast Scroller _ track Drawable ] Ġview Ġattrib . Ċ Ġ* ĠĠ 4 . ĠPopup Ġ[ TextView ] Ġappearance Ġcan Ġbe Ġchanged Ġboth Ġprogram matically Ġwith Ġ[ RecyclerView Fast Scroller . text Style ] Ġand Ġusing Ġthe Ġ[ R . style able . RecyclerView Fast Scroller _ popup TextStyle ] Ġview Ġattrib . Ċ Ġ* Ċ Ġ* Ġ ĠBy Ġdefault Ġthe Ġlast Ġitem Ġof Ġthe Ġ[ RecyclerView ] Ġassociated Ġwith Ġthe Ġfast Scroller Ġhas Ġan Ġextra Ġpadding Ġof Ġthe Ġheight Ġof Ġthe Ġfirst Ġvisible Ġitem Ġfound , Ġto Ġdisable Ġthis Ġbehaviour Ġset Ġthe Ġ[ R . style able . RecyclerView Fast Scroller _ add Last Item Padding ] Ġas Ġ` false ` Ċ Ġ* Ċ Ġ* Ġ ĠTo Ġdisable Ġfast Scroll , Ġset Ġthe Ġ[ RecyclerView Fast Scroller . is Fast Scroll Enabled ] Ġas Ġ` false `, Ġdefault Ġset Ġis Ġtrue Ċ Ġ* Ċ Ġ* Ġ Ġ** Handle ĠSize :** ĠThe Ġfast Scroller Ġautomatically Ġadjust s Ġthe Ġsize Ġof Ġthe Ġhandle , Ġbut Ġif Ġ[ RecyclerView Fast Scroller . is Fixed Size Handle ] Ġis Ġset Ġas Ġtrue Ġhandle Ġ[ R . style able . RecyclerView Fast Scroller _ handle Height ] Ċ Ġ* Ġ Ġand Ġ[ R . style able . RecyclerView Fast Scroller _ handle Width ] Ġneed Ġto Ġbe Ġprovided Ġelse Ġdefault Ġvalue Ġof Ġ 1 8 dp Ġwill Ġbe Ġtaken Ġfor Ġboth . Ċ Ġ* Ċ Ġ* Ġ@ version Ġ 1 . 0 Ċ Ġ* Ġ*/ Ċ Ċ // todo @ sh ah sur aj k Ġwrite Ġfor Ġx Ġdirection Ċ class ĠRecyclerView Fast Scroller Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠRelative Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG : ĠString Ġ= Ġ" RV Fast Scroller " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERROR _ MESSAGE _ NO _ REC Y CL ER _ VIEW Ġ= Ġ" The ĠRecyclerView Ġrequired Ġfor Ġinitialization Ġwith ĠFast Scroller Ġcannot Ġbe Ġnull " ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġenum Ġclass ĠFast Scroll Direction ( val Ġvalue : ĠInt ){ ĊĠĠĠĠĠĠĠ ĠH ORIZONTAL ( 1 ), ĠV ERT ICAL ( 0 ); ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Fast Scroll Direction By Value ( value : ĠInt Ġ= ĠDefaults . fast Scroll Direction . value ): ĠFast Scroll Direction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( fs Direction Ġin Ġvalues ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fs Direction . value Ġ== Ġvalue ) Ġreturn Ġfs Direction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDefaults . fast Scroll Direction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġenum Ġclass ĠPopup Position ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBE FORE _ TRACK ( 0 ), ĠAFTER _ TRACK ( 1 ); ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Popup Post ion By Value ( value : ĠInt Ġ= ĠDefaults . popup Position . value ): ĠPopup Position Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( popup Position Ġ: ĠPopup Position Ġin Ġvalues ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( popup Position . value Ġ== Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpopup Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDefaults . popup Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠĠĠ Ġdefaults Ġto Ġbe Ġused Ġthroughout Ġthis Ġclass . ĠAll Ġthese Ġvalues Ġcan Ġbe Ġover rid en Ġin Ġthe Ġindividual Ġmethods Ġprovided Ġfor Ġthe Ġmain Ġclass ĊĠĠĠ Ġprivate Ġobject ĠDefaults Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġpopup Drawable Int Ġ: ĠInt Ġ= ĠR . drawable . custom _ bg _ primary ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġhandle Drawable Int Ġ: ĠInt Ġ= ĠR . drawable . custom _ bg _ primary ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġhandle Size Ġ: ĠInt Ġ= ĠR . dim en . default _ handle _ size ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġtext Style Ġ: ĠInt Ġ= ĠR . style . Fast Scroller TextAppearance ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġpopup Position Ġ: ĠPopup Position Ġ= ĠPopup Position . BEFORE _ TRACK ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġfast Scroll Direction Ġ: ĠFast Scroll Direction Ġ= ĠFast Scroll Direction . VERTICAL ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval Ġis Fixed Size Handle Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval Ġis Fast Scroll Enabled Ġ: ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠDEFAULT _ ANIM _ DURATION Ġ: ĠLong Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠDEFAULT _ POP UP _ VIS IB L ITY _ DURATION Ġ= Ġ 2 0 0 L ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval Ġhas Empty Item Decorator Ġ: ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġa Ġtrack Ġbackground Ġdrawable Ġto Ġthe Ġtrack Ġused , Ġdefault Ġis Ġ` null ` ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġvar Ġtrack Drawable Ġ: ĠDrawable ? ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack View . background Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtrack View . background ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġbackground Ġdrawable Ġto Ġthe Ġ[ TextView ] Ġused Ġin Ġthe Ġpopup ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġvar Ġpopup Drawable Ġ: ĠDrawable ? ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpopup TextView . background Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpopup TextView . background ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġa Ġdrawable Ġto Ġthe Ġhandle Ġused Ġto Ġscroll Ġwith ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġvar Ġhandle Drawable Ġ: ĠDrawable ? ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . setImage Drawable ( require NotNull ( value ) Ġ{" No Ġdrawable Ġfound Ġfor Ġthe Ġgiven ĠID "}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġhandle ImageView . drawable ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġa Ġstyle Ġto Ġthe Ġ[ TextView ] Ġused Ġin Ġthe Ġpopup Ġdisplayed ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġ@ Style Res Ġvar Ġtext Style Ġ: ĠInt Ġ= ĠDefaults . text Style ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTextView Compat . setText Appearance ( popup TextView , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġtodo @ sh ah sur aj k Ġhandle Fixed Sizes ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġprivate Ġvar Ġis Fixed Size Handle Ġ: ĠBoolean Ġ= ĠDefaults . is Fixed Size Handle ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġset Ġto Ġ` false `, Ġthe Ġfast Scroll Ġbehavior Ġis Ġdisabled , ĠDefault Ġis Ġ` true ` ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġvar Ġis Fast Scroll Enabled Ġ: ĠBoolean Ġ= ĠDefaults . is Fast Scroll Enabled ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ TextView ] Ġwhich Ġis Ġused Ġto Ġdisplay Ġthe Ġpopup Ġtext . ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġlateinit Ġvar Ġpopup TextView : ĠTextView ĊĊĠĠĠ Ġ// Ġ--- Ġinternal Ġproperties ĊĠĠĠ Ġprivate Ġvar Ġpopup Position Ġ: ĠPopup Position Ġ= ĠDefaults . popup Position ĊĠĠĠ Ġprivate Ġvar Ġfast Scroll Direction Ġ: ĠFast Scroll Direction Ġ= ĠDefaults . fast Scroll Direction ĊĠĠĠ Ġprivate Ġvar Ġhas Empty Item Decorator Ġ: ĠBoolean Ġ= ĠDefaults . has Empty Item Decorator ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhandle ImageView Ġ: ĠAppCompat ImageView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtrack View : ĠLinearLayout ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġvar Ġpopup Animation Runnable : ĠRunnable ĊĠĠĠ Ġprivate Ġvar Ġis Eng aged Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġhandle State Listener Ġ: ĠHandle State Listener ? Ġ= null ĊĠĠĠ Ġprivate Ġvar Ġprevious Total Visible Item Ġ: ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġproperty Ġcheck ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġ[ Fast Scroll Direction ] Ġis Ġ[ Fast Scroll Direction . VERTICAL ] Ġor Ġnot ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġyes Ġelse Ġ` false ` ĊĠĠĠĠ Ġ* Ġ*/ Ċ // ĠĠĠ Ġval Ġis Vertical Ġ: ĠBoolean Ġ= Ġfast Scroll Direction Ġ== ĠFast Scroll Direction . VERTICAL ĊĊĠĠĠ Ġ// ĠĠĠ Ġload Ġattributes Ġto Ġset Ġview Ġbased Ġvalues ĊĠĠĠ Ġprivate Ġval Ġat tribs Ġ: ĠTyped Array ? Ġ= Ġif Ġ( attrs != null ){ ĊĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( attrs , ĠR . style able . RecyclerView Fast Scroller , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// add Ġpopup Ġlayout Ġand Ġthumb Ġlayout . ĊĠĠĠĠĠĠĠ Ġadd Popup Layout () ĊĠĠĠĠĠĠĠ Ġadd Thumb And Track () ĊĊĠĠĠĠĠĠĠ Ġat tribs ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attribs . hasValue ( R . style able . RecyclerView Fast Scroller _ popup Position )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Position Ġ= ĠPopup Position . get Popup Post ion By Value ( attribs . getInt ( R . style able . RecyclerView Fast Scroller _ popup Position , ĠDefaults . popup Position . value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attribs . hasValue ( R . style able . RecyclerView Fast Scroller _ fast Scroll Direction )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfast Scroll Direction Ġ= ĠFast Scroll Direction . get Fast Scroll Direction By Value ( attribs . getInt ( R . style able . RecyclerView Fast Scroller _ fast Scroll Direction , ĠDefaults . fast Scroll Direction . value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Fixed Size Handle Ġ= Ġat tribs . getBoolean ( R . style able . RecyclerView Fast Scroller _ handle Has Fixed Size , ĠDefaults . is Fixed Size Handle ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Fast Scroll Enabled Ġ= Ġat tribs . getBoolean ( R . style able . RecyclerView Fast Scroller _ fast Scroll Enabled , ĠDefaults . is Fast Scroll Enabled ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Empty Item Decorator Ġ= Ġat tribs . getBoolean ( R . style able . RecyclerView Fast Scroller _ add Last Item Padding , ĠDefaults . has Empty Item Decorator ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack View . background Ġ= Ġat tribs . get Drawable ( R . style able . RecyclerView Fast Scroller _ track Drawable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// align Ġadded Ġlayouts Ġbased Ġon Ġconfigurations Ġin Ġuse . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalign Track And Handle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalign Popup Layout () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġnot Ġdefined , Ġset Ġdefault Ġpopup TextView Ġbackground ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpopup TextView . background Ġ= Ġif Ġ( attribs . hasValue ( R . style able . RecyclerView Fast Scroller _ popup Drawable ) Ġ== Ġtrue ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Drawable From Attribs ( R . style able . RecyclerView Fast Scroller _ popup Drawable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( context , ĠDefaults . popup Drawable Int ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġdefault Ġhandle ImageView Ġdrawable Ġif Ġnot Ġdefined ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . setImage Drawable (( load Drawable From Attribs ( R . style able . RecyclerView Fast Scroller _ handle Drawable ) ?: ĠContext Compat . get Drawable ( context , ĠDefaults . handle Drawable Int ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Handle ImageView Size () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTextView Compat . setText Appearance ( popup TextView , Ġat tribs . getResource Id ( R . style able . RecyclerView Fast Scroller _ popup TextStyle , ĠDefaults . text Style )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġat tribs . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpopup Animation Runnable Ġ= ĠRunnable Ġ{ Ġpopup TextView . animate Visibility ( false ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġdetach Fast Scroller From RecyclerView () ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Finish Inf late () ĊĠĠĠĠĠĠĠ Ġ// Ġskip Ġthe Ġtwo Ġchildren Ġadd , Ġa ka Ġpopup Ġand Ġtrack Ġand Ġcheck Ġif Ġthe ĠRecyclerView Ġis Ġadded Ġvia ĠXML Ġor Ġnot , Ġif Ġadded Ġcall Ġthe Ġattach Ġdirectly . ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ> Ġ 2 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child At Ġ: ĠInt Ġin Ġ 2 Ġuntil Ġchild Count ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent View Ġ= Ġget Child At ( child At ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current View Ġis ĠRecyclerView ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View ( current View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( current View , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach Fast Scroller To RecyclerView ( current View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Array Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// this Ġoffset Ġis Ġto Ġnull ify Ġthe Ġdifference Ġin Ġthe Ġheight Ġbetween Ġthe Ġhandle Ġand Ġtouch 's Ġrelative Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtouch Relative Offset Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtouch Listener Ġ Ġ= ĠOn Touch Listener Ġ{ Ġ_, Ġmotion Event Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// getting Ġthe Ġposition Ġof Ġthis Ġview Ġon Ġthe Ġscreen , Ġgetting Ġabsolute ĠX Ġand ĠY Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Location In Window ( location Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Abs Position Ġ: ĠInt Ġ= Ġlocation Array [ 1 ] Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Abs Position Ġ: ĠInt Ġ= Ġlocation Array [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( motion Event . action ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE , ĠMotion Event . ACTION _ DOWN Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdis allow Ġparent Ġto Ġspy Ġon Ġtouch Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Dis allow Intercept Touch Event ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( motion Event . action Ġ== ĠMotion Event . ACTION _ DOWN ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! adapter Data Observer . isInitialized ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Data Observer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( re cyclerView ) Ġ{ ĠERROR _ MESSAGE _ NO _ REC Y CL ER _ VIEW Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// compute Ġrelative Ġtouch Ġoffset Ġonly Ġon ĠDOWN Ġand Ġuse Ġthe Ġsame Ġfor ĠMOVE Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Relative Offset Ġ= Ġmotion Event . raw Y Ġ- Ġy Abs Position Ġ- Ġhandle ImageView . y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġif Ġoffset Ġis Ġin Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . abs ( touch Relative Offset )> handle ImageView . height ) Ġtouch Relative Offset Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Ġthe Ġeng aged Ġflag Ġto Ġprevent Ġthe Ġhandle Ġfrom Ġscrolling Ġagain Ġas Ġthe ĠOn Sc rolled Ġevent Ġin Ġthe ĠScroll Listener Ġis Ġcalled Ġeven Ġfor Ġprogram matic Ġscroll s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Eng aged Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Fast Scroll Enabled ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle State Listener ?. on Eng aged () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// make Ġthe Ġpopup Ġvisible Ġonly Ġif Ġfast Scroll Ġis Ġenabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup TextView . animate Visibility () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ---------------- ----------- ĠCommon Ġmethods Ġto ĠMove Ġand ĠDown Ġevents Ġ-------------------------------- - ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Ġrelative ĠY Ġposition Ġinternal Ġto Ġthe Ġview , Ġfrom Ġmotion Ġabsolute Ġpx Ġtouch Ġvalue Ġand Ġabsolute Ġstart Ġpoint Ġof Ġthe Ġview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Relative Y Pos Ġ= Ġmotion Event . raw Y Ġ- Ġy Abs Position Ġ- Ġtouch Relative Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// move Ġthe Ġhandle Ġonly Ġif Ġfast Sc rolled , Ġelse Ġleave Ġthe Ġtranslation Ġof Ġthe Ġhandle Ġto Ġthe Ġon Sc rolled Ġmethod Ġon Ġthe Ġlistener ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Fast Scroll Enabled ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove View By Relative Y In Bounds ( handle ImageView , Ġcurrent Relative Y Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove View By Relative Y In Bounds ( popup TextView , Ġcurrent Relative Y Pos - popup TextView . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġre cyclerView . compute Position For Offset And Scroll ( current Relative Y Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( motion Event . action Ġ== ĠMotion Event . ACTION _ MOVE ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle State Listener ?. on Drag ged ( handle ImageView . y , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Text In Popup ( Math . min (( re cyclerView . adapter . item Count )- 1 , Ġposition )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . scroll By ( 0 , Ġcurrent Relative Y Pos . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĠMotion Event . ACTION _ CANCEL Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Eng aged Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Fast Scroll Enabled ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle State Listener ?. on Released () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// hide Ġthe Ġpopup Ġwith Ġa Ġdefault Ġanim Ġdelay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( popup Animation Runnable , ĠDefaults . DEFAULT _ POP UP _ VIS IB L ITY _ DURATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Touch Event ( motion Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Ġthe Ġsame Ġtouch Ġlisteners Ġto Ġboth Ġhandle Ġand Ġtrack Ġas Ġthey Ġhave Ġthe Ġsame Ġfunctionality ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . setOn Touch Listener ( touch Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack View . setOn Touch Listener ( touch Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġalign Popup Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlp Popup Layout Ġ= ĠLayout Params ( LayoutParams . WRAP _ CONTENT , ĠLayout Params . WRAP _ CONTENT ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( popup Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPopup Position . BEFORE _ TRACK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Rule ( LEFT _ OF , Ġtrack View . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPopup Position . AFTER _ TRACK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Rule ( RIGHT _ OF , Ġtrack View . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpopup TextView . layout Params Ġ= Ġlp Popup Layout ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġalign Track And Handle () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlp Ġ= ĠLinearLayout . LayoutParams ( LayoutParams . WRAP _ CONTENT , ĠLayout Params . WRAP _ CONTENT ) ĊĠĠĠĠĠĠĠ Ġval Ġlp Track Layout : ĠLayout Params Ġ= Ġwhen Ġ( fast Scroll Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFast Scroll Direction . HORIZONTAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlp . gravity Ġ= ĠGr avity . END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Params ( LayoutParams . MATCH _ PARENT , ĠLayout Params . WRAP _ CONTENT ). also Ġ{ Ġit . add Rule ( ALIGN _ PARENT _ BOTTOM ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFast Scroll Direction . VERTICAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlp . gravity Ġ= ĠGr avity . TOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Params ( LayoutParams . WRAP _ CONTENT , ĠLayout Params . MATCH _ PARENT ). also Ġ{ Ġit . add Rule ( ALIGN _ PARENT _ RIGHT ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandle ImageView . layout Params Ġ= Ġlp ĊĠĠĠĠĠĠĠ Ġtrack View . layout Params Ġ= Ġlp Track Layout ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġrefresh Handle ImageView Size ( new Computed Size Ġ: ĠInt Ġ= Ġ- 1 ){ Ċ // ĠĠĠĠĠĠĠ Ġtodo @ sh ah sur aj k Ġadd Ġfork Ġfor Ġhorizontal Ġlayout ĊĠĠĠĠĠĠĠ Ġif Ġ( new Computed Size == - 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . layout Params . width Ġ= Ġload Handle Width (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . layout Params . height Ġ= Ġload Handle Height (). toInt () ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO ("@ sh ah sur aj k Ġdynamic Ġs izing Ġof Ġhandle ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġadd Thumb And Track (){ ĊĠĠĠĠĠĠĠ ĠView . inflate ( context , R . layout . fast sc roller _ track _ thumb , Ġthis ) ĊĠĠĠĠĠĠĠ Ġhandle ImageView Ġ= ĠfindViewById ( R . id . thumb IV ) ĊĠĠĠĠĠĠĠ Ġtrack View Ġ= ĠfindViewById ( R . id . track View ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġadd Popup Layout (){ ĊĠĠĠĠĠĠĠ ĠView . inflate ( context , ĠR . layout . fast sc roller _ popup , Ġthis ) ĊĠĠĠĠĠĠĠ Ġpopup TextView Ġ= ĠfindViewById ( R . id . fast Scroll Popup TV ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġthe Ġbounds Ġof Ġthe Ġview Ġbefore Ġmoving ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġview Ġthe Ġview Ġto Ġmove Ġand ĊĠĠĠĠ Ġ* Ġ@ param Ġfinal Offset Ġthe Ġoffset Ġto Ġmove Ġto ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmove View By Relative Y In Bounds ( view : ĠView , Ġfinal Offset : ĠFloat ){ ĊĠĠĠĠĠĠĠ Ġview . y Ġ= Ġ ĠMath . min ( Math . max ( final Offset , Ġ 0 f ), Ġ( height . toFloat ()- view . height . toFloat ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCustom Ġanim ator Ġextension , Ġas Ġ[ View Property Animator ] Ġdoesn 't Ġhave Ġindividual Ġlisteners , Ġdecl utter ing , Ġalso Ġpresent Ġin Ġandroid ĠK TX ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġinline Ġfun ĠView Property Animator . on Animation Cancelled ( cross inline Ġbody : Ġ() Ġ-> ĠUnit ){ ĊĠĠĠĠĠĠĠ Ġthis . set Listener ( object Ġ: ĠAn imator . Animator Listener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( p 0 : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( p 0 : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( p 0 : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( p 0 : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnim ates Ġthe Ġview Ġvis ib l ity Ġbased Ġon Ġthe Ġ[ make Visible ] Ġparam ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmake Visible ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠView . animate Visibility ( make Visible Ġ: ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġscale Factor : ĠFloat Ġ= Ġif Ġ( make Visible ) Ġ 1 f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠ Ġthis . animate (). scale X ( scale Factor ). set Duration ( Defaults . DEFAULT _ ANIM _ DURATION ). on Animation Cancelled { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . animate (). scale X ( scale Factor ). duration Ġ= ĠDefaults . DEFAULT _ ANIM _ DURATION ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . animate (). scale Y ( scale Factor ). set Duration ( Defaults . DEFAULT _ ANIM _ DURATION ). on Animation Cancelled Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . animate (). scale Y ( scale Factor ). duration Ġ= ĠDefaults . DEFAULT _ ANIM _ DURATION ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠĠĠ Ġset Ġof Ġload Ġmethods Ġfor Ġhandy Ġloading Ġfrom Ġat tribs ĊĠĠĠ Ġprivate Ġfun Ġload Dim en From Resource (@ Dim en Res Ġdim en Size : ĠInt ) Ġ: ĠFloat Ġ= Ġcontext . resources . get Dimension ( dim en Size ) ĊĠĠĠ Ġprivate Ġfun Ġload Handle Height () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat tribs ?. get Dimension ( R . style able . RecyclerView Fast Scroller _ handle Height , Ġload Dim en From Resource ( Defaults . handle Size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload Dim en From Resource ( Defaults . handle Size ) ĊĊĠĠĠ Ġprivate Ġfun Ġload Handle Width () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat tribs ?. get Dimension ( R . style able . RecyclerView Fast Scroller _ handle Width , Ġload Dim en From Resource ( Defaults . handle Size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload Dim en From Resource ( Defaults . handle Size ) ĊĊĊĠĠĠ Ġprivate Ġfun Ġload Drawable From Attribs (@ Style able Res Ġstyle Id Ġ: ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġat tribs ?. get Drawable ( style Id ) ĊĊĠĠĠ Ġ// ĠĠĠ Ġextension Ġfunctions Ġto Ġget Ġthe Ġtotal Ġvisible Ġcount Ġof Ġitems . ĊĠĠĠ Ġprivate Ġfun ĠLinearLayoutManager . getTotal Comp let ely Visible ItemCount (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Visible Item Position Ġ= Ġthis . findFirst Comp let ely Visible Item Position () ĊĠĠĠĠĠĠĠ Ġval Ġlast Visible Item Position Ġ= Ġthis . find Last Comp let ely Visible Item Position () ĊĠĠĠĠĠĠĠ Ġif Ġ( first Visible Item Position Ġ== ĠRecyclerView . NO _ POSITION Ġ|| Ġlast Visible Item Position Ġ== ĠRecyclerView . NO _ POSITION ) Ġreturn ĠRecyclerView . NO _ POSITION ĊĠĠĠĠĠĠĠ Ġreturn Ġlast Visible Item Position Ġ- Ġfirst Visible Item Position ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ RecyclerView . LayoutManager ] Ġhas Ġdifferent Ġtypes Ġof Ġscroll Ġmechanisms , Ġthis Ġextension Ġfunction Ġuses Ġthe Ġ[ Linear LayoutManager . scrollTo Position With Offset ] Ġif Ġits Ġan Ġinstance Ġof Ġ[ Linear LayoutManager ] ĊĠĠĠĠ Ġ* Ġelse Ġuses Ġthe Ġstandard Ġ[ RecyclerView . LayoutManager . scrollTo Position ] Ġmethod . ĠThe Ġoffset Ġin Ġ[ Linear LayoutManager ] Ġis Ġthe Ġposition Ġwhere Ġthe Ġview Ġshould Ġbe Ġafter Ġscrolling Ġrelative Ġto Ġthe Ġ[ RecyclerView ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠRecyclerView . safe Scroll To Position ( position : ĠInt ){ ĊĠĠĠĠĠĠĠ Ġwhen ( this . layout Manager ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLinearLayoutManager Ġ-> Ġ( this . layout Manager Ġas ĠLinearLayoutManager ). scrollTo Position With Offset ( position , 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRecyclerView . LayoutManager Ġ-> Ġthis . layout Manager . scrollTo Position ( position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġthe Ġposition Ġto Ġmake Ġthe Ġ[ RecyclerView ] Ġto Ġscroll Ġto . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Calculation :** Ġ[ relative Raw Pos ] Ġis Ġdivided Ġwith Ġdifference Ġof Ġthe Ġs coll Ġextent Ġusing Ġ[ RecyclerView ]. compute < X > Scroll Extent , Ġwhere ĠX Ġis Ġbe Ġthe Ġdirection ĊĠĠĠĠ Ġ* Ġand Ġthe Ġheight Ġof Ġthe Ġhandle Ġand Ġthen Ġthis Ġvalue Ġis Ġmultip lied Ġby Ġthe Ġtotal Ġitem Ġcount , Ġthis Ġgive Ġus Ġthe ĠGeneral Ġposition . ĠBut Ġfor Ġ[ Linear LayoutManager ] ĊĠĠĠĠ Ġ* Ġthe Ġcurrent Ġvisible Ġitems Ġare Ġalso Ġtaken Ġinto Ġconsideration ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*@ param Ġrelative Raw Pos Ġthe Ġrelative Ġraw Ġposition , Ġcalculated Ġduring Ġ[ Motion Event . ACTION _ MOVE ] Ġor Ġ[ Motion Event . ACTION _ DOWN ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠRecyclerView . compute Position For Offset And Scroll ( relative Raw Pos Ġ: ĠFloat ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ: ĠRecyclerView . LayoutManager ? Ġ= Ġthis . layout Manager ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView ItemCount Ġ= Ġthis . adapter ?. item Count Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġnew Offset Ġ= Ġrelative Raw Pos Ġ/ Ġ(( this . compute Vertical Scroll Extent (). toFloat ()) Ġ- Ġhandle ImageView . height . toFloat ()) ĊĠĠĠĠĠĠĠ Ġwhen ( layout Manager ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLinearLayoutManager Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Visible Items Ġ= Ġlayout Manager . getTotal Comp let ely Visible ItemCount () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Visible Items Ġ== ĠRecyclerView . NO _ POSITION ) Ġreturn ĠRecyclerView . NO _ POSITION ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġlast Ġitem Ġwould Ġhave Ġone Ġless Ġvisible Ġitem , Ġthis Ġis Ġto Ġoffset Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Total Visible Item Ġ= ĠMath . max ( previous Total Visible Item , Ġtotal Visible Items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġbounds Ġand Ġthen Ġset Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠMath . min ( re cyclerView ItemCount , ĠMath . max ( 0 , ĠMath . round ( new Offset Ġ* Ġ( re cyclerView ItemCount Ġ- Ġtotal Visible Items )))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Scroll Position Ġ= Ġ ĠMath . min (( this . adapter ?. item Count ?: 0 )-( previous Total Visible Item + 1 ), Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsafe Scroll To Position ( to Scroll Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠMath . round ( new Offset Ġ* Ġre cyclerView ItemCount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsafe Scroll To Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġtext Ġand Ġchecks Ġif Ġthe Ġinterface Ġis Ġimplemented Ġor Ġnot ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Text In Popup ( position : ĠInt ){ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ! in Ġ 0 Ġuntil Ġ( re cyclerView . adapter ?. item Count ?: 1 )) Ġ{ Ġreturn Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġre cyclerView . adapter ĊĠĠĠĠĠĠĠ Ġwhen Ġ( adapter ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOn Popup Text Update Ġ-> Ġpopup TextView . text Ġ= adapter . onChange ( position ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOn Popup View Update Ġ-> Ġ{ adapter . on Update ( position , Ġpopup TextView )} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ throw ĠIllegal AccessException (" No Ġadapter Ġfound , Ġif Ġyou Ġhave Ġan Ġadapter Ġthen Ġtry Ġpl acing Ġif Ġbefore Ġcalling Ġthe Ġattach Fast Scroller To RecyclerView () Ġmethod ")} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġthrow ĠIllegal AccessException (" Should Ġimplement Ġthe ĠOn Popup Text Update Ġor ĠOn Popup View Update Ġinterface ")} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġempty Space Item Decoration Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠRecyclerView . Item Decoration () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( out Rect : ĠRect , Ġview : ĠView , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . getItem Offsets ( out Rect , Ġview , Ġparent , Ġstate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent . getChild Adapter Position ( view ) Ġ== Ġparent . adapter . item Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Visible Pos : ĠInt Ġ= Ġ( re cyclerView . layout Manager Ġas ĠLinearLayoutManager ). findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Visible Pos Ġ!= ĠRecyclerView . NO _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . bottom Ġ= Ġ( parent . find ViewHolder For Adapter Position ( current Visible Pos )?. item View ?. height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġadds Ġemp l ty Ġspace Ġto Ġthe Ġlast Ġitem Ġof Ġthe Ġ[ RecyclerView ] ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġprivate Ġfun Ġset Empty Space Item Decorator (){ ĊĠĠĠĠĠĠĠ Ġre cyclerView . addItem Decoration ( empty Space Item Decoration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġadapter Data Observer Ġ= Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠRecyclerView . Adapter Data Observer () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Total Visible Item Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Removed ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Item Range Removed ( position Start , Ġitem Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Total Visible Item Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġregister Data Observer (){ ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter ?. register Adapter Data Observer ( adapter Data Observer . value ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġon Scroll Listener Ġ= Ġobject Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView ?, Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Eng aged Ġ&& Ġis Fast Scroll Enabled ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompute Vertical Scroll Extent : ĠFloat Ġ= Ġre cyclerView ?. compute Vertical Scroll Extent ()?. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompute Vertical Scroll Range Ġ: ĠFloat Ġ= Ġre cyclerView ?. compute Vertical Scroll Range ()?. toFloat () Ġ?: Ġ 1 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġthe Ġlayout Ġis Ġscroll able . Ġi . e . Ġrange Ġis Ġlarge Ġthan Ġextent , Ġelse Ġdisable Ġfast scroll ing Ġand Ġtrack Ġto uches . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compute Vertical Scroll Extent < compute Vertical Scroll Range ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . animate Visibility () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack View . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . animate Visibility ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack View . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ImageView . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Scale Ġ= Ġ(( re cyclerView ?. compute Vertical Scroll Offset ()?. toFloat () Ġ?: Ġ 0 f )) Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( compute Vertical Scroll Range ) Ġ- Ġ( compute Vertical Scroll Extent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Offset Ġ= Ġoffset Scale Ġ* Ġ( compute Vertical Scroll Extent Ġ- Ġhandle ImageView . height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove View By Relative Y In Bounds ( handle ImageView , Ġfinal Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove View By Relative Y In Bounds ( popup TextView , Ġfinal Offset Ġ- Ġpopup TextView . height . toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Impl (){ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Empty Item Decorator ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Empty Space Item Decorator () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġregister Data Observer () ĊĠĠĠĠĠĠĠ Ġre cyclerView . add On Scroll Listener ( on Scroll Listener ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġtodo @ sh ah sur aj k Ġdecide Ġf ate Ġof Ġthis ĊĠĠĠĠĠĠĠ Ġre cyclerView . on Fl ing Listener Ġ= Ġobject Ġ: ĠRecyclerView . On Fl ing Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fl ing ( velocity X : ĠInt , Ġvelocity Y : ĠInt ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" on Fl ing -> Ġ$ velocity Y Ġ${ re cyclerView . min Fl ing Velocity } Ġ${ re cyclerView . max Fl ing Velocity }") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre cyclerView 1 Ġ= Ġre cyclerView Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView 1 ?. smooth Scroll By ( 0 , Ġre cyclerView 1 . compute Vertical Scroll Range ()- Ġre cyclerView 1 . compute Vertical Scroll Extent ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġa Ġ[ Handle State Listener ] Ġto Ġthis Ġfast scroll ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ* Ġ@ see ĠHandle State Listener ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġfun Ġset Handle State Listener ( handle State Listener : ĠHandle State Listener ){ ĊĠĠĠĠĠĠĠ Ġthis . handle State Listener Ġ= Ġhandle State Listener ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠCall Ġthis Ġmethod Ġonly Ġif Ġ[ RecyclerView ] Ġis Ġnot Ġa Ġchild Ġto Ġthis Ġview , Ġelse Ġcan Ġcause Ġmemory Ġle aks Ġand Ġun desired Ġbehavior ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTo Ġre - init Ġthe Ġ[ RecyclerView Fast Scroller ] Ġcall Ġthe Ġ[ detach Fast Scroller From RecyclerView ] Ġand Ġthen Ġre - call Ġthis Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġadds Ġa Ġ[ RecyclerView . On Scroll Listener ] Ġto Ġthe Ġ[ RecyclerView ] Ġand Ġalso Ġatt aches Ġan Ġitem Decorator Ġwhich Ġadds Ġmargin Ġto Ġthe Ġlast Ġitem Ġof Ġthe Ġ[ RecyclerView . Adapter ] ĊĠĠĠĠ Ġ* Ġthis Ġbottom Ġempty Ġmargin Ġcan Ġbe Ġskipped Ġif Ġthe Ġ[ R . style able . RecyclerView Fast Scroller _ add Last Item Padding ] Ġis Ġset Ġto Ġfalse Ġduring Ġlayout Ġcreation , Ġthis Ġwill Ġnot Ġadd Ġthe Ġ[ RecyclerView . Item Decoration ] Ġas Ġwell . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġ[ RecyclerView . On Scroll Listener ] Ġis Ġused Ġto Ġcompute Ġthe Ġpost ion Ġof Ġthe ĠHandle Ġduring Ġruntime , th us Ġcalling Ġ[ RecyclerView . clear On Scroll Listeners ] Ġmight Ġcause Ġthis Ġview Ġto Ġnot Ġfunction Ġproperly . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġ[ RecyclerView . Adapter Data Observer ] Ġis Ġalso Ġadded Ġto Ġlisten Ġto Ġdata Ġchanges . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġdetach Fast Scroller From RecyclerView ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġfun Ġattach Fast Scroller To RecyclerView ( re cyclerView : ĠRecyclerView ){ ĊĠĠĠĠĠĠĠ Ġthis . re cyclerView Ġ= Ġrequire NotNull ( re cyclerView ) Ġ{ ĠERROR _ MESSAGE _ NO _ REC Y CL ER _ VIEW Ġ} ĊĠĠĠĠĠĠĠ Ġinit Impl () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġshould Ġonly Ġbe Ġexplicitly Ġcalled Ġif Ġthere 's Ġa Ġneed Ġto Ġreset Ġthe Ġ[ RecyclerView Fast Scroller ] Ġelse Ġif Ġwill Ġbe Ġcalled Ġby Ġthis Ġview Ġin Ġthe Ġ[ on Detached From Window ] Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġremoves Ġthe Ġ[ RecyclerView . On Scroll Listener ], Ġthe Ġ[ RecyclerView . Item Decoration ] Ġif Ġset Ġand Ġthe Ġ[ RecyclerView . Adapter Data Observer ] Ġassociated Ġwith Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġattach Fast Scroller To RecyclerView ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġfun Ġdetach Fast Scroller From RecyclerView (){ ĊĠĠĠĠĠĠĠ Ġ// Ġunregister Ġthe Ġobserver Ġto Ġprevent Ġmemory Ġle aks Ġonly Ġif Ġinitialized ĊĠĠĠĠĠĠĠ Ġif Ġ( adapter Data Observer . isInitialized ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter ?. unregister Adapter Data Observer ( adapter Data Observer . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandle ImageView . setOn Touch Listener ( null ) ĊĠĠĠĠĠĠĠ Ġpopup TextView . setOn Touch Listener ( null ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . remove On Scroll Listener ( on Scroll Listener ) Ċ // ĠĠĠĠĠĠĠ Ġtodo @ sh ah sur aj k Ġthink Ġon Ġthis ĊĠĠĠĠĠĠĠ Ġre cyclerView . on Fl ing Listener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( has Empty Item Decorator ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . removeItem Decoration ( empty Space Item Decoration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġ[ TextView ] Ġalong Ġwith Ġthe Ġcurrent Ġpost ion Ġof Ġthe Ġ[ RecyclerView Fast Scroller ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAll Ġthe Ġvisual , Ġposition - based Ġchanges Ġshould Ġbe Ġdone Ġusing Ġthis Ġinterface ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġupdating Ġonly Ġthe Ġtext Ġcheck Ġ[ On Popup Text Update ] Ġinterface ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBoth Ġthese Ġinterfaces Ġcannot Ġbe Ġset Ġand Ġ[ On Popup Text Update ] Ġhas Ġpriority Ġover Ġ[ On Popup View Update ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠOn Popup Text Update ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġinterface ĠOn Popup View Update { ĊĠĠĠĠĠĠĠ Ġfun ĠonUpdate ( position : ĠInt , Ġpopup TextView : ĠTextView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġsimpler Ġcallback Ġto Ġjust Ġprovide Ġthe Ġ[ CharSequence ] Ġto Ġbe Ġset Ġto Ġthe Ġ[ popup TextView ] Ġbased Ġon Ġthe Ġposition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTo Ġperform Ġvisual Ġchanges Ġon Ġthe Ġ[ TextView ] Ġcheck Ġthe Ġ[ On Popup View Update ] Ġinterface ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBoth Ġthese Ġinterfaces Ġcannot Ġbe Ġset Ġand Ġ[ On Popup Text Update ] Ġhas Ġpriority Ġover Ġ[ On Popup View Update ] ĊĊĠĠĠĠ Ġ* Ġ@ see ĠOn Popup View Update ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġinterface ĠOn Popup Text Update { ĊĠĠĠĠĠĠĠ Ġfun ĠonChange ( position : ĠInt ) Ġ: ĠCharSequence ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġinterface Ġto Ġlisten Ġto Ġdifferent Ġstates Ġof Ġthe Ġhandle Ġin Ġthe Ġfast sc roller , Ġall Ġthe Ġmethods Ġin Ġthis Ġare Ġonly Ġcalled Ġif Ġ[ is Fast Scroll Enabled ] Ġis Ġtrue ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ* Ġ@ see Ġis Fast Scroll Enabled ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġinterface ĠHandle State Listener { ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġhandle Ġis Ġpressed Ġand Ġeng aged Ġfor Ġfast scroll Ġbehavior ĊĠĠĠĠĠĠĠĠ Ġ**/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Eng aged (){} ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġhandle Ġis Ġdrag ged Ġto Ġperform Ġthe Ġfast Ġscroll Ġoperation . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġoffset ĠThe Ġoffset Ġto Ġwhich Ġthe Ġhandle Ġis Ġcurrently Ġsc roller Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpost ion ĠThe Ġcomputed Ġposition Ġwhich Ġis Ġsent Ġto Ġthe Ġ[ On Popup View Update ] Ġor Ġthe Ġ[ On Popup Text Update ] Ġcallbacks ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see ĠOn Popup View Update ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see ĠOn Popup Text Update ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Drag ged ( offset : ĠFloat , Ġpost ion : ĠInt ){} ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġhandled Ġis Ġreleased , Ġthis Ġmarks Ġthe Ġend Ġof Ġthe Ġfast Ġscroll Ġoperation . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Released (){} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġlog ( message Ġ: ĠString Ġ= Ġ"" Ġ){ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġmessage ) ĊĠĠĠ Ġ} Ċ }