package Ġcom . py camp ers . method _ call _ dispatcher Ċ Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . util . Log Ċ import Ġio . flutter . plugin . common . Event Channel . Event Sink Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel . MethodCall Handler Ċ import Ġio . flutter . plugin . common . Method Channel . Result Ċ import Ġio . flutter . plugin . common . Plugin Registry . Registrar Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ Ċ const Ġval ĠTAG Ġ= Ġ" MethodCall Dispatcher " Ċ Ċ type alias ĠOn Error Ġ= Ġ( errorCode : ĠString , ĠerrorMessage : ĠString ?, Ġerror Details : ĠAny ?) Ġ-> ĠUnit Ċ type alias ĠOn Success Ġ= Ġ( result : ĠAny ?) Ġ-> ĠUnit Ċ type alias ĠAny Func Ġ= Ġ() Ġ-> ĠAny ? Ċ type alias Ġunit Func Ġ= Ġ() Ġ-> ĠUnit Ċ Ċ class ĠMethod Call Dispatcher Plugin Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġregister With ( regist rar : ĠRegist rar ) Ġ= ĠUnit ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDo Async ( val Ġfn : Ġ() Ġ-> ĠUnit ) Ġ: ĠAsync Task < Void , ĠVoid , ĠVoid >() Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠVoid ?): ĠVoid ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfn () ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRuns Ġ[ fn ], Ġignoring Ġ[ IllegalStateException ], Ġif Ġencountered . Ċ Ġ* Ċ Ġ* ĠWork around Ġfor Ġhttps :// github . com / flutter / flutter / issues / 2 9 0 9 2 . Ċ Ġ*/ Ċ fun Ġignore Illegal State ( fn : Ġunit Func ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfn () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" ign oring Ġexception : Ġ$ e . ĠSee Ġhttps :// github . com / flutter / flutter / issues / 2 9 0 9 2 Ġfor Ġdetails .") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSerialize Ġthe Ġstack trace Ġcontained Ġin Ġ[ throwable ] Ġto Ġa Ġ[ String ]. Ċ Ġ*/ Ċ fun Ġserialize StackTrace ( throwable : ĠThrowable ): ĠString Ġ{ ĊĠĠĠ Ġval Ġsw Ġ= ĠString Writer () ĊĠĠĠ Ġval Ġpw Ġ= ĠPrintWriter ( sw ) ĊĠĠĠ Ġthrowable . printStackTrace ( pw ) ĊĠĠĠ Ġreturn Ġsw . toString () Ċ } Ċ Ċ /** Ċ Ġ* ĠTry Ġto Ġsend Ġan Ġerror Ġusing Ġ[ Result . error ], Ċ Ġ* Ġby Ġencaps ulating Ġcalls Ġinside Ġ[ ignore Illegal State ]. Ċ Ġ*/ Ċ fun Ġtry Send Error ( onError : ĠOn Error , Ġname : ĠString ?, Ġmessage : ĠString ?, Ġstack Trace : ĠString ?) Ġ{ ĊĠĠĠ Ġignore Illegal State Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" pip ing Ġexception Ġto Ġflutter Ġ($ name )") ĊĠĠĠĠĠĠĠ ĠonError ( name Ġ?: Ġ" null ", Ġmessage , Ġstack Trace ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġtry Send Error ( result : ĠResult , Ġname : ĠString ?, Ġmessage : ĠString ?, Ġstack Trace : ĠString ?) Ġ{ ĊĠĠĠ Ġtry Send Error ( result :: error , Ġname , Ġmessage , Ġstack Trace ) Ċ } Ċ Ċ fun Ġtry Send Error ( events : ĠEvent Sink , Ġname : ĠString ?, Ġmessage : ĠString ?, Ġstack Trace : ĠString ?) Ġ{ ĊĠĠĠ Ġtry Send Error ( events :: error , Ġname , Ġmessage , Ġstack Trace ) Ċ } Ċ Ċ /** Ċ Ġ* ĠSerialize Ġthe Ġ[ throwable ] Ġand Ġsend Ġit Ġusing Ġ[ try Send Error ]. Ċ Ġ*/ Ċ fun Ġtry Send Throwable ( onError : ĠOn Error , Ġthrowable : ĠThrowable ) Ġ{ ĊĠĠĠ Ġval Ġe Ġ= Ġthrowable . cause Ġ?: Ġthrowable ĊĠĠĠ Ġtry Send Error ( ĊĠĠĠĠĠĠĠ ĠonError , ĊĠĠĠĠĠĠĠ Ġe . java Class . canonical Name , ĊĠĠĠĠĠĠĠ Ġe . message , ĊĠĠĠĠĠĠĠ Ġserialize StackTrace ( e ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġtry Send Throwable ( result : ĠResult , Ġthrowable : ĠThrowable ) Ġ= Ġtry Send Throwable ( result :: error , Ġthrowable ) Ċ fun Ġtry Send Throwable ( events : ĠEvent Sink , Ġthrowable : ĠThrowable ) Ġ= Ġtry Send Throwable ( events :: error , Ġthrowable ) Ċ Ċ /** Ċ Ġ* ĠTry Ġto Ġsend Ġthe Ġvalue Ġreturned Ġby Ġ[ fn ] Ġusing Ġ[ result ] Ġ([ Result . success ]), Ċ Ġ* Ġby Ġencaps ulating Ġcalls Ġinside Ġ[ ignore Illegal State ]. Ċ Ġ* Ċ Ġ* ĠIt Ġis Ġad vis able Ġto Ġwrap Ġany Ġnative Ġcode Ġinside Ġ[ fn ], Ċ Ġ* Ġbecause Ġthis Ġwill Ġautomatically Ġsend Ġexceptions Ġusing Ġerror Ġusing Ġ[ try Send Throwable ] Ġif Ġrequired . Ċ Ġ*/ Ċ fun Ġtry Send ( on Success : ĠOn Success , ĠonError : ĠOn Error , Ġfn : ĠAny Func ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġvalue : ĠAny ? ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfn ?. invoke () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Send Throwable ( onError , Ġe ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġignore Illegal State Ġ{ ĊĠĠĠĠĠĠĠ ĠonSuccess ( if Ġ( value Ġis ĠUnit ) Ġnull Ġelse Ġvalue ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġtry Send ( result : ĠResult , Ġfn : ĠAny Func ? Ġ= Ġnull ) Ġ= Ġtry Send ( result :: success , Ġresult :: error , Ġfn ) Ċ fun Ġtry Send ( events : ĠEvent Sink , Ġfn : ĠAny Func ? Ġ= Ġnull ) Ġ= Ġtry Send ( events :: success , Ġevents :: error , Ġfn ) Ċ Ċ /** Ċ Ġ* ĠRun Ġ[ fn ]. Ċ Ġ* ĠAutomatically Ġsend Ġexceptions Ġusing Ġerror Ġusing Ġ[ try Send Throwable ] Ġif Ġrequired . Ċ Ġ* Ċ Ġ* ĠThis Ġdiffers Ġfrom Ġ[ try Send ], Ċ Ġ* Ġin Ġthat Ġit Ġwon 't Ġinvoke Ġ[ Result . success ] Ġusing Ġthe Ġreturn Ġvalue Ġof Ġ[ fn ]. Ċ Ġ*/ Ċ fun Ġcatch Errors ( onError : ĠOn Error , Ġfn : Ġunit Func ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfn . invoke () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Send Throwable ( onError , Ġe ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcatch Errors ( result : ĠResult , Ġfn : Ġunit Func ) Ġ= Ġcatch Errors ( result :: error , Ġfn ) Ċ fun Ġcatch Errors ( events : ĠEvent Sink , Ġfn : Ġunit Func ) Ġ= Ġcatch Errors ( events :: error , Ġfn ) Ċ Ċ /** Ċ Ġ* ĠInherit Ġthis Ġclass Ġto Ġmake Ġany Ġkotlin Ġmethods Ġwith Ġthe Ġsignature :- Ċ Ġ* Ċ Ġ* Ġ ĠmethodName ([ MethodCall ], Ġ[ Result ]) Ċ Ġ* Ċ Ġ* Ġbe Ġmagic ally Ġavailable Ġto ĠFlutter 's Ġplatform Ġchannels , Ċ Ġ* Ġby Ġthe Ġpower Ġof Ġdynamic Ġdispatch ! Ċ Ġ*/ Ċ open Ġclass ĠMethod Call Dispatcher Ġ: ĠMethod Call Handler Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon MethodCall ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġcall . method ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class . getMethod ( methodName , ĠMethod Call :: class . java , ĠResult :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNoSuch Method Exception , Ġis ĠSecurity Exception Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . not Implemented () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠDo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" invoke Ġ{ Ġmethod : Ġ${ java Class . simple Name }. $ methodName (), Ġargs : Ġ${ call . arguments } Ġ} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Illegal State Ġ{ Ġmethod . invoke ( this , Ġcall , Ġresult ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Send Throwable ( result , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }