/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠLINE ĠCorporation . ĠAll Ġrights ĠReserved . Ċ Ġ* ĠLINE ĠCorporation ĠPRO PRI ET ARY / CONF IDENT IAL . ĠUse Ġis Ġsubject Ġto Ġlicense Ġterms . Ċ Ġ*/ Ċ Ċ package Ġcom . line corp . cl ay . example Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Manager Ċ import Ġandroid . widget . LinearLayout Ċ import Ġcom . line corp . cl ay . example . utils . resample Bitmap Ċ import Ġcom . line corp . cl ay . view . C lay View Ċ import Ġorg . jetbrains . ank o .* Ċ import Ġorg . jetbrains . ank o . custom . ank o View Ċ import Ġorg . jetbrains . ank o . sdk 2 5 . listeners . on Checked Change Ċ import Ġorg . jetbrains . ank o . sdk 2 5 . listeners . onClick Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ Ċ class ĠMain An ko Activity Ġ: ĠActivity () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġimage Uri Ġ= Ġintent . get Parcelable Extra < Uri >( Constants . KEY _ IMAGE _ URI ) ĊĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Path Ġ= Ġcheck Image Source ( image Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMain An ko Activity Ui ( image Path ). set ContentView ( this @ Main An ko Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete TempFile If Exist () Ġ{ ĊĠĠĠĠĠĠĠ ĠFile ( files Dir , ĠTEMP _ CLOUD _ IMAGE _ FILENAME ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exists ()) Ġ{ Ġdelete () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Image Source ( image Uri : ĠUri ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġimage Path Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= ĠarrayOf ( Media Store . Images . Media . DATA , ĠMedia Store . Images . Media . OR IENTATION ) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . query ( image Uri , Ġcolumns , Ġnull , Ġnull , Ġnull ). use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Path Ġ= Ġcursor . getString ( cursor . getColumnIndex ( columns [ 0 ])) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( image Uri . toString (). startsWith (" content :// com . google . android . apps . photos . content ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Cloud Image ToFile ( image Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" The Ġimage Ġdoesn 't Ġcome Ġfrom ĠGoogle ĠPhoto , Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" need Ġto Ġadd Ġthe Ġsupport Ġfor Ġ$ image Uri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġimage Path ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Cloud Image ToFile ( uri : ĠUri ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Image File Ġ= ĠFile ( files Dir , ĠTEMP _ CLOUD _ IMAGE _ FILENAME ) ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠByteArray ( 4 0 9 6 ) Ġ// 4 k ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġcontent Resolver . open InputStream ( uri ) ĊĠĠĠĠĠĠĠ ĠFileOutputStream ( temp Image File . absolute Path ). use Ġ{ Ġout Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( inputStream . read ( buf ) Ġ> Ġ 0 ) Ġ{ Ġout Stream . write ( buf ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp Image File . absolute Path ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Main An ko Activity " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTEMP _ CLOUD _ IMAGE _ FILENAME Ġ= Ġ" temp _ cloud _ image " ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMain An ko Activity Ui ( val Ġimage Path : ĠString ) Ġ: ĠAn ko Component < Main An ko Activity > Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġc lay View : ĠC lay View ĊĊĠĠĠ Ġoverride Ġfun Ġcreate View ( ui : ĠAn ko Context < Main An ko Activity >) Ġ= Ġwith ( ui ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrelative Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= Ġctx . resources . getColor ( R . color . grey _ 7 7 7 7 7 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc lay View Ġ= Ġc lay Edit View Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Stroke Width Ġ= Ġdip ( 6 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Point Radius Ġ= Ġdip ( 2 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Point Color Ġ= Ġui . ctx . resources . getColor ( android . R . color . holo _ green _ dark ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Stroke Color Ġ= Ġui . ctx . resources . getColor ( android . R . color . white ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreen Dimension Ġ= Ġowner . screen Dimension () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġres ample Bitmap ( image Path , Ġscreen Dimension . x , Ġscreen Dimension . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner . delete TempFile If Exist () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ cl ay Edit View . bitmap Ġ= Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. l params ( width Ġ= Ġmatch Parent , Ġheight Ġ= Ġmatch Parent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlinear Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠLinearLayout . HORIZONTAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Resource Ġ= ĠR . string . undo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc lay View . undo Select () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Resource Ġ= ĠR . string . trim ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay C ropped Image ( ui ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckBox Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Resource Ġ= ĠR . string . show _ path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Checked Change Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc lay View . draw Path On C ropped Image Ġ= Ġis Checked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. l params Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalign Parent Bottom () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter H orizontally () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay C ropped Image ( ui : ĠAn ko Context < Main An ko Activity >) Ġ{ ĊĠĠĠĠĠĠĠ Ġc lay View . getC ropped Image ( anti Alias Ġ= Ġtrue )?. let Ġ{ Ġtrimmed Image Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġui . owner . create Temp Image File ( trimmed Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . startActivity < Image Display Activity >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . KEY _ IMAGE _ PATH Ġto Ġtemp File . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun ĠView Manager . cl ay Edit View ( theme : ĠInt Ġ= Ġ 0 , Ġinit : ĠC lay View . () Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠ Ġan ko View (:: C lay View , Ġtheme , Ġinit ) ĊĊĊ