I personally don't care if we want to go all traditional Java on the
codebase to 'win' code completion,etc but I do question if this is a real
priority issue.

Aside: I think we need to do a hangout. (We should have one anytime email
word count goes above one scroll.)


On Thu, Jan 9, 2014 at 10:42 AM, Andrew Grieve <agri...@chromium.org> wrote:

> On Thu, Jan 9, 2014 at 9:25 AM, Joe Bowser <bows...@gmail.com> wrote:
> > On Thu, Jan 9, 2014 at 6:06 AM, Andrew Grieve <agri...@chromium.org>
> wrote:
> >> Good point about postMessage allowing devs to add their own messages.
> >> That's a very compelling argument to keep postMessage around, but I
> >> don't think it means we should be using it for our "officially
> >> supported" hooks.
> >>
> >
> > Why? This just sounds like personal preference.
> My reasons were listed below.
>
> >
> >> On Wed, Jan 8, 2014 at 9:40 PM, purplecabbage <purplecabb...@gmail.com>
> wrote:
> >>> I'm with Joe.
> >>> Stay flexible, and future friendly.
> >>> The messages that are posted probably just need to be better
> documented, or we need to point plugin devs towards Android's docs.
> >>>
> >>> Sent from my iPhone
> >>>
> >>>> On Jan 8, 2014, at 9:11 PM, Joe Bowser <bows...@gmail.com> wrote:
> >>>>
> >>>>> On Wed, Jan 8, 2014 at 6:58 PM, Andrew Grieve <agri...@chromium.org>
> wrote:
> >>>>> Breaking out a discussion Joe & I started on
> >>>>> https://issues.apache.org/jira/browse/CB-5351.
> >>>>>
> >>>>> Some plugin hooks on Android are made available as functions on the
> >>>>> CordovaPlugin class. If you are interested in the hook, you override
> >>>>> the function.
> >>>>>
> >>>>> Some hooks are made available through the onMessage(String name,
> >>>>> Object obj) function. Examples that I could find:
> >>>>>
> >>>>> postMessage("spinner", "stop");
> >>>>> postMessage("exit", null);
> >>>>> postMessage("splashscreen", "show");
> >>>>> postMessage("onScrollChanged", myEvent); <-- data is a custom class
> >>>>> postMessage("onPageFinished", url);
> >>>>> postMessage("onPageStarted", url);
> >>>>> postMessage("onReceivedError", data); <-- data is a JSONObject
> >>>>> postMessage("onCreateOptionsMenu", menu); <-- a Menu object
> >>>>> postMessage("onPrepareOptionsMenu", menu);  <-- a Menu object
> >>>>> postMessage("onOptionsItemSelected", item); <-- a MenuItem object
> >>>>>
> >>>>> The split seems about 50/50.
> >>>>>
> >>>>> Now, what I'd like to propose is that we do away with postMessage
> >>>>> pattern. Reasons:
> >>>>> 1. It will make what hooks exist much more discoverable
> >>>>>  - Right now there's no list of what postMessages exist within
> >>>>> CordovaPlugin.java
> >>>>
> >>>> I disagree!  I personally prefer this pattern and think that we should
> >>>> keep this pattern instead of adding hundreds of hooks that do the same
> >>>> thing, because it's easier to test postMessage than it is to test the
> >>>> possibly hundreds of hooks.  Does every plugin need it's own special
> >>>> hook, or can plugins that extend activities take advantage of
> >>>> postMessage and onMessage?  I think that this reduces the API's
> >>>> flexibility.  Forcing people to have to request a special hook for
> >>>> their plugin is going to suck.  For example, right now the author of
> >>>> this issue can work around not having onOptionsMenu working by adding
> >>>> the postMessages to his custom activity, and it's a relatively small,
> >>>> non-intrusive amount of code.  If we were doing plugin hooks, they'd
> >>>> have to change plugin and it could break all the plugins.
> >>
> >> I don't follow your testing argument. It's trivial to detect if a
> >> method is called, even in a test. Yes, it's more code than what's
> >> currently in pluginStub, but it's trivial code (override each
> >> function, which Eclipse has generators for, and record the call in a
> >> variable).
> >>
> >
> > Why do non-menu plugins need to know about Menu events?
> They don't. Plugins *optionally* override the hook functions that they
> care about. CordovaPlugin isn't an interface, it's a class.
>
>
> >
> >>>>
> >>>> I do think all the messages being posted need to be documented, but I
> >>>> do think that this is a far more flexible solution than adding tons of
> >>>> hooks to Plugins.java and making plugin developers lives suck even
> >>>> more.
> >>
> >> This doesn't add more hooks, it just makes the hooks easier to
> >> discover and more convenient to use. By more convenient, I mean:
> >>  - Impossible to mess up the types for params
> >>  - No need to unpack args in the case of stuffing multiple args
> >>  - No need to to string comparisons to see which hook is being
> >> triggered. Just override the correct function.
> >>
> >> All the hooks are just empty functions by default, so this has no
> >> effect on plugin maintenance. Making plugin hooks more obvious will
> >> make lives better, not worse.
> >>
> >
> >
> >> To fix the documentation, we'll be adding a string constant to
> >> CordovaPlugin.java for each message that we post, along with comments
> >> describing the types of params & return values. I think this is just
> >> as verbose as writing stub functions.
> >>
> >
> > One is verbose code, the other is verbosity in the docs.
>
> The extreme example of this is that every class just have a single
> function with a single Object parameter + a lot of documentation. My
> argument is that code is better than docs.
> - Code is checked by the compiler, provides autocomplete, provides
> type-safety.
> - Code organization (no need for a single big multiplexing function)
> - You can annotate code with its own comments and @Annotations (e.g.
> we could @Deprecate them)
>
>
>
> >
> >
> >>>>
> >>>>> 3. Hooks can have multiple parameters
> >>>>>  - This would make sense for onScrollChanged and onReceivedError,
> >>>>> which use a custom object and a JSONObject to pass multiple params.
> >>>>
> >>>> I don't think this is a compelling argument, since this will be things
> >>>> that I'll have to write tests for.
> >>
> >> Shouldn't everything have tests? I can write tests for the change. The
> >> point of this was that there would be less boxing & unboxing and so
> >> should be less code involved instead of more code.
> >
> > This is more of the same duplicate code.
> >
> >>
> >> In the specific case of scroll events, I think there's also a
> >> performance consideration since we shouldn't be allocating a new
> >> object for every frame of a scroll.
> >>
> >
> > Seriously? We're dealing with a class that's the Java equivalent of a
> > struct.  I'd be way more concerned with any class that used
> > JSONObjects instead of a custom class due to the known problems with
> > JSON on Android.  onReceivedError is probably more memory inefficient
> > in reality.
>
> Sorry, my point with this is that scroll events are
> performance-sensitive because they fire on every frame of a scroll. We
> don't want to trigger a GC during a scroll.
>
>
> >
> >>>>
> >>>>> I actually didn't know half of these hooks existed, so I think even
> >>>>> just #1 is really compelling. We'd obviously need to keep delivering
> >>>>> these message for backwards-compatibility (except for maybe scroll -
> >>>>> it's pretty new)
> >>>>
> >>>> Honestly, I think that onMessage and postMessage are more flexible and
> >>>> are better than the alternative, which is to create hooks for
> >>>> everything, which will all have to have their own tests, and which
> >>>> will mean even more changes to plugins, which could break plugins and
> >>>> make the lives of the people who have to write APIs with our stuff
> >>>> suck even more.  This is at least another ten hooks that we're looking
> >>>> to add here, perhaps more.  It also means that if someone wants to
> >>>> extend this, they'll have to file another issue to get a hook added
> >>>> instead of just using postMessage and onMessage.  That's why I think
> >>>> this change is bad for the plugin developer, since this makes us even
> >>>> more of a bottleneck than we are now.
> >>
> >> I don't see any risk of breaking plugins in this change. It doesn't
> >> create any new test scenarios, but just fiddles how you detect a call
> >> to a plugin. This would be a completely backwards compatible change,
> >> I'm not proposing any breaking changes.
> >>
> >> I don't see this as adding new hooks. This is making existing hooks
> >> more explicit. To look at it another way, would you advocate changing
> >> the current existing explicit functions hooks into onMessage hooks?
> >
> > I think that this is adding more code for the sake of adding more code.
> >
> >> I don't think there's any getting around having people file bugs to
> >> get new hooks. Plugin developers do not want custom steps required for
> >> their plugin to work, which is why even with postMessage, this has
> >> been brought up.
> >
> > Right. In this case, there's a work-around that was done for the code
> > to work.  If we didn't have onMessage, there would be no work-around.
> Totally with you on this point.
>
> >
> > Honestly, this sounds like work for the sake of doing work.  If you
> > want to re-write all these hooks and add more code to plugin, as long
> > as it doesn't break all the plugins, and as long as the current tests
> > are re-written, I'll have to deal with it.  I don't have super strong
> > opinions about this change other than the fact that it looks like more
> > code, and my gut feeling that adding more code for the sake of adding
> > more code is bad.
>
> This isn't high on my priority list (I don't intend to spend time in
> the short term doing this), but I thought we should at least get on
> the same page in terms of how to add new plugin hooks.
>
>
> >
> > Joe
>

Reply via email to