package Ġk nf . k uma . ads čĊč Ċ import Ġcom . google . android . gms . ads . Ad Listener č Ċ import Ġcom . google . android . gms . ads . Ad Loader č Ċ import Ġcom . google . android . gms . ads . Load Ad Error č Ċ import Ġcom . google . android . gms . ads . native ad . Native Ad č Ċ import Ġk nf . k uma . App č Ċ import Ġk nf . k uma . commons . Network č Ċ import Ġkotlinx . coroutines .* č Ċ import Ġkotlinx . coroutines . channels . Channel č Ċ import Ġkotlin . coroutines . resume č Ċ import Ġkotlin . coroutines . suspend Coroutine čĊč Ċ object ĠNative Manager Ġ{ čĊĠĠĠ Ġprivate Ġvar ĠisLoading Ġ= Ġfalse čĊĠĠĠ Ġprivate Ġvar Ġinternal Size Ġ= Ġ 0 čĊĠĠĠ Ġprivate Ġval Ġads Channel Ġ= ĠChannel < Native Ad >( Int . MAX _ VALUE ) čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġcache Ads () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġsuspend Ġfun Ġtake ( scope : ĠCor outine Scope , Ġsize : ĠInt , Ġtry Count : ĠInt Ġ= Ġ 0 , Ġcallback : ĠTake Callback ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= Ġsuspend Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch { čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( internal Size Ġ>= Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( suspend Coroutine Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending List Ġ= Ġmutable ListOf < Native Ad >() čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( size ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Size -- čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending List . add ( ads Channel . receive ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( pending List ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( internal Size Ġ<= Ġ 5 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Ads () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake ( scope , Ġsize , Ġtry Count Ġ+ Ġ 1 , Ġcallback ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġwhen Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ Network . is Ads Blocked Ġ} Ġ-> Ġcallback ( emptyList ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Size Ġ>= Ġsize Ġ-> Ġoperation () čĊĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( isLoading ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( try Count Ġ> Ġ 3 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( emptyList ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake ( scope , Ġsize , Ġtry Count Ġ+ Ġ 1 , Ġcallback ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Ads ( scope , Ġsize , Ġoperation ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġcache Ads ( scope : ĠCor outine Scope Ġ= ĠGlobal Scope , Ġpending Size : ĠInt Ġ= Ġ 5 , Ġpending : ĠPending Callback Ġ= Ġ{}) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( isLoading ) Ġreturn čĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġloader : ĠAd Loader ? Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Callback Called Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠ Ġloader Ġ= ĠAd Loader . Builder ( App . context , ĠA ds Utils Mob . LIST _ NATIVE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. for Native Ad Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Size ++ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġads Channel . send ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( internal Size Ġ>= Ġpending Size ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Callback Called Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ Ġpending () Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loader ?. isLoading Ġ== Ġfalse ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Callback Called ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ Ġpending () Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Ad Listener ( object Ġ: ĠAd Listener () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Failed To Load ( p 0 : ĠLoad Ad Error ?) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Ad Failed To Load ( p 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loader ?. isLoading Ġ== Ġfalse ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Callback Called ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ Ġpending () Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). build () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġloader ?. load Ads ( Ads Utils Mob . ad Request , Ġ 5 ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊč Ċ type alias ĠPending Callback Ġ= Ġsuspend Ġ() Ġ-> ĠUnit č Ċ type alias ĠTake Callback Ġ= Ġ( List < Native Ad >) Ġ-> ĠUnit