package Ġcom . zp . z photo _ lib . ui . crop Ċ Ċ import Ġandroid . app . Progress Dialog Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . media . Ex if Interface Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Handler Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . text . TextUtils Ċ import Ġjava . io .* Ċ Ċ internal Ġclass ĠC rop Util Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS CHE ME _ FILE Ġ= Ġ" file " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS CHE ME _ CONTENT Ġ= Ġ" content " ĊĊĠĠĠĠĠĠĠ Ġfun Ġclose Sil ently ( c : ĠClose able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Ex if Rotation ( image File : ĠFile ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( image File Ġ== Ġnull ) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġex if Ġ= ĠEx if Interface ( image File . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġrecognize Ġa Ġsubset Ġof Ġorientation Ġtag Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ex if . getAttribute Int ( Ex if Interface . TAG _ OR IENTATION , ĠEx if Interface . OR IENTATION _ UNDEFINED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ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 Ġ-> ĠEx if Interface . OR IENTATION _ UNDEFINED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcopy Ex if Rotation ( source File : ĠFile ?, Ġdest File : ĠFile ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source File Ġ== Ġnull Ġ|| Ġdest File Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġex if Source Ġ= ĠEx if Interface ( source File . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġex if Dest Ġ= ĠEx if Interface ( dest File . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex if Dest . setAttribute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . TAG _ OR IENTATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex if Source . getAttribute ( Ex if Interface . TAG _ OR IENTATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex if Dest . save Attributes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget From Media Uri ( context : ĠContext , Ġresolver : ĠContent Resolver , Ġuri : ĠUri ?): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( SCHEME _ FILE Ġ== Ġuri . scheme ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( uri . path !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( SCHEME _ CONTENT Ġ== Ġuri . scheme ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfilePath Column Ġ= ĠarrayOf ( Media Store . Media Columns . DATA , ĠMedia Store . Media Columns . DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠCursor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġresolver . query ( uri , ĠfilePath Column , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull Ġ&& Ġcursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcolumnIndex Ġ= Ġif Ġ( uri . toString (). startsWith (" content :// com . google . android . gallery 3 d ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getColumnIndex ( Media Store . Media Columns . DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getColumnIndex ( Media Store . Media Columns . DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPic asa Ġimages Ġon ĠAPI Ġ 1 3 + ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġcursor . getString ( column Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( filePath )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGoogle ĠDrive Ġimages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget From Media Uri P fd ( context , Ġresolver , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġwe Ġcan Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Temp Filename ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġcontext . cacheDir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile . create TempFile (" image ", Ġ" tmp ", Ġoutput Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠoutputFile . absolute Path ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget From Media Uri P fd ( context : ĠContext , Ġresolver : ĠContent Resolver , Ġuri : ĠUri ?): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinput : ĠFileInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠFileOutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp fd Ġ= Ġresolver . open FileDescriptor ( uri , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġp fd !!. file Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= ĠFileInputStream ( fd ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Filename Ġ= Ġget Temp Filename ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= ĠFileOutputStream ( temp Filename ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( 4 0 9 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( read Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= Ġinput . read ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( bytes , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( temp Filename ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġwe Ġcan Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Sil ently ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Sil ently ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart Background Job ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity : ĠMon itored Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle : ĠString ?, Ġmessage : ĠString , Ġjob : ĠRunnable , Ġhandler : ĠHandler ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġthe Ġprogress Ġdialog Ġun cancel able , Ġso Ġthat Ġwe Ġcan Ġguarantee ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġthread Ġwill Ġbe Ġdone Ġbefore Ġthe Ġactivity Ġgetting Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠProgress Dialog . show ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , Ġtitle , Ġmessage , Ġtrue , Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread ( Background Job ( activity , Ġjob , Ġdialog , Ġhandler )). start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġclass ĠBackground Job ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġactivity : ĠMon itored Activity , Ġprivate Ġval Ġjob : ĠRunnable , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdialog : ĠProgress Dialog , Ġprivate Ġval Ġhandler : ĠHandler ĊĠĠĠ Ġ) Ġ: ĠMon itored Activity . Life Cycle Adapter (), ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcleanup Runner Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . remove Life Cycle Listener ( this @ Background Job ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dialog . window Ġ!= Ġnull ) Ġdialog . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . activity . add Life Cycle Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post ( cleanup Runner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Activity Destroyed ( activity : ĠMon itored Activity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġget Ġhere Ġonly Ġwhen Ġthe Ġon Destroyed Ġbeing Ġcalled Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġcleanup Runner . ĠSo , Ġrun Ġit Ġnow Ġand Ġremove Ġit Ġfrom Ġthe Ġqueue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup Runner . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( cleanup Runner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Activity Stopped ( activity : ĠMon itored Activity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . hide () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Activity Started ( activity : ĠMon itored Activity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }