package Ġhe m end ra . books . model Ċ Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġhe m end ra . books . data . Book Ċ import Ġhe m end ra . books . model . listeners . Books Loader Listener Ċ import Ġhe m end ra . books . model . listeners . I DataSource Ċ import Ġhe m end ra . books . model . listeners . I Get Books Factory Ċ import Ġhe m end ra . books . presenter . listeners . I DataSource Listener Ċ Ċ class ĠBooks Source Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġlistener : ĠI DataSource Listener ) Ġ: ĠI DataSource , ĠBooks Loader Listener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbooks Source : ĠBooks Source ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( listener : ĠI DataSource Listener ) Ġ: ĠBooks Source Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( books Source Ġ== Ġnull ) Ġbooks Source Ġ= ĠBooks Source ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbooks Source !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġvar Ġfactory : ĠI Get Books Factory Ġ= ĠGet Books Factory () ĊĊĠĠĠ Ġprivate Ġvar Ġget Books Ġ: ĠGet Books ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġsearch Books ( query : ĠString , ĠapiKey : ĠString , Ġpage Number : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( is Searching ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġget Books Ġ= Ġfactory . newInstance ( this ) ĊĠĠĠĠĠĠĠ Ġget Books ?. execute ( query , ĠapiKey , Ġpage Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Searching (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Books ?. is Executing () Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon SearchResults ( results : ĠArrayList < Book >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . on SearchResults ( results ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Search Failed ( reason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . on Search Failed ( reason ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġabort () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Books ?. cancel ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġabort () ĊĠĠĠĠĠĠĠ Ġbooks Source Ġ= Ġnull ĊĠĠĠ Ġ} Ċ Ċ }