package Ġcom . the j uki . example . activity Ċ Ċ import Ġandroid . app . Search Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġcom . google . android . material . navigation . Navigation View Ċ import Ġcom . the j uki . example . Preference Constants Ċ import Ġcom . the j uki . example . R Ċ import Ġcom . the j uki . example . api . ApiClient Ċ import Ġcom . the j uki . example . api . Auth Manager Ċ import Ġcom . the j uki . example . databinding . Activity Drawer Binding Ċ import Ġcom . the j uki . example . databinding . Nav Header Main Binding Ċ import Ġcom . the j uki . example . extension . Preference Helper Ċ import Ġcom . the j uki . example . extension . Preference Helper . set Ċ import Ġcom . the j uki . example . fragment . Queue Fragment Ċ import Ġcom . the j uki . example . fragment . list . Contact List Fragment Ċ Ċ /** Ċ Ġ* ĠDraw er ĠActivity Ċ Ġ* Ċ Ġ* ĠThe Ġ" main " Ġactivity . ĠHandles Ġthe Ġnavigation Ġdrawer Ġand Ġfragment Ġwithin Ġthe Ġitem Ġcontainer . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ** The J uki ** Ġ([ GitHub ]( https :// github . com / The J uki )) Ċ Ġ* Ġ@ version Ġ 1 . 0 Ċ Ġ*/ Ċ class ĠDraw er Activity Ġ: ĠBase Activity (), ĠNavigation View . On Navigation ItemSelected Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġis Search MenuItem Hidden Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġlast Navigation ItemId : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Drawer Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnav Header Main Binding : ĠNav Header Main Binding ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Drawer Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġbinding . root ĊĠĠĠĠĠĠĠ ĠsetContentView ( view ) ĊĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( binding . app Bar Main View . toolbar ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġbinding . drawer Layout , Ġbinding . app Bar Main View . toolbar , ĠR . string . navigation _ drawer _ open , ĠR . string . navigation _ drawer _ close ) ĊĠĠĠĠĠĠĠ Ġbinding . drawer Layout . add Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet ĠUser ĊĠĠĠĠĠĠĠ Ġnav Header Main Binding Ġ= ĠNav Header Main Binding . bind ( binding . nav View . getHeader View ( 0 )) ĊĠĠĠĠĠĠĠ Ġnav Header Main Binding . username . text Ġ= ĠApi Client . getInstance ( this ). getUsername () ĊĠĠĠĠĠĠĠ Ġnav Header Main Binding . fullName . text Ġ= ĠApi Client . getInstance ( this ). get FullName () ĊĊĠĠĠĠĠĠĠ Ġbinding . nav View . set Navigation ItemSelected Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġauth Check ( Auth Manager . getInstance ( this )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState . containsKey ( ARG _ NAV IG ATION _ ITEM _ ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Navigation ItemId Ġ= ĠsavedInstanceState . getInt ( ARG _ NAV IG ATION _ ITEM _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Item Container ( last Navigation ItemId Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . nav View . setChecked Item ( R . id . nav _ contacts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Item Container ( R . id . nav _ contacts ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauth Check ( auth Manager : ĠAuth Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġbinding . nav View . menu . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġbinding . nav View . menu . getItem ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binding . drawer Layout . is Drawer Open ( Gravity Compat . START )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . drawer Layout . close Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġval Ġsearch MenuItem Ġ= Ġmenu . find Item ( R . id . action _ search ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Search MenuItem Hidden ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch MenuItem . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssoci ate Ġsearch able Ġconfiguration Ġwith Ġthe ĠSearch View ĊĠĠĠĠĠĠĠ Ġval Ġsearch Manager Ġ= Ġget System Service ( Context . SEARCH _ SERVICE ) Ġas ĠSearch Manager ĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġsearch MenuItem . action View Ġas ĠSearch View ĊĠĠĠĠĠĠĠ Ġsearch View . set Search able Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Manager . get Search able Info ( component Name )) ĊĊĠĠĠĠĠĠĠ Ġsearch View . setOn Query Text Listener ( object Ġ: ĠSearch View . On Query Text Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( q : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( q : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Search Query Change ( q ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġsearch MenuItem . setOn Action Expand Listener ( object Ġ: ĠMenuItem . On Action Expand Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon MenuItem Action Collapse ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Search Query Change ( is Searching Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon MenuItem Action Expand ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Search Query Change ( q : ĠString ? Ġ= Ġnull , Ġis Searching : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmenu ItemId : ĠInt ? Ġ= Ġ( 0 Ġuntil Ġbinding . nav View . menu . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġbinding . nav View . menu . getItem ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . isChecked Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . itemId ĊĊĠĠĠĠĠĠĠ Ġmenu ItemId ?. let Ġ{ Ġreplace Item Container ( it , Ġq , Ġis Searching ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Navigation ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreplace Item Container ( item . itemId ) ĊĠĠĠĠĠĠĠ Ġbinding . drawer Layout . close Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Hide Search MenuItem ( is Hidden : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Search MenuItem Hidden Ġ!= Ġis Hidden ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Search MenuItem Hidden Ġ= Ġis Hidden ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Options Menu () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreplace Item Container ( itemId : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term : ĠString ? Ġ= Ġnull , Ġis Searching : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfragment : Ġandroidx . fragment . app . Fragment ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhen Ġ( itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ contacts Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . contacts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Hide Search MenuItem ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġ= ĠContact List Fragment . newInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġsearch Term , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Searching Ġ= Ġis Searching ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ queue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . queue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Hide Search MenuItem ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġ= ĠQueue Fragment . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ settings Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠSettings Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ logout Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Navigation ItemId Ġ= ĠitemId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġft Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . replace ( R . id . item _ container , Ġfragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlogout () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfirm Alert Ġ= ĠAlertDialog . Builder ( this ). create () ĊĠĠĠĠĠĠĠ Ġconfirm Alert . setTitle ( this . getString ( R . string . login _ confirm _ title )) ĊĠĠĠĠĠĠĠ Ġconfirm Alert . set Button ( AlertDialog . BUTTON _ POSITIVE , Ġthis . getString ( android . R . string . ok )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠPreference Helper . secure Prefs ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ Preference Constants . username ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ Preference Constants . fullname ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ Preference Constants . user Contact Id ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ Preference Constants . token ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ Preference Constants . logged In ] Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ Preference Constants . user Preferences Data ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ Preference Constants . roles Data ] Ġ= ĠHashSet < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠLogin Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfirm Alert . set Button ( AlertDialog . BUTTON _ NEGATIVE , Ġthis . getString ( android . R . string . cancel )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfirm Alert . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout State . put Int ( ARG _ NAV IG ATION _ ITEM _ ID , Ġlast Navigation ItemId Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ NAV IG ATION _ ITEM _ ID Ġ= Ġ" nav ItemId " ĊĠĠĠ Ġ} Ċ } Ċ