package Ġcom . element ary . tasks . core . utils Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Activity NotFoundException Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . content . Clipboard Manager Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Environment Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Patterns Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . String Res Ċ import Ġcom . element ary . tasks . R Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ class ĠPhoto Selection Util ( ĊĠ Ġprivate Ġval Ġactivity : ĠActivity , ĊĠ Ġprivate Ġval Ġdialog ues : ĠDialog ues , ĊĠ Ġprivate Ġval Ġurl Supported : ĠBoolean Ġ= Ġtrue , ĊĠ Ġprivate Ġval Ġm Callback : ĠUri Callback ? Ċ ) Ġ{ ĊĊĠ Ġprivate Ġvar Ġimage Uri : ĠUri ? Ġ= Ġnull ĊĊĠ Ġfun Ġselect Image () Ġ{ ĊĠĠĠ Ġval Ġhas Camera Ġ= ĠModule . has Camera ( activity ) ĊĠĠĠ Ġval Ġitems Ġ= Ġif Ġ( url Supported ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( has Camera ) Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . gallery ), ĊĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . take _ a _ shot ), ĊĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . from _ url ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . gallery ), ĊĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . from _ url ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġif Ġ( has Camera ) Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . gallery ), ĊĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . take _ a _ shot ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( getString ( R . string . gallery )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbuilder Ġ= Ġdialog ues . get Material Dialog ( activity ) ĊĠĠĠ Ġbuilder . setTitle ( R . string . image ) ĊĠĠĠ Ġbuilder . set Items ( items ) Ġ{ Ġdialog , Ġitem Ġ-> ĊĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠ Ġif Ġ( has Camera ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġpick From Gallery () ĊĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġtake Photo () ĊĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġcheck Clipboard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġpick From Gallery () ĊĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġcheck Clipboard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . create (). show () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġpick From Gallery () Ġ{ ĊĠĠĠ Ġif Ġ(! check Sd Permission ( REQUEST _ SD _ CARD )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġintent Ġ= ĠIntent ( Intent . ACTION _ GET _ CONTENT ) ĊĠĠĠ Ġintent . type Ġ= Ġ" image /* " ĊĠĠĠ Ġif Ġ( url Supported ) Ġ{ ĊĠĠĠĠĠ Ġintent Ġ= ĠIntent ( Intent . ACTION _ OPEN _ DOCUMENT ) ĊĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠ Ġintent . type Ġ= Ġ" image /* " ĊĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ ALLOW _ MULTIPLE , Ġtrue ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcho oser Ġ= ĠIntent . create Chooser ( intent , ĠgetString ( R . string . gallery )) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġactivity . startActivity For Result ( cho oser , ĠP ICK _ FROM _ G ALL ERY ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠ Ġcheck Sd Permission ( REQUEST _ SD _ CARD ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Sd Permission ( code : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠPermissions . check Permission ( activity , Ġcode , ĠPermissions . READ _ EXTERNAL , ĠPermissions . WRITE _ EXTERNAL ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Camera Permission ( code : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠPermissions . check Permission ( activity , Ġcode , ĠPermissions . READ _ EXTERNAL , ĠPermissions . WRITE _ EXTERNAL , ĠPermissions . CAMERA ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġshow Photo ( image Uri : ĠUri ) Ġ{ ĊĠĠĠ ĠTim ber . d (" show Photo : Ġ% s ", Ġimage Uri ) ĊĠĠĠ Ġm Callback ?. on Image Selected ( image Uri , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġtake Photo () Ġ{ ĊĠĠĠ Ġif Ġ(! check Camera Permission ( REQUEST _ CAMERA )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġpicture Intent Ġ= ĠIntent ( Media Store . ACTION _ IMAGE _ CAPTURE ) ĊĠĠĠ Ġif Ġ( picture Intent . resolve Activity ( activity . package Manager ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( Module . is N ou gat ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( picture Intent . resolve Activity ( activity . package Manager ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphoto File Ġ= Ġcreate Image File () ĊĠĠĠĠĠĠĠ Ġimage Uri Ġ= ĠUri Util . get Uri ( activity , Ġphoto File ) ĊĠĠĠĠĠĠĠ Ġpicture Intent . putExtra ( Media Store . EXTRA _ OUTPUT , Ġimage Uri ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġactivity . startActivity For Result ( picture Intent , ĠP ICK _ FROM _ CAMERA ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcheck Camera Permission ( REQUEST _ CAMERA ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠ Ġvalues . put ( Media Store . Images . Media . TITLE , Ġ" Picture ") ĊĠĠĠĠĠ Ġvalues . put ( Media Store . Images . Media . DESCRIPTION , Ġ" From Ġyour ĠCamera ") ĊĠĠĠĠĠ Ġimage Uri Ġ= Ġactivity . content Resolver . insert ( Media Store . Images . Media . EXTERNAL _ CONTENT _ URI , Ġvalues ) ĊĠĠĠĠĠ Ġpicture Intent . putExtra ( Media Store . EXTRA _ OUTPUT , Ġimage Uri ) ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity . startActivity For Result ( picture Intent , ĠP ICK _ FROM _ CAMERA ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Camera Permission ( REQUEST _ CAMERA ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Image File (): ĠFile Ġ{ ĊĠĠĠ Ġval Ġtime Stamp Ġ= ĠSimpleDateFormat (" yyyy MM dd _ HH mm ss ", ĠLocale . US ). format ( Date ()) ĊĠĠĠ Ġval Ġimage FileName Ġ= Ġ" IMG _" Ġ+ Ġtime Stamp Ġ+ Ġ"_" ĊĠĠĠ Ġval Ġstorage Dir Ġ= Ġget External Files Dir ( Environment . DIRECTORY _ PI CTURE S ) ĊĠĠĠ Ġif Ġ(! storage Dir . exists ()) Ġstorage Dir . mkdir s () ĊĠĠĠ Ġreturn ĠFile ( storage Dir , Ġ"$ image FileName . jpg ") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget External Files Dir ( directory P ictures : ĠString ): ĠFile Ġ{ ĊĠĠĠ Ġval Ġsd Ġ= ĠEnvironment . get External Storage Directory () ĊĠĠĠ Ġreturn ĠFile ( sd , ĠFile ( directory P ictures , Ġ" Reminder "). toString ()) ĊĠ Ġ} ĊĊĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") ĊĠ Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠ Ġif Ġ( Permissions . check Permission ( grant Results )) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠ ĠREQUEST _ SD _ CARD Ġ-> Ġpick From Gallery () ĊĠĠĠĠĠĠĠ ĠREQUEST _ CAMERA Ġ-> Ġtake Photo () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠ ĠTim ber . d (" on Activity Result : Ġ% d , Ġ% d , Ġ% s ", Ġrequest Code , ĠresultCode , Ġdata ) ĊĠĠĠ Ġif Ġ( request Code Ġ== ĠP ICK _ FROM _ CAMERA Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠ Ġval Ġuri Ġ= Ġimage Uri Ġ?: Ġreturn ĊĠĠĠĠĠ Ġshow Photo ( uri ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( request Code Ġ== ĠP ICK _ FROM _ G ALL ERY Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠ Ġimage Uri Ġ= Ġdata ?. data ĊĠĠĠĠĠ Ġval Ġclip Data Ġ= Ġdata ?. clip Data ĊĠĠĠĠĠ Ġval Ġuri Ġ= Ġimage Uri ĊĠĠĠĠĠ Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Photo ( uri ) ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( clip Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Callback ?. on Image Selected ( null , Ġclip Data ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Clipboard () Ġ{ ĊĠĠĠ Ġval Ġclipboard Ġ= Ġactivity . getSystem Service ( Context . CLIP BOARD _ SERVICE ) Ġas ĠClip board Manager ? ĊĠĠĠĠĠ Ġ?: Ġreturn ĊĠĠĠ Ġif Ġ( clipboard . has Primary Clip ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġtext Ġ= Ġclipboard . primary Clip ?. getItem At ( 0 )?. text ĊĠĠĠĠĠ Ġif Ġ( text Ġ!= Ġnull Ġ&& ĠPattern s . WEB _ URL . matcher ( text ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Clipboard Dialog ( text . toString ()) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Url Dialog () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġshow Url Dialog () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġshow Url Dialog () Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= Ġdialog ues . get Material Dialog ( activity ) ĊĠĠĠ Ġval Ġview Ġ= Ġcom . element ary . tasks . databinding . View Url Field Binding . inflate ( LayoutInflater . from ( activity )) ĊĠĠĠ Ġbuilder . setView ( view . root ) ĊĠĠĠ Ġbuilder . set Positive Button ( R . string . download ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠ Ġdownload Url ( view . url Field . text . toString (). trim ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . set Negative Button ( R . string . cancel ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . create (). show () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġshow Clipboard Dialog ( text : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= Ġdialog ues . get Material Dialog ( activity ) ĊĠĠĠ Ġbuilder . setMessage ( text ) ĊĠĠĠ Ġbuilder . set Positive Button ( R . string . download ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠ Ġdownload Url ( text ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . set Negative Button ( R . string . cancel ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠ Ġshow Url Dialog () ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . create (). show () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdownload Url ( url : ĠString ) Ġ{ ĊĠĠĠ Ġif Ġ( Patterns . WEB _ URL . matcher ( url ). matches ()) Ġ{ ĊĠĠĠĠĠ Ġlaunch Default Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠPic asso . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith UI Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Callback ?. on Bitmap Ready ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith UI Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , ĠR . string . failed _ to _ download , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" download Url : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠ Ġwith UI Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , ĠR . string . failed _ to _ download , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠToast . makeText ( activity , ĠR . string . wrong _ url , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠgetString (@ String Res Ġres : ĠInt ) Ġ= Ġactivity . getString ( res ) ĊĊĠ Ġinterface ĠUri Callback Ġ{ ĊĠĠĠ Ġfun Ġon Image Selected ( uri : ĠUri ?, Ġclip Data : ĠClip Data ?) ĊĊĠĠĠ Ġfun Ġon Bitmap Ready ( bitmap : ĠBitmap ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠP ICK _ FROM _ G ALL ERY Ġ= Ġ 2 5 ĊĠĠĠ Ġprivate Ġconst Ġval ĠP ICK _ FROM _ CAMERA Ġ= Ġ 2 6 ĊĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ SD _ CARD Ġ= Ġ 1 1 1 2 ĊĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ CAMERA Ġ= Ġ 1 1 1 3 ĊĠ Ġ} Ċ } Ċ