/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠI ce Rock ĠMAG ĠInc . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġdev . icer ock . mo ko . widgets . screen . navigation Ċ Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . graphics . drawable . State List Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . activity . On Back Pressed Callback Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġcom . google . android . material . bottomnavigation . Label Visibility Mode Ċ import Ġdev . icer ock . mo ko . graphics . Color Ċ import Ġdev . icer ock . mo ko . graphics . color Int Ċ import Ġdev . icer ock . mo ko . widgets . screen . Args Ċ import Ġdev . icer ock . mo ko . widgets . screen . Fragment Navigation Ċ import Ġdev . icer ock . mo ko . widgets . screen . Screen Ċ import Ġdev . icer ock . mo ko . widgets . utils . Theme Attrs Ċ import Ġdev . icer ock . mo ko . widgets . utils . dp Ċ import Ġdev . icer ock . mo ko . widgets . utils . getInt Nullable Ċ Ċ actual Ġabstract Ġclass ĠBottom Navigation Screen Ġactual Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġrouter : ĠRouter , ĊĠĠĠ Ġbuilder : ĠBottom Navigation Item . Builder . () Ġ-> ĠUnit Ċ ) Ġ: ĠScreen < Args . Empty >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfragment Navigation Ġ= ĠFragment Navigation ( this ) ĊĠĠĠ Ġactual Ġval Ġitems : ĠList < Bottom Navigation Item > Ġ= ĊĠĠĠĠĠĠĠ ĠBottom Navigation Item . Builder (). apply ( builder ). build () ĊĊĠĠĠ Ġprivate Ġvar Ġbottom Navigation View : ĠBottom Navigation View ? Ġ= Ġnull ĊĊĠĠĠ Ġactual Ġvar Ġitem State Colors : ĠSelect States < Color >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Item Colors () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġvar Ġselected ItemId : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbottom Navigation View ?. selected ItemId Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Navigation View ?. selected ItemId Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġvar Ġbottom Navigation Color : ĠColor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Navigation View ?. also Ġ{ Ġnav View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav View . setBackground Resource ( android . R . color . white ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav View . set BackgroundColor ( value . arg b . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġvar Ġis Title Visible : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Title Mode () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġback Pressed Callback Ġ= Ġobject Ġ: ĠOn Back Pressed Callback ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle On Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild FragmentManager . pop Back Stack () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġrouter . bottom Navigation Screen Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġchild FragmentManager . add On Back Stack Changed Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Pressed Callback . isEnabled Ġ= Ġchild FragmentManager . back Stack Entry Count Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchild FragmentManager . register Fragment Lifecycle Callbacks ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠFragment Manager . Fragment Lifecycle Callbacks () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fragment Started ( fm : ĠFragment Manager , Ġf : ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Fragment Started ( fm , Ġf ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġf . arguments ?. getInt Nullable ( ARG _ ITEM _ ID _ KEY ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bottom Navigation View ?. selected ItemId Ġ!= Ġid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Navigation View ?. selected ItemId Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrequire Activity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Back Pressed Dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Callback ( this , Ġback Pressed Callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): Ġandroid . view . View ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġrequire Context () ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠFrame Layout ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġandroid . R . id . content ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbottom Navigation Ġ= ĠBottom Navigation View ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġandroid . R . id . tabs ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Compat . set Elevation ( this , Ġ 8 . dp ( context ). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġbottom Navigation Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( color Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( color . arg b . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Background Resource ( android . R . color . white ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmenu Item Action Ġ= Ġmutable Map Of < MenuItem , Ġ() Ġ-> ĠUnit >() ĊĊĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu Item Ġ= Ġbottom Navigation . menu . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMenu . NONE , Ġitem . id , ĠMenu . NONE , Ġitem . title . toString ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . state Icons Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate List Drawable Ġ= ĠState List Drawable () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( context , Ġitem . state Icons . selected . drawable Res Id ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate List Drawable . add State ( int ArrayOf ( android . R . attr . state _ selected ), Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( context , Ġitem . state Icons . un selected . drawable Res Id ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate List Drawable . add State ( int ArrayOf (- android . R . attr . state _ selected ), Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . icon Ġ= Ġstate List Drawable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Action [ menuItem ] Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġitem . screen Desc . instantiate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . arguments Ġ= ĠBundle (). apply Ġ{ Ġput Int ( ARG _ ITEM _ ID _ KEY , Ġitem . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Navigation . route To Screen ( instance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbottom Navigation . setOn Navigation ItemSelected Listener Ġ{ Ġmenu Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġchild FragmentManager . find Fragment ById ( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent ItemId Ġ= Ġcurrent ?. arguments ?. getInt Nullable ( ARG _ ITEM _ ID _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current ItemId Ġ!= Ġmenu Item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Action [ menuItem ]?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbottom Navigation View Ġ= Ġbottom Navigation ĊĠĠĠĠĠĠĠ Ġupdate Item Colors () ĊĠĠĠĠĠĠĠ Ġupdate Title Mode () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠLinearLayout ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= ĠViewGroup . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclip Children Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠLinearLayout . VERTICAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( Theme Attrs . getContent BackgroundColor ( context )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Navigation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : Ġandroid . view . View , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . first OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġit . screen Desc . instantiate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . arguments Ġ= ĠBundle (). apply Ġ{ Ġput Int ( ARG _ ITEM _ ID _ KEY , Ġit . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Navigation . set Screen ( instance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĊĠĠĠĠĠĠĠ Ġbottom Navigation View Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĊĠĠĠĠĠĠĠ Ġrouter . bottom Navigation Screen Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Item Colors () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav View Ġ= Ġbottom Navigation View Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġstate Colors Ġ= Ġitem State Colors Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġstates Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( android . R . attr . state _ selected ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf (- android . R . attr . state _ selected ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcolors Ġ= Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Colors . selected . color Int (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Colors . un selected . color Int () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġnav View . item Icon Tint List Ġ= ĠColor State List ( states , Ġcolors ) ĊĠĠĠĠĠĠĠ Ġnav View . item TextColor Ġ= ĠColor State List ( states , Ġcolors ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Title Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġbottom Navigation View ?. also Ġ{ Ġnav View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Title Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav View . label Visibility Mode Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Visibility Mode . LABEL _ VIS IBILITY _ LAB E LED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav View . label Visibility Mode Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Visibility Mode . LABEL _ VIS IBILITY _ UN LAB E LED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġclass ĠRouter Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbottom Navigation Screen : ĠBottom Navigation Screen ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġactual Ġfun Ġcreate Change Tab Route ( itemId : ĠInt ): ĠRoute < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠRoute < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġroute ( arg : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Navigation Screen !!. selected ItemId Ġ= ĠitemId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ ITEM _ ID _ KEY Ġ= Ġ" itemId " ĊĠĠĠ Ġ} Ċ } Ċ