package Ġdev . j atz uk . snow wall paper . utilities Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . graphics . drawable . to Bitmap Ċ import Ġdev . j atz uk . snow wall paper . R Ċ import Ġdev . j atz uk . snow wall paper . data . preferences . Texture Cache Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . IOException Ċ Ċ object ĠTexture Provider Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtexture Cache Ġ= ĠTexture Cache . getInstance () ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Texture Provider " ĊĊĠĠĠ Ġfun Ġsave Image ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġtexture Type : ĠTexture Type , ĊĠĠĠĠĠĠĠ Ġbitmap : ĠBitmap ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġ@ Drawable Res Ġresource Id : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbmp Ġ= Ġbitmap Ġ?: Ġdecode Sample d Bitmap From Resource ( context , Ġresource Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġstore Image ( context , Ġbmp , Ġtexture Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result ) Ġcontext . getString ( R . string . toast _ image _ storage _ succeeded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcontext . getString ( R . string . toast _ image _ storage _ failed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġmessage , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Texture ( context : ĠContext , Ġtexture Type : ĠTexture Type ): ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Texture Ġ= Ġtexture Cache [ texture Type ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Texture Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d (" got Ġtexture Ġ${ texture Type . name } Ġfrom Ġcache ", ĠTAG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Texture ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" requested Ġtexture Ġ${ texture Type . name } Ġnot Ġfound Ġin Ġcache , Ġtrying Ġto Ġretrieve Ġfrom Ġdisk ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Stream ( context . open File Input ( texture Type . path )). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtexture Cache [ texture Type ] Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d (" texture Ġ$ texture Type Ġnot Ġfound Ġin Ġdisk Ġusing Ġdefault ", ĠTAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġassign Default Texture ( context , Ġtexture Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . open File Output ( texture Type . path , ĠContext . MODE _ PRIVATE ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtexture Cache [ texture Type ] Ġ= Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e (" Failed Ġto Ġload Ġimage Ġtype : Ġ${ texture Type . name } Ġfrom Ġinternal Ġstorage ", ĠTAG , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassign Default Texture ( context : ĠContext , Ġtexture Type : ĠTexture Type ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresource Id Ġ= Ġwhen Ġ( texture Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTexture Type . S NO WF ALL _ TEXTURE Ġ-> ĠR . drawable . texture _ snow fall _ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTexture Type . S NOW FL A KE _ TEXTURE Ġ-> ĠR . drawable . texture _ snow flake _ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTexture Type . BACKGROUND _ IMAGE Ġ-> ĠR . drawable . background _ image _ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠContext Compat . get Drawable ( context , Ġresource Id ) !!. to Bitmap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Stored Images ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . files Dir . list Files ()?. forEach Ġ{ Ġit . delete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e (" file Ġcannot Ġbe Ġdeleted ", ĠTAG , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtexture Cache . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġdecode Sample d Bitmap From Resource ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġ@ Drawable Res Ġresource Id : ĠInt ĊĠĠĠ Ġ): ĠBitmap Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( height , Ġwidth ) Ġ= ĠDisplay Metrics (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( context Ġas ĠAppCompatActivity ). window Manager . default Display . get Metrics ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy dpi . toInt () Ġto Ġx dpi . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠBitmap Factory . Options (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Just Decode Bounds Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Resource ( context . resources , Ġresource Id , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Sample Size Ġ= Ġcalculate In Sample Size ( this , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Just Decode Bounds Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Resource ( context . resources , Ġresource Id , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate In Sample Size ( ĊĠĠĠĠĠĠĠ Ġoptions : ĠBitmap Factory . Options , ĊĠĠĠĠĠĠĠ Ġrequired Height : ĠInt , ĊĠĠĠĠĠĠĠ Ġrequired Width : ĠInt ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( height , Ġwidth ) Ġ= Ġoptions . run Ġ{ Ġout Height Ġto Ġout Width Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġsample Size Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( height Ġ> Ġrequired Height Ġ|| Ġwidth Ġ> Ġrequired Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Height Ġ= Ġheight Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Width Ġ= Ġwidth Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( half Height Ġ/ Ġsample Size Ġ>= Ġrequired Height Ġ&& Ġhalf Width Ġ/ Ġsample Size Ġ>= Ġrequired Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsample Size Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsample Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġstore Image ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġbitmap : ĠBitmap , ĊĠĠĠĠĠĠĠ Ġtexture Type : ĠTexture Type ĊĠĠĠ Ġ): ĠBoolean Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtexture Cache [ texture Type ] Ġ= Ġbitmap ĊĠĠĠĠĠĠĠ Ġval Ġ( compress Format , Ġcompress Quality ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( texture Type Ġ== ĠTexture Type . BACKGROUND _ IMAGE ) ĠBitmap . Compress Format . JPEG Ġto Ġ 7 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠBitmap . Compress Format . PNG Ġto Ġ 1 0 0 ĊĊĠĠĠĠĠĠĠ Ġcontext . open File Output ( texture Type . path , ĠContext . MODE _ PRIVATE ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( compress Format , Ġcompress Quality , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠTexture Type ( val Ġpath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠS NO WF ALL _ TEXTURE (" snow fall _ texture . png "), ĊĠĠĠĠĠĠĠ ĠS NOW FL A KE _ TEXTURE (" snow flake _ texture . png "), ĊĠĠĠĠĠĠĠ ĠBACK GROUND _ IMAGE (" background _ image . png "), ĊĠĠĠ Ġ} Ċ } Ċ