package Ġcl . ben m . base models . persistence Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġcl . ben m . observable . Observable Ċ import Ġcl . ben m . observable . future . Future Observable Ċ import Ġcl . ben m . observable . li ved ata . to . LiveData Observable Ċ import Ġcom . google . common . util . concurrent . List enable Future Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . lang . reflect . Invocation Handler Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Proxy Ċ Ċ object ĠObservable Adapter Ġ{ ĊĊĠĠĠ Ġfun Ġ< T > Ġadapt ( clazz : ĠClass < T >, Ġdelegate : ĠAny ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠProxy . new Proxy Instance ( ClassLoader . getSystem ClassLoader (), ĠarrayOf ( clazz ), ĠDynamic Observable Invocation Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate ĊĠĠĠĠĠĠĠ Ġ)) Ġas ĠT ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠDynamic Observable Invocation Handler ( ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠAny Ċ ): ĠInvocation Handler Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġinvoke ( proxy : ĠAny ?, Ġmethod : ĠMethod ?, Ġargs : ĠArray < out ĠAny >? ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== Ġnull ) Ġthrow ĠIllegalArgumentException (" Null Ġmethod Ġinvoked ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate :: class . java . getMethod ( method . name , Ġ*( args ?. map Ġ{ Ġit :: class . java Ġ} ?. to Typed Array () Ġ?: Ġempty Array ())) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Un matched Ġmethod Ġ${ method . name } Ġin Ġdelegate ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtarget . invoke ( delegate , Ġ*( args Ġ?: Ġempty Array ())) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( method . returnType Ġ== Ġnull Ġ|| Ġtarget . returnType Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( method . returnType . isAssignableFrom ( target . returnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Observable :: class . java . isAssignableFrom ( method . returnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( LiveData :: class . java . isAssignableFrom ( target . returnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLive Data Observable ( result Ġas ĠLive Data <* >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( List enable Future :: class . java . isAssignableFrom ( target . returnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFuture Observable ( result Ġas ĠList enable Future <* >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Un re cogn ised Ġresponse Ġtype Ġfrom Ġdelegate , Ġexpecting Ġ${ method . returnType } Ġfrom Ġ${ method . name }, Ġgot Ġ${ target . returnType }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Un re cogn ised Ġresponse Ġtype Ġfrom Ġdelegate Ġand Ġproxy , Ġexpecting Ġ${ method . returnType } Ġfrom Ġ${ method . name }, Ġgot Ġ${ target . returnType }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }