package Ġcom . map swith me . maps . ads Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . System Clock Ċ import Ġandroidx . annotation . Call Super Ċ Ċ import Ġcom . map swith me . util . log . Logger Ċ import Ġcom . map swith me . util . log . LoggerFactory Ċ import Ġnet . j cip . annotations . Not Thread Safe Ċ Ċ import Ġjava . util . HashMap Ċ import Ġjava . util . HashSet Ċ Ċ @ Not Thread Safe Ċ internal Ġabstract Ġclass ĠC aching Native Ad Loader ( ĊĠĠĠ Ġprivate Ġval Ġm Tracker : ĠAd Tracker ?, ĊĠĠĠ Ġprivate Ġval Ġm Cache Listener : ĠOn Ad Cache Modified Listener ? Ċ ) Ġ: ĠBase Native Ad Loader () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġprovider Ġname Ġfor Ġthis Ġad . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġabstract Ġval Ġprovider : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġan Ġad Ġfor Ġa Ġspecified Ġbanner Ġid . ĠIf Ġthere Ġis Ġa Ġcached Ġad , Ġthe Ġcaller Ġwill Ġbe Ġnotified ĊĠĠĠĠ Ġ* Ġimmediately Ġthrough Ġ[ Native Ad Listener . on Ad Loaded ]. ĊĠĠĠĠ Ġ* ĠOtherwise , Ġthe Ġcaller Ġwill Ġbe Ġnotified Ġonce Ġan Ġad Ġis Ġloaded Ġthrough Ġthe Ġmentioned Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< br ></ br >< br ></ br >** Important Ġnote : Ġ** Ġif Ġthere Ġis Ġa Ġcached Ġad Ġfor Ġthe Ġrequested Ġbanner Ġid , Ġand Ġthat Ġad ĊĠĠĠĠ Ġ* Ġhas Ġa Ġgood Ġimp ression Ġindicator , Ġand Ġthere Ġis Ġat Ġleast Ġ[. REQUEST _ INTERVAL _ MS ] Ġbetween Ġthe ĊĠĠĠĠ Ġ* Ġfirst Ġtime Ġthat Ġad Ġwas Ġrequested Ġand Ġthe Ġcurrent Ġtime Ġthe Ġnew Ġad Ġwill Ġbe Ġloaded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġload Ad ( context : ĠContext , Ġbanner Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOGGER . d ( TAG , Ġ" Load Ġthe Ġad Ġfor Ġa Ġbanner Ġid Ġ'$ banner Id '") ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠBanner Key ( provider , Ġbanner Id ) ĊĠĠĠĠĠĠĠ Ġval Ġcached Ad Ġ= Ġget Ad ById From Cache ( key ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cached Ad Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . d ( TAG , Ġ" There Ġis Ġno Ġan Ġad Ġin Ġa Ġcache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Ad Intern ally ( context , Ġbanner Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Imp ression Good ( cached Ad ) Ġ&& Ġcan Be Re loaded ( cached Ad )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . d ( TAG , Ġ" A Ġnew Ġad Ġwill Ġbe Ġloaded Ġbecause Ġthe Ġprevious Ġone Ġhas Ġa Ġgood Ġimp ression ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Ad Intern ally ( context , Ġbanner Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( get Ad Listener () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . d ( TAG , Ġ" A Ġcached Ġad Ġ'" Ġ+ Ġcached Ad . title Ġ+ Ġ"' Ġis Ġset Ġimmediately ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ad Listener () !!. on Ad Loaded ( cached Ad ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . cancel () ĊĠĠĠĠĠĠĠ ĠP ENDING _ REQUEST S . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Imp ression Good ( ad : ĠCached M wm Native Ad ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Tracker Ġ!= Ġnull Ġ&& Ġm Tracker . is Imp ression Good ( ad . provider , Ġad . banner Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Ad Intern ally ( context : ĠContext , Ġbanner Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Ad Loading ( banner Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . d ( TAG , Ġ" The Ġad Ġrequest Ġfor Ġbanner Ġid Ġ'$ banner Id ' Ġhasn 't Ġbeen Ġcompleted Ġyet .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġload Ad From Provider ( context , Ġbanner Id ) ĊĠĠĠĠĠĠĠ ĠP ENDING _ REQUEST S . add ( Banner Key ( provider , Ġbanner Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġabstract Ġfun Ġload Ad From Provider ( context : ĠContext , Ġbanner Id : ĠString ) ĊĊĠĠĠ Ġfun ĠonError ( banner Id : ĠString , Ġprovider : ĠString , Ġerror : ĠNative Ad Error ) Ġ{ ĊĠĠĠĠĠĠĠ ĠP ENDING _ REQUEST S . remove ( Banner Key ( provider , Ġbanner Id )) ĊĠĠĠĠĠĠĠ Ġif Ġ( get Ad Listener () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ad Listener () !!. onError ( banner Id , Ġprovider , Ġerror ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Ad Loaded ( banner Id : ĠString , Ġad : ĠCached M wm Native Ad ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠBanner Key ( provider , Ġbanner Id ) ĊĠĠĠĠĠĠĠ ĠLOGGER . d ( TAG , Ġ" A Ġnew Ġad Ġfor Ġid Ġ'" Ġ+ Ġkey Ġ+ Ġ"' Ġis Ġloaded , Ġtitle Ġ= Ġ" Ġ+ Ġad . title ) ĊĠĠĠĠĠĠĠ ĠP ENDING _ REQUEST S . remove ( key ) ĊĊĠĠĠĠĠĠĠ Ġval Ġis Cache Was Empty Ġ= Ġis Cache Empty For Id ( key ) ĊĊĠĠĠĠĠĠĠ ĠLOGGER . d ( TAG , Ġ" Put Ġthe Ġad Ġ'" Ġ+ Ġad . title Ġ+ Ġ"' Ġto Ġcache , Ġis Cache Was Empty Ġ= Ġ" Ġ+ Ġis Cache Was Empty ) ĊĠĠĠĠĠĠĠ Ġput In Cache ( key , Ġad ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Cache Was Empty Ġ&& Ġget Ad Listener () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ad Listener () !!. on Ad Loaded ( ad ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Ad Clicked ( banner Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( get Ad Listener () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnative Ad Ġ= Ġget Ad ById From Cache ( Banner Key ( provider , Ġbanner Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" A Ġnative Ġad Ġmust Ġbe Ġpresented Ġin Ġa Ġcache Ġwhen Ġit 's Ġclicked !") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ad Listener () !!. onClick ( native Ad ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġthe Ġad Ġis Ġloading Ġright Ġnow Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbanner Id ĠA Ġbanner Ġid Ġthat Ġan Ġad Ġis Ġloading Ġfor . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġan Ġad Ġis Ġloading , Ġotherwise Ġ- Ġfalse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis Ad Loading ( banner Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠP ENDING _ REQUEST S . contains ( Banner Key ( provider , Ġbanner Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġput In Cache ( key : ĠBanner Key , Ġvalue : ĠCached M wm Native Ad ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCACHE [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġm Cache Listener ?. on Put ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove From Cache ( key : ĠBanner Key , Ġvalue : ĠCached M wm Native Ad ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCACHE . remove ( key ) ĊĠĠĠĠĠĠĠ Ġm Cache Listener ?. on Removed ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Ad ById From Cache ( key : ĠBanner Key ): ĠCached M wm Native Ad ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCACHE [ key ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Cache Empty For Id ( key : ĠBanner Key ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Ad ById From Cache ( key ) Ġ== Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġdetach () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( ad Ġin ĠCACHE . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad . detach Ad Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġattach () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( ad Ġin ĠCACHE . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ad . provider Ġ== Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġad . attach Ad Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOGGER Ġ= ĠLoggerFactory . INSTANCE . getLogger ( LoggerFactory . Type . MISC ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠC aching Native Ad Loader :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREQUEST _ INTERVAL _ MS Ġ= Ġ( 5 Ġ* Ġ 1 0 0 0 ). to Long () ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCACHE Ġ= ĠHashMap < Banner Key , ĠCached M wm Native Ad >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠP ENDING _ REQUEST S Ġ= ĠHashSet < Banner Key >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcan Be Re loaded ( ad : ĠCached M wm Native Ad ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSystem Clock . elapsed Realtime () Ġ- Ġad . loaded Time Ġ>= ĠREQUEST _ INTERVAL _ MS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ