[Devicemotion] - plugin implemented
authorAndrzej Popowski <a.popowski@samsung.com>
Tue, 1 Dec 2015 11:05:18 +0000 (12:05 +0100)
committerAndrzej Popowski <a.popowski@samsung.com>
Tue, 1 Dec 2015 13:07:51 +0000 (14:07 +0100)
Change-Id: I51374abfdc70fa3b72302fd026d0c711af34c349
Signed-off-by: Andrzej Popowski <a.popowski@samsung.com>
src/cordova-api.gyp
src/devicemotion/cordova_devicemotion.gyp [new file with mode: 0644]
src/devicemotion/cordova_devicemotion_api.js [new file with mode: 0755]
src/devicemotion/cordova_devicemotion_extension.cc [new file with mode: 0755]
src/devicemotion/cordova_devicemotion_extension.h [new file with mode: 0755]
src/lib/cordova_plugins.js
src/lib/plugins/cordova-plugin-device-motion/www/Acceleration.js [new file with mode: 0644]
src/lib/plugins/cordova-plugin-device-motion/www/accelerometer.js [new file with mode: 0644]
test/unittest/tests/accelerometer.tests.js

index 24ed756..88eef3b 100644 (file)
@@ -10,6 +10,7 @@
       'dependencies': [
         'cordova/cordova.gyp:*',
         'device/cordova_device.gyp:*',
+        'devicemotion/cordova_devicemotion.gyp:*',
         'dialog/cordova_dialog.gyp:*',
         'file/cordova_file.gyp:*',
         'globalization/cordova_globalization.gyp:*',
diff --git a/src/devicemotion/cordova_devicemotion.gyp b/src/devicemotion/cordova_devicemotion.gyp
new file mode 100644 (file)
index 0000000..39990cf
--- /dev/null
@@ -0,0 +1,25 @@
+{
+  'includes':[
+    '/usr/include/webapi-plugins/src/common/common.gypi',
+  ],
+  'targets': [
+    {
+      'target_name': 'tizen_cordova_devicemotion',
+      'type': 'loadable_module',
+      'sources': [
+        'cordova_devicemotion_api.js',
+        'cordova_devicemotion_extension.cc',
+        'cordova_devicemotion_extension.h',
+      ],
+      'include_dirs': [
+        '../',
+        '<(SHARED_INTERMEDIATE_DIR)',
+      ],
+      'variables': {
+        'packages': [
+          'webapi-plugins',
+        ],
+      },
+    },
+  ],
+}
diff --git a/src/devicemotion/cordova_devicemotion_api.js b/src/devicemotion/cordova_devicemotion_api.js
new file mode 100755 (executable)
index 0000000..804cc38
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed 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.
+ */
+
+// TODO: remove when added to public cordova repository -> begin
+var plugin_name = 'cordova-plugin-device-motion.tizen.Accelerometer';
+
+cordova.define(plugin_name, function(require, exports, module) {
+// TODO: remove -> end
+
+var successCB = null;
+
+function listener(eventData) {
+  var accel = {};
+
+  accel.x = eventData.acceleration.x;
+  accel.y = eventData.acceleration.y;
+  accel.z = eventData.acceleration.z;
+  accel.timestamp = new Date().getTime();
+
+  if (accel.x === null || accel.y === null || accel.z === null) {
+    // Ignore first event with nulls
+    return;
+  }
+
+  successCB && successCB(accel);
+}
+
+var Accelerometer = {
+  start: function (success, error) {
+    if (!successCB) {
+      successCB = success;
+      window.addEventListener('devicemotion', listener, false);
+    }
+  }, stop: function () {
+    window.removeEventListener('devicemotion', listener, false);
+    successCB = null;
+  }
+};
+
+module.exports = Accelerometer;
+require('cordova/exec/proxy').add('Accelerometer', Accelerometer);
+
+console.log('Loaded cordova.device-motion API');
+
+// TODO: remove when added to public cordova repository -> begin
+});
+
+exports = function(require) {
+  require('cordova-tizen').addPlugin('cordova-plugin-device-motion.Accelerometer', plugin_name, 'runs');
+};
+// TODO: remove -> end
diff --git a/src/devicemotion/cordova_devicemotion_extension.cc b/src/devicemotion/cordova_devicemotion_extension.cc
new file mode 100755 (executable)
index 0000000..458e43b
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed 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.
+ */
+
+#include "devicemotion/cordova_devicemotion_extension.h"
+
+// This will be generated from cordova_devicemotion_api.js
+extern const char kSource_cordova_devicemotion_api[];
+
+common::Extension* CreateExtension() {
+  return new extension::cordova::devicemotion::CordovaDevicemotionExtension();
+}
+
+namespace extension {
+namespace cordova {
+namespace devicemotion {
+
+CordovaDevicemotionExtension::CordovaDevicemotionExtension() {
+  SetExtensionName("tizen.cordova.devicemotion");
+  SetJavaScriptAPI(kSource_cordova_devicemotion_api);
+}
+
+CordovaDevicemotionExtension::~CordovaDevicemotionExtension() {}
+
+}  // devicemotion
+}  // cordova
+}  // extension
diff --git a/src/devicemotion/cordova_devicemotion_extension.h b/src/devicemotion/cordova_devicemotion_extension.h
new file mode 100755 (executable)
index 0000000..734f928
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed 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.
+ */
+
+#ifndef DEVICEMOTION_CORDOVA_DEVICEMOTION_EXTENSION_H_
+#define DEVICEMOTION_CORDOVA_DEVICEMOTION_EXTENSION_H_
+
+#include <common/extension.h>
+
+namespace extension {
+namespace cordova {
+namespace devicemotion {
+
+class CordovaDevicemotionExtension : public common::Extension {
+ public:
+  CordovaDevicemotionExtension();
+  virtual ~CordovaDevicemotionExtension();
+};
+
+}  // devicemotion
+}  // cordova
+}  // extension
+
+#endif // DEVICEMOTION_CORDOVA_DEVICEMOTION_EXTENSION_H_
index e3baec6..04cfaa7 100644 (file)
@@ -22,6 +22,20 @@ module.exports = [
         ]
     },
     {
+        "file": "plugins/cordova-plugin-device-motion/www/accelerometer.js",
+        "id": "cordova-plugin-device-motion.Accelerometer",
+        "clobbers": [
+            "navigator.accelerometer"
+        ]
+    },
+    {
+        "file": "plugins/cordova-plugin-device-motion/www/Acceleration.js",
+        "id": "cordova-plugin-device-motion.Acceleration",
+        "clobbers": [
+            "navigator.Acceleration"
+        ]
+    },
+    {
         "file": "plugins/cordova-plugin-dialogs/www/notification.js",
         "id": "cordova-plugin-dialogs.notification",
         "merges": [
@@ -229,12 +243,13 @@ module.exports.metadata =
 {
     "cordova-plugin-console": "1.0.1",
     "cordova-plugin-device": "1.0.1",
+    "cordova-plugin-device-motion": "1.2.0",
     "cordova-plugin-dialogs": "1.1.1",
     "cordova-plugin-file": "3.0.0",
     "cordova-plugin-file-transfer": "1.3.0",
-    "cordova-plugin-network-information": "1.0.1",
     "cordova-plugin-globalization": "1.0.1",
     "cordova-plugin-media": "1.0.1",
+    "cordova-plugin-network-information": "1.0.1",
 }
 // BOTTOM OF METADATA
 });
diff --git a/src/lib/plugins/cordova-plugin-device-motion/www/Acceleration.js b/src/lib/plugins/cordova-plugin-device-motion/www/Acceleration.js
new file mode 100644 (file)
index 0000000..0095795
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ *
+ * 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.
+ *
+*/
+cordova.define("cordova-plugin-device-motion.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;
+
+});
diff --git a/src/lib/plugins/cordova-plugin-device-motion/www/accelerometer.js b/src/lib/plugins/cordova-plugin-device-motion/www/accelerometer.js
new file mode 100644 (file)
index 0000000..206c69c
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ *
+ * 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.
+ *
+*/
+cordova.define("cordova-plugin-device-motion.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('./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;
+
+// Timer used when faking up devicemotion events
+var eventTimerId = 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", []);
+    accel = null;
+    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);
+
+        if (cordova.platformId === "windowsphone") {
+            exec(function (a) {
+                accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
+                successCallback(accel);
+            }, function (e) {
+                errorCallback(e);
+            }, "Accelerometer", "getCurrentAcceleration", []);
+
+            return;
+        }
+
+        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();
+        }
+
+        if (cordova.platformId === "browser" && !eventTimerId) {
+            // Start firing devicemotion events if we haven't already
+            var devicemotionEvent = new Event('devicemotion');
+            eventTimerId = window.setInterval(function() {
+                window.dispatchEvent(devicemotionEvent);
+            }, 200);
+        }
+
+        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];
+
+            if (eventTimerId && Object.keys(timers).length === 0) {
+                // No more watchers, so stop firing 'devicemotion' events
+                window.clearInterval(eventTimerId);
+                eventTimerId = null;
+            }
+        }
+    }
+};
+module.exports = accelerometer;
+
+});
index 1e6f2b9..af552ef 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/*
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -68,7 +68,15 @@ exports.defineAutoTests = function () {
           done();
         };
 
-        navigator.accelerometer.getCurrentAcceleration(win, fail.bind(null, done));
+        var onError = function(err){
+            console.log(err);
+            console.log("Skipping gyroscope tests, marking all as pending.");
+            isAccelExist = false;
+            expect(true).toBe(true);
+            done();
+         }
+
+        navigator.accelerometer.getCurrentAcceleration(win, onError);
       });
 
       it("accelerometer.spec.4 success callback Acceleration object should have (reasonable) values for x, y and z expressed in m/s^2", function(done) {