package Ġpl . d roid son roid s . toast . app . home Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . design . widget . Snackbar Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġcom . google . firebase . remote config . Firebase Remote Config Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx kotlin . plus Assign Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġpl . d roid son roid s . toast . Build Config Ċ import Ġpl . d roid son roid s . toast . R Ċ import Ġpl . d roid son roid s . toast . app . Navigator Ċ import Ġpl . d roid son roid s . toast . app . base . Base Activity Ċ import Ġpl . d roid son roid s . toast . app . utils . Snackbar Queue Ċ import Ġpl . d roid son roid s . toast . app . utils . extensions . set Navigation View Anchor Ċ import Ġpl . d roid son roid s . toast . app . utils . extensions . show Snackbar Ċ import Ġpl . d roid son roid s . toast . data . enums . Login State Ċ import Ġpl . d roid son roid s . toast . databinding . Activity Main Binding Ċ import Ġpl . d roid son roid s . toast . di . Login Callback Manager Ċ import Ġpl . d roid son roid s . toast . utils . Constants . Search MenuItem . ANIM _ DURATION _ M ILL IS Ċ import Ġpl . d roid son roid s . toast . utils . Navigation Request Ċ import Ġpl . d roid son roid s . toast . utils . base ImageUrl Ċ import Ġpl . d roid son roid s . toast . utils . baseUrl Ċ import Ġpl . d roid son roid s . toast . utils . consume Ċ import Ġpl . d roid son roid s . toast . view models . Main ViewModel Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject ĊĊ Ċ class ĠMainActivity Ġ: ĠBase Activity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCURRENT _ TITLE Ġ= Ġ" current _ title " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRE MOTE _ CONFIG _ CACHE _ TIME _ S Ġ= Ġif Ġ( Build Config . DEBUG ) ĠTimeUnit . MIN UTES . to Seconds ( 5 ) Ġelse ĠTimeUnit . DAYS . to Seconds ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Intent ( context : ĠContext ) Ġ= ĠIntent ( context , ĠMainActivity :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhome Fragment Transaction : ĠHome Fragments Transaction ĊĠĠĠ Ġprivate Ġvar Ġcomposite Disposable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġval Ġmain ViewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠViewModel Providers . of ( this , ĠviewModel Factory )[ Main ViewModel :: class . java ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġlogin Callback Manager : ĠLogin Callback Manager ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġnavigator : ĠNavigator ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġsn ackbar Queue : ĠSn ackbar Queue ĊĊĠĠĠ Ġoverride Ġfun Ġshow Snackbar ( request : ĠNavigation Request . Sn ackBar ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsn ackbar Queue . post Snackbar Request ( request ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġmain Binding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( main Binding . root ) ĊĠĠĠĠĠĠĠ Ġsetup Toolbar ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Navigation View () ĊĠĠĠĠĠĠĠ Ġinit Home Fragment Transaction ( show Events Fragment Ġ= ĠsavedInstanceState Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġsetup ViewModel ( main Binding ) ĊĠĠĠĠĠĠĠ Ġfetch Remote Config () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Remote Config () Ġ{ ĊĠĠĠĠĠĠĠ ĠFirebase Remote Config . getInstance (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch ( REMOTE _ CONFIG _ CACHE _ TIME _ S ). add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold BaseUrl Ġ= ĠbaseUrl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold ImageUrl Ġ= Ġbase ImageUrl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivate F etched () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old BaseUrl Ġ!= ĠbaseUrl Ġ|| Ġold ImageUrl Ġ!= Ġbase ImageUrl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow New Config Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow New Config Dialog () Ġ{ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setIcon ( R . drawable . ic _ settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . new _ config _ ar rived ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . restart _ app ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . ok ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent . make Restart Activity Task ( component Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Facebook Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Coordinator Layout . show Snackbar ( Navigation Request . Sn ackBar ( R . string . o ops _ no _ internet _ connection ), Ġapply Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Action ( R . string . retry ) Ġ{ Ġmain ViewModel . on Log In Click () Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menuItem About Ġ-> Ġconsume Ġ{ Ġhome Fragment Transaction . show Info Dialog () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menuItem Login Ġ-> Ġconsume Ġ{ Ġmain ViewModel . on Log In Click () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menuItem Logout Ġ-> Ġconsume Ġ{ Ġmain ViewModel . on Log Out Click () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . settings Ġ-> Ġconsume Ġ{ Ġnavigator . dispatch ( this , ĠNavigation Request . Settings ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġanimate Search Button ( offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Image Button ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. animate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. y ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( ANIM _ DURATION _ M ILL IS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Toolbar ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Show Title Enabled ( false ) ĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhome Title . text Ġ= Ġit . getString ( CURRENT _ TITLE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Navigation View () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Home Navigation Item Re selected Listener () ĊĠĠĠĠĠĠĠ Ġset Home Navigation ItemSelected Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Home Fragment Transaction ( show Events Fragment : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhome Fragment Transaction Ġ= ĠHome Fragments Transaction ( support FragmentManager ) ĊĠĠĠĠĠĠĠ Ġif Ġ( show Events Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhome Fragment Transaction . show Events Fragment () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup ViewModel ( main Binding : ĠActivity Main Binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Binding . main ViewModel Ġ= Ġmain ViewModel ĊĠĠĠĠĠĠĠ Ġcomposite Disposable Ġ+= Ġmain ViewModel . navigation Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe (:: handle Navigation Request ) ĊĠĠĠĠĠĠĠ Ġcomposite Disposable Ġ+= Ġmain ViewModel . login State Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== ĠLogin State . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Facebook Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Options Menu () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Navigation Request ( navigation Request : ĠNavigation Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( navigation Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Request . S peak ers Search Ġ-> Ġnavigator . show Search S peak ers With Re veal Animation ( this , Ġget View Center Coordinates ( search Image Button )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnavigator . dispatch ( this , Ġnavigation Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Home Navigation ItemSelected Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġhome Navigation View . setOn Navigation ItemSelected Listener Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action Events Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome Fragment Transaction . show Events Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Home Title Text ( R . string . events _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action S peak ers Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome Fragment Transaction . show S peak ers Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Home Title Text ( R . string . speak ers _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action Contact Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome Fragment Transaction . show Contact Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Home Title Text ( R . string . contact _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Home Navigation Item Re selected Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġhome Navigation View . setOn Navigation Item Re selected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : ĠScroll Ġthe Ġfragment 's Ġcontent Ġup ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Home Title Text ( title Res : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhome Title . text Ġ= ĠgetText ( title Res ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget View Center Coordinates ( view : ĠView ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcenter X Ġ= Ġ( view . x Ġ+ Ġview . width Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġcenter Y Ġ= Ġ( view . y Ġ+ Ġview . height Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġcenter X Ġto Ġcenter Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġsn ackbar Queue . attach ( main Coordinator Layout , ĠSn ackbar :: set Navigation View Anchor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġsn ackbar Queue . detach () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġout State . putString ( CURRENT _ TITLE , Ġhome Title . text . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġlogin Callback Manager . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . dispose () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ