package Ġcom . tw ilio . con versations . app . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . drawer layout . widget . Drawer Layout Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior Ċ import Ġcom . tw ilio . con versations . app . R Ċ import Ġcom . tw ilio . con versations . app . common . Sheet Listener Ċ import Ġcom . tw ilio . con versations . app . common . enums . Crash In Ċ import Ġcom . tw ilio . con versations . app . common . extensions .* Ċ import Ġcom . tw ilio . con versations . app . common . injector Ċ import Ġcom . tw ilio . con versations . app . ui . fragments . Conversation Fragment Ċ import Ġkotlinx . android . synt hetic . main . activity _ con versations _ list .* Ċ import Ġkotlinx . android . synt hetic . main . view _ conversation _ add _ screen .* Ċ import Ġkotlinx . android . synt hetic . main . view _ drawer _ header . view .* Ċ import Ġkotlinx . android . synt hetic . main . view _ user _ profile _ screen .* Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠCon versation List Activity Ġ: ĠBase Activity () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġadd Conversation Sheet Ġby Ġlazy Ġ{ ĠBottom Sheet Behavior . from ( add _ conversation _ sheet ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġuser Profile Sheet Ġby Ġlazy Ġ{ ĠBottom Sheet Behavior . from ( user _ profile _ sheet ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġsheet Listener Ġby Ġlazy Ġ{ ĠSheet Listener ( sheet _ background ) Ġ{ Ġhide Keyboard () Ġ} Ġ} ĊĠĠĠ Ġprivate Ġval Ġprogress Dialog : ĠAlertDialog Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setView ( R . layout . view _ loading _ dialog ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoggle : ĠAction Bar Drawer Toggle ĊĊĠĠĠ Ġval Ġconversations List ViewModel Ġby Ġlazy ViewModel Ġ{ Ġinjector . create Conversation List ViewModel ( application ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" onCreate ") ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ con versations _ list ) ĊĊĠĠĠĠĠĠĠ Ġinit Views () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ conversation _ list , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfilter MenuItem Ġ= Ġmenu . find Item ( R . id . filter _ con versations ) ĊĠĠĠĠĠĠĠ Ġif Ġ( con versations List ViewModel . conversation Filter . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter MenuItem . expand Action View () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ( filter MenuItem . action View Ġas ĠSearch View ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Hint Ġ= ĠgetString ( R . string . conversation _ filter _ hint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( con versations List ViewModel . conversation Filter . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Query ( con versations List ViewModel . conversation Filter , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Query Text Listener ( object Ġ: ĠSearch View . On Query Text Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?) Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversations List ViewModel . conversation Filter Ġ= Ġnew Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . show _ conversation _ add Ġ-> Ġswitch Conversation Add Dialog () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( toggle . on Options ItemSelected ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Create ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Post Create ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĠĠĠĠĠĠĠ Ġtoggle . on Configuration Changed ( new Config ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhandled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . fragments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠCon versation Fragment Ġ&& Ġit . on Back Pressed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( add Conversation Sheet . is Showing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Conversation Add Sheet () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( user Profile Sheet . is Showing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Sheet . hide () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( conversation _ drawer _ layout . is Drawer Open ( Gravity Compat . START )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation _ drawer _ layout . close Draw ers () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! handled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( conversation _ toolbar ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . activity _ title _ con versations _ list ) ĊĠĠĠĠĠĠĠ Ġtoggle Ġ= ĠAction Bar Drawer Toggle ( this , Ġconversation _ drawer _ layout , Ġconversation _ toolbar , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . drawer _ open , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . drawer _ close ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtoggle . is Drawer Indicator Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĊĠĠĠĠĠĠĠ Ġconversation _ drawer _ layout . add Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠ Ġconversation _ drawer _ layout . add Drawer Listener ( object : ĠDraw er Layout . Simple Drawer Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drawer Opened ( drawer View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Drawer Opened ( drawer View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġadd Conversation Sheet . add Bottom Sheet Callback ( sheet Listener ) ĊĠĠĠĠĠĠĠ Ġuser Profile Sheet . add Bottom Sheet Callback ( sheet Listener ) ĊĠĠĠĠĠĠĠ Ġsheet _ background . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Conversation Add Sheet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Sheet . hide () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser _ profile _ update _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversations List ViewModel . set Friendly Name ( user _ profile _ friendly _ name . text . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser _ profile _ cancel _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Sheet . hide () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd _ conversation _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversation Name Ġ= Ġconversation _ name _ input . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversations List ViewModel . create Conversation ( conversation Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd _ conversation _ cancel _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Sheet . hide () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdrawer _ sign _ out _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Sign Ġout Ġclicked ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation _ drawer _ layout . close Draw ers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversations List ViewModel . sign Out () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdrawer _ java _ crash . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Sim ulated Ġcrash Ġin ĠCon versation List Activity . kt ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdrawer _ tm _ crash . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversations List ViewModel . simulate Crash ( Crash In . TM _ CLIENT _ CPP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdrawer _ chat _ crash . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversations List ViewModel . simulate Crash ( Crash In . CHAT _ CLIENT _ CPP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconversation _ drawer _ menu . getHeader View ( 0 ). drawer _ settings _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Drawer Ġsettings Ġclicked ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation _ drawer _ layout . close Draw ers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Sheet . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconversations List ViewModel . on Conversation Created . observe ( this , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Conversation Add Sheet () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġconversations List ViewModel . on Conversation Error . observe ( this , Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversations _ list _ layout . show Snackbar ( get ErrorMessage ( error )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Conversation Add Sheet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Sheet . hide () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġconversations List ViewModel . is Data Loading . observe ( this , Ġ{ Ġshow Loading Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Dialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Dialog . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġconversations List ViewModel . self User . observe ( this , Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Self Ġuser Ġreceived : Ġ${ user . friendly Name } Ġ${ user . identity }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation _ drawer _ menu . getHeader View ( 0 ). drawer _ participant _ name . text Ġ= Ġuser . friendly Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation _ drawer _ menu . getHeader View ( 0 ). drawer _ participant _ info . text Ġ= Ġuser . identity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser _ profile _ friendly _ name . setText ( user . friendly Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser _ profile _ identity . text Ġ= Ġuser . identity ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġconversations List ViewModel . on User Updated . observe ( this , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Sheet . hide () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġconversations List ViewModel . on Signed Out . observe ( this , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Activity . start ( this ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġswitch Conversation Add Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! add Conversation Sheet . is Showing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Conversation Sheet . show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Conversation Add Sheet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Conversation Add Sheet () Ġ{ ĊĠĠĠĠĠĠĠ Ġconversation _ name _ input . text ?. clear () ĊĠĠĠĠĠĠĠ Ġadd Conversation Sheet . hide () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġget Start Intent ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Start Intent ( context : ĠContext ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠCon versation List Activity :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ