chariotsolutions / phonegap-nfc

PhoneGap NFC Plugin
MIT License
712 stars 570 forks source link

Add onload for android #105

Closed don closed 10 years ago

don commented 10 years ago

See @AxelNennker doc updates https://github.com/apache/cordova-docs/pull/154/files

Might fix #99?

AxelNennker commented 10 years ago

Yep, definitely sounds the same issue I was experiencing.

Although I am not sure whether to put onload=true in plugin.xml really is the right solution in general. If you want your app to be started on the first tap it is the only solution. If you open your app then you can call some method of phonegap-nfc and the plugin is initialized and you do not have this problem. A plugin that needs to react to intent filters on Android needs onload=true. A plugin that needs to react to e.g. a file being opened on IOS needs onload=true because the plugin needs to register itself for this event.

This not related to phonegap-nfc only. All plugins that need OS-Events currently need onload=true.

But what Cordova is missing is a way for a plugin to express this: I want to get OS-Events (like onNewIntent on Android) but I do not need to be loaded on startup.

Each line in PluginManager.java like this “if (entry.plugin != null) {” https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/PluginManager.java#L307 currently prevents an OS-Event to be propagated to a plugin. The only way to get the event is to set “onload=true” or use a plugin method (thus creating a plugin instance).

But if the plugin only needs to get events after the app is started (like e.g. reading an NFC tag through the app) then creating the plugin instance is wasting startup time and memory resources.

I suggest to have <feature…>

and change all the line in PluginManager from

                “if (entry.plugin != null) {”

to

                “if (entry.plugin != null || (entry.osevent==true && entry.createPlugin(this.app, this.ctx)!=null)) {”

Changing https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/PluginEntry.java and the parser in PluginManager is simple… https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/PluginManager.java#L147

Although this new osevent param would need support in all platforms and docs and tests. Not a half-hour project…

Have fun Axel

From: Don Coleman [mailto:notifications@github.com] Sent: Saturday, November 16, 2013 5:37 PM To: chariotsolutions/phonegap-nfc Cc: AxelNennker Subject: [phonegap-nfc] Add onload for android (#105)

See @AxelNennkerhttps://github.com/AxelNennker doc updates https://github.com/apache/cordova-docs/pull/154/files

Might fix #99https://github.com/chariotsolutions/phonegap-nfc/issues/99?

— Reply to this email directly or view it on GitHubhttps://github.com/chariotsolutions/phonegap-nfc/issues/105.

AxelNennker commented 10 years ago

I don't see the difference between osevent and onload since the end result is that the plugin gets created on startup ?

On Sun, Nov 17, 2013 at 8:20 AM, Axel.Nennker@telekom.de wrote:

Yep, definitely sounds the same issue I was experiencing.

Although I am not sure whether to put onload=true in plugin.xml really is the right solution in general.

If you want your app to be started on the first tap it is the only solution.

If you open your app then you can call some method of phonegap-nfc and the plugin is initialized and you do not have this problem.

A plugin that needs to react to intent filters on Android needs onload=true.

A plugin that needs to react to e.g. a file being opened on IOS needs onload=true because the plugin needs to register itself for this event.

This not related to phonegap-nfc only. All plugins that need OS-Events currently need onload=true.

But what Cordova is missing is a way for a plugin to express this: I want to get OS-Events (like onNewIntent on Android) but I do not need to be loaded on startup.

Each line in PluginManager.java like this “if (entry.plugin != null) {”

https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/PluginManager.java#L307

currently prevents an OS-Event to be propagated to a plugin.

The only way to get the event is to set “onload=true” or use a plugin method (thus creating a plugin instance).

But if the plugin only needs to get events after the app is started (like e.g. reading an NFC tag through the app) then creating the plugin instance is wasting startup time and memory resources.

I suggest to have

<feature…>

and change all the line in PluginManager from

                “if (entry.plugin != null) {”

to

                “if (entry.plugin != null || (entry.osevent==true && entry.createPlugin(this.app, this.ctx)!=null)) {”

Changing

https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/PluginEntry.java

and the parser in PluginManager is simple…

https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/PluginManager.java#L147

Although this new osevent param would need support in all platforms and docs and tests. Not a half-hour project…

Have fun

Axel

From: Don Coleman [mailto:notifications@github.com] Sent: Saturday, November 16, 2013 5:37 PM To: chariotsolutions/phonegap-nfc Cc: AxelNennker Subject: [phonegap-nfc] Add onload for android (#105)

See @AxelNennker https://github.com/AxelNennker doc updates https://github.com/apache/cordova-docs/pull/154/files

Might fix #99 https://github.com/chariotsolutions/phonegap-nfc/issues/99 ?

— Reply to this email directly or view it on GitHubhttps://github.com/chariotsolutions/phonegap-nfc/issues/105 .[image: Description: Image removed by sender.]