package Ġcom . lass i . presentation . crop per Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Port er D uff Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . lass i . R Ċ import Ġcom . lass i . common . utils .* Ċ import Ġcom . lass i . data . media . Mi Media Ċ import Ġcom . lass i . domain . media . L ass i Config Ċ import Ġcom . lass i . presentation . medi ad irectory . L ass i Media Picker Activity Ċ import Ġkotlinx . android . synt hetic . main . crop _ image _ activity .* Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠBuilt - in Ġactivity Ġfor Ġimage Ġcro pping .< br ></ br > Ċ Ġ* ĠUse Ġ[ Crop Image . activity ] Ġto Ġcreate Ġa Ġbuilder Ġto Ġstart Ġthis Ġactivity . Ċ Ġ*/ Ċ open Ġclass ĠC rop Image Activity Ġ: ĠAppCompatActivity (), ĠC rop ImageView . On Set Image Uri Complete Listener , ĊĠĠĠ ĠC rop ImageView . On Crop Image Complete Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Tag Ġ= ĠC rop Image Activity :: class . java . simple Name ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcrop Ġimage Ġview Ġlibrary Ġwidget Ġused Ġin Ġthe Ġactivity ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPers ist ĠURI Ġimage Ġto Ġcrop ĠURI Ġif Ġspecific Ġpermissions Ġare Ġrequired ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcrop Image Uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġthe Ġoptions Ġthat Ġwere Ġset Ġfor Ġthe Ġcrop Ġimage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcrop Image Options : ĠC rop Image Options ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet ĠAndroid Ġuri Ġto Ġsave Ġthe Ġc ropped Ġimage Ġinto .< br ></ br > ĊĠĠĠĠ Ġ* ĠUse Ġthe Ġgiven Ġin Ġoptions Ġor Ġcreate Ġa Ġtemp Ġfile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġoutput Uri : ĠUri ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Uri : ĠUri ? Ġ= Ġcrop Image Options ?. output Uri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Uri Ġ== Ġnull Ġ|| Ġoutput Uri Ġ== ĠUri . EMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġext Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options ?. output Compress Format Ġ== ĠBitmap . Compress Format . JPEG Ġ-> Ġ". jpg " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options ?. output Compress Format Ġ== ĠBitmap . Compress Format . PNG Ġ-> Ġ". png " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ". webp " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Uri Ġ= ĠUri . from File ( File . create TempFile (" c ropped ", Ġext , Ġcache Dir )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcreate Ġtemp Ġfile Ġfor Ġoutput Ġimage ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoutput Uri !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" New Api ") ĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . crop _ image _ activity ) ĊĠĠĠĠĠĠĠ Ġtoolbar . title Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= Ġintent . get Bundle Extra ( Crop Image . C ROP _ IMAGE _ EXTRA _ B UNDLE ) ĊĠĠĠĠĠĠĠ Ġcrop Image Uri Ġ= Ġbundle ?. get Parcelable ( Crop Image . C ROP _ IMAGE _ EXTRA _ SOURCE ) ĊĠĠĠĠĠĠĠ Ġcrop Image Options Ġ= Ġbundle ?. get Parcelable ( Crop Image . C ROP _ IMAGE _ EXTRA _ OPTIONS ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crop Image Uri Ġ== Ġnull Ġ|| Ġcrop Image Uri Ġ== ĠUri . EMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Crop Image . is Explicit Camera Permission Required ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequest Ġpermissions Ġand Ġhandle Ġthe Ġresult Ġin Ġon Request Permissions Result () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . CAMERA ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC rop Image . CAMERA _ CAPTURE _ PERMISSION S _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC rop Image . start Pick Image Activity ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Crop Image . is Read External Storage Permissions Required ( this , Ġcrop Image Uri !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequest Ġpermissions Ġand Ġhandle Ġthe Ġresult Ġin Ġon Request Permissions Result () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . READ _ EXTERNAL _ STORAGE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC rop Image . P ICK _ IMAGE _ PERMISSION S _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġpermissions Ġrequired Ġor Ġalready Ġgrunt ed , Ġcan Ġstart Ġcrop Ġimage Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView . setImage Uri Async ( crop Image Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġset Theme Attributes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Theme Attributes () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( L ass i Config . getConfig ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar . background Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor Drawable ( toolbar Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar . setTitle TextColor ( toolbar Resource Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġup Arrow Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( this @ Crop Image Activity , ĠR . drawable . ic _ back _ white ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġup Arrow ?. setColor Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar Resource Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPort er D uff . Mode . SRC _ AT OP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Home As Up Indicator ( up Arrow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . add Flags ( WindowManager . LayoutParams . FLAG _ DR AWS _ SYSTEM _ BAR _ BACK GRO UN DS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . status Bar Color Ġ= Ġstatus Bar Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġcrop ImageView !!. setOn Set Image Uri Complete Listener ( this ) ĊĠĠĠĠĠĠĠ Ġcrop ImageView !!. setOn Crop Image Complete Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġcrop ImageView !!. setOn Set Image Uri Complete Listener ( null ) ĊĠĠĠĠĠĠĠ Ġcrop ImageView !!. setOn Crop Image Complete Listener ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . crop _ image _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġval Ġmenu Rotate Left Ġ= Ġmenu . find Item ( R . id . crop _ image _ menu _ rotate _ left ) ĊĠĠĠĠĠĠĠ Ġmenu Rotate Left ?. icon Ġ= ĠDrawable Utils . change Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop Image Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ crop _ image _ menu _ rotate _ left , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL ass i Config . getConfig (). toolbar Resource Color ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmenu Rotate Right Ġ= Ġmenu . find Item ( R . id . crop _ image _ menu _ rotate _ right ) ĊĠĠĠĠĠĠĠ Ġmenu Rotate Right ?. icon Ġ= ĠDrawable Utils . change Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop Image Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ crop _ image _ menu _ rotate _ right , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL ass i Config . getConfig (). toolbar Resource Color ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmenu Flip Ġ= Ġmenu . find Item ( R . id . crop _ image _ menu _ flip ) ĊĠĠĠĠĠĠĠ Ġmenu Flip ?. icon Ġ= ĠDrawable Utils . change Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop Image Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ crop _ image _ menu _ flip , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL ass i Config . getConfig (). toolbar Resource Color ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmenu Done Ġ= Ġmenu . find Item ( R . id . crop _ image _ menu _ crop ) ĊĠĠĠĠĠĠĠ Ġmenu Done ?. icon Ġ= ĠDrawable Utils . change Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop Image Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ done _ white , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL ass i Config . getConfig (). toolbar Resource Color ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! crop Image Options !!. allow Rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . removeItem ( R . id . crop _ image _ menu _ rotate _ left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . removeItem ( R . id . crop _ image _ menu _ rotate _ right ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( crop Image Options !!. allow Counter Rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . crop _ image _ menu _ rotate _ left ). isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! crop Image Options !!. allow F li pping ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . removeItem ( R . id . crop _ image _ menu _ flip ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( crop Image Options !!. crop Menu Crop Button Title Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . crop _ image _ menu _ crop ). title Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options !!. crop Menu Crop Button Title ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcrop Icon : ĠDrawable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crop Image Options !!. crop Menu Crop Button Icon Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Icon Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( this , Ġcrop Image Options !!. crop Menu Crop Button Icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . crop _ image _ menu _ crop ). icon Ġ= Ġcrop Icon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" A IC ", Ġ" Failed Ġto Ġread Ġmenu Ġcrop Ġdrawable ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( crop Image Options !!. activity Menu Icon Color Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate MenuItem Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu , ĠR . id . crop _ image _ menu _ rotate _ left , Ġcrop Image Options !!. activity Menu Icon Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate MenuItem Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu , ĠR . id . crop _ image _ menu _ rotate _ right , Ġcrop Image Options !!. activity Menu Icon Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate MenuItem Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . crop _ image _ menu _ flip , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options !!. activity Menu Icon Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crop Icon Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate MenuItem Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . crop _ image _ menu _ crop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options !!. activity Menu Icon Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . crop _ image _ menu _ crop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . crop _ image _ menu _ rotate _ left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotate Image (- crop Image Options !!. rotation Degrees ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . crop _ image _ menu _ rotate _ right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotate Image ( crop Image Options !!. rotation Degrees ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . crop _ image _ menu _ flip _ h orizontally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. flip Image H orizontally () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . crop _ image _ menu _ flip _ vert ically ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. flip Image Vert ically () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result Cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġset Result Cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" New Api ") ĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ// Ġhandle Ġresult Ġof Ġpick Ġimage Ġcho oser ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠC rop Image . P ICK _ IMAGE _ CH OO SER _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ C ANCE LED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUser Ġcancelled Ġthe Ġpicker . ĠWe Ġdon 't Ġhave Ġanything Ġto Ġcrop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result Cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Uri Ġ= ĠC rop Image . get Pick Image Result Uri ( this , Ġdata ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor ĠAPI Ġ>= Ġ 2 3 Ġwe Ġneed Ġto Ġcheck Ġspecifically Ġthat Ġwe Ġhave Ġpermissions Ġto Ġread Ġexternal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstorage . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Crop Image . is Read External Storage Permissions Required ( this , Ġcrop Image Uri !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequest Ġpermissions Ġand Ġhandle Ġthe Ġresult Ġin Ġon Request Permissions Result () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . READ _ EXTERNAL _ STORAGE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC rop Image . P ICK _ IMAGE _ PERMISSION S _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġpermissions Ġrequired Ġor Ġalready Ġgrunt ed , Ġcan Ġstart Ġcrop Ġimage Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. setImage Uri Async ( crop Image Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠC rop Image . P ICK _ IMAGE _ PERMISSION S _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crop Image Uri Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġgrant Results . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequired Ġpermissions Ġgranted , Ġstart Ġcrop Ġimage Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. setImage Uri Async ( crop Image Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . crop _ image _ activity _ no _ permissions , ĠToast . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result Cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠC rop Image . CAMERA _ CAPTURE _ PERMISSION S _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIr res pective Ġof Ġwhether Ġcamera Ġpermission Ġwas Ġgiven Ġor Ġnot , Ġwe Ġshow Ġthe Ġpicker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġpicker Ġwill Ġnot Ġadd Ġthe Ġcamera Ġintent Ġif Ġpermission Ġis Ġnot Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC rop Image . start Pick Image Activity ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Set Image Uri Complete ( view : ĠC rop ImageView , Ġuri : ĠUri , Ġerror : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crop Image Options !!. initial Crop Window Rectangle Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. crop Rect Ġ= Ġcrop Image Options !!. initial Crop Window Rectangle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crop Image Options !!. initial Rotation Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. rot ated Degrees Ġ= Ġcrop Image Options !!. initial Rotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( null , Ġerror , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Crop Image Complete ( view : ĠC rop ImageView , Ġresult : ĠC rop ImageView . Crop Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Result ( result . uri , Ġresult . error , Ġresult . sample Size ) ĊĠĠĠ Ġ} Ċ Ċ // Ġregion : ĠPrivate Ġmethods ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġcrop Ġimage Ġand Ġsave Ġthe Ġresult Ġto u Ġoutput Ġuri . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcrop Image () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( crop Image Options !!. no Output Image ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( null , Ġnull , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Uri Ġ= Ġoutput Uri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. save C ropped Image Async ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Uri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options !!. output Compress Format , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options !!. output Compress Quality , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options !!. output Request Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options !!. output Request Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Options !!. output Request Size Options ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRotate Ġthe Ġimage Ġin Ġthe Ġcrop Ġimage Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrotate Image ( degrees : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrop ImageView !!. rotate Image ( degrees ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠResult Ġwith Ġc ropped Ġimage Ġdata Ġor Ġerror Ġif Ġfailed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Result ( uri : ĠUri ?, Ġerror : ĠException ?, Ġsample Size : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuri ?. path ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Picker Utils . notify Gallery Update New File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon File Scan Complete Ġ= Ġthis :: on File Scan Complete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ ĠstartActivity ( getResult Intent ( uri , Ġerror , Ġsample Size )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon File Scan Complete ( uri : ĠUri ?, Ġimage Path : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġuri ?. let Ġ{ Ġreturn Uri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . query ( return Uri , Ġnull , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ?. use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( Media Store . Images . Media ._ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex ( Media Store . Images . Media . DISPLAY _ NAME )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex ( Media Store . Images . Media . DATA )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmi Media Ġ= ĠMi Media ( id , Ġname , Ġpath , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d (" Crop Utils ", Ġ" Check ĠURI Ġalready Ġexist Ġ$ path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Key Utils . MEDIA _ PRE VIEW , Ġmi Media ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġintent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e ( log Tag , Ġ" on File Scan Complete Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Path ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d (" Crop Utils ", Ġ" Check ĠURI Ġalready Ġpath Ġis Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmi Media Ġ= ĠMi Media ( path Ġ= Ġit , Ġdoes Uri Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Key Utils . MEDIA _ PRE VIEW , Ġmi Media ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġintent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCancel Ġof Ġcro pping Ġactivity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Result Cancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġintent Ġinstance Ġto Ġbe Ġused Ġfor Ġthe Ġresult Ġof Ġthis Ġactivity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġget Result Intent ( uri : ĠUri ?, Ġerror : ĠException ?, Ġsample Size : ĠInt ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠC rop Image . Activity Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. image Uri , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. crop Points , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. crop Rect , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. rot ated Degrees , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop ImageView !!. whole Image Rect , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsample Size ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠL ass i Media Picker Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . put Extras ( get Intent ()) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Crop Image . C ROP _ IMAGE _ EXTRA _ RESULT , Ġresult ) ĊĠĠĠĠĠĠĠ Ġreturn Ġintent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe Ġcolor Ġof Ġa Ġspecific Ġmenu Ġitem Ġto Ġthe Ġgiven Ġcolor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate MenuItem Icon Color ( menu : ĠMenu , ĠitemId : ĠInt , Ġcolor : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmenu Item Ġ= Ġmenu . find Item ( itemId ) ĊĠĠĠĠĠĠĠ Ġif Ġ( menuItem Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu Item Icon Ġ= Ġmenu Item . icon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( menuItem Icon Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Icon . mutate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Icon . setColor Filter ( color , ĠPort er D uff . Mode . SRC _ AT OP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . icon Ġ= Ġmenu Item Icon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" A IC ", Ġ" Failed Ġto Ġupdate Ġmenu Ġitem Ġcolor ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ // Ġend region Ċ } Ċ