package Ġid . ap w devs . app . movies how . ui . main Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . commit Ċ import Ġandroidx . fragment . app . commit Now Ċ import Ġcom . google . android . material . shape . Corner Family Ċ import Ġcom . google . android . material . shape . Material Shape Drawable Ċ import Ġid . ap w devs . app . movies how . R Ċ import Ġid . ap w devs . app . movies how . databinding . Fragment Main Binding Ċ import Ġid . ap w devs . app . movies how . util . instantiate Feature Fragment Ċ Ċ class ĠMain Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġfragment Main Binding : ĠFragment Main Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfragments : ĠHashMap < Int , ĠFragment > ĊĠĠĠ Ġprivate Ġvar Ġcurrent Fragment Key : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġfragment Main Binding Ġ= ĠFragment Main Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfragment Main Binding ?. root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġfragments Ġ= ĠsavedInstanceState ?. let Ġ{ Ġload Fragment State ( it ) Ġ} Ġ?: Ġinstantiate Fragments () ĊĊĠĠĠĠĠĠĠ Ġattach Fragments To FragmentManager () ĊĊĠĠĠĠĠĠĠ Ġfragment Main Binding ?. bottom Nav ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Nav Bg Ġ= Ġit . background Ġas ĠMaterial Shape Drawable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Nav Bg . shape Appearance Model Ġ= Ġbottom Nav Bg . shape Appearance Model . to Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset All C orners ( Corner Family . RO UN DED , Ġ 4 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOn Navigation ItemSelected Listener ( this :: bottom Nav Impl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . selected ItemId Ġ= Ġif Ġ( current Fragment Key Ġ== Ġ 0 ) ĠR . id . search _ tab Ġelse Ġcurrent Fragment Key ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Fragment State ( savedInstanceState : ĠBundle ): ĠHashMap < Int , ĠFragment > Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Fragment Key Ġ= ĠsavedInstanceState . getInt ( SA VED _ FRAGMENT _ KEY ) ĊĊĠĠĠĠĠĠĠ Ġval Ġget Fg : Ġ( Int ) Ġ-> ĠFragment Ġ= Ġ{ Ġkey Int Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild FragmentManager . get Fragment ( savedInstanceState , Ġkey Int . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegal AccessException (" Fragment Ġkey : Ġ$ key Int Ġcannot Ġbe Ġrestored !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . search _ tab Ġto Ġget Fg ( R . id . search _ tab ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . discover _ tab Ġto Ġget Fg ( R . id . discover _ tab ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . favorite _ tab Ġto Ġget Fg ( R . id . favorite _ tab ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġfragments . entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild FragmentManager . put Fragment ( out State , Ġit . key . toString (), Ġit . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġout State . put Int ( SA VED _ FRAGMENT _ KEY , Ġcurrent Fragment Key ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinstantiate Fragments (): ĠHashMap < Int , ĠFragment > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġqualifier Ġ= Ġ" id . ap w devs . app " ĊĠĠĠĠĠĠĠ Ġreturn Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . search _ tab Ġto Ġinstantiate Feature Fragment ("$ qual ifier . search . ui . Search Fragment "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . discover _ tab Ġto Ġinstantiate Feature Fragment ("$ qual ifier . discover . ui . Discover Fragment "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . favorite _ tab Ġto Ġinstantiate Feature Fragment ("$ qual ifier . favorite . ui . Favorite Fragment ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġattach Fragments To FragmentManager () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( child FragmentManager . fragments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild FragmentManager . commit Now Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġchild FragmentManager . fragments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġchild FragmentManager . commit Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( R . id . frame _ container , Ġentry . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ( entry . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbottom Nav Impl ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġdisplay Fragment ( item . itemId ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Fragment ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchild FragmentManager . beginTransaction (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Fragment Key Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragments [ current Fragment Key ]?. let Ġ{ Ġhide ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fragment Key Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments [ current Fragment Key ]?. let Ġ{ Ġshow ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}. commit () ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġfragment Main Binding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS AV ED _ FRAGMENT _ KEY Ġ= Ġ" saved _ fragment _ key " ĊĠĠĠ Ġ} Ċ Ċ }