package Ġcom . she ve lev . my _ foot prints _ re master ed . storage s . files Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . ex if interface . media . Ex if Interface Ċ import Ġcom . she ve lev . my _ foot prints _ re master ed . utils . id _ hash . Id Util Ċ import Ġjava . io . File Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠBitmap Files Helper Impl Ċ @ Inject Ċ constructor ( ĊĠĠĠ Ġprivate Ġval Ġapp Context : ĠContext Ċ ) Ġ: ĠBitmap Files Helper Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ COMPRESS _ RATE Ġ= Ġ 7 5 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Uri ToFile ( uri : ĠUri , Ġtarget File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Context . content Resolver . open InputStream ( uri ). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmark Supported Ġ= Ġinput !!. mark Supported () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġex if Orientation Ġ= Ġif ( mark Supported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . mark ( Int . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface ( input ). getAttribute Int ( Ex if Interface . TAG _ OR IENTATION , ĠEx if Interface . OR IENTATION _ UNDEFINED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ UNDEFINED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( mark Supported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! need To Rotate ( ex if Orientation )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget File . output Stream (). use Ġ{ Ġfile Out Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . copy To ( file Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġrotate Bitmap ( Bitmap Factory . decode Stream ( input ), Ġex if Orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Bitmap ToFile ( bitmap , Ġtarget File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Bitmap ToFile ( bitmap : ĠBitmap , Ġtarget File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget File . output Stream (). use Ġ{ Ġfile Out Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . JPEG , ĠDEFAULT _ COMPRESS _ RATE , Ġfile Out ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave B ites ToFile ( bytes : ĠByteArray , Ġtarget File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget File . output Stream (). use Ġ{ Ġfile Out Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Out . write ( bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck And Correct Orientation ( file : ĠFile ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġex if Orientation Ġ= ĠEx if Interface ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAttribute Int ( Ex if Interface . TAG _ OR IENTATION , ĠEx if Interface . OR IENTATION _ UNDEFINED ) ĊĊĠĠĠĠĠĠĠ Ġif ( need To Rotate ( ex if Orientation )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Bitmap ToFile ( rotate Bitmap ( Bitmap Factory . decode File ( file . absolute Path ), Ġex if Orientation ), Ġfile ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate TempFile (): ĠFile Ġ= ĠFile . create TempFile (" tmp _", Ġcreate FileName (), Ġapp Context . cacheDir ) ĊĊĠĠĠ Ġoverride Ġfun Ġget OrCreate Image File (): ĠFile Ġ= Ġget OrCreate Image File ( create FileName ()) ĊĊĠĠĠ Ġoverride Ġfun Ġget OrCreate Image File ( fileName : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( app Context . files Dir , Ġ" photos ") ĊĠĠĠĠĠĠĠ Ġif (! dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir . mkdir () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( dir , ĠfileName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcopy File ( source File : ĠFile , Ġtarget File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsource File . copy To ( target File , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete File ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠreadFile Content ( file : ĠFile ): ĠByteArray Ġ= Ġfile . read Bytes () ĊĊĠĠĠ Ġprivate Ġfun Ġcreate FileName () Ġ= Ġ"${ Id Util . generate Long Id ()}. jpg " ĊĊĠĠĠ Ġprivate Ġfun Ġrotate Bitmap ( source : ĠBitmap , Ġex if Orientation : ĠInt ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrotate Angle Ġ= Ġwhen ( ex if Orientation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 9 0 Ġ-> Ġ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 1 8 0 Ġ-> 1 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 2 7 0 Ġ-> Ġ 2 7 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( rotate Angle Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsource ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate Angle . toFloat ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap . create Bitmap ( source , Ġ 0 , Ġ 0 , Ġsource . width , Ġsource . height , Ġmatrix , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġneed To Rotate ( ex if Orientation : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġex if Orientation Ġ== ĠEx if Interface . OR IENTATION _ ROT ATE _ 9 0 Ġ|| ĊĠĠĠĠĠĠĠ Ġex if Orientation Ġ== ĠEx if Interface . OR IENTATION _ ROT ATE _ 1 8 0 Ġ|| ĊĠĠĠĠĠĠĠ Ġex if Orientation Ġ== ĠEx if Interface . OR IENTATION _ ROT ATE _ 2 7 0 Ċ Ċ }