package Ġcom . github . dr jack y . image picker Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . github . dr jack y . image picker . constant . Image Provider Ċ import Ġcom . github . dr jack y . image picker . provider . Camera Provider Ċ import Ġcom . github . dr jack y . image picker . provider . Compression Provider Ċ import Ġcom . github . dr jack y . image picker . provider . Crop Provider Ċ import Ġcom . github . dr jack y . image picker . provider . Gallery Provider Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠPick ĠImage Ċ Ġ* Ċ Ġ* Ġ@ author ĠD hav al ĠP ate l Ċ Ġ* Ġ@ version Ġ 1 . 0 Ċ Ġ* Ġ@ since Ġ 0 4 ĠJanuary Ġ 2 0 1 9 Ċ Ġ*/ Ċ class ĠImage Picker Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" image _ picker " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠKey Ġto ĠSave / Retrieve ĠImage ĠFile Ġstate ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ IMAGE _ URI Ġ= Ġ" state . image _ uri " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Cancelled Intent ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġcontext . getString ( R . string . error _ task _ cancelled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Image Picker . EXTRA _ ERROR , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġintent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Gallery Provider : ĠGallery Provider ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Camera Provider : ĠCamera Provider ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Crop Provider : ĠC rop Provider ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Compression Provider : ĠCompression Provider ĊĊĠĠĠ Ġprivate Ġval Ġgallery Launcher Ġ= ĊĠĠĠĠĠĠĠ Ġregister For Activity Result ( Activity Result Contracts . Start Activity For Result ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Gallery Provider ?. handle Result ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġcamera Launcher Ġ= ĊĠĠĠĠĠĠĠ Ġregister For Activity Result ( Activity Result Contracts . Start Activity For Result ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Provider ?. handle Result ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġcrop Launcher Ġ= ĊĠĠĠĠĠĠĠ Ġregister For Activity Result ( Activity Result Contracts . Start Activity For Result ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Crop Provider . handle Result ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠUri Ġprovided Ġby ĠGallery Provider Ġor ĠCamera Provider Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Image Uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠUri Ġprovided Ġby ĠC rop Provider Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Crop Uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġrestore InstanceState ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġload Bundle ( savedInstanceState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRestore Ġsaved Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrestore InstanceState ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Image Uri Ġ= ĠsavedInstanceState . get Parcelable ( STATE _ IMAGE _ URI ) Ġas ĠUri ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSave Ġall Ġappropriate Ġactivity Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( STATE _ IMAGE _ URI , Ġm Image Uri ) ĊĠĠĠĠĠĠĠ Ġm Camera Provider ?. on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġm Crop Provider . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParse ĠIntent ĠBundle Ġand Ġinitialize Ġvariables ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Bundle ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠC rop ĠProvider ĊĠĠĠĠĠĠĠ Ġm Crop Provider Ġ= ĠC rop Provider ( this ) Ġ{ Ġcrop Launcher . launch ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġm Crop Provider . on Restore InstanceState ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠCompression ĠProvider ĊĠĠĠĠĠĠĠ Ġm Compression Provider Ġ= ĠCompression Provider ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRetrieve ĠImage ĠProvider ĊĠĠĠĠĠĠĠ Ġval Ġprovider : ĠImage Provider ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent ?. get Serializable Extra ( Image Picker . EXTRA _ IMAGE _ PROVIDER ) Ġas ĠImage Provider ? ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠGallery / Camera ĠProvider ĊĠĠĠĠĠĠĠ Ġwhen Ġ( provider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Provider . G ALL ERY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gallery Provider Ġ= ĠGallery Provider ( this ) Ġ{ Ġgallery Launcher . launch ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPick ĠGallery ĠImage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState Ġ?: Ġm Gallery Provider ?. start Intent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Provider . CAMERA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Provider Ġ= ĠCamera Provider ( this , Ġfalse ) Ġ{ Ġcamera Launcher . launch ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Provider ?. on Restore InstanceState ( savedInstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPick ĠCamera ĠImage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState Ġ?: Ġm Camera Provider ?. start Intent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Provider . FRONT _ CAMERA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Provider Ġ= ĠCamera Provider ( this , Ġtrue ) Ġ{ Ġcamera Launcher . launch ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Provider ?. on Restore InstanceState ( savedInstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry ĠPick ĠFront ĠCamera ĠImage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState Ġ?: Ġm Camera Provider ?. start Intent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSomething Ġwent ĠWrong ! ĠThis Ġcase Ġshould Ġnever Ġhappen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Image Ġprovider Ġcan Ġnot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetError ( getString ( R . string . error _ task _ cancelled )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDispatch Ġincoming Ġresult Ġto Ġthe Ġcorrect Ġprovider . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġm Camera Provider ?. on Request Permissions Result ( request Code ) ĊĠĠĠĠĠĠĠ Ġm Gallery Provider ?. on Request Permissions Result ( request Code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle ĠActivity ĠBack ĠPress ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Result Cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ{@ link ĠCamera Provider } Ġand Ġ{@ link ĠGallery Provider } ĠResult Ġwill Ġbe Ġavailable Ġhere . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuri ĠCapture / Gallery Ġimage Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Image ( uri : ĠUri , Ġis Camera : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Image Uri Ġ= Ġuri ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Crop Provider . is Crop Enabled () Ġ-> Ġm Crop Provider . start Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġuri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop O val Ġ= Ġm Crop Provider . is Crop O val Enabled (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Free Style Ġ= Ġm Crop Provider . is Crop Free Style Enabled (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Camera Ġ= Ġis Camera ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Compression Provider . is Resize Required ( uri ) Ġ-> Ġm Compression Provider . compress ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġset Result ( uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ{@ link ĠC rop Providers } ĠResult Ġwill Ġbe Ġavailable Ġhere . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġcompression Ġis Ġenable / required . ĠIf Ġyes Ġthen Ġstart Ġcompression Ġelse Ġreturn Ġresult . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuri ĠC rop Ġimage Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Crop Image ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Crop Uri Ġ= Ġuri ĊĊĠĠĠĠĠĠĠ Ġm Camera Provider ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete ĠCamera Ġfile Ġafter Ġcrop . ĠElse Ġthere Ġwill Ġbe Ġtwo Ġimage Ġfor Ġthe Ġsame Ġaction . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġof ĠGallery ĠProvider , Ġwe Ġwill Ġget Ġoriginal Ġimage Ġpath , Ġso Ġwe Ġwill Ġnot Ġdelete Ġthat . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri . path ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFile ( it ). delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġm Camera Provider . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Image Uri Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Compression Provider . is Resize Required ( uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Compression Provider . compress ( uri ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ{@ link ĠCompression Provider } ĠResult Ġwill Ġbe Ġavailable Ġhere . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile ĠComp ressed Ġimage Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Compressed Image ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe Ġcase Ġwhen ĠC rop Ġis Ġnot Ġenabled ĊĠĠĠĠĠĠĠ Ġm Camera Provider ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete ĠCamera Ġfile Ġafter ĠCompress . ĠElse Ġthere Ġwill Ġbe Ġtwo Ġimage Ġfor Ġthe Ġsame Ġaction . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġof ĠGallery ĠProvider , Ġwe Ġwill Ġget Ġoriginal Ġimage Ġpath , Ġso Ġwe Ġwill Ġnot Ġdelete Ġthat . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// it . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġcrop Ġfile Ġis Ġnot Ġnull , ĠDelete Ġit Ġafter Ġcrop ĊĠĠĠĠĠĠĠ Ġm Crop Uri ?. path ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( it ). delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Crop Uri Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġset Result ( m Crop Uri !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet ĠResult , ĠImage Ġis Ġsuccessfully Ġcapture / pick ed / c ropped / compressed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuri Ġfinal Ġimage Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Result ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġintent . data Ġ= Ġuri ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Image Picker . EXTRA _ FILE _ PATH , Ġuri . path ) ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġintent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUser Ġhas Ġcancelled Ġthe Ġtask ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Result Cancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ C ANCE LED , Ġget Cancelled Intent ( this )) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠError Ġoccurred Ġwhile Ġprocessing Ġimage ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠError ĠMessage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetError ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Image Picker . EXTRA _ ERROR , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġset Result ( Image Picker . RESULT _ ERROR , Ġintent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} Ċ } Ċ