package Ġcom . z eb ro studio . rx low poly . internal Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Media Store Ċ import Ġcom . z eb ro studio . rx low poly . internal . exceptions . Invalid File Exception Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ Ċ private Ġconst Ġval ĠINVALID _ FILE _ EXCEPTION _ MESSAGE Ġ= Ġ" File Ġis Ġnot Ġwritable " Ċ private Ġconst Ġval ĠINVALID _ URI _ EXCEPTION _ MESSAGE Ġ= Ġ" Uri Ġis Ġnot Ġwritable " Ċ Ċ interface ĠStorage Helper Ġ{ ĊĠ Ġfun Ġis Readable ( file : ĠFile ): ĠBoolean ĊĠ Ġfun Ġwrite Bitmap ( bitmap : ĠBitmap , Ġfile : ĠFile ) ĊĠ Ġfun Ġwrite Bitmap ( context : ĠContext , Ġbitmap : ĠBitmap , Ġuri : ĠUri ) Ċ } Ċ Ċ class ĠStorage Helper Impl Ġ: ĠStorage Helper Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġwhether Ġa Ġ[ File ] Ġis Ġreadable Ġor Ġnot . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġfile ĠThe Ġinput Ġ[ File ]. ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġis Readable ( file : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( file . can Read ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠWrites Ġa Ġbitmap Ġinto Ġa Ġspecified Ġfile . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġbitmap ĠThe Ġgenerated Ġlow poly Ġ[ Bitmap ]. ĊĠĠ Ġ* Ġ@ param Ġfile ĠThe Ġdestination Ġ[ Uri ] Ġto Ġwrite Ġthe Ġ[ Bitmap ] Ġto . ĊĠĠ Ġ* Ġ@ throws ĠInvalid File Exception Ġif Ġthe Ġdestination Ġ[ File ] Ġis Ġnot Ġwritable . ĊĠĠ Ġ*/ ĊĠ Ġ@ Throws ( Invalid File Exception :: class ) ĊĠ Ġoverride Ġfun Ġwrite Bitmap ( bitmap : ĠBitmap , Ġfile : ĠFile ) Ġ{ ĊĠĠĠ Ġif Ġ( is Writable ( file )) Ġ{ ĊĠĠĠĠĠ Ġwith ( File OutputStream ( file )) Ġ{ ĊĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , Ġthis ) ĊĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthrow ĠInvalid File Exception ( INVALID _ FILE _ EXCEPTION _ MESSAGE ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠWrites Ġa Ġbitmap Ġinto Ġa Ġspecified Ġ{@ param Ġuri } ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġcontext ĠThe Ġapplication Ġ[ Context ] ĊĠĠ Ġ* Ġ@ param Ġbitmap ĠThe Ġgenerated Ġlow poly Ġ[ Bitmap ] ĊĠĠ Ġ* Ġ@ param Ġuri ĠThe Ġdestination Ġ[ Uri ] Ġto Ġwrite Ġthe Ġ[ Bitmap ] Ġto ĊĠĠ Ġ* Ġ@ throws ĠInvalid File Exception Ġif Ġthe Ġdestination Ġ[ Uri ] Ġis Ġnot Ġwritable ĊĠĠ Ġ*/ ĊĠ Ġ@ Throws ( Invalid File Exception :: class ) ĊĠ Ġoverride Ġfun Ġwrite Bitmap ( context : ĠContext , Ġbitmap : ĠBitmap , Ġuri : ĠUri ) Ġ{ ĊĠĠĠ Ġif Ġ( is Writable ( context , Ġuri )) Ġ{ ĊĠĠĠĠĠ Ġwith ( File ( uri . path )) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Bitmap ( bitmap , Ġthis ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthrow ĠInvalid File Exception ( INVALID _ URI _ EXCEPTION _ MESSAGE ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġtrue Ġif Ġa Ġthe Ġspecified Ġis Ġwritable . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġfile ĠThe Ġoutput Ġfile . ĊĠĠ Ġ* Ġ@ return ĠBoolean . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġis Writable ( file : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( file . can Write ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġspecified Ġuri Ġis Ġwritable . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġuri ĠThe Ġoutput Ġuri . ĊĠĠ Ġ* Ġ@ return ĠBoolean . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġis Writable ( context : ĠContext , Ġuri : ĠUri ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġis Writable ( File ( getPath ( context , Ġuri ))) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠExtract s Ġthe Ġfile Ġpath Ġfrom Ġan Ġuri . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġcontext ĠThe Ġapplication Ġcontext . ĊĠĠ Ġ* Ġ@ param Ġuri ĠThe Ġsource Ġuri . ĊĠĠ Ġ* Ġ@ return Ġnullable Ġ[ File ] Ġpath Ġas Ġ[ String ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Throws ( Invalid File Exception :: class ) ĊĠ Ġprivate Ġfun ĠgetPath ( context : ĠContext , Ġuri : ĠUri ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= ĠFile ( uri . path ) ĊĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġuri . path ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġcursor : ĠCursor ? Ġ= Ġnull ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( Media Store . Images . Media . DATA ) ĊĠĠĠĠĠ Ġcursor Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠ Ġ. query ( uri , Ġprojection , Ġnull , Ġnull , Ġnull ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval ĠcolumnIndex Ġ= Ġcursor . getColumnIndex OrThrow ( Media Store . Images . Media . DATA ) ĊĠĠĠĠĠ Ġcursor . moveTo First () ĊĠĠĠĠĠ Ġval Ġs Ġ= Ġcursor . getString ( column Index ) ĊĊĠĠĠĠĠ Ġreturn Ġs ĊĠĠĠ Ġ} Ġcatch Ġ( n pe : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠInvalid File Exception ( INVALID _ URI _ EXCEPTION _ MESSAGE ) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġcursor ?. close () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }