You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2013/06/29 03:53:20 UTC
[3/4] [CB-4038] Move non-deprecated classes from the api package into
the main package.
http://git-wip-us.apache.org/repos/asf/cordova-android/blob/79829f62/framework/src/org/apache/cordova/api/PluginManager.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/PluginManager.java b/framework/src/org/apache/cordova/api/PluginManager.java
index 083e882..d7fddfe 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -18,421 +18,10 @@
*/
package org.apache.cordova.api;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map.Entry;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.cordova.CordovaArgs;
import org.apache.cordova.CordovaWebView;
-import org.apache.cordova.UriResolver;
-import org.json.JSONException;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.Intent;
-import android.content.res.XmlResourceParser;
-
-import android.net.Uri;
-import android.util.Log;
-import android.webkit.WebResourceResponse;
-
-/**
- * PluginManager is exposed to JavaScript in the Cordova WebView.
- *
- * Calling native plugin code can be done by calling PluginManager.exec(...)
- * from JavaScript.
- */
-public class PluginManager {
- private static String TAG = "PluginManager";
-
- // List of service entries
- private final HashMap<String, PluginEntry> entries = new HashMap<String, PluginEntry>();
-
- private final CordovaInterface ctx;
- private final CordovaWebView app;
- // Flag to track first time through
- private boolean firstRun;
-
- // Map URL schemes like foo: to plugins that want to handle those schemes
- // This would allow how all URLs are handled to be offloaded to a plugin
- protected HashMap<String, String> urlMap = new HashMap<String, String>();
-
- private AtomicInteger numPendingUiExecs;
-
- /**
- * Constructor.
- *
- * @param app
- * @param ctx
- */
+public class PluginManager extends org.apache.cordova.PluginManager {
public PluginManager(CordovaWebView app, CordovaInterface ctx) {
- this.ctx = ctx;
- this.app = app;
- this.firstRun = true;
- this.numPendingUiExecs = new AtomicInteger(0);
- }
-
- /**
- * Init when loading a new HTML page into webview.
- */
- public void init() {
- LOG.d(TAG, "init()");
-
- // If first time, then load plugins from config.xml file
- if (this.firstRun) {
- this.loadPlugins();
- this.firstRun = false;
- }
-
- // Stop plugins on current HTML page and discard plugin objects
- else {
- this.onPause(false);
- this.onDestroy();
- this.clearPluginObjects();
- }
-
- // Insert PluginManager service
- this.addService(new PluginEntry("PluginManager", new PluginManagerService()));
-
- // Start up all plugins that have onload specified
- this.startupPlugins();
- }
-
- /**
- * Load plugins from res/xml/config.xml
- */
- public void loadPlugins() {
- int id = this.ctx.getActivity().getResources().getIdentifier("config", "xml", this.ctx.getActivity().getPackageName());
- if(id == 0)
- {
- id = this.ctx.getActivity().getResources().getIdentifier("plugins", "xml", this.ctx.getActivity().getPackageName());
- LOG.i(TAG, "Using plugins.xml instead of config.xml. plugins.xml will eventually be deprecated");
- }
- if (id == 0) {
- this.pluginConfigurationMissing();
- //We have the error, we need to exit without crashing!
- return;
- }
- XmlResourceParser xml = this.ctx.getActivity().getResources().getXml(id);
- int eventType = -1;
- String service = "", pluginClass = "", paramType = "";
- boolean onload = false;
- boolean insideFeature = false;
- while (eventType != XmlResourceParser.END_DOCUMENT) {
- if (eventType == XmlResourceParser.START_TAG) {
- String strNode = xml.getName();
- //This is for the old scheme
- if (strNode.equals("plugin")) {
- service = xml.getAttributeValue(null, "name");
- pluginClass = xml.getAttributeValue(null, "value");
- Log.d(TAG, "<plugin> tags are deprecated, please use <features> instead. <plugin> will no longer work as of Cordova 3.0");
- onload = "true".equals(xml.getAttributeValue(null, "onload"));
- }
- //What is this?
- else if (strNode.equals("url-filter")) {
- this.urlMap.put(xml.getAttributeValue(null, "value"), service);
- }
- else if (strNode.equals("feature")) {
- //Check for supported feature sets aka. plugins (Accelerometer, Geolocation, etc)
- //Set the bit for reading params
- insideFeature = true;
- service = xml.getAttributeValue(null, "name");
- }
- else if (insideFeature && strNode.equals("param")) {
- paramType = xml.getAttributeValue(null, "name");
- if (paramType.equals("service")) // check if it is using the older service param
- service = xml.getAttributeValue(null, "value");
- else if (paramType.equals("package") || paramType.equals("android-package"))
- pluginClass = xml.getAttributeValue(null,"value");
- else if (paramType.equals("onload"))
- onload = "true".equals(xml.getAttributeValue(null, "value"));
- }
- }
- else if (eventType == XmlResourceParser.END_TAG)
- {
- String strNode = xml.getName();
- if (strNode.equals("feature") || strNode.equals("plugin"))
- {
- PluginEntry entry = new PluginEntry(service, pluginClass, onload);
- this.addService(entry);
-
- //Empty the strings to prevent plugin loading bugs
- service = "";
- pluginClass = "";
- insideFeature = false;
- }
- }
- try {
- eventType = xml.next();
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- /**
- * Delete all plugin objects.
- */
- public void clearPluginObjects() {
- for (PluginEntry entry : this.entries.values()) {
- entry.plugin = null;
- }
- }
-
- /**
- * Create plugins objects that have onload set.
- */
- public void startupPlugins() {
- for (PluginEntry entry : this.entries.values()) {
- if (entry.onload) {
- entry.createPlugin(this.app, this.ctx);
- }
- }
- }
-
- /**
- * Receives a request for execution and fulfills it by finding the appropriate
- * Java class and calling it's execute method.
- *
- * PluginManager.exec can be used either synchronously or async. In either case, a JSON encoded
- * string is returned that will indicate if any errors have occurred when trying to find
- * or execute the class denoted by the clazz argument.
- *
- * @param service String containing the service to run
- * @param action String containing the action that the class is supposed to perform. This is
- * passed to the plugin execute method and it is up to the plugin developer
- * how to deal with it.
- * @param callbackId String containing the id of the callback that is execute in JavaScript if
- * this is an async plugin call.
- * @param rawArgs An Array literal string containing any arguments needed in the
- * plugin execute method.
- */
- public void exec(final String service, final String action, final String callbackId, final String rawArgs) {
- if (numPendingUiExecs.get() > 0) {
- numPendingUiExecs.getAndIncrement();
- this.ctx.getActivity().runOnUiThread(new Runnable() {
- public void run() {
- execHelper(service, action, callbackId, rawArgs);
- numPendingUiExecs.getAndDecrement();
- }
- });
- } else {
- execHelper(service, action, callbackId, rawArgs);
- }
- }
-
- private void execHelper(final String service, final String action, final String callbackId, final String rawArgs) {
- CordovaPlugin plugin = getPlugin(service);
- if (plugin == null) {
- Log.d(TAG, "exec() call to unknown plugin: " + service);
- PluginResult cr = new PluginResult(PluginResult.Status.CLASS_NOT_FOUND_EXCEPTION);
- app.sendPluginResult(cr, callbackId);
- return;
- }
- try {
- CallbackContext callbackContext = new CallbackContext(callbackId, app);
- boolean wasValidAction = plugin.execute(action, rawArgs, callbackContext);
- if (!wasValidAction) {
- PluginResult cr = new PluginResult(PluginResult.Status.INVALID_ACTION);
- app.sendPluginResult(cr, callbackId);
- }
- } catch (JSONException e) {
- PluginResult cr = new PluginResult(PluginResult.Status.JSON_EXCEPTION);
- app.sendPluginResult(cr, callbackId);
- }
- }
-
- @Deprecated
- public void exec(String service, String action, String callbackId, String jsonArgs, boolean async) {
- exec(service, action, callbackId, jsonArgs);
- }
-
- /**
- * Get the plugin object that implements the service.
- * If the plugin object does not already exist, then create it.
- * If the service doesn't exist, then return null.
- *
- * @param service The name of the service.
- * @return CordovaPlugin or null
- */
- public CordovaPlugin getPlugin(String service) {
- PluginEntry entry = this.entries.get(service);
- if (entry == null) {
- return null;
- }
- CordovaPlugin plugin = entry.plugin;
- if (plugin == null) {
- plugin = entry.createPlugin(this.app, this.ctx);
- }
- return plugin;
- }
-
- /**
- * Add a plugin class that implements a service to the service entry table.
- * This does not create the plugin object instance.
- *
- * @param service The service name
- * @param className The plugin class name
- */
- public void addService(String service, String className) {
- PluginEntry entry = new PluginEntry(service, className, false);
- this.addService(entry);
- }
-
- /**
- * Add a plugin class that implements a service to the service entry table.
- * This does not create the plugin object instance.
- *
- * @param entry The plugin entry
- */
- public void addService(PluginEntry entry) {
- this.entries.put(entry.service, entry);
- }
-
- /**
- * Called when the system is about to start resuming a previous activity.
- *
- * @param multitasking Flag indicating if multitasking is turned on for app
- */
- public void onPause(boolean multitasking) {
- for (PluginEntry entry : this.entries.values()) {
- if (entry.plugin != null) {
- entry.plugin.onPause(multitasking);
- }
- }
- }
-
- /**
- * Called when the activity will start interacting with the user.
- *
- * @param multitasking Flag indicating if multitasking is turned on for app
- */
- public void onResume(boolean multitasking) {
- for (PluginEntry entry : this.entries.values()) {
- if (entry.plugin != null) {
- entry.plugin.onResume(multitasking);
- }
- }
- }
-
- /**
- * The final call you receive before your activity is destroyed.
- */
- public void onDestroy() {
- for (PluginEntry entry : this.entries.values()) {
- if (entry.plugin != null) {
- entry.plugin.onDestroy();
- }
- }
- }
-
- /**
- * Send a message to all plugins.
- *
- * @param id The message id
- * @param data The message data
- * @return
- */
- public Object postMessage(String id, Object data) {
- Object obj = this.ctx.onMessage(id, data);
- if (obj != null) {
- return obj;
- }
- for (PluginEntry entry : this.entries.values()) {
- if (entry.plugin != null) {
- obj = entry.plugin.onMessage(id, data);
- if (obj != null) {
- return obj;
- }
- }
- }
- return null;
- }
-
- /**
- * Called when the activity receives a new intent.
- */
- public void onNewIntent(Intent intent) {
- for (PluginEntry entry : this.entries.values()) {
- if (entry.plugin != null) {
- entry.plugin.onNewIntent(intent);
- }
- }
- }
-
- /**
- * Called when the URL of the webview changes.
- *
- * @param url The URL that is being changed to.
- * @return Return false to allow the URL to load, return true to prevent the URL from loading.
- */
- public boolean onOverrideUrlLoading(String url) {
- Iterator<Entry<String, String>> it = this.urlMap.entrySet().iterator();
- while (it.hasNext()) {
- HashMap.Entry<String, String> pairs = it.next();
- if (url.startsWith(pairs.getKey())) {
- return this.getPlugin(pairs.getValue()).onOverrideUrlLoading(url);
- }
- }
- return false;
- }
-
- /**
- * Called when the app navigates or refreshes.
- */
- public void onReset() {
- Iterator<PluginEntry> it = this.entries.values().iterator();
- while (it.hasNext()) {
- CordovaPlugin plugin = it.next().plugin;
- if (plugin != null) {
- plugin.onReset();
- }
- }
- }
-
-
- private void pluginConfigurationMissing() {
- LOG.e(TAG, "=====================================================================================");
- LOG.e(TAG, "ERROR: config.xml is missing. Add res/xml/config.xml to your project.");
- LOG.e(TAG, "https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=blob;f=framework/res/xml/plugins.xml");
- LOG.e(TAG, "=====================================================================================");
- }
-
- /* Should be package private */ public UriResolver resolveUri(Uri uri) {
- for (PluginEntry entry : this.entries.values()) {
- if (entry.plugin != null) {
- UriResolver ret = entry.plugin.resolveUri(uri);
- if (ret != null) {
- return ret;
- }
- }
- }
- return null;
- }
-
- private class PluginManagerService extends CordovaPlugin {
- @Override
- public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException {
- if ("startup".equals(action)) {
- // The onPageStarted event of CordovaWebViewClient resets the queue of messages to be returned to javascript in response
- // to exec calls. Since this event occurs on the UI thread and exec calls happen on the WebCore thread it is possible
- // that onPageStarted occurs after exec calls have started happening on a new page, which can cause the message queue
- // to be reset between the queuing of a new message and its retrieval by javascript. To avoid this from happening,
- // javascript always sends a "startup" exec upon loading a new page which causes all future exec calls to happen on the UI
- // thread (and hence after onPageStarted) until there are no more pending exec calls remaining.
- numPendingUiExecs.getAndIncrement();
- ctx.getActivity().runOnUiThread(new Runnable() {
- public void run() {
- numPendingUiExecs.getAndDecrement();
- }
- });
- return true;
- }
- return false;
- }
+ super(app, ctx);
}
}
http://git-wip-us.apache.org/repos/asf/cordova-android/blob/79829f62/framework/src/org/apache/cordova/api/PluginResult.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/PluginResult.java b/framework/src/org/apache/cordova/api/PluginResult.java
index a642200..39d3983 100755
--- a/framework/src/org/apache/cordova/api/PluginResult.java
+++ b/framework/src/org/apache/cordova/api/PluginResult.java
@@ -21,159 +21,40 @@ package org.apache.cordova.api;
import org.json.JSONArray;
import org.json.JSONObject;
-import android.util.Base64;
-
-public class PluginResult {
- private final int status;
- private final int messageType;
- private boolean keepCallback = false;
- private String strMessage;
- private String encodedMessage;
-
+public class PluginResult extends org.apache.cordova.PluginResult {
public PluginResult(Status status) {
- this(status, PluginResult.StatusMessages[status.ordinal()]);
+ super(status);
}
public PluginResult(Status status, String message) {
- this.status = status.ordinal();
- this.messageType = message == null ? MESSAGE_TYPE_NULL : MESSAGE_TYPE_STRING;
- this.strMessage = message;
+ super(status, message);
}
public PluginResult(Status status, JSONArray message) {
- this.status = status.ordinal();
- this.messageType = MESSAGE_TYPE_JSON;
- encodedMessage = message.toString();
+ super(status, message);
}
public PluginResult(Status status, JSONObject message) {
- this.status = status.ordinal();
- this.messageType = MESSAGE_TYPE_JSON;
- encodedMessage = message.toString();
+ super(status, message);
}
public PluginResult(Status status, int i) {
- this.status = status.ordinal();
- this.messageType = MESSAGE_TYPE_NUMBER;
- this.encodedMessage = ""+i;
+ super(status, i);
}
public PluginResult(Status status, float f) {
- this.status = status.ordinal();
- this.messageType = MESSAGE_TYPE_NUMBER;
- this.encodedMessage = ""+f;
+ super(status, f);
}
public PluginResult(Status status, boolean b) {
- this.status = status.ordinal();
- this.messageType = MESSAGE_TYPE_BOOLEAN;
- this.encodedMessage = Boolean.toString(b);
+ super(status, b);
}
public PluginResult(Status status, byte[] data) {
- this(status, data, false);
+ super(status, data);
}
public PluginResult(Status status, byte[] data, boolean binaryString) {
- this.status = status.ordinal();
- this.messageType = binaryString ? MESSAGE_TYPE_BINARYSTRING : MESSAGE_TYPE_ARRAYBUFFER;
- this.encodedMessage = Base64.encodeToString(data, Base64.NO_WRAP);
- }
-
- public void setKeepCallback(boolean b) {
- this.keepCallback = b;
- }
-
- public int getStatus() {
- return status;
- }
-
- public int getMessageType() {
- return messageType;
- }
-
- public String getMessage() {
- if (encodedMessage == null) {
- encodedMessage = JSONObject.quote(strMessage);
- }
- return encodedMessage;
- }
-
- /**
- * If messageType == MESSAGE_TYPE_STRING, then returns the message string.
- * Otherwise, returns null.
- */
- public String getStrMessage() {
- return strMessage;
- }
-
- public boolean getKeepCallback() {
- return this.keepCallback;
- }
-
- @Deprecated // Use sendPluginResult instead of sendJavascript.
- public String getJSONString() {
- return "{\"status\":" + this.status + ",\"message\":" + this.getMessage() + ",\"keepCallback\":" + this.keepCallback + "}";
- }
-
- @Deprecated // Use sendPluginResult instead of sendJavascript.
- public String toCallbackString(String callbackId) {
- // If no result to be sent and keeping callback, then no need to sent back to JavaScript
- if ((status == PluginResult.Status.NO_RESULT.ordinal()) && keepCallback) {
- return null;
- }
-
- // Check the success (OK, NO_RESULT & !KEEP_CALLBACK)
- if ((status == PluginResult.Status.OK.ordinal()) || (status == PluginResult.Status.NO_RESULT.ordinal())) {
- return toSuccessCallbackString(callbackId);
- }
-
- return toErrorCallbackString(callbackId);
- }
-
- @Deprecated // Use sendPluginResult instead of sendJavascript.
- public String toSuccessCallbackString(String callbackId) {
- return "cordova.callbackSuccess('"+callbackId+"',"+this.getJSONString()+");";
- }
-
- @Deprecated // Use sendPluginResult instead of sendJavascript.
- public String toErrorCallbackString(String callbackId) {
- return "cordova.callbackError('"+callbackId+"', " + this.getJSONString()+ ");";
- }
-
- public static final int MESSAGE_TYPE_STRING = 1;
- public static final int MESSAGE_TYPE_JSON = 2;
- public static final int MESSAGE_TYPE_NUMBER = 3;
- public static final int MESSAGE_TYPE_BOOLEAN = 4;
- public static final int MESSAGE_TYPE_NULL = 5;
- public static final int MESSAGE_TYPE_ARRAYBUFFER = 6;
- // Use BINARYSTRING when your string may contain null characters.
- // This is required to work around a bug in the platform :(.
- public static final int MESSAGE_TYPE_BINARYSTRING = 7;
-
- public static String[] StatusMessages = new String[] {
- "No result",
- "OK",
- "Class not found",
- "Illegal access",
- "Instantiation error",
- "Malformed url",
- "IO error",
- "Invalid action",
- "JSON error",
- "Error"
- };
-
- public enum Status {
- NO_RESULT,
- OK,
- CLASS_NOT_FOUND_EXCEPTION,
- ILLEGAL_ACCESS_EXCEPTION,
- INSTANTIATION_EXCEPTION,
- MALFORMED_URL_EXCEPTION,
- IO_EXCEPTION,
- INVALID_ACTION,
- JSON_EXCEPTION,
- ERROR
+ super(status, data, binaryString);
}
}