package Ġcom . popular movies . vp aliy . popular movies app . ui . view Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . support . constraint . Constraint Layout Ċ import Ġandroid . support . v 4 . app . FragmentManager Ċ import Ġandroid . support . v 4 . app . Fragment Pager Adapter Ċ import Ġandroid . support . v 4 . view . Pager Adapter Ċ import Ġandroid . support . v 4 . view . ViewPager Ċ import Ġandroid . support . v 4 . widget . TextView Compat Ċ import Ġandroid . support . v 7 . widget . AppCompat TextView Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup . LayoutParams .* Ċ import Ġandroid . widget . Horizontal ScrollView Ċ import Ġcom . popular movies . vp aliy . popular movies app . R Ċ import Ġcom . popular movies . vp aliy . popular movies app . ui . utils . set Drawable Color Ċ import Ġcom . vp aliy . kotlin _ extensions . get Dimension Pixel Offset Ċ import Ġcom . vp aliy . kotlin _ extensions . get Drawable Ċ import Ġcom . vp aliy . kotlin _ extensions . scale Ċ import Ġcom . vp aliy . kotlin _ extensions . then Ċ Ċ class ĠCh ip Tab Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠHorizontal ScrollView ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĊĠ Ġprivate Ġvar Ġselected Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġhorizontal Spacing Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġvertical Spacing Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġscale Factor Ġ= Ġ 1 . 1 f ĊĠ Ġprivate Ġvar Ġscale Duration Ġ= Ġ 2 0 0 L ĊĠ Ġprivate Ġvar Ġscale Delay Ġ= Ġ 0 L ĊĊĠ Ġprivate Ġval Ġlayout Ġ= ĠConstraint Layout ( context , Ġattrs ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġis Fill Viewport Ġ= Ġtrue ĊĠĠĠ Ġlayout . layout Params Ġ= ĠLayout Params ( MATCH _ PARENT , ĠMATCH _ PARENT ) ĊĠĠĠ Ġadd View ( layout , Ġlayout . layout Params ) ĊĠĠĠ Ġattrs ?. let Ġ{ ĊĠĠĠĠĠ Ġval Ġarray Ġ= Ġcontext . obtain Styled Attributes ( it , ĠR . style able . Chip Tab Layout ) ĊĠĠĠĠĠ Ġhorizontal Spacing Ġ= Ġarray . get Dimension Pixel Offset ( R . style able . Chip Tab Layout _ horizontal _ space , Ġhorizontal Spacing ) ĊĠĠĠĠĠ Ġvertical Spacing Ġ= Ġarray . get Dimension Pixel Offset ( R . style able . Chip Tab Layout _ vertical _ space , Ġvertical Spacing ) ĊĠĠĠĠĠ Ġscale Factor Ġ= Ġarray . get Float ( R . style able . Chip Tab Layout _ scale , Ġscale Factor ) ĊĠĠĠĠĠ Ġscale Duration Ġ= Ġarray . getInteger ( R . style able . Chip Tab Layout _ anim _ duration , Ġ 2 0 0 ). to Long () ĊĠĠĠĠĠ Ġarray . recycle () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġtabs Ġ= Ġmutable ListOf < Chip Tab >() ĊĊĠ Ġprivate Ġvar Ġpager : ĠView Pager ? Ġ= Ġnull ĊĊĠ Ġfun Ġsetup ( pager : ĠView Pager , Ġadapter : ĠCh ip Pager Adapter ) Ġ{ ĊĠĠĠ Ġthis . pager Ġ= Ġpager ĊĠĠĠ Ġset Tabs ( adapter . build ()) ĊĠĠĠ Ġval Ġcallback Ġ= ĠP ager Callback ( this ) ĊĠĠĠ Ġpager . add On Page ChangeListener ( callback ) ĊĠĠĠ Ġpager . add On Adapter ChangeListener ( callback ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġselect ( position : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( tabs . size Ġ> Ġposition Ġ&& Ġ( position Ġ>= Ġ 0 )) Ġ{ ĊĠĠĠĠĠ Ġtabs [ selected ]. isSelected Ġ= Ġfalse ĊĠĠĠĠĠ Ġtabs [ position ]. isSelected Ġ= Ġtrue ĊĠĠĠĠĠ Ġtabs [ selected ]. animate () ĊĠĠĠĠĠĠĠĠĠ Ġ. scale ( 1 f ) ĊĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġscale Duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Delay Ġ= Ġscale Delay ĊĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠ Ġtabs [ position ]. animate () ĊĠĠĠĠĠĠĠĠĠ Ġ. scale ( scale Factor ) ĊĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġscale Duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Delay Ġ= Ġscale Delay ĊĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠ Ġselected Ġ= Ġposition ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġset Tabs ( builders : ĠList < Chip Tab . Builder > ?) Ġ{ ĊĠĠĠ Ġlayout . removeAll Views () ĊĠĠĠ Ġtabs . clear () ĊĠĠĠ Ġselected Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġprev : ĠPair < View , ĠConstraint Layout . LayoutParams >? Ġ= Ġnull ĊĠĠĠ Ġbuild ers ?. forEach Indexed Ġ{ Ġindex , Ġbuilder Ġ-> ĊĠĠĠĠĠ Ġval Ġtab Ġ= Ġbuilder . build ( context ) ĊĠĠĠĠĠ Ġtab . id Ġ= Ġindex Ġ+ Ġ 1 ĊĠĠĠĠĠ Ġval Ġparams Ġ= ĠConstraint Layout . LayoutParams ( WRAP _ CONTENT , ĠWR AP _ CONTENT ) ĊĠĠĠĠĠ Ġif Ġ( prev Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprev ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . second . end To Start Ġ= Ġtab . id ĊĠĠĠĠĠĠĠĠĠ Ġparams . top To Top Ġ= Ġit . first . id ĊĠĠĠĠĠĠĠĠĠ Ġparams . bottom To Bottom Ġ= Ġit . first . id ĊĠĠĠĠĠĠĠĠĠ Ġparams . start ToEnd Ġ= Ġit . first . id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġbuild ers . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġparams . end ToEnd Ġ= ĠConstraint Layout . LayoutParams . PARENT _ ID ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġparams . start To Start Ġ= ĠConstraint Layout . LayoutParams . PARENT _ ID ĊĠĠĠĠĠĠĠ Ġparams . bottom To Bottom Ġ= ĠConstraint Layout . LayoutParams . PARENT _ ID ĊĠĠĠĠĠĠĠ Ġparams . top To Top Ġ= ĠConstraint Layout . LayoutParams . PARENT _ ID ĊĠĠĠĠĠĠĠ Ġparams . horizontal Chain Style Ġ= ĠConstraint Layout . LayoutParams . CHAIN _ SP READ ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġtab . click Listener Ġ= Ġ{ Ġpager ?. setCurrent Item ( tabs . indexOf ( tab ), Ġtrue ) Ġ} ĊĠĠĠĠĠ Ġtab . layout Params Ġ= Ġparams ĊĠĠĠĠĠ Ġtabs . add ( tab ) ĊĠĠĠĠĠ Ġlayout . addView ( tab , Ġparams ) ĊĠĠĠĠĠ Ġprev Ġ= ĠPair ( tab , Ġparams ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġselect ( selected ) ĊĠ Ġ} Ċ } ĊĊ Ċ @ Suppress Lint (" View Constructor ") Ċ class ĠCh ip Tab ( context : ĠContext , Ġbuilder : ĠBuilder ) Ġ: ĠAppCompat TextView ( context ), ĠView . OnClickListener Ġ{ ĊĊĠ Ġprivate Ġvar Ġselected TextColor Ġ= Ġbuilder . style . selected TextColor ĊĠ Ġprivate Ġvar Ġselected BackgroundColor Ġ= Ġbuilder . style . selected BackgroundColor ĊĠ Ġprivate Ġvar Ġcolor Background Ġ= Ġbuilder . style . background ĊĠ Ġprivate Ġvar Ġcolor Text Ġ= Ġbuilder . style . textColor ĊĠ Ġprivate Ġvar Ġselected Elevation Ġ= Ġbuilder . style . selected Elevation ĊĊĠ Ġvar Ġclick Listener : Ġ(( Chip Tab ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġset TextColor ( color Text ) ĊĠĠĠ Ġval Ġpadding Ġ= Ġget Dimension Pixel Offset ( R . dim en . chip _ text _ margin ) ĊĠĠĠ Ġset Padding ( padding , Ġ 0 , Ġpadding , Ġ 0 ) ĊĠĠĠ Ġgravity Ġ= ĠGr avity . CENTER ĊĠĠĠ Ġset OnClickListener ( this ) ĊĠĠĠ Ġtext Ġ= Ġbuilder . text ĊĠĠĠ Ġbackground Ġ= Ġget Drawable ( R . drawable . ring ) ĊĠĠĠ Ġset Drawable Color ( background , Ġcolor Background ) ĊĠĠĠ Ġif Ġ( builder . style . text Appearance Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠ ĠTextView Compat . setText Appearance ( this , Ġbuilder . style . text Appearance ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsetSelected ( selected : ĠBoolean ) Ġ{ ĊĠĠĠ Ġsuper . setSelected ( selected ) ĊĠĠĠ Ġvar Ġcolor Ġ= Ġ( selected Ġthen Ġselected TextColor ) Ġ?: Ġcolor Text ĊĠĠĠ Ġset TextColor ( color ) ĊĠĠĠ Ġcolor Ġ= Ġ( selected Ġthen Ġselected BackgroundColor ) Ġ?: Ġcolor Background ĊĠĠĠ Ġset Drawable Color ( background , Ġcolor ) ĊĠĠĠ Ġval Ġelevation Ġ= Ġ( selected Ġthen Ġselected Elevation ) Ġ?: Ġ 0 f ĊĠĠĠ Ġset Elevation ( elevation ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠ Ġlayout Params . height Ġ= Ġget Dimension Pixel Offset ( R . dim en . chip _ height ) ĊĠĠĠ Ġlayout Params . width Ġ= ĠWR AP _ CONTENT ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset OnClickListener ( click : ĠOn ClickListener ?) Ġ{ ĊĠĠĠ Ġsuper . setOnClickListener ( this ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonClick ( view : ĠView ?) Ġ{ ĊĠĠĠ Ġclick Listener ?. invoke ( this ) ĊĠ Ġ} ĊĊĠ Ġclass ĠStyle Builder Ġ{ ĊĠĠĠ Ġvar Ġbackground Ġ= ĠColor . WHITE ĊĠĠĠ Ġvar ĠtextColor Ġ= ĠColor . BLACK ĊĠĠĠ Ġvar Ġselected BackgroundColor Ġ= ĠColor . WHITE ĊĠĠĠ Ġvar Ġselected TextColor Ġ= ĠColor . BLACK ĊĠĠĠ Ġvar Ġtext Appearance Ġ= Ġ- 1 ĊĠĠĠ Ġvar Ġselected Elevation Ġ= Ġ 0 f ĊĠ Ġ} ĊĊĠ Ġdata Ġclass ĠBuilder ( val Ġtext : ĠString , Ġval Ġstyle : ĠStyle Builder ) Ġ{ ĊĠĠĠ Ġfun Ġbuild ( context : ĠContext ) Ġ= ĠCh ip Tab ( context , Ġthis ) ĊĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠCh ip Pager Adapter ( manager : ĠFragment Manager ) Ġ: ĠFragment Pager Adapter ( manager ) Ġ{ ĊĠ Ġinternal Ġfun Ġbuild (): ĠList < Chip Tab . Builder > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Chip Tab . Builder >() ĊĠĠĠ Ġ( 0 Ġuntil Ġcount ). forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġstyle Ġ= Ġstyle For ( it ) ĊĠĠĠĠĠ Ġval Ġtext Ġ= Ġget Page Title ( it ). toString () ĊĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠCh ip Tab . Builder ( text , Ġstyle ) ĊĠĠĠĠĠ Ġresult . add ( builder ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġabstract Ġfun Ġstyle For ( position : ĠInt ): ĠCh ip Tab . Style Builder Ċ } Ċ Ċ private Ġclass ĠP ager Callback ( val Ġlayout : ĠCh ip Tab Layout ) Ġ: ĠView Pager . On Page ChangeListener , ĠView Pager . On Adapter ChangeListener Ġ{ ĊĠ Ġoverride Ġfun Ġon Page Scroll StateChanged ( state : ĠInt ) Ġ{} ĊĠ Ġoverride Ġfun Ġon Page Sc rolled ( position : ĠInt , Ġposition Offset : ĠFloat , Ġposition Offset Pixels : ĠInt ) Ġ{} ĊĠ Ġoverride Ġfun Ġon Adapter Changed ( view Pager : ĠView Pager , Ġold Adapter : ĠP ager Adapter ?, Ġnew Adapter : ĠP ager Adapter ?) Ġ{ ĊĠĠĠ Ġnew Adapter ?. let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it Ġ! is ĠCh ip Pager Adapter ) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Wrong Ġadapter ! ĠShould Ġbe ĠCh ip Pager Adapter !") ĊĠĠĠĠĠ Ġlayout . set Tabs ( it . build ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Page Selected ( position : ĠInt ) Ġ= Ġlayout . select ( position ) Ċ }