You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by fi...@apache.org on 2012/05/19 00:22:01 UTC

[1/3] webworks commit: [CB-465] Simplified accel plugin (still based on Drews implementation) to just start/stop actions.

Updated Branches:
  refs/heads/master b47ab02b4 -> 9590c2069


[CB-465] Simplified accel plugin (still based on Drews implementation) to just start/stop actions.


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-blackberry-webworks/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-blackberry-webworks/commit/9590c206
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-blackberry-webworks/tree/9590c206
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-blackberry-webworks/diff/9590c206

Branch: refs/heads/master
Commit: 9590c20690abb4eb06176cdf99d6f88b0f925739
Parents: b28459c
Author: Fil Maj <ma...@gmail.com>
Authored: Fri May 18 15:04:47 2012 -0700
Committer: Fil Maj <ma...@gmail.com>
Committed: Fri May 18 15:04:47 2012 -0700

----------------------------------------------------------------------
 .../cordova/accelerometer/Accelerometer.java       |  176 +++------------
 javascript/cordova.blackberry.js                   |  101 +++++++--
 2 files changed, 106 insertions(+), 171 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-blackberry-webworks/blob/9590c206/framework/ext/src/org/apache/cordova/accelerometer/Accelerometer.java
----------------------------------------------------------------------
diff --git a/framework/ext/src/org/apache/cordova/accelerometer/Accelerometer.java b/framework/ext/src/org/apache/cordova/accelerometer/Accelerometer.java
index 09e6aef..2088122 100644
--- a/framework/ext/src/org/apache/cordova/accelerometer/Accelerometer.java
+++ b/framework/ext/src/org/apache/cordova/accelerometer/Accelerometer.java
@@ -37,9 +37,8 @@ import org.apache.cordova.util.Logger;
 public class Accelerometer extends Plugin implements AccelerometerListener {
     private static final String LOG_TAG = "Accelerometer: ";
 
-    private static final String ACTION_GET_ACCELERATION = "getAcceleration";
-    private static final String ACTION_ADD_WATCH = "addWatch";
-    private static final String ACTION_CLEAR_WATCH = "clearWatch";
+    private static final String ACTION_START = "start";
+    private static final String ACTION_STOP = "stop";
 
     private static final int STOPPED = 0;
     private static final int STARTING = 1;
@@ -58,58 +57,29 @@ public class Accelerometer extends Plugin implements AccelerometerListener {
     private long initTime = 0;
 
     /**
-     * Hash of all the listeners created, keyed on callback ids.
+     * Reference to single start callbackid
      */
-    private final Vector callbackIds = new Vector();
-    private final Hashtable watchIds = new Hashtable();
+    private String callbackId;
 
     public PluginResult execute(String action, JSONArray args, String callbackId) {
         PluginResult result;
-        try {
-            if (!AccelerometerSensor.isSupported()) {
-                result = new PluginResult(
-                        PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION,
-                        "Accelerometer sensor not supported");
-            } else if (ACTION_GET_ACCELERATION.equals(action)) {
-                result = getAcceleration(callbackId);
-            } else if (ACTION_ADD_WATCH.equals(action)) {
-                String watchId = args.getString(0);
-                result = addWatch(watchId, callbackId);
-            } else if (ACTION_CLEAR_WATCH.equals(action)) {
-                String watchId = args.getString(0);
-                result = clearWatch(watchId);
-            } else {
-                result = new PluginResult(PluginResult.Status.INVALID_ACTION,
-                        "Accelerometer: Invalid action:" + action);
-            }
-        } catch (JSONException e) {
-            result = new PluginResult(PluginResult.Status.JSON_EXCEPTION,
-                    e.getMessage());
+        if (!AccelerometerSensor.isSupported()) {
+            result = new PluginResult(
+                    PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION,
+                    "Accelerometer sensor not supported");
+        } else if (ACTION_START.equals(action)) {
+            result = start(callbackId);
+        } else if (ACTION_STOP.equals(action)) {
+            result = stop();
+        } else {
+            result = new PluginResult(PluginResult.Status.INVALID_ACTION,
+                    "Accelerometer: Invalid action:" + action);
         }
 
         return result;
     }
 
     /**
-     * Identifies if action to be executed returns a value and should be run
-     * synchronously.
-     *
-     * @param action
-     *            The action to execute
-     * @return T=returns value
-     */
-    public boolean isSynch(String action) {
-        if (ACTION_GET_ACCELERATION.equals(action) && state == RUNNING) {
-            return true;
-        } else if (ACTION_ADD_WATCH.equals(action) && state == RUNNING) {
-            return true;
-        } else if (ACTION_CLEAR_WATCH.equals(action)) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
      * Implements the AccelerometerListener method. We listen for the purpose of
      * closing the application's accelerometer sensor channel after timeout has
      * been exceeded.
@@ -161,15 +131,15 @@ public class Accelerometer extends Plugin implements AccelerometerListener {
      * Called when Plugin is destroyed.
      */
     public void onDestroy() {
-        // Close out the call back IDs and stop.
-        sendResult(true, new PluginResult(PluginResult.Status.NO_RESULT), false);
+        stop();
     }
 
     /**
      * Adds a SystemListener to listen for changes to the battery state. The
      * listener is only registered if one has not already been added.
      */
-    private int addListener() {
+    private PluginResult start(String callbackId) {
+        this.callbackId = callbackId;
         if (_rawDataChannel == null || !_rawDataChannel.isOpen()) {
             _rawDataChannel = AccelerometerSensor
                     .openRawDataChannel(Application.getApplication());
@@ -181,75 +151,8 @@ public class Accelerometer extends Plugin implements AccelerometerListener {
             Logger.log(LOG_TAG + "sensor listener added");
         }
 
-        return state;
-    }
-
-    /**
-     * Track the specified watch ID and start the accelerometer channel if it
-     * hasn't been started.
-     *
-     * @param watchId
-     * @param callbackId
-     * @return
-     */
-    private synchronized PluginResult addWatch(String watchId, String callbackId) {
-        watchIds.put(watchId, callbackId);
-        addListener();
-        PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT,
-                "");
+        PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
         result.setKeepCallback(true);
-
-        return result;
-    }
-
-    /**
-     * Removes the specified watch ID and stops the accelerometer channel if
-     * this it was the last active listener.
-     *
-     * @param watchId
-     * @return
-     */
-    private synchronized PluginResult clearWatch(String watchId) {
-        if (watchIds.containsKey(watchId)) {
-            watchIds.remove(watchId);
-            if (watchIds.size() == 0 && callbackIds.size() == 0) {
-                stop();
-            }
-        }
-        return new PluginResult(PluginResult.Status.OK, "");
-    }
-
-    /**
-     * If the sensor is active, return the last acquired accelerometer data,
-     * otherwise start the sensor and listen for data.
-     *
-     * @return AccelerometerData with last acceleration data
-     */
-    private synchronized PluginResult getAcceleration(String callbackId) {
-        PluginResult result;
-
-        if (state != RUNNING) {
-            callbackIds.addElement(callbackId);
-            addListener();
-            result = new PluginResult(PluginResult.Status.NO_RESULT, "");
-            result.setKeepCallback(true);
-        } else {
-            // get the last acceleration
-            AccelerometerData accelData = _rawDataChannel
-                    .getAccelerometerData();
-            JSONObject accel = new JSONObject();
-            try {
-                accel.put("x", normalize(accelData.getLastXAcceleration()));
-                accel.put("y", normalize(accelData.getLastYAcceleration()));
-                accel.put("z", normalize(accelData.getLastZAcceleration()));
-                accel.put("timestamp", accelData.getLastTimestamp());
-                result = new PluginResult(PluginResult.Status.OK, accel);
-            } catch (JSONException e) {
-                result = new PluginResult(PluginResult.Status.JSON_EXCEPTION,
-                        "JSONException:" + e.getMessage());
-            }
-        }
-
         return result;
     }
 
@@ -279,7 +182,7 @@ public class Accelerometer extends Plugin implements AccelerometerListener {
     }
 
     /**
-     * Helper function to send a PluginResult to the saved call back IDs.
+     * Helper function to send a PluginResult to the saved call back ID.
      *
      * @param issuccess
      *            true if this is a successful result, false otherwise.
@@ -296,45 +199,18 @@ public class Accelerometer extends Plugin implements AccelerometerListener {
             // Must keep the call back active for future watch events.
             result.setKeepCallback(keepCallback);
 
-            // Iterate through the saved watch IDs.
-            for (Enumeration watches = watchIds.elements(); watches
-                    .hasMoreElements();) {
-                if (issuccess) {
-                    success(result, (String) watches.nextElement());
-                } else {
-                    error(result, (String) watches.nextElement());
-                }
-            }
-
-            // callbackIds are from getAcceleration() requests so they are
-            // one time and should not keep callback.
-            result.setKeepCallback(false);
-
-            // Iterate through the saved call back IDs.
-            for (Enumeration callbacks = callbackIds.elements(); callbacks
-                    .hasMoreElements();) {
-                if (issuccess) {
-                    success(result, (String) callbacks.nextElement());
-                } else {
-                    error(result, (String) callbacks.nextElement());
-                }
+            if (issuccess) {
+                success(result, this.callbackId);
+            } else {
+                error(result, this.callbackId);
             }
         }
-
-        if (!keepCallback) {
-            watchIds.clear();
-        }
-        callbackIds.removeAllElements();
-
-        if (watchIds.size() == 0) {
-            stop();
-        }
     }
 
     /**
      * Stops accelerometer listener and closes the sensor channel.
      */
-    private synchronized void stop() {
+    private synchronized PluginResult stop() {
         if (_rawDataChannel != null && _rawDataChannel.isOpen()) {
 
             // Remove the battery listener.
@@ -346,5 +222,7 @@ public class Accelerometer extends Plugin implements AccelerometerListener {
         }
 
         state = STOPPED;
+
+        return new PluginResult(PluginResult.Status.OK);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cordova-blackberry-webworks/blob/9590c206/javascript/cordova.blackberry.js
----------------------------------------------------------------------
diff --git a/javascript/cordova.blackberry.js b/javascript/cordova.blackberry.js
index fa272c8..2c01a63 100644
--- a/javascript/cordova.blackberry.js
+++ b/javascript/cordova.blackberry.js
@@ -1,6 +1,6 @@
-// commit 7b6ae77e5030060e8e99fe0b79ddcf9d698bf375
+// commit 4a4ba9985c920850fe3f229abc60de984e196ab5
 
-// File generated at :: Wed May 16 2012 10:03:30 GMT-0700 (PDT)
+// File generated at :: Fri May 18 2012 14:54:13 GMT-0700 (PDT)
 
 /*
  Licensed to the Apache Software Foundation (ASF) under one
@@ -3380,13 +3380,57 @@ var 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 = [];
+
 // 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 aquires the current acceleration.
@@ -3401,13 +3445,22 @@ var accelerometer = {
             throw "getCurrentAcceleration must be called with at least a success callback function as first parameter.";
         }
 
+        var p;
         var win = function(a) {
-            accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
-            successCallback(accel);
+            successCallback(a);
+            removeListeners(p);
+        };
+        var fail = function(e) {
+            errorCallback(e);
+            removeListeners(p);
         };
 
-        // Get acceleration
-        exec(win, errorCallback, "Accelerometer", "getAcceleration", []);
+        p = createCallbackPair(win, fail);
+        listeners.push(p);
+
+        if (!running) {
+            start();
+        }
     },
 
     /**
@@ -3429,24 +3482,28 @@ var accelerometer = {
 
         // Keep reference to watch id, and report accel readings as often as defined in frequency
         var id = utils.createUUID();
-        timers[id] = window.setInterval(function() {
-            if (accel) {
-                successCallback(accel);
-            }
-        }, frequency);
 
-        // Success callback from native just updates the accel object.
-        var win = function(a) {
-            accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
-        };
+        var p = createCallbackPair(function(){}, function(e) {
+            errorCallback(e);
+            removeListeners(p);
+        });
+        listeners.push(p);
 
-        // Fail callback clears the watch and sends an error back.
-        var fail = function(err) {
-            accelerometer.clearWatch(id);
-            errorCallback(err);
+        timers[id] = {
+            timer:window.setInterval(function() {
+                if (accel) {
+                    successCallback(accel);
+                }
+            }, frequency),
+            listeners:p
         };
 
-        exec(win, fail, "Accelerometer", "addWatch", [id, frequency]);
+        if (running) {
+            // If we're already running then immediately invoke the success callback
+            successCallback(accel);
+        } else {
+            start();
+        }
 
         return id;
     },
@@ -3459,9 +3516,9 @@ var accelerometer = {
     clearWatch: function(id) {
         // Stop javascript timer & remove from timer list
         if (id && timers[id]) {
-            window.clearInterval(timers[id]);
+            window.clearInterval(timers[id].timer);
+            removeListeners(timers[id].listeners);
             delete timers[id];
-            exec(null, null, "Accelerometer", "clearWatch", [id]);
         }
     }
 };