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/28 18:00:21 UTC

[01/50] [abbrv] android commit: updated cordova.js to include proper plugin loading

Updated Branches:
  refs/heads/2.9.x c5e83b107 -> 67e97a89c
  refs/heads/master 892ffc8ce -> a97487bce


updated cordova.js to include proper plugin loading


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/78dd0843
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/78dd0843
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/78dd0843

Branch: refs/heads/master
Commit: 78dd084303cb5ebbd1ba3ee953f4979cba35b730
Parents: cd9fb9b
Author: Steven Gill <st...@gmail.com>
Authored: Fri May 17 10:51:52 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Fri May 17 10:51:52 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/78dd0843/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 41628a8..9b88ae5 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-53-gbb10068
+// 2.7.0rc1-72-g6ec24b1
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-53-gbb10068';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-72-g6ec24b1';
 // file: lib/scripts/require.js
 
 var require,
@@ -6303,7 +6303,7 @@ require('cordova/channel').onNativeReady.fire();
     // See plugman's plugin_loader.js for the details of this object.
     // This function is only called if the really is a plugins array that isn't empty.
     // Otherwise the XHR response handler will just call finishPluginLoading().
-    function handlePluginsObject(modules) {
+    function handlePluginsObject(modules, path) {
         // First create the callback for when all plugins are loaded.
         var mapper = context.cordova.require('cordova/modulemapper');
         onScriptLoadingComplete = function() {
@@ -6337,11 +6337,21 @@ require('cordova/channel').onNativeReady.fire();
 
         // Now inject the scripts.
         for (var i = 0; i < modules.length; i++) {
-            injectScript(modules[i].file);
+            injectScript(path + modules[i].file);
         }
     }
 
-
+    // Find the root of the app
+    var path = '';
+    var scripts = document.getElementsByTagName('script');
+    var term = 'cordova.js';
+    for (var n = scripts.length-1; n>-1; n--) {
+        var src = scripts[n].src;
+        if (src.indexOf(term) == (src.length - term.length)) {
+            path = src.substring(0, src.length - term.length);
+            break;
+        }
+    }
     // Try to XHR the cordova_plugins.json file asynchronously.
     var xhr = new XMLHttpRequest();
     xhr.onload = function() {
@@ -6354,7 +6364,7 @@ require('cordova/channel').onNativeReady.fire();
             // obj will be undefined.
         }
         if (Array.isArray(obj) && obj.length > 0) {
-            handlePluginsObject(obj);
+            handlePluginsObject(obj, path);
         } else {
             finishPluginLoading();
         }
@@ -6362,8 +6372,9 @@ require('cordova/channel').onNativeReady.fire();
     xhr.onerror = function() {
         finishPluginLoading();
     };
+    var plugins_json = path + 'cordova_plugins.json';
     try { // we commented we were going to try, so let us actually try and catch
-        xhr.open('GET', 'cordova_plugins.json', true); // Async
+        xhr.open('GET', plugins_json, true); // Async
         xhr.send();
     } catch(err){
         finishPluginLoading();


[46/50] [abbrv] android commit: Fixes to the update command so it doesn't delete anything other than build artifacts

Posted by ag...@apache.org.
Fixes to the update command so it doesn't delete anything other than build artifacts


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/fbf7f1c3
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/fbf7f1c3
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/fbf7f1c3

Branch: refs/heads/2.9.x
Commit: fbf7f1c3f99c1793706edf6e61de50e51b7845f7
Parents: 68bc57a
Author: Joe Bowser <bo...@apache.org>
Authored: Thu Jun 27 12:57:44 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Thu Jun 27 12:59:49 2013 -0700

----------------------------------------------------------------------
 bin/update | 23 ++++++-----------------
 1 file changed, 6 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/fbf7f1c3/bin/update
----------------------------------------------------------------------
diff --git a/bin/update b/bin/update
index 20440d4..8e7503d 100755
--- a/bin/update
+++ b/bin/update
@@ -45,10 +45,6 @@ fi
 
 # cleanup after exit and/or on error
 function on_exit {
-    if [ -f "$BUILD_PATH"/framework/assets/www/cordova.js ]
-    then
-        rm "$BUILD_PATH"/framework/assets/www/cordova.js
-    fi
     if [ -f "$BUILD_PATH"/framework/cordova-$VERSION.jar ]
     then
         rm "$BUILD_PATH"/framework/cordova-$VERSION.jar
@@ -103,16 +99,6 @@ then
 # update the cordova-android framework for the desired target
     "$ANDROID_BIN" update project --target $TARGET --path "$BUILD_PATH"/framework &> /dev/null
 
-    if [ ! -e "$BUILD_PATH"/framework/libs/commons-codec-1.7.jar ]; then
-        # Use curl to get the jar (TODO: Support Apache Mirrors)
-        curl -OL http://archive.apache.org/dist/commons/codec/binaries/commons-codec-1.7-bin.zip &> /dev/null
-        unzip commons-codec-1.7-bin.zip &> /dev/null
-        mkdir -p "$BUILD_PATH"/framework/libs
-        cp commons-codec-1.7/commons-codec-1.7.jar "$BUILD_PATH"/framework/libs
-        # cleanup yo
-        rm commons-codec-1.7-bin.zip && rm -rf commons-codec-1.7
-    fi
-
 # compile cordova.js and cordova.jar
     (cd "$BUILD_PATH"/framework && ant jar &> /dev/null )
 fi
@@ -128,14 +114,17 @@ else
 fi
 
 # creating cordova folder and copying run/build/log/launch scripts
-mkdir "$PROJECT_PATH"/cordova
-mkdir "$PROJECT_PATH"/cordova/lib
+if [ ! -e "$PROJECT_PATH/cordova" ]
+then
+    mkdir "$PROJECT_PATH"/cordova
+    mkdir "$PROJECT_PATH"/cordova/lib
+fi
 cp "$BUILD_PATH"/bin/templates/cordova/appinfo.jar "$PROJECT_PATH"/cordova/appinfo.jar
 cp "$BUILD_PATH"/bin/templates/cordova/build "$PROJECT_PATH"/cordova/build
 cp "$BUILD_PATH"/bin/templates/cordova/clean "$PROJECT_PATH"/cordova/clean
 cp "$BUILD_PATH"/bin/templates/cordova/log "$PROJECT_PATH"/cordova/log
 cp "$BUILD_PATH"/bin/templates/cordova/run "$PROJECT_PATH"/cordova/run
-cp "$BUILD_PATH"/bin/templates/cordova/lib/cordova "$PROJECT_PATH"/cordova/lib/cordova
+cp "$BUILD_PATH"/bin/templates/cordova/lib/cordova.js "$PROJECT_PATH"/cordova/lib/cordova.js
 cp "$BUILD_PATH"/bin/templates/cordova/lib/install-device "$PROJECT_PATH"/cordova/lib/install-device
 cp "$BUILD_PATH"/bin/templates/cordova/lib/install-emulator "$PROJECT_PATH"/cordova/lib/install-emulator
 cp "$BUILD_PATH"/bin/templates/cordova/lib/list-devices "$PROJECT_PATH"/cordova/lib/list-devices


[21/50] [abbrv] android commit: removed device.java

Posted by ag...@apache.org.
removed device.java


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/c8140bad
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/c8140bad
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/c8140bad

Branch: refs/heads/master
Commit: c8140bad19782f71f3195d494c765f916ecd00ae
Parents: 2e5b6bc
Author: Steven Gill <st...@gmail.com>
Authored: Mon Jun 17 15:27:02 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Mon Jun 17 15:27:02 2013 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/Device.java | 199 ----------------------
 1 file changed, 199 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/c8140bad/framework/src/org/apache/cordova/Device.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/Device.java b/framework/src/org/apache/cordova/Device.java
deleted file mode 100644
index b1cb2bb..0000000
--- a/framework/src/org/apache/cordova/Device.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
-*/
-package org.apache.cordova;
-
-import java.util.TimeZone;
-
-import org.apache.cordova.api.CallbackContext;
-import org.apache.cordova.api.CordovaPlugin;
-import org.apache.cordova.api.LOG;
-import org.apache.cordova.api.CordovaInterface;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.provider.Settings;
-import android.telephony.TelephonyManager;
-
-public class Device extends CordovaPlugin {
-    public static final String TAG = "Device";
-
-    public static String cordovaVersion = "dev";              // Cordova version
-    public static String platform = "Android";                  // Device OS
-    public static String uuid;                                  // Device UUID
-
-    BroadcastReceiver telephonyReceiver = null;
-
-    /**
-     * Constructor.
-     */
-    public Device() {
-    }
-
-    /**
-     * Sets the context of the Command. This can then be used to do things like
-     * get file paths associated with the Activity.
-     *
-     * @param cordova The context of the main Activity.
-     * @param webView The CordovaWebView Cordova is running in.
-     */
-    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
-        super.initialize(cordova, webView);
-        Device.uuid = getUuid();
-        this.initTelephonyReceiver();
-    }
-
-    /**
-     * Executes the request and returns PluginResult.
-     *
-     * @param action            The action to execute.
-     * @param args              JSONArry of arguments for the plugin.
-     * @param callbackContext   The callback id used when calling back into JavaScript.
-     * @return                  True if the action was valid, false if not.
-     */
-    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
-        if (action.equals("getDeviceInfo")) {
-            JSONObject r = new JSONObject();
-            r.put("uuid", Device.uuid);
-            r.put("version", this.getOSVersion());
-            r.put("platform", Device.platform);
-            r.put("cordova", Device.cordovaVersion);
-            r.put("model", this.getModel());
-            callbackContext.success(r);
-        }
-        else {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Unregister receiver.
-     */
-    public void onDestroy() {
-        this.cordova.getActivity().unregisterReceiver(this.telephonyReceiver);
-    }
-
-    //--------------------------------------------------------------------------
-    // LOCAL METHODS
-    //--------------------------------------------------------------------------
-
-    /**
-     * Listen for telephony events: RINGING, OFFHOOK and IDLE
-     * Send these events to all plugins using
-     *      CordovaActivity.onMessage("telephone", "ringing" | "offhook" | "idle")
-     */
-    private void initTelephonyReceiver() {
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
-        //final CordovaInterface mycordova = this.cordova;
-        this.telephonyReceiver = new BroadcastReceiver() {
-
-            @Override
-            public void onReceive(Context context, Intent intent) {
-
-                // If state has changed
-                if ((intent != null) && intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
-                    if (intent.hasExtra(TelephonyManager.EXTRA_STATE)) {
-                        String extraData = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
-                        if (extraData.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
-                            LOG.i(TAG, "Telephone RINGING");
-                            webView.postMessage("telephone", "ringing");
-                        }
-                        else if (extraData.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
-                            LOG.i(TAG, "Telephone OFFHOOK");
-                            webView.postMessage("telephone", "offhook");
-                        }
-                        else if (extraData.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
-                            LOG.i(TAG, "Telephone IDLE");
-                            webView.postMessage("telephone", "idle");
-                        }
-                    }
-                }
-            }
-        };
-
-        // Register the receiver
-        this.cordova.getActivity().registerReceiver(this.telephonyReceiver, intentFilter);
-    }
-
-    /**
-     * Get the OS name.
-     *
-     * @return
-     */
-    public String getPlatform() {
-        return Device.platform;
-    }
-
-    /**
-     * Get the device's Universally Unique Identifier (UUID).
-     *
-     * @return
-     */
-    public String getUuid() {
-        String uuid = Settings.Secure.getString(this.cordova.getActivity().getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
-        return uuid;
-    }
-
-    /**
-     * Get the Cordova version.
-     *
-     * @return
-     */
-    public String getCordovaVersion() {
-        return Device.cordovaVersion;
-    }
-
-    public String getModel() {
-        String model = android.os.Build.MODEL;
-        return model;
-    }
-
-    public String getProductName() {
-        String productname = android.os.Build.PRODUCT;
-        return productname;
-    }
-
-    /**
-     * Get the OS version.
-     *
-     * @return
-     */
-    public String getOSVersion() {
-        String osversion = android.os.Build.VERSION.RELEASE;
-        return osversion;
-    }
-
-    public String getSDKVersion() {
-        @SuppressWarnings("deprecation")
-        String sdkversion = android.os.Build.VERSION.SDK;
-        return sdkversion;
-    }
-
-    public String getTimeZoneID() {
-        TimeZone tz = TimeZone.getDefault();
-        return (tz.getID());
-    }
-
-}


[35/50] [abbrv] android commit: Remove PluginManager.exec's return value (unused).

Posted by ag...@apache.org.
Remove PluginManager.exec's return value (unused).

It's not only not used, but when it was used was messing up the
DISABLE_EXEC_CHAINING flag.
(cherry picked from commit 9946d15f2348b8f6a23e589c8916a9410aa4b3da)


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/f78b444e
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/f78b444e
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/f78b444e

Branch: refs/heads/master
Commit: f78b444ed1b4b155f53bddac2d38873e66223aad
Parents: e726c0d
Author: Andrew Grieve <ag...@chromium.org>
Authored: Thu Jun 20 22:20:58 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Jun 20 22:22:59 2013 -0400

----------------------------------------------------------------------
 framework/src/org/apache/cordova/ExposedJsApi.java      |  4 ++--
 framework/src/org/apache/cordova/api/PluginManager.java | 12 ++++--------
 2 files changed, 6 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/f78b444e/framework/src/org/apache/cordova/ExposedJsApi.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/ExposedJsApi.java b/framework/src/org/apache/cordova/ExposedJsApi.java
index 7702d35..40ab1e3 100755
--- a/framework/src/org/apache/cordova/ExposedJsApi.java
+++ b/framework/src/org/apache/cordova/ExposedJsApi.java
@@ -48,9 +48,9 @@ import org.json.JSONException;
 
         jsMessageQueue.setPaused(true);
         try {
-            boolean wasSync = pluginManager.exec(service, action, callbackId, arguments);
+            pluginManager.exec(service, action, callbackId, arguments);
             String ret = "";
-            if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING || wasSync) {
+            if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) {
                 ret = jsMessageQueue.popAndEncode();
             }
             return ret;

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/f78b444e/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 71fc258..e8e92f8 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -200,15 +200,14 @@ public class PluginManager {
      *                      this is an async plugin call.
      * @param rawArgs       An Array literal string containing any arguments needed in the
      *                      plugin execute method.
-     * @return Whether the task completed synchronously.
      */
-    public boolean exec(String service, String action, String callbackId, String rawArgs) {
+    public void exec(String service, String action, String callbackId, String rawArgs) {
         CordovaPlugin plugin = this.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 true;
+            return;
         }
         try {
             CallbackContext callbackContext = new CallbackContext(callbackId, app);
@@ -216,19 +215,16 @@ public class PluginManager {
             if (!wasValidAction) {
                 PluginResult cr = new PluginResult(PluginResult.Status.INVALID_ACTION);
                 app.sendPluginResult(cr, callbackId);
-                return true;
             }
-            return callbackContext.isFinished();
         } catch (JSONException e) {
             PluginResult cr = new PluginResult(PluginResult.Status.JSON_EXCEPTION);
             app.sendPluginResult(cr, callbackId);
-            return true;
         }
     }
 
     @Deprecated
-    public boolean exec(String service, String action, String callbackId, String jsonArgs, boolean async) {
-        return exec(service, action, callbackId, jsonArgs);
+    public void exec(String service, String action, String callbackId, String jsonArgs, boolean async) {
+        exec(service, action, callbackId, jsonArgs);
     }
 
     /**


[37/50] [abbrv] android commit: [CB-3927] Fix start-up race condition that could cause exec() responses to be dropped.

Posted by ag...@apache.org.
[CB-3927] Fix start-up race condition that could cause exec() responses to be dropped.

Requires a change to the JS as well.


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/9cb14838
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/9cb14838
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/9cb14838

Branch: refs/heads/2.9.x
Commit: 9cb14838e8554ed2d28d317b37f76685fa76432e
Parents: 6fe66ad
Author: Jeffrey Willms <jb...@google.com>
Authored: Fri Jun 21 18:30:50 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Fri Jun 21 18:30:50 2013 -0400

----------------------------------------------------------------------
 .../src/org/apache/cordova/api/PluginEntry.java | 13 ++++++
 .../org/apache/cordova/api/PluginManager.java   | 49 +++++++++++++++++++-
 2 files changed, 60 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9cb14838/framework/src/org/apache/cordova/api/PluginEntry.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/PluginEntry.java b/framework/src/org/apache/cordova/api/PluginEntry.java
index 9b9af6b..f66dcda 100755
--- a/framework/src/org/apache/cordova/api/PluginEntry.java
+++ b/framework/src/org/apache/cordova/api/PluginEntry.java
@@ -64,6 +64,19 @@ public class PluginEntry {
     }
 
     /**
+     * Alternate constructor
+     *
+     * @param service               The name of the service
+     * @param plugin                The plugin associated with this entry
+     */
+    public PluginEntry(String service, CordovaPlugin plugin) {
+        this.service = service;
+        this.plugin = plugin;
+        this.pluginClass = plugin.getClass().getName();
+        this.onload = false;
+    }
+
+    /**
      * Create plugin object.
      * If plugin is already created, then just return it.
      *

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9cb14838/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 adaec90..0a42b3a 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -22,7 +22,9 @@ 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.json.JSONException;
 import org.xmlpull.v1.XmlPullParserException;
@@ -55,6 +57,8 @@ public class PluginManager {
     // 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.
      *
@@ -65,6 +69,7 @@ public class PluginManager {
         this.ctx = ctx;
         this.app = app;
         this.firstRun = true;
+        this.numPendingUiExecs = new AtomicInteger(0);
     }
 
     /**
@@ -86,6 +91,9 @@ public class PluginManager {
             this.clearPluginObjects();
         }
 
+        // Insert PluginManager service
+        this.addService(new PluginEntry("PluginManager", new PluginManagerService()));
+
         // Start up all plugins that have onload specified
         this.startupPlugins();
     }
@@ -201,8 +209,23 @@ public class PluginManager {
      * @param rawArgs       An Array literal string containing any arguments needed in the
      *                      plugin execute method.
      */
-    public void exec(String service, String action, String callbackId, String rawArgs) {
-        CordovaPlugin plugin = this.getPlugin(service);
+    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 {
+            Log.d(TAG, "running exec normally");
+            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);
@@ -396,4 +419,26 @@ public class PluginManager {
         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, "=====================================================================================");
     }
+
+    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;
+        }
+    }
 }


[45/50] [abbrv] android commit: Remove accidentally checked in log statement "running exec normally" (cherry picked from commit 68bc57ae85287d1425f162f0f50f571f3302b259)

Posted by ag...@apache.org.
Remove accidentally checked in log statement "running exec normally"
(cherry picked from commit 68bc57ae85287d1425f162f0f50f571f3302b259)


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/3b7e0504
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/3b7e0504
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/3b7e0504

Branch: refs/heads/master
Commit: 3b7e0504e8a1f6d1aa197cdcbb03e5c9278e848b
Parents: f42e5f6
Author: Andrew Grieve <ag...@chromium.org>
Authored: Wed Jun 26 14:22:41 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Wed Jun 26 14:23:50 2013 -0400

----------------------------------------------------------------------
 framework/src/org/apache/cordova/api/PluginManager.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/3b7e0504/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 e565c4f..7d43443 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -219,7 +219,6 @@ public class PluginManager {
                 }
             });
         } else {
-            Log.d(TAG, "running exec normally");
             execHelper(service, action, callbackId, rawArgs);
         }
     }


[14/50] [abbrv] android commit: Made some functions in DirectoryManager public

Posted by ag...@apache.org.
Made some functions in DirectoryManager public


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/92881582
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/92881582
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/92881582

Branch: refs/heads/master
Commit: 9288158226df497547d9a0506125b227909dfaf3
Parents: 3a55991
Author: Tim Kim <ti...@adobe.com>
Authored: Thu Jun 13 15:24:01 2013 -0700
Committer: Tim Kim <ti...@adobe.com>
Committed: Thu Jun 13 15:24:01 2013 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/DirectoryManager.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/92881582/framework/src/org/apache/cordova/DirectoryManager.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/DirectoryManager.java b/framework/src/org/apache/cordova/DirectoryManager.java
index 0c86f0f..89c66bc 100644
--- a/framework/src/org/apache/cordova/DirectoryManager.java
+++ b/framework/src/org/apache/cordova/DirectoryManager.java
@@ -40,7 +40,7 @@ public class DirectoryManager {
      * @param name				The name of the file to check.
      * @return					T=exists, F=not found
      */
-    protected static boolean testFileExists(String name) {
+    public static boolean testFileExists(String name) {
         boolean status;
 
         // If SD card exists
@@ -61,7 +61,7 @@ public class DirectoryManager {
      * 
      * @return 		Size in KB or -1 if not available
      */
-    protected static long getFreeDiskSpace(boolean checkInternal) {
+    public static long getFreeDiskSpace(boolean checkInternal) {
         String status = Environment.getExternalStorageState();
         long freeSpace = 0;
 
@@ -98,7 +98,7 @@ public class DirectoryManager {
      * 
      * @return				T=exists, F=not found
      */
-    protected static boolean testSaveLocationExists() {
+    public static boolean testSaveLocationExists() {
         String sDCardStatus = Environment.getExternalStorageState();
         boolean status;
 


[32/50] [abbrv] android commit: CB-3854: Added support for wildcard. This probably could be improved, but it does work

Posted by ag...@apache.org.
CB-3854: Added support for wildcard.  This probably could be improved, but it does work


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/01d6ae55
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/01d6ae55
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/01d6ae55

Branch: refs/heads/2.9.x
Commit: 01d6ae55a4faa6fd4200df25a0d64ff6e178cb54
Parents: f1b377b
Author: Joe Bowser <bo...@apache.org>
Authored: Thu Jun 20 16:33:14 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Thu Jun 20 16:33:14 2013 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/Config.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/01d6ae55/framework/src/org/apache/cordova/Config.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/Config.java b/framework/src/org/apache/cordova/Config.java
index a10ed81..6a041cf 100644
--- a/framework/src/org/apache/cordova/Config.java
+++ b/framework/src/org/apache/cordova/Config.java
@@ -214,7 +214,6 @@ public class Config {
         {
             origin = origin.split("//")[1];
         }
-        origin.matches("\\*\\.[a-z]+\\.[a-z]+");
         return origin.startsWith("*");
     }
 


[44/50] [abbrv] android commit: Remove accidentally checked in log statement "running exec normally"

Posted by ag...@apache.org.
Remove accidentally checked in log statement "running exec normally"


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/68bc57ae
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/68bc57ae
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/68bc57ae

Branch: refs/heads/2.9.x
Commit: 68bc57ae85287d1425f162f0f50f571f3302b259
Parents: 10d31ea
Author: Andrew Grieve <ag...@chromium.org>
Authored: Wed Jun 26 14:22:41 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Wed Jun 26 14:22:41 2013 -0400

----------------------------------------------------------------------
 framework/src/org/apache/cordova/api/PluginManager.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/68bc57ae/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 0a42b3a..e392dfa 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -219,7 +219,6 @@ public class PluginManager {
                 }
             });
         } else {
-            Log.d(TAG, "running exec normally");
             execHelper(service, action, callbackId, rawArgs);
         }
     }


[17/50] [abbrv] android commit: removed vibration permission

Posted by ag...@apache.org.
removed vibration permission


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/dd837f71
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/dd837f71
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/dd837f71

Branch: refs/heads/master
Commit: dd837f7130bf0ab19e714089013adc6d41812ec2
Parents: 12ebadb
Author: hermwong <he...@gmail.com>
Authored: Thu Jun 13 16:31:27 2013 -0700
Committer: hermwong <he...@gmail.com>
Committed: Thu Jun 13 16:31:27 2013 -0700

----------------------------------------------------------------------
 framework/AndroidManifest.xml | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/dd837f71/framework/AndroidManifest.xml
----------------------------------------------------------------------
diff --git a/framework/AndroidManifest.xml b/framework/AndroidManifest.xml
index 2b3c9c6..063584d 100755
--- a/framework/AndroidManifest.xml
+++ b/framework/AndroidManifest.xml
@@ -28,7 +28,6 @@
         />
     <!-- android:xlargeScreens="true" screen supported only after Android-9 -->
 
-    <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />


[18/50] [abbrv] android commit: removed file system access permission

Posted by ag...@apache.org.
removed file system access permission


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/d8457369
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/d8457369
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/d8457369

Branch: refs/heads/master
Commit: d84573694803ce3da41e03cfcd3895341fc30020
Parents: dd837f7
Author: hermwong <he...@gmail.com>
Authored: Thu Jun 13 16:59:54 2013 -0700
Committer: hermwong <he...@gmail.com>
Committed: Thu Jun 13 16:59:54 2013 -0700

----------------------------------------------------------------------
 framework/AndroidManifest.xml | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/d8457369/framework/AndroidManifest.xml
----------------------------------------------------------------------
diff --git a/framework/AndroidManifest.xml b/framework/AndroidManifest.xml
index 063584d..e2bd1c2 100755
--- a/framework/AndroidManifest.xml
+++ b/framework/AndroidManifest.xml
@@ -37,7 +37,6 @@
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />


[22/50] [abbrv] android commit: updated js from latest cordova-js 3.0

Posted by ag...@apache.org.
updated js from latest cordova-js 3.0


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/63ab7016
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/63ab7016
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/63ab7016

Branch: refs/heads/master
Commit: 63ab701685d1a664ac38102fbbe2b6f9d877def3
Parents: c8140ba
Author: Fil Maj <ma...@gmail.com>
Authored: Mon Jun 17 16:53:04 2013 -0700
Committer: Fil Maj <ma...@gmail.com>
Committed: Mon Jun 17 16:53:04 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 126 +----------------------------------
 1 file changed, 2 insertions(+), 124 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/63ab7016/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 1a29601..40a9ea3 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-117-g208b97a
+// 2.7.0rc1-120-g8731b31
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-117-g208b97a';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-120-g8731b31';
 // file: lib/scripts/require.js
 
 var require,
@@ -524,8 +524,6 @@ var utils = require('cordova/utils'),
  * onDOMContentLoaded*         Internal event that is received when the web page is loaded and parsed.
  * onNativeReady*              Internal event that indicates the Cordova native side is ready.
  * onCordovaReady*             Internal event fired when all Cordova JavaScript objects have been created.
- * onCordovaInfoReady*         Internal event fired when device properties are available.
- * onCordovaConnectionReady*   Internal event fired when the connection property has been set.
  * onDeviceReady*              User event fired to indicate that Cordova is ready
  * onResume                    User event fired to indicate a start/resume lifecycle event
  * onPause                     User event fired to indicate a pause lifecycle event
@@ -728,9 +726,6 @@ channel.createSticky('onNativeReady');
 // and it's time to run plugin constructors.
 channel.createSticky('onCordovaReady');
 
-// Event to indicate that device properties are available
-channel.createSticky('onCordovaInfoReady');
-
 // Event to indicate that all automatically loaded JS plugins are loaded and ready.
 channel.createSticky('onPluginsReady');
 
@@ -3134,51 +3129,6 @@ module.exports = {
 
 });
 
-// file: lib/android/plugin/android/device.js
-define("cordova/plugin/android/device", function(require, exports, module) {
-
-var channel = require('cordova/channel'),
-    utils = require('cordova/utils'),
-    exec = require('cordova/exec'),
-    app = require('cordova/plugin/android/app');
-
-module.exports = {
-    /*
-     * DEPRECATED
-     * This is only for Android.
-     *
-     * You must explicitly override the back button.
-     */
-    overrideBackButton:function() {
-        console.log("Device.overrideBackButton() is deprecated.  Use App.overrideBackbutton(true).");
-        app.overrideBackbutton(true);
-    },
-
-    /*
-     * DEPRECATED
-     * This is only for Android.
-     *
-     * This resets the back button to the default behavior
-     */
-    resetBackButton:function() {
-        console.log("Device.resetBackButton() is deprecated.  Use App.overrideBackbutton(false).");
-        app.overrideBackbutton(false);
-    },
-
-    /*
-     * DEPRECATED
-     * This is only for Android.
-     *
-     * This terminates the activity!
-     */
-    exitApp:function() {
-        console.log("Device.exitApp() is deprecated.  Use App.exitApp().");
-        app.exitApp();
-    }
-};
-
-});
-
 // file: lib/android/plugin/android/nativeapiprovider.js
 define("cordova/plugin/android/nativeapiprovider", function(require, exports, module) {
 
@@ -3830,78 +3780,6 @@ for (var key in console) {
 
 });
 
-// file: lib/common/plugin/device.js
-define("cordova/plugin/device", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    channel = require('cordova/channel'),
-    utils = require('cordova/utils'),
-    exec = require('cordova/exec');
-
-// Tell cordova channel to wait on the CordovaInfoReady event
-channel.waitForInitialization('onCordovaInfoReady');
-
-/**
- * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
- * phone, etc.
- * @constructor
- */
-function Device() {
-    this.available = false;
-    this.platform = null;
-    this.version = null;
-    this.uuid = null;
-    this.cordova = null;
-    this.model = null;
-
-    var me = this;
-
-    channel.onCordovaReady.subscribe(function() {
-        me.getInfo(function(info) {
-            var buildLabel = info.cordova;
-            if (buildLabel != CORDOVA_JS_BUILD_LABEL) {
-                buildLabel += ' JS=' + CORDOVA_JS_BUILD_LABEL;
-            }
-            me.available = true;
-            me.platform = info.platform;
-            me.version = info.version;
-            me.uuid = info.uuid;
-            me.cordova = buildLabel;
-            me.model = info.model;
-            channel.onCordovaInfoReady.fire();
-        },function(e) {
-            me.available = false;
-            utils.alert("[ERROR] Error initializing Cordova: " + e);
-        });
-    });
-}
-
-/**
- * Get device info
- *
- * @param {Function} successCallback The function to call when the heading data is available
- * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
- */
-Device.prototype.getInfo = function(successCallback, errorCallback) {
-    argscheck.checkArgs('fF', 'Device.getInfo', arguments);
-    exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
-};
-
-module.exports = new Device();
-
-});
-
-// file: lib/android/plugin/device/symbols.js
-define("cordova/plugin/device/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/device', 'device');
-modulemapper.merges('cordova/plugin/android/device', 'device');
-
-});
-
 // file: lib/common/plugin/echo.js
 define("cordova/plugin/echo", function(require, exports, module) {
 


[40/50] [abbrv] android commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cordova-android

Posted by ag...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cordova-android


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/7e15ff93
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/7e15ff93
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/7e15ff93

Branch: refs/heads/2.9.x
Commit: 7e15ff930d7520b74a5e91f99b71d0e12be2d27e
Parents: b83610a 9cb1483
Author: Joe Bowser <bo...@apache.org>
Authored: Mon Jun 24 11:31:47 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Mon Jun 24 11:31:47 2013 -0700

----------------------------------------------------------------------
 bin/templates/cordova/run                       |  2 +-
 .../src/org/apache/cordova/ExposedJsApi.java    |  4 +-
 .../src/org/apache/cordova/api/PluginEntry.java | 13 +++++
 .../org/apache/cordova/api/PluginManager.java   | 59 +++++++++++++++++---
 4 files changed, 66 insertions(+), 12 deletions(-)
----------------------------------------------------------------------



[06/50] [abbrv] android commit: removed splashscreen code from cordova.js

Posted by ag...@apache.org.
removed splashscreen code from cordova.js


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/f7c97cb1
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/f7c97cb1
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/f7c97cb1

Branch: refs/heads/master
Commit: f7c97cb1d0a153d27c85ae9f79eb8fd2785bebe2
Parents: 7c22bc7
Author: Steven Gill <st...@gmail.com>
Authored: Tue May 21 13:04:40 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Tue May 21 13:04:40 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 32 ++------------------------------
 1 file changed, 2 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/f7c97cb1/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 8202173..53fa353 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-81-gc09114e
+// 2.7.0rc1-82-g32587e6
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-81-gc09114e';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-82-g32587e6';
 // file: lib/scripts/require.js
 
 var require,
@@ -5546,34 +5546,6 @@ module.exports = function(uri, successCallback, errorCallback) {
 
 });
 
-// file: lib/common/plugin/splashscreen.js
-define("cordova/plugin/splashscreen", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-
-var splashscreen = {
-    show:function() {
-        exec(null, null, "SplashScreen", "show", []);
-    },
-    hide:function() {
-        exec(null, null, "SplashScreen", "hide", []);
-    }
-};
-
-module.exports = splashscreen;
-
-});
-
-// file: lib/common/plugin/splashscreen/symbols.js
-define("cordova/plugin/splashscreen/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen');
-
-});
-
 // file: lib/common/symbols.js
 define("cordova/symbols", function(require, exports, module) {
 


[12/50] [abbrv] android commit: updated directory manager

Posted by ag...@apache.org.
updated directory manager


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/9e44596d
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/9e44596d
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/9e44596d

Branch: refs/heads/master
Commit: 9e44596db72460555593d699ba67aed26005ccd8
Parents: 9aaa152
Author: Steven Gill <st...@gmail.com>
Authored: Thu Jun 13 14:39:08 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Thu Jun 13 14:39:08 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js                 | 1498 +-----------------
 .../org/apache/cordova/DirectoryManager.java    |    2 +-
 2 files changed, 6 insertions(+), 1494 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9e44596d/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index aece2e6..8973d5f 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-84-g62c5786
+// 2.7.0rc1-100-g6a53312
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-84-g62c5786';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-100-g6a53312';
 // file: lib/scripts/require.js
 
 var require,
@@ -1159,156 +1159,6 @@ module.exports = {
 
 });
 
-// file: lib/common/plugin/Acceleration.js
-define("cordova/plugin/Acceleration", function(require, exports, module) {
-
-var Acceleration = function(x, y, z, timestamp) {
-    this.x = x;
-    this.y = y;
-    this.z = z;
-    this.timestamp = timestamp || (new Date()).getTime();
-};
-
-module.exports = Acceleration;
-
-});
-
-// file: lib/common/plugin/Camera.js
-define("cordova/plugin/Camera", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    Camera = require('cordova/plugin/CameraConstants'),
-    CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle');
-
-var cameraExport = {};
-
-// Tack on the Camera Constants to the base camera plugin.
-for (var key in Camera) {
-    cameraExport[key] = Camera[key];
-}
-
-/**
- * Gets a picture from source defined by "options.sourceType", and returns the
- * image as defined by the "options.destinationType" option.
-
- * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
- *
- * @param {Function} successCallback
- * @param {Function} errorCallback
- * @param {Object} options
- */
-cameraExport.getPicture = function(successCallback, errorCallback, options) {
-    argscheck.checkArgs('fFO', 'Camera.getPicture', arguments);
-    options = options || {};
-    var getValue = argscheck.getValue;
-
-    var quality = getValue(options.quality, 50);
-    var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI);
-    var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA);
-    var targetWidth = getValue(options.targetWidth, -1);
-    var targetHeight = getValue(options.targetHeight, -1);
-    var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG);
-    var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE);
-    var allowEdit = !!options.allowEdit;
-    var correctOrientation = !!options.correctOrientation;
-    var saveToPhotoAlbum = !!options.saveToPhotoAlbum;
-    var popoverOptions = getValue(options.popoverOptions, null);
-    var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK);
-
-    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
-                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection];
-
-    exec(successCallback, errorCallback, "Camera", "takePicture", args);
-    return new CameraPopoverHandle();
-};
-
-cameraExport.cleanup = function(successCallback, errorCallback) {
-    exec(successCallback, errorCallback, "Camera", "cleanup", []);
-};
-
-module.exports = cameraExport;
-
-});
-
-// file: lib/common/plugin/CameraConstants.js
-define("cordova/plugin/CameraConstants", function(require, exports, module) {
-
-module.exports = {
-  DestinationType:{
-    DATA_URL: 0,         // Return base64 encoded string
-    FILE_URI: 1,         // Return file uri (content://media/external/images/media/2 for Android)
-    NATIVE_URI: 2        // Return native uri (eg. asset-library://... for iOS)
-  },
-  EncodingType:{
-    JPEG: 0,             // Return JPEG encoded image
-    PNG: 1               // Return PNG encoded image
-  },
-  MediaType:{
-    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
-    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
-    ALLMEDIA : 2         // allow selection from all media types
-  },
-  PictureSourceType:{
-    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
-    CAMERA : 1,          // Take picture from camera
-    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
-  },
-  PopoverArrowDirection:{
-      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
-      ARROW_DOWN : 2,
-      ARROW_LEFT : 4,
-      ARROW_RIGHT : 8,
-      ARROW_ANY : 15
-  },
-  Direction:{
-      BACK: 0,
-      FRONT: 1
-  }
-};
-
-});
-
-// file: lib/common/plugin/CameraPopoverHandle.js
-define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-
-/**
- * A handle to an image picker popover.
- */
-var CameraPopoverHandle = function() {
-    this.setPosition = function(popoverOptions) {
-        console.log('CameraPopoverHandle.setPosition is only supported on iOS.');
-    };
-};
-
-module.exports = CameraPopoverHandle;
-
-});
-
-// file: lib/common/plugin/CameraPopoverOptions.js
-define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
-
-var Camera = require('cordova/plugin/CameraConstants');
-
-/**
- * Encapsulates options for iOS Popover image picker
- */
-var CameraPopoverOptions = function(x,y,width,height,arrowDir){
-    // information of rectangle that popover should be anchored to
-    this.x = x || 0;
-    this.y = y || 32;
-    this.width = width || 320;
-    this.height = height || 480;
-    // The direction of the popover arrow
-    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
-};
-
-module.exports = CameraPopoverOptions;
-
-});
-
 // file: lib/common/plugin/CaptureAudioOptions.js
 define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
 
@@ -1383,39 +1233,6 @@ module.exports = CaptureVideoOptions;
 
 });
 
-// file: lib/common/plugin/CompassError.js
-define("cordova/plugin/CompassError", function(require, exports, module) {
-
-/**
- *  CompassError.
- *  An error code assigned by an implementation when an error has occurred
- * @constructor
- */
-var CompassError = function(err) {
-    this.code = (err !== undefined ? err : null);
-};
-
-CompassError.COMPASS_INTERNAL_ERR = 0;
-CompassError.COMPASS_NOT_SUPPORTED = 20;
-
-module.exports = CompassError;
-
-});
-
-// file: lib/common/plugin/CompassHeading.js
-define("cordova/plugin/CompassHeading", function(require, exports, module) {
-
-var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
-  this.magneticHeading = magneticHeading;
-  this.trueHeading = trueHeading;
-  this.headingAccuracy = headingAccuracy;
-  this.timestamp = timestamp || new Date().getTime();
-};
-
-module.exports = CompassHeading;
-
-});
-
 // file: lib/common/plugin/ConfigurationData.js
 define("cordova/plugin/ConfigurationData", function(require, exports, module) {
 
@@ -1456,322 +1273,6 @@ module.exports = {
 
 });
 
-// file: lib/common/plugin/Contact.js
-define("cordova/plugin/Contact", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    ContactError = require('cordova/plugin/ContactError'),
-    utils = require('cordova/utils');
-
-/**
-* Converts primitives into Complex Object
-* Currently only used for Date fields
-*/
-function convertIn(contact) {
-    var value = contact.birthday;
-    try {
-      contact.birthday = new Date(parseFloat(value));
-    } catch (exception){
-      console.log("Cordova Contact convertIn error: exception creating date.");
-    }
-    return contact;
-}
-
-/**
-* Converts Complex objects into primitives
-* Only conversion at present is for Dates.
-**/
-
-function convertOut(contact) {
-    var value = contact.birthday;
-    if (value !== null) {
-        // try to make it a Date object if it is not already
-        if (!utils.isDate(value)){
-            try {
-                value = new Date(value);
-            } catch(exception){
-                value = null;
-            }
-        }
-        if (utils.isDate(value)){
-            value = value.valueOf(); // convert to milliseconds
-        }
-        contact.birthday = value;
-    }
-    return contact;
-}
-
-/**
-* Contains information about a single contact.
-* @constructor
-* @param {DOMString} id unique identifier
-* @param {DOMString} displayName
-* @param {ContactName} name
-* @param {DOMString} nickname
-* @param {Array.<ContactField>} phoneNumbers array of phone numbers
-* @param {Array.<ContactField>} emails array of email addresses
-* @param {Array.<ContactAddress>} addresses array of addresses
-* @param {Array.<ContactField>} ims instant messaging user ids
-* @param {Array.<ContactOrganization>} organizations
-* @param {DOMString} birthday contact's birthday
-* @param {DOMString} note user notes about contact
-* @param {Array.<ContactField>} photos
-* @param {Array.<ContactField>} categories
-* @param {Array.<ContactField>} urls contact's web sites
-*/
-var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
-    ims, organizations, birthday, note, photos, categories, urls) {
-    this.id = id || null;
-    this.rawId = null;
-    this.displayName = displayName || null;
-    this.name = name || null; // ContactName
-    this.nickname = nickname || null;
-    this.phoneNumbers = phoneNumbers || null; // ContactField[]
-    this.emails = emails || null; // ContactField[]
-    this.addresses = addresses || null; // ContactAddress[]
-    this.ims = ims || null; // ContactField[]
-    this.organizations = organizations || null; // ContactOrganization[]
-    this.birthday = birthday || null;
-    this.note = note || null;
-    this.photos = photos || null; // ContactField[]
-    this.categories = categories || null; // ContactField[]
-    this.urls = urls || null; // ContactField[]
-};
-
-/**
-* Removes contact from device storage.
-* @param successCB success callback
-* @param errorCB error callback
-*/
-Contact.prototype.remove = function(successCB, errorCB) {
-    argscheck.checkArgs('FF', 'Contact.remove', arguments);
-    var fail = errorCB && function(code) {
-        errorCB(new ContactError(code));
-    };
-    if (this.id === null) {
-        fail(ContactError.UNKNOWN_ERROR);
-    }
-    else {
-        exec(successCB, fail, "Contacts", "remove", [this.id]);
-    }
-};
-
-/**
-* Creates a deep copy of this Contact.
-* With the contact ID set to null.
-* @return copy of this Contact
-*/
-Contact.prototype.clone = function() {
-    var clonedContact = utils.clone(this);
-    clonedContact.id = null;
-    clonedContact.rawId = null;
-
-    function nullIds(arr) {
-        if (arr) {
-            for (var i = 0; i < arr.length; ++i) {
-                arr[i].id = null;
-            }
-        }
-    }
-
-    // Loop through and clear out any id's in phones, emails, etc.
-    nullIds(clonedContact.phoneNumbers);
-    nullIds(clonedContact.emails);
-    nullIds(clonedContact.addresses);
-    nullIds(clonedContact.ims);
-    nullIds(clonedContact.organizations);
-    nullIds(clonedContact.categories);
-    nullIds(clonedContact.photos);
-    nullIds(clonedContact.urls);
-    return clonedContact;
-};
-
-/**
-* Persists contact to device storage.
-* @param successCB success callback
-* @param errorCB error callback
-*/
-Contact.prototype.save = function(successCB, errorCB) {
-    argscheck.checkArgs('FFO', 'Contact.save', arguments);
-    var fail = errorCB && function(code) {
-        errorCB(new ContactError(code));
-    };
-    var success = function(result) {
-        if (result) {
-            if (successCB) {
-                var fullContact = require('cordova/plugin/contacts').create(result);
-                successCB(convertIn(fullContact));
-            }
-        }
-        else {
-            // no Entry object returned
-            fail(ContactError.UNKNOWN_ERROR);
-        }
-    };
-    var dupContact = convertOut(utils.clone(this));
-    exec(success, fail, "Contacts", "save", [dupContact]);
-};
-
-
-module.exports = Contact;
-
-});
-
-// file: lib/common/plugin/ContactAddress.js
-define("cordova/plugin/ContactAddress", function(require, exports, module) {
-
-/**
-* Contact address.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code
-* @param formatted // NOTE: not a W3C standard
-* @param streetAddress
-* @param locality
-* @param region
-* @param postalCode
-* @param country
-*/
-
-var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
-    this.id = null;
-    this.pref = (typeof pref != 'undefined' ? pref : false);
-    this.type = type || null;
-    this.formatted = formatted || null;
-    this.streetAddress = streetAddress || null;
-    this.locality = locality || null;
-    this.region = region || null;
-    this.postalCode = postalCode || null;
-    this.country = country || null;
-};
-
-module.exports = ContactAddress;
-
-});
-
-// file: lib/common/plugin/ContactError.js
-define("cordova/plugin/ContactError", function(require, exports, module) {
-
-/**
- *  ContactError.
- *  An error code assigned by an implementation when an error has occurred
- * @constructor
- */
-var ContactError = function(err) {
-    this.code = (typeof err != 'undefined' ? err : null);
-};
-
-/**
- * Error codes
- */
-ContactError.UNKNOWN_ERROR = 0;
-ContactError.INVALID_ARGUMENT_ERROR = 1;
-ContactError.TIMEOUT_ERROR = 2;
-ContactError.PENDING_OPERATION_ERROR = 3;
-ContactError.IO_ERROR = 4;
-ContactError.NOT_SUPPORTED_ERROR = 5;
-ContactError.PERMISSION_DENIED_ERROR = 20;
-
-module.exports = ContactError;
-
-});
-
-// file: lib/common/plugin/ContactField.js
-define("cordova/plugin/ContactField", function(require, exports, module) {
-
-/**
-* Generic contact field.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
-* @param type
-* @param value
-* @param pref
-*/
-var ContactField = function(type, value, pref) {
-    this.id = null;
-    this.type = (type && type.toString()) || null;
-    this.value = (value && value.toString()) || null;
-    this.pref = (typeof pref != 'undefined' ? pref : false);
-};
-
-module.exports = ContactField;
-
-});
-
-// file: lib/common/plugin/ContactFindOptions.js
-define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
-
-/**
- * ContactFindOptions.
- * @constructor
- * @param filter used to match contacts against
- * @param multiple boolean used to determine if more than one contact should be returned
- */
-
-var ContactFindOptions = function(filter, multiple) {
-    this.filter = filter || '';
-    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
-};
-
-module.exports = ContactFindOptions;
-
-});
-
-// file: lib/common/plugin/ContactName.js
-define("cordova/plugin/ContactName", function(require, exports, module) {
-
-/**
-* Contact name.
-* @constructor
-* @param formatted // NOTE: not part of W3C standard
-* @param familyName
-* @param givenName
-* @param middle
-* @param prefix
-* @param suffix
-*/
-var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
-    this.formatted = formatted || null;
-    this.familyName = familyName || null;
-    this.givenName = givenName || null;
-    this.middleName = middle || null;
-    this.honorificPrefix = prefix || null;
-    this.honorificSuffix = suffix || null;
-};
-
-module.exports = ContactName;
-
-});
-
-// file: lib/common/plugin/ContactOrganization.js
-define("cordova/plugin/ContactOrganization", function(require, exports, module) {
-
-/**
-* Contact organization.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
-* @param name
-* @param dept
-* @param title
-* @param startDate
-* @param endDate
-* @param location
-* @param desc
-*/
-
-var ContactOrganization = function(pref, type, name, dept, title) {
-    this.id = null;
-    this.pref = (typeof pref != 'undefined' ? pref : false);
-    this.type = type || null;
-    this.name = name || null;
-    this.department = dept || null;
-    this.title = title || null;
-};
-
-module.exports = ContactOrganization;
-
-});
-
 // file: lib/common/plugin/Coordinates.js
 define("cordova/plugin/Coordinates", function(require, exports, module) {
 
@@ -3288,85 +2789,6 @@ module.exports = GlobalizationError;
 
 });
 
-// file: lib/common/plugin/InAppBrowser.js
-define("cordova/plugin/InAppBrowser", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-var channel = require('cordova/channel');
-var modulemapper = require('cordova/modulemapper');
-
-function InAppBrowser() {
-   this.channels = {
-        'loadstart': channel.create('loadstart'),
-        'loadstop' : channel.create('loadstop'),
-        'loaderror' : channel.create('loaderror'),
-        'exit' : channel.create('exit')
-   };
-}
-
-InAppBrowser.prototype = {
-    _eventHandler: function (event) {
-        if (event.type in this.channels) {
-            this.channels[event.type].fire(event);
-        }
-    },
-    close: function (eventname) {
-        exec(null, null, "InAppBrowser", "close", []);
-    },
-    show: function (eventname) {
-      exec(null, null, "InAppBrowser", "show", []);
-    },
-    addEventListener: function (eventname,f) {
-        if (eventname in this.channels) {
-            this.channels[eventname].subscribe(f);
-        }
-    },
-    removeEventListener: function(eventname, f) {
-        if (eventname in this.channels) {
-            this.channels[eventname].unsubscribe(f);
-        }
-    },
-
-    executeScript: function(injectDetails, cb) {
-        if (injectDetails.code) {
-            exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
-        } else if (injectDetails.file) {
-            exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
-        } else {
-            throw new Error('executeScript requires exactly one of code or file to be specified');
-        }
-    },
-
-    insertCSS: function(injectDetails, cb) {
-        if (injectDetails.code) {
-            exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
-        } else if (injectDetails.file) {
-            exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
-        } else {
-            throw new Error('insertCSS requires exactly one of code or file to be specified');
-        }
-    }
-};
-
-module.exports = function(strUrl, strWindowName, strWindowFeatures) {
-    var iab = new InAppBrowser();
-    var cb = function(eventname) {
-       iab._eventHandler(eventname);
-    };
-
-    // Don't catch calls that write to existing frames (e.g. named iframes).
-    if (window.frames && window.frames[strWindowName]) {
-        var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
-        return origOpenFunc.apply(window, arguments);
-    }
-
-    exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
-    return iab;
-};
-
-
-});
-
 // file: lib/common/plugin/LocalFileSystem.js
 define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
 
@@ -3686,47 +3108,6 @@ module.exports = Metadata;
 
 });
 
-// file: lib/common/plugin/Position.js
-define("cordova/plugin/Position", function(require, exports, module) {
-
-var Coordinates = require('cordova/plugin/Coordinates');
-
-var Position = function(coords, timestamp) {
-    if (coords) {
-        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
-    } else {
-        this.coords = new Coordinates();
-    }
-    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
-};
-
-module.exports = Position;
-
-});
-
-// file: lib/common/plugin/PositionError.js
-define("cordova/plugin/PositionError", function(require, exports, module) {
-
-/**
- * Position error object
- *
- * @constructor
- * @param code
- * @param message
- */
-var PositionError = function(code, message) {
-    this.code = code || null;
-    this.message = message || '';
-};
-
-PositionError.PERMISSION_DENIED = 1;
-PositionError.POSITION_UNAVAILABLE = 2;
-PositionError.TIMEOUT = 3;
-
-module.exports = PositionError;
-
-});
-
 // file: lib/common/plugin/ProgressEvent.js
 define("cordova/plugin/ProgressEvent", function(require, exports, module) {
 
@@ -3779,176 +3160,10 @@ module.exports = ProgressEvent;
 
 });
 
-// file: lib/common/plugin/accelerometer.js
-define("cordova/plugin/accelerometer", function(require, exports, module) {
-
-/**
- * This class provides access to device accelerometer data.
- * @constructor
- */
-var argscheck = require('cordova/argscheck'),
-    utils = require("cordova/utils"),
-    exec = require("cordova/exec"),
-    Acceleration = require('cordova/plugin/Acceleration');
-
-// Is the accel sensor running?
-var running = false;
-
-// Keeps reference to watchAcceleration calls.
-var timers = {};
-
-// Array of listeners; used to keep track of when we should call start and stop.
-var listeners = [];
+// file: lib/android/plugin/android/app.js
+define("cordova/plugin/android/app", function(require, exports, module) {
 
-// Last returned acceleration object from native
-var accel = null;
-
-// Tells native to start.
-function start() {
-    exec(function(a) {
-        var tempListeners = listeners.slice(0);
-        accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
-        for (var i = 0, l = tempListeners.length; i < l; i++) {
-            tempListeners[i].win(accel);
-        }
-    }, function(e) {
-        var tempListeners = listeners.slice(0);
-        for (var i = 0, l = tempListeners.length; i < l; i++) {
-            tempListeners[i].fail(e);
-        }
-    }, "Accelerometer", "start", []);
-    running = true;
-}
-
-// Tells native to stop.
-function stop() {
-    exec(null, null, "Accelerometer", "stop", []);
-    running = false;
-}
-
-// Adds a callback pair to the listeners array
-function createCallbackPair(win, fail) {
-    return {win:win, fail:fail};
-}
-
-// Removes a win/fail listener pair from the listeners array
-function removeListeners(l) {
-    var idx = listeners.indexOf(l);
-    if (idx > -1) {
-        listeners.splice(idx, 1);
-        if (listeners.length === 0) {
-            stop();
-        }
-    }
-}
-
-var accelerometer = {
-    /**
-     * Asynchronously acquires the current acceleration.
-     *
-     * @param {Function} successCallback    The function to call when the acceleration data is available
-     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
-     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
-     */
-    getCurrentAcceleration: function(successCallback, errorCallback, options) {
-        argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments);
-
-        var p;
-        var win = function(a) {
-            removeListeners(p);
-            successCallback(a);
-        };
-        var fail = function(e) {
-            removeListeners(p);
-            errorCallback && errorCallback(e);
-        };
-
-        p = createCallbackPair(win, fail);
-        listeners.push(p);
-
-        if (!running) {
-            start();
-        }
-    },
-
-    /**
-     * Asynchronously acquires the acceleration repeatedly at a given interval.
-     *
-     * @param {Function} successCallback    The function to call each time the acceleration data is available
-     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
-     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
-     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
-     */
-    watchAcceleration: function(successCallback, errorCallback, options) {
-        argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments);
-        // Default interval (10 sec)
-        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
-
-        // Keep reference to watch id, and report accel readings as often as defined in frequency
-        var id = utils.createUUID();
-
-        var p = createCallbackPair(function(){}, function(e) {
-            removeListeners(p);
-            errorCallback && errorCallback(e);
-        });
-        listeners.push(p);
-
-        timers[id] = {
-            timer:window.setInterval(function() {
-                if (accel) {
-                    successCallback(accel);
-                }
-            }, frequency),
-            listeners:p
-        };
-
-        if (running) {
-            // If we're already running then immediately invoke the success callback
-            // but only if we have retrieved a value, sample code does not check for null ...
-            if (accel) {
-                successCallback(accel);
-            }
-        } else {
-            start();
-        }
-
-        return id;
-    },
-
-    /**
-     * Clears the specified accelerometer watch.
-     *
-     * @param {String} id       The id of the watch returned from #watchAcceleration.
-     */
-    clearWatch: function(id) {
-        // Stop javascript timer & remove from timer list
-        if (id && timers[id]) {
-            window.clearInterval(timers[id].timer);
-            removeListeners(timers[id].listeners);
-            delete timers[id];
-        }
-    }
-};
-
-module.exports = accelerometer;
-
-});
-
-// file: lib/common/plugin/accelerometer/symbols.js
-define("cordova/plugin/accelerometer/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.defaults('cordova/plugin/Acceleration', 'Acceleration');
-modulemapper.defaults('cordova/plugin/accelerometer', 'navigator.accelerometer');
-
-});
-
-// file: lib/android/plugin/android/app.js
-define("cordova/plugin/android/app", function(require, exports, module) {
-
-var exec = require('cordova/exec');
+var exec = require('cordova/exec');
 
 module.exports = {
   /**
@@ -4090,65 +3305,6 @@ module.exports = {
 
 });
 
-// file: lib/android/plugin/android/notification.js
-define("cordova/plugin/android/notification", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-
-/**
- * Provides Android enhanced notification API.
- */
-module.exports = {
-    activityStart : function(title, message) {
-        // If title and message not specified then mimic Android behavior of
-        // using default strings.
-        if (typeof title === "undefined" && typeof message == "undefined") {
-            title = "Busy";
-            message = 'Please wait...';
-        }
-
-        exec(null, null, 'Notification', 'activityStart', [ title, message ]);
-    },
-
-    /**
-     * Close an activity dialog
-     */
-    activityStop : function() {
-        exec(null, null, 'Notification', 'activityStop', []);
-    },
-
-    /**
-     * Display a progress dialog with progress bar that goes from 0 to 100.
-     *
-     * @param {String}
-     *            title Title of the progress dialog.
-     * @param {String}
-     *            message Message to display in the dialog.
-     */
-    progressStart : function(title, message) {
-        exec(null, null, 'Notification', 'progressStart', [ title, message ]);
-    },
-
-    /**
-     * Close the progress dialog.
-     */
-    progressStop : function() {
-        exec(null, null, 'Notification', 'progressStop', []);
-    },
-
-    /**
-     * Set the progress dialog value.
-     *
-     * @param {Number}
-     *            value 0-100
-     */
-    progressValue : function(value) {
-        exec(null, null, 'Notification', 'progressValue', [ value ]);
-    }
-};
-
-});
-
 // file: lib/android/plugin/android/promptbasednativeapi.js
 define("cordova/plugin/android/promptbasednativeapi", function(require, exports, module) {
 
@@ -4511,112 +3667,6 @@ modulemapper.clobbers('cordova/plugin/android/storage/openDatabase', 'openDataba
 
 });
 
-// file: lib/common/plugin/battery.js
-define("cordova/plugin/battery", function(require, exports, module) {
-
-/**
- * This class contains information about the current battery status.
- * @constructor
- */
-var cordova = require('cordova'),
-    exec = require('cordova/exec');
-
-function handlers() {
-  return battery.channels.batterystatus.numHandlers +
-         battery.channels.batterylow.numHandlers +
-         battery.channels.batterycritical.numHandlers;
-}
-
-var Battery = function() {
-    this._level = null;
-    this._isPlugged = null;
-    // Create new event handlers on the window (returns a channel instance)
-    this.channels = {
-      batterystatus:cordova.addWindowEventHandler("batterystatus"),
-      batterylow:cordova.addWindowEventHandler("batterylow"),
-      batterycritical:cordova.addWindowEventHandler("batterycritical")
-    };
-    for (var key in this.channels) {
-        this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange;
-    }
-};
-/**
- * Event handlers for when callbacks get registered for the battery.
- * Keep track of how many handlers we have so we can start and stop the native battery listener
- * appropriately (and hopefully save on battery life!).
- */
-Battery.onHasSubscribersChange = function() {
-  // If we just registered the first handler, make sure native listener is started.
-  if (this.numHandlers === 1 && handlers() === 1) {
-      exec(battery._status, battery._error, "Battery", "start", []);
-  } else if (handlers() === 0) {
-      exec(null, null, "Battery", "stop", []);
-  }
-};
-
-/**
- * Callback for battery status
- *
- * @param {Object} info            keys: level, isPlugged
- */
-Battery.prototype._status = function(info) {
-    if (info) {
-        var me = battery;
-    var level = info.level;
-        if (me._level !== level || me._isPlugged !== info.isPlugged) {
-            // Fire batterystatus event
-            cordova.fireWindowEvent("batterystatus", info);
-
-            // Fire low battery event
-            if (level === 20 || level === 5) {
-                if (level === 20) {
-                    cordova.fireWindowEvent("batterylow", info);
-                }
-                else {
-                    cordova.fireWindowEvent("batterycritical", info);
-                }
-            }
-        }
-        me._level = level;
-        me._isPlugged = info.isPlugged;
-    }
-};
-
-/**
- * Error callback for battery start
- */
-Battery.prototype._error = function(e) {
-    console.log("Error initializing Battery: " + e);
-};
-
-var battery = new Battery();
-
-module.exports = battery;
-
-});
-
-// file: lib/common/plugin/battery/symbols.js
-define("cordova/plugin/battery/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.defaults('cordova/plugin/battery', 'navigator.battery');
-
-});
-
-// file: lib/common/plugin/camera/symbols.js
-define("cordova/plugin/camera/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.defaults('cordova/plugin/Camera', 'navigator.camera');
-modulemapper.defaults('cordova/plugin/CameraConstants', 'Camera');
-modulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions');
-
-});
-
 // file: lib/common/plugin/capture.js
 define("cordova/plugin/capture", function(require, exports, module) {
 
@@ -4711,105 +3761,6 @@ modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture');
 
 });
 
-// file: lib/common/plugin/compass.js
-define("cordova/plugin/compass", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    utils = require('cordova/utils'),
-    CompassHeading = require('cordova/plugin/CompassHeading'),
-    CompassError = require('cordova/plugin/CompassError'),
-    timers = {},
-    compass = {
-        /**
-         * Asynchronously acquires the current heading.
-         * @param {Function} successCallback The function to call when the heading
-         * data is available
-         * @param {Function} errorCallback The function to call when there is an error
-         * getting the heading data.
-         * @param {CompassOptions} options The options for getting the heading data (not used).
-         */
-        getCurrentHeading:function(successCallback, errorCallback, options) {
-            argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments);
-
-            var win = function(result) {
-                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
-                successCallback(ch);
-            };
-            var fail = errorCallback && function(code) {
-                var ce = new CompassError(code);
-                errorCallback(ce);
-            };
-
-            // Get heading
-            exec(win, fail, "Compass", "getHeading", [options]);
-        },
-
-        /**
-         * Asynchronously acquires the heading repeatedly at a given interval.
-         * @param {Function} successCallback The function to call each time the heading
-         * data is available
-         * @param {Function} errorCallback The function to call when there is an error
-         * getting the heading data.
-         * @param {HeadingOptions} options The options for getting the heading data
-         * such as timeout and the frequency of the watch. For iOS, filter parameter
-         * specifies to watch via a distance filter rather than time.
-         */
-        watchHeading:function(successCallback, errorCallback, options) {
-            argscheck.checkArgs('fFO', 'compass.watchHeading', arguments);
-            // Default interval (100 msec)
-            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
-            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
-
-            var id = utils.createUUID();
-            if (filter > 0) {
-                // is an iOS request for watch by filter, no timer needed
-                timers[id] = "iOS";
-                compass.getCurrentHeading(successCallback, errorCallback, options);
-            } else {
-                // Start watch timer to get headings
-                timers[id] = window.setInterval(function() {
-                    compass.getCurrentHeading(successCallback, errorCallback);
-                }, frequency);
-            }
-
-            return id;
-        },
-
-        /**
-         * Clears the specified heading watch.
-         * @param {String} watchId The ID of the watch returned from #watchHeading.
-         */
-        clearWatch:function(id) {
-            // Stop javascript timer & remove from timer list
-            if (id && timers[id]) {
-                if (timers[id] != "iOS") {
-                    clearInterval(timers[id]);
-                } else {
-                    // is iOS watch by filter so call into device to stop
-                    exec(null, null, "Compass", "stopHeading", []);
-                }
-                delete timers[id];
-            }
-        }
-    };
-
-module.exports = compass;
-
-});
-
-// file: lib/common/plugin/compass/symbols.js
-define("cordova/plugin/compass/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/CompassHeading', 'CompassHeading');
-modulemapper.clobbers('cordova/plugin/CompassError', 'CompassError');
-modulemapper.clobbers('cordova/plugin/compass', 'navigator.compass');
-
-});
-
 // file: lib/common/plugin/console-via-logger.js
 define("cordova/plugin/console-via-logger", function(require, exports, module) {
 
@@ -4982,84 +3933,6 @@ for (var key in console) {
 
 });
 
-// file: lib/common/plugin/contacts.js
-define("cordova/plugin/contacts", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    ContactError = require('cordova/plugin/ContactError'),
-    utils = require('cordova/utils'),
-    Contact = require('cordova/plugin/Contact');
-
-/**
-* Represents a group of Contacts.
-* @constructor
-*/
-var contacts = {
-    /**
-     * Returns an array of Contacts matching the search criteria.
-     * @param fields that should be searched
-     * @param successCB success callback
-     * @param errorCB error callback
-     * @param {ContactFindOptions} options that can be applied to contact searching
-     * @return array of Contacts matching search criteria
-     */
-    find:function(fields, successCB, errorCB, options) {
-        argscheck.checkArgs('afFO', 'contacts.find', arguments);
-        if (!fields.length) {
-            errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
-        } else {
-            var win = function(result) {
-                var cs = [];
-                for (var i = 0, l = result.length; i < l; i++) {
-                    cs.push(contacts.create(result[i]));
-                }
-                successCB(cs);
-            };
-            exec(win, errorCB, "Contacts", "search", [fields, options]);
-        }
-    },
-
-    /**
-     * This function creates a new contact, but it does not persist the contact
-     * to device storage. To persist the contact to device storage, invoke
-     * contact.save().
-     * @param properties an object whose properties will be examined to create a new Contact
-     * @returns new Contact object
-     */
-    create:function(properties) {
-        argscheck.checkArgs('O', 'contacts.create', arguments);
-        var contact = new Contact();
-        for (var i in properties) {
-            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
-                contact[i] = properties[i];
-            }
-        }
-        return contact;
-    }
-};
-
-module.exports = contacts;
-
-});
-
-// file: lib/common/plugin/contacts/symbols.js
-define("cordova/plugin/contacts/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts');
-modulemapper.clobbers('cordova/plugin/Contact', 'Contact');
-modulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress');
-modulemapper.clobbers('cordova/plugin/ContactError', 'ContactError');
-modulemapper.clobbers('cordova/plugin/ContactField', 'ContactField');
-modulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions');
-modulemapper.clobbers('cordova/plugin/ContactName', 'ContactName');
-modulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization');
-
-});
-
 // file: lib/common/plugin/device.js
 define("cordova/plugin/device", function(require, exports, module) {
 
@@ -5217,215 +4090,6 @@ modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError');
 
 });
 
-// file: lib/common/plugin/geolocation.js
-define("cordova/plugin/geolocation", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    utils = require('cordova/utils'),
-    exec = require('cordova/exec'),
-    PositionError = require('cordova/plugin/PositionError'),
-    Position = require('cordova/plugin/Position');
-
-var timers = {};   // list of timers in use
-
-// Returns default params, overrides if provided with values
-function parseParameters(options) {
-    var opt = {
-        maximumAge: 0,
-        enableHighAccuracy: false,
-        timeout: Infinity
-    };
-
-    if (options) {
-        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
-            opt.maximumAge = options.maximumAge;
-        }
-        if (options.enableHighAccuracy !== undefined) {
-            opt.enableHighAccuracy = options.enableHighAccuracy;
-        }
-        if (options.timeout !== undefined && !isNaN(options.timeout)) {
-            if (options.timeout < 0) {
-                opt.timeout = 0;
-            } else {
-                opt.timeout = options.timeout;
-            }
-        }
-    }
-
-    return opt;
-}
-
-// Returns a timeout failure, closed over a specified timeout value and error callback.
-function createTimeout(errorCallback, timeout) {
-    var t = setTimeout(function() {
-        clearTimeout(t);
-        t = null;
-        errorCallback({
-            code:PositionError.TIMEOUT,
-            message:"Position retrieval timed out."
-        });
-    }, timeout);
-    return t;
-}
-
-var geolocation = {
-    lastPosition:null, // reference to last known (cached) position returned
-    /**
-   * Asynchronously acquires the current position.
-   *
-   * @param {Function} successCallback    The function to call when the position data is available
-   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)
-   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)
-   */
-    getCurrentPosition:function(successCallback, errorCallback, options) {
-        argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments);
-        options = parseParameters(options);
-
-        // Timer var that will fire an error callback if no position is retrieved from native
-        // before the "timeout" param provided expires
-        var timeoutTimer = {timer:null};
-
-        var win = function(p) {
-            clearTimeout(timeoutTimer.timer);
-            if (!(timeoutTimer.timer)) {
-                // Timeout already happened, or native fired error callback for
-                // this geo request.
-                // Don't continue with success callback.
-                return;
-            }
-            var pos = new Position(
-                {
-                    latitude:p.latitude,
-                    longitude:p.longitude,
-                    altitude:p.altitude,
-                    accuracy:p.accuracy,
-                    heading:p.heading,
-                    velocity:p.velocity,
-                    altitudeAccuracy:p.altitudeAccuracy
-                },
-                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
-            );
-            geolocation.lastPosition = pos;
-            successCallback(pos);
-        };
-        var fail = function(e) {
-            clearTimeout(timeoutTimer.timer);
-            timeoutTimer.timer = null;
-            var err = new PositionError(e.code, e.message);
-            if (errorCallback) {
-                errorCallback(err);
-            }
-        };
-
-        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
-        // fire the success callback with the cached position.
-        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
-            successCallback(geolocation.lastPosition);
-        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
-        } else if (options.timeout === 0) {
-            fail({
-                code:PositionError.TIMEOUT,
-                message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter."
-            });
-        // Otherwise we have to call into native to retrieve a position.
-        } else {
-            if (options.timeout !== Infinity) {
-                // If the timeout value was not set to Infinity (default), then
-                // set up a timeout function that will fire the error callback
-                // if no successful position was retrieved before timeout expired.
-                timeoutTimer.timer = createTimeout(fail, options.timeout);
-            } else {
-                // This is here so the check in the win function doesn't mess stuff up
-                // may seem weird but this guarantees timeoutTimer is
-                // always truthy before we call into native
-                timeoutTimer.timer = true;
-            }
-            exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
-        }
-        return timeoutTimer;
-    },
-    /**
-     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,
-     * the successCallback is called with the new location.
-     *
-     * @param {Function} successCallback    The function to call each time the location data is available
-     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)
-     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)
-     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
-     */
-    watchPosition:function(successCallback, errorCallback, options) {
-        argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments);
-        options = parseParameters(options);
-
-        var id = utils.createUUID();
-
-        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
-        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
-
-        var fail = function(e) {
-            clearTimeout(timers[id].timer);
-            var err = new PositionError(e.code, e.message);
-            if (errorCallback) {
-                errorCallback(err);
-            }
-        };
-
-        var win = function(p) {
-            clearTimeout(timers[id].timer);
-            if (options.timeout !== Infinity) {
-                timers[id].timer = createTimeout(fail, options.timeout);
-            }
-            var pos = new Position(
-                {
-                    latitude:p.latitude,
-                    longitude:p.longitude,
-                    altitude:p.altitude,
-                    accuracy:p.accuracy,
-                    heading:p.heading,
-                    velocity:p.velocity,
-                    altitudeAccuracy:p.altitudeAccuracy
-                },
-                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
-            );
-            geolocation.lastPosition = pos;
-            successCallback(pos);
-        };
-
-        exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
-
-        return id;
-    },
-    /**
-     * Clears the specified heading watch.
-     *
-     * @param {String} id       The ID of the watch returned from #watchPosition
-     */
-    clearWatch:function(id) {
-        if (id && timers[id] !== undefined) {
-            clearTimeout(timers[id].timer);
-            timers[id].timer = false;
-            exec(null, null, "Geolocation", "clearWatch", [id]);
-        }
-    }
-};
-
-module.exports = geolocation;
-
-});
-
-// file: lib/common/plugin/geolocation/symbols.js
-define("cordova/plugin/geolocation/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation');
-modulemapper.clobbers('cordova/plugin/PositionError', 'PositionError');
-modulemapper.clobbers('cordova/plugin/Position', 'Position');
-modulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates');
-
-});
-
 // file: lib/common/plugin/globalization.js
 define("cordova/plugin/globalization", function(require, exports, module) {
 
@@ -5813,16 +4477,6 @@ modulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError')
 
 });
 
-// file: lib/android/plugin/inappbrowser/symbols.js
-define("cordova/plugin/inappbrowser/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/InAppBrowser', 'open');
-
-});
-
 // file: lib/common/plugin/logger.js
 define("cordova/plugin/logger", function(require, exports, module) {
 
@@ -6258,120 +4912,6 @@ modulemapper.defaults('cordova/plugin/Connection', 'Connection');
 
 });
 
-// file: lib/common/plugin/notification.js
-define("cordova/plugin/notification", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-var platform = require('cordova/platform');
-
-/**
- * Provides access to notifications on the device.
- */
-
-module.exports = {
-
-    /**
-     * Open a native alert dialog, with a customizable title and button text.
-     *
-     * @param {String} message              Message to print in the body of the alert
-     * @param {Function} completeCallback   The callback that is called when user clicks on a button.
-     * @param {String} title                Title of the alert dialog (default: Alert)
-     * @param {String} buttonLabel          Label of the close button (default: OK)
-     */
-    alert: function(message, completeCallback, title, buttonLabel) {
-        var _title = (title || "Alert");
-        var _buttonLabel = (buttonLabel || "OK");
-        exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]);
-    },
-
-    /**
-     * Open a native confirm dialog, with a customizable title and button text.
-     * The result that the user selects is returned to the result callback.
-     *
-     * @param {String} message              Message to print in the body of the alert
-     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
-     * @param {String} title                Title of the alert dialog (default: Confirm)
-     * @param {Array} buttonLabels          Array of the labels of the buttons (default: ['OK', 'Cancel'])
-     */
-    confirm: function(message, resultCallback, title, buttonLabels) {
-        var _title = (title || "Confirm");
-        var _buttonLabels = (buttonLabels || ["OK", "Cancel"]);
-
-        // Strings are deprecated!
-        if (typeof _buttonLabels === 'string') {
-            console.log("Notification.confirm(string, function, string, string) is deprecated.  Use Notification.confirm(string, function, string, array).");
-        }
-
-        // Some platforms take an array of button label names.
-        // Other platforms take a comma separated list.
-        // For compatibility, we convert to the desired type based on the platform.
-        if (platform.id == "android" || platform.id == "ios" || platform.id == "windowsphone" || platform.id == "blackberry10") {
-            if (typeof _buttonLabels === 'string') {
-                var buttonLabelString = _buttonLabels;
-                _buttonLabels = _buttonLabels.split(","); // not crazy about changing the var type here
-            }
-        } else {
-            if (Array.isArray(_buttonLabels)) {
-                var buttonLabelArray = _buttonLabels;
-                _buttonLabels = buttonLabelArray.toString();
-            }
-        }
-        exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
-    },
-
-    /**
-     * Open a native prompt dialog, with a customizable title and button text.
-     * The following results are returned to the result callback:
-     *  buttonIndex     Index number of the button selected.
-     *  input1          The text entered in the prompt dialog box.
-     *
-     * @param {String} message              Dialog message to display (default: "Prompt message")
-     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
-     * @param {String} title                Title of the dialog (default: "Prompt")
-     * @param {Array} buttonLabels          Array of strings for the button labels (default: ["OK","Cancel"])
-     * @param {String} defaultText          Textbox input value (default: "Default text")
-     */
-    prompt: function(message, resultCallback, title, buttonLabels, defaultText) {
-        var _message = (message || "Prompt message");
-        var _title = (title || "Prompt");
-        var _buttonLabels = (buttonLabels || ["OK","Cancel"]);
-        var _defaultText = (defaultText || "Default text");
-        exec(resultCallback, null, "Notification", "prompt", [_message, _title, _buttonLabels, _defaultText]);
-    },
-
-    /**
-     * Causes the device to vibrate.
-     *
-     * @param {Integer} mills       The number of milliseconds to vibrate for.
-     */
-    vibrate: function(mills) {
-        exec(null, null, "Notification", "vibrate", [mills]);
-    },
-
-    /**
-     * Causes the device to beep.
-     * On Android, the default notification ringtone is played "count" times.
-     *
-     * @param {Integer} count       The number of beeps.
-     */
-    beep: function(count) {
-        exec(null, null, "Notification", "beep", [count]);
-    }
-};
-
-});
-
-// file: lib/android/plugin/notification/symbols.js
-define("cordova/plugin/notification/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/notification', 'navigator.notification');
-modulemapper.merges('cordova/plugin/android/notification', 'navigator.notification');
-
-});
-
 // file: lib/common/plugin/requestFileSystem.js
 define("cordova/plugin/requestFileSystem", function(require, exports, module) {
 
@@ -6467,34 +5007,6 @@ module.exports = function(uri, successCallback, errorCallback) {
 
 });
 
-// file: lib/common/plugin/splashscreen.js
-define("cordova/plugin/splashscreen", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-
-var splashscreen = {
-    show:function() {
-        exec(null, null, "SplashScreen", "show", []);
-    },
-    hide:function() {
-        exec(null, null, "SplashScreen", "hide", []);
-    }
-};
-
-module.exports = splashscreen;
-
-});
-
-// file: lib/common/plugin/splashscreen/symbols.js
-define("cordova/plugin/splashscreen/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen');
-
-});
-
 // file: lib/common/symbols.js
 define("cordova/symbols", function(require, exports, module) {
 

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9e44596d/framework/src/org/apache/cordova/DirectoryManager.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/DirectoryManager.java b/framework/src/org/apache/cordova/DirectoryManager.java
index 292f402..0c86f0f 100644
--- a/framework/src/org/apache/cordova/DirectoryManager.java
+++ b/framework/src/org/apache/cordova/DirectoryManager.java
@@ -138,7 +138,7 @@ public class DirectoryManager {
      *
      * @return the absolute path of where to store the file
      */
-    protected static String getTempDirectoryPath(Context ctx) {
+    public static String getTempDirectoryPath(Context ctx) {
         File cache = null;
 
         // SD Card Mounted


[47/50] [abbrv] android commit: [CB-3384] Rewrite of DataResource into UriResolver + UriResolvers

Posted by ag...@apache.org.
[CB-3384] Rewrite of DataResource into UriResolver + UriResolvers

Includes unit tests woot!

Note that this remove CordovaPlugin.shouldInterceptRequest(). Should be
fine since this method was introduced only a couple of releases ago, was
never documented, and afaict was only used by the Chrome Cordova plugins.


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/892ffc8c
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/892ffc8c
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/892ffc8c

Branch: refs/heads/2.9.x
Commit: 892ffc8ce45a555b74d1a8a40e4694b8855d753e
Parents: fbf7f1c
Author: Andrew Grieve <ag...@chromium.org>
Authored: Fri Jun 7 10:17:28 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Jun 27 21:55:28 2013 -0400

----------------------------------------------------------------------
 .../src/org/apache/cordova/CordovaWebView.java  |  34 +++
 .../src/org/apache/cordova/FileHelper.java      |  33 ++-
 .../cordova/IceCreamCordovaWebViewClient.java   |  49 ++--
 .../src/org/apache/cordova/UriResolver.java     |  65 +++++
 .../src/org/apache/cordova/UriResolvers.java    | 277 +++++++++++++++++++
 .../org/apache/cordova/api/CordovaPlugin.java   |  15 +-
 .../org/apache/cordova/api/PluginManager.java   |  33 +--
 .../apache/cordova/test/UriResolversTest.java   | 263 ++++++++++++++++++
 .../actions/CordovaWebViewTestActivity.java     |   2 +-
 9 files changed, 694 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/framework/src/org/apache/cordova/CordovaWebView.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaWebView.java b/framework/src/org/apache/cordova/CordovaWebView.java
index 67775a1..3a8e48d 100755
--- a/framework/src/org/apache/cordova/CordovaWebView.java
+++ b/framework/src/org/apache/cordova/CordovaWebView.java
@@ -943,4 +943,38 @@ public class CordovaWebView extends WebView {
     public void storeResult(int requestCode, int resultCode, Intent intent) {
         mResult = new ActivityResult(requestCode, resultCode, intent);
     }
+    
+    /**
+     * Resolves the given URI, giving plugins a chance to re-route or customly handle the URI.
+     * A white-list rejection will be returned if the URI does not pass the white-list.
+     * @return Never returns null.
+     * @throws Throws an InvalidArgumentException for relative URIs. Relative URIs should be
+     *     resolved before being passed into this function.
+     */
+    public UriResolver resolveUri(Uri uri) {
+        return resolveUri(uri, false);
+    }
+    
+    UriResolver resolveUri(Uri uri, boolean fromWebView) {
+        if (!uri.isAbsolute()) {
+            throw new IllegalArgumentException("Relative URIs are not yet supported by resolveUri.");
+        }
+        // Check the against the white-list before delegating to plugins.
+        if (("http".equals(uri.getScheme()) || "https".equals(uri.getScheme())) && !Config.isUrlWhiteListed(uri.toString()))
+        {
+            LOG.w(TAG, "resolveUri - URL is not in whitelist: " + uri);
+            return new UriResolvers.ErrorUriResolver(uri, "Whitelist rejection");
+        }
+
+        // Give plugins a chance to handle the request.
+        UriResolver resolver = pluginManager.resolveUri(uri);
+        if (resolver == null && !fromWebView) {
+            resolver = UriResolvers.forUri(uri, cordova.getActivity());
+            if (resolver == null) {
+                resolver = new UriResolvers.ErrorUriResolver(uri, "Unresolvable URI");
+            }
+        }
+
+        return resolver;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/framework/src/org/apache/cordova/FileHelper.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/FileHelper.java b/framework/src/org/apache/cordova/FileHelper.java
index ebbdc8d..0b2ba1c 100644
--- a/framework/src/org/apache/cordova/FileHelper.java
+++ b/framework/src/org/apache/cordova/FileHelper.java
@@ -26,9 +26,12 @@ import org.apache.cordova.api.CordovaInterface;
 import org.apache.cordova.api.LOG;
 
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URLConnection;
+import java.io.OutputStream;
+import java.nio.charset.Charset;
 import java.util.Locale;
 
 public class FileHelper {
@@ -124,6 +127,20 @@ public class FileHelper {
         return uriString;
     }
 
+    public static String getMimeTypeForExtension(String path) {
+        String extension = path;
+        int lastDot = extension.lastIndexOf('.');
+        if (lastDot != -1) {
+            extension = extension.substring(lastDot + 1);
+        }
+        // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185).
+        extension = extension.toLowerCase(Locale.getDefault());
+        if (extension.equals("3ga")) {
+            return "audio/3gpp";
+        }
+        return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
+    }
+    
     /**
      * Returns the mime type of the data specified by the given URI string.
      *
@@ -137,19 +154,7 @@ public class FileHelper {
         if (uriString.startsWith("content://")) {
             mimeType = cordova.getActivity().getContentResolver().getType(uri);
         } else {
-            // MimeTypeMap.getFileExtensionFromUrl() fails when there are query parameters.
-            String extension = uri.getPath();
-            int lastDot = extension.lastIndexOf('.');
-            if (lastDot != -1) {
-                extension = extension.substring(lastDot + 1);
-            }
-            // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185).
-            extension = extension.toLowerCase();
-            if (extension.equals("3ga")) {
-                mimeType = "audio/3gpp";
-            } else {
-                mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
-            }
+            mimeType = getMimeTypeForExtension(uri.getPath());
         }
 
         return mimeType;

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java b/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
index 1e190b6..8527d35 100644
--- a/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
+++ b/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
@@ -18,7 +18,6 @@
 */
 package org.apache.cordova;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -26,6 +25,7 @@ import org.apache.cordova.api.CordovaInterface;
 import org.apache.cordova.api.LOG;
 
 import android.annotation.TargetApi;
+import android.net.Uri;
 import android.os.Build;
 import android.webkit.WebResourceResponse;
 import android.webkit.WebView;
@@ -44,45 +44,29 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
 
     @Override
     public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
-        //Check if plugins intercept the request
-        WebResourceResponse ret = super.shouldInterceptRequest(view, url);
+        UriResolver uriResolver = appView.resolveUri(Uri.parse(url), true);
         
-        if(!Config.isUrlWhiteListed(url) && (url.startsWith("http://") || url.startsWith("https://")))
-        {
-            ret =  getWhitelistResponse();
-        }
-        else if(ret == null && (url.contains("?") || url.contains("#") || needsIceCreamSpecialsInAssetUrlFix(url))){
-            ret = generateWebResourceResponse(url);
-        }
-        else if (ret == null && this.appView.pluginManager != null) {
-            ret = this.appView.pluginManager.shouldInterceptRequest(url);
+        if (uriResolver == null && url.startsWith("file:///android_asset/")) {
+            if (url.contains("?") || url.contains("#") || needsIceCreamSpecialsInAssetUrlFix(url)) {
+                uriResolver = appView.resolveUri(Uri.parse(url), false);
+            }
         }
-        return ret;
-    }
-    
-    private WebResourceResponse getWhitelistResponse()
-    {
-        WebResourceResponse emptyResponse;
-        String empty = "";
-        ByteArrayInputStream data = new ByteArrayInputStream(empty.getBytes());
-        return new WebResourceResponse("text/plain", "UTF-8", data);
-    }
-
-    private WebResourceResponse generateWebResourceResponse(String url) {
-        if (url.startsWith("file:///android_asset/")) {
-            String mimetype = FileHelper.getMimeType(url, cordova);
-
+        
+        if (uriResolver != null) {
             try {
-                InputStream stream = FileHelper.getInputStreamFromUriString(url, cordova);
-                WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream);
-                return response;
+                InputStream stream = uriResolver.getInputStream();
+                String mimeType = uriResolver.getMimeType();
+                // If we don't know how to open this file, let the browser continue loading
+                return new WebResourceResponse(mimeType, "UTF-8", stream);
             } catch (IOException e) {
-                LOG.e("generateWebResourceResponse", e.getMessage(), e);
+                LOG.e("IceCreamCordovaWebViewClient", "Error occurred while loading a file.", e);
+                // Results in a 404.
+                return new WebResourceResponse("text/plain", "UTF-8", null);
             }
         }
         return null;
     }
-
+        
     private static boolean needsIceCreamSpecialsInAssetUrlFix(String url) {
         if (!url.contains("%20")){
             return false;
@@ -96,5 +80,4 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
                 return false;
         }
     }
-    
 }

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/framework/src/org/apache/cordova/UriResolver.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/UriResolver.java b/framework/src/org/apache/cordova/UriResolver.java
new file mode 100644
index 0000000..42e9a3a
--- /dev/null
+++ b/framework/src/org/apache/cordova/UriResolver.java
@@ -0,0 +1,65 @@
+/*
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+package org.apache.cordova;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import android.net.Uri;
+
+/*
+ * Interface for a class that can resolve URIs.
+ * See CordovaUriResolver for an example.
+ */
+public interface UriResolver {
+
+    /** Returns the URI that this instance will resolve. */
+    Uri getUri();
+    
+    /** 
+     * Returns the InputStream for the resource. 
+     * Throws an exception if it cannot be read. 
+     * Never returns null.
+     */
+    InputStream getInputStream() throws IOException;
+
+    /** 
+     * Returns the OutputStream for the resource. 
+     * Throws an exception if it cannot be written to. 
+     * Never returns null.
+     */
+    OutputStream getOutputStream() throws IOException; 
+    
+    /** 
+     * Returns the MIME type of the resource.
+     * Returns null if the MIME type cannot be determined (e.g. content: that doesn't exist).
+     */
+    String getMimeType();
+
+    /** Returns whether the resource is writable. */
+    boolean isWritable();
+
+    /**
+     * Returns a File that points to the resource, or null if the resource
+     * is not on the local file system.
+     */
+    File getLocalFile();
+}

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/framework/src/org/apache/cordova/UriResolvers.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/UriResolvers.java b/framework/src/org/apache/cordova/UriResolvers.java
new file mode 100644
index 0000000..e8be407
--- /dev/null
+++ b/framework/src/org/apache/cordova/UriResolvers.java
@@ -0,0 +1,277 @@
+/*
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+package org.apache.cordova;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.cordova.FileHelper;
+import org.apache.http.util.EncodingUtils;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.AssetManager;
+import android.net.Uri;
+
+/*
+ * UriResolver implementations.
+ */
+public final class UriResolvers {
+    private UriResolvers() {}
+
+    private static final class FileUriResolver implements UriResolver {
+        private final Uri uri;
+        private String mimeType;
+        private File localFile;
+    
+        FileUriResolver(Uri uri) {
+            this.uri = uri;
+        }
+        
+        public Uri getUri() {
+            return uri;
+        }
+        
+        public InputStream getInputStream() throws IOException {
+            return new FileInputStream(getLocalFile());
+        }
+        
+        public OutputStream getOutputStream() throws FileNotFoundException {
+            return new FileOutputStream(getLocalFile());
+        }
+        
+        public String getMimeType() {
+            if (mimeType == null) {
+                mimeType = FileHelper.getMimeTypeForExtension(getLocalFile().getName());
+            }
+            return mimeType;
+        }
+        
+        public boolean isWritable() {
+            File f = getLocalFile();
+            if (f.isDirectory()) {
+                return false;
+            }
+            if (f.exists()) {
+                return f.canWrite();
+            }
+            return f.getParentFile().canWrite();
+        }
+        
+        public File getLocalFile() {
+            if (localFile == null) {
+                localFile = new File(uri.getPath());
+            }
+            return localFile;
+        }
+    }
+    
+    private static final class AssetUriResolver implements UriResolver {
+        private final Uri uri;
+        private final AssetManager assetManager;
+        private final String assetPath;
+        private String mimeType;
+    
+        AssetUriResolver(Uri uri, AssetManager assetManager) {
+            this.uri = uri;
+            this.assetManager = assetManager;
+            this.assetPath = uri.getPath().substring(15);
+        }
+        
+        public Uri getUri() {
+            return uri;
+        }
+        
+        public InputStream getInputStream() throws IOException {
+            return assetManager.open(assetPath);
+        }
+        
+        public OutputStream getOutputStream() throws FileNotFoundException {
+            throw new FileNotFoundException("URI not writable.");
+        }
+        
+        public String getMimeType() {
+            if (mimeType == null) {
+                mimeType = FileHelper.getMimeTypeForExtension(assetPath);
+            }
+            return mimeType;
+        }
+        
+        public boolean isWritable() {
+            return false;
+        }
+        
+        public File getLocalFile() {
+            return null;
+        }
+    }
+    
+    private static final class ContentUriResolver implements UriResolver {
+        private final Uri uri;
+        private final ContentResolver contentResolver;
+        private String mimeType;
+    
+        ContentUriResolver(Uri uri, ContentResolver contentResolver) {
+            this.uri = uri;
+            this.contentResolver = contentResolver;
+        }
+        
+        public Uri getUri() {
+            return uri;
+        }
+        
+        public InputStream getInputStream() throws IOException {
+            return contentResolver.openInputStream(uri);
+        }
+        
+        public OutputStream getOutputStream() throws FileNotFoundException {
+            return contentResolver.openOutputStream(uri);
+        }
+        
+        public String getMimeType() {
+            if (mimeType == null) {
+                mimeType = contentResolver.getType(uri);
+            }
+            return mimeType;
+        }
+        
+        public boolean isWritable() {
+            return uri.getScheme().equals(ContentResolver.SCHEME_CONTENT);
+        }
+        
+        public File getLocalFile() {
+            return null;
+        }
+    }
+    
+    static final class ErrorUriResolver implements UriResolver {
+        final Uri uri;
+        final String errorMsg;
+        
+        ErrorUriResolver(Uri uri, String errorMsg) {
+            this.uri = uri;
+            this.errorMsg = errorMsg;
+        }
+        
+        @Override
+        public boolean isWritable() {
+            return false;
+        }
+        
+        @Override
+        public Uri getUri() {
+            return uri;
+        }
+        
+        @Override
+        public File getLocalFile() {
+            return null;
+        }
+        
+        @Override
+        public OutputStream getOutputStream() throws IOException {
+            throw new FileNotFoundException(errorMsg);
+        }
+        
+        @Override
+        public String getMimeType() {
+            return null;
+        }
+        
+        @Override
+        public InputStream getInputStream() throws IOException {
+            throw new FileNotFoundException(errorMsg);
+        }
+    }
+    
+    private static final class ReadOnlyResolver implements UriResolver {
+        private Uri uri;
+        private InputStream inputStream;
+        private String mimeType;
+        
+        public ReadOnlyResolver(Uri uri, InputStream inputStream, String mimeType) {
+            this.uri = uri;
+            this.inputStream = inputStream;
+            this.mimeType = mimeType;
+        }
+        
+        @Override
+        public boolean isWritable() {
+            return false;
+        }
+        
+        @Override
+        public Uri getUri() {
+            return uri;
+        }
+        
+        @Override
+        public File getLocalFile() {
+            return null;
+        }
+        
+        @Override
+        public OutputStream getOutputStream() throws IOException {
+            throw new FileNotFoundException("URI is not writable");
+        }
+        
+        @Override
+        public String getMimeType() {
+            return mimeType;
+        }
+        
+        @Override
+        public InputStream getInputStream() throws IOException {
+            return inputStream;
+        }
+    }
+    
+    public static UriResolver createInline(Uri uri, String response, String mimeType) {
+        return createInline(uri, EncodingUtils.getBytes(response, "UTF-8"), mimeType);
+    }
+    
+    public static UriResolver createInline(Uri uri, byte[] response, String mimeType) {
+        return new ReadOnlyResolver(uri, new ByteArrayInputStream(response), mimeType);
+    }
+
+    public static UriResolver createReadOnly(Uri uri, InputStream inputStream, String mimeType) {
+        return new ReadOnlyResolver(uri, inputStream, mimeType);
+    }
+    
+    /* Package-private to force clients to go through CordovaWebView.resolveUri(). */
+    static UriResolver forUri(Uri uri, Context context) {
+        String scheme = uri.getScheme();
+        if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) {
+            return new ContentUriResolver(uri, context.getContentResolver());
+        }
+        if (ContentResolver.SCHEME_FILE.equals(scheme)) {
+            if (uri.getPath().startsWith("/android_asset/")) {
+                return new AssetUriResolver(uri, context.getAssets());
+            }
+            return new FileUriResolver(uri);
+        }
+        return null;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/framework/src/org/apache/cordova/api/CordovaPlugin.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/CordovaPlugin.java b/framework/src/org/apache/cordova/api/CordovaPlugin.java
index 2b225e6..07035e5 100644
--- a/framework/src/org/apache/cordova/api/CordovaPlugin.java
+++ b/framework/src/org/apache/cordova/api/CordovaPlugin.java
@@ -20,14 +20,12 @@ package org.apache.cordova.api;
 
 import org.apache.cordova.CordovaArgs;
 import org.apache.cordova.CordovaWebView;
+import org.apache.cordova.UriResolver;
 import org.json.JSONArray;
 import org.json.JSONException;
 
-import android.annotation.TargetApi;
 import android.content.Intent;
-import android.os.Build;
-import android.util.Log;
-import android.webkit.WebResourceResponse;
+import android.net.Uri;
 
 /**
  * Plugins must extend this class and override one of the execute methods.
@@ -165,13 +163,10 @@ public class CordovaPlugin {
     }
 
     /**
-     * By specifying a <url-filter> in config.xml you can map a URL prefix to this method. It applies to all resources loaded in the WebView, not just top-level navigation.
-     *
-     * @param url               The URL of the resource to be loaded.
-     * @return                  Return a WebResourceResponse for the resource, or null to let the WebView handle it normally.
+     * Hook for overriding the default URI handling mechanism.
+     * Applies to WebView requests as well as requests made by plugins.
      */
-    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
-	public WebResourceResponse shouldInterceptRequest(String url) {
+    public UriResolver resolveUri(Uri uri) {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/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 e392dfa..083e882 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -26,12 +26,14 @@ 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;
 
@@ -380,25 +382,6 @@ public class PluginManager {
     }
 
     /**
-     * Called when the WebView is loading any resource, top-level or not.
-     *
-     * Uses the same url-filter tag as onOverrideUrlLoading.
-     *
-     * @param url               The URL of the resource to be loaded.
-     * @return                  Return a WebResourceResponse with the resource, or null if the WebView should handle it.
-     */
-    public WebResourceResponse shouldInterceptRequest(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()).shouldInterceptRequest(url);
-            }
-        }
-        return null;
-    }
-
-    /**
      * Called when the app navigates or refreshes.
      */
     public void onReset() {
@@ -419,6 +402,18 @@ public class PluginManager {
         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 {

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/test/src/org/apache/cordova/test/UriResolversTest.java
----------------------------------------------------------------------
diff --git a/test/src/org/apache/cordova/test/UriResolversTest.java b/test/src/org/apache/cordova/test/UriResolversTest.java
new file mode 100644
index 0000000..21584b9
--- /dev/null
+++ b/test/src/org/apache/cordova/test/UriResolversTest.java
@@ -0,0 +1,263 @@
+
+package org.apache.cordova.test;
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+import org.apache.cordova.CordovaWebView;
+import org.apache.cordova.UriResolver;
+import org.apache.cordova.UriResolvers;
+import org.apache.cordova.api.CallbackContext;
+import org.apache.cordova.api.CordovaPlugin;
+import org.apache.cordova.api.PluginEntry;
+import org.apache.cordova.test.actions.CordovaWebViewTestActivity;
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import java.io.File;
+import java.io.IOException;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+public class UriResolversTest extends ActivityInstrumentationTestCase2<CordovaWebViewTestActivity> {
+
+    public UriResolversTest()
+    {
+        super(CordovaWebViewTestActivity.class);
+    }
+
+    CordovaWebView cordovaWebView;
+    private CordovaWebViewTestActivity activity;
+    String execPayload;
+    Integer execStatus;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        activity = this.getActivity();
+        cordovaWebView = activity.cordovaWebView;
+        cordovaWebView.pluginManager.addService(new PluginEntry("UriResolverTestPlugin1", new CordovaPlugin() {
+            @Override
+            public UriResolver resolveUri(Uri uri) {
+                if ("plugin-uri".equals(uri.getScheme())) {
+                    return cordovaWebView.resolveUri(uri.buildUpon().scheme("file").build());
+                }
+                return null;
+            }
+            public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
+                synchronized (UriResolversTest.this) {
+                    execPayload = args.getString(0);
+                    execStatus = args.getInt(1);
+                    UriResolversTest.this.notify();
+                }
+                return true;
+            }
+        }));
+        cordovaWebView.pluginManager.addService(new PluginEntry("UriResolverTestPlugin2", new CordovaPlugin() {
+            @Override
+            public UriResolver resolveUri(Uri uri) {
+                if (uri.getQueryParameter("pluginRewrite") != null) {
+                    return UriResolvers.createInline(uri, "pass", "my/mime");
+                }
+                return null;
+            }
+        }));
+    }
+
+    private Uri createTestImageContentUri() {
+        Bitmap imageBitmap = BitmapFactory.decodeResource(activity.getResources(), R.drawable.icon);
+        String stored = MediaStore.Images.Media.insertImage(activity.getContentResolver(),
+                imageBitmap, "app-icon", "desc");
+        return Uri.parse(stored);
+    }
+
+    private void performResolverTest(Uri uri, String expectedMimeType, File expectedLocalFile,
+            boolean expectedIsWritable,
+            boolean expectRead, boolean expectWrite) throws IOException {
+        UriResolver resolver = cordovaWebView.resolveUri(uri);
+        assertEquals(expectedLocalFile, resolver.getLocalFile());
+        assertEquals(expectedMimeType, resolver.getMimeType());
+        if (expectedIsWritable) {
+            assertTrue(resolver.isWritable());
+        } else {
+            assertFalse(resolver.isWritable());
+        }
+        try {
+            resolver.getInputStream().read();
+            if (!expectRead) {
+                fail("Expected getInputStream to throw.");
+            }
+        } catch (IOException e) {
+            if (expectRead) {
+                throw e;
+            }
+        }
+        try {
+            resolver.getOutputStream().write(123);
+            if (!expectWrite) {
+                fail("Expected getOutputStream to throw.");
+            }
+        } catch (IOException e) {
+            if (expectWrite) {
+                throw e;
+            }
+        }
+    }
+
+    public void testValidContentUri() throws IOException
+    {
+        Uri contentUri = createTestImageContentUri();
+        performResolverTest(contentUri, "image/jpeg", null, true, true, true);
+    }
+
+    public void testInvalidContentUri() throws IOException
+    {
+        Uri contentUri = Uri.parse("content://media/external/images/media/999999999");
+        performResolverTest(contentUri, null, null, true, false, false);
+    }
+
+    public void testValidAssetUri() throws IOException
+    {
+        Uri assetUri = Uri.parse("file:///android_asset/www/index.html?foo#bar"); // Also check for stripping off ? and # correctly.
+        performResolverTest(assetUri, "text/html", null, false, true, false);
+    }
+
+    public void testInvalidAssetUri() throws IOException
+    {
+        Uri assetUri = Uri.parse("file:///android_asset/www/missing.html");
+        performResolverTest(assetUri, "text/html", null, false, false, false);
+    }
+
+    public void testFileUriToExistingFile() throws IOException
+    {
+        File f = File.createTempFile("te s t", ".txt"); // Also check for dealing with spaces.
+        try {
+            Uri fileUri = Uri.parse(f.toURI().toString() + "?foo#bar"); // Also check for stripping off ? and # correctly.
+            performResolverTest(fileUri, "text/plain", f, true, true, true);
+        } finally {
+            f.delete();
+        }
+    }
+
+    public void testFileUriToMissingFile() throws IOException
+    {
+        File f = new File(Environment.getExternalStorageDirectory() + "/somefilethatdoesntexist");
+        Uri fileUri = Uri.parse(f.toURI().toString());
+        try {
+            performResolverTest(fileUri, null, f, true, false, true);
+        } finally {
+            f.delete();
+        }
+    }
+    
+    public void testFileUriToMissingFileWithMissingParent() throws IOException
+    {
+        File f = new File(Environment.getExternalStorageDirectory() + "/somedirthatismissing/somefilethatdoesntexist");
+        Uri fileUri = Uri.parse(f.toURI().toString());
+        performResolverTest(fileUri, null, f, false, false, false);
+    }
+
+    public void testUnrecognizedUri() throws IOException
+    {
+        Uri uri = Uri.parse("somescheme://foo");
+        performResolverTest(uri, null, null, false, false, false);
+    }
+
+    public void testRelativeUri()
+    {
+        try {
+            cordovaWebView.resolveUri(Uri.parse("/foo"));
+            fail("Should have thrown for relative URI 1.");
+        } catch (Throwable t) {
+        }
+        try {
+            cordovaWebView.resolveUri(Uri.parse("//foo/bar"));
+            fail("Should have thrown for relative URI 2.");
+        } catch (Throwable t) {
+        }
+        try {
+            cordovaWebView.resolveUri(Uri.parse("foo.png"));
+            fail("Should have thrown for relative URI 3.");
+        } catch (Throwable t) {
+        }
+    }
+    
+    public void testPluginOverrides1() throws IOException
+    {
+        Uri uri = Uri.parse("plugin-uri://foohost/android_asset/www/index.html");
+        performResolverTest(uri, "text/html", null, false, true, false);
+    }
+
+    public void testPluginOverrides2() throws IOException
+    {
+        Uri uri = Uri.parse("plugin-uri://foohost/android_asset/www/index.html?pluginRewrite=yes");
+        performResolverTest(uri, "my/mime", null, false, true, false);
+    }
+
+    public void testWhitelistRejection() throws IOException
+    {
+        Uri uri = Uri.parse("http://foohost.com/");
+        performResolverTest(uri, null, null, false, false, false);
+    }
+    
+    public void testWebViewRequestIntercept() throws IOException
+    {
+        cordovaWebView.sendJavascript(
+            "var x = new XMLHttpRequest;\n" +
+            "x.open('GET', 'file://foo?pluginRewrite=1', false);\n" + 
+            "x.send();\n" + 
+            "cordova.require('cordova/exec')(null,null,'UriResolverTestPlugin1', 'foo', [x.responseText, x.status])");
+        execPayload = null;
+        execStatus = null;
+        try {
+            synchronized (this) {
+                this.wait(2000);
+            }
+        } catch (InterruptedException e) {
+        }
+        assertEquals("pass", execPayload);
+        assertEquals(execStatus.intValue(), 200);
+    }
+    
+    public void testWebViewWhiteListRejection() throws IOException
+    {
+        cordovaWebView.sendJavascript(
+            "var x = new XMLHttpRequest;\n" +
+            "x.open('GET', 'http://foo/bar', false);\n" + 
+            "x.send();\n" + 
+            "cordova.require('cordova/exec')(null,null,'UriResolverTestPlugin1', 'foo', [x.responseText, x.status])");
+        execPayload = null;
+        execStatus = null;
+        try {
+            synchronized (this) {
+                this.wait(2000);
+            }
+        } catch (InterruptedException e) {
+        }
+        assertEquals("", execPayload);
+        assertEquals(execStatus.intValue(), 404);
+    }    
+}

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/892ffc8c/test/src/org/apache/cordova/test/actions/CordovaWebViewTestActivity.java
----------------------------------------------------------------------
diff --git a/test/src/org/apache/cordova/test/actions/CordovaWebViewTestActivity.java b/test/src/org/apache/cordova/test/actions/CordovaWebViewTestActivity.java
index 1185bad..3be5ab2 100644
--- a/test/src/org/apache/cordova/test/actions/CordovaWebViewTestActivity.java
+++ b/test/src/org/apache/cordova/test/actions/CordovaWebViewTestActivity.java
@@ -36,7 +36,7 @@ import android.content.Intent;
 import android.os.Bundle;
 
 public class CordovaWebViewTestActivity extends Activity implements CordovaInterface {
-    CordovaWebView cordovaWebView;
+    public CordovaWebView cordovaWebView;
 
     private final ExecutorService threadPool = Executors.newCachedThreadPool();
     


[43/50] [abbrv] android commit: Explicitly print exceptions that occur within ExposedJsApi.

Posted by ag...@apache.org.
Explicitly print exceptions that occur within ExposedJsApi.

Before they trickled into JNI and the stack traces were lost.
(cherry picked from commit 10d31ea0a30ec47d68c79813d56e7506b1542f7e)


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/f42e5f66
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/f42e5f66
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/f42e5f66

Branch: refs/heads/master
Commit: f42e5f66fdd79a730b4552f5813fbfbcfc607533
Parents: 16e0838
Author: Andrew Grieve <ag...@chromium.org>
Authored: Wed Jun 26 14:20:45 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Wed Jun 26 14:21:48 2013 -0400

----------------------------------------------------------------------
 framework/src/org/apache/cordova/ExposedJsApi.java | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/f42e5f66/framework/src/org/apache/cordova/ExposedJsApi.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/ExposedJsApi.java b/framework/src/org/apache/cordova/ExposedJsApi.java
index 40ab1e3..221dd3d 100755
--- a/framework/src/org/apache/cordova/ExposedJsApi.java
+++ b/framework/src/org/apache/cordova/ExposedJsApi.java
@@ -54,6 +54,9 @@ import org.json.JSONException;
                 ret = jsMessageQueue.popAndEncode();
             }
             return ret;
+        } catch (Throwable e) {
+            e.printStackTrace();
+            return "";
         } finally {
             jsMessageQueue.setPaused(false);
         }


[05/50] [abbrv] android commit: removed batter code from js

Posted by ag...@apache.org.
removed batter code from js


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/7c22bc74
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/7c22bc74
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/7c22bc74

Branch: refs/heads/master
Commit: 7c22bc74bc79ac24ddc581c39f99c50289035bd4
Parents: dfd668d
Author: Steven Gill <st...@gmail.com>
Authored: Mon May 20 17:40:11 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Mon May 20 17:40:11 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 98 +-----------------------------------
 1 file changed, 2 insertions(+), 96 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/7c22bc74/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 4650ab2..8202173 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-80-geda98d1
+// 2.7.0rc1-81-gc09114e
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-80-geda98d1';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-81-gc09114e';
 // file: lib/scripts/require.js
 
 var require,
@@ -4114,100 +4114,6 @@ modulemapper.clobbers('cordova/plugin/android/storage/openDatabase', 'openDataba
 
 });
 
-// file: lib/common/plugin/battery.js
-define("cordova/plugin/battery", function(require, exports, module) {
-
-/**
- * This class contains information about the current battery status.
- * @constructor
- */
-var cordova = require('cordova'),
-    exec = require('cordova/exec');
-
-function handlers() {
-  return battery.channels.batterystatus.numHandlers +
-         battery.channels.batterylow.numHandlers +
-         battery.channels.batterycritical.numHandlers;
-}
-
-var Battery = function() {
-    this._level = null;
-    this._isPlugged = null;
-    // Create new event handlers on the window (returns a channel instance)
-    this.channels = {
-      batterystatus:cordova.addWindowEventHandler("batterystatus"),
-      batterylow:cordova.addWindowEventHandler("batterylow"),
-      batterycritical:cordova.addWindowEventHandler("batterycritical")
-    };
-    for (var key in this.channels) {
-        this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange;
-    }
-};
-/**
- * Event handlers for when callbacks get registered for the battery.
- * Keep track of how many handlers we have so we can start and stop the native battery listener
- * appropriately (and hopefully save on battery life!).
- */
-Battery.onHasSubscribersChange = function() {
-  // If we just registered the first handler, make sure native listener is started.
-  if (this.numHandlers === 1 && handlers() === 1) {
-      exec(battery._status, battery._error, "Battery", "start", []);
-  } else if (handlers() === 0) {
-      exec(null, null, "Battery", "stop", []);
-  }
-};
-
-/**
- * Callback for battery status
- *
- * @param {Object} info            keys: level, isPlugged
- */
-Battery.prototype._status = function(info) {
-    if (info) {
-        var me = battery;
-    var level = info.level;
-        if (me._level !== level || me._isPlugged !== info.isPlugged) {
-            // Fire batterystatus event
-            cordova.fireWindowEvent("batterystatus", info);
-
-            // Fire low battery event
-            if (level === 20 || level === 5) {
-                if (level === 20) {
-                    cordova.fireWindowEvent("batterylow", info);
-                }
-                else {
-                    cordova.fireWindowEvent("batterycritical", info);
-                }
-            }
-        }
-        me._level = level;
-        me._isPlugged = info.isPlugged;
-    }
-};
-
-/**
- * Error callback for battery start
- */
-Battery.prototype._error = function(e) {
-    console.log("Error initializing Battery: " + e);
-};
-
-var battery = new Battery();
-
-module.exports = battery;
-
-});
-
-// file: lib/common/plugin/battery/symbols.js
-define("cordova/plugin/battery/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.defaults('cordova/plugin/battery', 'navigator.battery');
-
-});
-
 // file: lib/common/plugin/camera/symbols.js
 define("cordova/plugin/camera/symbols", function(require, exports, module) {
 


[28/50] [abbrv] android commit: CB-3932 Remove baseUrl comment in handleDestroy method made redundant by CB-3766

Posted by ag...@apache.org.
CB-3932 Remove baseUrl comment in handleDestroy method made redundant by CB-3766


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/3a140177
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/3a140177
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/3a140177

Branch: refs/heads/2.9.x
Commit: 3a14017729cacf2464c5e78e0a76c2471ffec0fc
Parents: 4ec3d6d
Author: Angela Fowler <an...@fast.au.fujitsu.com>
Authored: Wed Jun 19 15:22:42 2013 +1000
Committer: Angela Fowler <an...@fast.au.fujitsu.com>
Committed: Wed Jun 19 15:22:42 2013 +1000

----------------------------------------------------------------------
 framework/src/org/apache/cordova/CordovaWebView.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/3a140177/framework/src/org/apache/cordova/CordovaWebView.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaWebView.java b/framework/src/org/apache/cordova/CordovaWebView.java
index e1d1bf1..67775a1 100755
--- a/framework/src/org/apache/cordova/CordovaWebView.java
+++ b/framework/src/org/apache/cordova/CordovaWebView.java
@@ -805,7 +805,6 @@ public class CordovaWebView extends WebView {
     public void handleDestroy()
     {
         // Send destroy event to JavaScript
-    	// Since baseUrl is set in loadUrlIntoView, if user hit Back button before loadUrl was called, we'll get an NPE on baseUrl (CB-2458)
         this.loadUrl("javascript:try{cordova.require('cordova/channel').onDestroy.fire();}catch(e){console.log('exception firing destroy event from native');};");
 
         // Load blank page so that JavaScript onunload is called


[13/50] [abbrv] android commit: updated js

Posted by ag...@apache.org.
updated js


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/3a559914
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/3a559914
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/3a559914

Branch: refs/heads/master
Commit: 3a559914808ac40cf986c51e7e47b4d83fe22588
Parents: 9e44596
Author: Steven Gill <st...@gmail.com>
Authored: Thu Jun 13 14:54:30 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Thu Jun 13 14:54:30 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 417 +----------------------------------
 1 file changed, 2 insertions(+), 415 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/3a559914/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 8973d5f..a90b232 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-100-g6a53312
+// 2.7.0rc1-101-gc6482ac
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-100-g6a53312';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-101-gc6482ac';
 // file: lib/scripts/require.js
 
 var require,
@@ -2763,32 +2763,6 @@ module.exports = Flags;
 
 });
 
-// file: lib/common/plugin/GlobalizationError.js
-define("cordova/plugin/GlobalizationError", function(require, exports, module) {
-
-
-/**
- * Globalization error object
- *
- * @constructor
- * @param code
- * @param message
- */
-var GlobalizationError = function(code, message) {
-    this.code = code || null;
-    this.message = message || '';
-};
-
-// Globalization error codes
-GlobalizationError.UNKNOWN_ERROR = 0;
-GlobalizationError.FORMATTING_ERROR = 1;
-GlobalizationError.PARSING_ERROR = 2;
-GlobalizationError.PATTERN_ERROR = 3;
-
-module.exports = GlobalizationError;
-
-});
-
 // file: lib/common/plugin/LocalFileSystem.js
 define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
 
@@ -4090,393 +4064,6 @@ modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError');
 
 });
 
-// file: lib/common/plugin/globalization.js
-define("cordova/plugin/globalization", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    GlobalizationError = require('cordova/plugin/GlobalizationError');
-
-var globalization = {
-
-/**
-* Returns the string identifier for the client's current language.
-* It returns the language identifier string to the successCB callback with a
-* properties object as a parameter. If there is an error getting the language,
-* then the errorCB callback is invoked.
-*
-* @param {Function} successCB
-* @param {Function} errorCB
-*
-* @return Object.value {String}: The language identifier
-*
-* @error GlobalizationError.UNKNOWN_ERROR
-*
-* Example
-*    globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');},
-*                                function () {});
-*/
-getPreferredLanguage:function(successCB, failureCB) {
-    argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments);
-    exec(successCB, failureCB, "Globalization","getPreferredLanguage", []);
-},
-
-/**
-* Returns the string identifier for the client's current locale setting.
-* It returns the locale identifier string to the successCB callback with a
-* properties object as a parameter. If there is an error getting the locale,
-* then the errorCB callback is invoked.
-*
-* @param {Function} successCB
-* @param {Function} errorCB
-*
-* @return Object.value {String}: The locale identifier
-*
-* @error GlobalizationError.UNKNOWN_ERROR
-*
-* Example
-*    globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');},
-*                                function () {});
-*/
-getLocaleName:function(successCB, failureCB) {
-    argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments);
-    exec(successCB, failureCB, "Globalization","getLocaleName", []);
-},
-
-
-/**
-* Returns a date formatted as a string according to the client's user preferences and
-* calendar using the time zone of the client. It returns the formatted date string to the
-* successCB callback with a properties object as a parameter. If there is an error
-* formatting the date, then the errorCB callback is invoked.
-*
-* The defaults are: formatLenght="short" and selector="date and time"
-*
-* @param {Date} date
-* @param {Function} successCB
-* @param {Function} errorCB
-* @param {Object} options {optional}
-*            formatLength {String}: 'short', 'medium', 'long', or 'full'
-*            selector {String}: 'date', 'time', or 'date and time'
-*
-* @return Object.value {String}: The localized date string
-*
-* @error GlobalizationError.FORMATTING_ERROR
-*
-* Example
-*    globalization.dateToString(new Date(),
-*                function (date) {alert('date:' + date.value + '\n');},
-*                function (errorCode) {alert(errorCode);},
-*                {formatLength:'short'});
-*/
-dateToString:function(date, successCB, failureCB, options) {
-    argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments);
-    var dateValue = date.valueOf();
-    exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]);
-},
-
-
-/**
-* Parses a date formatted as a string according to the client's user
-* preferences and calendar using the time zone of the client and returns
-* the corresponding date object. It returns the date to the successCB
-* callback with a properties object as a parameter. If there is an error
-* parsing the date string, then the errorCB callback is invoked.
-*
-* The defaults are: formatLength="short" and selector="date and time"
-*
-* @param {String} dateString
-* @param {Function} successCB
-* @param {Function} errorCB
-* @param {Object} options {optional}
-*            formatLength {String}: 'short', 'medium', 'long', or 'full'
-*            selector {String}: 'date', 'time', or 'date and time'
-*
-* @return    Object.year {Number}: The four digit year
-*            Object.month {Number}: The month from (0 - 11)
-*            Object.day {Number}: The day from (1 - 31)
-*            Object.hour {Number}: The hour from (0 - 23)
-*            Object.minute {Number}: The minute from (0 - 59)
-*            Object.second {Number}: The second from (0 - 59)
-*            Object.millisecond {Number}: The milliseconds (from 0 - 999),
-*                                        not available on all platforms
-*
-* @error GlobalizationError.PARSING_ERROR
-*
-* Example
-*    globalization.stringToDate('4/11/2011',
-*                function (date) { alert('Month:' + date.month + '\n' +
-*                    'Day:' + date.day + '\n' +
-*                    'Year:' + date.year + '\n');},
-*                function (errorCode) {alert(errorCode);},
-*                {selector:'date'});
-*/
-stringToDate:function(dateString, successCB, failureCB, options) {
-    argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments);
-    exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]);
-},
-
-
-/**
-* Returns a pattern string for formatting and parsing dates according to the client's
-* user preferences. It returns the pattern to the successCB callback with a
-* properties object as a parameter. If there is an error obtaining the pattern,
-* then the errorCB callback is invoked.
-*
-* The defaults are: formatLength="short" and selector="date and time"
-*
-* @param {Function} successCB
-* @param {Function} errorCB
-* @param {Object} options {optional}
-*            formatLength {String}: 'short', 'medium', 'long', or 'full'
-*            selector {String}: 'date', 'time', or 'date and time'
-*
-* @return    Object.pattern {String}: The date and time pattern for formatting and parsing dates.
-*                                    The patterns follow Unicode Technical Standard #35
-*                                    http://unicode.org/reports/tr35/tr35-4.html
-*            Object.timezone {String}: The abbreviated name of the time zone on the client
-*            Object.utc_offset {Number}: The current difference in seconds between the client's
-*                                        time zone and coordinated universal time.
-*            Object.dst_offset {Number}: The current daylight saving time offset in seconds
-*                                        between the client's non-daylight saving's time zone
-*                                        and the client's daylight saving's time zone.
-*
-* @error GlobalizationError.PATTERN_ERROR
-*
-* Example
-*    globalization.getDatePattern(
-*                function (date) {alert('pattern:' + date.pattern + '\n');},
-*                function () {},
-*                {formatLength:'short'});
-*/
-getDatePattern:function(successCB, failureCB, options) {
-    argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments);
-    exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]);
-},
-
-
-/**
-* Returns an array of either the names of the months or days of the week
-* according to the client's user preferences and calendar. It returns the array of names to the
-* successCB callback with a properties object as a parameter. If there is an error obtaining the
-* names, then the errorCB callback is invoked.
-*
-* The defaults are: type="wide" and item="months"
-*
-* @param {Function} successCB
-* @param {Function} errorCB
-* @param {Object} options {optional}
-*            type {String}: 'narrow' or 'wide'
-*            item {String}: 'months', or 'days'
-*
-* @return Object.value {Array{String}}: The array of names starting from either
-*                                        the first month in the year or the
-*                                        first day of the week.
-* @error GlobalizationError.UNKNOWN_ERROR
-*
-* Example
-*    globalization.getDateNames(function (names) {
-*        for(var i = 0; i < names.value.length; i++) {
-*            alert('Month:' + names.value[i] + '\n');}},
-*        function () {});
-*/
-getDateNames:function(successCB, failureCB, options) {
-    argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments);
-    exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]);
-},
-
-/**
-* Returns whether daylight savings time is in effect for a given date using the client's
-* time zone and calendar. It returns whether or not daylight savings time is in effect
-* to the successCB callback with a properties object as a parameter. If there is an error
-* reading the date, then the errorCB callback is invoked.
-*
-* @param {Date} date
-* @param {Function} successCB
-* @param {Function} errorCB
-*
-* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is
-*                                in effect for the given date and "false" indicate that it is not.
-*
-* @error GlobalizationError.UNKNOWN_ERROR
-*
-* Example
-*    globalization.isDayLightSavingsTime(new Date(),
-*                function (date) {alert('dst:' + date.dst + '\n');}
-*                function () {});
-*/
-isDayLightSavingsTime:function(date, successCB, failureCB) {
-    argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments);
-    var dateValue = date.valueOf();
-    exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]);
-},
-
-/**
-* Returns the first day of the week according to the client's user preferences and calendar.
-* The days of the week are numbered starting from 1 where 1 is considered to be Sunday.
-* It returns the day to the successCB callback with a properties object as a parameter.
-* If there is an error obtaining the pattern, then the errorCB callback is invoked.
-*
-* @param {Function} successCB
-* @param {Function} errorCB
-*
-* @return Object.value {Number}: The number of the first day of the week.
-*
-* @error GlobalizationError.UNKNOWN_ERROR
-*
-* Example
-*    globalization.getFirstDayOfWeek(function (day)
-*                { alert('Day:' + day.value + '\n');},
-*                function () {});
-*/
-getFirstDayOfWeek:function(successCB, failureCB) {
-    argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments);
-    exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []);
-},
-
-
-/**
-* Returns a number formatted as a string according to the client's user preferences.
-* It returns the formatted number string to the successCB callback with a properties object as a
-* parameter. If there is an error formatting the number, then the errorCB callback is invoked.
-*
-* The defaults are: type="decimal"
-*
-* @param {Number} number
-* @param {Function} successCB
-* @param {Function} errorCB
-* @param {Object} options {optional}
-*            type {String}: 'decimal', "percent", or 'currency'
-*
-* @return Object.value {String}: The formatted number string.
-*
-* @error GlobalizationError.FORMATTING_ERROR
-*
-* Example
-*    globalization.numberToString(3.25,
-*                function (number) {alert('number:' + number.value + '\n');},
-*                function () {},
-*                {type:'decimal'});
-*/
-numberToString:function(number, successCB, failureCB, options) {
-    argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments);
-    exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]);
-},
-
-/**
-* Parses a number formatted as a string according to the client's user preferences and
-* returns the corresponding number. It returns the number to the successCB callback with a
-* properties object as a parameter. If there is an error parsing the number string, then
-* the errorCB callback is invoked.
-*
-* The defaults are: type="decimal"
-*
-* @param {String} numberString
-* @param {Function} successCB
-* @param {Function} errorCB
-* @param {Object} options {optional}
-*            type {String}: 'decimal', "percent", or 'currency'
-*
-* @return Object.value {Number}: The parsed number.
-*
-* @error GlobalizationError.PARSING_ERROR
-*
-* Example
-*    globalization.stringToNumber('1234.56',
-*                function (number) {alert('Number:' + number.value + '\n');},
-*                function () { alert('Error parsing number');});
-*/
-stringToNumber:function(numberString, successCB, failureCB, options) {
-    argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments);
-    exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]);
-},
-
-/**
-* Returns a pattern string for formatting and parsing numbers according to the client's user
-* preferences. It returns the pattern to the successCB callback with a properties object as a
-* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked.
-*
-* The defaults are: type="decimal"
-*
-* @param {Function} successCB
-* @param {Function} errorCB
-* @param {Object} options {optional}
-*            type {String}: 'decimal', "percent", or 'currency'
-*
-* @return    Object.pattern {String}: The number pattern for formatting and parsing numbers.
-*                                    The patterns follow Unicode Technical Standard #35.
-*                                    http://unicode.org/reports/tr35/tr35-4.html
-*            Object.symbol {String}: The symbol to be used when formatting and parsing
-*                                    e.g., percent or currency symbol.
-*            Object.fraction {Number}: The number of fractional digits to use when parsing and
-*                                    formatting numbers.
-*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.
-*            Object.positive {String}: The symbol to use for positive numbers when parsing and formatting.
-*            Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting.
-*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
-*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
-*
-* @error GlobalizationError.PATTERN_ERROR
-*
-* Example
-*    globalization.getNumberPattern(
-*                function (pattern) {alert('Pattern:' + pattern.pattern + '\n');},
-*                function () {});
-*/
-getNumberPattern:function(successCB, failureCB, options) {
-    argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments);
-    exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]);
-},
-
-/**
-* Returns a pattern string for formatting and parsing currency values according to the client's
-* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a
-* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB
-* callback is invoked.
-*
-* @param {String} currencyCode
-* @param {Function} successCB
-* @param {Function} errorCB
-*
-* @return    Object.pattern {String}: The currency pattern for formatting and parsing currency values.
-*                                    The patterns follow Unicode Technical Standard #35
-*                                    http://unicode.org/reports/tr35/tr35-4.html
-*            Object.code {String}: The ISO 4217 currency code for the pattern.
-*            Object.fraction {Number}: The number of fractional digits to use when parsing and
-*                                    formatting currency.
-*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.
-*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
-*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
-*
-* @error GlobalizationError.FORMATTING_ERROR
-*
-* Example
-*    globalization.getCurrencyPattern('EUR',
-*                function (currency) {alert('Pattern:' + currency.pattern + '\n');}
-*                function () {});
-*/
-getCurrencyPattern:function(currencyCode, successCB, failureCB) {
-    argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments);
-    exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]);
-}
-
-};
-
-module.exports = globalization;
-
-});
-
-// file: lib/common/plugin/globalization/symbols.js
-define("cordova/plugin/globalization/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/globalization', 'navigator.globalization');
-modulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError');
-
-});
-
 // file: lib/common/plugin/logger.js
 define("cordova/plugin/logger", function(require, exports, module) {
 


[33/50] [abbrv] android commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cordova-android

Posted by ag...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cordova-android


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/b032dcca
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/b032dcca
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/b032dcca

Branch: refs/heads/2.9.x
Commit: b032dcca1637f37a3152a28f488cc639e1bbd5ea
Parents: 01d6ae5 03c5208
Author: Joe Bowser <bo...@apache.org>
Authored: Thu Jun 20 16:33:17 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Thu Jun 20 16:33:17 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 129 ++++++++++++++++++++++++++---------
 1 file changed, 97 insertions(+), 32 deletions(-)
----------------------------------------------------------------------



[24/50] [abbrv] android commit: Need to remove reference to device plugin in template

Posted by ag...@apache.org.
Need to remove reference to device plugin in template


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/c531d97e
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/c531d97e
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/c531d97e

Branch: refs/heads/master
Commit: c531d97ed27813291d57ce0df5c176fd496c2b43
Parents: 63ab701
Author: Tim Kim <ti...@adobe.com>
Authored: Tue Jun 18 14:26:11 2013 -0700
Committer: Tim Kim <ti...@adobe.com>
Committed: Tue Jun 18 14:26:11 2013 -0700

----------------------------------------------------------------------
 framework/res/xml/config.xml | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/c531d97e/framework/res/xml/config.xml
----------------------------------------------------------------------
diff --git a/framework/res/xml/config.xml b/framework/res/xml/config.xml
index 05c1416..93edda6 100644
--- a/framework/res/xml/config.xml
+++ b/framework/res/xml/config.xml
@@ -43,9 +43,7 @@
       <preference name="InAppBrowserStorageEnabled" value="true" />
       <preference name="disallowOverscroll" value="true" />
     -->
-    <feature name="Device">
-      <param name="android-package" value="org.apache.cordova.Device"/>
-    </feature>
+
     <!-- Deprecated plugins element. Remove in 3.0 -->
     <plugins>
     </plugins>


[08/50] [abbrv] android commit: removed contacts from js

Posted by ag...@apache.org.
removed contacts from js


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/98d99016
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/98d99016
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/98d99016

Branch: refs/heads/master
Commit: 98d9901693591f29e6ccf160269328610406584a
Parents: 75f358d
Author: Steven Gill <st...@gmail.com>
Authored: Thu May 23 15:18:39 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Thu May 23 15:18:39 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 152 +----------------------------------
 1 file changed, 2 insertions(+), 150 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/98d99016/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index cf7ca8f..f3c20a7 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-83-g658fd32
+// 2.7.0rc1-84-gdba3744
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-83-g658fd32';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-84-gdba3744';
 // file: lib/scripts/require.js
 
 var require,
@@ -1159,142 +1159,6 @@ module.exports = {
 
 });
 
-// file: lib/common/plugin/Camera.js
-define("cordova/plugin/Camera", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    Camera = require('cordova/plugin/CameraConstants'),
-    CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle');
-
-var cameraExport = {};
-
-// Tack on the Camera Constants to the base camera plugin.
-for (var key in Camera) {
-    cameraExport[key] = Camera[key];
-}
-
-/**
- * Gets a picture from source defined by "options.sourceType", and returns the
- * image as defined by the "options.destinationType" option.
-
- * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
- *
- * @param {Function} successCallback
- * @param {Function} errorCallback
- * @param {Object} options
- */
-cameraExport.getPicture = function(successCallback, errorCallback, options) {
-    argscheck.checkArgs('fFO', 'Camera.getPicture', arguments);
-    options = options || {};
-    var getValue = argscheck.getValue;
-
-    var quality = getValue(options.quality, 50);
-    var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI);
-    var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA);
-    var targetWidth = getValue(options.targetWidth, -1);
-    var targetHeight = getValue(options.targetHeight, -1);
-    var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG);
-    var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE);
-    var allowEdit = !!options.allowEdit;
-    var correctOrientation = !!options.correctOrientation;
-    var saveToPhotoAlbum = !!options.saveToPhotoAlbum;
-    var popoverOptions = getValue(options.popoverOptions, null);
-    var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK);
-
-    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
-                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection];
-
-    exec(successCallback, errorCallback, "Camera", "takePicture", args);
-    return new CameraPopoverHandle();
-};
-
-cameraExport.cleanup = function(successCallback, errorCallback) {
-    exec(successCallback, errorCallback, "Camera", "cleanup", []);
-};
-
-module.exports = cameraExport;
-
-});
-
-// file: lib/common/plugin/CameraConstants.js
-define("cordova/plugin/CameraConstants", function(require, exports, module) {
-
-module.exports = {
-  DestinationType:{
-    DATA_URL: 0,         // Return base64 encoded string
-    FILE_URI: 1,         // Return file uri (content://media/external/images/media/2 for Android)
-    NATIVE_URI: 2        // Return native uri (eg. asset-library://... for iOS)
-  },
-  EncodingType:{
-    JPEG: 0,             // Return JPEG encoded image
-    PNG: 1               // Return PNG encoded image
-  },
-  MediaType:{
-    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
-    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
-    ALLMEDIA : 2         // allow selection from all media types
-  },
-  PictureSourceType:{
-    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
-    CAMERA : 1,          // Take picture from camera
-    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
-  },
-  PopoverArrowDirection:{
-      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
-      ARROW_DOWN : 2,
-      ARROW_LEFT : 4,
-      ARROW_RIGHT : 8,
-      ARROW_ANY : 15
-  },
-  Direction:{
-      BACK: 0,
-      FRONT: 1
-  }
-};
-
-});
-
-// file: lib/common/plugin/CameraPopoverHandle.js
-define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-
-/**
- * A handle to an image picker popover.
- */
-var CameraPopoverHandle = function() {
-    this.setPosition = function(popoverOptions) {
-        console.log('CameraPopoverHandle.setPosition is only supported on iOS.');
-    };
-};
-
-module.exports = CameraPopoverHandle;
-
-});
-
-// file: lib/common/plugin/CameraPopoverOptions.js
-define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
-
-var Camera = require('cordova/plugin/CameraConstants');
-
-/**
- * Encapsulates options for iOS Popover image picker
- */
-var CameraPopoverOptions = function(x,y,width,height,arrowDir){
-    // information of rectangle that popover should be anchored to
-    this.x = x || 0;
-    this.y = y || 32;
-    this.width = width || 320;
-    this.height = height || 480;
-    // The direction of the popover arrow
-    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
-};
-
-module.exports = CameraPopoverOptions;
-
-});
-
 // file: lib/common/plugin/CaptureAudioOptions.js
 define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
 
@@ -3798,18 +3662,6 @@ modulemapper.clobbers('cordova/plugin/android/storage/openDatabase', 'openDataba
 
 });
 
-// file: lib/common/plugin/camera/symbols.js
-define("cordova/plugin/camera/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.defaults('cordova/plugin/Camera', 'navigator.camera');
-modulemapper.defaults('cordova/plugin/CameraConstants', 'Camera');
-modulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions');
-
-});
-
 // file: lib/common/plugin/capture.js
 define("cordova/plugin/capture", function(require, exports, module) {
 


[50/50] [abbrv] android commit: [CB-4048] Merge branch '3.0.0' into master

Posted by ag...@apache.org.
[CB-4048] Merge branch '3.0.0' into master


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/a97487bc
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/a97487bc
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/a97487bc

Branch: refs/heads/master
Commit: a97487bcec2b9bc2e44428dc8b44b151a838391c
Parents: 892ffc8 3b7e050
Author: Andrew Grieve <ag...@chromium.org>
Authored: Fri Jun 28 11:59:54 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Fri Jun 28 11:59:54 2013 -0400

----------------------------------------------------------------------
 bin/templates/project/AndroidManifest.xml       |   18 +-
 framework/AndroidManifest.xml                   |    4 -
 framework/assets/www/cordova.js                 | 5357 ++----------------
 framework/res/xml/config.xml                    |   57 -
 .../src/org/apache/cordova/AccelListener.java   |  285 -
 framework/src/org/apache/cordova/App.java       |  221 -
 .../src/org/apache/cordova/AudioHandler.java    |  357 --
 .../src/org/apache/cordova/AudioPlayer.java     |  553 --
 .../src/org/apache/cordova/BatteryListener.java |  163 -
 .../src/org/apache/cordova/CameraLauncher.java  |  807 ---
 framework/src/org/apache/cordova/Capture.java   |  445 --
 .../src/org/apache/cordova/CompassListener.java |  295 -
 .../src/org/apache/cordova/ContactAccessor.java |  198 -
 .../org/apache/cordova/ContactAccessorSdk5.java | 2174 -------
 .../src/org/apache/cordova/ContactManager.java  |  122 -
 .../apache/cordova/CordovaLocationListener.java |  251 -
 framework/src/org/apache/cordova/Device.java    |  199 -
 .../org/apache/cordova/DirectoryManager.java    |    8 +-
 framework/src/org/apache/cordova/Echo.java      |   48 -
 .../org/apache/cordova/FileProgressResult.java  |   63 -
 .../src/org/apache/cordova/FileTransfer.java    |  923 ---
 .../org/apache/cordova/FileUploadResult.java    |   73 -
 framework/src/org/apache/cordova/FileUtils.java | 1065 ----
 .../src/org/apache/cordova/GPSListener.java     |   50 -
 framework/src/org/apache/cordova/GeoBroker.java |  206 -
 .../src/org/apache/cordova/Globalization.java   |  578 --
 .../org/apache/cordova/GlobalizationError.java  |  108 -
 .../src/org/apache/cordova/HttpHandler.java     |   86 -
 .../src/org/apache/cordova/InAppBrowser.java    |  835 ---
 .../src/org/apache/cordova/NetworkListener.java |   32 -
 .../src/org/apache/cordova/NetworkManager.java  |  248 -
 .../src/org/apache/cordova/Notification.java    |  448 --
 .../src/org/apache/cordova/SplashScreen.java    |   43 -
 framework/src/org/apache/cordova/Storage.java   |  244 -
 34 files changed, 507 insertions(+), 16057 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/a97487bc/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --cc framework/assets/www/cordova.js
index b072c81,33cc366..a7a1b38
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@@ -1,5 -1,5 +1,5 @@@
  // Platform: android
- // 2.9.0rc1-0-g002f33d
 -// 2.7.0rc1-120-g8731b31
++// 2.7.0rc1-154-g98a62ff
  /*
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
@@@ -19,7 -19,7 +19,7 @@@
   under the License.
  */
  ;(function() {
- var CORDOVA_JS_BUILD_LABEL = '2.9.0rc1-0-g002f33d';
 -var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-120-g8731b31';
++var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-154-g98a62ff';
  // file: lib/scripts/require.js
  
  var require,
@@@ -376,7 -376,7 +376,7 @@@ function checkArgs(spec, functionName, 
      if (errMsg) {
          errMsg += ', but got ' + typeName + '.';
          errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
--        // Don't log when running jake test.
++        // Don't log when running unit tests.
          if (typeof jasmine == 'undefined') {
              console.error(errMsg);
          }
@@@ -6782,6 -2427,6 +2427,8 @@@ window.cordova = require('cordova')
  
  // file: lib/scripts/bootstrap-android.js
  
++// Tell the native code that a page change has occurred.
++require('cordova/exec')(null, null, 'PluginManager', 'startup', []);
  require('cordova/channel').onNativeReady.fire();
  
  // file: lib/scripts/plugin_loader.js


[31/50] [abbrv] android commit: CB-3854: Added support for wildcard. This probably could be improved, but it does work

Posted by ag...@apache.org.
CB-3854: Added support for wildcard.  This probably could be improved, but it does work


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/f1b377bf
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/f1b377bf
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/f1b377bf

Branch: refs/heads/2.9.x
Commit: f1b377bf070099c3e437fd9a2e2d516d6bfea42b
Parents: 3ace934
Author: Joe Bowser <bo...@apache.org>
Authored: Thu Jun 20 16:32:18 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Thu Jun 20 16:32:18 2013 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/Config.java | 25 ++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/f1b377bf/framework/src/org/apache/cordova/Config.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/Config.java b/framework/src/org/apache/cordova/Config.java
index c2ced34..a10ed81 100644
--- a/framework/src/org/apache/cordova/Config.java
+++ b/framework/src/org/apache/cordova/Config.java
@@ -203,6 +203,20 @@ public class Config {
         self._addWhiteListEntry(origin, subdomains);
     }
 
+    /*
+     * Trying to figure out how to match * is a pain
+     * So, we don't use a regex here
+     */
+    
+    private boolean originHasWildcard(String origin){
+        //First, check for a protocol, then split it if it has one.
+        if(origin.contains("//"))
+        {
+            origin = origin.split("//")[1];
+        }
+        origin.matches("\\*\\.[a-z]+\\.[a-z]+");
+        return origin.startsWith("*");
+    }
 
     private void _addWhiteListEntry(String origin, boolean subdomains) {
         try {
@@ -210,8 +224,16 @@ public class Config {
             if (origin.compareTo("*") == 0) {
                 LOG.d(TAG, "Unlimited access to network resources");
                 this.whiteList.add(Pattern.compile(".*"));
-            } else { // specific access
+            }
+            else { // specific access
                 // check if subdomains should be included
+                if(originHasWildcard(origin))
+                {
+                    subdomains = true;
+                    //Remove the wildcard so this works properly
+                    origin = origin.replace("*.", "");
+                }
+                
                 // TODO: we should not add more domains if * has already been added
                 Pattern schemeRegex = Pattern.compile("^[a-z-]+://");
                 Matcher matcher = schemeRegex.matcher(origin);
@@ -250,6 +272,7 @@ public class Config {
         }
     }
 
+
     /**
      * Determine if URL is in approved list of URLs to load.
      *


[30/50] [abbrv] android commit: Update JS snapshot to version 2.9.0rc1 (via coho)

Posted by ag...@apache.org.
Update JS snapshot to version 2.9.0rc1 (via coho)


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/03c5208d
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/03c5208d
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/03c5208d

Branch: refs/heads/2.9.x
Commit: 03c5208d472a066382b8ec8c885f200e35f02c4c
Parents: 3ace934
Author: Andrew Grieve <ag...@chromium.org>
Authored: Thu Jun 20 15:21:58 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Jun 20 15:21:58 2013 -0400

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 129 ++++++++++++++++++++++++++---------
 1 file changed, 97 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/03c5208d/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index e638234..b072c81 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-75-g76065a1
+// 2.9.0rc1-0-g002f33d
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-75-g76065a1';
+var CORDOVA_JS_BUILD_LABEL = '2.9.0rc1-0-g002f33d';
 // file: lib/scripts/require.js
 
 var require,
@@ -2396,11 +2396,7 @@ function initRead(reader, file) {
     reader._error = null;
     reader._readyState = FileReader.LOADING;
 
-    if (typeof file == 'string') {
-        // Deprecated in Cordova 2.4.
-        console.warn('Using a string argument with FileReader.readAs functions is deprecated.');
-        reader._fileName = file;
-    } else if (typeof file.fullPath == 'string') {
+    if (typeof file.fullPath == 'string') {
         reader._fileName = file.fullPath;
     } else {
         reader._fileName = '';
@@ -3063,9 +3059,31 @@ FileWriter.prototype.abort = function() {
 /**
  * Writes data to the file
  *
- * @param text to be written
+ * @param data text or blob to be written
  */
-FileWriter.prototype.write = function(text) {
+FileWriter.prototype.write = function(data) {
+
+    var isBinary = false;
+
+    // If we don't have Blob or ArrayBuffer support, don't bother.
+    if (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined') {
+
+        // Check to see if the incoming data is a blob
+        if (data instanceof Blob) {
+            var that=this;
+            var fileReader = new FileReader();
+            fileReader.onload = function() {
+                // Call this method again, with the arraybuffer as argument
+                FileWriter.prototype.write.call(that, this.result);
+            };
+            fileReader.readAsArrayBuffer(data);
+            return;
+        }
+
+        // Mark data type for safer transport over the binary bridge
+        isBinary = (data instanceof ArrayBuffer);
+    }
+
     // Throw an exception if we are already writing a file
     if (this.readyState === FileWriter.WRITING) {
         throw new FileError(FileError.INVALID_STATE_ERR);
@@ -3131,7 +3149,7 @@ FileWriter.prototype.write = function(text) {
             if (typeof me.onwriteend === "function") {
                 me.onwriteend(new ProgressEvent("writeend", {"target":me}));
             }
-        }, "File", "write", [this.fileName, text, this.position]);
+        }, "File", "write", [this.fileName, data, this.position, isBinary]);
 };
 
 /**
@@ -3317,6 +3335,9 @@ InAppBrowser.prototype = {
     close: function (eventname) {
         exec(null, null, "InAppBrowser", "close", []);
     },
+    show: function (eventname) {
+      exec(null, null, "InAppBrowser", "show", []);
+    },
     addEventListener: function (eventname,f) {
         if (eventname in this.channels) {
             this.channels[eventname].subscribe(f);
@@ -6780,11 +6801,21 @@ require('cordova/channel').onNativeReady.fire();
         }
     }
 
+    function scriptErrorCallback(err) {
+        // Open Question: If a script path specified in cordova_plugins.js does not exist, do we fail for all?
+        // this is currently just continuing.
+        scriptCounter--;
+        if (scriptCounter === 0) {
+            onScriptLoadingComplete && onScriptLoadingComplete();
+        }
+    }
+
     // Helper function to inject a <script> tag.
     function injectScript(path) {
         scriptCounter++;
         var script = document.createElement("script");
         script.onload = scriptLoadedCallback;
+        script.onerror = scriptErrorCallback;
         script.src = path;
         document.head.appendChild(script);
     }
@@ -6796,10 +6827,10 @@ require('cordova/channel').onNativeReady.fire();
         context.cordova.require('cordova/channel').onPluginsReady.fire();
     }
 
-    // Handler for the cordova_plugins.json content.
+    // Handler for the cordova_plugins.js content.
     // See plugman's plugin_loader.js for the details of this object.
     // This function is only called if the really is a plugins array that isn't empty.
-    // Otherwise the XHR response handler will just call finishPluginLoading().
+    // Otherwise the onerror response handler will just call finishPluginLoading().
     function handlePluginsObject(modules, path) {
         // First create the callback for when all plugins are loaded.
         var mapper = context.cordova.require('cordova/modulemapper');
@@ -6807,26 +6838,31 @@ require('cordova/channel').onNativeReady.fire();
             // Loop through all the plugins and then through their clobbers and merges.
             for (var i = 0; i < modules.length; i++) {
                 var module = modules[i];
-                if (!module) continue;
-
-                if (module.clobbers && module.clobbers.length) {
-                    for (var j = 0; j < module.clobbers.length; j++) {
-                        mapper.clobbers(module.id, module.clobbers[j]);
+                if (module) {
+                    try { 
+                        if (module.clobbers && module.clobbers.length) {
+                            for (var j = 0; j < module.clobbers.length; j++) {
+                                mapper.clobbers(module.id, module.clobbers[j]);
+                            }
+                        }
+
+                        if (module.merges && module.merges.length) {
+                            for (var k = 0; k < module.merges.length; k++) {
+                                mapper.merges(module.id, module.merges[k]);
+                            }
+                        }
+
+                        // Finally, if runs is truthy we want to simply require() the module.
+                        // This can be skipped if it had any merges or clobbers, though,
+                        // since the mapper will already have required the module.
+                        if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) {
+                            context.cordova.require(module.id);
+                        }
                     }
-                }
-
-                if (module.merges && module.merges.length) {
-                    for (var k = 0; k < module.merges.length; k++) {
-                        mapper.merges(module.id, module.merges[k]);
+                    catch(err) {
+                        // error with module, most likely clobbers, should we continue?
                     }
                 }
-
-                // Finally, if runs is truthy we want to simply require() the module.
-                // This can be skipped if it had any merges or clobbers, though,
-                // since the mapper will already have required the module.
-                if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) {
-                    context.cordova.require(module.id);
-                }
             }
 
             finishPluginLoading();
@@ -6849,6 +6885,33 @@ require('cordova/channel').onNativeReady.fire();
             break;
         }
     }
+
+    var plugins_json = path + 'cordova_plugins.json';
+    var plugins_js = path + 'cordova_plugins.js';
+
+    // One some phones (Windows) this xhr.open throws an Access Denied exception
+    // So lets keep trying, but with a script tag injection technique instead of XHR
+    var injectPluginScript = function injectPluginScript() {
+        try {
+            var script = document.createElement("script");
+            script.onload = function(){
+                var list = cordova.require("cordova/plugin_list");
+                handlePluginsObject(list,path);
+            };
+            script.onerror = function() {
+                // Error loading cordova_plugins.js, file not found or something
+                // this is an acceptable error, pre-3.0.0, so we just move on.
+                finishPluginLoading();
+            };
+            script.src = plugins_js;
+            document.head.appendChild(script);
+
+        } catch(err){
+            finishPluginLoading();
+        }
+    } 
+
+
     // Try to XHR the cordova_plugins.json file asynchronously.
     var xhr = new XMLHttpRequest();
     xhr.onload = function() {
@@ -6867,14 +6930,16 @@ require('cordova/channel').onNativeReady.fire();
         }
     };
     xhr.onerror = function() {
-        finishPluginLoading();
+        // In this case, the json file was not present, but XHR was allowed, 
+        // so we should still try the script injection technique with the js file
+        // in case that is there.
+        injectPluginScript();
     };
-    var plugins_json = path + 'cordova_plugins.json';
     try { // we commented we were going to try, so let us actually try and catch
         xhr.open('GET', plugins_json, true); // Async
         xhr.send();
     } catch(err){
-        finishPluginLoading();
+        injectPluginScript();
     }
 }(window));
 


[04/50] [abbrv] android commit: removed inappbrowser from cordovajs

Posted by ag...@apache.org.
removed inappbrowser from cordovajs


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/dfd668d1
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/dfd668d1
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/dfd668d1

Branch: refs/heads/master
Commit: dfd668d1455084088924531f3fa5e4f6b4dae76e
Parents: dbc6dd7
Author: Steven Gill <st...@gmail.com>
Authored: Mon May 20 15:01:50 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Mon May 20 15:01:50 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 144 ++++++++++++++---------------------
 1 file changed, 56 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/dfd668d1/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 80bfa16..4650ab2 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-79-g8ac64ca
+// 2.7.0rc1-80-geda98d1
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-79-g8ac64ca';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-80-geda98d1';
 // file: lib/scripts/require.js
 
 var require,
@@ -1725,6 +1725,60 @@ module.exports = ContactOrganization;
 
 });
 
+// file: lib/common/plugin/Coordinates.js
+define("cordova/plugin/Coordinates", function(require, exports, module) {
+
+/**
+ * This class contains position information.
+ * @param {Object} lat
+ * @param {Object} lng
+ * @param {Object} alt
+ * @param {Object} acc
+ * @param {Object} head
+ * @param {Object} vel
+ * @param {Object} altacc
+ * @constructor
+ */
+var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
+    /**
+     * The latitude of the position.
+     */
+    this.latitude = lat;
+    /**
+     * The longitude of the position,
+     */
+    this.longitude = lng;
+    /**
+     * The accuracy of the position.
+     */
+    this.accuracy = acc;
+    /**
+     * The altitude of the position.
+     */
+    this.altitude = (alt !== undefined ? alt : null);
+    /**
+     * The direction the device is moving at the position.
+     */
+    this.heading = (head !== undefined ? head : null);
+    /**
+     * The velocity with which the device is moving at the position.
+     */
+    this.speed = (vel !== undefined ? vel : null);
+
+    if (this.speed === 0 || this.speed === null) {
+        this.heading = NaN;
+    }
+
+    /**
+     * The altitude accuracy of the position.
+     */
+    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
+};
+
+module.exports = Coordinates;
+
+});
+
 // file: lib/common/plugin/DirectoryEntry.js
 define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
 
@@ -3191,82 +3245,6 @@ module.exports = GlobalizationError;
 
 });
 
-// file: lib/common/plugin/InAppBrowser.js
-define("cordova/plugin/InAppBrowser", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-var channel = require('cordova/channel');
-var modulemapper = require('cordova/modulemapper');
-
-function InAppBrowser() {
-   this.channels = {
-        'loadstart': channel.create('loadstart'),
-        'loadstop' : channel.create('loadstop'),
-        'loaderror' : channel.create('loaderror'),
-        'exit' : channel.create('exit')
-   };
-}
-
-InAppBrowser.prototype = {
-    _eventHandler: function (event) {
-        if (event.type in this.channels) {
-            this.channels[event.type].fire(event);
-        }
-    },
-    close: function (eventname) {
-        exec(null, null, "InAppBrowser", "close", []);
-    },
-    addEventListener: function (eventname,f) {
-        if (eventname in this.channels) {
-            this.channels[eventname].subscribe(f);
-        }
-    },
-    removeEventListener: function(eventname, f) {
-        if (eventname in this.channels) {
-            this.channels[eventname].unsubscribe(f);
-        }
-    },
-
-    executeScript: function(injectDetails, cb) {
-        if (injectDetails.code) {
-            exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
-        } else if (injectDetails.file) {
-            exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
-        } else {
-            throw new Error('executeScript requires exactly one of code or file to be specified');
-        }
-    },
-
-    insertCSS: function(injectDetails, cb) {
-        if (injectDetails.code) {
-            exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
-        } else if (injectDetails.file) {
-            exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
-        } else {
-            throw new Error('insertCSS requires exactly one of code or file to be specified');
-        }
-    }
-};
-
-module.exports = function(strUrl, strWindowName, strWindowFeatures) {
-    var iab = new InAppBrowser();
-    var cb = function(eventname) {
-       iab._eventHandler(eventname);
-    };
-
-    // Don't catch calls that write to existing frames (e.g. named iframes).
-    if (window.frames && window.frames[strWindowName]) {
-        var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
-        return origOpenFunc.apply(window, arguments);
-    }
-
-    exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
-    return iab;
-};
-
-
-});
-
 // file: lib/common/plugin/LocalFileSystem.js
 define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
 
@@ -5132,16 +5110,6 @@ modulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError')
 
 });
 
-// file: lib/android/plugin/inappbrowser/symbols.js
-define("cordova/plugin/inappbrowser/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/InAppBrowser', 'open');
-
-});
-
 // file: lib/common/plugin/logger.js
 define("cordova/plugin/logger", function(require, exports, module) {
 


[19/50] [abbrv] android commit: Axed all permissions from template manifest except for INTERNET. Bumped minSDkVersion to 10.

Posted by ag...@apache.org.
Axed all permissions from template manifest except for INTERNET. Bumped minSDkVersion to 10.


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/5ee17878
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/5ee17878
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/5ee17878

Branch: refs/heads/master
Commit: 5ee178789f8d937d011e2975c4c5bac178e0b9d0
Parents: d845736
Author: Fil Maj <ma...@gmail.com>
Authored: Mon Jun 17 11:23:17 2013 -0700
Committer: Fil Maj <ma...@gmail.com>
Committed: Mon Jun 17 11:23:17 2013 -0700

----------------------------------------------------------------------
 bin/templates/project/AndroidManifest.xml | 18 +-----------------
 1 file changed, 1 insertion(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/5ee17878/bin/templates/project/AndroidManifest.xml
----------------------------------------------------------------------
diff --git a/bin/templates/project/AndroidManifest.xml b/bin/templates/project/AndroidManifest.xml
index 4a3dcb5..f374a2e 100644
--- a/bin/templates/project/AndroidManifest.xml
+++ b/bin/templates/project/AndroidManifest.xml
@@ -28,23 +28,7 @@
         android:anyDensity="true"
         />
 
-    <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.VIBRATE" />
-    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
     <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.RECEIVE_SMS" />
-    <uses-permission android:name="android.permission.RECORD_AUDIO" />
-    <uses-permission android:name="android.permission.RECORD_VIDEO"/>
-    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
-    <uses-permission android:name="android.permission.READ_CONTACTS" />
-    <uses-permission android:name="android.permission.WRITE_CONTACTS" />   
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
-    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
-
 
     <application android:icon="@drawable/icon" android:label="@string/app_name"
         android:hardwareAccelerated="true"
@@ -59,5 +43,5 @@
         </activity>
     </application>
 
-    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="__APILEVEL__"/>
+    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="__APILEVEL__"/>
 </manifest> 


[39/50] [abbrv] android commit: CB-3949: Adding code to mitigate broken intents with the application installer

Posted by ag...@apache.org.
CB-3949: Adding code to mitigate broken intents with the application installer


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/b83610a6
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/b83610a6
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/b83610a6

Branch: refs/heads/2.9.x
Commit: b83610a6534d556c0378c634195197112baddcdd
Parents: b032dcc
Author: Joe Bowser <bo...@apache.org>
Authored: Mon Jun 24 11:31:32 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Mon Jun 24 11:31:32 2013 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/CordovaActivity.java | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/b83610a6/framework/src/org/apache/cordova/CordovaActivity.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaActivity.java b/framework/src/org/apache/cordova/CordovaActivity.java
index 1b7ff5a..a68e546 100755
--- a/framework/src/org/apache/cordova/CordovaActivity.java
+++ b/framework/src/org/apache/cordova/CordovaActivity.java
@@ -250,6 +250,19 @@ public class CordovaActivity extends Activity implements CordovaInterface {
         }
     }
 
+    //CB-3949: Workaround for weird Android Launcher Bug!
+    private void checkIntents()
+    {
+        Intent intent = getIntent();
+        String intentAction = intent.getAction();
+        if (!isTaskRoot() && intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null) {
+            if(intentAction.equals(Intent.ACTION_MAIN)) {
+                Log.d("Cordova", "This isn't the root activity. Clearing it and returning to the root activity.");
+                finish();
+                return;
+            }
+        }
+    }
     /**
      * Called when the activity is first created.
      *
@@ -258,6 +271,7 @@ public class CordovaActivity extends Activity implements CordovaInterface {
     @SuppressWarnings("deprecation")
     @Override
     public void onCreate(Bundle savedInstanceState) {
+        checkIntents();
         Config.init(this);
         LOG.d(TAG, "CordovaActivity.onCreate()");
         super.onCreate(savedInstanceState);


[07/50] [abbrv] android commit: removed contact code from js

Posted by ag...@apache.org.
removed contact code from js


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/75f358d0
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/75f358d0
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/75f358d0

Branch: refs/heads/master
Commit: 75f358d01e5053d695d21803d53129dd26b2729a
Parents: f7c97cb
Author: Steven Gill <st...@gmail.com>
Authored: Wed May 22 17:12:13 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Wed May 22 17:12:13 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 398 +----------------------------------
 1 file changed, 2 insertions(+), 396 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/75f358d0/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 53fa353..cf7ca8f 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-82-g32587e6
+// 2.7.0rc1-83-g658fd32
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-82-g32587e6';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-83-g658fd32';
 // file: lib/scripts/require.js
 
 var require,
@@ -1409,322 +1409,6 @@ module.exports = {
 
 });
 
-// file: lib/common/plugin/Contact.js
-define("cordova/plugin/Contact", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    ContactError = require('cordova/plugin/ContactError'),
-    utils = require('cordova/utils');
-
-/**
-* Converts primitives into Complex Object
-* Currently only used for Date fields
-*/
-function convertIn(contact) {
-    var value = contact.birthday;
-    try {
-      contact.birthday = new Date(parseFloat(value));
-    } catch (exception){
-      console.log("Cordova Contact convertIn error: exception creating date.");
-    }
-    return contact;
-}
-
-/**
-* Converts Complex objects into primitives
-* Only conversion at present is for Dates.
-**/
-
-function convertOut(contact) {
-    var value = contact.birthday;
-    if (value !== null) {
-        // try to make it a Date object if it is not already
-        if (!utils.isDate(value)){
-            try {
-                value = new Date(value);
-            } catch(exception){
-                value = null;
-            }
-        }
-        if (utils.isDate(value)){
-            value = value.valueOf(); // convert to milliseconds
-        }
-        contact.birthday = value;
-    }
-    return contact;
-}
-
-/**
-* Contains information about a single contact.
-* @constructor
-* @param {DOMString} id unique identifier
-* @param {DOMString} displayName
-* @param {ContactName} name
-* @param {DOMString} nickname
-* @param {Array.<ContactField>} phoneNumbers array of phone numbers
-* @param {Array.<ContactField>} emails array of email addresses
-* @param {Array.<ContactAddress>} addresses array of addresses
-* @param {Array.<ContactField>} ims instant messaging user ids
-* @param {Array.<ContactOrganization>} organizations
-* @param {DOMString} birthday contact's birthday
-* @param {DOMString} note user notes about contact
-* @param {Array.<ContactField>} photos
-* @param {Array.<ContactField>} categories
-* @param {Array.<ContactField>} urls contact's web sites
-*/
-var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
-    ims, organizations, birthday, note, photos, categories, urls) {
-    this.id = id || null;
-    this.rawId = null;
-    this.displayName = displayName || null;
-    this.name = name || null; // ContactName
-    this.nickname = nickname || null;
-    this.phoneNumbers = phoneNumbers || null; // ContactField[]
-    this.emails = emails || null; // ContactField[]
-    this.addresses = addresses || null; // ContactAddress[]
-    this.ims = ims || null; // ContactField[]
-    this.organizations = organizations || null; // ContactOrganization[]
-    this.birthday = birthday || null;
-    this.note = note || null;
-    this.photos = photos || null; // ContactField[]
-    this.categories = categories || null; // ContactField[]
-    this.urls = urls || null; // ContactField[]
-};
-
-/**
-* Removes contact from device storage.
-* @param successCB success callback
-* @param errorCB error callback
-*/
-Contact.prototype.remove = function(successCB, errorCB) {
-    argscheck.checkArgs('FF', 'Contact.remove', arguments);
-    var fail = errorCB && function(code) {
-        errorCB(new ContactError(code));
-    };
-    if (this.id === null) {
-        fail(ContactError.UNKNOWN_ERROR);
-    }
-    else {
-        exec(successCB, fail, "Contacts", "remove", [this.id]);
-    }
-};
-
-/**
-* Creates a deep copy of this Contact.
-* With the contact ID set to null.
-* @return copy of this Contact
-*/
-Contact.prototype.clone = function() {
-    var clonedContact = utils.clone(this);
-    clonedContact.id = null;
-    clonedContact.rawId = null;
-
-    function nullIds(arr) {
-        if (arr) {
-            for (var i = 0; i < arr.length; ++i) {
-                arr[i].id = null;
-            }
-        }
-    }
-
-    // Loop through and clear out any id's in phones, emails, etc.
-    nullIds(clonedContact.phoneNumbers);
-    nullIds(clonedContact.emails);
-    nullIds(clonedContact.addresses);
-    nullIds(clonedContact.ims);
-    nullIds(clonedContact.organizations);
-    nullIds(clonedContact.categories);
-    nullIds(clonedContact.photos);
-    nullIds(clonedContact.urls);
-    return clonedContact;
-};
-
-/**
-* Persists contact to device storage.
-* @param successCB success callback
-* @param errorCB error callback
-*/
-Contact.prototype.save = function(successCB, errorCB) {
-    argscheck.checkArgs('FFO', 'Contact.save', arguments);
-    var fail = errorCB && function(code) {
-        errorCB(new ContactError(code));
-    };
-    var success = function(result) {
-        if (result) {
-            if (successCB) {
-                var fullContact = require('cordova/plugin/contacts').create(result);
-                successCB(convertIn(fullContact));
-            }
-        }
-        else {
-            // no Entry object returned
-            fail(ContactError.UNKNOWN_ERROR);
-        }
-    };
-    var dupContact = convertOut(utils.clone(this));
-    exec(success, fail, "Contacts", "save", [dupContact]);
-};
-
-
-module.exports = Contact;
-
-});
-
-// file: lib/common/plugin/ContactAddress.js
-define("cordova/plugin/ContactAddress", function(require, exports, module) {
-
-/**
-* Contact address.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code
-* @param formatted // NOTE: not a W3C standard
-* @param streetAddress
-* @param locality
-* @param region
-* @param postalCode
-* @param country
-*/
-
-var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
-    this.id = null;
-    this.pref = (typeof pref != 'undefined' ? pref : false);
-    this.type = type || null;
-    this.formatted = formatted || null;
-    this.streetAddress = streetAddress || null;
-    this.locality = locality || null;
-    this.region = region || null;
-    this.postalCode = postalCode || null;
-    this.country = country || null;
-};
-
-module.exports = ContactAddress;
-
-});
-
-// file: lib/common/plugin/ContactError.js
-define("cordova/plugin/ContactError", function(require, exports, module) {
-
-/**
- *  ContactError.
- *  An error code assigned by an implementation when an error has occurred
- * @constructor
- */
-var ContactError = function(err) {
-    this.code = (typeof err != 'undefined' ? err : null);
-};
-
-/**
- * Error codes
- */
-ContactError.UNKNOWN_ERROR = 0;
-ContactError.INVALID_ARGUMENT_ERROR = 1;
-ContactError.TIMEOUT_ERROR = 2;
-ContactError.PENDING_OPERATION_ERROR = 3;
-ContactError.IO_ERROR = 4;
-ContactError.NOT_SUPPORTED_ERROR = 5;
-ContactError.PERMISSION_DENIED_ERROR = 20;
-
-module.exports = ContactError;
-
-});
-
-// file: lib/common/plugin/ContactField.js
-define("cordova/plugin/ContactField", function(require, exports, module) {
-
-/**
-* Generic contact field.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
-* @param type
-* @param value
-* @param pref
-*/
-var ContactField = function(type, value, pref) {
-    this.id = null;
-    this.type = (type && type.toString()) || null;
-    this.value = (value && value.toString()) || null;
-    this.pref = (typeof pref != 'undefined' ? pref : false);
-};
-
-module.exports = ContactField;
-
-});
-
-// file: lib/common/plugin/ContactFindOptions.js
-define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
-
-/**
- * ContactFindOptions.
- * @constructor
- * @param filter used to match contacts against
- * @param multiple boolean used to determine if more than one contact should be returned
- */
-
-var ContactFindOptions = function(filter, multiple) {
-    this.filter = filter || '';
-    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
-};
-
-module.exports = ContactFindOptions;
-
-});
-
-// file: lib/common/plugin/ContactName.js
-define("cordova/plugin/ContactName", function(require, exports, module) {
-
-/**
-* Contact name.
-* @constructor
-* @param formatted // NOTE: not part of W3C standard
-* @param familyName
-* @param givenName
-* @param middle
-* @param prefix
-* @param suffix
-*/
-var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
-    this.formatted = formatted || null;
-    this.familyName = familyName || null;
-    this.givenName = givenName || null;
-    this.middleName = middle || null;
-    this.honorificPrefix = prefix || null;
-    this.honorificSuffix = suffix || null;
-};
-
-module.exports = ContactName;
-
-});
-
-// file: lib/common/plugin/ContactOrganization.js
-define("cordova/plugin/ContactOrganization", function(require, exports, module) {
-
-/**
-* Contact organization.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
-* @param name
-* @param dept
-* @param title
-* @param startDate
-* @param endDate
-* @param location
-* @param desc
-*/
-
-var ContactOrganization = function(pref, type, name, dept, title) {
-    this.id = null;
-    this.pref = (typeof pref != 'undefined' ? pref : false);
-    this.type = type || null;
-    this.name = name || null;
-    this.department = dept || null;
-    this.title = title || null;
-};
-
-module.exports = ContactOrganization;
-
-});
-
 // file: lib/common/plugin/Coordinates.js
 define("cordova/plugin/Coordinates", function(require, exports, module) {
 
@@ -4392,84 +4076,6 @@ for (var key in console) {
 
 });
 
-// file: lib/common/plugin/contacts.js
-define("cordova/plugin/contacts", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    ContactError = require('cordova/plugin/ContactError'),
-    utils = require('cordova/utils'),
-    Contact = require('cordova/plugin/Contact');
-
-/**
-* Represents a group of Contacts.
-* @constructor
-*/
-var contacts = {
-    /**
-     * Returns an array of Contacts matching the search criteria.
-     * @param fields that should be searched
-     * @param successCB success callback
-     * @param errorCB error callback
-     * @param {ContactFindOptions} options that can be applied to contact searching
-     * @return array of Contacts matching search criteria
-     */
-    find:function(fields, successCB, errorCB, options) {
-        argscheck.checkArgs('afFO', 'contacts.find', arguments);
-        if (!fields.length) {
-            errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
-        } else {
-            var win = function(result) {
-                var cs = [];
-                for (var i = 0, l = result.length; i < l; i++) {
-                    cs.push(contacts.create(result[i]));
-                }
-                successCB(cs);
-            };
-            exec(win, errorCB, "Contacts", "search", [fields, options]);
-        }
-    },
-
-    /**
-     * This function creates a new contact, but it does not persist the contact
-     * to device storage. To persist the contact to device storage, invoke
-     * contact.save().
-     * @param properties an object whose properties will be examined to create a new Contact
-     * @returns new Contact object
-     */
-    create:function(properties) {
-        argscheck.checkArgs('O', 'contacts.create', arguments);
-        var contact = new Contact();
-        for (var i in properties) {
-            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
-                contact[i] = properties[i];
-            }
-        }
-        return contact;
-    }
-};
-
-module.exports = contacts;
-
-});
-
-// file: lib/common/plugin/contacts/symbols.js
-define("cordova/plugin/contacts/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts');
-modulemapper.clobbers('cordova/plugin/Contact', 'Contact');
-modulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress');
-modulemapper.clobbers('cordova/plugin/ContactError', 'ContactError');
-modulemapper.clobbers('cordova/plugin/ContactField', 'ContactField');
-modulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions');
-modulemapper.clobbers('cordova/plugin/ContactName', 'ContactName');
-modulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization');
-
-});
-
 // file: lib/common/plugin/device.js
 define("cordova/plugin/device", function(require, exports, module) {
 


[20/50] [abbrv] android commit: updated cordova.js to remove dependency on network status plugin.

Posted by ag...@apache.org.
updated cordova.js to remove dependency on network status plugin.


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/2e5b6bce
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/2e5b6bce
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/2e5b6bce

Branch: refs/heads/master
Commit: 2e5b6bce556e4cefe666d5374f952891611e083e
Parents: 5ee1787
Author: Fil Maj <ma...@gmail.com>
Authored: Mon Jun 17 12:08:10 2013 -0700
Committer: Fil Maj <ma...@gmail.com>
Committed: Mon Jun 17 12:08:10 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 111 +----------------------------------
 1 file changed, 2 insertions(+), 109 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/2e5b6bce/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index f8667e5..1a29601 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-116-gf0108ae
+// 2.7.0rc1-117-g208b97a
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-116-gf0108ae';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-117-g208b97a';
 // file: lib/scripts/require.js
 
 var require,
@@ -731,9 +731,6 @@ channel.createSticky('onCordovaReady');
 // Event to indicate that device properties are available
 channel.createSticky('onCordovaInfoReady');
 
-// Event to indicate that the connection property has been set.
-channel.createSticky('onCordovaConnectionReady');
-
 // Event to indicate that all automatically loaded JS plugins are loaded and ready.
 channel.createSticky('onPluginsReady');
 
@@ -751,7 +748,6 @@ channel.createSticky('onDestroy');
 
 // Channels that must fire before "deviceready" is fired.
 channel.waitForInitialization('onCordovaReady');
-channel.waitForInitialization('onCordovaConnectionReady');
 channel.waitForInitialization('onDOMContentLoaded');
 
 module.exports = channel;
@@ -1254,25 +1250,6 @@ module.exports = ConfigurationData;
 
 });
 
-// file: lib/common/plugin/Connection.js
-define("cordova/plugin/Connection", function(require, exports, module) {
-
-/**
- * Network status
- */
-module.exports = {
-        UNKNOWN: "unknown",
-        ETHERNET: "ethernet",
-        WIFI: "wifi",
-        CELL_2G: "2g",
-        CELL_3G: "3g",
-        CELL_4G: "4g",
-        CELL:"cellular",
-        NONE: "none"
-};
-
-});
-
 // file: lib/common/plugin/DirectoryEntry.js
 define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
 
@@ -4361,90 +4338,6 @@ modulemapper.clobbers('cordova/plugin/MediaError', 'MediaError');
 
 });
 
-// file: lib/common/plugin/network.js
-define("cordova/plugin/network", function(require, exports, module) {
-
-var exec = require('cordova/exec'),
-    cordova = require('cordova'),
-    channel = require('cordova/channel'),
-    utils = require('cordova/utils');
-
-// Link the onLine property with the Cordova-supplied network info.
-// This works because we clobber the naviagtor object with our own
-// object in bootstrap.js.
-if (typeof navigator != 'undefined') {
-    utils.defineGetter(navigator, 'onLine', function() {
-        return this.connection.type != 'none';
-    });
-}
-
-function NetworkConnection() {
-    this.type = 'unknown';
-}
-
-/**
- * Get connection info
- *
- * @param {Function} successCallback The function to call when the Connection data is available
- * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)
- */
-NetworkConnection.prototype.getInfo = function(successCallback, errorCallback) {
-    exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
-};
-
-var me = new NetworkConnection();
-var timerId = null;
-var timeout = 500;
-
-channel.onCordovaReady.subscribe(function() {
-    me.getInfo(function(info) {
-        me.type = info;
-        if (info === "none") {
-            // set a timer if still offline at the end of timer send the offline event
-            timerId = setTimeout(function(){
-                cordova.fireDocumentEvent("offline");
-                timerId = null;
-            }, timeout);
-        } else {
-            // If there is a current offline event pending clear it
-            if (timerId !== null) {
-                clearTimeout(timerId);
-                timerId = null;
-            }
-            cordova.fireDocumentEvent("online");
-        }
-
-        // should only fire this once
-        if (channel.onCordovaConnectionReady.state !== 2) {
-            channel.onCordovaConnectionReady.fire();
-        }
-    },
-    function (e) {
-        // If we can't get the network info we should still tell Cordova
-        // to fire the deviceready event.
-        if (channel.onCordovaConnectionReady.state !== 2) {
-            channel.onCordovaConnectionReady.fire();
-        }
-        console.log("Error initializing Network Connection: " + e);
-    });
-});
-
-module.exports = me;
-
-});
-
-// file: lib/common/plugin/networkstatus/symbols.js
-define("cordova/plugin/networkstatus/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/network', 'navigator.network.connection', 'navigator.network.connection is deprecated. Use navigator.connection instead.');
-modulemapper.clobbers('cordova/plugin/network', 'navigator.connection');
-modulemapper.defaults('cordova/plugin/Connection', 'Connection');
-
-});
-
 // file: lib/common/plugin/requestFileSystem.js
 define("cordova/plugin/requestFileSystem", function(require, exports, module) {
 


[36/50] [abbrv] android commit: Accidentally commented "build" out when running ./run --emulator. Whoops D:

Posted by ag...@apache.org.
Accidentally commented "build" out when running ./run --emulator. Whoops D:


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/6fe66ad7
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/6fe66ad7
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/6fe66ad7

Branch: refs/heads/2.9.x
Commit: 6fe66ad79c35f9647ae1411cf128eaaa8bd1259b
Parents: 9946d15
Author: Fil Maj <ma...@gmail.com>
Authored: Fri Jun 21 14:23:40 2013 -0700
Committer: Fil Maj <ma...@gmail.com>
Committed: Fri Jun 21 14:23:40 2013 -0700

----------------------------------------------------------------------
 bin/templates/cordova/run | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/6fe66ad7/bin/templates/cordova/run
----------------------------------------------------------------------
diff --git a/bin/templates/cordova/run b/bin/templates/cordova/run
index 9641ab2..4772058 100755
--- a/bin/templates/cordova/run
+++ b/bin/templates/cordova/run
@@ -66,7 +66,7 @@ elif [[ "$#" -eq 1 ]] ; then
         $DIR/build
         $DIR/lib/install-device
     elif [[ $1 == "--emulator" ]] ; then
-        #$DIR/build
+        $DIR/build
         run_on_emulator
     elif [[ $1 =~ "--target=" ]]; then
         $DIR/build


[11/50] [abbrv] android commit: updated from master

Posted by ag...@apache.org.
updated from master


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/9aaa152b
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/9aaa152b
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/9aaa152b

Branch: refs/heads/master
Commit: 9aaa152b9abbb93ac4c6a18e7099c6dd3464c40a
Parents: a2b8ebf e52d4fc
Author: Steven Gill <st...@gmail.com>
Authored: Mon Jun 10 17:15:05 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Mon Jun 10 17:15:05 2013 -0700

----------------------------------------------------------------------
 .reviewboardrc                                  |    8 +
 README.md                                       |   51 +-
 bin/check_reqs.bat                              |   19 +-
 bin/create                                      |   11 +-
 bin/create.js                                   |   42 -
 bin/templates/cordova/build.bat                 |   18 +-
 bin/templates/cordova/clean.bat                 |   16 +
 bin/templates/cordova/cordova.bat               |    4 +-
 bin/templates/cordova/lib/install-device.bat    |   18 +-
 bin/templates/cordova/lib/install-emulator.bat  |   18 +-
 bin/templates/cordova/lib/list-devices.bat      |   18 +-
 .../cordova/lib/list-emulator-images.bat        |   18 +-
 .../cordova/lib/list-started-emulators.bat      |   18 +-
 bin/templates/cordova/lib/start-emulator.bat    |   18 +-
 bin/templates/cordova/log.bat                   |   16 +
 bin/templates/cordova/run.bat                   |   18 +-
 bin/templates/cordova/version                   |    2 +-
 bin/update                                      |   10 +-
 bin/update.js                                   |   42 -
 framework/.classpath                            |    1 -
 framework/assets/www/cordova.js                 | 1530 +++++++++++++++++-
 framework/build.xml                             |   16 -
 framework/res/xml/config.xml                    |   29 +-
 framework/src/org/apache/cordova/Config.java    |    5 +-
 .../src/org/apache/cordova/CordovaActivity.java |   45 +-
 .../org/apache/cordova/CordovaChromeClient.java |    3 +-
 .../src/org/apache/cordova/CordovaWebView.java  |    6 +-
 framework/src/org/apache/cordova/Device.java    |    2 +-
 .../src/org/apache/cordova/FileHelper.java      |   70 +-
 .../cordova/IceCreamCordovaWebViewClient.java   |   48 +-
 framework/src/org/apache/cordova/JSONUtils.java |   18 +
 .../org/apache/cordova/api/CallbackContext.java |   18 +
 .../apache/cordova/api/CordovaInterface.java    |    2 +-
 .../org/apache/cordova/api/CordovaPlugin.java   |   14 -
 .../org/apache/cordova/api/DataResource.java    |  141 --
 .../apache/cordova/api/DataResourceContext.java |   31 -
 .../org/apache/cordova/api/PluginManager.java   |   29 -
 test/README.md                                  |   20 +
 test/res/xml/config.xml                         |   18 +
 39 files changed, 1909 insertions(+), 502 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9aaa152b/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --cc framework/assets/www/cordova.js
index f3c20a7,3730047..aece2e6
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@@ -1,5 -1,5 +1,5 @@@
  // Platform: android
- // 2.7.0rc1-84-gdba3744
 -// 2.8.0rc1-0-g22bc4d8
++// 2.7.0rc1-84-g62c5786
  /*
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
@@@ -19,7 -19,7 +19,7 @@@
   under the License.
  */
  ;(function() {
- var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-84-gdba3744';
 -var CORDOVA_JS_BUILD_LABEL = '2.8.0rc1-0-g22bc4d8';
++var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-84-g62c5786';
  // file: lib/scripts/require.js
  
  var require,
@@@ -1897,11 -2396,11 +2396,7 @@@ function initRead(reader, file) 
      reader._error = null;
      reader._readyState = FileReader.LOADING;
  
--    if (typeof file == 'string') {
--        // Deprecated in Cordova 2.4.
--        console.warn('Using a string argument with FileReader.readAs functions is deprecated.');
--        reader._fileName = file;
--    } else if (typeof file.fullPath == 'string') {
++    if (typeof file.fullPath == 'string') {
          reader._fileName = file.fullPath;
      } else {
          reader._fileName = '';
@@@ -2793,6 -3292,82 +3288,85 @@@ module.exports = GlobalizationError
  
  });
  
+ // file: lib/common/plugin/InAppBrowser.js
+ define("cordova/plugin/InAppBrowser", function(require, exports, module) {
+ 
+ var exec = require('cordova/exec');
+ var channel = require('cordova/channel');
+ var modulemapper = require('cordova/modulemapper');
+ 
+ function InAppBrowser() {
+    this.channels = {
+         'loadstart': channel.create('loadstart'),
+         'loadstop' : channel.create('loadstop'),
+         'loaderror' : channel.create('loaderror'),
+         'exit' : channel.create('exit')
+    };
+ }
+ 
+ InAppBrowser.prototype = {
+     _eventHandler: function (event) {
+         if (event.type in this.channels) {
+             this.channels[event.type].fire(event);
+         }
+     },
+     close: function (eventname) {
+         exec(null, null, "InAppBrowser", "close", []);
+     },
++    show: function (eventname) {
++      exec(null, null, "InAppBrowser", "show", []);
++    },
+     addEventListener: function (eventname,f) {
+         if (eventname in this.channels) {
+             this.channels[eventname].subscribe(f);
+         }
+     },
+     removeEventListener: function(eventname, f) {
+         if (eventname in this.channels) {
+             this.channels[eventname].unsubscribe(f);
+         }
+     },
+ 
+     executeScript: function(injectDetails, cb) {
+         if (injectDetails.code) {
+             exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
+         } else if (injectDetails.file) {
+             exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
+         } else {
+             throw new Error('executeScript requires exactly one of code or file to be specified');
+         }
+     },
+ 
+     insertCSS: function(injectDetails, cb) {
+         if (injectDetails.code) {
+             exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
+         } else if (injectDetails.file) {
+             exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
+         } else {
+             throw new Error('insertCSS requires exactly one of code or file to be specified');
+         }
+     }
+ };
+ 
+ module.exports = function(strUrl, strWindowName, strWindowFeatures) {
+     var iab = new InAppBrowser();
+     var cb = function(eventname) {
+        iab._eventHandler(eventname);
+     };
+ 
+     // Don't catch calls that write to existing frames (e.g. named iframes).
+     if (window.frames && window.frames[strWindowName]) {
+         var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
+         return origOpenFunc.apply(window, arguments);
+     }
+ 
+     exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
+     return iab;
+ };
+ 
+ 
+ });
+ 
  // file: lib/common/plugin/LocalFileSystem.js
  define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
  
@@@ -3289,6 -4071,6 +4070,10 @@@ module.exports = 
  // file: lib/android/plugin/android/nativeapiprovider.js
  define("cordova/plugin/android/nativeapiprovider", function(require, exports, module) {
  
++/**
++ * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi.
++ */
++
  var nativeApi = this._cordovaNative || require('cordova/plugin/android/promptbasednativeapi');
  var currentApi = nativeApi;
  
@@@ -3308,6 -4149,6 +4152,11 @@@ module.exports = 
  // file: lib/android/plugin/android/promptbasednativeapi.js
  define("cordova/plugin/android/promptbasednativeapi", function(require, exports, module) {
  
++/**
++ * Implements the API of ExposedJsApi.java, but uses prompt() to communicate.
++ * This is used only on the 2.3 simulator, where addJavascriptInterface() is broken.
++ */
++
  module.exports = {
      exec: function(service, action, callbackId, argsJson) {
          return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId]));
@@@ -3948,7 -5072,7 +5080,6 @@@ function Device() 
      this.available = false;
      this.platform = null;
      this.version = null;
--    this.name = null;
      this.uuid = null;
      this.cordova = null;
      this.model = null;
@@@ -3964,7 -5088,7 +5095,6 @@@
              me.available = true;
              me.platform = info.platform;
              me.version = info.version;
--            me.name = info.name;
              me.uuid = info.uuid;
              me.cordova = buildLabel;
              me.model = info.model;
@@@ -5191,6 -6676,6 +6682,11 @@@ window.cordova = require('cordova')
  // file: lib/scripts/bootstrap.js
  
  (function (context) {
++    if (context._cordovaJsLoaded) {
++        throw new Error('cordova.js included multiple times.');
++    }
++    context._cordovaJsLoaded = true;
++
      var channel = require('cordova/channel');
      var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];
  

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9aaa152b/framework/res/xml/config.xml
----------------------------------------------------------------------


[38/50] [abbrv] android commit: [CB-3927] Fix start-up race condition that could cause exec() responses to be dropped.

Posted by ag...@apache.org.
[CB-3927] Fix start-up race condition that could cause exec() responses to be dropped.

Requires a change to the JS as well.
(cherry picked from commit 9cb14838e8554ed2d28d317b37f76685fa76432e)


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/16e08384
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/16e08384
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/16e08384

Branch: refs/heads/master
Commit: 16e08384c084db071193dffb8f1761b7f0c1cdb8
Parents: f78b444
Author: Jeffrey Willms <jb...@google.com>
Authored: Fri Jun 21 18:30:50 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Fri Jun 21 18:31:57 2013 -0400

----------------------------------------------------------------------
 .../src/org/apache/cordova/api/PluginEntry.java | 13 ++++++
 .../org/apache/cordova/api/PluginManager.java   | 49 +++++++++++++++++++-
 2 files changed, 60 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/16e08384/framework/src/org/apache/cordova/api/PluginEntry.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/PluginEntry.java b/framework/src/org/apache/cordova/api/PluginEntry.java
index 9b9af6b..f66dcda 100755
--- a/framework/src/org/apache/cordova/api/PluginEntry.java
+++ b/framework/src/org/apache/cordova/api/PluginEntry.java
@@ -64,6 +64,19 @@ public class PluginEntry {
     }
 
     /**
+     * Alternate constructor
+     *
+     * @param service               The name of the service
+     * @param plugin                The plugin associated with this entry
+     */
+    public PluginEntry(String service, CordovaPlugin plugin) {
+        this.service = service;
+        this.plugin = plugin;
+        this.pluginClass = plugin.getClass().getName();
+        this.onload = false;
+    }
+
+    /**
      * Create plugin object.
      * If plugin is already created, then just return it.
      *

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/16e08384/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 e8e92f8..e565c4f 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -22,7 +22,9 @@ 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.json.JSONException;
 import org.xmlpull.v1.XmlPullParserException;
@@ -55,6 +57,8 @@ public class PluginManager {
     // 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.
      *
@@ -65,6 +69,7 @@ public class PluginManager {
         this.ctx = ctx;
         this.app = app;
         this.firstRun = true;
+        this.numPendingUiExecs = new AtomicInteger(0);
     }
 
     /**
@@ -86,6 +91,9 @@ public class PluginManager {
             this.clearPluginObjects();
         }
 
+        // Insert PluginManager service
+        this.addService(new PluginEntry("PluginManager", new PluginManagerService()));
+
         // Start up all plugins that have onload specified
         this.startupPlugins();
     }
@@ -201,8 +209,23 @@ public class PluginManager {
      * @param rawArgs       An Array literal string containing any arguments needed in the
      *                      plugin execute method.
      */
-    public void exec(String service, String action, String callbackId, String rawArgs) {
-        CordovaPlugin plugin = this.getPlugin(service);
+    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 {
+            Log.d(TAG, "running exec normally");
+            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);
@@ -396,4 +419,26 @@ public class PluginManager {
         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, "=====================================================================================");
     }
+
+    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;
+        }
+    }
 }


[25/50] [abbrv] android commit: [CB-3625] [CB-3338] updated windows cli scripts and added version option

Posted by ag...@apache.org.
[CB-3625] [CB-3338] updated windows cli scripts and added version option


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/4ec3d6d0
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/4ec3d6d0
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/4ec3d6d0

Branch: refs/heads/2.9.x
Commit: 4ec3d6d0646e22786774f3d3513380052d7ecac2
Parents: 8c9e416
Author: Benn Mapes <be...@gmail.com>
Authored: Tue Jun 18 14:54:59 2013 -0700
Committer: Benn Mapes <be...@gmail.com>
Committed: Tue Jun 18 14:56:11 2013 -0700

----------------------------------------------------------------------
 bin/create.js                        |  19 +-
 bin/templates/cordova/lib/cordova.js | 554 +++++++++++++++---------------
 bin/templates/cordova/version.bat    |  18 +
 3 files changed, 305 insertions(+), 286 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/4ec3d6d0/bin/create.js
----------------------------------------------------------------------
diff --git a/bin/create.js b/bin/create.js
index 07c2e56..1cb794f 100644
--- a/bin/create.js
+++ b/bin/create.js
@@ -106,20 +106,6 @@ function createAppInfoJar() {
     }
 }
 
-function cleanup() {
-    // Cleanup
-//    if(fso.FileExists(ROOT + '\\framework\\libs\\commons-codec-1.6.jar')) {
-//        fso.DeleteFile(ROOT + '\\framework\\libs\\commons-codec-1.6.jar');
-//        fso.DeleteFolder(ROOT + '\\framework\\libs', true);
-//    }
-    if(fso.FileExists(ROOT + '\\framework\\cordova-'+VERSION+'.jar')) {
-        fso.DeleteFile(ROOT + '\\framework\\cordova-'+VERSION+'.jar');
-    }
-    if(fso.FileExists(ROOT + '\\framework\\assets\\www\\cordova-'+VERSION+'.js')) {
-        fso.DeleteFile(ROOT + '\\framework\\assets\\www\\cordova-'+VERSION+'.js');
-    }
-}
-
 // working dir
 var ROOT = WScript.ScriptFullName.split('\\bin\\create.js').join('');
 if (args.Count() > 0) {
@@ -212,6 +198,7 @@ exec('%comspec% /c copy "'+ROOT+'\\bin\\templates\\cordova\\clean.bat" "' + PROJ
 exec('%comspec% /c copy "'+ROOT+'\\bin\\templates\\cordova\\build.bat" "' + PROJECT_PATH + '\\cordova\\build.bat" /Y');
 exec('%comspec% /c copy "'+ROOT+'\\bin\\templates\\cordova\\log.bat" "' + PROJECT_PATH + '\\cordova\\log.bat" /Y');
 exec('%comspec% /c copy "'+ROOT+'\\bin\\templates\\cordova\\run.bat" "' + PROJECT_PATH + '\\cordova\\run.bat" /Y');
+exec('%comspec% /c copy "'+ROOT+'\\bin\\templates\\cordova\\version.bat" "' + PROJECT_PATH + '\\cordova\\version.bat" /Y');
 
 // interpolate the activity name and package
 Log("Updating AndroidManifest.xml and Main Activity...");
@@ -220,6 +207,4 @@ replaceInFile(ACTIVITY_PATH, /__ID__/, PACKAGE);
 
 replaceInFile(MANIFEST_PATH, /__ACTIVITY__/, ACTIVITY);
 replaceInFile(MANIFEST_PATH, /__PACKAGE__/, PACKAGE);
-replaceInFile(MANIFEST_PATH, /__APILEVEL__/, API_LEVEL);
-
-cleanup();
+replaceInFile(MANIFEST_PATH, /__APILEVEL__/, API_LEVEL);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/4ec3d6d0/bin/templates/cordova/lib/cordova.js
----------------------------------------------------------------------
diff --git a/bin/templates/cordova/lib/cordova.js b/bin/templates/cordova/lib/cordova.js
index 28f9b3e..e082189 100644
--- a/bin/templates/cordova/lib/cordova.js
+++ b/bin/templates/cordova/lib/cordova.js
@@ -18,6 +18,21 @@
 var ROOT  = WScript.ScriptFullName.split('\\cordova\\lib\\cordova.js').join(''),
     shell = WScript.CreateObject("WScript.Shell"),
     fso   = WScript.CreateObject('Scripting.FileSystemObject');
+//device_id for targeting specific device
+var device_id;
+//build types
+var NONE = 0,
+    DEBUG = '--debug',
+    RELEASE = '--release',
+    NO_BUILD = '--nobuild';
+var build_type = NONE;
+
+//deploy tpyes
+var NONE = 0,
+    EMULATOR = 1,
+    DEVICE = 2,
+    TARGET = 3;
+var deploy_type = NONE;
 
 
 // log to stdout or stderr
@@ -86,6 +101,25 @@ function exec_verbose(command) {
     }
 }
 
+function version(path) {
+    var cordovajs_path = path + "\\assets\\www\\cordova.js";
+    if(fso.FileExists(cordovajs_path)) {
+        var f = fso.OpenTextFile(cordovajs_path, 1,2);
+        var cordovajs = f.ReadAll();
+        f.Close();
+        var version_regex = /^.*CORDOVA_JS_BUILD_LABEL.*$/m;
+        var version_line = cordovajs.match(version_regex) + "";
+        var version = version_line.match(/(\d+)\.(\d+)\.(\d+)(rc\d)?/) + "";
+        // TODO : figure out why this isn't matching properly so we can remove this substring workaround.
+        Log(version.substr(0, ((version.length/2) -1)));
+    } else {
+        Log("Error : Could not find cordova js.", true);
+        Log("Expected Location : " + cordovajs_path, true);
+        WScript.Quit(2);
+    }
+
+}
+
 function get_devices() {
     var device_list = []
     var local_devices = shell.Exec("%comspec% /c adb devices").StdOut.ReadAll();
@@ -117,38 +151,18 @@ function list_devices() {
 }
 
 function get_emulator_images() {
-    // discription contains all data recieved squashed onto one line
-    var add_description = true;
     var avd_list = [];
     var local_emulators = shell.Exec("%comspec% /c android list avds").StdOut.ReadAll();
     if (local_emulators.match(/Name\:/)) {
         emulators = local_emulators.split('\n');
-        //format (ID DESCRIPTION)
         var count = 0;
         var output = '';
         for (i in emulators) {
+            // Find the line with the emulator name.
             if (emulators[i].match(/Name\:/)) {
+                // strip description
                 var emulator_name = emulators[i].replace(/\s*Name\:\s/, '') + ' ';
-                if (add_description) {
-                    count = 1;
-                    output += emulator_name
-                }
-                else {
-                    avd_list.push(emulator_name);
-                }
-            }
-            // add description if indicated (all data squeezed onto one line)
-            if (count > 0) {
-                var emulator_description = emulators[i].replace(/\s*/g, '');
-                if (count > 4) {
-                    avd_list.push(output + emulator_description);
-                    count = 0;
-                    output = '';
-                }
-                else {
-                    count++;
-                    output += emulator_description + ' '
-                }
+                avd_list.push(emulator_name);
             }
         }
     }
@@ -192,8 +206,21 @@ function list_started_emulators() {
         }
     }
     else {
-        Log('No started emulators found, if you would like to start an emulator call \'list-emulator-images\'');
-        Log(' to get the name of an emulator and then start the emulator with \'start-emulator <Name>\'');
+        Log('No started emulators found, if you would like to start an emulator call ');
+        Log('\'list-emulator-images\'');
+        Log(' to get the name of an emulator and then start the emulator with');
+        Log('\'start-emulator <Name>\'');
+    }
+}
+
+function create_emulator() {
+    //get targets
+    var targets = shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s\d+/g);
+    if(targets) {
+        exec('%comspec% /c android create avd --name cordova_emulator --target ' + targets[targets.length - 1].replace(/id: /, ""));
+    } else {
+        Log("You do not have any android targets setup. Please create at least one target with the `android` command so that an emulator can be created.", true);
+        WScript.Quit(69);
     }
 }
 
@@ -207,14 +234,14 @@ function start_emulator(name) {
         for (i in emulators) {
             if (emulators[i].substr(0,name.length) == name) {
                 Log("Starting emulator : " + name);
-                shell.Run("%comspec% /c start cmd /c emulator -avd " + name);
+                shell.Exec("%comspec% /c emulator -avd " + name + " &");
                 //shell.Run("%comspec% /c start cmd /c emulator -cpu-delay 0 -no-boot-anim -cache %Temp%\cache -avd " + name);
                 started = true;
             }
         }
     }
     else {
-        if (emulators.length > 0 && started_emulators < 1) {
+        if (emulators.length > 0 && started_emulators.length == 0) {
             emulator_name = emulators[0].split(' ', 1)[0];
             start_emulator(emulator_name);
             return;
@@ -230,15 +257,16 @@ function start_emulator(name) {
         Log("Error : unable to start emulator, ensure you have emulators availible by checking \'list-emulator-images\'", true);
         WScript.Quit(2);
     }
-    else { // wait for emulator to boot before returning
-        WScript.Stdout.Write('Booting up emulator..');
+    else { 
+        // wait for emulator to get the ID
+        Log('Waiting for emulator...');
         var boot_anim = null;
         var emulator_ID = null;
-        var new_started = get_started_emulators();
+        var new_started = null;
         var i = 0;
-        // use boot animation property to tell when boot is complete.
-        while ((boot_anim == null || !boot_anim.output.match(/stopped/)) && i < 100) {
-            if (new_started.length > started_emulators.length && emulator_ID == null) {
+        while(emulator_ID == null && i < 10) {
+            new_started = get_started_emulators();
+            if(new_started.length > started_emulators.length) {
                 // find new emulator that was just started to get it's ID
                 for(var i = 0; i < new_started.length; i++) {
                     if (new_started[i] != started_emulators[i]) {
@@ -248,18 +276,25 @@ function start_emulator(name) {
                     }
                 }
             }
-            else if (boot_anim == null) {
-                new_started = get_started_emulators(); 
-            }
-            else {
-                boot_anim = exec_out('%comspec% /c adb -s ' + emulator_ID + ' shell getprop init.svc.bootanim'); 
-            }
+        }
+        if (i == 10) {
+             Log('\nEmulator start timed out.');
+             WScript.Quit(2);
+        }
+        i = 0;
+        WScript.Stdout.Write('Booting up emulator (this may take a while).');
+        // use boot animation property to tell when boot is complete.
+        while (!boot_anim.output.match(/stopped/) && i < 100) {
+            boot_anim = exec_out('%comspec% /c adb -s ' + emulator_ID + ' shell getprop init.svc.bootanim');
             i++;
             WScript.Stdout.Write('.');
             WScript.Sleep(2000);
         }
+
         if (i < 100) {
             Log('\nBoot Complete!');
+            // Unlock the device
+            shell.Exec("%comspec% /c adb -s " + emulator_ID + " shell input keyevent 82");
         } else {
              Log('\nEmulator boot timed out. Failed to load emulator');
              WScript.Quit(2);
@@ -267,34 +302,11 @@ function start_emulator(name) {
     }
 }
 
-function install_device(target) {
-    var devices = get_devices();
-    var use_target = false;
-    if (devices.length < 1) {
-        Log("Error : No devices found to install to, make sure there are devices", true);
-        Log(" availible by checking \'<project_dir>\\cordova\\lib\\list-devices\'", true);
-        WScript.Quit(2);
-    }
-    if (target) {
-        var exists = false;
-        for (i in devices) {
-            if (devices[i].substr(0,target.length) == target)
-            {
-                exists = true;
-                break;
-            }
-        }
-        if (!exists) {
-            Log("Error : Unable to find target " + target, true);
-            Log("Please ensure the target exists by checking \'<project>\\cordova\\lib\\list-devices'");
-            WScript.Quit(2);
-        }
-        use_target = true;
-    }
+function get_apk(path) {
     // check if file .apk has been created
-    if (fso.FolderExists(ROOT + '\\bin')) {
+    if (fso.FolderExists(path + '\\bin')) {
         var path_to_apk;
-        var out_folder = fso.GetFolder(ROOT + '\\bin');
+        var out_folder = fso.GetFolder(path + '\\bin');
         var out_files = new Enumerator(out_folder.Files);
         for (;!out_files.atEnd(); out_files.moveNext()) {
             var path = out_files.item() + '';
@@ -304,38 +316,7 @@ function install_device(target) {
             }
         }
         if (path_to_apk) {
-            var launch_name = exec_out("%comspec% /c java -jar "+ROOT+"\\cordova\\appinfo.jar "+ROOT+"\\AndroidManifest.xml");
-            if (launch_name.error) {
-                Log("Failed to get application name from appinfo.jar + AndroidManifest : ", true);
-                Log("Output : " + launch_name.output, true);
-                WScript.Quit(2);
-            }
-            // install on device (-d)
-            Log("Installing app on device...");
-            var cmd;
-            if (use_target) {
-                cmd = '%comspec% /c adb -s ' + target + ' install -r ' + path_to_apk;
-            } else {
-                cmd = '%comspec% /c adb -s ' + devices[0].split(' ', 1)[0] + ' install -r ' + path_to_apk;
-            }
-            var install = exec_out(cmd);
-            if ( install.error && install.output.match(/Failure/)) {
-                Log("Error : Could not install apk to device : ", true);
-                Log(install.output, true);
-                WScript.Quit(2);
-            }
-            else {
-                Log(install.output);
-            }
-            // run on device
-            Log("Launching application...");
-            cmd;
-            if (use_target) {
-                cmd = '%comspec% /c adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output;
-            } else {
-                cmd = '%comspec% /c adb -s ' + devices[0].split(' ', 1)[0] + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output;
-            }
-            exec_verbose(cmd);
+            return path_to_apk;
         }
         else {
             Log('Failed to find apk, make sure you project is built and there is an ', true);
@@ -345,7 +326,18 @@ function install_device(target) {
     }
 }
 
-function install_emulator(target) {
+function install_device(path) {
+    var devices = get_devices();
+    var use_target = false;
+    if (devices.length < 1) {
+        Log("Error : No devices found to install to, make sure there are devices", true);
+        Log(" availible by checking \'<project_dir>\\cordova\\lib\\list-devices\'", true);
+        WScript.Quit(2);
+    }
+    launch(path, devices[0].split(' ', 1)[0], true);
+}
+
+function install_emulator(path) {
     var emulators = get_started_emulators();
     var use_target = false;
     if (emulators.length < 1) {
@@ -353,46 +345,59 @@ function install_emulator(target) {
         Log(" availible by checking \'<project_dir>\\cordova\\lib\\list-started-emulators\'", true);
         WScript.Quit(2);
     }
-    if (target) {
+    launch(path, emulators[0].split(' ', 1)[0], false);
+}
+
+function install_target(path) {
+    if(device_id) {
+        var device = false;
+        var emulators = get_started_emulators();
+        var devices = get_devices();
         var exists = false;
         for (i in emulators) {
-            if (emulators[i].substr(0,target.length) == target)
-            {
+            if (emulators[i].substr(0,device_id.length) == device_id) {
                 exists = true;
                 break;
             }
         }
-        if (!exists) {
-            Log("Error : Unable to find target " + target, true);
-            Log("Please ensure the target exists by checking \'<project>\\cordova\\lib\\list-started-emulators'")
-        }
-        use_target = true;
-    } else {
-        target = emulators[0].split(' ', 1)[0];
-        Log("Deploying to emulator : " + target);
-    }
-    // check if file .apk has been created
-    if (fso.FolderExists(ROOT + '\\bin')) {
-        var path_to_apk;
-        var out_folder = fso.GetFolder(ROOT + '\\bin');
-        var out_files = new Enumerator(out_folder.Files);
-        for (;!out_files.atEnd(); out_files.moveNext()) {
-            var path = out_files.item() + '';
-            if (fso.GetExtensionName(path) == 'apk' && !path.match(/unaligned/)) {
-                path_to_apk = out_files.item();
+        for (i in devices) {
+            if (devices[i].substr(0,device_id.length) == device_id) {
+                exists = true;
+                device = true
                 break;
             }
         }
+        if (!exists) {
+            Log("Error : Unable to find target " + device_id, true);
+            Log("Please ensure the target exists by checking \'<project>\\cordova\\lib\\list-started-emulators'");
+            Log(" Or  \'<project>\\cordova\\lib\\list-devices'");
+        }
+        launch(path, device_id, device);
+    }
+    else {
+        Log("You cannot install to a target without providing a valid target ID.", true);
+        WScript.Quit(2);
+    }
+}
+
+function launch(path, id, device) {
+     if(id) {
+        var path_to_apk = get_apk(path);
         if (path_to_apk) {
-            var launch_name = exec_out("%comspec% /c java -jar "+ROOT+"\\cordova\\appinfo.jar "+ROOT+"\\AndroidManifest.xml");
+            var launch_name = exec_out("%comspec% /c java -jar "+path+"\\cordova\\appinfo.jar "+path+"\\AndroidManifest.xml");
             if (launch_name.error) {
                 Log("Failed to get application name from appinfo.jar + AndroidManifest : ", true);
                 Log("Output : " + launch_name.output, true);
                 WScript.Quit(2);
             }
-            // install on emulator (-e)
-            Log("Installing app on emulator...");
-            var cmd = '%comspec% /c adb -s ' + target + ' install -r ' + path_to_apk;
+            if (device) {
+                // install on device (-d)
+                Log("Installing app on device...");
+            } else {
+                // install on emulator (-e)
+                Log("Installing app on emulator...");
+            }
+            var cmd = '%comspec% /c adb -s ' + id + ' install -r ' + path_to_apk;
             var install = exec_out(cmd);
             if ( install.error && install.output.match(/Failure/)) {
                 Log("Error : Could not install apk to emulator : ", true);
@@ -402,14 +407,9 @@ function install_emulator(target) {
             else {
                 Log(install.output);
             }
-            // run on emulator
+            // launch the application
             Log("Launching application...");
-            cmd;
-            if (use_target) {
-                cmd = '%comspec% /c adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output;
-            } else {
-                cmd = '%comspec% /c adb -s ' + emulators[0].split(' ', 1)[0] + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output
-            }
+            cmd = '%comspec% /c adb -s ' + id + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output;
             exec_verbose(cmd);
         }
         else {
@@ -419,43 +419,14 @@ function install_emulator(target) {
         }
     }
     else {
-        Log('Failed to find apk, make sure you project is built and there is an ', true);
-        Log(' apk in <project>\\bin\\.  To build your project use \'<project>\\cordova\\build\'', true);
+        Log("You cannot install to a target without providing a valid target ID.", true);
         WScript.Quit(2);
     }
 }
 
-function clean() {
+function clean(path) {
     Log("Cleaning project...");
-    exec("%comspec% /c ant.bat clean -f "+ROOT+"\\build.xml 2>&1");
-}
-
-function build(build_type) {
-    if (build_type) {
-        switch (build_type) {
-            case "--debug" :
-                clean();
-                Log("Building project...");
-                exec_verbose("%comspec% /c ant.bat debug -f "+ROOT+"\\build.xml 2>&1");
-                break;
-            case "--release" :
-                clean();
-                Log("Building project...");
-                exec_verbose("%comspec% /c ant.bat release -f "+ROOT+"\\build.xml 2>&1");
-                break;
-            case "--nobuild" :
-                Log("Skipping build process.");
-                break;
-            default :
-                Log("Build option not recognized: " + build_type, true);
-                WScript.Quit(2);
-                break;
-        }
-    }
-    else {
-        Log("WARNING: [ --debug | --release | --nobuild ] not specified, defaulting to --debug.");
-        exec_verbose("%comspec% /c ant.bat debug -f "+ROOT+"\\build.xml 2>&1");
-    }
+    exec("%comspec% /c ant.bat clean -f "+path+"\\build.xml 2>&1");
 }
 
 function log() {
@@ -463,131 +434,176 @@ function log() {
     shell.Run("%comspec% /c adb logcat | grep -v nativeGetEnabledTags");
 }
 
-function run(target, build_type) {
-    var use_target = false;
-    if (!target) {
-        Log("WARNING: [ --target=<ID> | --emulator | --device ] not specified, using defaults");
-    }
-    // build application
-    build(build_type);
-    // attempt to deploy to connected device 
-    var devices = get_devices();
-    if (devices.length > 0 || target == "--device") {
-        if (target) {
-            if (target.substr(0,9) == "--target=") {
-                install_device(target.split('--target=').join(''))
-            } else if (target == "--device") {
-                install_device();
-            } else {
-                Log("Did not regognize " + target + " as a run option.", true);
-                WScript.Quit(2);
-            }
-        }
-        else {
-            Log("WARNING: [ --target=<ID> | --emulator | --device ] not specified, using defaults");
-            install_device();
-        }
+function build(path) {
+    switch (build_type) {
+        case DEBUG :
+            clean(path);
+            Log("Building project...");
+            exec_verbose("%comspec% /c ant.bat debug -f "+path+"\\build.xml 2>&1");
+            break;
+        case RELEASE :
+            clean(path);
+            Log("Building project...");
+            exec_verbose("%comspec% /c ant.bat release -f "+path+"\\build.xml 2>&1");
+            break;
+        case NO_BUILD :
+            Log("Skipping build process.");
+            break;
+        case NONE :
+            clean(path);
+            Log("WARNING: [ --debug | --release | --nobuild ] not specified, defaulting to --debug.");
+            exec_verbose("%comspec% /c ant.bat debug -f "+path+"\\build.xml 2>&1");
+            break;
+        default :
+            Log("Build option not recognized: " + build_type, true);
+            WScript.Quit(2);
+            break;
     }
-    else {
-        var emulators = get_started_emulators();
-        if (emulators.length > 0) {
-            install_emulator();
-        }
-        else {
-            var emulator_images = get_emulator_images();
-            if (emulator_images.length < 1) {
-                Log('No emulators found, if you would like to create an emulator follow the instructions', true);
-                Log(' provided here : http://developer.android.com/tools/devices/index.html', true);
-                Log(' Or run \'android create avd --name <name> --target <targetID>\' in on the command line.', true);
-                WScript.Quit(2);
-            }
-            start_emulator(emulator_images[0].split(' ')[0]);
-            emulators = get_started_emulators();
-            if (emulators.length > 0) {
-                install_emulator();
+}
+
+function run(path) {
+    switch(deploy_type) {
+        case EMULATOR :
+            build(path);
+            if(get_started_emulators().length == 0) {
+                start_emulator();
             }
-            else {
-                Log("Error : emulator failed to start.", true);
-                WScript.Quit(2);
+            //TODO : Start emulator if one isn't started, and create one if none exists.
+            install_emulator(path);
+            break;
+        case DEVICE :
+            build(path);
+            install_device(path);
+            break;
+        case TARGET :
+            build(path);
+            install_target(path);
+            break;
+        case NONE :
+            if (get_devices().length > 0) {
+                Log("WARNING: [ --target=<ID> | --emulator | --device ] not specified, defaulting to --device");
+                deploy_type = DEVICE;
+            } else {
+                Log("WARNING: [ --target=<ID> | --emulator | --device ] not specified, defaulting to --emulator");
+                deploy_type = EMULATOR;
             }
-        }
+            run(path);
+            break;
+        default :
+            Log("Deploy option not recognized: " + deploy_type, true);
+            WScript.Quit(2);
+            break;
     }
 }
 
+
 var args = WScript.Arguments;
 if (args.count() == 0) {
     Log("Error: no args provided.");
     WScript.Quit(2);
 }
 else {
-    if (args(0) == "build") {
-        if (args.Count() > 1) {
-            build(args(1))
-        } else {
-            build();
-        }
-    } else if (args(0) == "clean") {
-        clean();
-    } else if (args(0) == "list-devices") {
-        list_devices();
-    } else if (args(0) == "list-emulator-images") {
-        list_emulator_images();
-    } else if (args(0) == "list-started-emulators") {
-        list_started_emulators();
-    } else if (args(0) == "start-emulator") {
-        if (args.Count() > 1) {
-            start_emulator(args(1))
-        } else {
-            start_emulator();
-        }
-    } else if (args(0) == "log") {
-        log();
-    } else if (args(0) == "install-emulator") {
-        if (args.Count() == 2) {
-            if (args(1).substr(0,9) == "--target=") {
-                install_emulator(args(1).split('--target=').join(''));
+    // parse command
+    switch(args(0)) {
+        case "version" :
+            version(ROOT);
+            break;
+        case "build" :
+            if(args.Count() > 1) {
+                if (args(1) == "--release") {
+                    build_type = RELEASE;
+                }
+                else if (args(1) == "--debug") {
+                    build_type = DEBUG;
+                }
+                else if (args(1) == "--nobuild") {
+                    build_type = NO_BUILD;
+                }
+                else {
+                    Log('Error: \"' + args(i) + '\" is not recognized as a build option', true);
+                    WScript.Quit(2);
+                }
+            }
+            build(ROOT);
+            break;
+        case "clean" :
+            clean();
+            break;
+        case "list-devices" :
+            list_devices();
+            break;
+        case "list-emulator-images" :
+            list_emulator_images();
+            break;
+        case "list-started-emulators" :
+            list_started_emulators();
+            break;
+        case "start-emulator" :
+            if (args.Count() > 1) {
+                start_emulator(args(1))
             } else {
-                Log('Error: \"' + args(1) + '\" is not recognized as an install option', true);
-                WScript.Quit(2);
+                start_emulator();
             }
-        } else {
-            install_emulator();
-        }
-    } else if (args(0) == "install-device") {
-        if (args.Count() == 2) {
-            if (args(1).substr(0,9) == "--target=") {
-                install_device(args(1).split('--target=').join(''));
+            break;
+        case "install-emulator" :
+            if (args.Count() == 2) {
+                if (args(1).substr(0,9) == "--target=") {
+                    device_id = args(1).split('--target=').join('');
+                    install_emulator(ROOT);
+                } else {
+                    Log('Error: \"' + args(1) + '\" is not recognized as an install option', true);
+                    WScript.Quit(2);
+                }
             } else {
-                Log('Error: \"' + args(1) + '\" is not recognized as an install option', true);
-                WScript.Quit(2);
+                install_emulator(ROOT);
             }
-        } else {
-            install_device();
-        }
-    } else if (args(0) == "run") {
-        if (args.Count() == 3) {
-            run(args(1), args(2));
-        }
-        else if (args.Count() == 2) {
-            if (args(1).substr(0,9) == "--target=" ||
-               args(1) == "--emulator" ||
-               args(1) == "--device") {
-                run(args(1));
-            } else if (args(1) == "--debug" ||
-                       args(1) == "--release" ||
-                       args(1) == "--nobuild") {
-                run(null, args(1))
+            break;
+        case "install-device" :
+            if (args.Count() == 2) {
+                if (args(1).substr(0,9) == "--target=") {
+                    device_id = args(1).split('--target=').join('');
+                    install_target(ROOT);
+                } else {
+                    Log('Error: \"' + args(1) + '\" is not recognized as an install option', true);
+                    WScript.Quit(2);
+                }
             } else {
-                Log('Error: \"' + args(1) + '\" is not recognized as a run option', true);
-                WScript.Quit(2);
+                install_device(ROOT);
             }
-        }
-        else {
-            run();
-        }
-    } else {
-        Log('Error: \"' + args(0) + '\" is not recognized as a tooling command', true);
-        WScript.Quit(2);
+            break;
+        case "run" :
+            //parse args
+            for(var i = 1; i < args.Count(); i++) {
+                if (args(i) == "--release") {
+                    build_type = RELEASE;
+                }
+                else if (args(i) == "--debug") {
+                    build_type = DEBUG;
+                }
+                else if (args(i) == "--nobuild") {
+                    build_type = NO_BUILD;
+                }
+                else if (args(i) == "--emulator" || args(i) == "-e") {
+                    deploy_type = EMULATOR;
+                }
+                else if (args(i) == "--device" || args(i) == "-d") {
+                    deploy_type = DEVICE;
+                }
+                else if (args(i).substr(0,9) == "--target=") {
+                    device_id = args(i).split("--target=").join("");
+                    deploy_type = TARGET;
+                }
+                else {
+                    Log('Error: \"' + args(i) + '\" is not recognized as a run option', true);
+                    WScript.Quit(2);
+                }
+            }
+            run(ROOT);
+            break;
+        default :
+            Log("Cordova does not regognize the command " + args(0), true);
+            WScript.Quit(2);
+            break;
     }
 }
 

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/4ec3d6d0/bin/templates/cordova/version.bat
----------------------------------------------------------------------
diff --git a/bin/templates/cordova/version.bat b/bin/templates/cordova/version.bat
new file mode 100644
index 0000000..e70769f
--- /dev/null
+++ b/bin/templates/cordova/version.bat
@@ -0,0 +1,18 @@
+:: Licensed to the Apache Software Foundation (ASF) under one
+:: or more contributor license agreements.  See the NOTICE file
+:: distributed with this work for additional information
+:: regarding copyright ownership.  The ASF licenses this file
+:: to you under the Apache License, Version 2.0 (the
+:: "License"); you may not use this file except in compliance
+:: with the License.  You may obtain a copy of the License at
+:: 
+:: http://www.apache.org/licenses/LICENSE-2.0
+:: 
+:: Unless required by applicable law or agreed to in writing,
+:: software distributed under the License is distributed on an
+:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+:: KIND, either express or implied.  See the License for the
+:: specific language governing permissions and limitations
+:: under the License.
+@ECHO OFF
+%~dp0\cordova.bat version %*
\ No newline at end of file


[26/50] [abbrv] android commit: CB-3902: Explicitly add market URIs to CordovaWebViewClient so this always works, not just sometimes

Posted by ag...@apache.org.
CB-3902: Explicitly add market URIs to CordovaWebViewClient so this always works, not just sometimes


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/98b971b4
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/98b971b4
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/98b971b4

Branch: refs/heads/2.9.x
Commit: 98b971b4dec0df8315a0ec6513146c46ce6dbb4a
Parents: 4ec3d6d
Author: Joe Bowser <bo...@apache.org>
Authored: Tue Jun 18 16:19:27 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Tue Jun 18 16:20:14 2013 -0700

----------------------------------------------------------------------
 .../src/org/apache/cordova/CordovaWebViewClient.java     | 11 +++++++++++
 1 file changed, 11 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/98b971b4/framework/src/org/apache/cordova/CordovaWebViewClient.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaWebViewClient.java b/framework/src/org/apache/cordova/CordovaWebViewClient.java
index eef961c..c49611e 100755
--- a/framework/src/org/apache/cordova/CordovaWebViewClient.java
+++ b/framework/src/org/apache/cordova/CordovaWebViewClient.java
@@ -188,6 +188,17 @@ public class CordovaWebViewClient extends WebViewClient {
                 LOG.e(TAG, "Error sending sms " + url + ":" + e.toString());
             }
         }
+        
+        //Android Market
+        else if(url.startsWith("market:")) {
+            try {
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                intent.setData(Uri.parse(url));
+                this.cordova.getActivity().startActivity(intent);
+            } catch (android.content.ActivityNotFoundException e) {
+                LOG.e(TAG, "Error loading Google Play Store: " + url, e);
+            }
+        }
 
         // All else
         else {


[49/50] [abbrv] android commit: [CB-4048] Merge branch 'master' into 2.9.x

Posted by ag...@apache.org.
[CB-4048] Merge branch 'master' into 2.9.x


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/67e97a89
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/67e97a89
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/67e97a89

Branch: refs/heads/2.9.x
Commit: 67e97a89ced3aa5dddfc823ca7873af7328d40e8
Parents: c5e83b1 892ffc8
Author: Andrew Grieve <ag...@chromium.org>
Authored: Fri Jun 28 11:23:58 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Fri Jun 28 11:23:58 2013 -0400

----------------------------------------------------------------------
 bin/update                                      |   23 +-
 framework/assets/www/cordova.js                 | 5357 ++----------------
 framework/src/org/apache/cordova/Config.java    |   24 +-
 .../src/org/apache/cordova/CordovaActivity.java |   14 +
 .../src/org/apache/cordova/CordovaWebView.java  |   35 +-
 .../src/org/apache/cordova/ExposedJsApi.java    |    7 +-
 .../src/org/apache/cordova/FileHelper.java      |   33 +-
 .../cordova/IceCreamCordovaWebViewClient.java   |   49 +-
 .../src/org/apache/cordova/UriResolver.java     |   65 +
 .../src/org/apache/cordova/UriResolvers.java    |  277 +
 .../org/apache/cordova/api/CordovaPlugin.java   |   15 +-
 .../src/org/apache/cordova/api/PluginEntry.java |   13 +
 .../org/apache/cordova/api/PluginManager.java   |   93 +-
 .../apache/cordova/test/UriResolversTest.java   |  263 +
 .../actions/CordovaWebViewTestActivity.java     |    2 +-
 15 files changed, 1307 insertions(+), 4963 deletions(-)
----------------------------------------------------------------------



[10/50] [abbrv] android commit: Merge branch '3.0.0' of https://git-wip-us.apache.org/repos/asf/cordova-android into 3.0.0

Posted by ag...@apache.org.
Merge branch '3.0.0' of https://git-wip-us.apache.org/repos/asf/cordova-android into 3.0.0


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/a2b8ebf5
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/a2b8ebf5
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/a2b8ebf5

Branch: refs/heads/master
Commit: a2b8ebf57e5231df7c683b4212b284b8c07aab40
Parents: b3fe479 98d9901
Author: hermwong <he...@gmail.com>
Authored: Mon Jun 10 16:21:32 2013 -0700
Committer: hermwong <he...@gmail.com>
Committed: Mon Jun 10 16:21:32 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 546 +----------------------------------
 1 file changed, 2 insertions(+), 544 deletions(-)
----------------------------------------------------------------------



[03/50] [abbrv] android commit: removed CordovaLocationListner

Posted by ag...@apache.org.
removed CordovaLocationListner


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/dbc6dd73
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/dbc6dd73
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/dbc6dd73

Branch: refs/heads/master
Commit: dbc6dd73f3ebf1c4a731719de6957cc6bb2200cc
Parents: 4765c6f
Author: Steven Gill <st...@gmail.com>
Authored: Fri May 17 15:38:08 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Fri May 17 15:38:08 2013 -0700

----------------------------------------------------------------------
 .../apache/cordova/CordovaLocationListener.java | 251 -------------------
 1 file changed, 251 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/dbc6dd73/framework/src/org/apache/cordova/CordovaLocationListener.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaLocationListener.java b/framework/src/org/apache/cordova/CordovaLocationListener.java
deleted file mode 100644
index 01c828b..0000000
--- a/framework/src/org/apache/cordova/CordovaLocationListener.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
-*/
-package org.apache.cordova;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.apache.cordova.api.CallbackContext;
-
-import android.location.Location;
-import android.location.LocationListener;
-import android.location.LocationManager;
-import android.os.Bundle;
-import android.util.Log;
-
-public class CordovaLocationListener implements LocationListener {
-    public static int PERMISSION_DENIED = 1;
-    public static int POSITION_UNAVAILABLE = 2;
-    public static int TIMEOUT = 3;
-
-    protected LocationManager locationManager;
-    private GeoBroker owner;
-    protected boolean running = false;
-
-    public HashMap<String, CallbackContext> watches = new HashMap<String, CallbackContext>();
-    private List<CallbackContext> callbacks = new ArrayList<CallbackContext>();
-    
-    private Timer timer = null;
-
-    private String TAG = "[Cordova Location Listener]";
-
-    public CordovaLocationListener(LocationManager manager, GeoBroker broker, String tag) {
-        this.locationManager = manager;
-        this.owner = broker;
-        this.TAG = tag;
-    }
-
-    protected void fail(int code, String message) {
-    	this.cancelTimer();
-        for (CallbackContext callbackContext: this.callbacks)
-        {
-            this.owner.fail(code, message, callbackContext, false);
-        }
-        if(this.owner.isGlobalListener(this) && this.watches.size() == 0)
-        {
-        	Log.d(TAG, "Stopping global listener");
-        	this.stop();
-        }
-        this.callbacks.clear();
-
-        Iterator<CallbackContext> it = this.watches.values().iterator();
-        while (it.hasNext()) {
-            this.owner.fail(code, message, it.next(), true);
-        }
-    }
-
-    private void win(Location loc) {
-    	this.cancelTimer();
-        for (CallbackContext callbackContext: this.callbacks)
-        {
-            this.owner.win(loc, callbackContext, false);
-        }
-        if(this.owner.isGlobalListener(this) && this.watches.size() == 0)
-        {
-        	Log.d(TAG, "Stopping global listener");
-        	this.stop();
-        }
-        this.callbacks.clear();
-
-        Iterator<CallbackContext> it = this.watches.values().iterator();
-        while (it.hasNext()) {
-            this.owner.win(loc, it.next(), true);
-        }
-    }
-
-    /**
-     * Location Listener Methods
-     */
-
-    /**
-     * Called when the provider is disabled by the user.
-     *
-     * @param provider
-     */
-    public void onProviderDisabled(String provider) {
-        Log.d(TAG, "Location provider '" + provider + "' disabled.");
-        this.fail(POSITION_UNAVAILABLE, "GPS provider disabled.");
-    }
-
-    /**
-     * Called when the provider is enabled by the user.
-     *
-     * @param provider
-     */
-    public void onProviderEnabled(String provider) {
-        Log.d(TAG, "Location provider "+ provider + " has been enabled");
-    }
-
-    /**
-     * Called when the provider status changes. This method is called when a
-     * provider is unable to fetch a location or if the provider has recently
-     * become available after a period of unavailability.
-     *
-     * @param provider
-     * @param status
-     * @param extras
-     */
-    public void onStatusChanged(String provider, int status, Bundle extras) {
-        Log.d(TAG, "The status of the provider " + provider + " has changed");
-        if (status == 0) {
-            Log.d(TAG, provider + " is OUT OF SERVICE");
-            this.fail(CordovaLocationListener.POSITION_UNAVAILABLE, "Provider " + provider + " is out of service.");
-        }
-        else if (status == 1) {
-            Log.d(TAG, provider + " is TEMPORARILY_UNAVAILABLE");
-        }
-        else {
-            Log.d(TAG, provider + " is AVAILABLE");
-        }
-    }
-
-    /**
-     * Called when the location has changed.
-     *
-     * @param location
-     */
-    public void onLocationChanged(Location location) {
-        Log.d(TAG, "The location has been updated!");
-        this.win(location);
-    }
-
-    // PUBLIC
-
-    public int size() {
-        return this.watches.size() + this.callbacks.size();
-    }
-
-    public void addWatch(String timerId, CallbackContext callbackContext) {
-        this.watches.put(timerId, callbackContext);
-        if (this.size() == 1) {
-            this.start();
-        }
-    }
-    public void addCallback(CallbackContext callbackContext, int timeout) {
-    	if(this.timer == null) {
-    		this.timer = new Timer();
-    	}
-    	this.timer.schedule(new LocationTimeoutTask(callbackContext, this), timeout);
-        this.callbacks.add(callbackContext);        
-        if (this.size() == 1) {
-            this.start();
-        }
-    }
-    public void clearWatch(String timerId) {
-        if (this.watches.containsKey(timerId)) {
-            this.watches.remove(timerId);
-        }
-        if (this.size() == 0) {
-            this.stop();
-        }
-    }
-
-    /**
-     * Destroy listener.
-     */
-    public void destroy() {    	
-        this.stop();
-    }
-
-    // LOCAL
-
-    /**
-     * Start requesting location updates.
-     *
-     * @param interval
-     */
-    protected void start() {
-        if (!this.running) {
-            if (this.locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) {
-                this.running = true;
-                this.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 10, this);
-            } else {
-                this.fail(CordovaLocationListener.POSITION_UNAVAILABLE, "Network provider is not available.");
-            }
-        }
-    }
-
-    /**
-     * Stop receiving location updates.
-     */
-    private void stop() {
-    	this.cancelTimer();
-        if (this.running) {
-            this.locationManager.removeUpdates(this);
-            this.running = false;
-        }
-    }
-    
-    private void cancelTimer() {
-    	if(this.timer != null) {
-    		this.timer.cancel();
-        	this.timer.purge();
-        	this.timer = null;
-    	}
-    }
-    
-    private class LocationTimeoutTask extends TimerTask {
-    	
-    	private CallbackContext callbackContext = null;
-    	private CordovaLocationListener listener = null;
-    	
-    	public LocationTimeoutTask(CallbackContext callbackContext, CordovaLocationListener listener) {
-    		this.callbackContext = callbackContext;
-    		this.listener = listener;
-    	}
-
-		@Override
-		public void run() {
-			for (CallbackContext callbackContext: listener.callbacks) {
-				if(this.callbackContext == callbackContext) {
-					listener.callbacks.remove(callbackContext);
-					break;
-				}
-			}
-			
-			if(listener.size() == 0) {
-				listener.stop();
-			}
-		}    	
-    }
-}


[42/50] [abbrv] android commit: Explicitly print exceptions that occur within ExposedJsApi.

Posted by ag...@apache.org.
Explicitly print exceptions that occur within ExposedJsApi.

Before they trickled into JNI and the stack traces were lost.


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/10d31ea0
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/10d31ea0
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/10d31ea0

Branch: refs/heads/2.9.x
Commit: 10d31ea0a30ec47d68c79813d56e7506b1542f7e
Parents: e64ebdf
Author: Andrew Grieve <ag...@chromium.org>
Authored: Wed Jun 26 14:20:45 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Wed Jun 26 14:20:45 2013 -0400

----------------------------------------------------------------------
 framework/src/org/apache/cordova/ExposedJsApi.java | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/10d31ea0/framework/src/org/apache/cordova/ExposedJsApi.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/ExposedJsApi.java b/framework/src/org/apache/cordova/ExposedJsApi.java
index 40ab1e3..221dd3d 100755
--- a/framework/src/org/apache/cordova/ExposedJsApi.java
+++ b/framework/src/org/apache/cordova/ExposedJsApi.java
@@ -54,6 +54,9 @@ import org.json.JSONException;
                 ret = jsMessageQueue.popAndEncode();
             }
             return ret;
+        } catch (Throwable e) {
+            e.printStackTrace();
+            return "";
         } finally {
             jsMessageQueue.setPaused(false);
         }


[09/50] [abbrv] android commit: removed android.permission.ACCESS_COARSE_LOCATION and android.permission.ACCESS_FINE_LOCATION from AndroidManifest.xml for PBR

Posted by ag...@apache.org.
removed android.permission.ACCESS_COARSE_LOCATION and android.permission.ACCESS_FINE_LOCATION from AndroidManifest.xml for PBR


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/b3fe4798
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/b3fe4798
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/b3fe4798

Branch: refs/heads/master
Commit: b3fe47985a6388de94af95e47c0d8aabb3b51baa
Parents: f7c97cb
Author: hermwong <he...@gmail.com>
Authored: Mon Jun 10 16:14:56 2013 -0700
Committer: hermwong <he...@gmail.com>
Committed: Mon Jun 10 16:14:56 2013 -0700

----------------------------------------------------------------------
 framework/AndroidManifest.xml | 2 --
 1 file changed, 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/b3fe4798/framework/AndroidManifest.xml
----------------------------------------------------------------------
diff --git a/framework/AndroidManifest.xml b/framework/AndroidManifest.xml
index f1336ea..2b3c9c6 100755
--- a/framework/AndroidManifest.xml
+++ b/framework/AndroidManifest.xml
@@ -29,8 +29,6 @@
     <!-- android:xlargeScreens="true" screen supported only after Android-9 -->
 
     <uses-permission android:name="android.permission.VIBRATE" />
-    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />


[02/50] [abbrv] android commit: updated cordovajs, removed geolocation code

Posted by ag...@apache.org.
updated cordovajs, removed geolocation code


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/4765c6fc
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/4765c6fc
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/4765c6fc

Branch: refs/heads/master
Commit: 4765c6fcc5285bd30a77d69ba7e2c4ab245d99e2
Parents: 78dd084
Author: Steven Gill <st...@gmail.com>
Authored: Fri May 17 15:19:04 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Fri May 17 15:19:04 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 308 +----------------------------------
 1 file changed, 2 insertions(+), 306 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/4765c6fc/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 9b88ae5..80bfa16 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-72-g6ec24b1
+// 2.7.0rc1-79-g8ac64ca
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-72-g6ec24b1';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-79-g8ac64ca';
 // file: lib/scripts/require.js
 
 var require,
@@ -1725,60 +1725,6 @@ module.exports = ContactOrganization;
 
 });
 
-// file: lib/common/plugin/Coordinates.js
-define("cordova/plugin/Coordinates", function(require, exports, module) {
-
-/**
- * This class contains position information.
- * @param {Object} lat
- * @param {Object} lng
- * @param {Object} alt
- * @param {Object} acc
- * @param {Object} head
- * @param {Object} vel
- * @param {Object} altacc
- * @constructor
- */
-var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
-    /**
-     * The latitude of the position.
-     */
-    this.latitude = lat;
-    /**
-     * The longitude of the position,
-     */
-    this.longitude = lng;
-    /**
-     * The accuracy of the position.
-     */
-    this.accuracy = acc;
-    /**
-     * The altitude of the position.
-     */
-    this.altitude = (alt !== undefined ? alt : null);
-    /**
-     * The direction the device is moving at the position.
-     */
-    this.heading = (head !== undefined ? head : null);
-    /**
-     * The velocity with which the device is moving at the position.
-     */
-    this.speed = (vel !== undefined ? vel : null);
-
-    if (this.speed === 0 || this.speed === null) {
-        this.heading = NaN;
-    }
-
-    /**
-     * The altitude accuracy of the position.
-     */
-    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
-};
-
-module.exports = Coordinates;
-
-});
-
 // file: lib/common/plugin/DirectoryEntry.js
 define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
 
@@ -3640,47 +3586,6 @@ module.exports = Metadata;
 
 });
 
-// file: lib/common/plugin/Position.js
-define("cordova/plugin/Position", function(require, exports, module) {
-
-var Coordinates = require('cordova/plugin/Coordinates');
-
-var Position = function(coords, timestamp) {
-    if (coords) {
-        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
-    } else {
-        this.coords = new Coordinates();
-    }
-    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
-};
-
-module.exports = Position;
-
-});
-
-// file: lib/common/plugin/PositionError.js
-define("cordova/plugin/PositionError", function(require, exports, module) {
-
-/**
- * Position error object
- *
- * @constructor
- * @param code
- * @param message
- */
-var PositionError = function(code, message) {
-    this.code = code || null;
-    this.message = message || '';
-};
-
-PositionError.PERMISSION_DENIED = 1;
-PositionError.POSITION_UNAVAILABLE = 2;
-PositionError.TIMEOUT = 3;
-
-module.exports = PositionError;
-
-});
-
 // file: lib/common/plugin/ProgressEvent.js
 define("cordova/plugin/ProgressEvent", function(require, exports, module) {
 
@@ -4840,215 +4745,6 @@ modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError');
 
 });
 
-// file: lib/common/plugin/geolocation.js
-define("cordova/plugin/geolocation", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    utils = require('cordova/utils'),
-    exec = require('cordova/exec'),
-    PositionError = require('cordova/plugin/PositionError'),
-    Position = require('cordova/plugin/Position');
-
-var timers = {};   // list of timers in use
-
-// Returns default params, overrides if provided with values
-function parseParameters(options) {
-    var opt = {
-        maximumAge: 0,
-        enableHighAccuracy: false,
-        timeout: Infinity
-    };
-
-    if (options) {
-        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
-            opt.maximumAge = options.maximumAge;
-        }
-        if (options.enableHighAccuracy !== undefined) {
-            opt.enableHighAccuracy = options.enableHighAccuracy;
-        }
-        if (options.timeout !== undefined && !isNaN(options.timeout)) {
-            if (options.timeout < 0) {
-                opt.timeout = 0;
-            } else {
-                opt.timeout = options.timeout;
-            }
-        }
-    }
-
-    return opt;
-}
-
-// Returns a timeout failure, closed over a specified timeout value and error callback.
-function createTimeout(errorCallback, timeout) {
-    var t = setTimeout(function() {
-        clearTimeout(t);
-        t = null;
-        errorCallback({
-            code:PositionError.TIMEOUT,
-            message:"Position retrieval timed out."
-        });
-    }, timeout);
-    return t;
-}
-
-var geolocation = {
-    lastPosition:null, // reference to last known (cached) position returned
-    /**
-   * Asynchronously acquires the current position.
-   *
-   * @param {Function} successCallback    The function to call when the position data is available
-   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)
-   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)
-   */
-    getCurrentPosition:function(successCallback, errorCallback, options) {
-        argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments);
-        options = parseParameters(options);
-
-        // Timer var that will fire an error callback if no position is retrieved from native
-        // before the "timeout" param provided expires
-        var timeoutTimer = {timer:null};
-
-        var win = function(p) {
-            clearTimeout(timeoutTimer.timer);
-            if (!(timeoutTimer.timer)) {
-                // Timeout already happened, or native fired error callback for
-                // this geo request.
-                // Don't continue with success callback.
-                return;
-            }
-            var pos = new Position(
-                {
-                    latitude:p.latitude,
-                    longitude:p.longitude,
-                    altitude:p.altitude,
-                    accuracy:p.accuracy,
-                    heading:p.heading,
-                    velocity:p.velocity,
-                    altitudeAccuracy:p.altitudeAccuracy
-                },
-                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
-            );
-            geolocation.lastPosition = pos;
-            successCallback(pos);
-        };
-        var fail = function(e) {
-            clearTimeout(timeoutTimer.timer);
-            timeoutTimer.timer = null;
-            var err = new PositionError(e.code, e.message);
-            if (errorCallback) {
-                errorCallback(err);
-            }
-        };
-
-        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
-        // fire the success callback with the cached position.
-        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
-            successCallback(geolocation.lastPosition);
-        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
-        } else if (options.timeout === 0) {
-            fail({
-                code:PositionError.TIMEOUT,
-                message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter."
-            });
-        // Otherwise we have to call into native to retrieve a position.
-        } else {
-            if (options.timeout !== Infinity) {
-                // If the timeout value was not set to Infinity (default), then
-                // set up a timeout function that will fire the error callback
-                // if no successful position was retrieved before timeout expired.
-                timeoutTimer.timer = createTimeout(fail, options.timeout);
-            } else {
-                // This is here so the check in the win function doesn't mess stuff up
-                // may seem weird but this guarantees timeoutTimer is
-                // always truthy before we call into native
-                timeoutTimer.timer = true;
-            }
-            exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
-        }
-        return timeoutTimer;
-    },
-    /**
-     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,
-     * the successCallback is called with the new location.
-     *
-     * @param {Function} successCallback    The function to call each time the location data is available
-     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)
-     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)
-     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
-     */
-    watchPosition:function(successCallback, errorCallback, options) {
-        argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments);
-        options = parseParameters(options);
-
-        var id = utils.createUUID();
-
-        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
-        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
-
-        var fail = function(e) {
-            clearTimeout(timers[id].timer);
-            var err = new PositionError(e.code, e.message);
-            if (errorCallback) {
-                errorCallback(err);
-            }
-        };
-
-        var win = function(p) {
-            clearTimeout(timers[id].timer);
-            if (options.timeout !== Infinity) {
-                timers[id].timer = createTimeout(fail, options.timeout);
-            }
-            var pos = new Position(
-                {
-                    latitude:p.latitude,
-                    longitude:p.longitude,
-                    altitude:p.altitude,
-                    accuracy:p.accuracy,
-                    heading:p.heading,
-                    velocity:p.velocity,
-                    altitudeAccuracy:p.altitudeAccuracy
-                },
-                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
-            );
-            geolocation.lastPosition = pos;
-            successCallback(pos);
-        };
-
-        exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
-
-        return id;
-    },
-    /**
-     * Clears the specified heading watch.
-     *
-     * @param {String} id       The ID of the watch returned from #watchPosition
-     */
-    clearWatch:function(id) {
-        if (id && timers[id] !== undefined) {
-            clearTimeout(timers[id].timer);
-            timers[id].timer = false;
-            exec(null, null, "Geolocation", "clearWatch", [id]);
-        }
-    }
-};
-
-module.exports = geolocation;
-
-});
-
-// file: lib/common/plugin/geolocation/symbols.js
-define("cordova/plugin/geolocation/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation');
-modulemapper.clobbers('cordova/plugin/PositionError', 'PositionError');
-modulemapper.clobbers('cordova/plugin/Position', 'Position');
-modulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates');
-
-});
-
 // file: lib/common/plugin/globalization.js
 define("cordova/plugin/globalization", function(require, exports, module) {
 


[15/50] [abbrv] android commit: updated cordovajs

Posted by ag...@apache.org.
updated cordovajs


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/e30bc6b6
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/e30bc6b6
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/e30bc6b6

Branch: refs/heads/master
Commit: e30bc6b6e44f4ad7bcbef7d1808215f0ae8c47dc
Parents: 3a55991
Author: Steven Gill <st...@gmail.com>
Authored: Thu Jun 13 15:55:48 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Thu Jun 13 15:55:48 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 58 ++----------------------------------
 1 file changed, 2 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/e30bc6b6/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index a90b232..f8667e5 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: android
-// 2.7.0rc1-101-gc6482ac
+// 2.7.0rc1-116-gf0108ae
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -19,7 +19,7 @@
  under the License.
 */
 ;(function() {
-var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-101-gc6482ac';
+var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-116-gf0108ae';
 // file: lib/scripts/require.js
 
 var require,
@@ -1273,60 +1273,6 @@ module.exports = {
 
 });
 
-// file: lib/common/plugin/Coordinates.js
-define("cordova/plugin/Coordinates", function(require, exports, module) {
-
-/**
- * This class contains position information.
- * @param {Object} lat
- * @param {Object} lng
- * @param {Object} alt
- * @param {Object} acc
- * @param {Object} head
- * @param {Object} vel
- * @param {Object} altacc
- * @constructor
- */
-var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
-    /**
-     * The latitude of the position.
-     */
-    this.latitude = lat;
-    /**
-     * The longitude of the position,
-     */
-    this.longitude = lng;
-    /**
-     * The accuracy of the position.
-     */
-    this.accuracy = acc;
-    /**
-     * The altitude of the position.
-     */
-    this.altitude = (alt !== undefined ? alt : null);
-    /**
-     * The direction the device is moving at the position.
-     */
-    this.heading = (head !== undefined ? head : null);
-    /**
-     * The velocity with which the device is moving at the position.
-     */
-    this.speed = (vel !== undefined ? vel : null);
-
-    if (this.speed === 0 || this.speed === null) {
-        this.heading = NaN;
-    }
-
-    /**
-     * The altitude accuracy of the position.
-     */
-    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
-};
-
-module.exports = Coordinates;
-
-});
-
 // file: lib/common/plugin/DirectoryEntry.js
 define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
 


[29/50] [abbrv] android commit: Merge branch 'CB-3932' of git://github.com/angelaf/cordova-android

Posted by ag...@apache.org.
Merge branch 'CB-3932' of git://github.com/angelaf/cordova-android


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/3ace9348
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/3ace9348
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/3ace9348

Branch: refs/heads/2.9.x
Commit: 3ace9348f619ccaf5841b7d7a46d48fc8dd14640
Parents: 98b971b 3a14017
Author: Joe Bowser <bo...@apache.org>
Authored: Wed Jun 19 16:03:18 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Wed Jun 19 16:03:18 2013 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/CordovaWebView.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------



[41/50] [abbrv] android commit: [CB-3998] video duration is an int

Posted by ag...@apache.org.
[CB-3998] video duration is an int


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/e64ebdfa
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/e64ebdfa
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/e64ebdfa

Branch: refs/heads/2.9.x
Commit: e64ebdfaeeadfa679408d4906f06fa73e310d02b
Parents: 7e15ff9
Author: Don Coleman <dc...@chariotsolutions.com>
Authored: Tue Jun 25 00:29:16 2013 -0400
Committer: Don Coleman <do...@apache.org>
Committed: Tue Jun 25 14:35:23 2013 -0400

----------------------------------------------------------------------
 framework/src/org/apache/cordova/Capture.java | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/e64ebdfa/framework/src/org/apache/cordova/Capture.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/Capture.java b/framework/src/org/apache/cordova/Capture.java
index 5f737ca..e6e9ece 100644
--- a/framework/src/org/apache/cordova/Capture.java
+++ b/framework/src/org/apache/cordova/Capture.java
@@ -62,7 +62,7 @@ public class Capture extends CordovaPlugin {
 
     private CallbackContext callbackContext;        // The callback context from which we were invoked.
     private long limit;                             // the number of pics/vids/clips to take
-    private double duration;                        // optional duration parameter for video recording
+    private int duration;                           // optional max duration of video recording in seconds
     private JSONArray results;                      // The array of results to be returned to the user
     private int numPics;                            // Number of pictures before capture activity
 
@@ -80,13 +80,13 @@ public class Capture extends CordovaPlugin {
     public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
         this.callbackContext = callbackContext;
         this.limit = 1;
-        this.duration = 0.0f;
+        this.duration = 0;
         this.results = new JSONArray();
 
         JSONObject options = args.optJSONObject(0);
         if (options != null) {
             limit = options.optLong("limit", 1);
-            duration = options.optDouble("duration", 0.0f);
+            duration = options.optInt("duration", 0);
         }
 
         if (action.equals("getFormatData")) {
@@ -215,10 +215,10 @@ public class Capture extends CordovaPlugin {
     /**
      * Sets up an intent to capture video.  Result handled by onActivityResult()
      */
-    private void captureVideo(double duration) {
+    private void captureVideo(int duration) {
         Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
 
-        if(Build.VERSION.SDK_INT > 8){
+        if(Build.VERSION.SDK_INT > 7){
             intent.putExtra("android.intent.extra.durationLimit", duration);
         }
         this.cordova.startActivityForResult((CordovaPlugin) this, intent, CAPTURE_VIDEO);


[16/50] [abbrv] android commit: Merge branch '3.0.0' of https://git-wip-us.apache.org/repos/asf/cordova-android into 3.0.0

Posted by ag...@apache.org.
Merge branch '3.0.0' of https://git-wip-us.apache.org/repos/asf/cordova-android into 3.0.0


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/12ebadbb
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/12ebadbb
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/12ebadbb

Branch: refs/heads/master
Commit: 12ebadbb0f0229c6b8b76d6fb4e78b95853342c9
Parents: e30bc6b 9288158
Author: Steven Gill <st...@gmail.com>
Authored: Thu Jun 13 15:56:00 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Thu Jun 13 15:56:00 2013 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/DirectoryManager.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------



[23/50] [abbrv] android commit: CB-3784: Patches are always welcome

Posted by ag...@apache.org.
CB-3784: Patches are always welcome


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/8c9e4161
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/8c9e4161
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/8c9e4161

Branch: refs/heads/2.9.x
Commit: 8c9e4161750e2198acbe9421e425d9c574231d82
Parents: 431f333
Author: Joe Bowser <bo...@apache.org>
Authored: Tue Jun 18 13:14:30 2013 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Tue Jun 18 13:14:30 2013 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/api/PluginManager.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/8c9e4161/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 43dc8df..a819107 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -396,7 +396,7 @@ public class PluginManager {
 
     private void pluginConfigurationMissing() {
         LOG.e(TAG, "=====================================================================================");
-        LOG.e(TAG, "ERROR: config.xml is missing.  Add res/xml/plugins.xml to your project.");
+        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, "=====================================================================================");
     }


[27/50] [abbrv] android commit: updated cordova.js

Posted by ag...@apache.org.
updated cordova.js


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/e726c0d6
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/e726c0d6
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/e726c0d6

Branch: refs/heads/master
Commit: e726c0d60bb05db42c724ff3326ff9ffb126c324
Parents: c531d97
Author: Steven Gill <st...@gmail.com>
Authored: Tue Jun 18 17:01:56 2013 -0700
Committer: Steven Gill <st...@gmail.com>
Committed: Tue Jun 18 17:01:56 2013 -0700

----------------------------------------------------------------------
 framework/assets/www/cordova.js | 2149 ----------------------------------
 1 file changed, 2149 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/e726c0d6/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --git a/framework/assets/www/cordova.js b/framework/assets/www/cordova.js
index 40a9ea3..33cc366 100644
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@ -1150,1908 +1150,6 @@ module.exports = {
 
 });
 
-// file: lib/common/plugin/CaptureAudioOptions.js
-define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
-
-/**
- * Encapsulates all audio capture operation configuration options.
- */
-var CaptureAudioOptions = function(){
-    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
-    this.limit = 1;
-    // Maximum duration of a single sound clip in seconds.
-    this.duration = 0;
-};
-
-module.exports = CaptureAudioOptions;
-
-});
-
-// file: lib/common/plugin/CaptureError.js
-define("cordova/plugin/CaptureError", function(require, exports, module) {
-
-/**
- * The CaptureError interface encapsulates all errors in the Capture API.
- */
-var CaptureError = function(c) {
-   this.code = c || null;
-};
-
-// Camera or microphone failed to capture image or sound.
-CaptureError.CAPTURE_INTERNAL_ERR = 0;
-// Camera application or audio capture application is currently serving other capture request.
-CaptureError.CAPTURE_APPLICATION_BUSY = 1;
-// Invalid use of the API (e.g. limit parameter has value less than one).
-CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
-// User exited camera application or audio capture application before capturing anything.
-CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
-// The requested capture operation is not supported.
-CaptureError.CAPTURE_NOT_SUPPORTED = 20;
-
-module.exports = CaptureError;
-
-});
-
-// file: lib/common/plugin/CaptureImageOptions.js
-define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
-
-/**
- * Encapsulates all image capture operation configuration options.
- */
-var CaptureImageOptions = function(){
-    // Upper limit of images user can take. Value must be equal or greater than 1.
-    this.limit = 1;
-};
-
-module.exports = CaptureImageOptions;
-
-});
-
-// file: lib/common/plugin/CaptureVideoOptions.js
-define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
-
-/**
- * Encapsulates all video capture operation configuration options.
- */
-var CaptureVideoOptions = function(){
-    // Upper limit of videos user can record. Value must be equal or greater than 1.
-    this.limit = 1;
-    // Maximum duration of a single video clip in seconds.
-    this.duration = 0;
-};
-
-module.exports = CaptureVideoOptions;
-
-});
-
-// file: lib/common/plugin/ConfigurationData.js
-define("cordova/plugin/ConfigurationData", function(require, exports, module) {
-
-/**
- * Encapsulates a set of parameters that the capture device supports.
- */
-function ConfigurationData() {
-    // The ASCII-encoded string in lower case representing the media type.
-    this.type = null;
-    // The height attribute represents height of the image or video in pixels.
-    // In the case of a sound clip this attribute has value 0.
-    this.height = 0;
-    // The width attribute represents width of the image or video in pixels.
-    // In the case of a sound clip this attribute has value 0
-    this.width = 0;
-}
-
-module.exports = ConfigurationData;
-
-});
-
-// file: lib/common/plugin/DirectoryEntry.js
-define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    utils = require('cordova/utils'),
-    exec = require('cordova/exec'),
-    Entry = require('cordova/plugin/Entry'),
-    FileError = require('cordova/plugin/FileError'),
-    DirectoryReader = require('cordova/plugin/DirectoryReader');
-
-/**
- * An interface representing a directory on the file system.
- *
- * {boolean} isFile always false (readonly)
- * {boolean} isDirectory always true (readonly)
- * {DOMString} name of the directory, excluding the path leading to it (readonly)
- * {DOMString} fullPath the absolute full path to the directory (readonly)
- * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
- */
-var DirectoryEntry = function(name, fullPath) {
-     DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath);
-};
-
-utils.extend(DirectoryEntry, Entry);
-
-/**
- * Creates a new DirectoryReader to read entries from this directory
- */
-DirectoryEntry.prototype.createReader = function() {
-    return new DirectoryReader(this.fullPath);
-};
-
-/**
- * Creates or looks up a directory
- *
- * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
- * @param {Flags} options to create or exclusively create the directory
- * @param {Function} successCallback is called with the new entry
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
-    argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments);
-    var win = successCallback && function(result) {
-        var entry = new DirectoryEntry(result.name, result.fullPath);
-        successCallback(entry);
-    };
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-    exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
-};
-
-/**
- * Deletes a directory and all of it's contents
- *
- * @param {Function} successCallback is called with no parameters
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
-    argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments);
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-    exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
-};
-
-/**
- * Creates or looks up a file
- *
- * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
- * @param {Flags} options to create or exclusively create the file
- * @param {Function} successCallback is called with the new entry
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
-    argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments);
-    var win = successCallback && function(result) {
-        var FileEntry = require('cordova/plugin/FileEntry');
-        var entry = new FileEntry(result.name, result.fullPath);
-        successCallback(entry);
-    };
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-    exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
-};
-
-module.exports = DirectoryEntry;
-
-});
-
-// file: lib/common/plugin/DirectoryReader.js
-define("cordova/plugin/DirectoryReader", function(require, exports, module) {
-
-var exec = require('cordova/exec'),
-    FileError = require('cordova/plugin/FileError') ;
-
-/**
- * An interface that lists the files and directories in a directory.
- */
-function DirectoryReader(path) {
-    this.path = path || null;
-}
-
-/**
- * Returns a list of entries from a directory.
- *
- * @param {Function} successCallback is called with a list of entries
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
-    var win = typeof successCallback !== 'function' ? null : function(result) {
-        var retVal = [];
-        for (var i=0; i<result.length; i++) {
-            var entry = null;
-            if (result[i].isDirectory) {
-                entry = new (require('cordova/plugin/DirectoryEntry'))();
-            }
-            else if (result[i].isFile) {
-                entry = new (require('cordova/plugin/FileEntry'))();
-            }
-            entry.isDirectory = result[i].isDirectory;
-            entry.isFile = result[i].isFile;
-            entry.name = result[i].name;
-            entry.fullPath = result[i].fullPath;
-            retVal.push(entry);
-        }
-        successCallback(retVal);
-    };
-    var fail = typeof errorCallback !== 'function' ? null : function(code) {
-        errorCallback(new FileError(code));
-    };
-    exec(win, fail, "File", "readEntries", [this.path]);
-};
-
-module.exports = DirectoryReader;
-
-});
-
-// file: lib/common/plugin/Entry.js
-define("cordova/plugin/Entry", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    FileError = require('cordova/plugin/FileError'),
-    Metadata = require('cordova/plugin/Metadata');
-
-/**
- * Represents a file or directory on the local file system.
- *
- * @param isFile
- *            {boolean} true if Entry is a file (readonly)
- * @param isDirectory
- *            {boolean} true if Entry is a directory (readonly)
- * @param name
- *            {DOMString} name of the file or directory, excluding the path
- *            leading to it (readonly)
- * @param fullPath
- *            {DOMString} the absolute full path to the file or directory
- *            (readonly)
- */
-function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
-    this.isFile = !!isFile;
-    this.isDirectory = !!isDirectory;
-    this.name = name || '';
-    this.fullPath = fullPath || '';
-    this.filesystem = fileSystem || null;
-}
-
-/**
- * Look up the metadata of the entry.
- *
- * @param successCallback
- *            {Function} is called with a Metadata object
- * @param errorCallback
- *            {Function} is called with a FileError
- */
-Entry.prototype.getMetadata = function(successCallback, errorCallback) {
-    argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);
-    var success = successCallback && function(lastModified) {
-        var metadata = new Metadata(lastModified);
-        successCallback(metadata);
-    };
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-
-    exec(success, fail, "File", "getMetadata", [this.fullPath]);
-};
-
-/**
- * Set the metadata of the entry.
- *
- * @param successCallback
- *            {Function} is called with a Metadata object
- * @param errorCallback
- *            {Function} is called with a FileError
- * @param metadataObject
- *            {Object} keys and values to set
- */
-Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
-    argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);
-    exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
-};
-
-/**
- * Move a file or directory to a new location.
- *
- * @param parent
- *            {DirectoryEntry} the directory to which to move this entry
- * @param newName
- *            {DOMString} new name of the entry, defaults to the current name
- * @param successCallback
- *            {Function} called with the new DirectoryEntry object
- * @param errorCallback
- *            {Function} called with a FileError
- */
-Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
-    argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-    // source path
-    var srcPath = this.fullPath,
-        // entry name
-        name = newName || this.name,
-        success = function(entry) {
-            if (entry) {
-                if (successCallback) {
-                    // create appropriate Entry object
-                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
-                    successCallback(result);
-                }
-            }
-            else {
-                // no Entry object returned
-                fail && fail(FileError.NOT_FOUND_ERR);
-            }
-        };
-
-    // copy
-    exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
-};
-
-/**
- * Copy a directory to a different location.
- *
- * @param parent
- *            {DirectoryEntry} the directory to which to copy the entry
- * @param newName
- *            {DOMString} new name of the entry, defaults to the current name
- * @param successCallback
- *            {Function} called with the new Entry object
- * @param errorCallback
- *            {Function} called with a FileError
- */
-Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
-    argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-
-        // source path
-    var srcPath = this.fullPath,
-        // entry name
-        name = newName || this.name,
-        // success callback
-        success = function(entry) {
-            if (entry) {
-                if (successCallback) {
-                    // create appropriate Entry object
-                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
-                    successCallback(result);
-                }
-            }
-            else {
-                // no Entry object returned
-                fail && fail(FileError.NOT_FOUND_ERR);
-            }
-        };
-
-    // copy
-    exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
-};
-
-/**
- * Return a URL that can be used to identify this entry.
- */
-Entry.prototype.toURL = function() {
-    // fullPath attribute contains the full URL
-    return this.fullPath;
-};
-
-/**
- * Returns a URI that can be used to identify this entry.
- *
- * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
- * @return uri
- */
-Entry.prototype.toURI = function(mimeType) {
-    console.log("DEPRECATED: Update your code to use 'toURL'");
-    // fullPath attribute contains the full URI
-    return this.toURL();
-};
-
-/**
- * Remove a file or directory. It is an error to attempt to delete a
- * directory that is not empty. It is an error to attempt to delete a
- * root directory of a file system.
- *
- * @param successCallback {Function} called with no parameters
- * @param errorCallback {Function} called with a FileError
- */
-Entry.prototype.remove = function(successCallback, errorCallback) {
-    argscheck.checkArgs('FF', 'Entry.remove', arguments);
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-    exec(successCallback, fail, "File", "remove", [this.fullPath]);
-};
-
-/**
- * Look up the parent DirectoryEntry of this entry.
- *
- * @param successCallback {Function} called with the parent DirectoryEntry object
- * @param errorCallback {Function} called with a FileError
- */
-Entry.prototype.getParent = function(successCallback, errorCallback) {
-    argscheck.checkArgs('FF', 'Entry.getParent', arguments);
-    var win = successCallback && function(result) {
-        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
-        var entry = new DirectoryEntry(result.name, result.fullPath);
-        successCallback(entry);
-    };
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-    exec(win, fail, "File", "getParent", [this.fullPath]);
-};
-
-module.exports = Entry;
-
-});
-
-// file: lib/common/plugin/File.js
-define("cordova/plugin/File", function(require, exports, module) {
-
-/**
- * Constructor.
- * name {DOMString} name of the file, without path information
- * fullPath {DOMString} the full path of the file, including the name
- * type {DOMString} mime type
- * lastModifiedDate {Date} last modified date
- * size {Number} size of the file in bytes
- */
-
-var File = function(name, fullPath, type, lastModifiedDate, size){
-    this.name = name || '';
-    this.fullPath = fullPath || null;
-    this.type = type || null;
-    this.lastModifiedDate = lastModifiedDate || null;
-    this.size = size || 0;
-
-    // These store the absolute start and end for slicing the file.
-    this.start = 0;
-    this.end = this.size;
-};
-
-/**
- * Returns a "slice" of the file. Since Cordova Files don't contain the actual
- * content, this really returns a File with adjusted start and end.
- * Slices of slices are supported.
- * start {Number} The index at which to start the slice (inclusive).
- * end {Number} The index at which to end the slice (exclusive).
- */
-File.prototype.slice = function(start, end) {
-    var size = this.end - this.start;
-    var newStart = 0;
-    var newEnd = size;
-    if (arguments.length) {
-        if (start < 0) {
-            newStart = Math.max(size + start, 0);
-        } else {
-            newStart = Math.min(size, start);
-        }
-    }
-
-    if (arguments.length >= 2) {
-        if (end < 0) {
-            newEnd = Math.max(size + end, 0);
-        } else {
-            newEnd = Math.min(end, size);
-        }
-    }
-
-    var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size);
-    newFile.start = this.start + newStart;
-    newFile.end = this.start + newEnd;
-    return newFile;
-};
-
-
-module.exports = File;
-
-});
-
-// file: lib/common/plugin/FileEntry.js
-define("cordova/plugin/FileEntry", function(require, exports, module) {
-
-var utils = require('cordova/utils'),
-    exec = require('cordova/exec'),
-    Entry = require('cordova/plugin/Entry'),
-    FileWriter = require('cordova/plugin/FileWriter'),
-    File = require('cordova/plugin/File'),
-    FileError = require('cordova/plugin/FileError');
-
-/**
- * An interface representing a file on the file system.
- *
- * {boolean} isFile always true (readonly)
- * {boolean} isDirectory always false (readonly)
- * {DOMString} name of the file, excluding the path leading to it (readonly)
- * {DOMString} fullPath the absolute full path to the file (readonly)
- * {FileSystem} filesystem on which the file resides (readonly)
- */
-var FileEntry = function(name, fullPath) {
-     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
-};
-
-utils.extend(FileEntry, Entry);
-
-/**
- * Creates a new FileWriter associated with the file that this FileEntry represents.
- *
- * @param {Function} successCallback is called with the new FileWriter
- * @param {Function} errorCallback is called with a FileError
- */
-FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
-    this.file(function(filePointer) {
-        var writer = new FileWriter(filePointer);
-
-        if (writer.fileName === null || writer.fileName === "") {
-            errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR));
-        } else {
-            successCallback && successCallback(writer);
-        }
-    }, errorCallback);
-};
-
-/**
- * Returns a File that represents the current state of the file that this FileEntry represents.
- *
- * @param {Function} successCallback is called with the new File object
- * @param {Function} errorCallback is called with a FileError
- */
-FileEntry.prototype.file = function(successCallback, errorCallback) {
-    var win = successCallback && function(f) {
-        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
-        successCallback(file);
-    };
-    var fail = errorCallback && function(code) {
-        errorCallback(new FileError(code));
-    };
-    exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
-};
-
-
-module.exports = FileEntry;
-
-});
-
-// file: lib/common/plugin/FileError.js
-define("cordova/plugin/FileError", function(require, exports, module) {
-
-/**
- * FileError
- */
-function FileError(error) {
-  this.code = error || null;
-}
-
-// File error codes
-// Found in DOMException
-FileError.NOT_FOUND_ERR = 1;
-FileError.SECURITY_ERR = 2;
-FileError.ABORT_ERR = 3;
-
-// Added by File API specification
-FileError.NOT_READABLE_ERR = 4;
-FileError.ENCODING_ERR = 5;
-FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
-FileError.INVALID_STATE_ERR = 7;
-FileError.SYNTAX_ERR = 8;
-FileError.INVALID_MODIFICATION_ERR = 9;
-FileError.QUOTA_EXCEEDED_ERR = 10;
-FileError.TYPE_MISMATCH_ERR = 11;
-FileError.PATH_EXISTS_ERR = 12;
-
-module.exports = FileError;
-
-});
-
-// file: lib/common/plugin/FileReader.js
-define("cordova/plugin/FileReader", function(require, exports, module) {
-
-var exec = require('cordova/exec'),
-    modulemapper = require('cordova/modulemapper'),
-    utils = require('cordova/utils'),
-    File = require('cordova/plugin/File'),
-    FileError = require('cordova/plugin/FileError'),
-    ProgressEvent = require('cordova/plugin/ProgressEvent'),
-    origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader');
-
-/**
- * This class reads the mobile device file system.
- *
- * For Android:
- *      The root directory is the root of the file system.
- *      To read from the SD card, the file name is "sdcard/my_file.txt"
- * @constructor
- */
-var FileReader = function() {
-    this._readyState = 0;
-    this._error = null;
-    this._result = null;
-    this._fileName = '';
-    this._realReader = origFileReader ? new origFileReader() : {};
-};
-
-// States
-FileReader.EMPTY = 0;
-FileReader.LOADING = 1;
-FileReader.DONE = 2;
-
-utils.defineGetter(FileReader.prototype, 'readyState', function() {
-    return this._fileName ? this._readyState : this._realReader.readyState;
-});
-
-utils.defineGetter(FileReader.prototype, 'error', function() {
-    return this._fileName ? this._error: this._realReader.error;
-});
-
-utils.defineGetter(FileReader.prototype, 'result', function() {
-    return this._fileName ? this._result: this._realReader.result;
-});
-
-function defineEvent(eventName) {
-    utils.defineGetterSetter(FileReader.prototype, eventName, function() {
-        return this._realReader[eventName] || null;
-    }, function(value) {
-        this._realReader[eventName] = value;
-    });
-}
-defineEvent('onloadstart');    // When the read starts.
-defineEvent('onprogress');     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
-defineEvent('onload');         // When the read has successfully completed.
-defineEvent('onerror');        // When the read has failed (see errors).
-defineEvent('onloadend');      // When the request has completed (either in success or failure).
-defineEvent('onabort');        // When the read has been aborted. For instance, by invoking the abort() method.
-
-function initRead(reader, file) {
-    // Already loading something
-    if (reader.readyState == FileReader.LOADING) {
-      throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    reader._result = null;
-    reader._error = null;
-    reader._readyState = FileReader.LOADING;
-
-    if (typeof file.fullPath == 'string') {
-        reader._fileName = file.fullPath;
-    } else {
-        reader._fileName = '';
-        return true;
-    }
-
-    reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader}));
-}
-
-/**
- * Abort reading file.
- */
-FileReader.prototype.abort = function() {
-    if (origFileReader && !this._fileName) {
-        return this._realReader.abort();
-    }
-    this._result = null;
-
-    if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) {
-      return;
-    }
-
-    this._readyState = FileReader.DONE;
-
-    // If abort callback
-    if (typeof this.onabort === 'function') {
-        this.onabort(new ProgressEvent('abort', {target:this}));
-    }
-    // If load end callback
-    if (typeof this.onloadend === 'function') {
-        this.onloadend(new ProgressEvent('loadend', {target:this}));
-    }
-};
-
-/**
- * Read text file.
- *
- * @param file          {File} File object containing file properties
- * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
- */
-FileReader.prototype.readAsText = function(file, encoding) {
-    if (initRead(this, file)) {
-        return this._realReader.readAsText(file, encoding);
-    }
-
-    // Default encoding is UTF-8
-    var enc = encoding ? encoding : "UTF-8";
-    var me = this;
-    var execArgs = [this._fileName, enc, file.start, file.end];
-
-    // Read file
-    exec(
-        // Success callback
-        function(r) {
-            // If DONE (cancelled), then don't do anything
-            if (me._readyState === FileReader.DONE) {
-                return;
-            }
-
-            // Save result
-            me._result = r;
-
-            // If onload callback
-            if (typeof me.onload === "function") {
-                me.onload(new ProgressEvent("load", {target:me}));
-            }
-
-            // DONE state
-            me._readyState = FileReader.DONE;
-
-            // If onloadend callback
-            if (typeof me.onloadend === "function") {
-                me.onloadend(new ProgressEvent("loadend", {target:me}));
-            }
-        },
-        // Error callback
-        function(e) {
-            // If DONE (cancelled), then don't do anything
-            if (me._readyState === FileReader.DONE) {
-                return;
-            }
-
-            // DONE state
-            me._readyState = FileReader.DONE;
-
-            // null result
-            me._result = null;
-
-            // Save error
-            me._error = new FileError(e);
-
-            // If onerror callback
-            if (typeof me.onerror === "function") {
-                me.onerror(new ProgressEvent("error", {target:me}));
-            }
-
-            // If onloadend callback
-            if (typeof me.onloadend === "function") {
-                me.onloadend(new ProgressEvent("loadend", {target:me}));
-            }
-        }, "File", "readAsText", execArgs);
-};
-
-
-/**
- * Read file and return data as a base64 encoded data url.
- * A data url is of the form:
- *      data:[<mediatype>][;base64],<data>
- *
- * @param file          {File} File object containing file properties
- */
-FileReader.prototype.readAsDataURL = function(file) {
-    if (initRead(this, file)) {
-        return this._realReader.readAsDataURL(file);
-    }
-
-    var me = this;
-    var execArgs = [this._fileName, file.start, file.end];
-
-    // Read file
-    exec(
-        // Success callback
-        function(r) {
-            // If DONE (cancelled), then don't do anything
-            if (me._readyState === FileReader.DONE) {
-                return;
-            }
-
-            // DONE state
-            me._readyState = FileReader.DONE;
-
-            // Save result
-            me._result = r;
-
-            // If onload callback
-            if (typeof me.onload === "function") {
-                me.onload(new ProgressEvent("load", {target:me}));
-            }
-
-            // If onloadend callback
-            if (typeof me.onloadend === "function") {
-                me.onloadend(new ProgressEvent("loadend", {target:me}));
-            }
-        },
-        // Error callback
-        function(e) {
-            // If DONE (cancelled), then don't do anything
-            if (me._readyState === FileReader.DONE) {
-                return;
-            }
-
-            // DONE state
-            me._readyState = FileReader.DONE;
-
-            me._result = null;
-
-            // Save error
-            me._error = new FileError(e);
-
-            // If onerror callback
-            if (typeof me.onerror === "function") {
-                me.onerror(new ProgressEvent("error", {target:me}));
-            }
-
-            // If onloadend callback
-            if (typeof me.onloadend === "function") {
-                me.onloadend(new ProgressEvent("loadend", {target:me}));
-            }
-        }, "File", "readAsDataURL", execArgs);
-};
-
-/**
- * Read file and return data as a binary data.
- *
- * @param file          {File} File object containing file properties
- */
-FileReader.prototype.readAsBinaryString = function(file) {
-    if (initRead(this, file)) {
-        return this._realReader.readAsBinaryString(file);
-    }
-
-    var me = this;
-    var execArgs = [this._fileName, file.start, file.end];
-
-    // Read file
-    exec(
-        // Success callback
-        function(r) {
-            // If DONE (cancelled), then don't do anything
-            if (me._readyState === FileReader.DONE) {
-                return;
-            }
-
-            // DONE state
-            me._readyState = FileReader.DONE;
-
-            me._result = r;
-
-            // If onload callback
-            if (typeof me.onload === "function") {
-                me.onload(new ProgressEvent("load", {target:me}));
-            }
-
-            // If onloadend callback
-            if (typeof me.onloadend === "function") {
-                me.onloadend(new ProgressEvent("loadend", {target:me}));
-            }
-        },
-        // Error callback
-        function(e) {
-            // If DONE (cancelled), then don't do anything
-            if (me._readyState === FileReader.DONE) {
-                return;
-            }
-
-            // DONE state
-            me._readyState = FileReader.DONE;
-
-            me._result = null;
-
-            // Save error
-            me._error = new FileError(e);
-
-            // If onerror callback
-            if (typeof me.onerror === "function") {
-                me.onerror(new ProgressEvent("error", {target:me}));
-            }
-
-            // If onloadend callback
-            if (typeof me.onloadend === "function") {
-                me.onloadend(new ProgressEvent("loadend", {target:me}));
-            }
-        }, "File", "readAsBinaryString", execArgs);
-};
-
-/**
- * Read file and return data as a binary data.
- *
- * @param file          {File} File object containing file properties
- */
-FileReader.prototype.readAsArrayBuffer = function(file) {
-    if (initRead(this, file)) {
-        return this._realReader.readAsArrayBuffer(file);
-    }
-
-    var me = this;
-    var execArgs = [this._fileName, file.start, file.end];
-
-    // Read file
-    exec(
-        // Success callback
-        function(r) {
-            // If DONE (cancelled), then don't do anything
-            if (me._readyState === FileReader.DONE) {
-                return;
-            }
-
-            // DONE state
-            me._readyState = FileReader.DONE;
-
-            me._result = r;
-
-            // If onload callback
-            if (typeof me.onload === "function") {
-                me.onload(new ProgressEvent("load", {target:me}));
-            }
-
-            // If onloadend callback
-            if (typeof me.onloadend === "function") {
-                me.onloadend(new ProgressEvent("loadend", {target:me}));
-            }
-        },
-        // Error callback
-        function(e) {
-            // If DONE (cancelled), then don't do anything
-            if (me._readyState === FileReader.DONE) {
-                return;
-            }
-
-            // DONE state
-            me._readyState = FileReader.DONE;
-
-            me._result = null;
-
-            // Save error
-            me._error = new FileError(e);
-
-            // If onerror callback
-            if (typeof me.onerror === "function") {
-                me.onerror(new ProgressEvent("error", {target:me}));
-            }
-
-            // If onloadend callback
-            if (typeof me.onloadend === "function") {
-                me.onloadend(new ProgressEvent("loadend", {target:me}));
-            }
-        }, "File", "readAsArrayBuffer", execArgs);
-};
-
-module.exports = FileReader;
-
-});
-
-// file: lib/common/plugin/FileSystem.js
-define("cordova/plugin/FileSystem", function(require, exports, module) {
-
-var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
-
-/**
- * An interface representing a file system
- *
- * @constructor
- * {DOMString} name the unique name of the file system (readonly)
- * {DirectoryEntry} root directory of the file system (readonly)
- */
-var FileSystem = function(name, root) {
-    this.name = name || null;
-    if (root) {
-        this.root = new DirectoryEntry(root.name, root.fullPath);
-    }
-};
-
-module.exports = FileSystem;
-
-});
-
-// file: lib/common/plugin/FileTransfer.js
-define("cordova/plugin/FileTransfer", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    exec = require('cordova/exec'),
-    FileTransferError = require('cordova/plugin/FileTransferError'),
-    ProgressEvent = require('cordova/plugin/ProgressEvent');
-
-function newProgressEvent(result) {
-    var pe = new ProgressEvent();
-    pe.lengthComputable = result.lengthComputable;
-    pe.loaded = result.loaded;
-    pe.total = result.total;
-    return pe;
-}
-
-function getBasicAuthHeader(urlString) {
-    var header =  null;
-
-    if (window.btoa) {
-        // parse the url using the Location object
-        var url = document.createElement('a');
-        url.href = urlString;
-
-        var credentials = null;
-        var protocol = url.protocol + "//";
-        var origin = protocol + url.host;
-
-        // check whether there are the username:password credentials in the url
-        if (url.href.indexOf(origin) !== 0) { // credentials found
-            var atIndex = url.href.indexOf("@");
-            credentials = url.href.substring(protocol.length, atIndex);
-        }
-
-        if (credentials) {
-            var authHeader = "Authorization";
-            var authHeaderValue = "Basic " + window.btoa(credentials);
-
-            header = {
-                name : authHeader,
-                value : authHeaderValue
-            };
-        }
-    }
-
-    return header;
-}
-
-var idCounter = 0;
-
-/**
- * FileTransfer uploads a file to a remote server.
- * @constructor
- */
-var FileTransfer = function() {
-    this._id = ++idCounter;
-    this.onprogress = null; // optional callback
-};
-
-/**
-* Given an absolute file path, uploads a file on the device to a remote server
-* using a multipart HTTP request.
-* @param filePath {String}           Full path of the file on the device
-* @param server {String}             URL of the server to receive the file
-* @param successCallback (Function}  Callback to be invoked when upload has completed
-* @param errorCallback {Function}    Callback to be invoked upon error
-* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
-* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
-*/
-FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
-    argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments);
-    // check for options
-    var fileKey = null;
-    var fileName = null;
-    var mimeType = null;
-    var params = null;
-    var chunkedMode = true;
-    var headers = null;
-    var httpMethod = null;
-    var basicAuthHeader = getBasicAuthHeader(server);
-    if (basicAuthHeader) {
-        options = options || {};
-        options.headers = options.headers || {};
-        options.headers[basicAuthHeader.name] = basicAuthHeader.value;
-    }
-
-    if (options) {
-        fileKey = options.fileKey;
-        fileName = options.fileName;
-        mimeType = options.mimeType;
-        headers = options.headers;
-        httpMethod = options.httpMethod || "POST";
-        if (httpMethod.toUpperCase() == "PUT"){
-            httpMethod = "PUT";
-        } else {
-            httpMethod = "POST";
-        }
-        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
-            chunkedMode = options.chunkedMode;
-        }
-        if (options.params) {
-            params = options.params;
-        }
-        else {
-            params = {};
-        }
-    }
-
-    var fail = errorCallback && function(e) {
-        var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body);
-        errorCallback(error);
-    };
-
-    var self = this;
-    var win = function(result) {
-        if (typeof result.lengthComputable != "undefined") {
-            if (self.onprogress) {
-                self.onprogress(newProgressEvent(result));
-            }
-        } else {
-            successCallback && successCallback(result);
-        }
-    };
-    exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]);
-};
-
-/**
- * Downloads a file form a given URL and saves it to the specified directory.
- * @param source {String}          URL of the server to receive the file
- * @param target {String}         Full path of the file on the device
- * @param successCallback (Function}  Callback to be invoked when upload has completed
- * @param errorCallback {Function}    Callback to be invoked upon error
- * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
- * @param options {FileDownloadOptions} Optional parameters such as headers
- */
-FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) {
-    argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments);
-    var self = this;
-
-    var basicAuthHeader = getBasicAuthHeader(source);
-    if (basicAuthHeader) {
-        options = options || {};
-        options.headers = options.headers || {};
-        options.headers[basicAuthHeader.name] = basicAuthHeader.value;
-    }
-
-    var headers = null;
-    if (options) {
-        headers = options.headers || null;
-    }
-
-    var win = function(result) {
-        if (typeof result.lengthComputable != "undefined") {
-            if (self.onprogress) {
-                return self.onprogress(newProgressEvent(result));
-            }
-        } else if (successCallback) {
-            var entry = null;
-            if (result.isDirectory) {
-                entry = new (require('cordova/plugin/DirectoryEntry'))();
-            }
-            else if (result.isFile) {
-                entry = new (require('cordova/plugin/FileEntry'))();
-            }
-            entry.isDirectory = result.isDirectory;
-            entry.isFile = result.isFile;
-            entry.name = result.name;
-            entry.fullPath = result.fullPath;
-            successCallback(entry);
-        }
-    };
-
-    var fail = errorCallback && function(e) {
-        var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body);
-        errorCallback(error);
-    };
-
-    exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]);
-};
-
-/**
- * Aborts the ongoing file transfer on this object. The original error
- * callback for the file transfer will be called if necessary.
- */
-FileTransfer.prototype.abort = function() {
-    exec(null, null, 'FileTransfer', 'abort', [this._id]);
-};
-
-module.exports = FileTransfer;
-
-});
-
-// file: lib/common/plugin/FileTransferError.js
-define("cordova/plugin/FileTransferError", function(require, exports, module) {
-
-/**
- * FileTransferError
- * @constructor
- */
-var FileTransferError = function(code, source, target, status, body) {
-    this.code = code || null;
-    this.source = source || null;
-    this.target = target || null;
-    this.http_status = status || null;
-    this.body = body || null;
-};
-
-FileTransferError.FILE_NOT_FOUND_ERR = 1;
-FileTransferError.INVALID_URL_ERR = 2;
-FileTransferError.CONNECTION_ERR = 3;
-FileTransferError.ABORT_ERR = 4;
-
-module.exports = FileTransferError;
-
-});
-
-// file: lib/common/plugin/FileUploadOptions.js
-define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
-
-/**
- * Options to customize the HTTP request used to upload files.
- * @constructor
- * @param fileKey {String}   Name of file request parameter.
- * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
- * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
- * @param params {Object}    Object with key: value params to send to the server.
- * @param headers {Object}   Keys are header names, values are header values. Multiple
- *                           headers of the same name are not supported.
- */
-var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers, httpMethod) {
-    this.fileKey = fileKey || null;
-    this.fileName = fileName || null;
-    this.mimeType = mimeType || null;
-    this.params = params || null;
-    this.headers = headers || null;
-    this.httpMethod = httpMethod || null;
-};
-
-module.exports = FileUploadOptions;
-
-});
-
-// file: lib/common/plugin/FileUploadResult.js
-define("cordova/plugin/FileUploadResult", function(require, exports, module) {
-
-/**
- * FileUploadResult
- * @constructor
- */
-var FileUploadResult = function() {
-    this.bytesSent = 0;
-    this.responseCode = null;
-    this.response = null;
-};
-
-module.exports = FileUploadResult;
-
-});
-
-// file: lib/common/plugin/FileWriter.js
-define("cordova/plugin/FileWriter", function(require, exports, module) {
-
-var exec = require('cordova/exec'),
-    FileError = require('cordova/plugin/FileError'),
-    ProgressEvent = require('cordova/plugin/ProgressEvent');
-
-/**
- * This class writes to the mobile device file system.
- *
- * For Android:
- *      The root directory is the root of the file system.
- *      To write to the SD card, the file name is "sdcard/my_file.txt"
- *
- * @constructor
- * @param file {File} File object containing file properties
- * @param append if true write to the end of the file, otherwise overwrite the file
- */
-var FileWriter = function(file) {
-    this.fileName = "";
-    this.length = 0;
-    if (file) {
-        this.fileName = file.fullPath || file;
-        this.length = file.size || 0;
-    }
-    // default is to write at the beginning of the file
-    this.position = 0;
-
-    this.readyState = 0; // EMPTY
-
-    this.result = null;
-
-    // Error
-    this.error = null;
-
-    // Event handlers
-    this.onwritestart = null;   // When writing starts
-    this.onprogress = null;     // While writing the file, and reporting partial file data
-    this.onwrite = null;        // When the write has successfully completed.
-    this.onwriteend = null;     // When the request has completed (either in success or failure).
-    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
-    this.onerror = null;        // When the write has failed (see errors).
-};
-
-// States
-FileWriter.INIT = 0;
-FileWriter.WRITING = 1;
-FileWriter.DONE = 2;
-
-/**
- * Abort writing file.
- */
-FileWriter.prototype.abort = function() {
-    // check for invalid state
-    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    // set error
-    this.error = new FileError(FileError.ABORT_ERR);
-
-    this.readyState = FileWriter.DONE;
-
-    // If abort callback
-    if (typeof this.onabort === "function") {
-        this.onabort(new ProgressEvent("abort", {"target":this}));
-    }
-
-    // If write end callback
-    if (typeof this.onwriteend === "function") {
-        this.onwriteend(new ProgressEvent("writeend", {"target":this}));
-    }
-};
-
-/**
- * Writes data to the file
- *
- * @param text to be written
- */
-FileWriter.prototype.write = function(text) {
-    // Throw an exception if we are already writing a file
-    if (this.readyState === FileWriter.WRITING) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    // WRITING state
-    this.readyState = FileWriter.WRITING;
-
-    var me = this;
-
-    // If onwritestart callback
-    if (typeof me.onwritestart === "function") {
-        me.onwritestart(new ProgressEvent("writestart", {"target":me}));
-    }
-
-    // Write file
-    exec(
-        // Success callback
-        function(r) {
-            // If DONE (cancelled), then don't do anything
-            if (me.readyState === FileWriter.DONE) {
-                return;
-            }
-
-            // position always increases by bytes written because file would be extended
-            me.position += r;
-            // The length of the file is now where we are done writing.
-
-            me.length = me.position;
-
-            // DONE state
-            me.readyState = FileWriter.DONE;
-
-            // If onwrite callback
-            if (typeof me.onwrite === "function") {
-                me.onwrite(new ProgressEvent("write", {"target":me}));
-            }
-
-            // If onwriteend callback
-            if (typeof me.onwriteend === "function") {
-                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
-            }
-        },
-        // Error callback
-        function(e) {
-            // If DONE (cancelled), then don't do anything
-            if (me.readyState === FileWriter.DONE) {
-                return;
-            }
-
-            // DONE state
-            me.readyState = FileWriter.DONE;
-
-            // Save error
-            me.error = new FileError(e);
-
-            // If onerror callback
-            if (typeof me.onerror === "function") {
-                me.onerror(new ProgressEvent("error", {"target":me}));
-            }
-
-            // If onwriteend callback
-            if (typeof me.onwriteend === "function") {
-                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
-            }
-        }, "File", "write", [this.fileName, text, this.position]);
-};
-
-/**
- * Moves the file pointer to the location specified.
- *
- * If the offset is a negative number the position of the file
- * pointer is rewound.  If the offset is greater than the file
- * size the position is set to the end of the file.
- *
- * @param offset is the location to move the file pointer to.
- */
-FileWriter.prototype.seek = function(offset) {
-    // Throw an exception if we are already writing a file
-    if (this.readyState === FileWriter.WRITING) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    if (!offset && offset !== 0) {
-        return;
-    }
-
-    // See back from end of file.
-    if (offset < 0) {
-        this.position = Math.max(offset + this.length, 0);
-    }
-    // Offset is bigger than file size so set position
-    // to the end of the file.
-    else if (offset > this.length) {
-        this.position = this.length;
-    }
-    // Offset is between 0 and file size so set the position
-    // to start writing.
-    else {
-        this.position = offset;
-    }
-};
-
-/**
- * Truncates the file to the size specified.
- *
- * @param size to chop the file at.
- */
-FileWriter.prototype.truncate = function(size) {
-    // Throw an exception if we are already writing a file
-    if (this.readyState === FileWriter.WRITING) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    // WRITING state
-    this.readyState = FileWriter.WRITING;
-
-    var me = this;
-
-    // If onwritestart callback
-    if (typeof me.onwritestart === "function") {
-        me.onwritestart(new ProgressEvent("writestart", {"target":this}));
-    }
-
-    // Write file
-    exec(
-        // Success callback
-        function(r) {
-            // If DONE (cancelled), then don't do anything
-            if (me.readyState === FileWriter.DONE) {
-                return;
-            }
-
-            // DONE state
-            me.readyState = FileWriter.DONE;
-
-            // Update the length of the file
-            me.length = r;
-            me.position = Math.min(me.position, r);
-
-            // If onwrite callback
-            if (typeof me.onwrite === "function") {
-                me.onwrite(new ProgressEvent("write", {"target":me}));
-            }
-
-            // If onwriteend callback
-            if (typeof me.onwriteend === "function") {
-                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
-            }
-        },
-        // Error callback
-        function(e) {
-            // If DONE (cancelled), then don't do anything
-            if (me.readyState === FileWriter.DONE) {
-                return;
-            }
-
-            // DONE state
-            me.readyState = FileWriter.DONE;
-
-            // Save error
-            me.error = new FileError(e);
-
-            // If onerror callback
-            if (typeof me.onerror === "function") {
-                me.onerror(new ProgressEvent("error", {"target":me}));
-            }
-
-            // If onwriteend callback
-            if (typeof me.onwriteend === "function") {
-                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
-            }
-        }, "File", "truncate", [this.fileName, size]);
-};
-
-module.exports = FileWriter;
-
-});
-
-// file: lib/common/plugin/Flags.js
-define("cordova/plugin/Flags", function(require, exports, module) {
-
-/**
- * Supplies arguments to methods that lookup or create files and directories.
- *
- * @param create
- *            {boolean} file or directory if it doesn't exist
- * @param exclusive
- *            {boolean} used with create; if true the command will fail if
- *            target path exists
- */
-function Flags(create, exclusive) {
-    this.create = create || false;
-    this.exclusive = exclusive || false;
-}
-
-module.exports = Flags;
-
-});
-
-// file: lib/common/plugin/LocalFileSystem.js
-define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-
-/**
- * Represents a local file system.
- */
-var LocalFileSystem = function() {
-
-};
-
-LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
-LocalFileSystem.PERSISTENT = 1; //persistent
-
-module.exports = LocalFileSystem;
-
-});
-
-// file: lib/common/plugin/Media.js
-define("cordova/plugin/Media", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    utils = require('cordova/utils'),
-    exec = require('cordova/exec');
-
-var mediaObjects = {};
-
-/**
- * This class provides access to the device media, interfaces to both sound and video
- *
- * @constructor
- * @param src                   The file name or url to play
- * @param successCallback       The callback to be called when the file is done playing or recording.
- *                                  successCallback()
- * @param errorCallback         The callback to be called if there is an error.
- *                                  errorCallback(int errorCode) - OPTIONAL
- * @param statusCallback        The callback to be called when media status has changed.
- *                                  statusCallback(int statusCode) - OPTIONAL
- */
-var Media = function(src, successCallback, errorCallback, statusCallback) {
-    argscheck.checkArgs('SFFF', 'Media', arguments);
-    this.id = utils.createUUID();
-    mediaObjects[this.id] = this;
-    this.src = src;
-    this.successCallback = successCallback;
-    this.errorCallback = errorCallback;
-    this.statusCallback = statusCallback;
-    this._duration = -1;
-    this._position = -1;
-    exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
-};
-
-// Media messages
-Media.MEDIA_STATE = 1;
-Media.MEDIA_DURATION = 2;
-Media.MEDIA_POSITION = 3;
-Media.MEDIA_ERROR = 9;
-
-// Media states
-Media.MEDIA_NONE = 0;
-Media.MEDIA_STARTING = 1;
-Media.MEDIA_RUNNING = 2;
-Media.MEDIA_PAUSED = 3;
-Media.MEDIA_STOPPED = 4;
-Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"];
-
-// "static" function to return existing objs.
-Media.get = function(id) {
-    return mediaObjects[id];
-};
-
-/**
- * Start or resume playing audio file.
- */
-Media.prototype.play = function(options) {
-    exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]);
-};
-
-/**
- * Stop playing audio file.
- */
-Media.prototype.stop = function() {
-    var me = this;
-    exec(function() {
-        me._position = 0;
-    }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
-};
-
-/**
- * Seek or jump to a new time in the track..
- */
-Media.prototype.seekTo = function(milliseconds) {
-    var me = this;
-    exec(function(p) {
-        me._position = p;
-    }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]);
-};
-
-/**
- * Pause playing audio file.
- */
-Media.prototype.pause = function() {
-    exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]);
-};
-
-/**
- * Get duration of an audio file.
- * The duration is only set for audio that is playing, paused or stopped.
- *
- * @return      duration or -1 if not known.
- */
-Media.prototype.getDuration = function() {
-    return this._duration;
-};
-
-/**
- * Get position of audio.
- */
-Media.prototype.getCurrentPosition = function(success, fail) {
-    var me = this;
-    exec(function(p) {
-        me._position = p;
-        success(p);
-    }, fail, "Media", "getCurrentPositionAudio", [this.id]);
-};
-
-/**
- * Start recording audio file.
- */
-Media.prototype.startRecord = function() {
-    exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
-};
-
-/**
- * Stop recording audio file.
- */
-Media.prototype.stopRecord = function() {
-    exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
-};
-
-/**
- * Release the resources.
- */
-Media.prototype.release = function() {
-    exec(null, this.errorCallback, "Media", "release", [this.id]);
-};
-
-/**
- * Adjust the volume.
- */
-Media.prototype.setVolume = function(volume) {
-    exec(null, null, "Media", "setVolume", [this.id, volume]);
-};
-
-/**
- * Audio has status update.
- * PRIVATE
- *
- * @param id            The media object id (string)
- * @param msgType       The 'type' of update this is
- * @param value         Use of value is determined by the msgType
- */
-Media.onStatus = function(id, msgType, value) {
-
-    var media = mediaObjects[id];
-
-    if(media) {
-        switch(msgType) {
-            case Media.MEDIA_STATE :
-                media.statusCallback && media.statusCallback(value);
-                if(value == Media.MEDIA_STOPPED) {
-                    media.successCallback && media.successCallback();
-                }
-                break;
-            case Media.MEDIA_DURATION :
-                media._duration = value;
-                break;
-            case Media.MEDIA_ERROR :
-                media.errorCallback && media.errorCallback(value);
-                break;
-            case Media.MEDIA_POSITION :
-                media._position = Number(value);
-                break;
-            default :
-                console.error && console.error("Unhandled Media.onStatus :: " + msgType);
-                break;
-        }
-    }
-    else {
-         console.error && console.error("Received Media.onStatus callback for unknown media :: " + id);
-    }
-
-};
-
-module.exports = Media;
-
-});
-
-// file: lib/common/plugin/MediaError.js
-define("cordova/plugin/MediaError", function(require, exports, module) {
-
-/**
- * This class contains information about any Media errors.
-*/
-/*
- According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror
- We should never be creating these objects, we should just implement the interface
- which has 1 property for an instance, 'code'
-
- instead of doing :
-    errorCallbackFunction( new MediaError(3,'msg') );
-we should simply use a literal :
-    errorCallbackFunction( {'code':3} );
- */
-
- var _MediaError = window.MediaError;
-
-
-if(!_MediaError) {
-    window.MediaError = _MediaError = function(code, msg) {
-        this.code = (typeof code != 'undefined') ? code : null;
-        this.message = msg || ""; // message is NON-standard! do not use!
-    };
-}
-
-_MediaError.MEDIA_ERR_NONE_ACTIVE    = _MediaError.MEDIA_ERR_NONE_ACTIVE    || 0;
-_MediaError.MEDIA_ERR_ABORTED        = _MediaError.MEDIA_ERR_ABORTED        || 1;
-_MediaError.MEDIA_ERR_NETWORK        = _MediaError.MEDIA_ERR_NETWORK        || 2;
-_MediaError.MEDIA_ERR_DECODE         = _MediaError.MEDIA_ERR_DECODE         || 3;
-_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4;
-// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below.
-// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes
-_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4;
-
-module.exports = _MediaError;
-
-});
-
-// file: lib/common/plugin/MediaFile.js
-define("cordova/plugin/MediaFile", function(require, exports, module) {
-
-var utils = require('cordova/utils'),
-    exec = require('cordova/exec'),
-    File = require('cordova/plugin/File'),
-    CaptureError = require('cordova/plugin/CaptureError');
-/**
- * Represents a single file.
- *
- * name {DOMString} name of the file, without path information
- * fullPath {DOMString} the full path of the file, including the name
- * type {DOMString} mime type
- * lastModifiedDate {Date} last modified date
- * size {Number} size of the file in bytes
- */
-var MediaFile = function(name, fullPath, type, lastModifiedDate, size){
-    MediaFile.__super__.constructor.apply(this, arguments);
-};
-
-utils.extend(MediaFile, File);
-
-/**
- * Request capture format data for a specific file and type
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- */
-MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
-    if (typeof this.fullPath === "undefined" || this.fullPath === null) {
-        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
-    } else {
-        exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]);
-    }
-};
-
-module.exports = MediaFile;
-
-});
-
-// file: lib/common/plugin/MediaFileData.js
-define("cordova/plugin/MediaFileData", function(require, exports, module) {
-
-/**
- * MediaFileData encapsulates format information of a media file.
- *
- * @param {DOMString} codecs
- * @param {long} bitrate
- * @param {long} height
- * @param {long} width
- * @param {float} duration
- */
-var MediaFileData = function(codecs, bitrate, height, width, duration){
-    this.codecs = codecs || null;
-    this.bitrate = bitrate || 0;
-    this.height = height || 0;
-    this.width = width || 0;
-    this.duration = duration || 0;
-};
-
-module.exports = MediaFileData;
-
-});
-
-// file: lib/common/plugin/Metadata.js
-define("cordova/plugin/Metadata", function(require, exports, module) {
-
-/**
- * Information about the state of the file or directory
- *
- * {Date} modificationTime (readonly)
- */
-var Metadata = function(time) {
-    this.modificationTime = (typeof time != 'undefined'?new Date(time):null);
-};
-
-module.exports = Metadata;
-
-});
-
-// file: lib/common/plugin/ProgressEvent.js
-define("cordova/plugin/ProgressEvent", function(require, exports, module) {
-
-// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
-// Feature test: See if we can instantiate a native ProgressEvent;
-// if so, use that approach,
-// otherwise fill-in with our own implementation.
-//
-// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
-var ProgressEvent = (function() {
-    /*
-    var createEvent = function(data) {
-        var event = document.createEvent('Events');
-        event.initEvent('ProgressEvent', false, false);
-        if (data) {
-            for (var i in data) {
-                if (data.hasOwnProperty(i)) {
-                    event[i] = data[i];
-                }
-            }
-            if (data.target) {
-                // TODO: cannot call <some_custom_object>.dispatchEvent
-                // need to first figure out how to implement EventTarget
-            }
-        }
-        return event;
-    };
-    try {
-        var ev = createEvent({type:"abort",target:document});
-        return function ProgressEvent(type, data) {
-            data.type = type;
-            return createEvent(data);
-        };
-    } catch(e){
-    */
-        return function ProgressEvent(type, dict) {
-            this.type = type;
-            this.bubbles = false;
-            this.cancelBubble = false;
-            this.cancelable = false;
-            this.lengthComputable = false;
-            this.loaded = dict && dict.loaded ? dict.loaded : 0;
-            this.total = dict && dict.total ? dict.total : 0;
-            this.target = dict && dict.target ? dict.target : null;
-        };
-    //}
-})();
-
-module.exports = ProgressEvent;
-
-});
-
 // file: lib/android/plugin/android/app.js
 define("cordova/plugin/android/app", function(require, exports, module) {
 
@@ -3514,100 +1612,6 @@ modulemapper.clobbers('cordova/plugin/android/storage/openDatabase', 'openDataba
 
 });
 
-// file: lib/common/plugin/capture.js
-define("cordova/plugin/capture", function(require, exports, module) {
-
-var exec = require('cordova/exec'),
-    MediaFile = require('cordova/plugin/MediaFile');
-
-/**
- * Launches a capture of different types.
- *
- * @param (DOMString} type
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureVideoOptions} options
- */
-function _capture(type, successCallback, errorCallback, options) {
-    var win = function(pluginResult) {
-        var mediaFiles = [];
-        var i;
-        for (i = 0; i < pluginResult.length; i++) {
-            var mediaFile = new MediaFile();
-            mediaFile.name = pluginResult[i].name;
-            mediaFile.fullPath = pluginResult[i].fullPath;
-            mediaFile.type = pluginResult[i].type;
-            mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
-            mediaFile.size = pluginResult[i].size;
-            mediaFiles.push(mediaFile);
-        }
-        successCallback(mediaFiles);
-    };
-    exec(win, errorCallback, "Capture", type, [options]);
-}
-/**
- * The Capture interface exposes an interface to the camera and microphone of the hosting device.
- */
-function Capture() {
-    this.supportedAudioModes = [];
-    this.supportedImageModes = [];
-    this.supportedVideoModes = [];
-}
-
-/**
- * Launch audio recorder application for recording audio clip(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureAudioOptions} options
- */
-Capture.prototype.captureAudio = function(successCallback, errorCallback, options){
-    _capture("captureAudio", successCallback, errorCallback, options);
-};
-
-/**
- * Launch camera application for taking image(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureImageOptions} options
- */
-Capture.prototype.captureImage = function(successCallback, errorCallback, options){
-    _capture("captureImage", successCallback, errorCallback, options);
-};
-
-/**
- * Launch device camera application for recording video(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureVideoOptions} options
- */
-Capture.prototype.captureVideo = function(successCallback, errorCallback, options){
-    _capture("captureVideo", successCallback, errorCallback, options);
-};
-
-
-module.exports = new Capture();
-
-});
-
-// file: lib/common/plugin/capture/symbols.js
-define("cordova/plugin/capture/symbols", function(require, exports, module) {
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/CaptureError', 'CaptureError');
-modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions');
-modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions');
-modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions');
-modulemapper.clobbers('cordova/plugin/ConfigurationData', 'ConfigurationData');
-modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile');
-modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData');
-modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture');
-
-});
-
 // file: lib/common/plugin/console-via-logger.js
 define("cordova/plugin/console-via-logger", function(require, exports, module) {
 
@@ -3818,53 +1822,6 @@ module.exports = function(successCallback, errorCallback, message, forceAsync) {
 
 });
 
-// file: lib/android/plugin/file/symbols.js
-define("cordova/plugin/file/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper'),
-    symbolshelper = require('cordova/plugin/file/symbolshelper');
-
-symbolshelper(modulemapper.clobbers);
-
-});
-
-// file: lib/common/plugin/file/symbolshelper.js
-define("cordova/plugin/file/symbolshelper", function(require, exports, module) {
-
-module.exports = function(exportFunc) {
-    exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry');
-    exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader');
-    exportFunc('cordova/plugin/Entry', 'Entry');
-    exportFunc('cordova/plugin/File', 'File');
-    exportFunc('cordova/plugin/FileEntry', 'FileEntry');
-    exportFunc('cordova/plugin/FileError', 'FileError');
-    exportFunc('cordova/plugin/FileReader', 'FileReader');
-    exportFunc('cordova/plugin/FileSystem', 'FileSystem');
-    exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions');
-    exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult');
-    exportFunc('cordova/plugin/FileWriter', 'FileWriter');
-    exportFunc('cordova/plugin/Flags', 'Flags');
-    exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem');
-    exportFunc('cordova/plugin/Metadata', 'Metadata');
-    exportFunc('cordova/plugin/ProgressEvent', 'ProgressEvent');
-    exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem');
-    exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI');
-};
-
-});
-
-// file: lib/common/plugin/filetransfer/symbols.js
-define("cordova/plugin/filetransfer/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.clobbers('cordova/plugin/FileTransfer', 'FileTransfer');
-modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError');
-
-});
-
 // file: lib/common/plugin/logger.js
 define("cordova/plugin/logger", function(require, exports, module) {
 
@@ -4205,112 +2162,6 @@ modulemapper.clobbers('cordova/plugin/logger', 'cordova.logger');
 
 });
 
-// file: lib/android/plugin/media/symbols.js
-define("cordova/plugin/media/symbols", function(require, exports, module) {
-
-
-var modulemapper = require('cordova/modulemapper');
-
-modulemapper.defaults('cordova/plugin/Media', 'Media');
-modulemapper.clobbers('cordova/plugin/MediaError', 'MediaError');
-
-});
-
-// file: lib/common/plugin/requestFileSystem.js
-define("cordova/plugin/requestFileSystem", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    FileError = require('cordova/plugin/FileError'),
-    FileSystem = require('cordova/plugin/FileSystem'),
-    exec = require('cordova/exec');
-
-/**
- * Request a file system in which to store application data.
- * @param type  local file system type
- * @param size  indicates how much storage space, in bytes, the application expects to need
- * @param successCallback  invoked with a FileSystem object
- * @param errorCallback  invoked if error occurs retrieving file system
- */
-var requestFileSystem = function(type, size, successCallback, errorCallback) {
-    argscheck.checkArgs('nnFF', 'requestFileSystem', arguments);
-    var fail = function(code) {
-        errorCallback && errorCallback(new FileError(code));
-    };
-
-    if (type < 0 || type > 3) {
-        fail(FileError.SYNTAX_ERR);
-    } else {
-        // if successful, return a FileSystem object
-        var success = function(file_system) {
-            if (file_system) {
-                if (successCallback) {
-                    // grab the name and root from the file system object
-                    var result = new FileSystem(file_system.name, file_system.root);
-                    successCallback(result);
-                }
-            }
-            else {
-                // no FileSystem object returned
-                fail(FileError.NOT_FOUND_ERR);
-            }
-        };
-        exec(success, fail, "File", "requestFileSystem", [type, size]);
-    }
-};
-
-module.exports = requestFileSystem;
-
-});
-
-// file: lib/common/plugin/resolveLocalFileSystemURI.js
-define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) {
-
-var argscheck = require('cordova/argscheck'),
-    DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
-    FileEntry = require('cordova/plugin/FileEntry'),
-    FileError = require('cordova/plugin/FileError'),
-    exec = require('cordova/exec');
-
-/**
- * Look up file system Entry referred to by local URI.
- * @param {DOMString} uri  URI referring to a local file or directory
- * @param successCallback  invoked with Entry object corresponding to URI
- * @param errorCallback    invoked if error occurs retrieving file system entry
- */
-module.exports = function(uri, successCallback, errorCallback) {
-    argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments);
-    // error callback
-    var fail = function(error) {
-        errorCallback && errorCallback(new FileError(error));
-    };
-    // sanity check for 'not:valid:filename'
-    if(!uri || uri.split(":").length > 2) {
-        setTimeout( function() {
-            fail(FileError.ENCODING_ERR);
-        },0);
-        return;
-    }
-    // if successful, return either a file or directory entry
-    var success = function(entry) {
-        var result;
-        if (entry) {
-            if (successCallback) {
-                // create appropriate Entry object
-                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
-                successCallback(result);
-            }
-        }
-        else {
-            // no Entry object returned
-            fail(FileError.NOT_FOUND_ERR);
-        }
-    };
-
-    exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
-};
-
-});
-
 // file: lib/common/symbols.js
 define("cordova/symbols", function(require, exports, module) {
 


[34/50] [abbrv] android commit: Remove PluginManager.exec's return value (unused).

Posted by ag...@apache.org.
Remove PluginManager.exec's return value (unused).

It's not only not used, but when it was used was messing up the
DISABLE_EXEC_CHAINING flag.


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/9946d15f
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/9946d15f
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/9946d15f

Branch: refs/heads/2.9.x
Commit: 9946d15f2348b8f6a23e589c8916a9410aa4b3da
Parents: b032dcc
Author: Andrew Grieve <ag...@chromium.org>
Authored: Thu Jun 20 22:20:58 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Jun 20 22:20:58 2013 -0400

----------------------------------------------------------------------
 framework/src/org/apache/cordova/ExposedJsApi.java      |  4 ++--
 framework/src/org/apache/cordova/api/PluginManager.java | 12 ++++--------
 2 files changed, 6 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9946d15f/framework/src/org/apache/cordova/ExposedJsApi.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/ExposedJsApi.java b/framework/src/org/apache/cordova/ExposedJsApi.java
index 7702d35..40ab1e3 100755
--- a/framework/src/org/apache/cordova/ExposedJsApi.java
+++ b/framework/src/org/apache/cordova/ExposedJsApi.java
@@ -48,9 +48,9 @@ import org.json.JSONException;
 
         jsMessageQueue.setPaused(true);
         try {
-            boolean wasSync = pluginManager.exec(service, action, callbackId, arguments);
+            pluginManager.exec(service, action, callbackId, arguments);
             String ret = "";
-            if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING || wasSync) {
+            if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) {
                 ret = jsMessageQueue.popAndEncode();
             }
             return ret;

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9946d15f/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 a819107..adaec90 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/framework/src/org/apache/cordova/api/PluginManager.java
@@ -200,15 +200,14 @@ public class PluginManager {
      *                      this is an async plugin call.
      * @param rawArgs       An Array literal string containing any arguments needed in the
      *                      plugin execute method.
-     * @return Whether the task completed synchronously.
      */
-    public boolean exec(String service, String action, String callbackId, String rawArgs) {
+    public void exec(String service, String action, String callbackId, String rawArgs) {
         CordovaPlugin plugin = this.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 true;
+            return;
         }
         try {
             CallbackContext callbackContext = new CallbackContext(callbackId, app);
@@ -216,19 +215,16 @@ public class PluginManager {
             if (!wasValidAction) {
                 PluginResult cr = new PluginResult(PluginResult.Status.INVALID_ACTION);
                 app.sendPluginResult(cr, callbackId);
-                return true;
             }
-            return callbackContext.isFinished();
         } catch (JSONException e) {
             PluginResult cr = new PluginResult(PluginResult.Status.JSON_EXCEPTION);
             app.sendPluginResult(cr, callbackId);
-            return true;
         }
     }
 
     @Deprecated
-    public boolean exec(String service, String action, String callbackId, String jsonArgs, boolean async) {
-        return exec(service, action, callbackId, jsonArgs);
+    public void exec(String service, String action, String callbackId, String jsonArgs, boolean async) {
+        exec(service, action, callbackId, jsonArgs);
     }
 
     /**


[48/50] [abbrv] [CB-4048] Merge branch 'master' into 2.9.x

Posted by ag...@apache.org.
http://git-wip-us.apache.org/repos/asf/cordova-android/blob/67e97a89/framework/assets/www/cordova.js
----------------------------------------------------------------------
diff --cc framework/assets/www/cordova.js
index 873c068,b072c81..a7a1b38
--- a/framework/assets/www/cordova.js
+++ b/framework/assets/www/cordova.js
@@@ -1,5 -1,5 +1,5 @@@
  // Platform: android
- // 2.9.0-0-g83dc4bd
 -// 2.9.0rc1-0-g002f33d
++// 2.7.0rc1-154-g98a62ff
  /*
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
@@@ -19,7 -19,7 +19,7 @@@
   under the License.
  */
  ;(function() {
- var CORDOVA_JS_BUILD_LABEL = '2.9.0-0-g83dc4bd';
 -var CORDOVA_JS_BUILD_LABEL = '2.9.0rc1-0-g002f33d';
++var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-154-g98a62ff';
  // file: lib/scripts/require.js
  
  var require,
@@@ -376,7 -376,7 +376,7 @@@ function checkArgs(spec, functionName, 
      if (errMsg) {
          errMsg += ', but got ' + typeName + '.';
          errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
--        // Don't log when running jake test.
++        // Don't log when running unit tests.
          if (typeof jasmine == 'undefined') {
              console.error(errMsg);
          }
@@@ -524,8 -524,8 +524,6 @@@ var utils = require('cordova/utils')
   * onDOMContentLoaded*         Internal event that is received when the web page is loaded and parsed.
   * onNativeReady*              Internal event that indicates the Cordova native side is ready.
   * onCordovaReady*             Internal event fired when all Cordova JavaScript objects have been created.
-- * onCordovaInfoReady*         Internal event fired when device properties are available.
-- * onCordovaConnectionReady*   Internal event fired when the connection property has been set.
   * onDeviceReady*              User event fired to indicate that Cordova is ready
   * onResume                    User event fired to indicate a start/resume lifecycle event
   * onPause                     User event fired to indicate a pause lifecycle event
@@@ -728,12 -728,12 +726,6 @@@ channel.createSticky('onNativeReady')
  // and it's time to run plugin constructors.
  channel.createSticky('onCordovaReady');
  
--// Event to indicate that device properties are available
--channel.createSticky('onCordovaInfoReady');
--
--// Event to indicate that the connection property has been set.
--channel.createSticky('onCordovaConnectionReady');
--
  // Event to indicate that all automatically loaded JS plugins are loaded and ready.
  channel.createSticky('onPluginsReady');
  
@@@ -751,7 -751,7 +743,6 @@@ channel.createSticky('onDestroy')
  
  // Channels that must fire before "deviceready" is fired.
  channel.waitForInitialization('onCordovaReady');
--channel.waitForInitialization('onCordovaConnectionReady');
  channel.waitForInitialization('onDOMContentLoaded');
  
  module.exports = channel;
@@@ -1159,4689 -1159,4689 +1150,675 @@@ module.exports = 
  
  });
  
--// file: lib/common/plugin/Acceleration.js
--define("cordova/plugin/Acceleration", function(require, exports, module) {
--
--var Acceleration = function(x, y, z, timestamp) {
--    this.x = x;
--    this.y = y;
--    this.z = z;
--    this.timestamp = timestamp || (new Date()).getTime();
--};
++// file: lib/android/plugin/android/app.js
++define("cordova/plugin/android/app", function(require, exports, module) {
  
--module.exports = Acceleration;
++var exec = require('cordova/exec');
  
--});
++module.exports = {
++  /**
++   * Clear the resource cache.
++   */
++  clearCache:function() {
++    exec(null, null, "App", "clearCache", []);
++  },
  
--// file: lib/common/plugin/Camera.js
--define("cordova/plugin/Camera", function(require, exports, module) {
++  /**
++   * Load the url into the webview or into new browser instance.
++   *
++   * @param url           The URL to load
++   * @param props         Properties that can be passed in to the activity:
++   *      wait: int                           => wait msec before loading URL
++   *      loadingDialog: "Title,Message"      => display a native loading dialog
++   *      loadUrlTimeoutValue: int            => time in msec to wait before triggering a timeout error
++   *      clearHistory: boolean              => clear webview history (default=false)
++   *      openExternal: boolean              => open in a new browser (default=false)
++   *
++   * Example:
++   *      navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000});
++   */
++  loadUrl:function(url, props) {
++    exec(null, null, "App", "loadUrl", [url, props]);
++  },
  
--var argscheck = require('cordova/argscheck'),
--    exec = require('cordova/exec'),
--    Camera = require('cordova/plugin/CameraConstants'),
--    CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle');
++  /**
++   * Cancel loadUrl that is waiting to be loaded.
++   */
++  cancelLoadUrl:function() {
++    exec(null, null, "App", "cancelLoadUrl", []);
++  },
  
--var cameraExport = {};
++  /**
++   * Clear web history in this web view.
++   * Instead of BACK button loading the previous web page, it will exit the app.
++   */
++  clearHistory:function() {
++    exec(null, null, "App", "clearHistory", []);
++  },
  
--// Tack on the Camera Constants to the base camera plugin.
--for (var key in Camera) {
--    cameraExport[key] = Camera[key];
--}
++  /**
++   * Go to previous page displayed.
++   * This is the same as pressing the backbutton on Android device.
++   */
++  backHistory:function() {
++    exec(null, null, "App", "backHistory", []);
++  },
  
--/**
-- * Gets a picture from source defined by "options.sourceType", and returns the
-- * image as defined by the "options.destinationType" option.
++  /**
++   * Override the default behavior of the Android back button.
++   * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired.
++   *
++   * Note: The user should not have to call this method.  Instead, when the user
++   *       registers for the "backbutton" event, this is automatically done.
++   *
++   * @param override        T=override, F=cancel override
++   */
++  overrideBackbutton:function(override) {
++    exec(null, null, "App", "overrideBackbutton", [override]);
++  },
  
-- * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
-- *
-- * @param {Function} successCallback
-- * @param {Function} errorCallback
-- * @param {Object} options
-- */
--cameraExport.getPicture = function(successCallback, errorCallback, options) {
--    argscheck.checkArgs('fFO', 'Camera.getPicture', arguments);
--    options = options || {};
--    var getValue = argscheck.getValue;
--
--    var quality = getValue(options.quality, 50);
--    var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI);
--    var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA);
--    var targetWidth = getValue(options.targetWidth, -1);
--    var targetHeight = getValue(options.targetHeight, -1);
--    var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG);
--    var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE);
--    var allowEdit = !!options.allowEdit;
--    var correctOrientation = !!options.correctOrientation;
--    var saveToPhotoAlbum = !!options.saveToPhotoAlbum;
--    var popoverOptions = getValue(options.popoverOptions, null);
--    var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK);
--
--    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
--                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection];
--
--    exec(successCallback, errorCallback, "Camera", "takePicture", args);
--    return new CameraPopoverHandle();
++  /**
++   * Exit and terminate the application.
++   */
++  exitApp:function() {
++    return exec(null, null, "App", "exitApp", []);
++  }
  };
  
--cameraExport.cleanup = function(successCallback, errorCallback) {
--    exec(successCallback, errorCallback, "Camera", "cleanup", []);
--};
++});
  
--module.exports = cameraExport;
++// file: lib/android/plugin/android/nativeapiprovider.js
++define("cordova/plugin/android/nativeapiprovider", function(require, exports, module) {
  
--});
++/**
++ * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi.
++ */
  
--// file: lib/common/plugin/CameraConstants.js
--define("cordova/plugin/CameraConstants", function(require, exports, module) {
++var nativeApi = this._cordovaNative || require('cordova/plugin/android/promptbasednativeapi');
++var currentApi = nativeApi;
  
  module.exports = {
--  DestinationType:{
--    DATA_URL: 0,         // Return base64 encoded string
--    FILE_URI: 1,         // Return file uri (content://media/external/images/media/2 for Android)
--    NATIVE_URI: 2        // Return native uri (eg. asset-library://... for iOS)
--  },
--  EncodingType:{
--    JPEG: 0,             // Return JPEG encoded image
--    PNG: 1               // Return PNG encoded image
--  },
--  MediaType:{
--    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
--    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
--    ALLMEDIA : 2         // allow selection from all media types
--  },
--  PictureSourceType:{
--    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
--    CAMERA : 1,          // Take picture from camera
--    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
--  },
--  PopoverArrowDirection:{
--      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
--      ARROW_DOWN : 2,
--      ARROW_LEFT : 4,
--      ARROW_RIGHT : 8,
--      ARROW_ANY : 15
--  },
--  Direction:{
--      BACK: 0,
--      FRONT: 1
--  }
++    get: function() { return currentApi; },
++    setPreferPrompt: function(value) {
++        currentApi = value ? require('cordova/plugin/android/promptbasednativeapi') : nativeApi;
++    },
++    // Used only by tests.
++    set: function(value) {
++        currentApi = value;
++    }
  };
  
  });
  
--// file: lib/common/plugin/CameraPopoverHandle.js
--define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) {
--
--var exec = require('cordova/exec');
++// file: lib/android/plugin/android/promptbasednativeapi.js
++define("cordova/plugin/android/promptbasednativeapi", function(require, exports, module) {
  
  /**
-- * A handle to an image picker popover.
++ * Implements the API of ExposedJsApi.java, but uses prompt() to communicate.
++ * This is used only on the 2.3 simulator, where addJavascriptInterface() is broken.
   */
--var CameraPopoverHandle = function() {
--    this.setPosition = function(popoverOptions) {
--        console.log('CameraPopoverHandle.setPosition is only supported on iOS.');
--    };
--};
  
--module.exports = CameraPopoverHandle;
++module.exports = {
++    exec: function(service, action, callbackId, argsJson) {
++        return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId]));
++    },
++    setNativeToJsBridgeMode: function(value) {
++        prompt(value, 'gap_bridge_mode:');
++    },
++    retrieveJsMessages: function() {
++        return prompt('', 'gap_poll:');
++    }
++};
  
  });
  
--// file: lib/common/plugin/CameraPopoverOptions.js
--define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
++// file: lib/android/plugin/android/storage.js
++define("cordova/plugin/android/storage", function(require, exports, module) {
++
++var utils = require('cordova/utils'),
++    exec = require('cordova/exec'),
++    channel = require('cordova/channel');
  
--var Camera = require('cordova/plugin/CameraConstants');
++var queryQueue = {};
  
  /**
-- * Encapsulates options for iOS Popover image picker
++ * SQL result set object
++ * PRIVATE METHOD
++ * @constructor
   */
--var CameraPopoverOptions = function(x,y,width,height,arrowDir){
--    // information of rectangle that popover should be anchored to
--    this.x = x || 0;
--    this.y = y || 32;
--    this.width = width || 320;
--    this.height = height || 480;
--    // The direction of the popover arrow
--    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
++var DroidDB_Rows = function() {
++    this.resultSet = [];    // results array
++    this.length = 0;        // number of rows
  };
  
--module.exports = CameraPopoverOptions;
--
--});
--
--// file: lib/common/plugin/CaptureAudioOptions.js
--define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
--
  /**
-- * Encapsulates all audio capture operation configuration options.
++ * Get item from SQL result set
++ *
++ * @param row           The row number to return
++ * @return              The row object
   */
--var CaptureAudioOptions = function(){
--    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
--    this.limit = 1;
--    // Maximum duration of a single sound clip in seconds.
--    this.duration = 0;
++DroidDB_Rows.prototype.item = function(row) {
++    return this.resultSet[row];
  };
  
--module.exports = CaptureAudioOptions;
--
--});
--
--// file: lib/common/plugin/CaptureError.js
--define("cordova/plugin/CaptureError", function(require, exports, module) {
--
  /**
-- * The CaptureError interface encapsulates all errors in the Capture API.
++ * SQL result set that is returned to user.
++ * PRIVATE METHOD
++ * @constructor
   */
--var CaptureError = function(c) {
--   this.code = c || null;
++var DroidDB_Result = function() {
++    this.rows = new DroidDB_Rows();
  };
  
--// Camera or microphone failed to capture image or sound.
--CaptureError.CAPTURE_INTERNAL_ERR = 0;
--// Camera application or audio capture application is currently serving other capture request.
--CaptureError.CAPTURE_APPLICATION_BUSY = 1;
--// Invalid use of the API (e.g. limit parameter has value less than one).
--CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
--// User exited camera application or audio capture application before capturing anything.
--CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
--// The requested capture operation is not supported.
--CaptureError.CAPTURE_NOT_SUPPORTED = 20;
--
--module.exports = CaptureError;
--
--});
--
--// file: lib/common/plugin/CaptureImageOptions.js
--define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
--
  /**
-- * Encapsulates all image capture operation configuration options.
++ * Callback from native code when query is complete.
++ * PRIVATE METHOD
++ *
++ * @param id   Query id
   */
--var CaptureImageOptions = function(){
--    // Upper limit of images user can take. Value must be equal or greater than 1.
--    this.limit = 1;
--};
++function completeQuery(id, data) {
++    var query = queryQueue[id];
++    if (query) {
++        try {
++            delete queryQueue[id];
  
--module.exports = CaptureImageOptions;
++            // Get transaction
++            var tx = query.tx;
  
--});
++            // If transaction hasn't failed
++            // Note: We ignore all query results if previous query
++            //       in the same transaction failed.
++            if (tx && tx.queryList[id]) {
++
++                // Save query results
++                var r = new DroidDB_Result();
++                r.rows.resultSet = data;
++                r.rows.length = data.length;
++                try {
++                    if (typeof query.successCallback === 'function') {
++                        query.successCallback(query.tx, r);
++                    }
++                } catch (ex) {
++                    console.log("executeSql error calling user success callback: "+ex);
++                }
  
--// file: lib/common/plugin/CaptureVideoOptions.js
--define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
++                tx.queryComplete(id);
++            }
++        } catch (e) {
++            console.log("executeSql error: "+e);
++        }
++    }
++}
  
  /**
-- * Encapsulates all video capture operation configuration options.
++ * Callback from native code when query fails
++ * PRIVATE METHOD
++ *
++ * @param reason            Error message
++ * @param id                Query id
   */
--var CaptureVideoOptions = function(){
--    // Upper limit of videos user can record. Value must be equal or greater than 1.
--    this.limit = 1;
--    // Maximum duration of a single video clip in seconds.
--    this.duration = 0;
--};
++function failQuery(reason, id) {
++    var query = queryQueue[id];
++    if (query) {
++        try {
++            delete queryQueue[id];
  
--module.exports = CaptureVideoOptions;
++            // Get transaction
++            var tx = query.tx;
  
--});
++            // If transaction hasn't failed
++            // Note: We ignore all query results if previous query
++            //       in the same transaction failed.
++            if (tx && tx.queryList[id]) {
++                tx.queryList = {};
++
++                try {
++                    if (typeof query.errorCallback === 'function') {
++                        query.errorCallback(query.tx, reason);
++                    }
++                } catch (ex) {
++                    console.log("executeSql error calling user error callback: "+ex);
++                }
++
++                tx.queryFailed(id, reason);
++            }
  
--// file: lib/common/plugin/CompassError.js
--define("cordova/plugin/CompassError", function(require, exports, module) {
++        } catch (e) {
++            console.log("executeSql error: "+e);
++        }
++    }
++}
  
  /**
-- *  CompassError.
-- *  An error code assigned by an implementation when an error has occurred
++ * SQL query object
++ * PRIVATE METHOD
++ *
   * @constructor
++ * @param tx                The transaction object that this query belongs to
   */
--var CompassError = function(err) {
--    this.code = (err !== undefined ? err : null);
--};
--
--CompassError.COMPASS_INTERNAL_ERR = 0;
--CompassError.COMPASS_NOT_SUPPORTED = 20;
++var DroidDB_Query = function(tx) {
  
--module.exports = CompassError;
++    // Set the id of the query
++    this.id = utils.createUUID();
  
--});
++    // Add this query to the queue
++    queryQueue[this.id] = this;
  
--// file: lib/common/plugin/CompassHeading.js
--define("cordova/plugin/CompassHeading", function(require, exports, module) {
++    // Init result
++    this.resultSet = [];
  
--var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
--  this.magneticHeading = magneticHeading;
--  this.trueHeading = trueHeading;
--  this.headingAccuracy = headingAccuracy;
--  this.timestamp = timestamp || new Date().getTime();
--};
++    // Set transaction that this query belongs to
++    this.tx = tx;
  
--module.exports = CompassHeading;
++    // Add this query to transaction list
++    this.tx.queryList[this.id] = this;
  
--});
++    // Callbacks
++    this.successCallback = null;
++    this.errorCallback = null;
  
--// file: lib/common/plugin/ConfigurationData.js
--define("cordova/plugin/ConfigurationData", function(require, exports, module) {
++};
  
  /**
-- * Encapsulates a set of parameters that the capture device supports.
++ * Transaction object
++ * PRIVATE METHOD
++ * @constructor
   */
--function ConfigurationData() {
--    // The ASCII-encoded string in lower case representing the media type.
--    this.type = null;
--    // The height attribute represents height of the image or video in pixels.
--    // In the case of a sound clip this attribute has value 0.
--    this.height = 0;
--    // The width attribute represents width of the image or video in pixels.
--    // In the case of a sound clip this attribute has value 0
--    this.width = 0;
--}
--
--module.exports = ConfigurationData;
++var DroidDB_Tx = function() {
  
--});
++    // Set the id of the transaction
++    this.id = utils.createUUID();
  
--// file: lib/common/plugin/Connection.js
--define("cordova/plugin/Connection", function(require, exports, module) {
++    // Callbacks
++    this.successCallback = null;
++    this.errorCallback = null;
  
--/**
-- * Network status
-- */
--module.exports = {
--        UNKNOWN: "unknown",
--        ETHERNET: "ethernet",
--        WIFI: "wifi",
--        CELL_2G: "2g",
--        CELL_3G: "3g",
--        CELL_4G: "4g",
--        CELL:"cellular",
--        NONE: "none"
++    // Query list
++    this.queryList = {};
  };
  
--});
--
--// file: lib/common/plugin/Contact.js
--define("cordova/plugin/Contact", function(require, exports, module) {
--
--var argscheck = require('cordova/argscheck'),
--    exec = require('cordova/exec'),
--    ContactError = require('cordova/plugin/ContactError'),
--    utils = require('cordova/utils');
--
  /**
--* Converts primitives into Complex Object
--* Currently only used for Date fields
--*/
--function convertIn(contact) {
--    var value = contact.birthday;
--    try {
--      contact.birthday = new Date(parseFloat(value));
--    } catch (exception){
--      console.log("Cordova Contact convertIn error: exception creating date.");
--    }
--    return contact;
--}
++ * Mark query in transaction as complete.
++ * If all queries are complete, call the user's transaction success callback.
++ *
++ * @param id                Query id
++ */
++DroidDB_Tx.prototype.queryComplete = function(id) {
++    delete this.queryList[id];
  
--/**
--* Converts Complex objects into primitives
--* Only conversion at present is for Dates.
--**/
--
--function convertOut(contact) {
--    var value = contact.birthday;
--    if (value !== null) {
--        // try to make it a Date object if it is not already
--        if (!utils.isDate(value)){
--            try {
--                value = new Date(value);
--            } catch(exception){
--                value = null;
++    // If no more outstanding queries, then fire transaction success
++    if (this.successCallback) {
++        var count = 0;
++        var i;
++        for (i in this.queryList) {
++            if (this.queryList.hasOwnProperty(i)) {
++                count++;
              }
          }
--        if (utils.isDate(value)){
--            value = value.valueOf(); // convert to milliseconds
++        if (count === 0) {
++            try {
++                this.successCallback();
++            } catch(e) {
++                console.log("Transaction error calling user success callback: " + e);
++            }
          }
--        contact.birthday = value;
      }
  };
  
  /**
--* Removes contact from device storage.
--* @param successCB success callback
--* @param errorCB error callback
--*/
--Contact.prototype.remove = function(successCB, errorCB) {
--    argscheck.checkArgs('FF', 'Contact.remove', arguments);
--    var fail = errorCB && function(code) {
--        errorCB(new ContactError(code));
--    };
--    if (this.id === null) {
--        fail(ContactError.UNKNOWN_ERROR);
--    }
--    else {
--        exec(successCB, fail, "Contacts", "remove", [this.id]);
--    }
--};
++ * Mark query in transaction as failed.
++ *
++ * @param id                Query id
++ * @param reason            Error message
++ */
++DroidDB_Tx.prototype.queryFailed = function(id, reason) {
  
--/**
--* Creates a deep copy of this Contact.
--* With the contact ID set to null.
--* @return copy of this Contact
--*/
--Contact.prototype.clone = function() {
--    var clonedContact = utils.clone(this);
--    clonedContact.id = null;
--    clonedContact.rawId = null;
--
--    function nullIds(arr) {
--        if (arr) {
--            for (var i = 0; i < arr.length; ++i) {
--                arr[i].id = null;
--            }
++    // The sql queries in this transaction have already been run, since
++    // we really don't have a real transaction implemented in native code.
++    // However, the user callbacks for the remaining sql queries in transaction
++    // will not be called.
++    this.queryList = {};
++
++    if (this.errorCallback) {
++        try {
++            this.errorCallback(reason);
++        } catch(e) {
++            console.log("Transaction error calling user error callback: " + e);
          }
      }
  };
  
  /**
--* Persists contact to device storage.
--* @param successCB success callback
--* @param errorCB error callback
--*/
--Contact.prototype.save = function(successCB, errorCB) {
--    argscheck.checkArgs('FFO', 'Contact.save', arguments);
--    var fail = errorCB && function(code) {
--        errorCB(new ContactError(code));
--    };
--    var success = function(result) {
--        if (result) {
--            if (successCB) {
--                var fullContact = require('cordova/plugin/contacts').create(result);
--                successCB(convertIn(fullContact));
--            }
--        }
--        else {
--            // no Entry object returned
--            fail(ContactError.UNKNOWN_ERROR);
--        }
--    };
--    var dupContact = convertOut(utils.clone(this));
--    exec(success, fail, "Contacts", "save", [dupContact]);
--};
--
--
--module.exports = Contact;
++ * Execute SQL statement
++ *
++ * @param sql                   SQL statement to execute
++ * @param params                Statement parameters
++ * @param successCallback       Success callback
++ * @param errorCallback         Error callback
++ */
++DroidDB_Tx.prototype.executeSql = function(sql, params, successCallback, errorCallback) {
  
--});
++    // Init params array
++    if (typeof params === 'undefined') {
++        params = [];
++    }
  
--// file: lib/common/plugin/ContactAddress.js
--define("cordova/plugin/ContactAddress", function(require, exports, module) {
++    // Create query and add to queue
++    var query = new DroidDB_Query(this);
++    queryQueue[query.id] = query;
  
--/**
--* Contact address.
--* @constructor
--* @param {DOMString} id unique identifier, should only be set by native code
--* @param formatted // NOTE: not a W3C standard
--* @param streetAddress
--* @param locality
--* @param region
--* @param postalCode
--* @param country
--*/
++    // Save callbacks
++    query.successCallback = successCallback;
++    query.errorCallback = errorCallback;
  
--var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
--    this.id = null;
--    this.pref = (typeof pref != 'undefined' ? pref : false);
--    this.type = type || null;
--    this.formatted = formatted || null;
--    this.streetAddress = streetAddress || null;
--    this.locality = locality || null;
--    this.region = region || null;
--    this.postalCode = postalCode || null;
--    this.country = country || null;
++    // Call native code
++    exec(null, null, "Storage", "executeSql", [sql, params, query.id]);
  };
  
--module.exports = ContactAddress;
--
--});
--
--// file: lib/common/plugin/ContactError.js
--define("cordova/plugin/ContactError", function(require, exports, module) {
++var DatabaseShell = function() {
++};
  
  /**
-- *  ContactError.
-- *  An error code assigned by an implementation when an error has occurred
-- * @constructor
++ * Start a transaction.
++ * Does not support rollback in event of failure.
++ *
++ * @param process {Function}            The transaction function
++ * @param successCallback {Function}
++ * @param errorCallback {Function}
   */
--var ContactError = function(err) {
--    this.code = (typeof err != 'undefined' ? err : null);
++DatabaseShell.prototype.transaction = function(process, errorCallback, successCallback) {
++    var tx = new DroidDB_Tx();
++    tx.successCallback = successCallback;
++    tx.errorCallback = errorCallback;
++    try {
++        process(tx);
++    } catch (e) {
++        console.log("Transaction error: "+e);
++        if (tx.errorCallback) {
++            try {
++                tx.errorCallback(e);
++            } catch (ex) {
++                console.log("Transaction error calling user error callback: "+e);
++            }
++        }
++    }
  };
  
  /**
-- * Error codes
++ * Open database
++ *
++ * @param name              Database name
++ * @param version           Database version
++ * @param display_name      Database display name
++ * @param size              Database size in bytes
++ * @return                  Database object
   */
--ContactError.UNKNOWN_ERROR = 0;
--ContactError.INVALID_ARGUMENT_ERROR = 1;
--ContactError.TIMEOUT_ERROR = 2;
--ContactError.PENDING_OPERATION_ERROR = 3;
--ContactError.IO_ERROR = 4;
--ContactError.NOT_SUPPORTED_ERROR = 5;
--ContactError.PERMISSION_DENIED_ERROR = 20;
--
--module.exports = ContactError;
--
--});
++var DroidDB_openDatabase = function(name, version, display_name, size) {
++    exec(null, null, "Storage", "openDatabase", [name, version, display_name, size]);
++    var db = new DatabaseShell();
++    return db;
++};
  
--// file: lib/common/plugin/ContactField.js
--define("cordova/plugin/ContactField", function(require, exports, module) {
  
--/**
--* Generic contact field.
--* @constructor
--* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
--* @param type
--* @param value
--* @param pref
--*/
--var ContactField = function(type, value, pref) {
--    this.id = null;
--    this.type = (type && type.toString()) || null;
--    this.value = (value && value.toString()) || null;
--    this.pref = (typeof pref != 'undefined' ? pref : false);
++module.exports = {
++  openDatabase:DroidDB_openDatabase,
++  failQuery:failQuery,
++  completeQuery:completeQuery
  };
  
--module.exports = ContactField;
--
  });
  
--// file: lib/common/plugin/ContactFindOptions.js
--define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
--
--/**
-- * ContactFindOptions.
-- * @constructor
-- * @param filter used to match contacts against
-- * @param multiple boolean used to determine if more than one contact should be returned
-- */
++// file: lib/android/plugin/android/storage/openDatabase.js
++define("cordova/plugin/android/storage/openDatabase", function(require, exports, module) {
  
--var ContactFindOptions = function(filter, multiple) {
--    this.filter = filter || '';
--    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
--};
  
--module.exports = ContactFindOptions;
++var modulemapper = require('cordova/modulemapper'),
++    storage = require('cordova/plugin/android/storage');
  
--});
++var originalOpenDatabase = modulemapper.getOriginalSymbol(window, 'openDatabase');
  
--// file: lib/common/plugin/ContactName.js
--define("cordova/plugin/ContactName", function(require, exports, module) {
++module.exports = function(name, version, desc, size) {
++    // First patch WebSQL if necessary
++    if (!originalOpenDatabase) {
++        // Not defined, create an openDatabase function for all to use!
++        return storage.openDatabase.apply(this, arguments);
++    }
  
--/**
--* Contact name.
--* @constructor
--* @param formatted // NOTE: not part of W3C standard
--* @param familyName
--* @param givenName
--* @param middle
--* @param prefix
--* @param suffix
--*/
--var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
--    this.formatted = formatted || null;
--    this.familyName = familyName || null;
--    this.givenName = givenName || null;
--    this.middleName = middle || null;
--    this.honorificPrefix = prefix || null;
--    this.honorificSuffix = suffix || null;
++    // Defined, but some Android devices will throw a SECURITY_ERR -
++    // so we wrap the whole thing in a try-catch and shim in our own
++    // if the device has Android bug 16175.
++    try {
++        return originalOpenDatabase(name, version, desc, size);
++    } catch (ex) {
++        if (ex.code !== 18) {
++            throw ex;
++        }
++    }
++    return storage.openDatabase(name, version, desc, size);
  };
  
--module.exports = ContactName;
++
  
  });
  
--// file: lib/common/plugin/ContactOrganization.js
--define("cordova/plugin/ContactOrganization", function(require, exports, module) {
++// file: lib/android/plugin/android/storage/symbols.js
++define("cordova/plugin/android/storage/symbols", function(require, exports, module) {
  
--/**
--* Contact organization.
--* @constructor
--* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
--* @param name
--* @param dept
--* @param title
--* @param startDate
--* @param endDate
--* @param location
--* @param desc
--*/
  
--var ContactOrganization = function(pref, type, name, dept, title) {
--    this.id = null;
--    this.pref = (typeof pref != 'undefined' ? pref : false);
--    this.type = type || null;
--    this.name = name || null;
--    this.department = dept || null;
--    this.title = title || null;
--};
++var modulemapper = require('cordova/modulemapper');
++
++modulemapper.clobbers('cordova/plugin/android/storage/openDatabase', 'openDatabase');
  
  
  });
  
--// file: lib/common/plugin/Coordinates.js
--define("cordova/plugin/Coordinates", function(require, exports, module) {
++// file: lib/common/plugin/console-via-logger.js
++define("cordova/plugin/console-via-logger", function(require, exports, module) {
  
--/**
-- * This class contains position information.
-- * @param {Object} lat
-- * @param {Object} lng
-- * @param {Object} alt
-- * @param {Object} acc
-- * @param {Object} head
-- * @param {Object} vel
-- * @param {Object} altacc
-- * @constructor
-- */
--var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
--    /**
--     * The latitude of the position.
--     */
--    this.latitude = lat;
--    /**
--     * The longitude of the position,
--     */
--    this.longitude = lng;
--    /**
--     * The accuracy of the position.
--     */
--    this.accuracy = acc;
--    /**
--     * The altitude of the position.
--     */
--    this.altitude = (alt !== undefined ? alt : null);
--    /**
--     * The direction the device is moving at the position.
--     */
--    this.heading = (head !== undefined ? head : null);
--    /**
--     * The velocity with which the device is moving at the position.
--     */
--    this.speed = (vel !== undefined ? vel : null);
++//------------------------------------------------------------------------------
  
--    if (this.speed === 0 || this.speed === null) {
--        this.heading = NaN;
--    }
++var logger = require("cordova/plugin/logger");
++var utils  = require("cordova/utils");
  
--    /**
--     * The altitude accuracy of the position.
--     */
--    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
--};
++//------------------------------------------------------------------------------
++// object that we're exporting
++//------------------------------------------------------------------------------
++var console = module.exports;
  
--module.exports = Coordinates;
++//------------------------------------------------------------------------------
++// copy of the original console object
++//------------------------------------------------------------------------------
++var WinConsole = window.console;
  
--});
++//------------------------------------------------------------------------------
++// whether to use the logger
++//------------------------------------------------------------------------------
++var UseLogger = false;
  
--// file: lib/common/plugin/DirectoryEntry.js
--define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
++//------------------------------------------------------------------------------
++// Timers
++//------------------------------------------------------------------------------
++var Timers = {};
  
--var argscheck = require('cordova/argscheck'),
--    utils = require('cordova/utils'),
--    exec = require('cordova/exec'),
--    Entry = require('cordova/plugin/Entry'),
--    FileError = require('cordova/plugin/FileError'),
--    DirectoryReader = require('cordova/plugin/DirectoryReader');
++//------------------------------------------------------------------------------
++// used for unimplemented methods
++//------------------------------------------------------------------------------
++function noop() {}
  
--/**
-- * An interface representing a directory on the file system.
-- *
-- * {boolean} isFile always false (readonly)
-- * {boolean} isDirectory always true (readonly)
-- * {DOMString} name of the directory, excluding the path leading to it (readonly)
-- * {DOMString} fullPath the absolute full path to the directory (readonly)
-- * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
-- */
--var DirectoryEntry = function(name, fullPath) {
--     DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath);
--};
++//------------------------------------------------------------------------------
++// used for unimplemented methods
++//------------------------------------------------------------------------------
++console.useLogger = function (value) {
++    if (arguments.length) UseLogger = !!value;
  
--utils.extend(DirectoryEntry, Entry);
++    if (UseLogger) {
++        if (logger.useConsole()) {
++            throw new Error("console and logger are too intertwingly");
++        }
++    }
  
--/**
-- * Creates a new DirectoryReader to read entries from this directory
-- */
--DirectoryEntry.prototype.createReader = function() {
--    return new DirectoryReader(this.fullPath);
--};
--
--/**
-- * Creates or looks up a directory
-- *
-- * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
-- * @param {Flags} options to create or exclusively create the directory
-- * @param {Function} successCallback is called with the new entry
-- * @param {Function} errorCallback is called with a FileError
-- */
--DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
--    argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments);
--    var win = successCallback && function(result) {
--        var entry = new DirectoryEntry(result.name, result.fullPath);
--        successCallback(entry);
--    };
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--    exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
--};
--
--/**
-- * Deletes a directory and all of it's contents
-- *
-- * @param {Function} successCallback is called with no parameters
-- * @param {Function} errorCallback is called with a FileError
-- */
--DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
--    argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments);
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--    exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
--};
--
--/**
-- * Creates or looks up a file
-- *
-- * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
-- * @param {Flags} options to create or exclusively create the file
-- * @param {Function} successCallback is called with the new entry
-- * @param {Function} errorCallback is called with a FileError
-- */
--DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
--    argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments);
--    var win = successCallback && function(result) {
--        var FileEntry = require('cordova/plugin/FileEntry');
--        var entry = new FileEntry(result.name, result.fullPath);
--        successCallback(entry);
--    };
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--    exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
--};
--
--module.exports = DirectoryEntry;
--
--});
--
--// file: lib/common/plugin/DirectoryReader.js
--define("cordova/plugin/DirectoryReader", function(require, exports, module) {
--
--var exec = require('cordova/exec'),
--    FileError = require('cordova/plugin/FileError') ;
--
--/**
-- * An interface that lists the files and directories in a directory.
-- */
--function DirectoryReader(path) {
--    this.path = path || null;
--}
--
--/**
-- * Returns a list of entries from a directory.
-- *
-- * @param {Function} successCallback is called with a list of entries
-- * @param {Function} errorCallback is called with a FileError
-- */
--DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
--    var win = typeof successCallback !== 'function' ? null : function(result) {
--        var retVal = [];
--        for (var i=0; i<result.length; i++) {
--            var entry = null;
--            if (result[i].isDirectory) {
--                entry = new (require('cordova/plugin/DirectoryEntry'))();
--            }
--            else if (result[i].isFile) {
--                entry = new (require('cordova/plugin/FileEntry'))();
--            }
--            entry.isDirectory = result[i].isDirectory;
--            entry.isFile = result[i].isFile;
--            entry.name = result[i].name;
--            entry.fullPath = result[i].fullPath;
--            retVal.push(entry);
--        }
--        successCallback(retVal);
--    };
--    var fail = typeof errorCallback !== 'function' ? null : function(code) {
--        errorCallback(new FileError(code));
--    };
--    exec(win, fail, "File", "readEntries", [this.path]);
--};
--
--module.exports = DirectoryReader;
--
--});
--
--// file: lib/common/plugin/Entry.js
--define("cordova/plugin/Entry", function(require, exports, module) {
--
--var argscheck = require('cordova/argscheck'),
--    exec = require('cordova/exec'),
--    FileError = require('cordova/plugin/FileError'),
--    Metadata = require('cordova/plugin/Metadata');
--
--/**
-- * Represents a file or directory on the local file system.
-- *
-- * @param isFile
-- *            {boolean} true if Entry is a file (readonly)
-- * @param isDirectory
-- *            {boolean} true if Entry is a directory (readonly)
-- * @param name
-- *            {DOMString} name of the file or directory, excluding the path
-- *            leading to it (readonly)
-- * @param fullPath
-- *            {DOMString} the absolute full path to the file or directory
-- *            (readonly)
-- */
--function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
--    this.isFile = !!isFile;
--    this.isDirectory = !!isDirectory;
--    this.name = name || '';
--    this.fullPath = fullPath || '';
--    this.filesystem = fileSystem || null;
--}
--
--/**
-- * Look up the metadata of the entry.
-- *
-- * @param successCallback
-- *            {Function} is called with a Metadata object
-- * @param errorCallback
-- *            {Function} is called with a FileError
-- */
--Entry.prototype.getMetadata = function(successCallback, errorCallback) {
--    argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);
--    var success = successCallback && function(lastModified) {
--        var metadata = new Metadata(lastModified);
--        successCallback(metadata);
--    };
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--
--    exec(success, fail, "File", "getMetadata", [this.fullPath]);
--};
--
--/**
-- * Set the metadata of the entry.
-- *
-- * @param successCallback
-- *            {Function} is called with a Metadata object
-- * @param errorCallback
-- *            {Function} is called with a FileError
-- * @param metadataObject
-- *            {Object} keys and values to set
-- */
--Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
--    argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);
--    exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
--};
--
--/**
-- * Move a file or directory to a new location.
-- *
-- * @param parent
-- *            {DirectoryEntry} the directory to which to move this entry
-- * @param newName
-- *            {DOMString} new name of the entry, defaults to the current name
-- * @param successCallback
-- *            {Function} called with the new DirectoryEntry object
-- * @param errorCallback
-- *            {Function} called with a FileError
-- */
--Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
--    argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--    // source path
--    var srcPath = this.fullPath,
--        // entry name
--        name = newName || this.name,
--        success = function(entry) {
--            if (entry) {
--                if (successCallback) {
--                    // create appropriate Entry object
--                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
--                    successCallback(result);
--                }
--            }
--            else {
--                // no Entry object returned
--                fail && fail(FileError.NOT_FOUND_ERR);
--            }
--        };
--
--    // copy
--    exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
--};
--
--/**
-- * Copy a directory to a different location.
-- *
-- * @param parent
-- *            {DirectoryEntry} the directory to which to copy the entry
-- * @param newName
-- *            {DOMString} new name of the entry, defaults to the current name
-- * @param successCallback
-- *            {Function} called with the new Entry object
-- * @param errorCallback
-- *            {Function} called with a FileError
-- */
--Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
--    argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--
--        // source path
--    var srcPath = this.fullPath,
--        // entry name
--        name = newName || this.name,
--        // success callback
--        success = function(entry) {
--            if (entry) {
--                if (successCallback) {
--                    // create appropriate Entry object
--                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
--                    successCallback(result);
--                }
--            }
--            else {
--                // no Entry object returned
--                fail && fail(FileError.NOT_FOUND_ERR);
--            }
--        };
--
--    // copy
--    exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
--};
--
--/**
-- * Return a URL that can be used to identify this entry.
-- */
--Entry.prototype.toURL = function() {
--    // fullPath attribute contains the full URL
--    return this.fullPath;
--};
--
--/**
-- * Returns a URI that can be used to identify this entry.
-- *
-- * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
-- * @return uri
-- */
--Entry.prototype.toURI = function(mimeType) {
--    console.log("DEPRECATED: Update your code to use 'toURL'");
--    // fullPath attribute contains the full URI
--    return this.toURL();
--};
--
--/**
-- * Remove a file or directory. It is an error to attempt to delete a
-- * directory that is not empty. It is an error to attempt to delete a
-- * root directory of a file system.
-- *
-- * @param successCallback {Function} called with no parameters
-- * @param errorCallback {Function} called with a FileError
-- */
--Entry.prototype.remove = function(successCallback, errorCallback) {
--    argscheck.checkArgs('FF', 'Entry.remove', arguments);
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--    exec(successCallback, fail, "File", "remove", [this.fullPath]);
--};
--
--/**
-- * Look up the parent DirectoryEntry of this entry.
-- *
-- * @param successCallback {Function} called with the parent DirectoryEntry object
-- * @param errorCallback {Function} called with a FileError
-- */
--Entry.prototype.getParent = function(successCallback, errorCallback) {
--    argscheck.checkArgs('FF', 'Entry.getParent', arguments);
--    var win = successCallback && function(result) {
--        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
--        var entry = new DirectoryEntry(result.name, result.fullPath);
--        successCallback(entry);
--    };
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--    exec(win, fail, "File", "getParent", [this.fullPath]);
--};
--
--module.exports = Entry;
--
--});
--
--// file: lib/common/plugin/File.js
--define("cordova/plugin/File", function(require, exports, module) {
--
--/**
-- * Constructor.
-- * name {DOMString} name of the file, without path information
-- * fullPath {DOMString} the full path of the file, including the name
-- * type {DOMString} mime type
-- * lastModifiedDate {Date} last modified date
-- * size {Number} size of the file in bytes
-- */
--
--var File = function(name, fullPath, type, lastModifiedDate, size){
--    this.name = name || '';
--    this.fullPath = fullPath || null;
--    this.type = type || null;
--    this.lastModifiedDate = lastModifiedDate || null;
--    this.size = size || 0;
--
--    // These store the absolute start and end for slicing the file.
--    this.start = 0;
--    this.end = this.size;
--};
--
--/**
-- * Returns a "slice" of the file. Since Cordova Files don't contain the actual
-- * content, this really returns a File with adjusted start and end.
-- * Slices of slices are supported.
-- * start {Number} The index at which to start the slice (inclusive).
-- * end {Number} The index at which to end the slice (exclusive).
-- */
--File.prototype.slice = function(start, end) {
--    var size = this.end - this.start;
--    var newStart = 0;
--    var newEnd = size;
--    if (arguments.length) {
--        if (start < 0) {
--            newStart = Math.max(size + start, 0);
--        } else {
--            newStart = Math.min(size, start);
--        }
--    }
--
--    if (arguments.length >= 2) {
--        if (end < 0) {
--            newEnd = Math.max(size + end, 0);
--        } else {
--            newEnd = Math.min(end, size);
--        }
--    }
--
--    var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size);
--    newFile.start = this.start + newStart;
--    newFile.end = this.start + newEnd;
--    return newFile;
--};
--
--
--module.exports = File;
--
--});
--
--// file: lib/common/plugin/FileEntry.js
--define("cordova/plugin/FileEntry", function(require, exports, module) {
--
--var utils = require('cordova/utils'),
--    exec = require('cordova/exec'),
--    Entry = require('cordova/plugin/Entry'),
--    FileWriter = require('cordova/plugin/FileWriter'),
--    File = require('cordova/plugin/File'),
--    FileError = require('cordova/plugin/FileError');
--
--/**
-- * An interface representing a file on the file system.
-- *
-- * {boolean} isFile always true (readonly)
-- * {boolean} isDirectory always false (readonly)
-- * {DOMString} name of the file, excluding the path leading to it (readonly)
-- * {DOMString} fullPath the absolute full path to the file (readonly)
-- * {FileSystem} filesystem on which the file resides (readonly)
-- */
--var FileEntry = function(name, fullPath) {
--     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
--};
--
--utils.extend(FileEntry, Entry);
--
--/**
-- * Creates a new FileWriter associated with the file that this FileEntry represents.
-- *
-- * @param {Function} successCallback is called with the new FileWriter
-- * @param {Function} errorCallback is called with a FileError
-- */
--FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
--    this.file(function(filePointer) {
--        var writer = new FileWriter(filePointer);
--
--        if (writer.fileName === null || writer.fileName === "") {
--            errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR));
--        } else {
--            successCallback && successCallback(writer);
--        }
--    }, errorCallback);
--};
--
--/**
-- * Returns a File that represents the current state of the file that this FileEntry represents.
-- *
-- * @param {Function} successCallback is called with the new File object
-- * @param {Function} errorCallback is called with a FileError
-- */
--FileEntry.prototype.file = function(successCallback, errorCallback) {
--    var win = successCallback && function(f) {
--        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
--        successCallback(file);
--    };
--    var fail = errorCallback && function(code) {
--        errorCallback(new FileError(code));
--    };
--    exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
--};
--
--
--module.exports = FileEntry;
--
--});
--
--// file: lib/common/plugin/FileError.js
--define("cordova/plugin/FileError", function(require, exports, module) {
--
--/**
-- * FileError
-- */
--function FileError(error) {
--  this.code = error || null;
--}
--
--// File error codes
--// Found in DOMException
--FileError.NOT_FOUND_ERR = 1;
--FileError.SECURITY_ERR = 2;
--FileError.ABORT_ERR = 3;
--
--// Added by File API specification
--FileError.NOT_READABLE_ERR = 4;
--FileError.ENCODING_ERR = 5;
--FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
--FileError.INVALID_STATE_ERR = 7;
--FileError.SYNTAX_ERR = 8;
--FileError.INVALID_MODIFICATION_ERR = 9;
--FileError.QUOTA_EXCEEDED_ERR = 10;
--FileError.TYPE_MISMATCH_ERR = 11;
--FileError.PATH_EXISTS_ERR = 12;
--
--module.exports = FileError;
--
--});
--
--// file: lib/common/plugin/FileReader.js
--define("cordova/plugin/FileReader", function(require, exports, module) {
--
--var exec = require('cordova/exec'),
--    modulemapper = require('cordova/modulemapper'),
--    utils = require('cordova/utils'),
--    File = require('cordova/plugin/File'),
--    FileError = require('cordova/plugin/FileError'),
--    ProgressEvent = require('cordova/plugin/ProgressEvent'),
--    origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader');
--
--/**
-- * This class reads the mobile device file system.
-- *
-- * For Android:
-- *      The root directory is the root of the file system.
-- *      To read from the SD card, the file name is "sdcard/my_file.txt"
-- * @constructor
-- */
--var FileReader = function() {
--    this._readyState = 0;
--    this._error = null;
--    this._result = null;
--    this._fileName = '';
--    this._realReader = origFileReader ? new origFileReader() : {};
--};
--
--// States
--FileReader.EMPTY = 0;
--FileReader.LOADING = 1;
--FileReader.DONE = 2;
--
--utils.defineGetter(FileReader.prototype, 'readyState', function() {
--    return this._fileName ? this._readyState : this._realReader.readyState;
--});
--
--utils.defineGetter(FileReader.prototype, 'error', function() {
--    return this._fileName ? this._error: this._realReader.error;
--});
--
--utils.defineGetter(FileReader.prototype, 'result', function() {
--    return this._fileName ? this._result: this._realReader.result;
--});
--
--function defineEvent(eventName) {
--    utils.defineGetterSetter(FileReader.prototype, eventName, function() {
--        return this._realReader[eventName] || null;
--    }, function(value) {
--        this._realReader[eventName] = value;
--    });
--}
--defineEvent('onloadstart');    // When the read starts.
--defineEvent('onprogress');     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
--defineEvent('onload');         // When the read has successfully completed.
--defineEvent('onerror');        // When the read has failed (see errors).
--defineEvent('onloadend');      // When the request has completed (either in success or failure).
--defineEvent('onabort');        // When the read has been aborted. For instance, by invoking the abort() method.
--
--function initRead(reader, file) {
--    // Already loading something
--    if (reader.readyState == FileReader.LOADING) {
--      throw new FileError(FileError.INVALID_STATE_ERR);
--    }
--
--    reader._result = null;
--    reader._error = null;
--    reader._readyState = FileReader.LOADING;
--
--    if (typeof file.fullPath == 'string') {
--        reader._fileName = file.fullPath;
--    } else {
--        reader._fileName = '';
--        return true;
--    }
--
--    reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader}));
--}
--
--/**
-- * Abort reading file.
-- */
--FileReader.prototype.abort = function() {
--    if (origFileReader && !this._fileName) {
--        return this._realReader.abort();
--    }
--    this._result = null;
--
--    if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) {
--      return;
--    }
--
--    this._readyState = FileReader.DONE;
--
--    // If abort callback
--    if (typeof this.onabort === 'function') {
--        this.onabort(new ProgressEvent('abort', {target:this}));
--    }
--    // If load end callback
--    if (typeof this.onloadend === 'function') {
--        this.onloadend(new ProgressEvent('loadend', {target:this}));
--    }
--};
--
--/**
-- * Read text file.
-- *
-- * @param file          {File} File object containing file properties
-- * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
-- */
--FileReader.prototype.readAsText = function(file, encoding) {
--    if (initRead(this, file)) {
--        return this._realReader.readAsText(file, encoding);
--    }
--
--    // Default encoding is UTF-8
--    var enc = encoding ? encoding : "UTF-8";
--    var me = this;
--    var execArgs = [this._fileName, enc, file.start, file.end];
--
--    // Read file
--    exec(
--        // Success callback
--        function(r) {
--            // If DONE (cancelled), then don't do anything
--            if (me._readyState === FileReader.DONE) {
--                return;
--            }
--
--            // Save result
--            me._result = r;
--
--            // If onload callback
--            if (typeof me.onload === "function") {
--                me.onload(new ProgressEvent("load", {target:me}));
--            }
--
--            // DONE state
--            me._readyState = FileReader.DONE;
--
--            // If onloadend callback
--            if (typeof me.onloadend === "function") {
--                me.onloadend(new ProgressEvent("loadend", {target:me}));
--            }
--        },
--        // Error callback
--        function(e) {
--            // If DONE (cancelled), then don't do anything
--            if (me._readyState === FileReader.DONE) {
--                return;
--            }
--
--            // DONE state
--            me._readyState = FileReader.DONE;
--
--            // null result
--            me._result = null;
--
--            // Save error
--            me._error = new FileError(e);
--
--            // If onerror callback
--            if (typeof me.onerror === "function") {
--                me.onerror(new ProgressEvent("error", {target:me}));
--            }
--
--            // If onloadend callback
--            if (typeof me.onloadend === "function") {
--                me.onloadend(new ProgressEvent("loadend", {target:me}));
--            }
--        }, "File", "readAsText", execArgs);
--};
--
--
--/**
-- * Read file and return data as a base64 encoded data url.
-- * A data url is of the form:
-- *      data:[<mediatype>][;base64],<data>
-- *
-- * @param file          {File} File object containing file properties
-- */
--FileReader.prototype.readAsDataURL = function(file) {
--    if (initRead(this, file)) {
--        return this._realReader.readAsDataURL(file);
--    }
--
--    var me = this;
--    var execArgs = [this._fileName, file.start, file.end];
--
--    // Read file
--    exec(
--        // Success callback
--        function(r) {
--            // If DONE (cancelled), then don't do anything
--            if (me._readyState === FileReader.DONE) {
--                return;
--            }
--
--            // DONE state
--            me._readyState = FileReader.DONE;
--
--            // Save result
--            me._result = r;
--
--            // If onload callback
--            if (typeof me.onload === "function") {
--                me.onload(new ProgressEvent("load", {target:me}));
--            }
--
--            // If onloadend callback
--            if (typeof me.onloadend === "function") {
--                me.onloadend(new ProgressEvent("loadend", {target:me}));
--            }
--        },
--        // Error callback
--        function(e) {
--            // If DONE (cancelled), then don't do anything
--            if (me._readyState === FileReader.DONE) {
--                return;
--            }
--
--            // DONE state
--            me._readyState = FileReader.DONE;
--
--            me._result = null;
--
--            // Save error
--            me._error = new FileError(e);
--
--            // If onerror callback
--            if (typeof me.onerror === "function") {
--                me.onerror(new ProgressEvent("error", {target:me}));
--            }
--
--            // If onloadend callback
--            if (typeof me.onloadend === "function") {
--                me.onloadend(new ProgressEvent("loadend", {target:me}));
--            }
--        }, "File", "readAsDataURL", execArgs);
--};
--
--/**
-- * Read file and return data as a binary data.
-- *
-- * @param file          {File} File object containing file properties
-- */
--FileReader.prototype.readAsBinaryString = function(file) {
--    if (initRead(this, file)) {
--        return this._realReader.readAsBinaryString(file);
--    }
--
--    var me = this;
--    var execArgs = [this._fileName, file.start, file.end];
--
--    // Read file
--    exec(
--        // Success callback
--        function(r) {
--            // If DONE (cancelled), then don't do anything
--            if (me._readyState === FileReader.DONE) {
--                return;
--            }
--
--            // DONE state
--            me._readyState = FileReader.DONE;
--
--            me._result = r;
--
--            // If onload callback
--            if (typeof me.onload === "function") {
--                me.onload(new ProgressEvent("load", {target:me}));
--            }
--
--            // If onloadend callback
--            if (typeof me.onloadend === "function") {
--                me.onloadend(new ProgressEvent("loadend", {target:me}));
--            }
--        },
--        // Error callback
--        function(e) {
--            // If DONE (cancelled), then don't do anything
--            if (me._readyState === FileReader.DONE) {
--                return;
--            }
--
--            // DONE state
--            me._readyState = FileReader.DONE;
--
--            me._result = null;
--
--            // Save error
--            me._error = new FileError(e);
--
--            // If onerror callback
--            if (typeof me.onerror === "function") {
--                me.onerror(new ProgressEvent("error", {target:me}));
--            }
--
--            // If onloadend callback
--            if (typeof me.onloadend === "function") {
--                me.onloadend(new ProgressEvent("loadend", {target:me}));
--            }
--        }, "File", "readAsBinaryString", execArgs);
--};
--
--/**
-- * Read file and return data as a binary data.
-- *
-- * @param file          {File} File object containing file properties
-- */
--FileReader.prototype.readAsArrayBuffer = function(file) {
--    if (initRead(this, file)) {
--        return this._realReader.readAsArrayBuffer(file);
--    }
--
--    var me = this;
--    var execArgs = [this._fileName, file.start, file.end];
--
--    // Read file
--    exec(
--        // Success callback
--        function(r) {
--            // If DONE (cancelled), then don't do anything
--            if (me._readyState === FileReader.DONE) {
--                return;
--            }
--
--            // DONE state
--            me._readyState = FileReader.DONE;
--
--            me._result = r;
--
--            // If onload callback
--            if (typeof me.onload === "function") {
--                me.onload(new ProgressEvent("load", {target:me}));
--            }
--
--            // If onloadend callback
--            if (typeof me.onloadend === "function") {
--                me.onloadend(new ProgressEvent("loadend", {target:me}));
--            }
--        },
--        // Error callback
--        function(e) {
--            // If DONE (cancelled), then don't do anything
--            if (me._readyState === FileReader.DONE) {
--                return;
--            }
--
--            // DONE state
--            me._readyState = FileReader.DONE;
--
--            me._result = null;
--
--            // Save error
--            me._error = new FileError(e);
--
--            // If onerror callback
--            if (typeof me.onerror === "function") {
--                me.onerror(new ProgressEvent("error", {target:me}));
--            }
--
--            // If onloadend callback
--            if (typeof me.onloadend === "function") {
--                me.onloadend(new ProgressEvent("loadend", {target:me}));
--            }
--        }, "File", "readAsArrayBuffer", execArgs);
--};
--
--module.exports = FileReader;
--
--});
--
--// file: lib/common/plugin/FileSystem.js
--define("cordova/plugin/FileSystem", function(require, exports, module) {
--
--var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
--
--/**
-- * An interface representing a file system
-- *
-- * @constructor
-- * {DOMString} name the unique name of the file system (readonly)
-- * {DirectoryEntry} root directory of the file system (readonly)
-- */
--var FileSystem = function(name, root) {
--    this.name = name || null;
--    if (root) {
--        this.root = new DirectoryEntry(root.name, root.fullPath);
--    }
--};
--
--module.exports = FileSystem;
--
--});
--
--// file: lib/common/plugin/FileTransfer.js
--define("cordova/plugin/FileTransfer", function(require, exports, module) {
--
--var argscheck = require('cordova/argscheck'),
--    exec = require('cordova/exec'),
--    FileTransferError = require('cordova/plugin/FileTransferError'),
--    ProgressEvent = require('cordova/plugin/ProgressEvent');
--
--function newProgressEvent(result) {
--    var pe = new ProgressEvent();
--    pe.lengthComputable = result.lengthComputable;
--    pe.loaded = result.loaded;
--    pe.total = result.total;
--    return pe;
--}
--
--function getBasicAuthHeader(urlString) {
--    var header =  null;
--
--    if (window.btoa) {
--        // parse the url using the Location object
--        var url = document.createElement('a');
--        url.href = urlString;
--
--        var credentials = null;
--        var protocol = url.protocol + "//";
--        var origin = protocol + url.host;
--
--        // check whether there are the username:password credentials in the url
--        if (url.href.indexOf(origin) !== 0) { // credentials found
--            var atIndex = url.href.indexOf("@");
--            credentials = url.href.substring(protocol.length, atIndex);
--        }
--
--        if (credentials) {
--            var authHeader = "Authorization";
--            var authHeaderValue = "Basic " + window.btoa(credentials);
--
--            header = {
--                name : authHeader,
--                value : authHeaderValue
--            };
--        }
--    }
--
--    return header;
--}
--
--var idCounter = 0;
--
--/**
-- * FileTransfer uploads a file to a remote server.
-- * @constructor
-- */
--var FileTransfer = function() {
--    this._id = ++idCounter;
--    this.onprogress = null; // optional callback
--};
--
--/**
--* Given an absolute file path, uploads a file on the device to a remote server
--* using a multipart HTTP request.
--* @param filePath {String}           Full path of the file on the device
--* @param server {String}             URL of the server to receive the file
--* @param successCallback (Function}  Callback to be invoked when upload has completed
--* @param errorCallback {Function}    Callback to be invoked upon error
--* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
--* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
--*/
--FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
--    argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments);
--    // check for options
--    var fileKey = null;
--    var fileName = null;
--    var mimeType = null;
--    var params = null;
--    var chunkedMode = true;
--    var headers = null;
--    var httpMethod = null;
--    var basicAuthHeader = getBasicAuthHeader(server);
--    if (basicAuthHeader) {
--        options = options || {};
--        options.headers = options.headers || {};
--        options.headers[basicAuthHeader.name] = basicAuthHeader.value;
--    }
--
--    if (options) {
--        fileKey = options.fileKey;
--        fileName = options.fileName;
--        mimeType = options.mimeType;
--        headers = options.headers;
--        httpMethod = options.httpMethod || "POST";
--        if (httpMethod.toUpperCase() == "PUT"){
--            httpMethod = "PUT";
--        } else {
--            httpMethod = "POST";
--        }
--        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
--            chunkedMode = options.chunkedMode;
--        }
--        if (options.params) {
--            params = options.params;
--        }
--        else {
--            params = {};
--        }
--    }
--
--    var fail = errorCallback && function(e) {
--        var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body);
--        errorCallback(error);
--    };
--
--    var self = this;
--    var win = function(result) {
--        if (typeof result.lengthComputable != "undefined") {
--            if (self.onprogress) {
--                self.onprogress(newProgressEvent(result));
--            }
--        } else {
--            successCallback && successCallback(result);
--        }
--    };
--    exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]);
--};
--
--/**
-- * Downloads a file form a given URL and saves it to the specified directory.
-- * @param source {String}          URL of the server to receive the file
-- * @param target {String}         Full path of the file on the device
-- * @param successCallback (Function}  Callback to be invoked when upload has completed
-- * @param errorCallback {Function}    Callback to be invoked upon error
-- * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
-- * @param options {FileDownloadOptions} Optional parameters such as headers
-- */
--FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) {
--    argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments);
--    var self = this;
--
--    var basicAuthHeader = getBasicAuthHeader(source);
--    if (basicAuthHeader) {
--        options = options || {};
--        options.headers = options.headers || {};
--        options.headers[basicAuthHeader.name] = basicAuthHeader.value;
--    }
--
--    var headers = null;
--    if (options) {
--        headers = options.headers || null;
--    }
--
--    var win = function(result) {
--        if (typeof result.lengthComputable != "undefined") {
--            if (self.onprogress) {
--                return self.onprogress(newProgressEvent(result));
--            }
--        } else if (successCallback) {
--            var entry = null;
--            if (result.isDirectory) {
--                entry = new (require('cordova/plugin/DirectoryEntry'))();
--            }
--            else if (result.isFile) {
--                entry = new (require('cordova/plugin/FileEntry'))();
--            }
--            entry.isDirectory = result.isDirectory;
--            entry.isFile = result.isFile;
--            entry.name = result.name;
--            entry.fullPath = result.fullPath;
--            successCallback(entry);
--        }
--    };
--
--    var fail = errorCallback && function(e) {
--        var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body);
--        errorCallback(error);
--    };
--
--    exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]);
--};
--
--/**
-- * Aborts the ongoing file transfer on this object. The original error
-- * callback for the file transfer will be called if necessary.
-- */
--FileTransfer.prototype.abort = function() {
--    exec(null, null, 'FileTransfer', 'abort', [this._id]);
--};
--
--module.exports = FileTransfer;
--
--});
--
--// file: lib/common/plugin/FileTransferError.js
--define("cordova/plugin/FileTransferError", function(require, exports, module) {
--
--/**
-- * FileTransferError
-- * @constructor
-- */
--var FileTransferError = function(code, source, target, status, body) {
--    this.code = code || null;
--    this.source = source || null;
--    this.target = target || null;
--    this.http_status = status || null;
--    this.body = body || null;
--};
--
--FileTransferError.FILE_NOT_FOUND_ERR = 1;
--FileTransferError.INVALID_URL_ERR = 2;
--FileTransferError.CONNECTION_ERR = 3;
--FileTransferError.ABORT_ERR = 4;
--
--module.exports = FileTransferError;
--
--});
--
--// file: lib/common/plugin/FileUploadOptions.js
--define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
--
--/**
-- * Options to customize the HTTP request used to upload files.
-- * @constructor
-- * @param fileKey {String}   Name of file request parameter.
-- * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
-- * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
-- * @param params {Object}    Object with key: value params to send to the server.
-- * @param headers {Object}   Keys are header names, values are header values. Multiple
-- *                           headers of the same name are not supported.
-- */
--var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers, httpMethod) {
--    this.fileKey = fileKey || null;
--    this.fileName = fileName || null;
--    this.mimeType = mimeType || null;
--    this.params = params || null;
--    this.headers = headers || null;
--    this.httpMethod = httpMethod || null;
--};
--
--module.exports = FileUploadOptions;
--
--});
--
--// file: lib/common/plugin/FileUploadResult.js
--define("cordova/plugin/FileUploadResult", function(require, exports, module) {
--
--/**
-- * FileUploadResult
-- * @constructor
-- */
--var FileUploadResult = function() {
--    this.bytesSent = 0;
--    this.responseCode = null;
--    this.response = null;
--};
--
--module.exports = FileUploadResult;
--
--});
--
--// file: lib/common/plugin/FileWriter.js
--define("cordova/plugin/FileWriter", function(require, exports, module) {
--
--var exec = require('cordova/exec'),
--    FileError = require('cordova/plugin/FileError'),
--    ProgressEvent = require('cordova/plugin/ProgressEvent');
--
--/**
-- * This class writes to the mobile device file system.
-- *
-- * For Android:
-- *      The root directory is the root of the file system.
-- *      To write to the SD card, the file name is "sdcard/my_file.txt"
-- *
-- * @constructor
-- * @param file {File} File object containing file properties
-- * @param append if true write to the end of the file, otherwise overwrite the file
-- */
--var FileWriter = function(file) {
--    this.fileName = "";
--    this.length = 0;
--    if (file) {
--        this.fileName = file.fullPath || file;
--        this.length = file.size || 0;
--    }
--    // default is to write at the beginning of the file
--    this.position = 0;
--
--    this.readyState = 0; // EMPTY
--
--    this.result = null;
--
--    // Error
--    this.error = null;
--
--    // Event handlers
--    this.onwritestart = null;   // When writing starts
--    this.onprogress = null;     // While writing the file, and reporting partial file data
--    this.onwrite = null;        // When the write has successfully completed.
--    this.onwriteend = null;     // When the request has completed (either in success or failure).
--    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
--    this.onerror = null;        // When the write has failed (see errors).
--};
--
--// States
--FileWriter.INIT = 0;
--FileWriter.WRITING = 1;
--FileWriter.DONE = 2;
--
--/**
-- * Abort writing file.
-- */
--FileWriter.prototype.abort = function() {
--    // check for invalid state
--    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
--        throw new FileError(FileError.INVALID_STATE_ERR);
--    }
--
--    // set error
--    this.error = new FileError(FileError.ABORT_ERR);
--
--    this.readyState = FileWriter.DONE;
--
--    // If abort callback
--    if (typeof this.onabort === "function") {
--        this.onabort(new ProgressEvent("abort", {"target":this}));
--    }
--
--    // If write end callback
--    if (typeof this.onwriteend === "function") {
--        this.onwriteend(new ProgressEvent("writeend", {"target":this}));
--    }
--};
--
--/**
-- * Writes data to the file
-- *
-- * @param data text or blob to be written
-- */
--FileWriter.prototype.write = function(data) {
--
--    var isBinary = false;
--
--    // If we don't have Blob or ArrayBuffer support, don't bother.
--    if (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined') {
--
--        // Check to see if the incoming data is a blob
--        if (data instanceof Blob) {
--            var that=this;
--            var fileReader = new FileReader();
--            fileReader.onload = function() {
--                // Call this method again, with the arraybuffer as argument
--                FileWriter.prototype.write.call(that, this.result);
--            };
--            fileReader.readAsArrayBuffer(data);
--            return;
--        }
--
--        // Mark data type for safer transport over the binary bridge
--        isBinary = (data instanceof ArrayBuffer);
--    }
--
--    // Throw an exception if we are already writing a file
--    if (this.readyState === FileWriter.WRITING) {
--        throw new FileError(FileError.INVALID_STATE_ERR);
--    }
--
--    // WRITING state
--    this.readyState = FileWriter.WRITING;
--
--    var me = this;
--
--    // If onwritestart callback
--    if (typeof me.onwritestart === "function") {
--        me.onwritestart(new ProgressEvent("writestart", {"target":me}));
--    }
--
--    // Write file
--    exec(
--        // Success callback
--        function(r) {
--            // If DONE (cancelled), then don't do anything
--            if (me.readyState === FileWriter.DONE) {
--                return;
--            }
--
--            // position always increases by bytes written because file would be extended
--            me.position += r;
--            // The length of the file is now where we are done writing.
--
--            me.length = me.position;
--
--            // DONE state
--            me.readyState = FileWriter.DONE;
--
--            // If onwrite callback
--            if (typeof me.onwrite === "function") {
--                me.onwrite(new ProgressEvent("write", {"target":me}));
--            }
--
--            // If onwriteend callback
--            if (typeof me.onwriteend === "function") {
--                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
--            }
--        },
--        // Error callback
--        function(e) {
--            // If DONE (cancelled), then don't do anything
--            if (me.readyState === FileWriter.DONE) {
--                return;
--            }
--
--            // DONE state
--            me.readyState = FileWriter.DONE;
--
--            // Save error
--            me.error = new FileError(e);
--
--            // If onerror callback
--            if (typeof me.onerror === "function") {
--                me.onerror(new ProgressEvent("error", {"target":me}));
--            }
--
--            // If onwriteend callback
--            if (typeof me.onwriteend === "function") {
--                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
--            }
--        }, "File", "write", [this.fileName, data, this.position, isBinary]);
--};
--
--/**
-- * Moves the file pointer to the location specified.
-- *
-- * If the offset is a negative number the position of the file
-- * pointer is rewound.  If the offset is greater than the file
-- * size the position is set to the end of the file.
-- *
-- * @param offset is the location to move the file pointer to.
-- */
--FileWriter.prototype.seek = function(offset) {
--    // Throw an exception if we are already writing a file
--    if (this.readyState === FileWriter.WRITING) {
--        throw new FileError(FileError.INVALID_STATE_ERR);
--    }
--
--    if (!offset && offset !== 0) {
--        return;
--    }
--
--    // See back from end of file.
--    if (offset < 0) {
--        this.position = Math.max(offset + this.length, 0);
--    }
--    // Offset is bigger than file size so set position
--    // to the end of the file.
--    else if (offset > this.length) {
--        this.position = this.length;
--    }
--    // Offset is between 0 and file size so set the position
--    // to start writing.
--    else {
--        this.position = offset;
--    }
--};
--
--/**
-- * Truncates the file to the size specified.
-- *
-- * @param size to chop the file at.
-- */
--FileWriter.prototype.truncate = function(size) {
--    // Throw an exception if we are already writing a file
--    if (this.readyState === FileWriter.WRITING) {
--        throw new FileError(FileError.INVALID_STATE_ERR);
--    }
--
--    // WRITING state
--    this.readyState = FileWriter.WRITING;
--
--    var me = this;
--
--    // If onwritestart callback
--    if (typeof me.onwritestart === "function") {
--        me.onwritestart(new ProgressEvent("writestart", {"target":this}));
--    }
--
--    // Write file
--    exec(
--        // Success callback
--        function(r) {
--            // If DONE (cancelled), then don't do anything
--            if (me.readyState === FileWriter.DONE) {
--                return;
--            }
--
--            // DONE state
--            me.readyState = FileWriter.DONE;
--
--            // Update the length of the file
--            me.length = r;
--            me.position = Math.min(me.position, r);
--
--            // If onwrite callback
--            if (typeof me.onwrite === "function") {
--                me.onwrite(new ProgressEvent("write", {"target":me}));
--            }
--
--            // If onwriteend callback
--            if (typeof me.onwriteend === "function") {
--                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
--            }
--        },
--        // Error callback
--        function(e) {
--            // If DONE (cancelled), then don't do anything
--            if (me.readyState === FileWriter.DONE) {
--                return;
--            }
--
--            // DONE state
--            me.readyState = FileWriter.DONE;
--
--            // Save error
--            me.error = new FileError(e);
--
--            // If onerror callback
--            if (typeof me.onerror === "function") {
--                me.onerror(new ProgressEvent("error", {"target":me}));
--            }
--
--            // If onwriteend callback
--            if (typeof me.onwriteend === "function") {
--                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
--            }
--        }, "File", "truncate", [this.fileName, size]);
--};
--
--module.exports = FileWriter;
--
--});
--
--// file: lib/common/plugin/Flags.js
--define("cordova/plugin/Flags", function(require, exports, module) {
--
--/**
-- * Supplies arguments to methods that lookup or create files and directories.
-- *
-- * @param create
-- *            {boolean} file or directory if it doesn't exist
-- * @param exclusive
-- *            {boolean} used with create; if true the command will fail if
-- *            target path exists
-- */
--function Flags(create, exclusive) {
--    this.create = create || false;
--    this.exclusive = exclusive || false;
--}
--
--module.exports = Flags;
--
--});
--
--// file: lib/common/plugin/GlobalizationError.js
--define("cordova/plugin/GlobalizationError", function(require, exports, module) {
--
--
--/**
-- * Globalization error object
-- *
-- * @constructor
-- * @param code
-- * @param message
-- */
--var GlobalizationError = function(code, message) {
--    this.code = code || null;
--    this.message = message || '';
--};
--
--// Globalization error codes
--GlobalizationError.UNKNOWN_ERROR = 0;
--GlobalizationError.FORMATTING_ERROR = 1;
--GlobalizationError.PARSING_ERROR = 2;
--GlobalizationError.PATTERN_ERROR = 3;
--
--module.exports = GlobalizationError;
--
--});
--
--// file: lib/common/plugin/InAppBrowser.js
--define("cordova/plugin/InAppBrowser", function(require, exports, module) {
--
--var exec = require('cordova/exec');
--var channel = require('cordova/channel');
--var modulemapper = require('cordova/modulemapper');
--
--function InAppBrowser() {
--   this.channels = {
--        'loadstart': channel.create('loadstart'),
--        'loadstop' : channel.create('loadstop'),
--        'loaderror' : channel.create('loaderror'),
--        'exit' : channel.create('exit')
--   };
--}
--
--InAppBrowser.prototype = {
--    _eventHandler: function (event) {
--        if (event.type in this.channels) {
--            this.channels[event.type].fire(event);
--        }
--    },
--    close: function (eventname) {
--        exec(null, null, "InAppBrowser", "close", []);
--    },
--    show: function (eventname) {
--      exec(null, null, "InAppBrowser", "show", []);
--    },
--    addEventListener: function (eventname,f) {
--        if (eventname in this.channels) {
--            this.channels[eventname].subscribe(f);
--        }
--    },
--    removeEventListener: function(eventname, f) {
--        if (eventname in this.channels) {
--            this.channels[eventname].unsubscribe(f);
--        }
--    },
--
--    executeScript: function(injectDetails, cb) {
--        if (injectDetails.code) {
--            exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
--        } else if (injectDetails.file) {
--            exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
--        } else {
--            throw new Error('executeScript requires exactly one of code or file to be specified');
--        }
--    },
--
--    insertCSS: function(injectDetails, cb) {
--        if (injectDetails.code) {
--            exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
--        } else if (injectDetails.file) {
--            exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
--        } else {
--            throw new Error('insertCSS requires exactly one of code or file to be specified');
--        }
--    }
--};
--
--module.exports = function(strUrl, strWindowName, strWindowFeatures) {
--    var iab = new InAppBrowser();
--    var cb = function(eventname) {
--       iab._eventHandler(eventname);
--    };
--
--    // Don't catch calls that write to existing frames (e.g. named iframes).
--    if (window.frames && window.frames[strWindowName]) {
--        var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
--        return origOpenFunc.apply(window, arguments);
--    }
--
--    exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
--    return iab;
--};
--
--
--});
--
--// file: lib/common/plugin/LocalFileSystem.js
--define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
--
--var exec = require('cordova/exec');
--
--/**
-- * Represents a local file system.
-- */
--var LocalFileSystem = function() {
--
--};
--
--LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
--LocalFileSystem.PERSISTENT = 1; //persistent
--
--module.exports = LocalFileSystem;
--
--});
--
--// file

<TRUNCATED>