/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠD ere k ĠE ll is . ĠSubject Ġto Ġthe ĠMIT Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġca . ll am ab age l . transp o . search . data Ċ Ċ import Ġca . ll am ab age l . transp o . R Ċ import Ġca . ll am ab age l . transp o . data . Cor outines Dispatcher Provider Ċ import Ġca . ll am ab age l . transp o . data . db . Transit Database Ċ import Ġca . ll am ab age l . transp o . di . Geo coding Wrapper Ċ import Ġca . ll am ab age l . transp o . di . StringUtils Ċ import Ġca . ll am ab age l . transp o . search . data . O tt awa Bound aries . MAX _ LAT Ċ import Ġca . ll am ab age l . transp o . search . data . O tt awa Bound aries . MAX _ L NG Ċ import Ġca . ll am ab age l . transp o . search . data . O tt awa Bound aries . MIN _ LAT Ċ import Ġca . ll am ab age l . transp o . search . data . O tt awa Bound aries . MIN _ L NG Ċ import Ġca . ll am ab age l . transp o . search . ui . view holders . Place Result Ċ import Ġca . ll am ab age l . transp o . search . ui . view holders . Recent Result Ċ import Ġca . ll am ab age l . transp o . search . ui . view holders . Route Result Ċ import Ġca . ll am ab age l . transp o . search . ui . view holders . Stop Result Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Flow Preview Ċ import Ġkotlinx . coroutines . channels . Con fl ated Broadcast Channel Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ private Ġconst Ġval ĠSEARCH _ RESULT _ LIMIT Ġ= Ġ 5 L Ċ private Ġconst Ġval ĠSEARCH _ RESULT _ FILTER ED _ LIMIT Ġ= Ġ 2 0 L Ċ Ċ @ Singleton Ċ @ Flow Preview Ċ @ Experimental Cor outines Api Ċ class ĠSearch Repository Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġdatabase : ĠTrans it Database , ĊĠĠĠ Ġprivate Ġval Ġstrings : ĠStringUtils , ĊĠĠĠ Ġprivate Ġval Ġdispatcher : ĠCor outines Dispatcher Provider , ĊĠĠĠ Ġprivate Ġval Ġgeo coder : ĠGeo coding Wrapper Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġroute Channel Ġ= ĠCon fl ated Broadcast Channel < List < Route Result >>() ĊĠĠĠ Ġval Ġroute Flow Ġget () Ġ= Ġroute Channel . as Flow () ĊĊĠĠĠ Ġprivate Ġval Ġstop Channel Ġ= ĠCon fl ated Broadcast Channel < List < Stop Result >>() ĊĠĠĠ Ġval Ġstop Flow Ġget () Ġ= Ġstop Channel . as Flow () ĊĊĠĠĠ Ġprivate Ġval Ġplace Channel Ġ= ĠCon fl ated Broadcast Channel < List < Place Result >>() ĊĠĠĠ Ġval Ġplace Flow Ġget () Ġ= Ġplace Channel . as Flow () ĊĊĠĠĠ Ġprivate Ġval Ġrecent Channel Ġ= ĠCon fl ated Broadcast Channel < List < Recent Result >>() ĊĠĠĠ Ġval Ġrecent Flow Ġget () Ġ= Ġrecent Channel . as Flow () ĊĊĠĠĠ Ġsuspend Ġfun Ġget SearchResults ( query : ĠString , Ġfilters : ĠSearch Filter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter State Ġ= Ġif Ġ( filters . all Off ) Ġfilters . copy ( stops Ġ= Ġtrue , Ġroutes Ġ= Ġtrue , Ġplaces Ġ= Ġtrue ) Ġelse Ġfilters ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Limit Ġ= Ġif Ġ( filters . all Off ) ĠSEARCH _ RESULT _ LIMIT Ġelse ĠSEARCH _ RESULT _ FILTER ED _ LIMIT ĊĠĠĠĠĠĠĠ Ġval Ġex clusion List Ġ= Ġget Recent ( query , Ġfilter State , Ġresult Limit ) ĊĊĠĠĠĠĠĠĠ Ġget Routes ( query . take If Ġ{ Ġfilter State . routes Ġ}. or Empty (), Ġex clusion List , Ġresult Limit ) ĊĠĠĠĠĠĠĠ Ġget Stops ( query . take If Ġ{ Ġfilter State . stops Ġ}. or Empty (), Ġex clusion List , Ġresult Limit ) ĊĠĠĠĠĠĠĠ Ġget Places ( query . take If Ġ{ Ġfilter State . places Ġ}. or Empty (), Ġex clusion List , Ġresult Limit . toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Recent ( query : ĠString , Ġfilters : ĠSearch Filter , Ġresult Limit : ĠLong ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrecent List Ġ= Ġif Ġ( query . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . recent Search Queries . get Most Recent ( filters . get Off Filters List (), ĠSEARCH _ RESULT _ FILTER ED _ LIMIT ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . recent Search Queries . search Recent Stops ( filters . get Off Filters List (), Ġquery , Ġresult Limit ) ĊĠĠĠĠĠĠĠ Ġ}. execute As List () ĊĊĠĠĠĠĠĠĠ Ġrecent List . map Ġ{ Ġrecent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecent Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . bold ( recent . primary _ text , Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . bold ( recent . secondary _ text , Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecent . number . take If Ġ{ Ġit Ġ!= Ġnull Ġ} ?. let Ġ{ Ġstrings . bold ( it , Ġquery ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecent . code . take If Ġ{ Ġit Ġ!= Ġnull Ġ} ?. let Ġ{ Ġstrings . bold ( it , Ġquery ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecent . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecent . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let ( recent Channel :: offer ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrecent List . map Ġ{ Ġit . id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Stops ( query : ĠString , Ġrecent : ĠList < String >, Ġresult Limit : ĠLong ) Ġ= Ġwith Context ( dispatcher . io ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery . take If Ġ{ Ġit . isNotEmpty () Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . stop Queries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Stops ByName ( recent , Ġ"$ query *", Ġresult Limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute As List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStop Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . bold ( it . name , Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . bold (" âĢ¢ Ġ${ it . code }", Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . get ( R . string . search _ stop _ no _ tri ps ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. or Empty (). let ( stop Channel :: offer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Routes ( query : ĠString , Ġrecent : ĠList < String >, Ġresult Limit : ĠLong ) Ġ= Ġwith Context ( dispatcher . io ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery . take If Ġ{ Ġit . isNotEmpty () Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . route Queries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Routes ( recent , Ġ"$ query *", Ġresult Limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute As List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoute Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Name ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . bold ( it . short _ name , Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. or Empty (). let ( route Channel :: offer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Places ( query : ĠString , Ġrecent : ĠList < String >, Ġresult Limit : ĠInt ) Ġ= Ġwith Context ( dispatcher . io ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery . take If Ġ{ Ġit . isNotEmpty () Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeo coder . get Autocomplete Results ( query , ĠMIN _ L NG , ĠMIN _ LAT , ĠMAX _ L NG , ĠMAX _ LAT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġrecent . contains ( it . id ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . bold ( it . text (). or Empty (), Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . bold ( it . place Name (). or Empty (), Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id (). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( result Limit ) ĊĠĠĠĠĠĠĠ Ġ}. or Empty (). let ( place Channel :: offer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġpush Recent ( ĊĠĠĠĠĠĠĠ Ġprimary : ĠString , ĊĠĠĠĠĠĠĠ Ġsecondary : ĠString , ĊĠĠĠĠĠĠĠ Ġnumber : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcode : ĠString ?, ĊĠĠĠĠĠĠĠ Ġid : ĠString , ĊĠĠĠĠĠĠĠ Ġtype : ĠSearch Filters ĊĠĠĠ Ġ) Ġ= Ġwith Context ( dispatcher . io ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠCalendar . getInstance (). time In Millis Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġdatabase . recent Search Queries . insert ( id , Ġtype , Ġdate , Ġprimary , Ġsecondary , Ġnumber , Ġcode ) ĊĠĠĠ Ġ} Ċ }