From 9416913aeda32032f8d2a427e28d7a2ef185cf22 Mon Sep 17 00:00:00 2001 From: Brock Whitten Date: Sat, 22 Aug 2009 17:45:34 -0700 Subject: [PATCH 1/9] resolved conflict in android/assets/www/phonegap.js file --- assets/www/phonegap.js | 2487 +++++++++++++++++++--------------------- 1 file changed, 1154 insertions(+), 1333 deletions(-) diff --git a/assets/www/phonegap.js b/assets/www/phonegap.js index 8f246d3f..906a585a 100644 --- a/assets/www/phonegap.js +++ b/assets/www/phonegap.js @@ -1,1335 +1,1156 @@ -if (typeof(DeviceInfo) != 'object') - DeviceInfo = {}; - -/** - * 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: [] -}; - -/** - * 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(); -} - -/** - * 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.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 { -<<<<<<< HEAD:android/assets/www/phonegap.js - if (window['DroidGap'] != undefined && window.DroidGap.exists()) { - this.available = true; - this.isAndroid = true; - this.uuid = window.DroidGap.getUuid(); - this.gapVersion = window.DroidGap.getVersion(); -======= - 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(); ->>>>>>> 4c08b34a81e55a3146e67a8ad2282b7082b640e0:android/assets/www/phonegap.js - } 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; -} - -<<<<<<< HEAD:android/assets/www/phonegap.js -Media.prototype.record = function() { -} - -======= ->>>>>>> 4c08b34a81e55a3146e67a8ad2282b7082b640e0:android/assets/www/phonegap.js -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 - */ -<<<<<<< HEAD:android/assets/www/phonegap.js -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) { - -} - -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(); -}); -/* - * This is because strings are not exposed - * - */ -var Device = { - - platform: "", - version: "", - uuid: "", - init: function() { - Device.platform = DroidGap.getPlatform(); - Device.version = Droidap.getVersion(); - Device.uuid = DroidGap.getUuid(); - }, - vibrate: function(mills) - { - DroidGap.vibrate(mills); - }, - beep: function() - { - DroidGap.beep(); + /** + * 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; + } } -======= -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) { - ->>>>>>> 4c08b34a81e55a3146e67a8ad2282b7082b640e0:android/assets/www/phonegap.js -} - -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) -{ -<<<<<<< HEAD:android/assets/www/phonegap.js - var position = Geo.getCurrentPosition(); -======= - var position = Geo.getCurrentLocation(); ->>>>>>> 4c08b34a81e55a3146e67a8ad2282b7082b640e0:android/assets/www/phonegap.js - this.global_success = successCallback; - this.fail = errorCallback; -} - - -// Run the global callback -<<<<<<< HEAD:android/assets/www/phonegap.js -Geolocation.prototype.gotCurrentPosition = function(lat, lng) -======= -Geolocation.prototype.gotCurrentPosition = function(lat, lng, alt, altacc, head, vel, stamp) ->>>>>>> 4c08b34a81e55a3146e67a8ad2282b7082b640e0:android/assets/www/phonegap.js -{ - if (lat == 0 || lng == 0) - { - this.fail(); - } - else - { -<<<<<<< HEAD:android/assets/www/phonegap.js - var p = { "lat" : lat, "lng": lng }; - this.global_success(p); -======= - coords = new Coordinates(lat, lng, alt, altacc, head, vel); - loc = new Position(coords, stamp); - this.global_success(loc); ->>>>>>> 4c08b34a81e55a3146e67a8ad2282b7082b640e0:android/assets/www/phonegap.js - } -} - -/* - * 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 - * - */ -<<<<<<< HEAD:android/assets/www/phonegap.js -Geolocation.prototype.success(key, lat, lng) -======= -Geolocation.prototype.success = function(key, lat, lng, alt, altacc, head, vel, stamp) ->>>>>>> 4c08b34a81e55a3146e67a8ad2282b7082b640e0:android/assets/www/phonegap.js -{ - var coords = new Coordinates(lat, lng, alt, altacc, head, vel); - var loc = new Position(coords, stamp); - this.listeners[key].success(loc); -} - -Geolocation.prototype.fail(key) -{ - this.listeners[key].fail(); -} - -Geolocation.prototype.clearWatch = function(watchId) -{ - Geo.stop(watchId); -} - -<<<<<<< HEAD:android/assets/www/phonegap.js - -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.notify(); -} -======= - -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) -{ - _accel.x = x; - _accel.y = y; - _accel.z = z; -} - -/** - * 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) { - // 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(); -}); ->>>>>>> 4c08b34a81e55a3146e67a8ad2282b7082b640e0:android/assets/www/phonegap.js + + PhoneGap.addConstructor(function() { + navigator.device = window.device = new Device(); + }); + + + + + + + /** + * 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(); + }); + + + + // Need to define these for android + _accel = {} + _accel.x = 0; + _accel.y = 0; + _accel.z = 0; + + function gotAccel(x, y, z) + { + _accel.x = x; + _accel.y = y; + _accel.z = z; + } + + /** + * 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) { + // 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(); + }); + + + + + /** + * This class provides access to the device media, interfaces to both sound and video + * @constructor + */ + function Media(src) { + this.src = src; + } + + 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 + */ + var MEDIA_AUDIO = "mp3"; + + function Media(src) { + this.src = src; + } + + Media.prototype.record = function() { + var fileparse = this.src.split('.'); + var filetype = fileparse[fileparse.length - 1]; + if ( filetype == MEDIA_AUDIO ) + { + // Queue up Audio API + } + else + { + // Start Camera Preview for Video Recording + } + } + + Media.prototype.play = function() { + var fileparse = this.src.split('.'); + var filetype = fileparse[fileparse.length - 1]; + if ( filetype = MEDIA_AUDIO) + { + // Play Audio + } + else + { + // Bring up Video Overlay + // (Note: On HTML 5 Browsers (iPhone), this should + // create a DIV with a VIDEO tag in it) + } + } + + Media.prototype.pause = function() { + // Do some pausing + } + + Media.prototype.stop = function() { + // Stop playback + } + + + /** + * 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) { + + } + + PhoneGap.addConstructor(function() { + if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); + }); + + + + /** + * 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) { + + this.winCallback = successCallback; + this.failCallback = errorCallback; + if (options.quality) + { + GapCam.takePicture(options.quality); + } + else + { + GapCam.takePicture(80); + } + } + + Camera.prototype.win = function(picture) + { + this.winCallback(picture); + } + + Camera.prototype.fail = function(err) + { + this.failCallback(err); + } + + 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() + { + // 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(); + }); + + + + /** + * 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(); + }); + + + + /** + * 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 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(); + }); + + + + /* + * 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 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 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 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; + + + + function Position(coords, timestamp) + { + this.coords = coords; + this.timestamp = timestamp; + } + + + + /** + * 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(); + }); + + From 4b3e3140f4aaeabebb17eb9227b8977e3560dff4 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 31 Aug 2009 11:32:24 -0700 Subject: [PATCH 2/9] Hacking on the File and Media APIs --- assets/www/master.css | 3 -- src/com/phonegap/demo/AccelListener.java | 1 + src/com/phonegap/demo/PhoneGap.java | 63 ------------------------ 3 files changed, 1 insertion(+), 66 deletions(-) diff --git a/assets/www/master.css b/assets/www/master.css index 6a9b7218..d4401f51 100644 --- a/assets/www/master.css +++ b/assets/www/master.css @@ -94,6 +94,3 @@ padding:1.2em 0; } - #viewport { - display: none; - } diff --git a/src/com/phonegap/demo/AccelListener.java b/src/com/phonegap/demo/AccelListener.java index acb2f2a8..83a7d161 100644 --- a/src/com/phonegap/demo/AccelListener.java +++ b/src/com/phonegap/demo/AccelListener.java @@ -8,6 +8,7 @@ import android.content.Context; import android.hardware.SensorListener; import android.webkit.WebView; +@SuppressWarnings("deprecation") public class AccelListener implements SensorListener{ WebView mAppView; diff --git a/src/com/phonegap/demo/PhoneGap.java b/src/com/phonegap/demo/PhoneGap.java index adccfbdb..021a2308 100644 --- a/src/com/phonegap/demo/PhoneGap.java +++ b/src/com/phonegap/demo/PhoneGap.java @@ -162,70 +162,7 @@ public class PhoneGap{ http.get(url, file); } - - - public int testSaveLocationExists(){ - if (fileManager.testSaveLocationExists()) - return 0; - else - return 1; - } - - public long getFreeDiskSpace(){ - long freeDiskSpace=fileManager.getFreeDiskSpace(); - return freeDiskSpace; - } - - public int testFileExists(String file){ - if (fileManager.testFileExists(file)) - return 0; - else - return 1; - } - - public int testDirectoryExists(String file){ - if (fileManager.testFileExists(file)) - return 0; - else - return 1; - } - - /** - * Delete a specific directory. - * Everyting in side the directory would be gone. - * TODO: JavaScript Call backs for success and error handling - */ - public int deleteDirectory (String dir){ - if (fileManager.deleteDirectory(dir)) - return 0; - else - return 1; - } - - - /** - * Delete a specific file. - * TODO: JavaScript Call backs for success and error handling - */ - public int deleteFile (String file){ - if (fileManager.deleteFile(file)) - return 0; - else - return 1; - } - - - /** - * Create a new directory. - * TODO: JavaScript Call backs for success and error handling - */ - public int createDirectory(String dir){ - if (fileManager.createDirectory(dir)) - return 0; - else - return 1; - } /** From 470ad5efc4ce1339758319ef459d535913d1643e Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Fri, 11 Sep 2009 14:30:24 -0700 Subject: [PATCH 3/9] PhoneGap Media and File --- src/com/phonegap/demo/DroidGap.java | 4 ++ src/com/phonegap/demo/FileUtils.java | 104 +++++++++++++++++++++++++++ src/com/phonegap/demo/PhoneGap.java | 13 ++-- 3 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 src/com/phonegap/demo/FileUtils.java diff --git a/src/com/phonegap/demo/DroidGap.java b/src/com/phonegap/demo/DroidGap.java index 211e7e62..9cc9760f 100644 --- a/src/com/phonegap/demo/DroidGap.java +++ b/src/com/phonegap/demo/DroidGap.java @@ -46,6 +46,7 @@ public class DroidGap extends Activity { private GeoBroker geo; private AccelListener accel; private CameraLauncher launcher; + private FileUtils fs; /** Called when the activity is first created. */ @Override @@ -98,11 +99,14 @@ public class DroidGap extends Activity { geo = new GeoBroker(appView, this); accel = new AccelListener(this, appView); launcher = new CameraLauncher(appView, this); + fs = new FileUtils(); + // This creates the new javascript interfaces for PhoneGap appView.addJavascriptInterface(gap, "DroidGap"); appView.addJavascriptInterface(geo, "Geo"); appView.addJavascriptInterface(accel, "Accel"); appView.addJavascriptInterface(launcher, "GapCam"); + appView.addJavascriptInterface(fs, "FileUtil"); } /** diff --git a/src/com/phonegap/demo/FileUtils.java b/src/com/phonegap/demo/FileUtils.java new file mode 100644 index 00000000..d352c7ab --- /dev/null +++ b/src/com/phonegap/demo/FileUtils.java @@ -0,0 +1,104 @@ +package com.phonegap.demo; + +import java.io.*; + +public class FileUtils { + + DirectoryManager fileManager; + FileReader f_in; + FileWriter f_out; + + public int testSaveLocationExists(){ + if (fileManager.testSaveLocationExists()) + return 0; + else + return 1; + } + + public long getFreeDiskSpace(){ + long freeDiskSpace=fileManager.getFreeDiskSpace(); + return freeDiskSpace; + } + + public int testFileExists(String file){ + if (fileManager.testFileExists(file)) + return 0; + else + return 1; + } + + public int testDirectoryExists(String file){ + if (fileManager.testFileExists(file)) + return 0; + else + return 1; + } + + /** + * Delete a specific directory. + * Everyting in side the directory would be gone. + * TODO: JavaScript Call backs for success and error handling + */ + public int deleteDirectory (String dir){ + if (fileManager.deleteDirectory(dir)) + return 0; + else + return 1; + } + + + /** + * Delete a specific file. + * TODO: JavaScript Call backs for success and error handling + */ + public int deleteFile (String file){ + if (fileManager.deleteFile(file)) + return 0; + else + return 1; + } + + + /** + * Create a new directory. + * TODO: JavaScript Call backs for success and error handling + */ + public int createDirectory(String dir){ + if (fileManager.createDirectory(dir)) + return 0; + else + return 1; + } + + public String read(String filename) + { + String data = ""; + String output = ""; + try { + FileInputStream fstream = new FileInputStream(filename); + DataInputStream in = new DataInputStream(fstream); + while (in.available() !=0) + { + data += in.readLine(); + } + } catch (FileNotFoundException e) { + data = "FAIL: File not found"; + } catch (IOException e) { + data = "FAIL: IO ERROR"; + } + + return data; + } + + public int write(String filename, String data) + { + try { + FileOutputStream out = new FileOutputStream(filename); + PrintStream p = new PrintStream(out); + p.print(data); + } catch (FileNotFoundException e) { + return -1; + } + return 0; + } +} diff --git a/src/com/phonegap/demo/PhoneGap.java b/src/com/phonegap/demo/PhoneGap.java index 021a2308..1a9f53f5 100644 --- a/src/com/phonegap/demo/PhoneGap.java +++ b/src/com/phonegap/demo/PhoneGap.java @@ -21,13 +21,12 @@ package com.phonegap.demo; * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import java.io.IOException; + import java.util.TimeZone; import android.content.Context; import android.content.IntentFilter; import android.net.Uri; -import android.os.Handler; import android.os.Vibrator; import android.telephony.TelephonyManager; import android.webkit.WebView; @@ -41,7 +40,7 @@ public class PhoneGap{ * UUID, version and availability */ public boolean droid = true; - public static String version = "0.2"; + public static String version = "0.8.0"; public static String platform = "Android"; public static String uuid; private Context mCtx; @@ -62,9 +61,8 @@ public class PhoneGap{ public void beep(long pattern) { - RingtoneManager beeper = new RingtoneManager(mCtx); - Uri ringtone = beeper.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - Ringtone notification = beeper.getRingtone(mCtx, ringtone); + Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + Ringtone notification = RingtoneManager.getRingtone(mCtx, ringtone); for (long i = 0; i < pattern; ++i) { notification.play(); @@ -162,9 +160,6 @@ public class PhoneGap{ http.get(url, file); } - - - /** * AUDIO * TODO: Basic functions done but needs more work on error handling and call backs, remove record hack From e96a3bbb9ad9fbd1c485db810860ddb2684b8752 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 5 Oct 2009 15:04:39 -0700 Subject: [PATCH 4/9] Editing manifest --- AndroidManifest.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index da6d3907..9d795076 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3,9 +3,6 @@ package="com.phonegap.demo" android:versionName="1.0.1" android:versionCode="2"> - - - @@ -31,4 +28,4 @@ - \ No newline at end of file + From cccce01415a93176388f4db2ebd28fd88e4e671f Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Thu, 15 Oct 2009 13:35:55 -0700 Subject: [PATCH 5/9] Changing the Android --- src/com/phonegap/demo/FileUtils.java | 29 ++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/com/phonegap/demo/FileUtils.java b/src/com/phonegap/demo/FileUtils.java index d352c7ab..270e9bf2 100644 --- a/src/com/phonegap/demo/FileUtils.java +++ b/src/com/phonegap/demo/FileUtils.java @@ -92,13 +92,26 @@ public class FileUtils { public int write(String filename, String data) { - try { - FileOutputStream out = new FileOutputStream(filename); - PrintStream p = new PrintStream(out); - p.print(data); - } catch (FileNotFoundException e) { - return -1; - } - return 0; + { + int i=0; + String FilePath="/sdcard/" + filename; + try { + ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes()); + byte buff[] = new byte[1024]; + FileOutputStream out= + new FileOutputStream(FilePath); + do { + int numread = in.read(buff); + if (numread <= 0) + break; + out.write(buff, 0, numread); + System.out.println("numread" + numread); + i++; + } while (true); + out.flush(); + out.close(); + } catch (Exception e) { e.printStackTrace(); } + } + return 0; } } From e36e4bc0a3e55d9eff9f8f18c8718d5f43117389 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Thu, 22 Oct 2009 14:25:45 -0700 Subject: [PATCH 6/9] Prototype of the File API implemented --- assets/www/index.html | 9 ++++++++- default.properties | 4 ++-- src/com/phonegap/demo/DroidGap.java | 1 - src/com/phonegap/demo/FileUtils.java | 1 + 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/assets/www/index.html b/assets/www/index.html index c97d6120..cf787db1 100644 --- a/assets/www/index.html +++ b/assets/www/index.html @@ -87,6 +87,12 @@ alert(fail); } + // This is just to do this. + function readFile() + { + navigator.file.read('/sdcard/phonegap.txt', fail , fail); + } + function init(){ document.addEventListener("touchmove", preventBehavior, false); setTimeout(deviceInfo, 1); @@ -112,7 +118,8 @@ Call 411 Beep Vibrate - Get a Picture + Get a Picture + Read from file
diff --git a/default.properties b/default.properties index 19e9e9df..8433081e 100644 --- a/default.properties +++ b/default.properties @@ -7,8 +7,6 @@ # "build.properties", and override values to adapt the script to your # project structure. -# Project target. -target=Google Inc.:Google APIs:3 # apk configurations. This property allows creation of APK files with limited # resources. For example, if your application contains many locales and # you wish to release multiple smaller apks instead of a large one, you can @@ -20,3 +18,5 @@ target=Google Inc.:Google APIs:3 # apk-config-european=en,fr,it,de,es # apk-config-northamerica=en,es apk-configurations= +# Project target. +target=Google Inc.:Google APIs:4 diff --git a/src/com/phonegap/demo/DroidGap.java b/src/com/phonegap/demo/DroidGap.java index 9cc9760f..8ed6e568 100644 --- a/src/com/phonegap/demo/DroidGap.java +++ b/src/com/phonegap/demo/DroidGap.java @@ -94,7 +94,6 @@ public class DroidGap extends Activity { private void bindBrowser(WebView appView) { - gap = new PhoneGap(this, appView); geo = new GeoBroker(appView, this); accel = new AccelListener(this, appView); diff --git a/src/com/phonegap/demo/FileUtils.java b/src/com/phonegap/demo/FileUtils.java index 270e9bf2..b78c76a2 100644 --- a/src/com/phonegap/demo/FileUtils.java +++ b/src/com/phonegap/demo/FileUtils.java @@ -81,6 +81,7 @@ public class FileUtils { { data += in.readLine(); } + } catch (FileNotFoundException e) { data = "FAIL: File not found"; } catch (IOException e) { From 4bb32377329a22882c2830ebcda57c038b1bf8f1 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Wed, 28 Oct 2009 13:43:39 -0700 Subject: [PATCH 7/9] Fixed File I/O --- AndroidManifest.xml | 9 ++++----- assets/www/index.html | 6 ++++++ default.properties | 14 +++----------- src/com/phonegap/demo/DroidGap.java | 2 +- src/com/phonegap/demo/FileUtils.java | 23 +++++++++++++++++------ 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index da6d3907..2d214c8f 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,17 +2,16 @@ - - - - + + + @@ -29,6 +28,6 @@ - + \ No newline at end of file diff --git a/assets/www/index.html b/assets/www/index.html index cf787db1..b77930ab 100644 --- a/assets/www/index.html +++ b/assets/www/index.html @@ -93,6 +93,11 @@ navigator.file.read('/sdcard/phonegap.txt', fail , fail); } + function writeFile() + { + navigator.file.write('foo.txt', "This is a test of writing to a file", fail, fail); + } + function init(){ document.addEventListener("touchmove", preventBehavior, false); setTimeout(deviceInfo, 1); @@ -120,6 +125,7 @@ Vibrate Get a Picture Read from file + Write to File
diff --git a/default.properties b/default.properties index 8433081e..62bef18a 100644 --- a/default.properties +++ b/default.properties @@ -7,16 +7,8 @@ # "build.properties", and override values to adapt the script to your # project structure. -# apk configurations. This property allows creation of APK files with limited -# resources. For example, if your application contains many locales and -# you wish to release multiple smaller apks instead of a large one, you can -# define configuration to create apks with limited language sets. -# Format is a comma separated list of configuration names. For each -# configuration, a property will declare the resource configurations to -# include. Example: -# apk-configurations=european,northamerica -# apk-config-european=en,fr,it,de,es -# apk-config-northamerica=en,es apk-configurations= # Project target. -target=Google Inc.:Google APIs:4 +target=android-4 +# Indicates whether an apk should be generated for each density. +split.density=false diff --git a/src/com/phonegap/demo/DroidGap.java b/src/com/phonegap/demo/DroidGap.java index 8ed6e568..8abdc669 100644 --- a/src/com/phonegap/demo/DroidGap.java +++ b/src/com/phonegap/demo/DroidGap.java @@ -98,7 +98,7 @@ public class DroidGap extends Activity { geo = new GeoBroker(appView, this); accel = new AccelListener(this, appView); launcher = new CameraLauncher(appView, this); - fs = new FileUtils(); + fs = new FileUtils(appView); // This creates the new javascript interfaces for PhoneGap appView.addJavascriptInterface(gap, "DroidGap"); diff --git a/src/com/phonegap/demo/FileUtils.java b/src/com/phonegap/demo/FileUtils.java index b78c76a2..90a01a5d 100644 --- a/src/com/phonegap/demo/FileUtils.java +++ b/src/com/phonegap/demo/FileUtils.java @@ -2,12 +2,21 @@ package com.phonegap.demo; import java.io.*; +import android.webkit.WebView; + public class FileUtils { + + WebView mView; DirectoryManager fileManager; FileReader f_in; FileWriter f_out; + FileUtils(WebView view) + { + mView = view; + } + public int testSaveLocationExists(){ if (fileManager.testSaveLocationExists()) return 0; @@ -87,20 +96,20 @@ public class FileUtils { } catch (IOException e) { data = "FAIL: IO ERROR"; } - + + mView.loadUrl("javascript:navigator.file.hasRead('" + data + "')"); return data; } public int write(String filename, String data) { - { int i=0; String FilePath="/sdcard/" + filename; try { ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes()); byte buff[] = new byte[1024]; FileOutputStream out= - new FileOutputStream(FilePath); + new FileOutputStream(FilePath, true); do { int numread = in.read(buff); if (numread <= 0) @@ -110,9 +119,11 @@ public class FileUtils { i++; } while (true); out.flush(); - out.close(); - } catch (Exception e) { e.printStackTrace(); } - } + out.close(); + mView.loadUrl("javascript:navigator.file.winCallback('File written')"); + } catch (Exception e) { + mView.loadUrl("javascript:navigator.file.failCallback('Fail')"); + } return 0; } } From 5becaa3ca40a5418e19c373d8290d3ddbf693df2 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Wed, 28 Oct 2009 13:49:37 -0700 Subject: [PATCH 8/9] Fixing the merge --- AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2d214c8f..f8b00ddd 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -30,4 +30,4 @@ - \ No newline at end of file + From 24d7521f8cbc14b102c7dfc083fe26f413c6a4ad Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 2 Nov 2009 10:06:23 -0800 Subject: [PATCH 9/9] Very minor changes to the core classes --- src/com/phonegap/demo/DroidGap.java | 9 ++++++--- src/com/phonegap/demo/PhoneGap.java | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/com/phonegap/demo/DroidGap.java b/src/com/phonegap/demo/DroidGap.java index 8abdc669..d4984d34 100644 --- a/src/com/phonegap/demo/DroidGap.java +++ b/src/com/phonegap/demo/DroidGap.java @@ -61,10 +61,11 @@ public class DroidGap extends Activity { /* This changes the setWebChromeClient to log alerts to LogCat! Important for Javascript Debugging */ - appView.setWebChromeClient(new GapClient(this)); + appView.setWebChromeClient(new GapClient(this)); appView.getSettings().setJavaScriptEnabled(true); - appView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); - + appView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); + + /* Bind the appView object to the gap class methods */ bindBrowser(appView); @@ -131,6 +132,8 @@ public class DroidGap extends Activity { result.confirm(); return true; } + + } diff --git a/src/com/phonegap/demo/PhoneGap.java b/src/com/phonegap/demo/PhoneGap.java index 1a9f53f5..46bedf99 100644 --- a/src/com/phonegap/demo/PhoneGap.java +++ b/src/com/phonegap/demo/PhoneGap.java @@ -26,6 +26,7 @@ import java.util.TimeZone; import android.content.Context; import android.content.IntentFilter; +import android.hardware.SensorManager; import android.net.Uri; import android.os.Vibrator; import android.telephony.TelephonyManager; @@ -83,8 +84,7 @@ public class PhoneGap{ } public String getUuid() - { - + { TelephonyManager operator = (TelephonyManager) mCtx.getSystemService(Context.TELEPHONY_SERVICE); String uuid = operator.getDeviceId(); return uuid;