package Ġpt . br un op ont e . satisf ying cal or ie tracker Ċ Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroid . widget . Search View Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġcom . squareup . okhttp . Ok HttpClient Ċ import Ġcom . squareup . okhttp . Request Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ import Ġpt . br un op ont e . satisf ying cal or ie tracker . data . Api Ċ import Ġpt . br un op ont e . satisf ying cal or ie tracker . data . Food Ċ import Ġpt . br un op ont e . satisf ying cal or ie tracker . databinding . Fragment Food s Binding Ċ import Ġjava . io . IOException Ċ import Ġjava . text . ParseException Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . random . Random Ċ Ċ class ĠFood s Fragment Ġ: ĠFragment ( R . layout . fragment _ food s ), ĠSearch View . On Query Text Listener , ĊĠĠĠ ĠAdapter View . On ItemClickListener Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Food s Fragment " ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Activity : ĠMainActivity ĊĊĠĠĠ Ġ// ĠBinding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Food s Binding ĊĊĠĠĠ Ġ// ĠData Ġvars ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfood s : ĠMutable List < Food > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter Food s : ĠFood s ListView Adapter ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance () Ġ= ĠFood s Fragment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġm Activity Ġ= Ġcontext Ġas ĠMainActivity ĊĠĠĠĠĠĠĠ Ġfood s Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġadapter Food s Ġ= ĠFood s ListView Adapter ( m Activity , Ġfood s ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĠFor Ġtesting Ġonly ĊĠĠĠĠĠĠĠ Ġfood s Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" Carbon ara ", Ġ 5 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" A mat ric iana ", Ġ 5 5 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" H oney ĠP asta ", Ġ 6 5 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 1 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 2 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 3 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 4 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 5 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 6 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 7 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 8 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 9 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 1 0 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 1 1 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 1 2 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 1 3 ", Ġ 8 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFood (" P est o 1 4 ", Ġ 8 0 0 ) ĊĠĠĠĠĠĠĠ Ġ) */ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . inflate ( in flater , ĠR . layout . fragment _ food s , Ġcontainer , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Food s . on ItemClickListener Ġ= Ġthis @ Food s Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Food s . adapter Ġ= Ġadapter Food s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Food s . setOn Query Text Listener ( this @ Food s Fragment ); ĊĠĠĠĠĠĠĠ Ġ}. root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTask Get Food s ( query , Ġ"< APP _ CODE >", Ġ"< APP _ ID > "). execute () ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( query : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Item Click ( parent : ĠAdapter View < *> ?, Ġview : ĠView ?, Ġposition : ĠInt , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Food Ġ= Ġparent . adapter . getItem ( position ) Ġas ĠFood ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . app Data . current Cal s Ġ+= Ġselected Food . cal ories ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Activity . open Dashboard Fragment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetRandom Food s (): ĠList < Food > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrandom Food s Ġ= Ġmutable ListOf < Food >() ĊĊĠĠĠĠĠĠĠ Ġfood s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Random . nextInt () Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Food s . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrandom Food s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠTask Get Food s ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġquery : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠappId : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġapp Key : ĠString ĊĠĠĠ Ġ) Ġ: ĠAsync Task < Void ?, ĠVoid ?, ĠVoid ?> () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠresultCode : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġresult Body : ĠString Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠVoid ?): ĠVoid ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠOk HttpClient () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient . set Connect Timeout ( 3 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient . set Read Timeout ( 3 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient . set Write Timeout ( 3 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Request : ĠRequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( Api . construct Url ( query , ĠappId , Ġapp Key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Content - type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠhttpClient . new Call ( getRequest ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠresultCode Ġ= Ġresponse . code () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Body Ġ= Ġresponse . body (). string () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( a Void : ĠVoid ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Post Execute ( a Void ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 0 Ġ-> Ġ{ Ġ// ĠRequest Ġsucceeded ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfood s . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠJSONObject ( result Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Hints Ġ= Ġroot . get JSONArray (" hints ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġjson Hints . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Hint Ġ= Ġjson Hints . getJSONObject ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Food Ġ= Ġjson Hint . getJSONObject (" food ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġjson Food . getString (" label ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson N ut rient s Ġ= Ġjson Food . getJSONObject (" nut rient s ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal ories Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( json N ut rient s . has (" ENER C _ K CAL ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson N ut rient s . getDouble (" ENER C _ K CAL "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd ĠTheme Ġto Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfood s . add ( Food ( name , Ġcal ories )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Food s . set Food s ( food s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFailed Ġto Ġparse Ġdata , Ġset ĠEnterprise Ġdata Ġas Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfood s . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Food s . set Food s ( food s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 1 Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 0 0 Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }