package Ġcom . al wan . google books app . data . source . remote Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . al wan . google books app . data . source . remote . response . Book Response Ċ import Ġcom . al wan . google books app . data . source . remote . response . Volume Response Ċ import Ġcom . al wan . google books app . network . Ret rofit Config Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ Ċ class ĠRemote DataSource Ġ{ ĊĊĠĠĠ Ġfun Ġget Books ( callback : ĠLoad Books Callback , Ġquery : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠRet rofit Config . api Instance . get Books ( query ) ĊĠĠĠĠĠĠĠ Ġclient . enqueue ( object Ġ: ĠCallback < Volume Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Volume Response >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Volume Response > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġresponse . body ()?. items ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Book Ġ= ĠArrayList < Book Response >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( book Ġin Ġitems ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Book . add ( book . volume Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Books Loaded ( list Book ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Books Loaded ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Volume Response >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Remote DataSource ", Ġ" get Books Ġon Failure Ġ: Ġ${ t . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠLoad Books Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Books Loaded ( books : ĠArrayList < Book Response > ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠRemote DataSource ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance (): ĠRemote DataSource Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ?: Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ?: ĠRemote DataSource () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }