Hi Maksim

`if (METHOD_1.equals(action))` is very similar way to how redux works.

I have playing with your proposition to see how this could be implemented.
What I found is that processing annotations on runtime can contribute to
slower application startup due to fact that annotation needs to be
processed at runtime.
Deviceready event is delivered later, which is not desired. This could be
also processed on build time (something like dagger), but I did not
investigated that.

I figured out simple way to extend this without any sacrifice on
performance.
This will simplify end user api and also still provide full backwards
compatibility.
We could make improvement for developers without affecting end user app
performance.

Linking gist with the idea:
https://gist.github.com/wtrocki/43bfdda18c086a3283bb8ba3bf2d052e

Happy to contribute that back to the Cordova.

*Note: *I'm not maintainer of Cordova Android platform so my response do
not mean that there will be approval for this change.


On Sun, Apr 29, 2018 at 9:58 AM, chemeri...@gmail.com <chemeri...@gmail.com>
wrote:

> Hi guys. cordova-ios has a nice method binding for plugins. Unfortunately
> cordova-android requires at present boilerplate implementation of method
> execute:
>
> public class MyPlugin extends CordovaPlugin {
>     ...
>     @Override
>     public boolean execute(String action, JSONArray args, CallbackContext
> callbackContext) throws JSONException {
>         if (METHOD_1.equals(action)) {
>             method1(args, callbackContext);
>         } else if (METHOD_2.equals(action)) {
>             method2(args, callbackContext);
>         ...
>         } else {
>             return false;
>         }
>         return true;
>     }
>     ...
> }
>
> I suggest to implement support for @CordovaMethod that will allow for
> plugin authors to reduce boilerplate code, so the implementation above will
> look like:
>
> public class MyPlugin extends CordovaPlugin {
>     ...
>     @CordovaMethod
>     private void method1(JSONArray args, CallbackContext callbackContext)
> throws JSONException {
>         ...
>     }
>
>     @CordovaMethod
>     private void method2(JSONArray args, CallbackContext callbackContext)
> throws JSONException {
>         ...
>     }
>     ...
> }
>
> Implementation of method execute in CordovaPlugin.java will check for
> methods marked with @CordovaMethod and if action argument matches a method
> with @CordovaMethod, the method will be invoked. Developer can also specify
> action manually via the name parameter:
>
> public class MyPlugin extends CordovaPlugin {
>     ...
>     @CordovaMethod(name = "method1")
>     private void myMethod(JSONArray args, CallbackContext callbackContext)
> throws JSONException {
>         ...
>     }
>     ...
> }
>
> Important to note that backward compatibility is preserved - old plugins
> didn't have @CordovaMethod, but new ones can use it to simplify code.
>
> What do you think?
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@cordova.apache.org
> For additional commands, e-mail: dev-h...@cordova.apache.org
>
>


-- 

WOJCIECH TROCKI

Red Hat Mobile <https://www.redhat.com/>

IM: wtrocki
<https://red.ht/sig>

Reply via email to