package Ġbr . es part ano . star w ars ap ir x . service Ċ Ċ import Ġandroid . net . Uri Ċ import Ġbr . es part ano . star w ars ap ir x . model . api . Person Ċ import Ġbr . es part ano . star w ars ap ir x . model . data . Character Ċ import Ġbr . es part ano . star w ars ap ir x . model . data . Movie Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . adapter . rx java . Rx Java Call Adapter Factory Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġrx . Observable Ċ Ċ class ĠStar W ars Service Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠbaseUrl Ġ= Ġ" http :// sw api . co / api /" ĊĠĠĠ Ġprivate Ġval Ġservice Ġ: ĠStar W ars Api ĊĠĠĠ Ġprivate Ġval Ġperson Cache Ġ= Ġmutable Map Of < String , ĠPerson >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogging Ġ= ĠHttp Logging Interceptor () ĊĠĠĠĠĠĠĠ Ġlogging . level Ġ= ĠHttp Logging Interceptor . Level . BODY ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠ ĠhttpClient . add Interceptor ( logging ) ĊĊĠĠĠĠĠĠĠĠ ĠGson Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Len ient () ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġval Ġretrofit Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( baseUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Call Adapter Factory ( Rx Java Call Adapter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( httpClient . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġservice Ġ= Ġretrofit . create ( Star W ars Api :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Movies (): ĠObservable < Movie >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġservice . list Movies () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġfil ms Result Ġ-> ĠObservable . from ( fil ms Result . results ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfilm Ġ-> ĠMovie ( film . title , Ġfilm . episode Id , ĠArrayList ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Movies Full (): ĠObservable < Movie >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġservice . list Movies () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġfilm Results Ġ-> ĠObservable . from ( film Results . results ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġfilm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . zip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( Movie ( film . title , Ġfilm . episode Id , ĠArrayList ())), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from ( film . person Urls ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġperson Url Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. concat ( getCache ( person Url ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Person ( Uri . parse ( person Url ). last Path Segment !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġperson Ġ-> Ġperson Cache [ person Url ] Ġ= Ġperson Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġperson Ġ-> ĠCharacter ( person . name , Ġperson . gender ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ){ Ġmovie , Ġcharacters Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie . characters . addAll ( characters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cache ( url Ġ: ĠString ) Ġ: ĠObservable < Person > Ġ= ĠObservable . from ( person Cache . keys ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter { Ġkey Ġ-> Ġkey Ġ== Ġurl Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠObservable . just ( person Cache [ url ]) Ġ} Ċ Ċ }