package Ġcom . w iley . ford um m ies . android sdk . t ict act oe . network Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . os . Message Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Observer Ċ import Ġandroidx . lifecycle . On Lifecycle Event Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Thumbnail Downloader " Ċ private Ġconst Ġval ĠMESSAGE _ DOWNLOAD Ġ= Ġ 0 Ċ Ċ class ĠThumb nail Downloader < in ĠT > Ġ( Ċ ĉ private Ġval Ġresponse Handler : ĠHandler , Ċ ĉ private Ġval Ġon Thumbnail Downloaded : Ġ( T , ĠBitmap ) Ġ-> ĠUnit Ċ ) Ġ: ĊĠĠĠ ĠHandler Thread ( TAG ) Ġ{ ĊĊ ĉ val Ġfragment Lifecycle Observer : ĠLifecycle Observer Ġ= Ċĉ ĉ object Ġ: ĠLifecycle Observer Ġ{ Ċĉĉ ĉ @ On Lifecycle Event ( Lifecycle . Event . ON _ CREATE ) Ċĉĉ ĉ fun Ġsetup () Ġ{ Ċĉĉĉ ĉ Tim ber . tag ( TAG ). i (" Starting Ġbackground Ġthread ") Ċĉĉĉ ĉ if Ġ(! is Alive ) Ġ{ Ċĉĉĉĉ ĉ start () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ lo oper Ċĉĉ ĉ } ĊĊĉĉ ĉ @ On Lifecycle Event ( Lifecycle . Event . ON _ DESTROY ) Ċĉĉ ĉ fun ĠtearDown () Ġ{ Ċĉĉĉ ĉ Tim ber . tag ( TAG ). i (" Destroy ing Ġbackground Ġthread ") Ċĉĉĉ ĉ quit () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ val Ġview Lifecycle Observer Ġ= Ġobject Ġ: ĠLifecycle Observer Ġ{ Ċĉ ĉ @ On Lifecycle Event ( Lifecycle . Event . ON _ DESTROY ) Ċĉ ĉ private Ġfun Ġclear Queue () Ġ{ Ċĉĉ ĉ Tim ber . tag ( TAG ). i (" Clear ing Ġall Ġrequests Ġfrom Ġqueue ") Ċĉĉ ĉ m RequestHandler . remove Messages ( MESSAGE _ DOWNLOAD ) Ċĉĉ ĉ m Request Map . clear () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġvar Ġm Has Quit Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm RequestHandler : ĠHandler ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Thumbnail Download Listener : ĠThumb nail Download Listener < T > ĊĠĠĠ Ġprivate Ġval Ġm Request Map Ġ= ĠConcurrent HashMap < T , ĠString >() ĊĠĠĠ Ġprivate Ġval Ġm F lickr Fetch r Ġ= ĠF lickr Fetch r () ĊĊĠĠĠ Ġinterface ĠThumb nail Download Listener < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Thumbnail Downloaded ( holder : ĠT , Ġbitmap : ĠBitmap ?) ĊĠĠĠ Ġ} ĊĊ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċ ĉ @ Suppress Lint (" Handler Leak ") ĊĠĠĠ Ġoverride Ġfun Ġon Looper Prepared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Looper Prepared () ĊĠĠĠĠĠĠĠ Ġm RequestHandler Ġ= Ġobject Ġ: ĠHandler () Ġ{ Ċĉĉ ĉ override Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . handle Message ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . what Ġ== ĠMESSAGE _ DOWNLOAD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġmsg . obj Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). i (" Got Ġa Ġrequest Ġfor ĠURL : Ġ${ m Request Map [ target ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġqueue Thumbnail ( target : ĠT , Ġurl : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). i (" Got Ġa ĠURL : Ġ% s ", Ġurl ) ĊĠĠĠĠĠĠĠ Ġm Request Map [ target ] Ġ= Ġurl ĊĠĠĠĠĠĠĠ Ġm RequestHandler . obtain Message ( MESSAGE _ DOWNLOAD , Ġtarget ). send To Target () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquit (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Has Quit Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . quit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Request ( target : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġm Request Map [ target ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġm F lickr Fetch r . fetch Photo ( url ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġresponse Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthe Url Ġ= Ġm Request Map [ target ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Objects . requireNonNull ( the Url ) Ġ!= Ġurl Ġ|| Ġm Has Quit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Request Map . remove ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Thumbnail Downloaded ( target , Ġbitmap ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ