package Ġco il . intercept Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġco il . Component Registry Ċ import Ġco il . EventListener Ċ import Ġco il . Image Loader Ċ import Ġco il . decode . DataSource Ċ import Ġco il . decode . Decode Result Ċ import Ġco il . decode . Decode Utils Ċ import Ġco il . decode . File Image Source Ċ import Ġco il . fetch . Drawable Result Ċ import Ġco il . fetch . Fetch Result Ċ import Ġco il . fetch . Fetcher Ċ import Ġco il . fetch . Source Result Ċ import Ġco il . memory . Memory Cache Ċ import Ġco il . request . Image Request Ċ import Ġco il . request . Image Result Ċ import Ġco il . request . Options Ċ import Ġco il . request . Request Service Ċ import Ġco il . request . Success Result Ċ import Ġco il . size . Original Size Ċ import Ġco il . size . Pixel Size Ċ import Ġco il . size . Size Ċ import Ġco il . transform . Transformation Ċ import Ġco il . util . Drawable Utils Ċ import Ġco il . util . Logger Ċ import Ġco il . util . VALID _ TRANS FORMATION _ CONFIG S Ċ import Ġco il . util . add First Ċ import Ġco il . util . allow In exact Size Ċ import Ġco il . util . close Quiet ly Ċ import Ġco il . util . fold Indices Ċ import Ġco il . util . forEach Indices Ċ import Ġco il . util . log Ċ import Ġco il . util . safe Config Ċ import Ġco il . util . to Drawable Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . ensure Active Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlin . collections . set Ċ import Ġkotlin . math . abs Ċ Ċ /** ĠThe Ġlast Ġinterceptor Ġin Ġthe Ġchain Ġwhich Ġexecutes Ġthe Ġ[ Image Request ]. Ġ*/ Ċ internal Ġclass ĠEngine Interceptor ( ĊĠĠĠ Ġprivate Ġval Ġimage Loader : ĠImage Loader , ĊĠĠĠ Ġprivate Ġval Ġrequest Service : ĠRequest Service , ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger ? Ċ ) Ġ: ĠInter ceptor Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠImage Result Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġchain . request ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġrequest . context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġrequest . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġchain . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Listener Ġ= Ġchain . event Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġrequest Service . options ( request , Ġsize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPerform Ġany Ġdata Ġmapping . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . map Start ( request , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapped Data Ġ= Ġimage Loader . components . map ( data , Ġoptions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . map End ( request , Ġmapped Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġmemory Ġcache . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmemory CacheKey Ġ= Ġget Memory CacheKey ( request , Ġmapped Data , Ġoptions , Ġevent Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmemory Cache Value Ġ= Ġmemory CacheKey ?. let Ġ{ Ġget Memory Cache Value ( request , Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFast Ġpath : Ġreturn Ġthe Ġvalue Ġfrom Ġthe Ġmemory Ġcache . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( memory Cache Value Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cached Value Valid ( memory CacheKey , Ġmemory Cache Value , Ġrequest , Ġsize )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSuccess Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Ġ= Ġmemory Cache Value . bitmap . to Drawable ( context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= ĠDataSource . MEMORY _ CACHE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory CacheKey Ġ= Ġmemory CacheKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk CacheKey Ġ= Ġmemory Cache Value . disk CacheKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sample d Ġ= Ġmemory Cache Value . is Sample d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Placeholder Cached Ġ= Ġchain . is Placeholder Cached , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS low Ġpath : Ġfetch , Ġdecode , Ġtransform , Ġand Ġcache Ġthe Ġimage . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( request . fetcher Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFetch Ġand Ġdecode Ġthe Ġimage . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute ( request , Ġmapped Data , Ġoptions , Ġevent Listener ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġthe Ġresult Ġin Ġthe Ġmemory Ġcache . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Memory Cached Ġ= Ġset Memory Cache Value ( memory CacheKey , Ġrequest , Ġresult ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġresult . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccess Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Ġ= Ġresult . drawable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= Ġresult . dataSource , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory CacheKey Ġ= Ġmemory CacheKey . take If Ġ{ Ġis Memory Cached Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk CacheKey Ġ= Ġresult . disk CacheKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sample d Ġ= Ġresult . is Sample d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Placeholder Cached Ġ= Ġchain . is Placeholder Cached , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġis ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġthrowable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrequest Service . error Result ( chain . request , Ġthrowable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet Ġthe Ġmemory Ġcache Ġkey Ġfor Ġthis Ġrequest . Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġget Memory CacheKey ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġmapped Data : ĠAny , ĊĠĠĠĠĠĠĠ Ġoptions : ĠOptions , ĊĠĠĠĠĠĠĠ Ġevent Listener : ĠEvent Listener ĊĠĠĠ Ġ): ĠMemory Cache . Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFast Ġpath : Ġan Ġexplicit Ġmemory Ġcache Ġkey Ġhas Ġbeen Ġset . ĊĠĠĠĠĠĠĠ Ġrequest . memory CacheKey ?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠS low Ġpath : Ġcreate Ġa Ġnew Ġmemory Ġcache Ġkey . ĊĠĠĠĠĠĠĠ Ġevent Listener . key Start ( request , Ġmapped Data ) ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġimage Loader . components . key ( mapped Data , Ġoptions ) ĊĠĠĠĠĠĠĠ Ġevent Listener . key End ( request , Ġbase ) ĊĠĠĠĠĠĠĠ Ġif Ġ( base Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġextras . put All ( request . parameters . cache Keys ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( request . transform ations . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransformations Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . transform ations . forEach Indices Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformations . append ( it . cacheKey ). append ( TRANSFORM ATIONS _ DE LIMITER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextras [ MEMORY _ CACHE _ KEY _ TRANSFORM ATIONS ] Ġ= Ġtransformations . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġoptions . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġis ĠPixel Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextras [ MEMORY _ CACHE _ KEY _ WIDTH ] Ġ= Ġsize . width . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextras [ MEMORY _ CACHE _ KEY _ HEIGHT ] Ġ= Ġsize . height . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠMemory Cache . Key ( base , Ġextras ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturn Ġ' true ' Ġif Ġ[ cache Value ] Ġsatisfies Ġthe Ġ[ request ]. Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġis Cached Value Valid ( ĊĠĠĠĠĠĠĠ Ġcache Key : ĠMemory Cache . Key , ĊĠĠĠĠĠĠĠ Ġcache Value : ĠMemory Cache . Value , ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġsize : ĠSize ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthe Ġsize Ġof Ġthe Ġcached Ġbitmap Ġis Ġvalid Ġfor Ġthe Ġrequest . ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Size Valid ( cacheKey , Ġcache Value , Ġrequest , Ġsize )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġwe Ġdon 't Ġreturn Ġa Ġhardware Ġbitmap Ġif Ġthe Ġrequest Ġdoesn 't Ġallow Ġit . ĊĠĠĠĠĠĠĠ Ġif Ġ(! request Service . is Config Valid For Hardware ( request , Ġcache Value . bitmap . safe Config )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. log ( TAG , ĠLog . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ request . data }: ĠCached Ġbitmap Ġis Ġhardware - back ed , Ġwhich Ġis Ġincompatible Ġwith Ġthe Ġrequest ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠElse , Ġthe Ġcached Ġdrawable Ġis Ġvalid Ġand Ġwe Ġcan Ġshort Ġcircuit Ġthe Ġrequest . ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturn Ġ' true ' Ġif Ġ[ cache Value ]' s Ġsize Ġsatisfies Ġthe Ġ[ request ]. Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Size Valid ( ĊĠĠĠĠĠĠĠ Ġcache Key : ĠMemory Cache . Key , ĊĠĠĠĠĠĠĠ Ġcache Value : ĠMemory Cache . Value , ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġsize : ĠSize ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOriginal Size Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache Value . is Sample d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. log ( TAG , ĠLog . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ request . data }: ĠRequest ed Ġoriginal Ġsize , Ġbut Ġcached Ġimage Ġis Ġsampled ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPixel Size Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcached Width Ġ= Ġcache Key . extras [ MEMORY _ CACHE _ KEY _ WIDTH ]?. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcached Height Ġ= Ġcache Key . extras [ MEMORY _ CACHE _ KEY _ HEIGHT ]?. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Width Ġ== Ġnull Ġ|| Ġcached Height Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġcache Value . bitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Width Ġ= Ġbitmap . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Height Ġ= Ġbitmap . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmultiple Ġ= ĠDecode Utils . compute Size Multiplier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Width Ġ= Ġcached Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Height Ġ= Ġcached Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst Width Ġ= Ġsize . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst Height Ġ= Ġsize . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ= Ġrequest . scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShort Ġcircuit Ġthe Ġsize Ġcheck Ġif Ġthe Ġsize Ġis Ġat Ġmost Ġ 1 Ġpixel Ġoff Ġin Ġeither Ġdimension . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġaccounts Ġfor Ġthe Ġfact Ġthat Ġdown sampling Ġcan Ġoften Ġproduce Ġimages Ġwith Ġdimensions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġat Ġmost Ġone Ġpixel Ġoff Ġdue Ġto Ġrounding . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallow In exact Size Ġ= Ġrequest . allow In exact Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( allow In exact Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdown sample Multiplier Ġ= Ġmultiple . coerce At Most ( 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( size . width Ġ- Ġ( down sample Multiplier Ġ* Ġcached Width )) Ġ<= Ġ 1 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( size . height Ġ- Ġ( down sample Multiplier Ġ* Ġcached Height )) Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( size . width Ġ- Ġcached Width ) Ġ<= Ġ 1 Ġ&& Ġabs ( size . height Ġ- Ġcached Height ) Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( multiple Ġ!= Ġ 1 . 0 Ġ&& Ġ! allow In exact Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. log ( TAG , ĠLog . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ request . data }: ĠCached Ġimage 's Ġrequest Ġsize Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ($ cached Width , Ġ$ cached Height ) Ġdoes Ġnot Ġexactly Ġmatch Ġthe Ġrequested Ġsize Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" (${ size . width }, Ġ${ size . height }, Ġ${ request . scale }). " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( multiple Ġ> Ġ 1 . 0 Ġ&& Ġcache Value . is Sample d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. log ( TAG , ĠLog . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ request . data }: ĠCached Ġimage 's Ġrequest Ġsize Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ($ cached Width , Ġ$ cached Height ) Ġis Ġsmaller Ġthan Ġthe Ġrequested Ġsize Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" (${ size . width }, Ġ${ size . height }, Ġ${ request . scale }). " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠExecute Ġthe Ġ[ Fetcher ], Ġdecode Ġany Ġdata Ġinto Ġa Ġ[ Drawable ], Ġand Ġapply Ġany Ġ[ Transformation ] s . Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġinline Ġfun Ġexecute ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġmapped Data : ĠAny , ĊĠĠĠĠĠĠĠ Ġrequest Options : ĠOptions , ĊĠĠĠĠĠĠĠ Ġevent Listener : ĠEvent Listener ĊĠĠĠ Ġ): ĠExecute Result Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoptions Ġ= Ġrequest Options ĊĠĠĠĠĠĠĠ Ġvar Ġcomponents Ġ= Ġimage Loader . components ĊĠĠĠĠĠĠĠ Ġvar Ġfetch Result : ĠFetch Result ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġexecute Result Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! request Service . allow Hardware Worker Thread ( options )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Ġ= Ġoptions . copy ( config Ġ= ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . fetcher Factory Ġ!= Ġnull Ġ|| Ġrequest . decoder Factory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents Ġ= Ġcomponents . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add First ( request . fetcher Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add First ( request . decoder Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFetch Ġthe Ġdata . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Result Ġ= Ġfetch ( components , Ġrequest , Ġmapped Data , Ġoptions , Ġevent Listener ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecode Ġthe Ġdata . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( fetch Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSource Result Ġ-> Ġwith Context ( request . decoder Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode ( fetch Result , Ġcomponents , Ġrequest , Ġmapped Data , Ġoptions , Ġevent Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDrawable Result Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExecute Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Ġ= Ġfetch Result . drawable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sample d Ġ= Ġfetch Result . is Sample d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= Ġfetch Result . dataSource , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk CacheKey Ġ= Ġnull Ġ// ĠThis Ġresult Ġhas Ġno Ġfile Ġsource . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthe Ġfetch Ġresult 's Ġsource Ġis Ġalways Ġclosed . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( fetch Result Ġas ? ĠSource Result )?. source ?. close Quiet ly () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠApply Ġany Ġtransformations Ġand Ġprepare Ġto Ġdraw . ĊĠĠĠĠĠĠĠ Ġval Ġfinal Result Ġ= Ġtransform ( execute Result , Ġrequest , Ġoptions , Ġevent Listener ) ĊĠĠĠĠĠĠĠ Ġ( final Result . drawable Ġas ? ĠBitmap Drawable )?. bitmap ?. prepare To Draw () ĊĠĠĠĠĠĠĠ Ġreturn Ġfinal Result ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġinline Ġfun Ġfetch ( ĊĠĠĠĠĠĠĠ Ġcomponents : ĠComponent Registry , ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġmapped Data : ĠAny , ĊĠĠĠĠĠĠĠ Ġoptions : ĠOptions , ĊĠĠĠĠĠĠĠ Ġevent Listener : ĠEvent Listener ĊĠĠĠ Ġ): ĠFetch Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfetch Result : ĠFetch Result ĊĠĠĠĠĠĠĠ Ġvar Ġsearch Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġcomponents . new Fetcher ( mapped Data , Ġoptions , Ġimage Loader , Ġsearch Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( pair ) Ġ{ Ġ" Unable Ġto Ġcreate Ġa Ġfetch er Ġthat Ġsupports : Ġ$ mapped Data " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfetch er Ġ= Ġpair . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Index Ġ= Ġpair . second Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . fetch Start ( request , Ġfetch er , Ġoptions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfetch er . fetch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . fetch End ( request , Ġfetch er , Ġoptions , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthe Ġsource Ġis Ġclosed Ġif Ġan Ġexception Ġoccurs Ġbefore Ġreturning Ġthe Ġresult . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( result Ġas ? ĠSource Result )?. source ?. close Quiet ly () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġthrowable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Result Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfetch Result ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġinline Ġfun Ġdecode ( ĊĠĠĠĠĠĠĠ Ġfetch Result : ĠSource Result , ĊĠĠĠĠĠĠĠ Ġcomponents : ĠComponent Registry , ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġmapped Data : ĠAny , ĊĠĠĠĠĠĠĠ Ġoptions : ĠOptions , ĊĠĠĠĠĠĠĠ Ġevent Listener : ĠEvent Listener ĊĠĠĠ Ġ): ĠExecute Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdecode Result : ĠDecode Result ĊĠĠĠĠĠĠĠ Ġvar Ġsearch Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġcomponents . new Decoder ( fetch Result , Ġoptions , Ġimage Loader , Ġsearch Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( pair ) Ġ{ Ġ" Unable Ġto Ġcreate Ġa Ġdecoder Ġthat Ġsupports : Ġ$ mapped Data " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecoder Ġ= Ġpair . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Index Ġ= Ġpair . second Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . decode Start ( request , Ġdecoder , Ġoptions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdecoder . decode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . decode End ( request , Ġdecoder , Ġoptions , Ġresult ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Result Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCombine Ġthe Ġfetch Ġand Ġdecode Ġoperations ' Ġresults . ĊĠĠĠĠĠĠĠ Ġreturn ĠExecute Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Ġ= Ġdecode Result . drawable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Sample d Ġ= Ġdecode Result . is Sample d , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= Ġfetch Result . dataSource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisk CacheKey Ġ= Ġ( fetch Result . source Ġas ? ĠFile Image Source )?. disk CacheKey ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠApply Ġany Ġ[ Transformation ] s Ġand Ġreturn Ġan Ġupdated Ġ[ Execute Result ]. Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġsuspend Ġinline Ġfun Ġtransform ( ĊĠĠĠĠĠĠĠ Ġresult : ĠExecute Result , ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġoptions : ĠOptions , ĊĠĠĠĠĠĠĠ Ġevent Listener : ĠEvent Listener ĊĠĠĠ Ġ): ĠExecute Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransformations Ġ= Ġrequest . transform ations ĊĠĠĠĠĠĠĠ Ġif Ġ( transform ations . isEmpty ()) Ġreturn Ġresult ĊĊĠĠĠĠĠĠĠ Ġ// ĠSkip Ġthe Ġtransformations Ġas Ġconverting Ġto Ġa Ġbitmap Ġis Ġdisabled . ĊĠĠĠĠĠĠĠ Ġif Ġ( result . drawable Ġ! is ĠBitmap Drawable Ġ&& Ġ! request . allow Conversion To Bitmap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. log ( TAG , ĠLog . INFO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġresult . drawable :: class . java . canonical Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" allow Conversion To Bitmap = false , Ġskipping Ġtransformations Ġfor Ġtype Ġ$ type " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠApply Ġthe Ġtransformations . ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( request . transformation Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġconvert Drawable To Bitmap ( result . drawable , Ġoptions , Ġtransformations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . transform Start ( request , Ġinput ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġtransformations . fold Indices ( input ) Ġ{ Ġbitmap , Ġtransformation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformation . transform ( bitmap , Ġoptions . size ). also Ġ{ Ġensure Active () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . transform End ( request , Ġoutput ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . copy ( drawable Ġ= Ġoutput . to Drawable ( request . context )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet Ġthe Ġmemory Ġcache Ġvalue Ġfor Ġthis Ġrequest . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Memory Cache Value ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġmemory CacheKey : ĠMemory Cache . Key ĊĠĠĠ Ġ): ĠMemory Cache . Value ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( request . memory Cache Policy . read Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader . memory Cache ?. get ( memory CacheKey ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠWrite Ġ[ drawable ] Ġto Ġthe Ġmemory Ġcache . ĠReturn Ġ' true ' Ġif Ġit Ġwas Ġadded Ġto Ġthe Ġcache . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Memory Cache Value ( ĊĠĠĠĠĠĠĠ Ġkey : ĠMemory Cache . Key ?, ĊĠĠĠĠĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠĠĠĠĠ Ġresult : ĠExecute Result ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! request . memory Cache Policy . write Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġ( result . drawable Ġas ? ĠBitmap Drawable )?. bitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġmutable Map Of < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextras [ EXTRA _ IS _ SAMP LED ] Ġ= Ġresult . is Sample d ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . disk CacheKey ?. let Ġ{ Ġextras [ EXTRA _ DISK _ CACHE _ KEY ] Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader . memory Cache ?. let Ġ{ Ġit [ key ] Ġ= ĠMemory Cache . Value ( bitmap , Ġextras ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠConvert Ġ[ drawable ] Ġto Ġa Ġ[ Bitmap ]. Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconvert Drawable To Bitmap ( ĊĠĠĠĠĠĠĠ Ġdrawable : ĠDrawable , ĊĠĠĠĠĠĠĠ Ġoptions : ĠOptions , ĊĠĠĠĠĠĠĠ Ġtransformations : ĠList < Transformation > ĊĠĠĠ Ġ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġis ĠBitmap Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= Ġdrawable . bitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġbitmap . safe Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Ġ! in ĠVALID _ TRANS FORMATION _ CONFIG S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. log ( TAG , ĠLog . INFO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Con verting Ġbitmap Ġwith Ġconfig Ġ$ config Ġto Ġapply Ġtransformations : Ġ$ transform ations " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠDrawable Utils . convertTo Bitmap ( drawable , Ġoptions . config , Ġoptions . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . scale , Ġoptions . allow In exact Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger ?. log ( TAG , ĠLog . INFO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdrawable :: class . java . canonical Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Con verting Ġdrawable Ġof Ġtype Ġ$ type Ġto Ġapply Ġtransformations : Ġ$ transform ations " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠDrawable Utils . convertTo Bitmap ( drawable , Ġoptions . config , Ġoptions . size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . scale , Ġoptions . allow In exact Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠMemory Cache . Value . is Sample d : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( extras [ EXTRA _ IS _ SAMP LED ] Ġas ? ĠBoolean ) Ġ?: Ġfalse ĊĊĠĠĠ Ġprivate Ġval ĠMemory Cache . Value . disk CacheKey : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġextras [ EXTRA _ DISK _ CACHE _ KEY ] Ġas ? ĠString ĊĊĠĠĠ Ġprivate Ġval ĠInter ceptor . Chain . is Placeholder Cached : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis Ġis ĠReal Interceptor Chain Ġ&& Ġis Placeholder Cached ĊĊĠĠĠ Ġprivate Ġval ĠInter ceptor . Chain . event Listener : ĠEvent Listener ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( this Ġis ĠReal Interceptor Chain ) Ġevent Listener Ġelse ĠEvent Listener . NONE ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġclass ĠExecute Result ( ĊĠĠĠĠĠĠĠ Ġval Ġdrawable : ĠDrawable , ĊĠĠĠĠĠĠĠ Ġval Ġis Sample d : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval ĠdataSource : ĠDataSource , ĊĠĠĠĠĠĠĠ Ġval Ġdisk CacheKey : ĠString ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable : ĠDrawable Ġ= Ġthis . drawable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Sample d : ĠBoolean Ġ= Ġthis . is Sample d , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource : ĠDataSource Ġ= Ġthis . dataSource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisk CacheKey : ĠString ? Ġ= Ġthis . disk CacheKey ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠExecute Result ( drawable , Ġis Sample d , ĠdataSource , Ġdisk CacheKey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Engine Interceptor " ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting Ġinternal Ġconst Ġval ĠEX TRA _ DISK _ CACHE _ KEY Ġ= Ġ" co il # disk _ cache _ key " ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting Ġinternal Ġconst Ġval ĠEX TRA _ IS _ SAMP LED Ġ= Ġ" co il # is _ sampled " ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting Ġinternal Ġconst Ġval ĠMEM ORY _ CACHE _ KEY _ WIDTH Ġ= Ġ" co il # width " ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting Ġinternal Ġconst Ġval ĠMEM ORY _ CACHE _ KEY _ HEIGHT Ġ= Ġ" co il # height " ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting Ġinternal Ġconst Ġval ĠMEM ORY _ CACHE _ KEY _ TRANSFORM ATIONS Ġ= Ġ" co il # transform ations " ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting Ġinternal Ġconst Ġval ĠTRANS FORM ATIONS _ DE LIMITER Ġ= Ġ'~ ' ĊĠĠĠ Ġ} Ċ } Ċ