From 86907836b2588771f9970168f1bcef1d06b0f0d6 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Fri, 20 Nov 2009 16:50:15 -0800 Subject: [PATCH 01/15] Removing the SMS Listener --- framework/src/com/phonegap/PhoneGap.java | 31 +--------- framework/src/com/phonegap/SmsListener.java | 68 --------------------- 2 files changed, 2 insertions(+), 97 deletions(-) delete mode 100644 framework/src/com/phonegap/SmsListener.java diff --git a/framework/src/com/phonegap/PhoneGap.java b/framework/src/com/phonegap/PhoneGap.java index edc1cdd5..0b915d0b 100644 --- a/framework/src/com/phonegap/PhoneGap.java +++ b/framework/src/com/phonegap/PhoneGap.java @@ -46,14 +46,12 @@ public class PhoneGap{ public static String uuid; private Context mCtx; private WebView mAppView; - SmsListener mSmsListener; AudioHandler audio; public PhoneGap(Context ctx, WebView appView) { this.mCtx = ctx; this.mAppView = appView; - - mSmsListener = new SmsListener(ctx,mAppView); + audio = new AudioHandler("/sdcard/tmprecording.mp3", ctx); uuid = getUuid(); } @@ -119,33 +117,8 @@ public class PhoneGap{ return version; } - // Old SMS code, figure out what to do with this! - // BTW: This is awesome! - public void notificationWatchPosition(String filter) - /** - * Starts the listener for incoming notifications of type filter - * TODO: JavaScript Call backs for success and error handling. More filter types. - */ - { - if (filter.contains("SMS")) - { - IntentFilter mFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); - mCtx.registerReceiver(mSmsListener,mFilter); - } - } - - public void notificationClearWatch(String filter) - /** - * Stops the listener for incoming notifications of type filter - * TODO: JavaScript Call backs for success and error handling - */ - { - if (filter.contains("SMS")) - { - mCtx.unregisterReceiver(mSmsListener); - } - } + public void httpGet(String url, String file) /** diff --git a/framework/src/com/phonegap/SmsListener.java b/framework/src/com/phonegap/SmsListener.java deleted file mode 100644 index 3a37a982..00000000 --- a/framework/src/com/phonegap/SmsListener.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.phonegap; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.telephony.gsm.SmsMessage; -import android.util.Log; -import android.webkit.WebView; - -public class SmsListener extends BroadcastReceiver -{ - private WebView mAppView; - - public SmsListener(Context ctx, WebView mAppView) - { - this.mAppView = mAppView; - } - - String ACTION = "android.provider.Telephony.SMS_RECEIVED"; - - public void onReceive(Context ctx, Intent intent) - { - SmsMessage[] msg; - if (intent.getAction().equals(ACTION)) - { - msg = getMessagesFromIntent(intent); - String smsContent = null; - String sendersNumber = null; - for(int i=0; i < msg.length; i++) - { - sendersNumber = msg[i].getDisplayOriginatingAddress(); - smsContent = msg[i].getDisplayMessageBody(); - } - onReceiveSMS(sendersNumber, smsContent); - } - } - - protected void onReceiveSMS(String sendersNumber, String smsContent) - /** - * Call back to Java Script - */ - { - mAppView.loadUrl("javascript:onReceiveSms('"+sendersNumber+"',"+"'"+ smsContent +"'"+")"); - } - - private SmsMessage[] getMessagesFromIntent(Intent intent) - { - SmsMessage retMsgs[] = null; - Bundle bdl = intent.getExtras(); - try - { - Object pdus[] = (Object [])bdl.get("pdus"); - retMsgs = new SmsMessage[pdus.length]; - for(int n=0; n < pdus.length; n++) - { - byte[] byteData = (byte[])pdus[n]; - retMsgs[n] = SmsMessage.createFromPdu(byteData); - } - } catch(Exception e) - { - Log.e("SMS_getMessagesFromIntent", "fail", e); - } - return retMsgs; - } - -} - From 5ab93f8741879e655a3a39b8716443aac29c3b8c Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 23 Nov 2009 10:46:14 -0800 Subject: [PATCH 02/15] Removing AddressBook --- js/addressbook.js | 140 ---------------------------------------------- 1 file changed, 140 deletions(-) delete mode 100644 js/addressbook.js diff --git a/js/addressbook.js b/js/addressbook.js deleted file mode 100644 index 1c54a5a7..00000000 --- a/js/addressbook.js +++ /dev/null @@ -1,140 +0,0 @@ -/** - * This overrides existing contact code, and builds proper contacts - * @constructor - */ - -var Contact = function() { - this.givenNames = []; - this.familyName = ""; - this.phones = []; - this.category = ""; - this.companyName = ""; - this.isCompany = false; - this.email = []; - this.addresses = []; - this.uri = []; - this.prefix = ""; - this.jobTitle = ""; - this.birthday = ""; - this.phoneticName = ""; -} - -var Address = function() { - this.street = ""; - this.postalCode = ""; - this.city = ""; - this.region = ""; - this.countryCode = ""; - this.country = ""; - this.building = ""; - this.floor = ""; - this.accessCode = ""; -} - -var PhoneNumber = function() { - this.number = ""; - this.type = ""; -} - -var Email = function() { - this.address = ""; - this.type = ""; -} - -var ImHandle = function() -{ - this.address = ""; - this.type = ""; - this.network = ""; -} - -var Uri = function() { - this.addr = ""; - this.rel = ""; -} - - -var AddressBook = function() { - this.name = ""; - this.resultSet = []; -} - -AddressBook.prototype.addContact = function(newContact, win, fail) -{ - -} - -AddressBook.prototype.removeContact = function(target, win, fail) -{ - -} - -AddressBook.prototype.findContacts = function(filter,win, fail) -{ -} - -PhoneGap.addConstructor(function() { - if (typeof navigator.AddressBook == "undefined") - navigator.AddressBook = new AddressBook(); }); -AddressBook.prototype.addContact = function(newContact, win, fail) -{ - -} - -AddressBook.prototype.removeContact = function(target, win, fail) -{ - -} - -AddressBook.prototype.findContacts = function(filter,win, fail) -{ - this.win = win; - this.fail = fail; - // Zero out the result set for the query - this.resultSet = []; - var name = ""; - var phone = ""; - var email = ""; - - if (filter.givenName) - name = filter.givenName; - if (filter.familyName) - name += filter.familyName; - if (filter.phone) - var phone = filter.phone; - if (filter.email) - var email = filter.email; - ContactHook.search(name, phone, email); -} - -AddressBook.prototype.droidFoundContact = function(name, npa, email) -{ - names = name.split(' '); - personContact = new Contact(); - personContact.givenNames.push(names[0]); - // This is technically wrong, but we can't distinguish right now - if(names.length > 1) - { - personContact.familyName = name[name.length -1]; - } - - telNumber = new PhoneNumber(); - telNumber.number = npa; - personContact.phones.push(telNumber); - - email_addr = new Email(); - email_addr.address = email; - - personContact.email.push(email_addr); - - this.resultSet.push(personContact); - -} - -AddressBook.prototype.droidDoneContacts = function() -{ - if(resultSet.length > 0) - this.win(resultSet); - else - this.fail(); -} From 80ece870d27509709ad572062a6d82c4adbff4ee Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 23 Nov 2009 10:49:37 -0800 Subject: [PATCH 03/15] Error with acceleromter API. Missed the acceleration object --- js/accelerometer.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/js/accelerometer.js b/js/accelerometer.js index 4d89ced1..d0b40a6b 100644 --- a/js/accelerometer.js +++ b/js/accelerometer.js @@ -1,3 +1,10 @@ +function Acceleration(x, y, z) +{ + this.x = x; + this.y = y; + this.z = z; +} + // Need to define these for android _accel = {} _accel.x = 0; From 275cf0c71c52f3d49fa42882c383274414a1705d Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 23 Nov 2009 10:51:55 -0800 Subject: [PATCH 04/15] Misc. Fixes --- framework/assets/www/phonegap.js | 1599 ++++++++++++------------------ 1 file changed, 640 insertions(+), 959 deletions(-) diff --git a/framework/assets/www/phonegap.js b/framework/assets/www/phonegap.js index e9fcbd94..a06c686e 100644 --- a/framework/assets/www/phonegap.js +++ b/framework/assets/www/phonegap.js @@ -73,956 +73,13 @@ PhoneGap.exec = function() { 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(); -} - -/** - * 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) { - 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.name = ""; - this.phones = {}; - this.emails = {}; - this.address = ""; -} - -Contact.prototype.displayName = function() +function Acceleration(x, y, z) { - // TODO: can be tuned according to prefs - return this.name; + this.x = x; + this.y = y; + this.z = z; } -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(); - var event = document.createEvent("Events"); - event.initEvent('deviceReady', false, false); - document.dispatchEvent(event); -}); -/** - * 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 dependent. - * @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, successCallback, errorCallback) { - this.src = src; - this.successCallback = successCallback; - this.errorCallback = errorCallback; -} - -Media.prototype.record = function() { -} - -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 contains information about any NetworkStatus. - * @constructor - */ -function NetworkStatus() { - this.code = null; - this.message = ""; -} - -NetworkStatus.NOT_REACHABLE = 0; -NetworkStatus.REACHABLE_VIA_CARRIER_DATA_NETWORK = 1; -NetworkStatus.REACHABLE_VIA_WIFI_NETWORK = 2; - -/** - * This class provides access to device Network data (reachability). - * @constructor - */ -function Network() { - /** - * The last known Network status. - * { hostName: string, ipAddress: string, - remoteHostStatus: int(0/1/2), internetConnectionStatus: int(0/1/2), localWiFiConnectionStatus: int (0/2) } - */ - this.lastReachability = null; -}; - -/** - * - * @param {Function} successCallback - * @param {Function} errorCallback - * @param {Object} options (isIpAddress:boolean) - */ -Network.prototype.isReachable = function(hostName, successCallback, options) { -} - -/** - * Called by the geolocation framework when the reachability status has changed. - * @param {Reachibility} reachability The current reachability status. - */ -Network.prototype.updateReachability = function(reachability) { - this.lastReachability = reachability; -}; - -PhoneGap.addConstructor(function() { - if (typeof navigator.network == "undefined") navigator.network = new Network(); -}); -/** - * 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! -* -* Also, the API doesn't specify which version is the best version of the API -*/ - -Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) -{ - var position = Geo.getCurrentLocation(); - this.global_success = successCallback; - this.fail = errorCallback; -} - - -// Run the global callback -Geolocation.prototype.gotCurrentPosition = function(lat, lng, alt, altacc, head, vel, stamp) -{ - if (lat == "undefined" || lng == "undefined") - { - this.fail(); - } - else - { - 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 -* 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.prototype.success = function(key, lat, lng, alt, altacc, head, vel, stamp) -{ - 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) -{ - this.listeners[key].fail(); -} - -Geolocation.prototype.clearWatch = function(watchId) -{ - Geo.stop(watchId); -} -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; @@ -1141,6 +198,135 @@ Camera.prototype.fail = function(err) PhoneGap.addConstructor(function() { if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); }); +/** + * This class provides access to device Compass data. + * @constructor + */ +function Compass() { + /** + * The last known Compass position. + */ + this.lastHeading = null; + this.lastError = null; + this.callbacks = { + onHeadingChanged: [], + onError: [] + }; +}; + +/** + * Asynchronously aquires the current heading. + * @param {Function} successCallback The function to call when the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {PositionOptions} options The options for getting the heading data + * such as timeout. + */ +Compass.prototype.getCurrentHeading = function(successCallback, errorCallback, options) { + if (this.lastHeading == null) { + this.start(options); + } + else + if (typeof successCallback == "function") { + successCallback(this.lastHeading); + } +}; + +/** + * Asynchronously aquires the heading repeatedly at a given interval. + * @param {Function} successCallback The function to call each time the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. + */ +Compass.prototype.watchHeading= 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.getCurrentHeading(successCallback, errorCallback, options); + var frequency = 100; + if (typeof(options) == 'object' && options.frequency) + frequency = options.frequency; + + var self = this; + return setInterval(function() { + self.getCurrentHeading(successCallback, errorCallback, options); + }, frequency); +}; + + +/** + * Clears the specified heading watch. + * @param {String} watchId The ID of the watch returned from #watchHeading. + */ +Compass.prototype.clearWatch = function(watchId) { + clearInterval(watchId); +}; + + +/** + * Called by the geolocation framework when the current heading is found. + * @param {HeadingOptions} position The current heading. + */ +Compass.prototype.setHeading = function(heading) { + this.lastHeading = heading; + for (var i = 0; i < this.callbacks.onHeadingChanged.length; i++) { + var f = this.callbacks.onHeadingChanged.shift(); + f(heading); + } +}; + +/** + * Called by the geolocation framework when an error occurs while looking up the current position. + * @param {String} message The text of the error message. + */ +Compass.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.compass == "undefined") navigator.compass = new Compass(); +}); +/** + * This class provides access to the device contacts. + * @constructor + */ + +function Contact(jsonObject) { + this.firstName = ""; + this.lastName = ""; + this.name = ""; + this.phones = {}; + this.emails = {}; + this.address = ""; +} + +Contact.prototype.displayName = function() +{ + // TODO: can be tuned according to prefs + return this.name; +} + +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(); +}); ContactManager.prototype.getAllContacts = function(successCallback, errorCallback, options) { this.win = successCallback; this.fail = errorCallback; @@ -1160,29 +346,80 @@ ContactManager.prototype.droidDone = function() { win(this.contacts); } - /** - * This class provides access to the device media, interfaces to both sound and video + * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. * @constructor */ - -Media.prototype.play = function() { - DroidGap.startPlayingAudio(this.src); +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; + } } -Media.prototype.stop = function() { - DroidGap.stopPlayingAudio(); +PhoneGap.addConstructor(function() { + navigator.device = window.device = new Device(); + var event = document.createEvent("Events"); + event.initEvent('deviceReady', false, false); + document.dispatchEvent(event); +}); +/** + * 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 = ""; } -Media.prototype.startRecord = function() { - DroidGap.startRecordingAudio(this.src); +/** + * 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 dependent. + * @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) { + } -Media.prototype.stopRecordingAudio = function() { - DroidGap.stopRecordingAudio(); +/** + * 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(); +}); File.prototype.read = function(fileName, successCallback, errorCallback) { this.failCallback = errorCallback; @@ -1256,6 +493,301 @@ File.prototype.getFreeDiskSpace = function(successCallback, failCallback) failCallback(); return diskSpace; } +/** + * 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(); +}); +/* +* 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) +{ + var position = Geo.getCurrentLocation(); + this.global_success = successCallback; + this.fail = errorCallback; +} + + +// Run the global callback +Geolocation.prototype.gotCurrentPosition = function(lat, lng, alt, altacc, head, vel, stamp) +{ + if (lat == "undefined" || lng == "undefined") + { + this.fail(); + } + else + { + 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 +* 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.prototype.success = function(key, lat, lng, alt, altacc, head, vel, stamp) +{ + 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) +{ + this.listeners[key].fail(); +} + +Geolocation.prototype.clearWatch = function(watchId) +{ + Geo.stop(watchId); +} +/** + * This class provides access to the device media, interfaces to both sound and video + * @constructor + */ +function Media(src, successCallback, errorCallback) { + this.src = src; + this.successCallback = successCallback; + this.errorCallback = errorCallback; +} + +Media.prototype.record = function() { +} + +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 media, interfaces to both sound and video + * @constructor + */ + +Media.prototype.play = function() { + DroidGap.startPlayingAudio(this.src); +} + +Media.prototype.stop = function() { + DroidGap.stopPlayingAudio(); +} + +Media.prototype.startRecord = function() { + DroidGap.startRecordingAudio(this.src); +} + +Media.prototype.stopRecordingAudio = function() { + DroidGap.stopRecordingAudio(); +} + + +/** + * This class contains information about any NetworkStatus. + * @constructor + */ +function NetworkStatus() { + this.code = null; + this.message = ""; +} + +NetworkStatus.NOT_REACHABLE = 0; +NetworkStatus.REACHABLE_VIA_CARRIER_DATA_NETWORK = 1; +NetworkStatus.REACHABLE_VIA_WIFI_NETWORK = 2; + +/** + * This class provides access to device Network data (reachability). + * @constructor + */ +function Network() { + /** + * The last known Network status. + * { hostName: string, ipAddress: string, + remoteHostStatus: int(0/1/2), internetConnectionStatus: int(0/1/2), localWiFiConnectionStatus: int (0/2) } + */ + this.lastReachability = null; +}; + +/** + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options (isIpAddress:boolean) + */ +Network.prototype.isReachable = function(hostName, successCallback, options) { +} + +/** + * Called by the geolocation framework when the reachability status has changed. + * @param {Reachibility} reachability The current reachability status. + */ +Network.prototype.updateReachability = function(reachability) { + this.lastReachability = reachability; +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.network == "undefined") navigator.network = new Network(); +}); Network.prototype.isReachable = function(uri, win, options) { var status = new NetworkStatus(); @@ -1270,3 +802,152 @@ Network.prototype.isReachable = function(uri, win, options) status.code = 0; win(status); } +/** + * 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(); +}); + +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); +} +/** + * 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; From 2176d2e02c75087d3297b21377a6dccb8b1a33ee Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 23 Nov 2009 10:57:05 -0800 Subject: [PATCH 05/15] Making constructors public --- framework/src/com/phonegap/AccelListener.java | 2 +- framework/src/com/phonegap/GeoBroker.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/com/phonegap/AccelListener.java b/framework/src/com/phonegap/AccelListener.java index 25cbc489..ce5edb3e 100644 --- a/framework/src/com/phonegap/AccelListener.java +++ b/framework/src/com/phonegap/AccelListener.java @@ -23,7 +23,7 @@ public class AccelListener implements SensorEventListener{ private long lastUpdate = -1; - AccelListener(Context ctx, WebView appView) + public AccelListener(Context ctx, WebView appView) { mCtx = ctx; mAppView = appView; diff --git a/framework/src/com/phonegap/GeoBroker.java b/framework/src/com/phonegap/GeoBroker.java index 3e90cd16..659a28d5 100644 --- a/framework/src/com/phonegap/GeoBroker.java +++ b/framework/src/com/phonegap/GeoBroker.java @@ -16,7 +16,7 @@ public class GeoBroker { private Context mCtx; private HashMap geoListeners; - GeoBroker(WebView view, Context ctx) + public GeoBroker(WebView view, Context ctx) { mCtx = ctx; mAppView = view; From d92689140e745f297c0b096d050ecd376cbe32d4 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 23 Nov 2009 17:00:05 -0800 Subject: [PATCH 06/15] win should be this.win --- js/contact.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/contact.js b/js/contact.js index 0835a86f..6b320097 100644 --- a/js/contact.js +++ b/js/contact.js @@ -48,5 +48,5 @@ ContactManager.prototype.droidAddContact = function(name, phone, email) ContactManager.prototype.droidDone = function() { - win(this.contacts); + this.win(this.contacts); } From 7ce99a6baaebdc7a8bb69fa16d7327d56543b9da Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 14:38:21 -0800 Subject: [PATCH 07/15] Downgrading to Android 1.5 temporarily to tag it --- framework/AndroidManifest.xml | 9 +-------- framework/gen/com/phonegap/R.java | 17 ++++++----------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/framework/AndroidManifest.xml b/framework/AndroidManifest.xml index 399a6e40..6a9b59fa 100644 --- a/framework/AndroidManifest.xml +++ b/framework/AndroidManifest.xml @@ -1,13 +1,6 @@ - @@ -38,6 +31,6 @@ - + diff --git a/framework/gen/com/phonegap/R.java b/framework/gen/com/phonegap/R.java index db7185cc..938334cb 100644 --- a/framework/gen/com/phonegap/R.java +++ b/framework/gen/com/phonegap/R.java @@ -14,22 +14,17 @@ public final class R { public static final int icon=0x7f020000; } public static final class id { - public static final int appView=0x7f060000; - public static final int go=0x7f060002; - public static final int surface=0x7f060001; + public static final int appView=0x7f050000; + public static final int go=0x7f050002; + public static final int surface=0x7f050001; } public static final class layout { public static final int main=0x7f030000; public static final int preview=0x7f030001; } - public static final class raw { - public static final int bird=0x7f040000; - public static final int off=0x7f040001; - public static final int on=0x7f040002; - } public static final class string { - public static final int app_name=0x7f050000; - public static final int go=0x7f050002; - public static final int url=0x7f050001; + public static final int app_name=0x7f040000; + public static final int go=0x7f040002; + public static final int url=0x7f040001; } } From 3259f885e08048ec2331525d749e5fea82d29f80 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 14:38:48 -0800 Subject: [PATCH 08/15] Forgot to update the default properties --- framework/default.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/default.properties b/framework/default.properties index 62bef18a..421721f4 100644 --- a/framework/default.properties +++ b/framework/default.properties @@ -9,6 +9,6 @@ apk-configurations= # Project target. -target=android-4 +target=android-3 # Indicates whether an apk should be generated for each density. split.density=false From a92c49e69160541199587851a354b7ffcb40df85 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 15:02:51 -0800 Subject: [PATCH 09/15] Moving it back to Android 1.6 --- framework/AndroidManifest.xml | 9 ++++++++- framework/default.properties | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/framework/AndroidManifest.xml b/framework/AndroidManifest.xml index 6a9b59fa..399a6e40 100644 --- a/framework/AndroidManifest.xml +++ b/framework/AndroidManifest.xml @@ -1,6 +1,13 @@ + @@ -31,6 +38,6 @@ - + diff --git a/framework/default.properties b/framework/default.properties index 421721f4..62bef18a 100644 --- a/framework/default.properties +++ b/framework/default.properties @@ -9,6 +9,6 @@ apk-configurations= # Project target. -target=android-3 +target=android-4 # Indicates whether an apk should be generated for each density. split.density=false From 695e1a5e044083c2e95644536bbcbdfea0e86fb5 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 15:11:32 -0800 Subject: [PATCH 10/15] Adding README --- README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..774779ac --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ + +PhoneGap Android +============================================================= +PhoneGap Android is an Android application library that allows +for PhoneGap based projects to be built for the Android Platform. + +Pre-requisites +------------------------------------------------------------- + * Java JDK 1.5 + * Android SDK Package [http://developer.android.com](http://developer.android.com) + * Apache ANT (For build script) + * Eclipse (Recommended, not required) + +Build from Command Line +------------------------------------------------------------- +ant phonegap_debug or ant phonegap_release + +Getting Started with Eclipse +------------------------------------------------------------- +The wiki article to get started with Eclipse can be found at [http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)]http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested) + +Android 1.5 +------------------------------------------------------------ +The Android 1.5 Branch contains a 1.5 version of PhoneGap. This should +be used for carriers who do not currently have Android 1.6 or newer devices +offered. + + From 4b7716f99671754c74b5e51e9a3307cc926b407a Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 15:12:45 -0800 Subject: [PATCH 11/15] Fixing markdown --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 774779ac..551ba8e8 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ant phonegap_debug or ant phonegap_release Getting Started with Eclipse ------------------------------------------------------------- -The wiki article to get started with Eclipse can be found at [http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)]http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested) +The wiki article to get started with Eclipse can be found at [phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)]http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested) Android 1.5 ------------------------------------------------------------ From f7dcc41d82a70f3bc880ce86ef863ebc1a973200 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 15:13:43 -0800 Subject: [PATCH 12/15] I hate markdown --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 551ba8e8..bbce909d 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ant phonegap_debug or ant phonegap_release Getting Started with Eclipse ------------------------------------------------------------- -The wiki article to get started with Eclipse can be found at [phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)]http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested) +The wiki article to get started with Eclipse can be found at [phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)](http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)) Android 1.5 ------------------------------------------------------------ From 1a97b889fa7df8211bd4ef930df9621860070605 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 15:14:25 -0800 Subject: [PATCH 13/15] Fixing long Wiki article --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bbce909d..2fb62c0f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ant phonegap_debug or ant phonegap_release Getting Started with Eclipse ------------------------------------------------------------- -The wiki article to get started with Eclipse can be found at [phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)](http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)) +The wiki article to get started with Eclipse can be found at [http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)](http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)) Android 1.5 ------------------------------------------------------------ From 37be86f1dd080102c44f5f40ffbae4fd4c853096 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 15:15:43 -0800 Subject: [PATCH 14/15] Fixing markdown --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2fb62c0f..bb0b1d97 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ant phonegap_debug or ant phonegap_release Getting Started with Eclipse ------------------------------------------------------------- -The wiki article to get started with Eclipse can be found at [http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)](http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)) +The wiki article to get started with Eclipse can be found at [http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)](http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested\)) Android 1.5 ------------------------------------------------------------ From b8cb94305f5f0261aa62b01cd216c5204f083301 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Tue, 24 Nov 2009 15:34:19 -0800 Subject: [PATCH 15/15] Fixed the damn URL on the wiki side --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bb0b1d97..703b8e40 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ant phonegap_debug or ant phonegap_release Getting Started with Eclipse ------------------------------------------------------------- -The wiki article to get started with Eclipse can be found at [http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested)](http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse-(Tested\)) +The wiki article to get started with Eclipse can be found at [http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse](http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse) Android 1.5 ------------------------------------------------------------