package Ġcom . example . restaurant . view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . view . is G one Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . example . restaurant . Build Config Ċ import Ġcom . example . restaurant . R Ċ import Ġcom . example . restaurant . model . MenuItem Ċ import Ġcom . example . restaurant . model . Restaurant Ċ import Ġcom . example . restaurant . model . di . Restaurant ViewModel Factory Ċ import Ġcom . example . restaurant . model . states . States API Ċ import Ġcom . example . restaurant . utils . connection Checking . Connection Checker Ċ import Ġcom . example . restaurant . viewModel . Restaurant ViewModel Ċ import Ġcom . google . android . material . tabs . Tab Layout Mediator Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconnectivity Manager : ĠConnect ivity Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠRest aurant ViewModel ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġinit VM () ĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠĠĠĠĠ Ġcall API () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit VM () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this , ĠRest aurant ViewModel Factory . newInstance ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Restaurant ViewModel :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnectivity Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getSystem Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĠĠĠĠĠĠĠ Ġstart Ob serving Success State () ĊĠĠĠĠĠĠĠ Ġstart Ob serving Error State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall API () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . has AS uccess ful Call Already Been Made ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Connection Checker . handle Internet Connection Availability ( connectivity Manager )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Restaurant ( Build Config . API _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Toast ( R . string . internet _ connection _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Ob serving Success State () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . success LiveData . observe ( this , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Success ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Ob serving Error State () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . error LiveData . observe ( this , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Success ( result : ĠRest aurant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtabs Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġitems List Ġ= Ġarray ListOf < ArrayList < MenuItem >>() ĊĠĠĠĠĠĠĠ Ġrestaurant Name . text Ġ= Ġresult . result . restaurant Name ĊĠĠĠĠĠĠĠ Ġresult . result . menus . map Ġ{ Ġmenu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Name . text Ġ= Ġmenu . menu Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu Sections . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtabs . add ( it . section Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems List . add ( it . menu Items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpager Adapter Ġ= ĠRest aurant Pager Adapter ( this , Ġitems List ) ĊĠĠĠĠĠĠĠ Ġview Pager . adapter Ġ= Ġpager Adapter ĊĊĠĠĠĠĠĠĠ ĠTab Layout Mediator ( tab Layout , Ġview Pager ) Ġ{ Ġtab , Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab . text Ġ= Ġtabs [ position ] ĊĠĠĠĠĠĠĠ Ġ}. attach () ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( error : ĠStates API ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġif Ġ( error Ġis ĠStates API . ServerError ViewState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . server _ error ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . client _ error ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠĠĠĠĠ Ġshow Error Toast ( errorMessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error Toast (@ String Res ĠerrorMessage : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , ĠgetString ( errorMessage ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġloading . is G one Ġ= Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ