package Ġcom . od am soft . document _ scanner Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . view . Display Ċ import Ġandroid . view . Surface View Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . od am soft . document _ scanner . edge detection . processor . C orners Ċ import Ġcom . od am soft . document _ scanner . edge detection . processor . crop Picture Ċ import Ġcom . od am soft . document _ scanner . edge detection . processor . process Picture Ċ import Ġcom . od am soft . document _ scanner . edge detection . scan . IS can View Ċ import Ġcom . od am soft . document _ scanner . edge detection . scan . Scan Presenter Ċ import Ġcom . od am soft . document _ scanner . edge detection . view . Paper Rectangle Ċ import Ġio . flutter . Log Ċ import Ġio . flutter . embedding . engine . plugins . activity . Activity Plugin Binding Ċ import Ġio . flutter . plugin . common .* Ċ import Ġio . flutter . plugin . platform . Platform View Ċ import Ġio . flutter . plugin . platform . Platform View Factory Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġorg . opencv . android . OpenCV Loader Ċ import Ġorg . opencv . android . Utils Ċ import Ġorg . opencv . core .* Ċ import Ġorg . opencv . img code cs . Img code cs Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠDocument Scanner View Factory ( private Ġval Ġmess enger : ĠBinary Messenger ): ĠPlatform View Factory ( Standard Message Codec . INSTANCE ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMETHOD _ CHANNEL _ NAME Ġ= Ġ" com . od am soft . document _ scanner " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Document Scanner View : ĠDocument Scanner View ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠActivity Plugin Binding ? Ġ= Ġnull ĊĠĠĠ Ġfun Ġget Binding () Ġ: ĠActivity Plugin Binding ? Ġ= Ġbinding ĊĠĠĠ Ġfun Ġset Binding ( binding : ĠActivity Plugin Binding ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . binding Ġ= Ġbinding ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Document Scanner View ?. onStart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Document Scanner View ?. on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Document Scanner View Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate ( context : ĠContext ?, Ġview Id : ĠInt , Ġargs : ĠAny ?): ĠPlatform View Ġ{ ĊĠĠĠĠĠĠĠ Ġm Document Scanner View Ġ= ĠDocument Scanner View ( this , Ġthis . messenger , Ġcontext !! , Ġview Id , Ġargs ) ĊĠĠĠĠĠĠĠ Ġreturn Ġm Document Scanner View !! ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ internal Ġclass ĠDocument Scanner View ( private Ġval Ġdocument Scanner View Factory : ĠDocument Scanner View Factory , Ġ Ġmess enger : ĠBinary Messenger , Ġprivate Ġval Ġcontext : ĠContext , Ġview Id : ĠInt , Ġargs : ĠAny ?): ĠPlatform View , ĊĠĠĠ ĠMethod Channel . MethodCall Handler , ĠI Scan View . Proxy , ĠPlugin Registry . Request Permissions Result Listener Ġ{ ĊĠĠĠ Ġprivate Ġval ĠREQUEST _ CAMERA _ PERMISSION Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Document Scanner View Factory " ĊĊĠĠĠ Ġprivate Ġval Ġchannel : ĠMethod Channel ĊĊĠĠĠ Ġprivate Ġval Ġrelative Layout Ġ= ĠRelative Layout ( context ) ĊĠĠĠ Ġprivate Ġval Ġsurface View Ġ= ĠSurface View ( context ) ĊĠĠĠ Ġprivate Ġval Ġpaper Rectangle Ġ= ĠPaper Rectangle ( context ) ĊĊĠĠĠ Ġprivate Ġval Ġscan Presenter Ġ= ĠScan Presenter ( context , Ġthis ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdocument Scanner View Factory . get Binding ()?. add Request Permissions Result Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġrelative Layout . addView ( surface View ) ĊĠĠĠĠĠĠĠ Ġrelative Layout . addView ( paper Rectangle ) ĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġchannel Ġ= ĠMethod Channel ( messenger , ĠDocument Scanner View Factory . METHOD _ CHANNEL _ NAME +" #$ view Id ") ĊĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġprepare () ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget View (): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrelative Layout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( null ) ĊĠĠĠĠĠĠĠ Ġscan Presenter . stop () ĊĠĠĠĠĠĠĠ Ġdocument Scanner View Factory . get Binding ()?. remove Request Permissions Result Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġscan Presenter . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġscan Presenter . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= Ġdocument Scanner View Factory . get Binding () ĊĠĠĠĠĠĠĠ Ġif Ġ( binding Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . Manifest . permission . CAMERA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . Manifest . permission . CAMERA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CAMERA _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// scan Presenter . init Camera () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Presenter . update Camera () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MethodCall ( call : ĠMethod Call , Ġresult : ĠMethod Channel . Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( call . method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" capture Image " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Presenter . take Picture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" change Flash Mode " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode : ĠString Ġ= Ġcall . arguments Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Presenter . change Flash Mode ( mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" refresh Camera " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// scan Presenter . init Camera () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Presenter . update Camera () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" dispose " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . success ( null ) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġexit () Ġ{ ĊĠĠĠĠĠĠĠ Ġdispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfailed () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Scanner Ġfailed ") ĊĠĠĠĠĠĠĠ Ġchannel . invoke Method (" failed ", Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Display (): ĠDisplay Ġ= Ġ Ġthis . context . display !! ĊĊĠĠĠ Ġoverride Ġfun Ġget Surface View (): ĠSurface View Ġ= Ġsurface View ĊĊĠĠĠ Ġoverride Ġfun Ġget Paper Rect (): ĠPaper Rectangle Ġ= Ġpaper Rectangle ĊĊĠĠĠ Ġoverride Ġfun Ġon Image Capt ured ( image Bytes : ĠByteArray , Ġimage Size : ĠSize , Ġcrop Bytes : ĠByteArray ?, Ġcorners : ĠC orners ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhash Map Ġ= Ġhash Map Of < String , ĠAny ?> () ĊĠĠĠĠĠĠĠ Ġhash Map [" initial Image "] Ġ= Ġimage Bytes ĊĠĠĠĠĠĠĠ Ġhash Map [" initial Image Size "] Ġ= ĠlistOf ( image Size . width , Ġimage Size . height ) ĊĠĠĠĠĠĠĠ Ġhash Map [" corners "] Ġ= Ġcorners ?. corners ?. map Ġ{ ĠlistOf ( it . x , Ġit . y ) Ġ} ĊĠĠĠĠĠĠĠ Ġhash Map [" crop Image "] Ġ= Ġcrop Bytes ĊĠĠĠĠĠĠĠ Ġchannel . invoke Method (" on Capture ", Ġhash Map ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString > ?, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ? ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ CAMERA _ PERMISSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permissions Ġ!= Ġnull Ġ&& Ġgrant Results Ġ!= Ġnull Ġ&& Ġgrant Results [ permissions . indexOf ( android . Manifest . permission . CAMERA )] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// scan Presenter . init Camera () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Presenter . update Camera () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠ Ġ} ĊĊ Ċ }