- Watch Accelerometer
- Get Location
- Call 411
- Beep
- Vibrate
-
-
-
\ No newline at end of file
diff --git a/assets/phonegap.js b/assets/phonegap.js
deleted file mode 100644
index 6680fb84..00000000
--- a/assets/phonegap.js
+++ /dev/null
@@ -1,630 +0,0 @@
-
- /**
- * This class contains acceleration information
- * @constructor
- * @param {Number} x The force applied by the device in the x-axis.
- * @param {Number} y The force applied by the device in the y-axis.
- * @param {Number} z The force applied by the device in the z-axis.
- */
- function Acceleration(x, y, z) {
- /**
- * The force applied by the device in the x-axis.
- */
- this.x = x;
- /**
- * The force applied by the device in the y-axis.
- */
- this.y = y;
- /**
- * The force applied by the device in the z-axis.
- */
- this.z = z;
- /**
- * The time that the acceleration was obtained.
- */
- this.timestamp = new Date().getTime();
- }
-
- /**
- * This class specifies the options for requesting acceleration data.
- * @constructor
- */
- function AccelerationOptions() {
- /**
- * The timeout after which if acceleration data cannot be obtained the errorCallback
- * is called.
- */
- this.timeout = 10000;
- }
-
-
- /**
- * This class provides access to device accelerometer data.
- * @constructor
- */
- function Accelerometer() {
- /**
- * The last known acceleration.
- */
- this.lastAcceleration = null;
- }
-
- /**
- * Asynchronously aquires 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.
- * @param {AccelerationOptions} options The options for getting the accelerometer data
- * such as timeout.
- */
- Accelerometer.prototype.getCurrentAcceleration = function(successCallback, errorCallback, options) {
- // If the acceleration is available then call success
- // If the acceleration is not available then call error
-
- // Created for iPhone, Iphone passes back _accel obj litteral
- if (typeof successCallback == "function") {
- var accel = new Acceleration(_accel.x,_accel.y,_accel.z);
- Accelerometer.lastAcceleration = accel;
- successCallback(accel);
- }
- }
-
- /**
- * Asynchronously aquires 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.
- * @param {AccelerationOptions} options The options for getting the accelerometer data
- * such as timeout.
- */
-
- Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) {
- navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options);
- // TODO: add the interval id to a list so we can clear all watches
- var frequency = (options != undefined)? options.frequency : 10000;
- return setInterval(function() {
- navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options);
- }, frequency);
- }
-
- /**
- * Clears the specified accelerometer watch.
- * @param {String} watchId The ID of the watch returned from #watchAcceleration.
- */
- Accelerometer.prototype.clearWatch = function(watchId) {
- clearInterval(watchId);
- }
-
- if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer();
-
-
-
- /**
- * This class provides access to the device media, interfaces to both sound and video
- * @constructor
- */
- function Media(src) {
- this.src = src;
- }
-
- Media.prototype.play = function() {
- }
-
- Media.prototype.pause = function() {
- }
-
- Media.prototype.stop = function() {
- }
-
-
- /**
- * This class contains information about any Media errors.
- * @constructor
- */
- function MediaError() {
- this.code = null,
- this.message = "";
- }
-
- MediaError.MEDIA_ERR_ABORTED = 1;
- MediaError.MEDIA_ERR_NETWORK = 2;
- MediaError.MEDIA_ERR_DECODE = 3;
- MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
-
-
- //if (typeof navigator.audio == "undefined") navigator.audio = new Media(src);
-
-
- /**
- * This class provides access to the device camera.
- * @constructor
- */
- function Camera() {
-
- }
-
- /**
- *
- * @param {Function} successCallback
- * @param {Function} errorCallback
- * @param {Object} options
- */
- Camera.prototype.getPicture = function(successCallback, errorCallback, options) {
-
- }
-
- if (typeof navigator.camera == "undefined") navigator.camera = new Camera();
-
-
- /**
- * This class provides access to the device contacts.
- * @constructor
- */
- function Contact() {
- this.name = "";
- this.phone = "";
- this.address = "";
- }
-
- /**
- *
- * @param {Object} successCallback
- * @param {Object} errorCallback
- * @param {Object} options
- */
- Contact.prototype.get = function(successCallback, errorCallback, options) {
-
- }
-
-
- function ContactManager() {
- // Dummy object to hold array of contacts
- this.contacts = [];
- this.timestap = new Date().getTime();
- }
-
- ContactManager.prototype.get = function(successCallback, errorCallback, options) {
- // Interface
- }
-
- if (typeof navigator.ContactManager == "undefined") navigator.ContactManager = new ContactManager();
-
-
- /**
- * This class provides generic read and write access to the mobile device file system.
- */
- function File() {
- /**
- * The data of a file.
- */
- this.data = "";
- /**
- * The name of the file.
- */
- this.name = "";
- }
-
- /**
- * Reads a file from the mobile device. This function is asyncronous.
- * @param {String} fileName The name (including the path) to the file on the mobile device.
- * The file name will likely be device dependant.
- * @param {Function} successCallback The function to call when the file is successfully read.
- * @param {Function} errorCallback The function to call when there is an error reading the file from the device.
- */
- File.prototype.read = function(fileName, successCallback, errorCallback) {
-
- }
-
- /**
- * Writes a file to the mobile device.
- * @param {File} file The file to write to the device.
- */
- File.prototype.write = function(file) {
-
- }
-
- if (typeof navigator.file == "undefined") navigator.file = new File();
-
-
- /**
- * This class provides access to device GPS data.
- * @constructor
- */
- function Geolocation() {
- /**
- * The last known GPS position.
- */
- this.lastPosition = null;
- }
-
- /**
- * Asynchronously aquires 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 position data.
- * @param {PositionOptions} options The options for getting the position data
- * such as timeout.
- */
- Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) {
- // If the position is available then call success
- // If the position is not available then call error
- }
-
- /**
- * Asynchronously aquires the position repeatedly at a given interval.
- * @param {Function} successCallback The function to call each time the position
- * data is available
- * @param {Function} errorCallback The function to call when there is an error
- * getting the position data.
- * @param {PositionOptions} options The options for getting the position data
- * such as timeout and the frequency of the watch.
- */
- Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) {
- // Invoke the appropriate callback with a new Position object every time the implementation
- // determines that the position of the hosting device has changed.
-
- this.getCurrentPosition(successCallback, errorCallback, options);
- var frequency = (options != undefined)? options.frequency : 10000;
-
- var that = this;
- return setInterval(function() {
- that.getCurrentPosition(successCallback, errorCallback, options);
- //navigator.geolocation.getCurrentPosition(successCallback, errorCallback, options);
- }, frequency);
- }
-
-
- /**
- * Clears the specified position watch.
- * @param {String} watchId The ID of the watch returned from #watchPosition.
- */
- Geolocation.prototype.clearWatch = function(watchId) {
- clearInterval(watchId);
- }
-
- if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation();
-
-
- /**
- * This class provides access to native mapping applications on the device.
- */
- function Map() {
-
- }
-
- /**
- * Shows a native map on the device with pins at the given positions.
- * @param {Array} positions
- */
- Map.prototype.show = function(positions) {
-
- }
-
- if (typeof navigator.map == "undefined") navigator.map = new Map();
-
-
- /**
- * This class provides access to notifications on the device.
- */
- function Notification() {
-
- }
-
- /**
- * Causes the device to blink a status LED.
- * @param {Integer} count The number of blinks.
- * @param {String} colour The colour of the light.
- */
- Notification.prototype.blink = function(count, colour) {
-
- }
-
- /**
- * Causes the device to vibrate.
- * @param {Integer} mills The number of milliseconds to vibrate for.
- */
- Notification.prototype.vibrate = function(mills) {
-
- }
-
- /**
- * Causes the device to beep.
- * @param {Integer} count The number of beeps.
- * @param {Integer} volume The volume of the beep.
- */
- Notification.prototype.beep = function(count, volume) {
-
- }
-
- // TODO: of course on Blackberry and Android there notifications in the UI as well
-
- if (typeof navigator.notification == "undefined") navigator.notification = new Notification();
-
-
- /**
- * This class provides access to the device orientation.
- * @constructor
- */
- function Orientation() {
- /**
- * The last known orientation.
- */
- this.lastOrientation = null;
- }
-
- /**
- * Asynchronously aquires the current orientation.
- * @param {Function} successCallback The function to call when the orientation
- * is known.
- * @param {Function} errorCallback The function to call when there is an error
- * getting the orientation.
- */
- Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) {
- // If the position is available then call success
- // If the position is not available then call error
- }
-
- /**
- * Asynchronously aquires the orientation repeatedly at a given interval.
- * @param {Function} successCallback The function to call each time the orientation
- * data is available.
- * @param {Function} errorCallback The function to call when there is an error
- * getting the orientation data.
- */
- Orientation.prototype.watchOrientation = function(successCallback, errorCallback) {
- // Invoke the appropriate callback with a new Position object every time the implementation
- // determines that the position of the hosting device has changed.
- this.getCurrentPosition(successCallback, errorCallback);
- return setInterval(function() {
- navigator.orientation.getCurrentOrientation(successCallback, errorCallback);
- }, 10000);
- }
-
- /**
- * Clears the specified orientation watch.
- * @param {String} watchId The ID of the watch returned from #watchOrientation.
- */
- Orientation.prototype.clearWatch = function(watchId) {
- clearInterval(watchId);
- }
-
- if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation();
-
-
- /**
- * This class contains position information.
- * @param {Object} lat
- * @param {Object} lng
- * @param {Object} acc
- * @param {Object} alt
- * @param {Object} altacc
- * @param {Object} head
- * @param {Object} vel
- * @constructor
- */
- function Position(lat, lng, acc, alt, altacc, head, vel) {
- /**
- * 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;
- /**
- * The altitude accuracy of the position.
- */
- this.altitudeAccuracy = altacc;
- /**
- * The direction the device is moving at the position.
- */
- this.heading = head;
- /**
- * The velocity with which the device is moving at the position.
- */
- this.velocity = vel;
- /**
- * The time that the position was obtained.
- */
- this.timestamp = new Date().getTime();
- }
-
- /**
- * This class specifies the options for requesting position data.
- * @constructor
- */
- function PositionOptions() {
- /**
- * Specifies the desired position accuracy.
- */
- this.enableHighAccuracy = true;
- /**
- * The timeout after which if position data cannot be obtained the errorCallback
- * is called.
- */
- this.timeout = 10000;
- }
-
- /**
- * This class contains information about any GSP errors.
- * @constructor
- */
- function PositionError() {
- this.code = null;
- this.message = "";
- }
-
- PositionError.UNKNOWN_ERROR = 0;
- PositionError.PERMISSION_DENIED = 1;
- PositionError.POSITION_UNAVAILABLE = 2;
- PositionError.TIMEOUT = 3;
-
-
-
- /**
- * This class provides access to the device SMS functionality.
- * @constructor
- */
- function Sms() {
-
- }
-
- /**
- * Sends an SMS message.
- * @param {Integer} number The phone number to send the message to.
- * @param {String} message The contents of the SMS message to send.
- * @param {Function} successCallback The function to call when the SMS message is sent.
- * @param {Function} errorCallback The function to call when there is an error sending the SMS message.
- * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy.
- */
- Sms.prototype.send = function(number, message, successCallback, errorCallback, options) {
-
- }
-
- if (typeof navigator.sms == "undefined") navigator.sms = new Sms();
-
-
- /**
- * This class provides access to the telephony features of the device.
- * @constructor
- */
- function Telephony() {
-
- }
-
- /**
- * Calls the specifed number.
- * @param {Integer} number The number to be called.
- */
- Telephony.prototype.call = function(number) {
-
- }
-
- if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony();
-
-
- // Android specific overrides here
-
-Notification.prototype.vibrate = function(mills)
-{
- Device.vibrate(mills);
-}
-
-/*
- * On the Android, we don't beep, we notify you with your
- * notification! We shouldn't keep hammering on this, and should
- * review what we want beep to do.
- */
-
-Notification.prototype.beep = function(count, volume)
-{
- Device.beep(count);
-}
-
-/*
- * Since we can't guarantee that we will have the most recent, we just try our best!
- *
- * Also, the API doesn't specify which version is the best version of the API
- */
-
-Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options)
-{
- Geolocation.global_success = successCallback;
- Geolocation.fail = errorCallback;
- Geo.getCurrentLocation();
-}
-
-// Run the global callback
-Geolocation.gotCurrentPosition = function(lat, lng)
-{
- if (lat == "undefined" || lng == "undefined")
- {
- this.fail();
- }
- else
- {
- p = {};
- p.latitude = lat;
- p.longitude = lng;
- this.global_success(p);
- }
-}
-
-
-/*
- * This turns on the GeoLocator class, which has two listeners.
- * The listeners have their own timeouts, and run independently of this process
- * In this case, we return the key to the watch hash
- */
-
-Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options)
-{
- var frequency = (options != undefined)? options.frequency : 10000;
-
- if (!this.listeners)
- {
- this.listeners = []
- }
-
- var key = this.listeners.push( {"success" : successCallback, "fail" : failCallback }) - 1;
-
- // TO-DO: Get the names of the method and pass them as strings to the Java.
- return Geolocation.start(frequency, key);
-}
-
-/*
- * Retrieve and stop this listener from listening to the GPS
- *
- */
-Geolocation.success = function(key, lat, lng)
-{
- this.listeners[key].success(lat,lng);
-}
-
-Geolocation.prototype.fail = function(key)
-{
- this.listeners[key].fail();
-}
-
-Geolocation.prototype.clearWatch = function(watchId)
-{
- Geo.stop(watchId);
-}
-
-/* Identical to the iPhone, except we have to create this in the JS */
-
-_accel = {}
-_accel.x = 0;
-_accel.y = 0;
-_accel.z = 0;
-
-function gotAccel(x,y,z)
-{
- _accel.x = x;
- _accel.y = y;
- _accel.z = z;
-}
-
-Accelerometer.base_method = Accelerometer.prototype.watchAcceleration
-Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options)
-{
- Accel.start();
- Accelerometer.base_method(successCallback, errorCallback, options);
-}
-
-Accelerometer.prototype.clearWatch = function(watchId){
- clearInterval(watchId);
- Accel.stop();
-}
-
diff --git a/assets/plugins/gears-0.5.17.0/dummy b/assets/plugins/gears-0.5.17.0/dummy
deleted file mode 100644
index 50f9ab94..00000000
--- a/assets/plugins/gears-0.5.17.0/dummy
+++ /dev/null
@@ -1 +0,0 @@
-This file is used to ensure this subdirectory is created.
diff --git a/assets/plugins/gears.so b/assets/plugins/gears.so
deleted file mode 100644
index 56b33866..00000000
Binary files a/assets/plugins/gears.so and /dev/null differ
diff --git a/assets/www/index.html b/assets/www/index.html
index bb8499dc..b601ba86 100644
--- a/assets/www/index.html
+++ b/assets/www/index.html
@@ -6,18 +6,19 @@
PhoneGap
-
+
diff --git a/assets/www/phonegap.js b/assets/www/phonegap.js
index 6680fb84..75ac2872 100644
--- a/assets/www/phonegap.js
+++ b/assets/www/phonegap.js
@@ -1,537 +1,888 @@
-
- /**
- * This class contains acceleration information
- * @constructor
- * @param {Number} x The force applied by the device in the x-axis.
- * @param {Number} y The force applied by the device in the y-axis.
- * @param {Number} z The force applied by the device in the z-axis.
- */
- function Acceleration(x, y, z) {
- /**
- * The force applied by the device in the x-axis.
- */
- this.x = x;
- /**
- * The force applied by the device in the y-axis.
- */
- this.y = y;
- /**
- * The force applied by the device in the z-axis.
- */
- this.z = z;
- /**
- * The time that the acceleration was obtained.
- */
- this.timestamp = new Date().getTime();
- }
-
- /**
- * This class specifies the options for requesting acceleration data.
- * @constructor
- */
- function AccelerationOptions() {
- /**
- * The timeout after which if acceleration data cannot be obtained the errorCallback
- * is called.
- */
- this.timeout = 10000;
- }
-
-
- /**
- * This class provides access to device accelerometer data.
- * @constructor
- */
- function Accelerometer() {
- /**
- * The last known acceleration.
- */
- this.lastAcceleration = null;
- }
-
- /**
- * Asynchronously aquires 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.
- * @param {AccelerationOptions} options The options for getting the accelerometer data
- * such as timeout.
- */
- Accelerometer.prototype.getCurrentAcceleration = function(successCallback, errorCallback, options) {
- // If the acceleration is available then call success
- // If the acceleration is not available then call error
-
- // Created for iPhone, Iphone passes back _accel obj litteral
- if (typeof successCallback == "function") {
- var accel = new Acceleration(_accel.x,_accel.y,_accel.z);
- Accelerometer.lastAcceleration = accel;
- successCallback(accel);
- }
- }
-
- /**
- * Asynchronously aquires 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.
- * @param {AccelerationOptions} options The options for getting the accelerometer data
- * such as timeout.
- */
-
- Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) {
- navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options);
- // TODO: add the interval id to a list so we can clear all watches
- var frequency = (options != undefined)? options.frequency : 10000;
- return setInterval(function() {
- navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options);
- }, frequency);
- }
-
- /**
- * Clears the specified accelerometer watch.
- * @param {String} watchId The ID of the watch returned from #watchAcceleration.
- */
- Accelerometer.prototype.clearWatch = function(watchId) {
- clearInterval(watchId);
- }
-
- if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer();
-
-
-
- /**
- * This class provides access to the device media, interfaces to both sound and video
- * @constructor
- */
- function Media(src) {
- this.src = src;
- }
-
- Media.prototype.play = function() {
- }
-
- Media.prototype.pause = function() {
- }
-
- Media.prototype.stop = function() {
- }
-
-
- /**
- * This class contains information about any Media errors.
- * @constructor
- */
- function MediaError() {
- this.code = null,
- this.message = "";
- }
-
- MediaError.MEDIA_ERR_ABORTED = 1;
- MediaError.MEDIA_ERR_NETWORK = 2;
- MediaError.MEDIA_ERR_DECODE = 3;
- MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
-
-
- //if (typeof navigator.audio == "undefined") navigator.audio = new Media(src);
-
-
- /**
- * This class provides access to the device camera.
- * @constructor
- */
- function Camera() {
-
- }
-
- /**
- *
- * @param {Function} successCallback
- * @param {Function} errorCallback
- * @param {Object} options
- */
- Camera.prototype.getPicture = function(successCallback, errorCallback, options) {
-
- }
-
- if (typeof navigator.camera == "undefined") navigator.camera = new Camera();
-
-
- /**
- * This class provides access to the device contacts.
- * @constructor
- */
- function Contact() {
- this.name = "";
- this.phone = "";
- this.address = "";
- }
-
- /**
- *
- * @param {Object} successCallback
- * @param {Object} errorCallback
- * @param {Object} options
- */
- Contact.prototype.get = function(successCallback, errorCallback, options) {
-
- }
-
-
- function ContactManager() {
- // Dummy object to hold array of contacts
- this.contacts = [];
- this.timestap = new Date().getTime();
- }
-
- ContactManager.prototype.get = function(successCallback, errorCallback, options) {
- // Interface
- }
-
- if (typeof navigator.ContactManager == "undefined") navigator.ContactManager = new ContactManager();
-
-
- /**
- * This class provides generic read and write access to the mobile device file system.
- */
- function File() {
- /**
- * The data of a file.
- */
- this.data = "";
- /**
- * The name of the file.
- */
- this.name = "";
- }
-
- /**
- * Reads a file from the mobile device. This function is asyncronous.
- * @param {String} fileName The name (including the path) to the file on the mobile device.
- * The file name will likely be device dependant.
- * @param {Function} successCallback The function to call when the file is successfully read.
- * @param {Function} errorCallback The function to call when there is an error reading the file from the device.
- */
- File.prototype.read = function(fileName, successCallback, errorCallback) {
-
- }
-
- /**
- * Writes a file to the mobile device.
- * @param {File} file The file to write to the device.
- */
- File.prototype.write = function(file) {
-
- }
-
- if (typeof navigator.file == "undefined") navigator.file = new File();
-
-
- /**
- * This class provides access to device GPS data.
- * @constructor
- */
- function Geolocation() {
- /**
- * The last known GPS position.
- */
- this.lastPosition = null;
- }
-
- /**
- * Asynchronously aquires 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 position data.
- * @param {PositionOptions} options The options for getting the position data
- * such as timeout.
- */
- Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) {
- // If the position is available then call success
- // If the position is not available then call error
- }
-
- /**
- * Asynchronously aquires the position repeatedly at a given interval.
- * @param {Function} successCallback The function to call each time the position
- * data is available
- * @param {Function} errorCallback The function to call when there is an error
- * getting the position data.
- * @param {PositionOptions} options The options for getting the position data
- * such as timeout and the frequency of the watch.
- */
- Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) {
- // Invoke the appropriate callback with a new Position object every time the implementation
- // determines that the position of the hosting device has changed.
-
- this.getCurrentPosition(successCallback, errorCallback, options);
- var frequency = (options != undefined)? options.frequency : 10000;
-
- var that = this;
- return setInterval(function() {
- that.getCurrentPosition(successCallback, errorCallback, options);
- //navigator.geolocation.getCurrentPosition(successCallback, errorCallback, options);
- }, frequency);
- }
-
-
- /**
- * Clears the specified position watch.
- * @param {String} watchId The ID of the watch returned from #watchPosition.
- */
- Geolocation.prototype.clearWatch = function(watchId) {
- clearInterval(watchId);
- }
-
- if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation();
-
-
- /**
- * This class provides access to native mapping applications on the device.
- */
- function Map() {
-
- }
-
- /**
- * Shows a native map on the device with pins at the given positions.
- * @param {Array} positions
- */
- Map.prototype.show = function(positions) {
-
- }
-
- if (typeof navigator.map == "undefined") navigator.map = new Map();
-
-
- /**
- * This class provides access to notifications on the device.
- */
- function Notification() {
-
- }
-
- /**
- * Causes the device to blink a status LED.
- * @param {Integer} count The number of blinks.
- * @param {String} colour The colour of the light.
- */
- Notification.prototype.blink = function(count, colour) {
-
- }
-
- /**
- * Causes the device to vibrate.
- * @param {Integer} mills The number of milliseconds to vibrate for.
- */
- Notification.prototype.vibrate = function(mills) {
-
- }
-
- /**
- * Causes the device to beep.
- * @param {Integer} count The number of beeps.
- * @param {Integer} volume The volume of the beep.
- */
- Notification.prototype.beep = function(count, volume) {
-
- }
-
- // TODO: of course on Blackberry and Android there notifications in the UI as well
-
- if (typeof navigator.notification == "undefined") navigator.notification = new Notification();
-
-
- /**
- * This class provides access to the device orientation.
- * @constructor
- */
- function Orientation() {
- /**
- * The last known orientation.
- */
- this.lastOrientation = null;
- }
-
- /**
- * Asynchronously aquires the current orientation.
- * @param {Function} successCallback The function to call when the orientation
- * is known.
- * @param {Function} errorCallback The function to call when there is an error
- * getting the orientation.
- */
- Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) {
- // If the position is available then call success
- // If the position is not available then call error
- }
-
- /**
- * Asynchronously aquires the orientation repeatedly at a given interval.
- * @param {Function} successCallback The function to call each time the orientation
- * data is available.
- * @param {Function} errorCallback The function to call when there is an error
- * getting the orientation data.
- */
- Orientation.prototype.watchOrientation = function(successCallback, errorCallback) {
- // Invoke the appropriate callback with a new Position object every time the implementation
- // determines that the position of the hosting device has changed.
- this.getCurrentPosition(successCallback, errorCallback);
- return setInterval(function() {
- navigator.orientation.getCurrentOrientation(successCallback, errorCallback);
- }, 10000);
- }
-
- /**
- * Clears the specified orientation watch.
- * @param {String} watchId The ID of the watch returned from #watchOrientation.
- */
- Orientation.prototype.clearWatch = function(watchId) {
- clearInterval(watchId);
- }
-
- if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation();
-
-
- /**
- * This class contains position information.
- * @param {Object} lat
- * @param {Object} lng
- * @param {Object} acc
- * @param {Object} alt
- * @param {Object} altacc
- * @param {Object} head
- * @param {Object} vel
- * @constructor
- */
- function Position(lat, lng, acc, alt, altacc, head, vel) {
- /**
- * 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;
- /**
- * The altitude accuracy of the position.
- */
- this.altitudeAccuracy = altacc;
- /**
- * The direction the device is moving at the position.
- */
- this.heading = head;
- /**
- * The velocity with which the device is moving at the position.
- */
- this.velocity = vel;
- /**
- * The time that the position was obtained.
- */
- this.timestamp = new Date().getTime();
- }
-
- /**
- * This class specifies the options for requesting position data.
- * @constructor
- */
- function PositionOptions() {
- /**
- * Specifies the desired position accuracy.
- */
- this.enableHighAccuracy = true;
- /**
- * The timeout after which if position data cannot be obtained the errorCallback
- * is called.
- */
- this.timeout = 10000;
- }
-
- /**
- * This class contains information about any GSP errors.
- * @constructor
- */
- function PositionError() {
- this.code = null;
- this.message = "";
- }
-
- PositionError.UNKNOWN_ERROR = 0;
- PositionError.PERMISSION_DENIED = 1;
- PositionError.POSITION_UNAVAILABLE = 2;
- PositionError.TIMEOUT = 3;
-
-
-
- /**
- * This class provides access to the device SMS functionality.
- * @constructor
- */
- function Sms() {
-
- }
-
- /**
- * Sends an SMS message.
- * @param {Integer} number The phone number to send the message to.
- * @param {String} message The contents of the SMS message to send.
- * @param {Function} successCallback The function to call when the SMS message is sent.
- * @param {Function} errorCallback The function to call when there is an error sending the SMS message.
- * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy.
- */
- Sms.prototype.send = function(number, message, successCallback, errorCallback, options) {
-
- }
-
- if (typeof navigator.sms == "undefined") navigator.sms = new Sms();
-
-
- /**
- * This class provides access to the telephony features of the device.
- * @constructor
- */
- function Telephony() {
-
- }
-
- /**
- * Calls the specifed number.
- * @param {Integer} number The number to be called.
- */
- Telephony.prototype.call = function(number) {
-
- }
-
- if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony();
-
+if (typeof(DeviceInfo) != 'object')
+ DeviceInfo = {};
- // Android specific overrides here
+/**
+ * This represents the PhoneGap API itself, and provides a global namespace for accessing
+ * information about the state of PhoneGap.
+ * @class
+ */
+PhoneGap = {
+ queue: {
+ ready: true,
+ commands: [],
+ timer: null
+ },
+ _constructors: []
+};
-Notification.prototype.vibrate = function(mills)
-{
- Device.vibrate(mills);
+/**
+ * Boolean flag indicating if the PhoneGap API is available and initialized.
+ */
+PhoneGap.available = DeviceInfo.uuid != undefined;
+
+/**
+ * Add an initialization function to a queue that ensures it will run and initialize
+ * application constructors only once PhoneGap has been initialized.
+ * @param {Function} func The function callback you want run once PhoneGap is initialized
+ */
+PhoneGap.addConstructor = function(func) {
+ var state = document.readyState;
+ if (state != 'loaded' && state != 'complete')
+ PhoneGap._constructors.push(func);
+ else
+ func();
+};
+(function() {
+ var timer = setInterval(function() {
+ var state = document.readyState;
+ if (state != 'loaded' && state != 'complete')
+ return;
+ clearInterval(timer);
+ while (PhoneGap._constructors.length > 0) {
+ var constructor = PhoneGap._constructors.shift();
+ try {
+ constructor();
+ } catch(e) {
+ if (typeof(debug['log']) == 'function')
+ debug.log("Failed to run constructor: " + debug.processMessage(e));
+ else
+ alert("Failed to run constructor: " + e.message);
+ }
+ }
+ }, 1);
+})();
+
+
+/**
+ * Execute a PhoneGap command in a queued fashion, to ensure commands do not
+ * execute with any race conditions, and only run when PhoneGap is ready to
+ * recieve them.
+ * @param {String} command Command to be run in PhoneGap, e.g. "ClassName.method"
+ * @param {String[]} [args] Zero or more arguments to pass to the method
+ */
+PhoneGap.exec = function() {
+ PhoneGap.queue.commands.push(arguments);
+ if (PhoneGap.queue.timer == null)
+ PhoneGap.queue.timer = setInterval(PhoneGap.run_command, 10);
+};
+/**
+ * Internal function used to dispatch the request to PhoneGap. This needs to be implemented per-platform to
+ * ensure that methods are called on the phone in a way appropriate for that device.
+ * @private
+ */
+PhoneGap.run_command = function() {
+};
+
+/**
+ * This class contains acceleration information
+ * @constructor
+ * @param {Number} x The force applied by the device in the x-axis.
+ * @param {Number} y The force applied by the device in the y-axis.
+ * @param {Number} z The force applied by the device in the z-axis.
+ */
+function Acceleration(x, y, z) {
+ /**
+ * The force applied by the device in the x-axis.
+ */
+ this.x = x;
+ /**
+ * The force applied by the device in the y-axis.
+ */
+ this.y = y;
+ /**
+ * The force applied by the device in the z-axis.
+ */
+ this.z = z;
+ /**
+ * The time that the acceleration was obtained.
+ */
+ this.timestamp = new Date().getTime();
}
-/*
- * On the Android, we don't beep, we notify you with your
- * notification! We shouldn't keep hammering on this, and should
- * review what we want beep to do.
+/**
+ * This class specifies the options for requesting acceleration data.
+ * @constructor
+ */
+function AccelerationOptions() {
+ /**
+ * The timeout after which if acceleration data cannot be obtained the errorCallback
+ * is called.
+ */
+ this.timeout = 10000;
+}
+/**
+ * This class provides access to device accelerometer data.
+ * @constructor
+ */
+function Accelerometer() {
+ /**
+ * The last known acceleration.
+ */
+ this.lastAcceleration = null;
+}
+
+/**
+ * Asynchronously aquires 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.
+ * @param {AccelerationOptions} options The options for getting the accelerometer data
+ * such as timeout.
+ */
+Accelerometer.prototype.getCurrentAcceleration = function(successCallback, errorCallback, options) {
+ // If the acceleration is available then call success
+ // If the acceleration is not available then call error
+
+ // Created for iPhone, Iphone passes back _accel obj litteral
+ if (typeof successCallback == "function") {
+ var accel = new Acceleration(_accel.x,_accel.y,_accel.z);
+ Accelerometer.lastAcceleration = accel;
+ successCallback(accel);
+ }
+}
+
+/**
+ * Asynchronously aquires 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.
+ * @param {AccelerationOptions} options The options for getting the accelerometer data
+ * such as timeout.
*/
-Notification.prototype.beep = function(count, volume)
-{
- Device.beep(count);
+Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) {
+ this.getCurrentAcceleration(successCallback, errorCallback, options);
+ // TODO: add the interval id to a list so we can clear all watches
+ var frequency = (options != undefined)? options.frequency : 10000;
+ return setInterval(function() {
+ navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options);
+ }, frequency);
}
+/**
+ * Clears the specified accelerometer watch.
+ * @param {String} watchId The ID of the watch returned from #watchAcceleration.
+ */
+Accelerometer.prototype.clearWatch = function(watchId) {
+ clearInterval(watchId);
+}
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer();
+});
+/**
+ * This class provides access to the device camera.
+ * @constructor
+ */
+function Camera() {
+
+}
+
+/**
+ *
+ * @param {Function} successCallback
+ * @param {Function} errorCallback
+ * @param {Object} options
+ */
+Camera.prototype.getPicture = function(successCallback, errorCallback, options) {
+
+}
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.camera == "undefined") navigator.camera = new Camera();
+});
+/**
+ * This class provides access to the device contacts.
+ * @constructor
+ */
+
+function Contact(jsonObject) {
+ this.firstName = "";
+ this.lastName = "";
+ this.phoneNumber = "";
+ this.address = "";
+}
+
+Contact.prototype.displayName = function()
+{
+ // TODO: can be tuned according to prefs
+ return this.firstName + " " + this.lastName;
+}
+
+function ContactManager() {
+ // Dummy object to hold array of contacts
+ this.contacts = [];
+ this.timestamp = new Date().getTime();
+}
+
+ContactManager.prototype.getAllContacts = function(successCallback, errorCallback, options) {
+ // Interface
+}
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.ContactManager == "undefined") navigator.ContactManager = new ContactManager();
+});
+/**
+ * This class provides access to the debugging console.
+ * @constructor
+ */
+function DebugConsole() {
+}
+
+/**
+ * Utility function for rendering and indenting strings, or serializing
+ * objects to a string capable of being printed to the console.
+ * @param {Object|String} message The string or object to convert to an indented string
+ * @private
+ */
+DebugConsole.prototype.processMessage = function(message) {
+ if (typeof(message) != 'object') {
+ return message;
+ } else {
+ /**
+ * @function
+ * @ignore
+ */
+ function indent(str) {
+ return str.replace(/^/mg, " ");
+ }
+ /**
+ * @function
+ * @ignore
+ */
+ function makeStructured(obj) {
+ var str = "";
+ for (var i in obj) {
+ try {
+ if (typeof(obj[i]) == 'object') {
+ str += i + ":\n" + indent(makeStructured(obj[i])) + "\n";
+ } else {
+ str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n";
+ }
+ } catch(e) {
+ str += i + " = EXCEPTION: " + e.message + "\n";
+ }
+ }
+ return str;
+ }
+ return "Object:\n" + makeStructured(message);
+ }
+};
+
+/**
+ * Print a normal log message to the console
+ * @param {Object|String} message Message or object to print to the console
+ */
+DebugConsole.prototype.log = function(message) {
+};
+
+/**
+ * Print a warning message to the console
+ * @param {Object|String} message Message or object to print to the console
+ */
+DebugConsole.prototype.warn = function(message) {
+};
+
+/**
+ * Print an error message to the console
+ * @param {Object|String} message Message or object to print to the console
+ */
+DebugConsole.prototype.error = function(message) {
+};
+
+PhoneGap.addConstructor(function() {
+ window.debug = new DebugConsole();
+});
+/**
+ * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+ this.available = PhoneGap.available;
+ this.platform = null;
+ this.version = null;
+ this.name = null;
+ this.gap = null;
+ this.uuid = null;
+ try {
+ if (window.DroidGap) {
+ this.available = true;
+ this.uuid = window.DroidGap.getUuid();
+ this.version = window.DroidGap.getOSVersion();
+ this.gapVersion = window.DroidGap.getVersion();
+ this.platform = window.DroidGap.getPlatform();
+ this.name = window.DroidGap.getProductName();
+ } else {
+ this.platform = DeviceInfo.platform;
+ this.version = DeviceInfo.version;
+ this.name = DeviceInfo.name;
+ this.gap = DeviceInfo.gap;
+ this.uuid = DeviceInfo.uuid;
+ }
+ } catch(e) {
+ this.available = false;
+ }
+}
+
+PhoneGap.addConstructor(function() {
+ navigator.device = window.device = new Device();
+});
+/**
+ * This class provides generic read and write access to the mobile device file system.
+ */
+function File() {
+ /**
+ * The data of a file.
+ */
+ this.data = "";
+ /**
+ * The name of the file.
+ */
+ this.name = "";
+}
+
+/**
+ * Reads a file from the mobile device. This function is asyncronous.
+ * @param {String} fileName The name (including the path) to the file on the mobile device.
+ * The file name will likely be device dependant.
+ * @param {Function} successCallback The function to call when the file is successfully read.
+ * @param {Function} errorCallback The function to call when there is an error reading the file from the device.
+ */
+File.prototype.read = function(fileName, successCallback, errorCallback) {
+
+}
+
+/**
+ * Writes a file to the mobile device.
+ * @param {File} file The file to write to the device.
+ */
+File.prototype.write = function(file) {
+
+}
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.file == "undefined") navigator.file = new File();
+});
+/**
+ * This class provides access to device GPS data.
+ * @constructor
+ */
+function Geolocation() {
+ /**
+ * The last known GPS position.
+ */
+ this.lastPosition = null;
+ this.lastError = null;
+ this.callbacks = {
+ onLocationChanged: [],
+ onError: []
+ };
+};
+
+/**
+ * Asynchronously aquires 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 position data.
+ * @param {PositionOptions} options The options for getting the position data
+ * such as timeout.
+ */
+Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) {
+ var referenceTime = 0;
+ if (this.lastPosition)
+ referenceTime = this.lastPosition.timeout;
+ else
+ this.start(options);
+
+ var timeout = 20000;
+ var interval = 500;
+ if (typeof(options) == 'object' && options.interval)
+ interval = options.interval;
+
+ if (typeof(successCallback) != 'function')
+ successCallback = function() {};
+ if (typeof(errorCallback) != 'function')
+ errorCallback = function() {};
+
+ var dis = this;
+ var delay = 0;
+ var timer = setInterval(function() {
+ delay += interval;
+
+ if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) {
+ successCallback(dis.lastPosition);
+ clearInterval(timer);
+ } else if (delay >= timeout) {
+ errorCallback();
+ clearInterval(timer);
+ }
+ }, interval);
+};
+
+/**
+ * Asynchronously aquires the position repeatedly at a given interval.
+ * @param {Function} successCallback The function to call each time the position
+ * data is available
+ * @param {Function} errorCallback The function to call when there is an error
+ * getting the position data.
+ * @param {PositionOptions} options The options for getting the position data
+ * such as timeout and the frequency of the watch.
+ */
+Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) {
+ // Invoke the appropriate callback with a new Position object every time the implementation
+ // determines that the position of the hosting device has changed.
+
+ this.getCurrentPosition(successCallback, errorCallback, options);
+ var frequency = 10000;
+ if (typeof(options) == 'object' && options.frequency)
+ frequency = options.frequency;
+
+ var that = this;
+ return setInterval(function() {
+ that.getCurrentPosition(successCallback, errorCallback, options);
+ }, frequency);
+};
+
+
+/**
+ * Clears the specified position watch.
+ * @param {String} watchId The ID of the watch returned from #watchPosition.
+ */
+Geolocation.prototype.clearWatch = function(watchId) {
+ clearInterval(watchId);
+};
+
+/**
+ * Called by the geolocation framework when the current location is found.
+ * @param {PositionOptions} position The current position.
+ */
+Geolocation.prototype.setLocation = function(position) {
+ this.lastPosition = position;
+ for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) {
+ var f = this.callbacks.onLocationChanged.shift();
+ f(position);
+ }
+};
+
+/**
+ * Called by the geolocation framework when an error occurs while looking up the current position.
+ * @param {String} message The text of the error message.
+ */
+Geolocation.prototype.setError = function(message) {
+ this.lastError = message;
+ for (var i = 0; i < this.callbacks.onError.length; i++) {
+ var f = this.callbacks.onError.shift();
+ f(message);
+ }
+};
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation();
+});
+/**
+ * This class provides access to native mapping applications on the device.
+ */
+function Map() {
+
+}
+
+/**
+ * Shows a native map on the device with pins at the given positions.
+ * @param {Array} positions
+ */
+Map.prototype.show = function(positions) {
+
+}
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.map == "undefined") navigator.map = new Map();
+});
+
+/**
+ * This class provides access to the device media, interfaces to both sound and video
+ * @constructor
+ */
+function Media(src) {
+ this.src = src;
+}
+
+Media.prototype.play = function() {
+}
+
+Media.prototype.pause = function() {
+}
+
+Media.prototype.stop = function() {
+}
+
+
+/**
+ * This class contains information about any Media errors.
+ * @constructor
+ */
+function MediaError() {
+ this.code = null,
+ this.message = "";
+}
+
+MediaError.MEDIA_ERR_ABORTED = 1;
+MediaError.MEDIA_ERR_NETWORK = 2;
+MediaError.MEDIA_ERR_DECODE = 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+
+
+//if (typeof navigator.audio == "undefined") navigator.audio = new Media(src);
+/**
+ * This class provides access to notifications on the device.
+ */
+function Notification() {
+
+}
+
+/**
+ * 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 {String} [title="Alert"] Title of the alert dialog (default: Alert)
+ * @param {String} [buttonLabel="OK"] Label of the close button (default: OK)
+ */
+Notification.prototype.alert = function(message, title, buttonLabel) {
+ // Default is to use a browser alert; this will use "index.html" as the title though
+ alert(message);
+};
+
+/**
+ * Start spinning the activity indicator on the statusbar
+ */
+Notification.prototype.activityStart = function() {
+};
+
+/**
+ * Stop spinning the activity indicator on the statusbar, if it's currently spinning
+ */
+Notification.prototype.activityStop = function() {
+};
+
+/**
+ * Causes the device to blink a status LED.
+ * @param {Integer} count The number of blinks.
+ * @param {String} colour The colour of the light.
+ */
+Notification.prototype.blink = function(count, colour) {
+
+};
+
+/**
+ * Causes the device to vibrate.
+ * @param {Integer} mills The number of milliseconds to vibrate for.
+ */
+Notification.prototype.vibrate = function(mills) {
+
+};
+
+/**
+ * Causes the device to beep.
+ * @param {Integer} count The number of beeps.
+ * @param {Integer} volume The volume of the beep.
+ */
+Notification.prototype.beep = function(count, volume) {
+
+};
+
+// TODO: of course on Blackberry and Android there notifications in the UI as well
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.notification == "undefined") navigator.notification = new Notification();
+});
+
+/**
+ * This class provides access to the device orientation.
+ * @constructor
+ */
+function Orientation() {
+ /**
+ * The current orientation, or null if the orientation hasn't changed yet.
+ */
+ this.currentOrientation = null;
+}
+
+/**
+ * Set the current orientation of the phone. This is called from the device automatically.
+ *
+ * When the orientation is changed, the DOMEvent \c orientationChanged is dispatched against
+ * the document element. The event has the property \c orientation which can be used to retrieve
+ * the device's current orientation, in addition to the \c Orientation.currentOrientation class property.
+ *
+ * @param {Number} orientation The orientation to be set
+ */
+Orientation.prototype.setOrientation = function(orientation) {
+ Orientation.currentOrientation = orientation;
+ var e = document.createEvent('Events');
+ e.initEvent('orientationChanged', 'false', 'false');
+ e.orientation = orientation;
+ document.dispatchEvent(e);
+};
+
+/**
+ * Asynchronously aquires the current orientation.
+ * @param {Function} successCallback The function to call when the orientation
+ * is known.
+ * @param {Function} errorCallback The function to call when there is an error
+ * getting the orientation.
+ */
+Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) {
+ // If the position is available then call success
+ // If the position is not available then call error
+};
+
+/**
+ * Asynchronously aquires the orientation repeatedly at a given interval.
+ * @param {Function} successCallback The function to call each time the orientation
+ * data is available.
+ * @param {Function} errorCallback The function to call when there is an error
+ * getting the orientation data.
+ */
+Orientation.prototype.watchOrientation = function(successCallback, errorCallback) {
+ // Invoke the appropriate callback with a new Position object every time the implementation
+ // determines that the position of the hosting device has changed.
+ this.getCurrentPosition(successCallback, errorCallback);
+ return setInterval(function() {
+ navigator.orientation.getCurrentOrientation(successCallback, errorCallback);
+ }, 10000);
+};
+
+/**
+ * Clears the specified orientation watch.
+ * @param {String} watchId The ID of the watch returned from #watchOrientation.
+ */
+Orientation.prototype.clearWatch = function(watchId) {
+ clearInterval(watchId);
+};
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation();
+});
+/**
+ * This class contains position information.
+ * @param {Object} lat
+ * @param {Object} lng
+ * @param {Object} acc
+ * @param {Object} alt
+ * @param {Object} altacc
+ * @param {Object} head
+ * @param {Object} vel
+ * @constructor
+ */
+function Position(coords, timestamp) {
+ this.coords = coords;
+ this.timestamp = new Date().getTime();
+}
+
+function Coordinates(lat, lng, alt, acc, head, vel) {
+ /**
+ * 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;
+ /**
+ * The direction the device is moving at the position.
+ */
+ this.heading = head;
+ /**
+ * The velocity with which the device is moving at the position.
+ */
+ this.speed = vel;
+}
+
+/**
+ * This class specifies the options for requesting position data.
+ * @constructor
+ */
+function PositionOptions() {
+ /**
+ * Specifies the desired position accuracy.
+ */
+ this.enableHighAccuracy = true;
+ /**
+ * The timeout after which if position data cannot be obtained the errorCallback
+ * is called.
+ */
+ this.timeout = 10000;
+}
+
+/**
+ * This class contains information about any GSP errors.
+ * @constructor
+ */
+function PositionError() {
+ this.code = null;
+ this.message = "";
+}
+
+PositionError.UNKNOWN_ERROR = 0;
+PositionError.PERMISSION_DENIED = 1;
+PositionError.POSITION_UNAVAILABLE = 2;
+PositionError.TIMEOUT = 3;
+/**
+ * This class provides access to the device SMS functionality.
+ * @constructor
+ */
+function Sms() {
+
+}
+
+/**
+ * Sends an SMS message.
+ * @param {Integer} number The phone number to send the message to.
+ * @param {String} message The contents of the SMS message to send.
+ * @param {Function} successCallback The function to call when the SMS message is sent.
+ * @param {Function} errorCallback The function to call when there is an error sending the SMS message.
+ * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy.
+ */
+Sms.prototype.send = function(number, message, successCallback, errorCallback, options) {
+
+}
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.sms == "undefined") navigator.sms = new Sms();
+});
+/**
+ * This class provides access to the telephony features of the device.
+ * @constructor
+ */
+function Telephony() {
+
+}
+
+/**
+ * Calls the specifed number.
+ * @param {Integer} number The number to be called.
+ */
+Telephony.prototype.call = function(number) {
+
+}
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony();
+});
+/**
+ * This class exposes mobile phone interface controls to JavaScript, such as
+ * native tab and tool bars, etc.
+ * @constructor
+ */
+function UIControls() {
+ this.tabBarTag = 0;
+ this.tabBarCallbacks = {};
+}
+
+/**
+ * Create a native tab bar that can have tab buttons added to it which can respond to events.
+ */
+UIControls.prototype.createTabBar = function() {};
+
+/**
+ * Show a tab bar. The tab bar has to be created first.
+ * @param {Object} [options] Options indicating how the tab bar should be shown:
+ * - \c height integer indicating the height of the tab bar (default: \c 49)
+ * - \c position specifies whether the tab bar will be placed at the \c top or \c bottom of the screen (default: \c bottom)
+ */
+UIControls.prototype.showTabBar = function(options) {};
+
+/**
+ * Hide a tab bar. The tab bar has to be created first.
+ */
+UIControls.prototype.hideTabBar = function(animate) {};
+
+/**
+ * Create a new tab bar item for use on a previously created tab bar. Use ::showTabBarItems to show the new item on the tab bar.
+ *
+ * If the supplied image name is one of the labels listed below, then this method will construct a tab button
+ * using the standard system buttons. Note that if you use one of the system images, that the \c title you supply will be ignored.
+ *
+ * Tab Buttons
+ * - tabButton:More
+ * - tabButton:Favorites
+ * - tabButton:Featured
+ * - tabButton:TopRated
+ * - tabButton:Recents
+ * - tabButton:Contacts
+ * - tabButton:History
+ * - tabButton:Bookmarks
+ * - tabButton:Search
+ * - tabButton:Downloads
+ * - tabButton:MostRecent
+ * - tabButton:MostViewed
+ * @param {String} name internal name to refer to this tab by
+ * @param {String} [title] title text to show on the tab, or null if no text should be shown
+ * @param {String} [image] image filename or internal identifier to show, or null if now image should be shown
+ * @param {Object} [options] Options for customizing the individual tab item
+ * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden
+ */
+UIControls.prototype.createTabBarItem = function(name, label, image, options) {};
+
+/**
+ * Update an existing tab bar item to change its badge value.
+ * @param {String} name internal name used to represent this item when it was created
+ * @param {Object} options Options for customizing the individual tab item
+ * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden
+ */
+UIControls.prototype.updateTabBarItem = function(name, options) {};
+
+/**
+ * Show previously created items on the tab bar
+ * @param {String} arguments... the item names to be shown
+ * @param {Object} [options] dictionary of options, notable options including:
+ * - \c animate indicates that the items should animate onto the tab bar
+ * @see createTabBarItem
+ * @see createTabBar
+ */
+UIControls.prototype.showTabBarItems = function(tabs, options) {};
+
+/**
+ * Manually select an individual tab bar item, or nil for deselecting a currently selected tab bar item.
+ * @param {String} tabName the name of the tab to select, or null if all tabs should be deselected
+ * @see createTabBarItem
+ * @see showTabBarItems
+ */
+UIControls.prototype.selectTabBarItem = function(tab) {};
+
+/**
+ * Function called when a tab bar item has been selected.
+ * @param {Number} tag the tag number for the item that has been selected
+ */
+UIControls.prototype.tabBarItemSelected = function(tag) {
+ if (typeof(this.tabBarCallbacks[tag]) == 'function')
+ this.tabBarCallbacks[tag]();
+};
+
+/**
+ * Create a toolbar.
+ */
+UIControls.prototype.createToolBar = function() {};
+
+/**
+ * Function called when a tab bar item has been selected.
+ * @param {String} title the title to set within the toolbar
+ */
+UIControls.prototype.setToolBarTitle = function(title) {};
+
+PhoneGap.addConstructor(function() {
+ window.uicontrols = new UIControls();
+});
/*
* Since we can't guarantee that we will have the most recent, we just try our best!
*
@@ -540,13 +891,14 @@ Notification.prototype.beep = function(count, volume)
Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options)
{
- Geolocation.global_success = successCallback;
- Geolocation.fail = errorCallback;
- Geo.getCurrentLocation();
+ var position = Geo.getCurrentLocation();
+ this.global_success = successCallback;
+ this.fail = errorCallback;
}
+
// Run the global callback
-Geolocation.gotCurrentPosition = function(lat, lng)
+Geolocation.prototype.gotCurrentPosition = function(lat, lng, alt, altacc, head, vel, stamp)
{
if (lat == "undefined" || lng == "undefined")
{
@@ -554,14 +906,12 @@ Geolocation.gotCurrentPosition = function(lat, lng)
}
else
{
- p = {};
- p.latitude = lat;
- p.longitude = lng;
- this.global_success(p);
+ coords = new Coordinates(lat, lng, alt, altacc, head, vel);
+ loc = new Position(coords, stamp);
+ this.global_success(loc);
}
}
-
/*
* This turns on the GeoLocator class, which has two listeners.
* The listeners have their own timeouts, and run independently of this process
@@ -574,7 +924,7 @@ Geolocation.prototype.watchPosition = function(successCallback, errorCallback, o
if (!this.listeners)
{
- this.listeners = []
+ this.listeners = [];
}
var key = this.listeners.push( {"success" : successCallback, "fail" : failCallback }) - 1;
@@ -587,9 +937,11 @@ Geolocation.prototype.watchPosition = function(successCallback, errorCallback, o
* Retrieve and stop this listener from listening to the GPS
*
*/
-Geolocation.success = function(key, lat, lng)
+Geolocation.prototype.success = function(key, lat, lng, alt, altacc, head, vel, stamp)
{
- this.listeners[key].success(lat,lng);
+ var coords = new Coordinates(lat, lng, alt, altacc, head, vel);
+ var loc = new Position(coords, stamp);
+ this.listeners[key].success(loc);
}
Geolocation.prototype.fail = function(key)
@@ -602,29 +954,96 @@ Geolocation.prototype.clearWatch = function(watchId)
Geo.stop(watchId);
}
-/* Identical to the iPhone, except we have to create this in the JS */
+Notification.prototype.vibrate = function(mills)
+{
+ DroidGap.vibrate(mills);
+}
+
+/*
+ * On the Android, we don't beep, we notify you with your
+ * notification! We shouldn't keep hammering on this, and should
+ * review what we want beep to do.
+ */
+
+Notification.prototype.beep = function(count, volume)
+{
+ DroidGap.beep(count);
+}
+// Need to define these for android
_accel = {}
_accel.x = 0;
_accel.y = 0;
_accel.z = 0;
-function gotAccel(x,y,z)
+function gotAccel(x, y, z)
{
- _accel.x = x;
- _accel.y = y;
- _accel.z = z;
+ _accel.x = x;
+ _accel.y = y;
+ _accel.z = z;
}
-Accelerometer.base_method = Accelerometer.prototype.watchAcceleration
-Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options)
-{
- Accel.start();
- Accelerometer.base_method(successCallback, errorCallback, options);
+/**
+ * This class provides access to device accelerometer data.
+ * @constructor
+ */
+function Accelerometer() {
+ /**
+ * The last known acceleration.
+ */
+ this.lastAcceleration = null;
}
-Accelerometer.prototype.clearWatch = function(watchId){
- clearInterval(watchId);
- Accel.stop();
+/**
+ * Asynchronously aquires 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.
+ * @param {AccelerationOptions} options The options for getting the accelerometer data
+ * such as timeout.
+ */
+Accelerometer.prototype.getCurrentAcceleration = function(successCallback, errorCallback, options) {
+ // If the acceleration is available then call success
+ // If the acceleration is not available then call error
+
+ // Created for iPhone, Iphone passes back _accel obj litteral
+ if (typeof successCallback == "function") {
+ var accel = new Acceleration(_accel.x,_accel.y,_accel.z);
+ Accelerometer.lastAcceleration = accel;
+ successCallback(accel);
+ }
}
+/**
+ * Asynchronously aquires 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.
+ * @param {AccelerationOptions} options The options for getting the accelerometer data
+ * such as timeout.
+ */
+
+Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) {
+ // TODO: add the interval id to a list so we can clear all watches
+ var frequency = (options != undefined)? options.frequency : 10000;
+
+ Accel.start(frequency);
+ return setInterval(function() {
+ navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options);
+ }, frequency);
+}
+
+/**
+ * Clears the specified accelerometer watch.
+ * @param {String} watchId The ID of the watch returned from #watchAcceleration.
+ */
+Accelerometer.prototype.clearWatch = function(watchId) {
+ Accel.stop();
+ clearInterval(watchId);
+}
+
+PhoneGap.addConstructor(function() {
+ if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer();
+});
diff --git a/src/com/phonegap/demo/AccelListener.java b/src/com/phonegap/demo/AccelListener.java
index a3addc34..acb2f2a8 100644
--- a/src/com/phonegap/demo/AccelListener.java
+++ b/src/com/phonegap/demo/AccelListener.java
@@ -12,6 +12,10 @@ public class AccelListener implements SensorListener{
WebView mAppView;
Context mCtx;
+ String mKey;
+ int mTime = 10000;
+ boolean started = false;
+
private SensorManager sensorManager;
private long lastUpdate = -1;
@@ -19,20 +23,25 @@ public class AccelListener implements SensorListener{
AccelListener(Context ctx, WebView appView)
{
mCtx = ctx;
- mAppView = appView;
+ mAppView = appView;
sensorManager = (SensorManager) mCtx.getSystemService(Context.SENSOR_SERVICE);
}
- public void start()
+ public void start(int time)
{
- sensorManager.registerListener(this,
+ mTime = time;
+ if (!started)
+ {
+ sensorManager.registerListener(this,
SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_GAME);
+ }
}
public void stop()
{
- sensorManager.unregisterListener(this);
+ if(started)
+ sensorManager.unregisterListener(this);
}
public void onAccuracyChanged(int sensor, int accuracy) {
@@ -43,7 +52,7 @@ public class AccelListener implements SensorListener{
if (sensor != SensorManager.SENSOR_ACCELEROMETER || values.length < 3)
return;
long curTime = System.currentTimeMillis();
- if (lastUpdate == -1 || (curTime - lastUpdate) > 1000) {
+ if (lastUpdate == -1 || (curTime - lastUpdate) > mTime) {
lastUpdate = curTime;
diff --git a/src/com/phonegap/demo/DroidGap.java b/src/com/phonegap/demo/DroidGap.java
index b4e350b3..7d49187a 100644
--- a/src/com/phonegap/demo/DroidGap.java
+++ b/src/com/phonegap/demo/DroidGap.java
@@ -94,9 +94,10 @@ public class DroidGap extends Activity {
// The PhoneGap class handles the Notification and Android Specific crap
this.gap = new PhoneGap(this, appView);
this.geo = new GeoBroker(appView, this);
- this.accel = new AccelListener(this, appView);
+ this.accel = new AccelListener(this, appView);
// This creates the new javascript interfaces for PhoneGap
- appView.addJavascriptInterface(gap, "Device");
+ // Ewww - It's called DroidGap again. :(
+ appView.addJavascriptInterface(gap, "DroidGap");
appView.addJavascriptInterface(geo, "Geo");
appView.addJavascriptInterface(accel, "Accel");
}
diff --git a/src/com/phonegap/demo/GeoListener.java b/src/com/phonegap/demo/GeoListener.java
index 5a05328a..fb29ce6d 100644
--- a/src/com/phonegap/demo/GeoListener.java
+++ b/src/com/phonegap/demo/GeoListener.java
@@ -30,13 +30,20 @@ public class GeoListener {
/*
* We only need to figure out what we do when we succeed!
*/
+
+ String params;
+ /*
+ * Build the giant string to send back to Javascript!
+ */
+ params = loc.getLatitude() + "," + loc.getLongitude() + ", " + loc.getAltitude() + "," + loc.getAccuracy() + "," + loc.getBearing();
+ params += "," + loc.getSpeed() + "," + loc.getTime();
if(id != "global")
{
- mAppView.loadUrl("javascript:Geolocation.success(" + id + ", " + loc.getLatitude() + ", " + loc.getLongitude() + ")");
+ mAppView.loadUrl("javascript:navigator.geolocation.success(" + id + "," + params + ")");
}
else
{
- mAppView.loadUrl("javascript:Geolocation.gotCurrentPosition(" + loc.getLatitude() + ", " + loc.getLongitude() + ")");
+ mAppView.loadUrl("javascript:navigator.geolocation.gotCurrentPosition(" + params + ")");
this.stop();
}
}
@@ -44,7 +51,7 @@ public class GeoListener {
void fail()
{
// Do we need to know why? How would we handle this?
- mAppView.loadUrl("javascript:GeoLocation.fail(" + id + ")");
+ mAppView.loadUrl("javascript:navigator.geolocation.fail(" + id + ")");
}
// This stops the listener
diff --git a/src/com/phonegap/demo/PhoneGap.java b/src/com/phonegap/demo/PhoneGap.java
index aa319cd7..adccfbdb 100644
--- a/src/com/phonegap/demo/PhoneGap.java
+++ b/src/com/phonegap/demo/PhoneGap.java
@@ -65,7 +65,10 @@ public class PhoneGap{
RingtoneManager beeper = new RingtoneManager(mCtx);
Uri ringtone = beeper.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone notification = beeper.getRingtone(mCtx, ringtone);
- notification.play();
+ for (long i = 0; i < pattern; ++i)
+ {
+ notification.play();
+ }
}
public void vibrate(long pattern){