package Ġcom . sample . edge detection Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . Ex if Interface Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Log Ċ import Ġcom . sample . edge detection . Source Manager . Companion . pic Ċ import Ġcom . sample . edge detection . crop . Crop Activity Ċ import Ġcom . sample . edge detection . processor . C orners Ċ import Ġcom . sample . edge detection . processor . process Picture Ċ import Ġcom . sample . edge detection . scan . Scan Activity Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġio . flutter . plugin . common . Plugin Registry Ċ import Ġorg . opencv . core .* Ċ import Ġorg . opencv . img code cs . Img code cs Ċ import Ġorg . opencv . img proc . Img proc Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ Ċ class ĠEdge Detection Delegate ( activity : ĠActivity ) Ġ: ĠPlugin Registry . Activity Result Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġactivity : ĠActivity Ġ= Ġactivity ĊĠĠĠ Ġprivate Ġvar Ġresult : ĠMethod Channel . Result ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmethod Call : ĠMethod Call ? Ġ= Ġnull ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠSC AN _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġdata Ġ&& Ġnull Ġ!= Ġdata . extras ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ropped Image Path Ġ= Ġdata . extras !!. getString ( C ROP PED _ IMAGE _ PATH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Image Path Ġ= Ġdata . extras !!. getString ( ORIGIN AL _ IMAGE _ PATH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquad TL Ġ= Ġdata . extras !!. getDouble Array ( QUAD R IL ATER AL _ TOP _ LEFT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquad TR Ġ= Ġdata . extras !!. getDouble Array ( QUAD R IL ATER AL _ TOP _ RIGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquad BR Ġ= Ġdata . extras !!. getDouble Array ( QUAD R IL ATER AL _ BOTTOM _ RIGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquad BL Ġ= Ġdata . extras !!. getDouble Array ( QUAD R IL ATER AL _ BOTTOM _ LEFT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Success ( map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ROP PED _ IMAGE _ PATH Ġto Ġc ropped Image Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOR IGIN AL _ IMAGE _ PATH Ġto Ġoriginal Image Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQU ADR IL ATER AL _ TOP _ LEFT Ġto Ġquad TL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQU ADR IL ATER AL _ TOP _ RIGHT Ġto Ġquad TR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQU ADR IL ATER AL _ BOTTOM _ RIGHT Ġto Ġquad BR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQU ADR IL ATER AL _ BOTTOM _ LEFT Ġto Ġquad BL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ C ANCE LED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Camera Activity ( call : ĠMethod Call , Ġresult : ĠMethod Channel . Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! set Pending MethodCall And Result ( call , Ġresult )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Already Active Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent ( activity . application Context , ĠScan Activity :: class . java )) ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . arguments Ġas ĠHashMap < String , ĠAny >? ĊĠĠĠĠĠĠĠ Ġif Ġ( args Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanual C ro pping Ġ= Ġargs [" manual _ cro pping "] Ġas ĠBoolean ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manual C ro pping Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" manual _ cro pping ", Ġmanual C ro pping ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactivity . startActivity For Result ( intent , ĠSC AN _ REQUEST _ CODE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" New Api ") ĊĠĠĠ Ġfun Ġopen C ro pping Activity ( call : ĠMethod Call , Ġresult : ĠMethod Channel . Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! set Pending MethodCall And Result ( call , Ġresult )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Already Active Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . arguments Ġas ĠHashMap < String , ĠAny > ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Image Path Ġ= Ġargs [" original _ image _ path "] Ġas ĠString ĊĠĠĠĠĠĠĠ Ġval Ġquad Top Left Ġ= Ġargs [" quad ril ateral _ top _ left "] Ġas ĠArrayList < Double > ĊĠĠĠĠĠĠĠ Ġval Ġquad Top Right Ġ= Ġargs [" quad ril ateral _ top _ right "] Ġas ĠArrayList < Double > ĊĠĠĠĠĠĠĠ Ġval Ġquad Bottom Right Ġ= Ġargs [" quad ril ateral _ bottom _ right "] Ġas ĠArrayList < Double > ĊĠĠĠĠĠĠĠ Ġval Ġquad Bottom Left Ġ= Ġargs [" quad ril ateral _ bottom _ left "] Ġas ĠArrayList < Double > ĊĊĠĠĠĠĠĠĠ Ġval Ġimage Uri Ġ= ĠUri . from File ( File ( original Image Path )) ĊĠĠĠĠĠĠĠ Ġval Ġi Stream : ĠInputStream Ġ= Ġthis . activity . content Resolver . open InputStream ( image Uri ) ĊĊĠĠĠĠĠĠĠ Ġval Ġex if Ġ= ĠEx if Interface ( i Stream ); ĊĊĠĠĠĠĠĠĠ Ġval Ġimage Width Ġ= Ġex if . getAttribute Int ( Ex if Interface . TAG _ IMAGE _ WIDTH , Ġ 0 ). toDouble () ĊĠĠĠĠĠĠĠ Ġval Ġimage Height Ġ= Ġex if . getAttribute Int ( Ex if Interface . TAG _ IMAGE _ LENGTH , Ġ 0 ). toDouble () ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Data : ĠByteArray ? Ġ= Ġget Bytes ( this . activity . content Resolver . open InputStream ( image Uri )) ĊĠĠĠĠĠĠĠ Ġval Ġmat Ġ= ĠMat ( Size ( image Width , Ġimage Height ), ĠC v Type . CV _ 8 U ) ĊĠĠĠĠĠĠĠ Ġmat . put ( 0 , Ġ 0 , Ġinput Data ) ĊĠĠĠĠĠĠĠ Ġval Ġpic Ġ= ĠImg code cs . im decode ( mat , ĠImg code cs . CV _ LOAD _ IMAGE _ UN CHANGED ) ĊĠĠĠĠĠĠĠ Ġmat . release () ĊĠĠĠĠĠĠĠ ĠImg proc . cvt Color ( pic , Ġpic , ĠImg proc . COLOR _ RGB 2 BGR A ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcorners Ġ= ĠC orners ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcorners Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( quad Top Left [ 0 ], Ġquad Top Left [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( quad Top Right [ 0 ], Ġquad Top Right [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( quad Bottom Right [ 0 ], Ġquad Bottom Right [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( quad Bottom Left [ 0 ], Ġquad Bottom Left [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġmat . size () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent ( activity . application Context , ĠC rop Activity :: class . java )) ĊĠĠĠĠĠĠĠ ĠSource Manager . pic Ġ= Ġpic ĊĠĠĠĠĠĠĠ ĠSource Manager . corners Ġ= Ġcorners ĊĠĠĠĠĠĠĠ Ġactivity . startActivity For Result ( intent , SCAN _ REQUEST _ CODE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Pending MethodCall And Result ( method Call : ĠMethod Call , Ġresult : ĠMethod Channel . Result ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . method Call Ġ= Ġmethod Call ĊĠĠĠĠĠĠĠ Ġthis . result Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish With Already Active Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġfinish WithError (" already _ active ", Ġ" Edge Ġdetection Ġis Ġalready Ġactive ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish WithError ( errorCode : ĠString , ĠerrorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ?. error ( errorCode , ĠerrorMessage , Ġnull ) ĊĠĠĠĠĠĠĠ Ġclear MethodCall And Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish With Success ( data : ĠMap < String , ĠAny > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ?. success ( data ) ĊĠĠĠĠĠĠĠ Ġclear MethodCall And Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear MethodCall And Result () Ġ{ ĊĠĠĠĠĠĠĠ Ġmethod Call Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Bytes ( inputStream : ĠInputStream ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbyte Buffer Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval ĠbufferSize Ġ= Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( buffer Size ) ĊĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( inputStream . read ( buffer ). also Ġ{ Ġlen Ġ= Ġit Ġ} Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Buffer . write ( buffer , Ġ 0 , Ġlen ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbyte Buffer . toByteArray () ĊĠĠĠ Ġ} Ċ }