/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠYo unes ĠMe ga ache Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . mega ache . site autocomplete ĊĊ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation Utils . load Animation Ċ import Ġandroid . widget . Array Adapter Ċ import Ġandroid . widget . TextView Ċ import Ġcom . hu awei . h ms . site . api . SearchResult Listener Ċ import Ġcom . hu awei . h ms . site . api . Search Service Ċ import Ġcom . hu awei . h ms . site . api . model . Query Suggestion Request Ċ import Ġcom . hu awei . h ms . site . api . model . Query Suggestion Response Ċ import Ġcom . hu awei . h ms . site . api . model . Search Status Ċ import Ġcom . hu awei . h ms . site . api . model . Site Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠAn Ġautocomplete Adapter Ġfor Ġthe Ġautocomplete TextView Ġshowing Ġthe Ġresult Ġfo Ġthe ĠSite Ġkit Ġquery Autocomplete Ċ Ġ*/ Ċ internal Ġclass ĠSite Autocomplete Adapter ( ĊĠĠĠ Ġcx : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġsearch Service : ĠSearch Service , ĊĠĠĠ Ġprivate Ġval Ġresource Id : ĠInt , ĊĠĠĠ Ġitems : ĠArrayList < Site > Ċ ) Ġ: ĠArray Adapter < Site >( cx , Ġresource Id , Ġitems ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠTAG Ġ= ĠSite Autocomplete Fragment . TAG ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNO _ ERROR Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠITEM _ ANIM ATION _ DELAY Ġ= Ġ 5 0 Ġ// in Ġmilliseconds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// callback Ġto Ġupdate Ġthe Ġactivity Ġwith Ġthe Ġloading Ġstate ĊĠĠĠ Ġvar Ġon Loading StateChanged : Ġ(( isLoading : ĠBoolean ) Ġ-> Ġ( Unit )) ? Ġ= Ġnull ĊĊĠĠĠ Ġ// callback Ġto Ġupdate Ġthe Ġactivity Ġwhen Ġan Ġerror Ġoccur ĊĠĠĠ Ġvar ĠonError : Ġ(( error : ĠInt ) Ġ-> Ġ( Unit )) ? Ġ= Ġnull ĊĊĠĠĠ Ġ// live Data Ġcontaining Ġthe Ġsearch Ġresult Ġ( suggestions ) ĊĠĠĠ Ġprivate Ġval Ġitems : ĠMutable List < Site > ĊĊĠĠĠ Ġ// holds Ġthe Ġvalue Ġof Ġthe Ġlast Ġquery , Ġto Ġensure Ġwe Ġalways Ġshow Ġthe Ġcorrect Ġresult ĊĠĠĠ Ġprivate Ġvar Ġquery : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġset Ġthe Ġdata Ġreturn Ġfrom ĠH MS Ġsite Ġservice ĊĠĠĠĠ Ġ* Ġ@ param Ġnew Items ĠList < Site >? Ġlist Ġof Ġsuggestion Ġto Ġshow ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetData ( new Items : ĠList < Site > ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . items . clear () ĊĠĠĠĠĠĠĠ Ġif Ġ( new Items Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . items . addAll ( new Items ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" setData : Ġ" Ġ+ Ġnew Items . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġplaces Ġusing Ġthe ĠH MS Ġsite Ġkit , ĊĠĠĠĠ Ġ* Ġcalled Ġevery Ġtime Ġthe Ġuser Ġmod ifies Ġthe Ġtext Ġinside Ġthe ĠtextView ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġto Ġpass Ġto ĠSite Ġkit , Ġgot Ġfrom ĠSite Autocomplete Fragment . auto Complete TextView ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch Sites ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetData ( null ) ĊĠĠĠĠĠĠĠ Ġthis . query Ġ= Ġquery ĊĠĠĠĠĠĠĠ Ġif Ġ( query . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDeclare Ġang Ġinstantiate ĠSearch Service Ġobject . ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġrequest Ġbody . ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠQuery Suggestion Request () ĊĠĠĠĠĠĠĠ Ġrequest . query Ġ= Ġquery ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġsearch Sites Ġresult Ġlistener . ĊĠĠĠĠĠĠĠ Ġval Ġresult Listener Ġ= Ġobject Ġ: ĠSearch Result Listener < Query Suggestion Response > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġsearch Sites Ġresults Ġupon Ġa Ġsuccessful Ġsearch Sites . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon SearchResult ( res : ĠQuery Suggestion Response ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Loading StateChanged ?. invoke ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . query Ġ!= Ġthis @ Site Autocomplete Adapter . query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// the Ġquery Ġhas Ġchanged Ġby Ġthe Ġtime Ġwe Ġgot Ġthis Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġmust Ġignore Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġshould Ġclear Ġthe Ġexisting Ġresult Ġif Ġthe Ġnew Ġquery Ġis Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetData ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsites Ġ= Ġres . sites ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sites Ġ== Ġnull Ġ|| Ġsites . size Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" search Sites Ġresult ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( site Ġin Ġsites ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġsite . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetData ( sites ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġresult Ġcode Ġand Ġdescription Ġupon Ġa Ġsearch Sites Ġexception . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Search Error ( status : ĠSearch Status ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Loading StateChanged ?. invoke ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( status . errorCode . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Error Ġ: Ġ" Ġ+ Ġstatus . errorCode Ġ+ Ġ" Ġ" Ġ+ Ġstatus . errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon Loading StateChanged ?. invoke ( true ) ĊĠĠĠĠĠĠĠ ĠonError ?. invoke ( NO _ ERROR ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCall Ġthe Ġsearch Sites Ġsuggestion ĠAPI . ĊĠĠĠĠĠĠĠ Ġsearch Service . query Suggestion ( request , Ġresult Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . items Ġ= Ġitems ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget View ( position : ĠInt , ĠconvertView : ĠView ?, Ġparent : ĠViewGroup ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġview Ġ= ĠconvertView ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( convert View Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġ( context Ġas ĠActivity ). layout Inflater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġinflater . inflate ( resourceId , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsite Ġ= ĠgetItem ( position ) Ġ?: ĠSite () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġview !!. findViewById < TextView >( R . id . text 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġview . findViewById < TextView >( R . id . text 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Ġthe Ġsite Ġfields Ġto Ġbe Ġshown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . text Ġ= Ġsite . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress . text Ġ= Ġsite . format Address Ġ?: Ġsite . name ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// animate Ġthe Ġview Ġwith Ġa Ġdelay Ġdepending Ġon Ġits Ġposition Ġin Ġthe Ġlist , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// to Ġget Ġa Ġst agger ed Ġeffect ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation : ĠAnimation ? Ġ= Ġload Animation ( context , ĠR . anim . fade _ in _ up ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation !!. duration Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation . start Offset Ġ= Ġposition Ġ* ĠITEM _ ANIM ATION _ DELAY . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . start Animation ( animation ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġview !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ( position : ĠInt ): ĠSite ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġitems [ position ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġitems . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Id ( position : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġposition . to Long () ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ