mobile_template 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. data/lib/mobile_template/version.rb +1 -1
  2. data/mobile_template.gemspec +1 -1
  3. data/templates/assets/Gemfile +1 -1
  4. data/templates/assets/source/javascripts/vendor/cordova.js +2106 -1975
  5. data/templates/assets/source/javascripts/vendor/jquery.js +614 -477
  6. data/templates/assets/source/javascripts/vendor/jquery.mobile.js +519 -378
  7. data/templates/assets/source/stylesheets/vendor/jquery.mobile.css.scss +683 -502
  8. data/templates/cordova_android/VERSION +1 -1
  9. data/templates/cordova_android/bin/create +5 -1
  10. data/templates/cordova_android/bin/templates/project/cordova/create +5 -0
  11. data/templates/cordova_android/bin/templates/project/cordova/debug +1 -1
  12. data/templates/cordova_android/bin/templates/project/cordova/templates/project/AndroidManifest.xml +18 -25
  13. data/templates/cordova_android/bin/templates/project/cordova/templates/project/assets/www/index.html +6 -6
  14. data/templates/cordova_android/framework/assets/js/cordova.android.js +2106 -1975
  15. data/templates/cordova_android/framework/assets/www/index.html +1 -1
  16. data/templates/cordova_android/framework/build.xml +2 -42
  17. data/templates/cordova_android/framework/project.properties +1 -1
  18. data/templates/cordova_android/framework/res/drawable/splash.png +0 -0
  19. data/templates/cordova_android/framework/res/drawable-hdpi/icon.png +0 -0
  20. data/templates/cordova_android/framework/res/drawable-ldpi/icon.png +0 -0
  21. data/templates/cordova_android/framework/res/drawable-mdpi/icon.png +0 -0
  22. data/templates/cordova_android/framework/res/xml/plugins.xml +2 -1
  23. data/templates/cordova_android/framework/src/com/phonegap/api/PluginManager.java +1 -0
  24. data/templates/cordova_android/framework/src/org/apache/cordova/AudioPlayer.java +24 -16
  25. data/templates/cordova_android/framework/src/org/apache/cordova/CameraLauncher.java +35 -10
  26. data/templates/cordova_android/framework/src/org/apache/cordova/ContactAccessor.java +2 -1
  27. data/templates/cordova_android/framework/src/org/apache/cordova/ContactAccessorSdk5.java +67 -65
  28. data/templates/cordova_android/framework/src/org/apache/cordova/ContactManager.java +51 -63
  29. data/templates/cordova_android/framework/src/org/apache/cordova/CordovaChromeClient.java +3 -0
  30. data/templates/cordova_android/framework/src/org/apache/cordova/CordovaWebViewClient.java +6 -2
  31. data/templates/cordova_android/framework/src/org/apache/cordova/Device.java +108 -108
  32. data/templates/cordova_android/framework/src/org/apache/cordova/DroidGap.java +110 -77
  33. data/templates/cordova_android/framework/src/org/apache/cordova/FileTransfer.java +90 -44
  34. data/templates/cordova_android/framework/src/org/apache/cordova/FileUtils.java +20 -20
  35. data/templates/cordova_android/framework/src/org/apache/cordova/LinearLayoutSoftKeyboardDetect.java +2 -2
  36. data/templates/cordova_android/framework/src/org/apache/cordova/NetworkManager.java +7 -8
  37. data/templates/cordova_android/framework/src/org/apache/cordova/Notification.java +2 -2
  38. data/templates/cordova_android/framework/src/org/apache/cordova/SplashScreen.java +23 -0
  39. data/templates/cordova_android/framework/src/org/apache/cordova/Storage.java +3 -3
  40. data/templates/cordova_android/framework/src/org/apache/cordova/api/CordovaInterface.java +2 -0
  41. data/templates/cordova_android/framework/src/org/apache/cordova/api/PluginEntry.java +119 -0
  42. data/templates/cordova_android/framework/src/org/apache/cordova/api/PluginManager.java +260 -258
  43. data/templates/cordova_android/framework/src/org/apache/cordova/api/PluginResult.java +2 -2
  44. data/templates/cordova_android/releasenotes.md +42 -0
  45. data/templates/cordova_android/test/.classpath +8 -0
  46. data/templates/cordova_android/test/.project +33 -0
  47. data/templates/cordova_android/test/AndroidManifest.xml +87 -0
  48. data/templates/cordova_android/test/README.md +23 -0
  49. data/templates/cordova_android/test/ant.properties +17 -0
  50. data/templates/cordova_android/test/assets/www/backbuttonmultipage/index.html +23 -0
  51. data/templates/cordova_android/test/assets/www/backbuttonmultipage/sample2.html +23 -0
  52. data/templates/cordova_android/test/assets/www/backbuttonmultipage/sample3.html +26 -0
  53. data/templates/cordova_android/test/assets/www/background/index.html +99 -0
  54. data/templates/cordova_android/test/assets/www/background/index2.html +98 -0
  55. data/templates/cordova_android/test/assets/www/cordova-1.6.0.js +4985 -0
  56. data/templates/cordova_android/test/assets/www/cordova.js +2 -0
  57. data/templates/cordova_android/test/assets/www/htmlnotfound/error.html +1 -0
  58. data/templates/cordova_android/test/assets/www/iframe/index.html +33 -0
  59. data/templates/cordova_android/test/assets/www/iframe/index2.html +24 -0
  60. data/templates/cordova_android/test/assets/www/index.html +47 -0
  61. data/templates/cordova_android/test/assets/www/jqmtabbackbutton/index.html +49 -0
  62. data/templates/cordova_android/test/assets/www/jqmtabbackbutton/tab1.html +29 -0
  63. data/templates/cordova_android/test/assets/www/jqmtabbackbutton/tab2.html +30 -0
  64. data/templates/cordova_android/test/assets/www/jqmtabbackbutton/tab3.html +30 -0
  65. data/templates/cordova_android/test/assets/www/lifecycle/index.html +108 -0
  66. data/templates/cordova_android/test/assets/www/lifecycle/index2.html +104 -0
  67. data/templates/cordova_android/test/assets/www/main.js +150 -0
  68. data/templates/cordova_android/test/assets/www/master.css +117 -0
  69. data/templates/cordova_android/test/assets/www/menus/index.html +29 -0
  70. data/templates/cordova_android/test/assets/www/splashscreen/index.html +22 -0
  71. data/templates/cordova_android/test/assets/www/userwebview/index.html +49 -0
  72. data/templates/cordova_android/test/assets/www/whitelist/index.html +29 -0
  73. data/templates/cordova_android/test/assets/www/whitelist/index2.html +23 -0
  74. data/templates/cordova_android/test/assets/www/xhr/index.html +48 -0
  75. data/templates/cordova_android/test/build.xml +85 -0
  76. data/templates/cordova_android/test/libs/cordova-1.6.0.jar +0 -0
  77. data/templates/cordova_android/test/project.properties +11 -0
  78. data/templates/cordova_android/{framework → test}/res/drawable/icon.png +0 -0
  79. data/templates/cordova_android/test/res/drawable/sandy.jpg +0 -0
  80. data/templates/cordova_android/test/res/drawable-hdpi/ic_launcher.png +0 -0
  81. data/templates/cordova_android/test/res/drawable-ldpi/ic_launcher.png +0 -0
  82. data/templates/cordova_android/test/res/drawable-mdpi/ic_launcher.png +0 -0
  83. data/templates/cordova_android/test/res/layout/main.xml +13 -0
  84. data/templates/cordova_android/test/res/values/strings.xml +4 -0
  85. data/templates/cordova_android/{bin/templates/project/cordova/templates/project → test}/res/xml/cordova.xml +0 -0
  86. data/templates/cordova_android/{bin/templates/project/cordova/templates/project → test}/res/xml/plugins.xml +1 -1
  87. data/templates/cordova_android/test/src/org/apache/cordova/test/ActivityPlugin.java +81 -0
  88. data/templates/cordova_android/test/src/org/apache/cordova/test/FixWebView.java +43 -0
  89. data/templates/cordova_android/test/src/org/apache/cordova/test/backbuttonmultipage.java +30 -0
  90. data/templates/cordova_android/test/src/org/apache/cordova/test/background.java +34 -0
  91. data/templates/cordova_android/test/src/org/apache/cordova/test/errorurl.java +32 -0
  92. data/templates/cordova_android/test/src/org/apache/cordova/test/htmlnotfound.java +31 -0
  93. data/templates/cordova_android/test/src/org/apache/cordova/test/iframe.java +30 -0
  94. data/templates/cordova_android/test/src/org/apache/cordova/test/jqmtabbackbutton.java +30 -0
  95. data/templates/cordova_android/test/src/org/apache/cordova/test/lifecycle.java +30 -0
  96. data/templates/cordova_android/test/src/org/apache/cordova/test/loading.java +31 -0
  97. data/templates/cordova_android/test/src/org/apache/cordova/test/menus.java +80 -0
  98. data/templates/cordova_android/test/src/org/apache/cordova/test/splashscreen.java +35 -0
  99. data/templates/cordova_android/test/src/org/apache/cordova/test/tests.java +32 -0
  100. data/templates/cordova_android/test/src/org/apache/cordova/test/timeout.java +34 -0
  101. data/templates/cordova_android/test/src/org/apache/cordova/test/userwebview.java +72 -0
  102. data/templates/cordova_android/test/src/org/apache/cordova/test/whitelist.java +51 -0
  103. data/templates/cordova_android/test/src/org/apache/cordova/test/xhr.java +30 -0
  104. metadata +83 -30
  105. data/templates/cordova_android/framework/assets/js/accelerometer.js +0 -137
  106. data/templates/cordova_android/framework/assets/js/app.js +0 -89
  107. data/templates/cordova_android/framework/assets/js/battery.js +0 -134
  108. data/templates/cordova_android/framework/assets/js/camera.js +0 -168
  109. data/templates/cordova_android/framework/assets/js/capture.js +0 -203
  110. data/templates/cordova_android/framework/assets/js/compass.js +0 -168
  111. data/templates/cordova_android/framework/assets/js/contact.js +0 -310
  112. data/templates/cordova_android/framework/assets/js/cordova.js.base +0 -924
  113. data/templates/cordova_android/framework/assets/js/crypto.js +0 -54
  114. data/templates/cordova_android/framework/assets/js/device.js +0 -83
  115. data/templates/cordova_android/framework/assets/js/file.js +0 -1082
  116. data/templates/cordova_android/framework/assets/js/filetransfer.js +0 -125
  117. data/templates/cordova_android/framework/assets/js/geolocation.js +0 -209
  118. data/templates/cordova_android/framework/assets/js/header.txt +0 -19
  119. data/templates/cordova_android/framework/assets/js/media.js +0 -233
  120. data/templates/cordova_android/framework/assets/js/network.js +0 -100
  121. data/templates/cordova_android/framework/assets/js/notification.js +0 -133
  122. data/templates/cordova_android/framework/assets/js/position.js +0 -100
  123. data/templates/cordova_android/framework/assets/js/storage.js +0 -439
@@ -15,7 +15,7 @@
15
15
  KIND, either express or implied. See the License for the
16
16
  specific language governing permissions and limitations
17
17
  under the License.
18
- */
18
+ */
19
19
  package org.apache.cordova.api;
20
20
 
21
21
  import java.io.IOException;
@@ -29,7 +29,6 @@ import org.xmlpull.v1.XmlPullParserException;
29
29
 
30
30
  import android.content.Intent;
31
31
  import android.content.res.XmlResourceParser;
32
- import android.util.Log;
33
32
  import android.webkit.WebView;
34
33
 
35
34
  /**
@@ -39,321 +38,324 @@ import android.webkit.WebView;
39
38
  * from JavaScript.
40
39
  */
41
40
  public class PluginManager {
41
+ private static String TAG = "PluginManager";
42
+
43
+ // List of service entries
44
+ private final HashMap<String, PluginEntry> entries = new HashMap<String, PluginEntry>();
45
+
46
+ private final CordovaInterface ctx;
47
+ private final WebView app;
48
+
49
+ // Flag to track first time through
50
+ private boolean firstRun;
42
51
 
43
- private HashMap<String, IPlugin> plugins = new HashMap<String,IPlugin>();
44
- private HashMap<String, String> services = new HashMap<String,String>();
45
-
46
- private final CordovaInterface ctx;
47
- private final WebView app;
48
-
49
52
  // Map URL schemes like foo: to plugins that want to handle those schemes
50
53
  // This would allow how all URLs are handled to be offloaded to a plugin
51
- protected HashMap<String, String> urlMap = new HashMap<String,String>();
52
-
53
- /**
54
- * Constructor.
55
- *
56
- * @param app
57
- * @param ctx
58
- */
59
- public PluginManager(WebView app, CordovaInterface ctx) {
60
- this.ctx = ctx;
61
- this.app = app;
62
- this.loadPlugins();
63
- }
64
-
65
- /**
66
- * Re-init when loading a new HTML page into webview.
67
- */
68
- public void reinit() {
69
-
70
- // Stop plugins on current HTML page and discard
71
- this.onPause(false);
72
- this.onDestroy();
73
- this.plugins = new HashMap<String, IPlugin>();
74
- }
75
-
76
- /**
77
- * Load plugins from res/xml/plugins.xml
78
- */
79
- public void loadPlugins() {
80
- int id = ctx.getResources().getIdentifier("plugins", "xml", ctx.getPackageName());
81
- if (id == 0) { pluginConfigurationMissing(); }
82
- XmlResourceParser xml = ctx.getResources().getXml(id);
83
- int eventType = -1;
84
- String pluginClass = "", pluginName = "";
85
- while (eventType != XmlResourceParser.END_DOCUMENT) {
86
- if (eventType == XmlResourceParser.START_TAG) {
87
- String strNode = xml.getName();
88
- if (strNode.equals("plugin")) {
89
- pluginClass = xml.getAttributeValue(null, "value");
90
- pluginName = xml.getAttributeValue(null, "name");
91
- //System.out.println("Plugin: "+name+" => "+value);
92
- this.addService(pluginName, pluginClass);
93
-
94
- // Create plugin at load time if attribute "onload"
95
- if ("true".equals(xml.getAttributeValue(null, "onload"))) {
96
- this.getPlugin(pluginName);
97
- }
98
- } else if (strNode.equals("url-filter")) {
99
- this.urlMap.put(xml.getAttributeValue(null, "value"), pluginName);
100
- }
101
- }
102
- try {
103
- eventType = xml.next();
104
- } catch (XmlPullParserException e) {
105
- e.printStackTrace();
106
- } catch (IOException e) {
107
- e.printStackTrace();
108
- }
109
- }
110
- }
111
-
112
- /**
113
- * Receives a request for execution and fulfills it by finding the appropriate
114
- * Java class and calling it's execute method.
115
- *
116
- * PluginManager.exec can be used either synchronously or async. In either case, a JSON encoded
117
- * string is returned that will indicate if any errors have occurred when trying to find
118
- * or execute the class denoted by the clazz argument.
119
- *
120
- * @param service String containing the service to run
121
- * @param action String containt the action that the class is supposed to perform. This is
122
- * passed to the plugin execute method and it is up to the plugin developer
123
- * how to deal with it.
124
- * @param callbackId String containing the id of the callback that is execute in JavaScript if
125
- * this is an async plugin call.
126
- * @param args An Array literal string containing any arguments needed in the
127
- * plugin execute method.
128
- * @param async Boolean indicating whether the calling JavaScript code is expecting an
129
- * immediate return value. If true, either Cordova.callbackSuccess(...) or
130
- * Cordova.callbackError(...) is called once the plugin code has executed.
131
- *
132
- * @return JSON encoded string with a response message and status.
133
- */
134
- @SuppressWarnings("unchecked")
135
- public String exec(final String service, final String action, final String callbackId, final String jsonArgs, final boolean async) {
136
- PluginResult cr = null;
137
- boolean runAsync = async;
138
- try {
139
- final JSONArray args = new JSONArray(jsonArgs);
140
- final IPlugin plugin = this.getPlugin(service);
141
- final CordovaInterface ctx = this.ctx;
142
- if (plugin != null) {
143
- runAsync = async && !plugin.isSynch(action);
144
- if (runAsync) {
145
- // Run this on a different thread so that this one can return back to JS
146
- Thread thread = new Thread(new Runnable() {
147
- public void run() {
148
- try {
149
- // Call execute on the plugin so that it can do it's thing
150
- PluginResult cr = plugin.execute(action, args, callbackId);
151
- int status = cr.getStatus();
152
-
153
- // If no result to be sent and keeping callback, then no need to sent back to JavaScript
154
- if ((status == PluginResult.Status.NO_RESULT.ordinal()) && cr.getKeepCallback()) {
155
- }
156
-
157
- // Check the success (OK, NO_RESULT & !KEEP_CALLBACK)
158
- else if ((status == PluginResult.Status.OK.ordinal()) || (status == PluginResult.Status.NO_RESULT.ordinal())) {
159
- ctx.sendJavascript(cr.toSuccessCallbackString(callbackId));
160
- }
161
-
162
- // If error
163
- else {
164
- ctx.sendJavascript(cr.toErrorCallbackString(callbackId));
165
- }
166
- } catch (Exception e) {
167
- PluginResult cr = new PluginResult(PluginResult.Status.ERROR, e.getMessage());
168
- ctx.sendJavascript(cr.toErrorCallbackString(callbackId));
169
- }
170
- }
171
- });
172
- thread.start();
173
- return "";
174
- } else {
175
- // Call execute on the plugin so that it can do it's thing
176
- cr = plugin.execute(action, args, callbackId);
177
-
178
- // If no result to be sent and keeping callback, then no need to sent back to JavaScript
179
- if ((cr.getStatus() == PluginResult.Status.NO_RESULT.ordinal()) && cr.getKeepCallback()) {
180
- return "";
181
- }
182
- }
183
- }
184
- } catch (JSONException e) {
185
- System.out.println("ERROR: "+e.toString());
186
- cr = new PluginResult(PluginResult.Status.JSON_EXCEPTION);
187
- }
188
- // if async we have already returned at this point unless there was an error...
189
- if (runAsync) {
190
- if (cr == null) {
191
- cr = new PluginResult(PluginResult.Status.CLASS_NOT_FOUND_EXCEPTION);
192
- }
193
- ctx.sendJavascript(cr.toErrorCallbackString(callbackId));
194
- }
195
- return ( cr != null ? cr.getJSONString() : "{ status: 0, message: 'all good' }" );
196
- }
197
-
198
- /**
199
- * Get the class.
200
- *
201
- * @param clazz
202
- * @return
203
- * @throws ClassNotFoundException
204
- */
205
- @SuppressWarnings("unchecked")
206
- private Class getClassByName(final String clazz) throws ClassNotFoundException {
207
- Class c = null;
208
- if (clazz != null) {
209
- c = Class.forName(clazz);
210
- }
211
- return c;
212
- }
213
-
214
- /**
215
- * Get the interfaces that a class implements and see if it implements the
216
- * org.apache.cordova.api.Plugin interface.
217
- *
218
- * @param c The class to check the interfaces of.
219
- * @return Boolean indicating if the class implements org.apache.cordova.api.Plugin
220
- */
221
- @SuppressWarnings("unchecked")
222
- private boolean isCordovaPlugin(Class c) {
223
- if (c != null) {
224
- return org.apache.cordova.api.Plugin.class.isAssignableFrom(c) || org.apache.cordova.api.IPlugin.class.isAssignableFrom(c);
225
- }
226
- return false;
227
- }
54
+ protected HashMap<String, String> urlMap = new HashMap<String, String>();
228
55
 
229
56
  /**
230
- * Add plugin to be loaded and cached. This creates an instance of the plugin.
231
- * If plugin is already created, then just return it.
57
+ * Constructor.
232
58
  *
233
- * @param className The class to load
234
- * @param clazz The class object (must be a class object of the className)
235
- * @param callbackId The callback id to use when calling back into JavaScript
236
- * @return The plugin
59
+ * @param app
60
+ * @param ctx
61
+ */
62
+ public PluginManager(WebView app, CordovaInterface ctx) {
63
+ this.ctx = ctx;
64
+ this.app = app;
65
+ this.firstRun = true;
66
+ }
67
+
68
+ /**
69
+ * Init when loading a new HTML page into webview.
70
+ */
71
+ public void init() {
72
+ LOG.d(TAG, "init()");
73
+
74
+ // If first time, then load plugins from plugins.xml file
75
+ if (firstRun) {
76
+ this.loadPlugins();
77
+ firstRun = false;
78
+ }
79
+
80
+ // Stop plugins on current HTML page and discard plugin objects
81
+ else {
82
+ this.onPause(false);
83
+ this.onDestroy();
84
+ this.clearPluginObjects();
85
+ }
86
+
87
+ // Start up all plugins that have onload specified
88
+ this.startupPlugins();
89
+ }
90
+
91
+ /**
92
+ * Load plugins from res/xml/plugins.xml
93
+ */
94
+ public void loadPlugins() {
95
+ int id = ctx.getResources().getIdentifier("plugins", "xml", ctx.getPackageName());
96
+ if (id == 0) {
97
+ pluginConfigurationMissing();
98
+ }
99
+ XmlResourceParser xml = ctx.getResources().getXml(id);
100
+ int eventType = -1;
101
+ String service = "", pluginClass = "";
102
+ boolean onload = false;
103
+ PluginEntry entry = null;
104
+ while (eventType != XmlResourceParser.END_DOCUMENT) {
105
+ if (eventType == XmlResourceParser.START_TAG) {
106
+ String strNode = xml.getName();
107
+ if (strNode.equals("plugin")) {
108
+ service = xml.getAttributeValue(null, "name");
109
+ pluginClass = xml.getAttributeValue(null, "value");
110
+ // System.out.println("Plugin: "+name+" => "+value);
111
+ onload = "true".equals(xml.getAttributeValue(null, "onload"));
112
+ entry = new PluginEntry(service, pluginClass, onload);
113
+ this.addService(entry);
114
+ } else if (strNode.equals("url-filter")) {
115
+ this.urlMap.put(xml.getAttributeValue(null, "value"), service);
116
+ }
117
+ }
118
+ try {
119
+ eventType = xml.next();
120
+ } catch (XmlPullParserException e) {
121
+ e.printStackTrace();
122
+ } catch (IOException e) {
123
+ e.printStackTrace();
124
+ }
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Delete all plugin objects.
237
130
  */
238
- @SuppressWarnings("unchecked")
239
- private IPlugin addPlugin(String pluginName, String className) {
240
- try {
241
- Class c = getClassByName(className);
242
- if (isCordovaPlugin(c)) {
243
- IPlugin plugin = (IPlugin)c.newInstance();
244
- this.plugins.put(className, plugin);
245
- plugin.setContext(this.ctx);
246
- plugin.setView(this.app);
247
- return plugin;
248
- }
249
- } catch (Exception e) {
250
- e.printStackTrace();
251
- System.out.println("Error adding plugin "+className+".");
252
- }
253
- return null;
131
+ public void clearPluginObjects() {
132
+ for (PluginEntry entry : this.entries.values()) {
133
+ entry.plugin = null;
134
+ }
254
135
  }
255
-
136
+
256
137
  /**
257
- * Get the loaded plugin.
138
+ * Create plugins objects that have onload set.
139
+ */
140
+ public void startupPlugins() {
141
+ for (PluginEntry entry : this.entries.values()) {
142
+ if (entry.onload) {
143
+ entry.createPlugin(this.app, this.ctx);
144
+ }
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Receives a request for execution and fulfills it by finding the appropriate
150
+ * Java class and calling it's execute method.
151
+ *
152
+ * PluginManager.exec can be used either synchronously or async. In either case, a JSON encoded
153
+ * string is returned that will indicate if any errors have occurred when trying to find
154
+ * or execute the class denoted by the clazz argument.
258
155
  *
259
- * If the plugin is not already loaded then load it.
156
+ * @param service String containing the service to run
157
+ * @param action String containt the action that the class is supposed to perform. This is
158
+ * passed to the plugin execute method and it is up to the plugin developer
159
+ * how to deal with it.
160
+ * @param callbackId String containing the id of the callback that is execute in JavaScript if
161
+ * this is an async plugin call.
162
+ * @param args An Array literal string containing any arguments needed in the
163
+ * plugin execute method.
164
+ * @param async Boolean indicating whether the calling JavaScript code is expecting an
165
+ * immediate return value. If true, either Cordova.callbackSuccess(...) or
166
+ * Cordova.callbackError(...) is called once the plugin code has executed.
260
167
  *
261
- * @param className The class of the loaded plugin.
262
- * @return
168
+ * @return JSON encoded string with a response message and status.
263
169
  */
264
- private IPlugin getPlugin(String pluginName) {
265
- String className = this.services.get(pluginName);
266
- if (this.plugins.containsKey(className)) {
267
- return this.plugins.get(className);
268
- } else {
269
- return this.addPlugin(pluginName, className);
270
- }
170
+ @SuppressWarnings("unchecked")
171
+ public String exec(final String service, final String action, final String callbackId, final String jsonArgs, final boolean async) {
172
+ PluginResult cr = null;
173
+ boolean runAsync = async;
174
+ try {
175
+ final JSONArray args = new JSONArray(jsonArgs);
176
+ final IPlugin plugin = this.getPlugin(service);
177
+ final CordovaInterface ctx = this.ctx;
178
+ if (plugin != null) {
179
+ runAsync = async && !plugin.isSynch(action);
180
+ if (runAsync) {
181
+ // Run this on a different thread so that this one can return back to JS
182
+ Thread thread = new Thread(new Runnable() {
183
+ public void run() {
184
+ try {
185
+ // Call execute on the plugin so that it can do it's thing
186
+ PluginResult cr = plugin.execute(action, args, callbackId);
187
+ int status = cr.getStatus();
188
+
189
+ // If no result to be sent and keeping callback, then no need to sent back to JavaScript
190
+ if ((status == PluginResult.Status.NO_RESULT.ordinal()) && cr.getKeepCallback()) {
191
+ }
192
+
193
+ // Check the success (OK, NO_RESULT & !KEEP_CALLBACK)
194
+ else if ((status == PluginResult.Status.OK.ordinal()) || (status == PluginResult.Status.NO_RESULT.ordinal())) {
195
+ ctx.sendJavascript(cr.toSuccessCallbackString(callbackId));
196
+ }
197
+
198
+ // If error
199
+ else {
200
+ ctx.sendJavascript(cr.toErrorCallbackString(callbackId));
201
+ }
202
+ } catch (Exception e) {
203
+ PluginResult cr = new PluginResult(PluginResult.Status.ERROR, e.getMessage());
204
+ ctx.sendJavascript(cr.toErrorCallbackString(callbackId));
205
+ }
206
+ }
207
+ });
208
+ thread.start();
209
+ return "";
210
+ } else {
211
+ // Call execute on the plugin so that it can do it's thing
212
+ cr = plugin.execute(action, args, callbackId);
213
+
214
+ // If no result to be sent and keeping callback, then no need to sent back to JavaScript
215
+ if ((cr.getStatus() == PluginResult.Status.NO_RESULT.ordinal()) && cr.getKeepCallback()) {
216
+ return "";
217
+ }
218
+ }
219
+ }
220
+ } catch (JSONException e) {
221
+ System.out.println("ERROR: " + e.toString());
222
+ cr = new PluginResult(PluginResult.Status.JSON_EXCEPTION);
223
+ }
224
+ // if async we have already returned at this point unless there was an error...
225
+ if (runAsync) {
226
+ if (cr == null) {
227
+ cr = new PluginResult(PluginResult.Status.CLASS_NOT_FOUND_EXCEPTION);
228
+ }
229
+ ctx.sendJavascript(cr.toErrorCallbackString(callbackId));
230
+ }
231
+ return (cr != null ? cr.getJSONString() : "{ status: 0, message: 'all good' }");
271
232
  }
272
-
233
+
273
234
  /**
274
- * Add a class that implements a service.
275
- * This does not create the class instance. It just maps service name to class name.
235
+ * Get the plugin object that implements the service.
236
+ * If the plugin object does not already exist, then create it.
237
+ * If the service doesn't exist, then return null.
276
238
  *
277
- * @param serviceType
278
- * @param className
239
+ * @param service The name of the service.
240
+ * @return IPlugin or null
279
241
  */
280
- public void addService(String serviceType, String className) {
281
- this.services.put(serviceType, className);
242
+ private IPlugin getPlugin(String service) {
243
+ PluginEntry entry = entries.get(service);
244
+ if (entry == null) {
245
+ return null;
246
+ }
247
+ IPlugin plugin = entry.plugin;
248
+ if (plugin == null) {
249
+ plugin = entry.createPlugin(this.app, this.ctx);
250
+ }
251
+ return plugin;
282
252
  }
283
253
 
284
254
  /**
285
- * Called when the system is about to start resuming a previous activity.
255
+ * Add a plugin class that implements a service to the service entry table.
256
+ * This does not create the plugin object instance.
286
257
  *
287
- * @param multitasking Flag indicating if multitasking is turned on for app
258
+ * @param service The service name
259
+ * @param className The plugin class name
260
+ */
261
+ public void addService(String service, String className) {
262
+ PluginEntry entry = new PluginEntry(service, className, false);
263
+ this.addService(entry);
264
+ }
265
+
266
+ /**
267
+ * Add a plugin class that implements a service to the service entry table.
268
+ * This does not create the plugin object instance.
269
+ *
270
+ * @param entry The plugin entry
271
+ */
272
+ public void addService(PluginEntry entry) {
273
+ this.entries.put(entry.service, entry);
274
+ }
275
+
276
+ /**
277
+ * Called when the system is about to start resuming a previous activity.
278
+ *
279
+ * @param multitasking Flag indicating if multitasking is turned on for app
288
280
  */
289
281
  public void onPause(boolean multitasking) {
290
- for (IPlugin plugin : this.plugins.values()) {
291
- plugin.onPause(multitasking);
282
+ for (PluginEntry entry : this.entries.values()) {
283
+ if (entry.plugin != null) {
284
+ entry.plugin.onPause(multitasking);
285
+ }
292
286
  }
293
287
  }
294
-
288
+
295
289
  /**
296
- * Called when the activity will start interacting with the user.
290
+ * Called when the activity will start interacting with the user.
297
291
  *
298
- * @param multitasking Flag indicating if multitasking is turned on for app
292
+ * @param multitasking Flag indicating if multitasking is turned on for app
299
293
  */
300
294
  public void onResume(boolean multitasking) {
301
- for (IPlugin plugin : this.plugins.values()) {
302
- plugin.onResume(multitasking);
295
+ for (PluginEntry entry : this.entries.values()) {
296
+ if (entry.plugin != null) {
297
+ entry.plugin.onResume(multitasking);
298
+ }
303
299
  }
304
300
  }
305
301
 
306
302
  /**
307
- * The final call you receive before your activity is destroyed.
303
+ * The final call you receive before your activity is destroyed.
308
304
  */
309
305
  public void onDestroy() {
310
- for (IPlugin plugin : this.plugins.values()) {
311
- plugin.onDestroy();
306
+ for (PluginEntry entry : this.entries.values()) {
307
+ if (entry.plugin != null) {
308
+ entry.plugin.onDestroy();
309
+ }
312
310
  }
313
311
  }
314
312
 
315
313
  /**
316
- * Send a message to all plugins.
314
+ * Send a message to all plugins.
317
315
  *
318
- * @param id The message id
319
- * @param data The message data
316
+ * @param id The message id
317
+ * @param data The message data
320
318
  */
321
319
  public void postMessage(String id, Object data) {
322
- for (IPlugin plugin : this.plugins.values()) {
323
- plugin.onMessage(id, data);
320
+ for (PluginEntry entry : this.entries.values()) {
321
+ if (entry.plugin != null) {
322
+ entry.plugin.onMessage(id, data);
323
+ }
324
324
  }
325
325
  }
326
326
 
327
327
  /**
328
- * Called when the activity receives a new intent.
329
- */
328
+ * Called when the activity receives a new intent.
329
+ */
330
330
  public void onNewIntent(Intent intent) {
331
- for (IPlugin plugin : this.plugins.values()) {
332
- plugin.onNewIntent(intent);
331
+ for (PluginEntry entry : this.entries.values()) {
332
+ if (entry.plugin != null) {
333
+ entry.plugin.onNewIntent(intent);
334
+ }
333
335
  }
334
336
  }
335
337
 
336
338
  /**
337
339
  * Called when the URL of the webview changes.
338
340
  *
339
- * @param url The URL that is being changed to.
340
- * @return Return false to allow the URL to load, return true to prevent the URL from loading.
341
+ * @param url The URL that is being changed to.
342
+ * @return Return false to allow the URL to load, return true to prevent the URL from loading.
341
343
  */
342
344
  public boolean onOverrideUrlLoading(String url) {
343
- Iterator<Entry<String, String>> it = this.urlMap.entrySet().iterator();
345
+ Iterator<Entry<String, String>> it = this.urlMap.entrySet().iterator();
344
346
  while (it.hasNext()) {
345
347
  HashMap.Entry<String, String> pairs = it.next();
346
348
  if (url.startsWith(pairs.getKey())) {
347
- return this.getPlugin(pairs.getValue()).onOverrideUrlLoading(url);
349
+ return this.getPlugin(pairs.getValue()).onOverrideUrlLoading(url);
348
350
  }
349
351
  }
350
- return false;
352
+ return false;
351
353
  }
352
354
 
353
- private void pluginConfigurationMissing() {
354
- System.err.println("=====================================================================================");
355
- System.err.println("ERROR: plugin.xml is missing. Add res/xml/plugins.xml to your project.");
356
- System.err.println("https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=blob;f=framework/res/xml/plugins.xml");
357
- System.err.println("=====================================================================================");
358
- }
355
+ private void pluginConfigurationMissing() {
356
+ System.err.println("=====================================================================================");
357
+ System.err.println("ERROR: plugin.xml is missing. Add res/xml/plugins.xml to your project.");
358
+ System.err.println("https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=blob;f=framework/res/xml/plugins.xml");
359
+ System.err.println("=====================================================================================");
360
+ }
359
361
  }
@@ -84,11 +84,11 @@ public class PluginResult {
84
84
  }
85
85
 
86
86
  public String toSuccessCallbackString(String callbackId) {
87
- return "require('cordova').callbackSuccess('"+callbackId+"',"+this.getJSONString()+");";
87
+ return "cordova.callbackSuccess('"+callbackId+"',"+this.getJSONString()+");";
88
88
  }
89
89
 
90
90
  public String toErrorCallbackString(String callbackId) {
91
- return "require('cordova').callbackError('"+callbackId+"', " + this.getJSONString()+ ");";
91
+ return "cordova.callbackError('"+callbackId+"', " + this.getJSONString()+ ");";
92
92
  }
93
93
 
94
94
  public static String[] StatusMessages = new String[] {
@@ -0,0 +1,42 @@
1
+ Bryce Curtis (5):
2
+ [CB-352] Support initializing DroidGap with existing WebView, WebViewClient and webViewChrome. [CB-353] Create PluginEntry object to use by PluginManager.
3
+ [CB-367] Back button event should fire on key up not key down Also changed menu key and search key to be consistent.
4
+ Tests to verify Android native features.
5
+ [CB-423] Problem displaying patch-9 splash screen.
6
+ Update project template cordova.js reference and title.
7
+
8
+ Fil Maj (6):
9
+ switched from "require" syntax to "cordova.require"
10
+ cordova.require("cordova") is pretty funny. wish i didnt write it
11
+ updates to JS: removing require+define from global scope, tweaking geolocation code, online/offline events fire on document now
12
+ removed old javascript files and removed unused target + commented out lines in build.xml
13
+ spacing fixes, null check in getPhoneType in contacts, returning error integers instead of objects in contacts
14
+ updating network status plugin label and updating cordova-js to latest
15
+
16
+ Joe Bowser (11):
17
+ We show the default 404 on non-resolved domains
18
+ Fixing CB-210 with patch and adding fix for CB-210
19
+ Tweaked File Transfer to fix CB-74
20
+ Changing to the modern icon
21
+ Added temporary Cordova splash for now
22
+ Checking for the callback server before we call sendJavascript for the Kindle Fire, CB-247
23
+ Fixing CB-343: We need to respect the whitelist
24
+ Fixing a bug with File Upload on Android where Chunked mode isn't used by default
25
+ First stab at CB-21, I really need more info before I can close this
26
+ Tagged 1.6rc1
27
+ Fixing the template, since this doesn't have to be unit tested. :)
28
+
29
+ macdonst (12):
30
+ CB-383: Fixes issue with misspelled destinationType for Camera.getPicture()
31
+ Fix for CB-389: resolveLocalFileSystemURI does not work on a resized image captured from Camera.getPicture()
32
+ Fixing license header in com.phonegap.api.PluginManager
33
+ CB-321: Media API: 'mediaSuccess' callback param to new Media() is called soon after new obj created
34
+ CB-163: contactFindOptions.filter does not work as expected on Android
35
+ CB-426: camera.getPicture ignores mediaType in 1.5
36
+ Updating cordova.android.js for CB-421 and CB-426
37
+ CB-438: File metadata.modificationTime returns an invalid date
38
+ Return MediaError object and not error code from native side of Media API
39
+ CB-446: Enhance setting data source for local files in AudioPlayer
40
+ CB-453: FileWriter.append - Chinese characters are not appended to the file correctly
41
+ CB-446: Enhance setting data source for local files in AudioPlayer
42
+
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <classpath>
3
+ <classpathentry kind="src" path="src"/>
4
+ <classpathentry kind="src" path="gen"/>
5
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
6
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
7
+ <classpathentry kind="output" path="bin/classes"/>
8
+ </classpath>