package Ġcom . at c . planner . data . repository . places _ repository Ċ Ċ import Ġcom . at c . planner . R Ċ import Ġcom . at c . planner . commons . City Provider Ċ import Ġcom . at c . planner . commons . String Provider Ċ import Ġcom . at c . planner . data . model . local . Beacon Ċ import Ġcom . at c . planner . data . model . local . Place Ċ import Ġcom . at c . planner . data . remote _ service . Directions Remote Service Ċ import Ġcom . at c . planner . data . repository . places _ repository . data _ source . firebase _ database . Firebase Database DataSource Ċ import Ġcom . at c . planner . extension . as LatLng Ċ import Ġcom . at c . planner . extension . as Location Ċ import Ġcom . github . aj alt . tim ber kt . d Ċ import Ġcom . github . aj alt . tim ber kt . e Ċ import Ġcom . google . android . gms . maps . model . LatLng Ċ import Ġio . reactivex . Single Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠPl aces Repository Impl Ġ@ Inject Ġconstructor ( private Ġval Ġfirebase Database DataSource : ĠFirebase Database DataSource , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdirections Remote Service : ĠDirection s Remote Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcity Provider : ĠCity Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġstring Provider : ĠString Provider ) ĊĠĠĠ Ġ: ĠPl aces Repository Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġplaces : ĠList < Place > Ġ= ĠlistOf () ĊĊĠĠĠ Ġprivate Ġvar Ġbe ac ons Near by : ĠList < Beacon > Ġ= ĠlistOf () ĊĊĠĠĠ Ġoverride Ġfun Ġget Loc ally Saved Places Near by (): ĠList < Place > Ġ= Ġplaces ĊĊĠĠĠ Ġoverride Ġfun Ġget Places Near by ( lat Lng : ĠLat Lng , Ġfilter Details : ĠS ights Filter Details ?): ĠSingle < List < Place >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcity Ġ= Ġcity Provider . get City ( lat Lng ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( city Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Database DataSource . get Places ( city , Ġfilter Details ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaces Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . error ( NoSuch ElementException (" City Ġfor Ġthese Ġcoordinates Ġwas Ġnot Ġfound ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Place By Area Id ( area Id : ĠString ?): ĠSingle < Place > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Database DataSource . get Place By Area Id ( area Id ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Be ac ons Near by ( lat Lng : ĠLat Lng ): ĠSingle < List < Beacon >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( be ac ons Near by . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( be ac ons Near by ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcity Ġ= Ġcity Provider . get City ( lat Lng ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( city Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Database DataSource . get Be ac ons Near by ( city ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbe ac ons Near by Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError (:: e ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . error ( NoSuch ElementException (" City Ġfor Ġthese Ġcoordinates Ġwas Ġnot Ġfound ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Directions ( source : ĠLat Lng , Ġdest : ĠLat Lng ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirections Remote Service . get Directions ("${ source . latitude }, ${ source . longitude }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ dest . latitude }, ${ dest . longitude }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Provider . getString ( R . string . places _ api _ key )) ĊĊĠĠĠ Ġoverride Ġfun Ġget Route ( current Location : ĠLat Lng , Ġfilter Details : ĠS ights Filter Details ?): ĠSingle < ArrayList < Place ? >> Ġ= ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠ Ġd Ġ{ Ġ" get Route " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġplaces To Choose From Ġ= ĠArrayList ( places ) ĊĠĠĠĠĠĠĠ Ġval Ġchosen Places : ĠArrayList < Place ?> Ġ= Ġarray ListOf () ĊĊĠĠĠĠĠĠĠ Ġvar Ġclosest Place : ĠPlace ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġclosest Place Distance Ġ= ĠFloat . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġplaces . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġcurrent Location . as Location (). distance To ( places [ index ]. location . as LatLng (). as Location ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance Ġ< Ġclosest Place Distance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Place Ġ= Ġplaces [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Place Distance Ġ= Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġchosen Places . add ( closest Place ) ĊĠĠĠĠĠĠĠ Ġplaces To Choose From . remove ( closest Place ) ĊĠĠĠĠĠĠĠ Ġvar Ġlast Best Place Ġ= Ġclosest Place ĊĠĠĠĠĠĠĠ Ġfor Ġ( count Ġin Ġ 0 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Place Ġ= Ġlast Best Place ?. get Highest R ated Close Place ( filter Details , Ġplaces To Choose From ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Best Place Ġ= Ġtemp Place ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Place Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchosen Places . add ( temp Place ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaces To Choose From . remove ( temp Place ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġemitter . on Success ( chosen Places ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPlace . get Highest R ated Close Place ( filter Details : ĠS ights Filter Details ?, Ġplaces To Choose From : ĠArrayList < Place >): ĠPlace ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhighest R ated Place : ĠPlace ? Ġ= Ġnull Ġ Ġ// Ġpoint Ġof Ġorigin ĊĠĠĠĠĠĠĠ Ġvar Ġhighest R ated Place Weight Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġfor Ġ( place Ġin Ġplaces To Choose From ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplace Weight Ġ= Ġplace . at tract iveness ( this . location . as LatLng (), Ġfilter Details , Ġplaces To Choose From ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( place Weight Ġ> Ġhighest R ated Place Weight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighest R ated Place Ġ= Ġplace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighest R ated Place Weight Ġ= Ġplace Weight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhighest R ated Place ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPlace . at tract iveness ( current Location : ĠLat Lng , Ġfilter Details : ĠS ights Filter Details ?, Ġplaces To Choose From : ĠArrayList < Place >): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Distance Ġ= Ġplaces To Choose From . maximum Distance From ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġthis . location . as LatLng (). as Location (). distance To ( current Location . as Location ()) ĊĊĠĠĠĠĠĠĠ Ġvar Ġat tract iveness : ĠFloat Ġ= Ġ( max Distance Ġ- Ġdistance ) Ġ/ Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġat tract iveness Ġ+= Ġthis . rating Ġ* Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( filter Details ?. has S ou ven irs Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat tract iveness Ġ+= Ġ 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( filter Details ?. children Friendly Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat tract iveness Ġ+= Ġ 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġat tract iveness ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Place > ?. maximum Distance From ( place : ĠPlace ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhighest Distance Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġthis . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġplace . location ?. as LatLng (). as Location (). distance To ( this [ index ]. location ?. as LatLng (). as Location ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance Ġ> Ġhighest Distance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Distance Ġ= Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhighest Distance ĊĠĠĠ Ġ} Ċ } Ċ