/* ĠCopyright Ġ 2 0 2 0 ĠRed warp Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠG if Wall paper ĠContributors Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġnet . red warp . gif wall paper . data Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġapp . red warp . gif . decoder . Parser Ċ import Ġapp . red warp . gif . decoder . descriptors . Gif Descriptor Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġnet . red warp . gif wall paper . util . FileUtils Ċ import Ġjava . io . File Ċ Ċ internal Ġclass ĠWall paper LiveData ( private Ġval Ġcontext : ĠContext ) Ġ: ĊĠĠĠ ĠLive Data < Wall paper Status >() Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcurrent Uri : ĠUri ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlocal Uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Value ( Wall paper Status . Loading ) ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Initial Value () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload New Gif ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġcurrent Uri ) Ġreturn ĊĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ( Wall paper Status . Loading ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied Uri Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . copy File Loc ally ( context , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( copied Uri Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ( Wall paper Status . Not Set ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Gif Descriptor ( copied Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup Old Uri ( local Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Uri Ġ= Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Uri Ġ= Ġcopied Uri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore Current Wall paper Uri ( context , Ġcopied Uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ Ġsuspend Ġfun Ġload Gif Descriptor ( uri : ĠUri ): ĠWall paper Status Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . content Resolver . open InputStream ( uri ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġif Ġ( inputStream Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWall paper Status . Not Set ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWall paper Status . Wall paper ( Parser . parse ( inputStream )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWall paper Status . Not Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Gif () Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Value ( Wall paper Status . Not Set ) ĊĠĠĠĠĠĠĠ Ġcleanup Old Uri ( local Uri ) ĊĠĠĠĠĠĠĠ Ġstore Current Wall paper Uri ( context , Ġnull ) ĊĠĠĠĠĠĠĠ Ġcurrent Uri Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlocal Uri Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Initial Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri : ĠUri ? Ġ= Ġload Current Wall paper Uri ( context ) ĊĠĠĠĠĠĠĠ Ġlocal Uri Ġ= Ġuri ĊĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ( Wall paper Status . Not Set ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Gif Descriptor ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Current Wall paper Uri ( context : ĠContext ): ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( SHARED _ PRE F _ NAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġurl String Ġ= Ġshared Preferences . getString ( KEY _ WALL P AP ER _ URI , Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn Ġurl String ?. let Ġ{ ĠUri . parse ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstore Current Wall paper Uri ( context : ĠContext , Ġuri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( SHARED _ PRE F _ NAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences . edit (). putString ( KEY _ WALL P AP ER _ URI , Ġuri . toString ()). apply () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences . edit (). remove ( KEY _ WALL P AP ER _ URI ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcleanup Old Uri ( uri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġuri ?. path Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠWall paper Status Ġ{ ĊĠĠĠ Ġobject ĠNot Set Ġ: ĠWall paper Status () ĊĠĠĠ Ġobject ĠLoading Ġ: ĠWall paper Status () ĊĠĠĠ Ġdata Ġclass ĠWall paper ( val Ġuri : ĠG if Descriptor ) Ġ: ĠWall paper Status () Ċ } Ċ