package Ġex po . modules . image picker . tasks Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroidx . ex if interface . media . Ex if Interface Ċ import Ġex po . modules . image picker . Ex if Data Handler Ċ import Ġex po . modules . image picker . Failed To Extract Video Metadata Exception Ċ import Ġex po . modules . image picker . Failed To WriteFile Exception Ċ import Ġex po . modules . image picker . Image Picker Constants . EX IF _ TAGS Ċ import Ġex po . modules . image picker . Image Picker Media Response Ċ import Ġex po . modules . image picker . Unknown Exception Ċ import Ġex po . modules . image picker . export ers . Image Exporter Ċ import Ġex po . modules . image picker . export ers . Image Exporter . Listener Ċ import Ġex po . modules . image picker . file providers . File Provider Ċ import Ġex po . modules . kotlin . Promise Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ Ċ open Ġclass ĠImage Result Task ( ĊĠ Ġprivate Ġval Ġpromise : ĠPromise , ĊĠ Ġprivate Ġval Ġuri : ĠUri , ĊĠ Ġprivate Ġval Ġcontent Resolver : ĠContent Resolver , ĊĠ Ġprivate Ġval Ġfile Provider : ĠFile Provider , ĊĠ Ġprivate Ġval Ġis Edited : ĠBoolean , ĊĠ Ġprivate Ġval Ġwith Ex if Data : ĠBoolean , ĊĠ Ġprivate Ġval Ġimage Exporter : ĠImage Exporter , ĊĠ Ġprivate Ġvar Ġex if Data Handler : ĠEx if Data Handler ?, ĊĠ Ġprivate Ġval Ġcoroutine Scope : ĠCor outine Scope Ċ ) Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠWe Ġneed Ġto Ġmake Ġcoroutine Ġwait Ġtill Ġthe Ġfile Ġis Ġgenerated , Ġwhile Ġthe Ġunderlying ĊĠĠ Ġ* Ġthread Ġis Ġfree Ġto Ġcontinue Ġexecuting Ġother Ġcor outines . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġsuspend Ġfun ĠgetFile (): ĠFile Ġ= Ġsuspend C ancellable Coroutine Ġ{ Ġcancell able Continuation Ġ-> ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval ĠoutputFile Ġ= Ġfile Provider . generate File () ĊĠĠĠĠĠ Ġcancell able Continuation . resume ( outputFile ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġcancell able Continuation . resume With Exception ( e ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠWe Ġneed Ġto Ġmake Ġcoroutine Ġwait Ġtill Ġthe Ġex if Ġdata Ġis Ġbeing Ġread , Ġwhile Ġthe Ġunderlying ĊĠĠ Ġ* Ġthread Ġis Ġfree Ġto Ġcontinue Ġexecuting Ġother Ġcor outines . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġsuspend Ġfun Ġget Ex if Data (): ĠBundle ? Ġ= Ġsuspend C ancellable Coroutine Ġ{ Ġcancell able Continuation Ġ-> ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġex if Ġ= Ġif Ġ( with Ex if Data ) Ġread Ex if () Ġelse Ġnull ĊĠĠĠĠĠ Ġcancell able Continuation . resume ( ex if ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġcancell able Continuation . resume With Exception ( e ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġexecute () Ġ{ ĊĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠgetFile () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Edited Ġ&& Ġwith Ex if Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġex if Data Handler ?. copy Ex if Data ( uri , Ġcontent Resolver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġex if Ġ= Ġget Ex if Data () ĊĠĠĠĠĠĠĠ Ġval Ġimage Exporter Handler Ġ= Ġobject Ġ: ĠListener Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Result ( out : ĠByteArrayOutputStream ?, Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠImage Picker Media Response . Image ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠUri . from File ( outputFile ). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġwidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġheight , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase 6 4 Ġ= Ġout ?. let Ġ{ ĠBase 6 4 . encode ToString ( it . toByteArray (), ĠBase 6 4 . NO _ WRAP ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex if Ġ= Ġex if ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . resolve ( response ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( cause : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . reject ( Failed To WriteFile Exception ( outputFile , Ġcause )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġimage Exporter . export ( uri , ĠoutputFile , Ġimage Exporter Handler ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpromise . reject ( Failed To Extract Video Metadata Exception ( e )) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpromise . reject ( Unknown Exception ( e )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġprivate Ġfun Ġread Ex if () Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠ Ġcontent Resolver . open InputStream ( uri )?. use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠ Ġval Ġex if Interface Ġ= ĠEx if Interface ( input ) ĊĠĠĠĠĠ ĠEX IF _ TAGS . forEach Ġ{ Ġ( type , Ġtag ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( ex if Interface . getAttribute ( tag ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" string " Ġ-> Ġput String ( tag , Ġex if Interface . getAttribute ( tag )) ĊĠĠĠĠĠĠĠĠĠ Ġ" int " Ġ-> Ġput Int ( tag , Ġex if Interface . getAttribute Int ( tag , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠ Ġ" double " Ġ-> Ġput Double ( tag , Ġex if Interface . getAttribute Double ( tag , Ġ 0 . 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠExplicit ly Ġget Ġlatitude , Ġlongitude , Ġalt itude Ġwith Ġtheir Ġspecific Ġaccessor Ġfunctions . ĊĠĠĠĠĠ Ġex if Interface . lat Long ?. let Ġ{ Ġlat Long Ġ-> ĊĠĠĠĠĠĠĠ Ġput Double ( Ex if Interface . TAG _ GPS _ LAT IT UDE , Ġlat Long [ 0 ]) ĊĠĠĠĠĠĠĠ Ġput Double ( Ex if Interface . TAG _ GPS _ LONG IT UDE , Ġlat Long [ 1 ]) ĊĠĠĠĠĠĠĠ Ġput Double ( Ex if Interface . TAG _ GPS _ ALT IT UDE , Ġex if Interface . get Alt itude ( 0 . 0 )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ