package Ġcn . sc y ut ao . y ut ao http . image Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Build . VERSION _ CODES Ċ import Ġandroid . os . Environment Ċ import Ġandroid . os . Stat Fs Ċ import Ġandroid . os . Strict Mode Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . FileDescriptor Ċ import Ġjava . security . Message Digest Ċ import Ġjava . security . NoSuch AlgorithmException Ċ Ċ object ĠUtils Ġ{ ĊĠĠĠ Ġ@ Target Api ( VERSION _ CODES . H ONE Y COMB ) ĊĠĠĠ Ġfun Ġenable Strict Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has G inger bread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Policy Builder Ġ= ĠStrict Mode . Thread Policy . Builder (). detect All (). penalty Log () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvm Policy Builder Ġ= ĠStrict Mode . Vm Policy . Builder (). detect All (). penalty Log () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has H oney comb ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread Policy Builder . penalty Flash Screen () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStrict Mode . set Thread Policy ( thread Policy Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStrict Mode . set Vm Policy ( vm Policy Builder . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas F roy o (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . F RO YO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas G inger bread (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . GING ER B READ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas H oney comb (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . H ONE Y COMB ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas H oney comb MR 1 (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . H ONE Y COMB _ MR 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas J el ly Bean (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . J EL LY _ BE AN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Kit K at (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . KIT K AT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecode Sample d Bitmap From Descriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileDescriptor : ĠFile Descriptor , Ġreq Width : ĠInt , Ġreq Height : ĠInt , Ġcache : ĠL RU Cache ĊĠĠĠ Ġ): ĠBitmap Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠBitmap Factory . Options () ĊĠĠĠĠĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠBitmap Factory . decode FileDescriptor ( file Descriptor , Ġnull , Ġoptions ) ĊĊĠĠĠĠĠĠĠ Ġoptions . in Sample Size Ġ= Ġcalculate In Sample Size ( options , Ġreq Width , Ġreq Height ) ĊĊĠĠĠĠĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has H oney comb ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd In Bitmap Options ( options , Ġcache ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap Factory . decode FileDescriptor ( file Descriptor , Ġnull , Ġoptions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( VERSION _ CODES . H ONE Y COMB ) ĊĠĠĠ Ġprivate Ġfun Ġadd In Bitmap Options ( options : ĠBitmap Factory . Options , Ġcache : ĠL RU Cache ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoptions . in Mutable Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cache Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin Bitmap Ġ= Ġcache . get Bitmap From Re usable Set ( options ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( in Bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . in Bitmap Ġ= Ġin Bitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate In Sample Size ( options : ĠBitmap Factory . Options , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq Width : ĠInt , Ġreq Height : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġoptions . out Height ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġoptions . out Width ĊĠĠĠĠĠĠĠ Ġvar Ġin Sample Size Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( height Ġ> Ġreq Height Ġ|| Ġwidth Ġ> Ġreq Width ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Height Ġ= Ġheight Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Width Ġ= Ġwidth Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( half Height Ġ/ Ġin Sample Size Ġ> Ġreq Height Ġ&& Ġhalf Width Ġ/ Ġin Sample Size Ġ> Ġreq Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Sample Size Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Pixels Ġ= Ġ( width Ġ* Ġheight Ġ/ Ġin Sample Size ). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Req Pixels Cap Ġ= Ġreq Width Ġ* Ġreq Height Ġ* Ġ 2 . to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( total Pixels Ġ> Ġtotal Req Pixels Cap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Sample Size Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pixels Ġ/= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġin Sample Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġfun Ġget Bitmap Size ( bitmap : ĠBitmap ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Kit K at ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbitmap . allocation Byte Count ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has H oney comb MR 1 ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbitmap . byte Count ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbitmap . row Bytes Ġ* Ġbitmap . height ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Disk Cache Dir ( context : ĠContext , Ġunique Name : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Path Ġ= Ġif Ġ( Environment . MEDIA _ MOUNT ED Ġ== ĠEnvironment . get External Storage State () Ġ|| Ġ! is External Storage Remov able ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget External Cache Dir ( context )?. path ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . cacheDir . path ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( cache Path Ġ+ ĠFile . separator Ġ+ Ġunique Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis External Storage Remov able : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ@ Target Api ( VERSION _ CODES . GING ER B READ ) ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has G inger bread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEnvironment . is External Storage Remov able () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( VERSION _ CODES . F RO YO ) ĊĠĠĠ Ġinternal Ġfun Ġget External Cache Dir ( context : ĠContext ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has F roy o ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . external Cache Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcache Dir Ġ= Ġ"/ Android / data /" Ġ+ Ġcontext . packageName Ġ+ Ġ"/ cache /" ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( Environment . get External Storage Directory (). path Ġ+ Ġcache Dir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( VERSION _ CODES . GING ER B READ ) ĊĠĠĠ Ġinternal Ġfun Ġget Us able Space ( path : ĠFile ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has G inger bread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpath . usable Space ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstats Ġ= ĠStat Fs ( path . path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstats . block Size . to Long () Ġ* Ġstats . available Blocks . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġinternal Ġfun Ġcan Use For In Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate : ĠBitmap , Ġtarget Options : ĠBitmap Factory . Options ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Kit K at ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcandidate . width Ġ== Ġtarget Options . out Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġcandidate . height Ġ== Ġtarget Options . out Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtarget Options . in Sample Size Ġ== Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġtarget Options . out Width Ġ/ Ġtarget Options . in Sample Size ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġtarget Options . out Height Ġ/ Ġtarget Options . in Sample Size ĊĠĠĠĠĠĠĠ Ġval Ġbyte Count Ġ= Ġwidth Ġ* Ġheight Ġ* Ġget Bytes Per Pixel ( candidate . config ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbyte Count Ġ<= Ġcandidate . allocation Byte Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Bytes Per Pixel ( config : ĠBitmap . Config ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( config Ġ== ĠBitmap . Config . ARGB _ 8 8 8 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 4 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( config Ġ== ĠBitmap . Config . RGB _ 5 6 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( config Ġ== ĠBitmap . Config . ARGB _ 4 4 4 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( config Ġ== ĠBitmap . Config . ALPHA _ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhash Key For Disk ( key : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcache Key : ĠString ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Digest Ġ= ĠMessage Digest . getInstance (" MD 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Digest . update ( key . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Key Ġ= Ġbytes To HexString ( m Digest . digest ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Key Ġ= Ġkey . hashCode (). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcache Key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġbytes To HexString ( bytes : ĠByteArray ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbytes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhex Ġ= ĠInteger . to HexString ( 0 xFF Ġand Ġbytes [ i ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hex . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (' 0 ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( hex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetDefault Image Disk Cache Dir ( context : ĠContext ): ĠFile ? { ĊĠĠĠĠĠĠĠ Ġreturn Ġget Disk Cache Dir ( context , Ġ" image ") ĊĠĠĠ Ġ} Ċ Ċ } Ċ