From 3365dba87078817232c49788457eb8f2e73cb45f Mon Sep 17 00:00:00 2001 From: Dave Johnson Date: Tue, 20 Jul 2010 11:25:55 -0700 Subject: [PATCH 01/13] fixed up things so that deviceready now uses DOMContentLoaded and if DCL fires before something is attached to deviceready the function will be called immediately --- droidgap | 1 + example/phonegap.js | 126 +++++++++++++++++++++++++-- framework/assets/js/channel.js | 81 +++++++++++++++++ framework/assets/js/phonegap.js.base | 2 - 4 files changed, 201 insertions(+), 9 deletions(-) create mode 100644 framework/assets/js/channel.js diff --git a/droidgap b/droidgap index 7c9d9d1e3..928054a76 100755 --- a/droidgap +++ b/droidgap @@ -7,6 +7,7 @@ class Build def initialize(*a) @android_sdk_path, @name, @pkg, @www, @path = a + @android_sdk_path = "/Users/davejohnson/Sdk/android-sdk-mac_86" @android_dir = File.expand_path(File.dirname(__FILE__)) @framework_dir = File.join(@android_dir, "framework") end diff --git a/example/phonegap.js b/example/phonegap.js index dfd6f4585..37080a15a 100644 --- a/example/phonegap.js +++ b/example/phonegap.js @@ -186,8 +186,6 @@ document.addEventListener = function(evt, handler, capture) { } }; - - /** * 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 @@ -331,6 +329,8 @@ PhoneGap.close = function(context, func, params) { this.y = y; this.z = z; this.timestamp = new Date().getTime(); + this.win = null; + this.fail = null; } /** @@ -364,7 +364,6 @@ Accelerometer.ERROR_MSG = ["Not running", "Starting", "", "Failed to start"]; * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. */ Accelerometer.prototype.getCurrentAcceleration = function(successCallback, errorCallback, options) { - // successCallback required if (typeof successCallback != "function") { console.log("Accelerometer Error: successCallback is not a function"); @@ -427,6 +426,24 @@ Accelerometer.prototype.getCurrentAcceleration = function(successCallback, error } } + +Accelerometer.prototype.gotCurrentAcceleration = function(key, x, y, z) +{ + var a = new Acceleration(x,y,z); + a.x = x; + a.y = y; + a.z = z; + a.win = accelListeners[key].win; + a.fail = accelListeners[key].fail; + this.timestamp = new Date().getTime(); + this.lastAcceleration = a; + accelListeners[key] = a; + if (typeof a.win == "function") { + a.win(a); + } +} + + /** * Asynchronously aquires the acceleration repeatedly at a given interval. * @@ -436,7 +453,6 @@ Accelerometer.prototype.getCurrentAcceleration = function(successCallback, error * @return String The watch id that must be passed to #clearWatch to stop watching. */ Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) { - // Default interval (10 sec) var frequency = (options != undefined)? options.frequency : 10000; @@ -550,7 +566,87 @@ Camera.prototype.fail = function(err) PhoneGap.addConstructor(function() { if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); }); -/** +PhoneGap.Channel = function(type) +{ + this.type = type; + this.handlers = {}; + this.guid = 0; + this.fired = false; + this.enabled = true; +}; + +PhoneGap.Channel.prototype.sub = function(f, c, g) +{ + // need a function to call + if (f == null) + return; + + var func = f; + if (typeof c == "object" && f instanceof Function) + func = PhoneGap.close(c, f); + + g = g || func.observer_guid || f.observer_guid || this.guid++; + func.observer_guid = g; + f.observer_guid = g; + this.handlers[g] = func; + return g; +}; + +PhoneGap.Channel.prototype.sob = function(f, c) +{ + var g = null; + var _this = this; + var m = function() { + f.apply(c || null, arguments); + _this.dub(g); + } + if (this.fired) { + if (typeof c == "object" && f instanceof Function) + f = PhoneGap.close(c, f); + f.apply(this, this.fireArgs); + } else { + g = this.sub(m); + } + return g; +}; + +PhoneGap.Channel.prototype.dub = function(g) +{ + if (g instanceof Function) + g = g.observer_guid; + this.handlers[g] = null; + delete this.handlers[g]; +}; + +PhoneGap.Channel.prototype.fire = function(e) +{ + if (this.enabled) + { + var fail = false; + for (var item in this.handlers) { + var handler = this.handlers[item]; + if (handler instanceof Function) { + var rv = (handler.apply(this, arguments)==false); + fail = fail || rv; + } + } + this.fired = true; + this.fireArgs = arguments; + return !fail; + } + return true; +}; + +PhoneGap.Channel.merge = function(h, e) { + var i = e.length; + var f = function() { + if (!(--i)) h(); + } + for (var j=0; j Date: Thu, 22 Jul 2010 13:05:41 -0700 Subject: [PATCH 02/13] added onNativeReady and onDOMContentLoaded events --- example/phonegap.js | 1692 ---------------------- framework/assets/js/phonegap.js.base | 18 +- framework/src/com/phonegap/DroidGap.java | 5 + 3 files changed, 20 insertions(+), 1695 deletions(-) diff --git a/example/phonegap.js b/example/phonegap.js index 37080a15a..e69de29bb 100644 --- a/example/phonegap.js +++ b/example/phonegap.js @@ -1,1692 +0,0 @@ -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 - } -}; - - -/** - * Custom pub-sub channel that can have functions subscribed to it - */ -PhoneGap.Channel = function(type) -{ - this.type = type; - this.handlers = {}; - this.guid = 0; - this.fired = false; - this.enabled = true; -}; - -/** - * Subscribes the given function to the channel. Any time that - * Channel.fire is called so too will the function. - * Optionally specify an execution context for the function - * and a guid that can be used to stop subscribing to the channel. - * Returns the guid. - */ -PhoneGap.Channel.prototype.subscribe = function(f, c, g) { - // need a function to call - if (f == null) { return; } - - var func = f; - if (typeof c == "object" && f instanceof Function) { func = PhoneGap.close(c, f); } - - g = g || func.observer_guid || f.observer_guid || this.guid++; - func.observer_guid = g; - f.observer_guid = g; - this.handlers[g] = func; - return g; -}; - -/** - * Like subscribe but the function is only called once and then it - * auto-unsubscribes itself. - */ -PhoneGap.Channel.prototype.subscribeOnce = function(f, c) { - var g = null; - var _this = this; - var m = function() { - f.apply(c || null, arguments); - _this.unsubscribe(g); - } - if (this.fired) { - if (typeof c == "object" && f instanceof Function) { f = PhoneGap.close(c, f); } - f.apply(this, this.fireArgs); - } else { - g = this.subscribe(m); - } - return g; -}; - -/** - * Unsubscribes the function with the given guid from the channel. - */ -PhoneGap.Channel.prototype.unsubscribe = function(g) { - if (g instanceof Function) { g = g.observer_guid; } - this.handlers[g] = null; - delete this.handlers[g]; -}; - -/** - * Calls all functions subscribed to this channel. - */ -PhoneGap.Channel.prototype.fire = function(e) { - if (this.enabled) { - var fail = false; - for (var item in this.handlers) { - var handler = this.handlers[item]; - if (handler instanceof Function) { - var rv = (handler.apply(this, arguments)==false); - fail = fail || rv; - } - } - this.fired = true; - this.fireArgs = arguments; - return !fail; - } - return true; -}; - -/** - * Calls the provided function only after all of the channels specified - * have been fired. - */ -PhoneGap.Channel.join = function(h, c) { - var i = c.length; - var f = function() { - if (!(--i)) h(); - } - for (var j=0; j frequency + 10 sec - var timeout = Accel.getTimeout(); - if (timeout < (frequency + 10000)) { - Accel.setTimeout(frequency + 10000); // set to frequency + 10 sec - } - - var id = PhoneGap.createUUID(); - Accel.start(); - - // Start watch timer - navigator.accelerometer.timers[id] = setInterval(function() { - var status = Accel.getStatus(); - - // If accelerometer is running - if (status == Accelerometer.RUNNING) { - try { - var accel = new Acceleration(Accel.getX(), Accel.getY(), Accel.getZ()); - successCallback(accel); - } catch (e) { - console.log("Accelerometer Error in successCallback: " + e); - } - } - - // If accelerometer had error - else if (status != Accelerometer.STARTING) { - console.log("Accelerometer Error: "+ Accelerometer.ERROR_MSG[status]); - try { - navigator.accelerometer.clearWatch(id); - if (errorCallback) { - errorCallback(status); - } - } catch (e) { - console.log("Accelerometer Error in errorCallback: " + e); - } - } - }, (frequency ? frequency : 1)); - - return id; -} - -/** - * Clears the specified accelerometer watch. - * - * @param {String} id The id of the watch returned from #watchAcceleration. - */ -Accelerometer.prototype.clearWatch = function(id) { - - // Stop javascript timer & remove from timer list - if (id && navigator.accelerometer.timers[id]) { - clearInterval(navigator.accelerometer.timers[id]); - delete navigator.accelerometer.timers[id]; - } -} - -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) { - - 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(); -}); -PhoneGap.Channel = function(type) -{ - this.type = type; - this.handlers = {}; - this.guid = 0; - this.fired = false; - this.enabled = true; -}; - -PhoneGap.Channel.prototype.sub = function(f, c, g) -{ - // need a function to call - if (f == null) - return; - - var func = f; - if (typeof c == "object" && f instanceof Function) - func = PhoneGap.close(c, f); - - g = g || func.observer_guid || f.observer_guid || this.guid++; - func.observer_guid = g; - f.observer_guid = g; - this.handlers[g] = func; - return g; -}; - -PhoneGap.Channel.prototype.sob = function(f, c) -{ - var g = null; - var _this = this; - var m = function() { - f.apply(c || null, arguments); - _this.dub(g); - } - if (this.fired) { - if (typeof c == "object" && f instanceof Function) - f = PhoneGap.close(c, f); - f.apply(this, this.fireArgs); - } else { - g = this.sub(m); - } - return g; -}; - -PhoneGap.Channel.prototype.dub = function(g) -{ - if (g instanceof Function) - g = g.observer_guid; - this.handlers[g] = null; - delete this.handlers[g]; -}; - -PhoneGap.Channel.prototype.fire = function(e) -{ - if (this.enabled) - { - var fail = false; - for (var item in this.handlers) { - var handler = this.handlers[item]; - if (handler instanceof Function) { - var rv = (handler.apply(this, arguments)==false); - fail = fail || rv; - } - } - this.fired = true; - this.fireArgs = arguments; - return !fail; - } - return true; -}; - -PhoneGap.Channel.merge = function(h, e) { - var i = e.length; - var f = function() { - if (!(--i)) h(); - } - for (var j=0; j frequency + 10 sec - var timeout = CompassHook.getTimeout(); - if (timeout < (frequency + 10000)) { - CompassHook.setTimeout(frequency + 10000); // set to frequency + 10 sec - } - - var id = PhoneGap.createUUID(); - CompassHook.start(); - - // Start watch timer - navigator.compass.timers[id] = setInterval(function() { - var status = CompassHook.getStatus(); - - // If compass is running - if (status == Compass.RUNNING) { - try { - var heading = CompassHook.getHeading(); - successCallback(heading); - } catch (e) { - console.log("Compass Error in successCallback: " + e); - } - } - - // If compass had error - else if (status != Compass.STARTING) { - console.log("Compass Error: "+ Compass.ERROR_MSG[status]); - try { - navigator.compass.clearWatch(id); - if (errorCallback) { - errorCallback(status); - } - } catch (e) { - console.log("Compass Error in errorCallback: " + e); - } - } - }, (frequency ? frequency : 1)); - - return id; -} - - -/** - * Clears the specified heading watch. - * - * @param {String} id The ID of the watch returned from #watchHeading. - */ -Compass.prototype.clearWatch = function(id) { - - // Stop javascript timer & remove from timer list - if (id && navigator.compass.timers[id]) { - clearInterval(navigator.compass.timers[id]); - delete navigator.compass.timers[id]; - } -} - -PhoneGap.addConstructor(function() { - if (typeof navigator.compass == "undefined") navigator.compass = new Compass(); -}); -var Contact = function(){ - this.name = new ContactName(); - this.emails = []; - this.phones = []; -} - -var ContactName = function() -{ - this.formatted = ""; - this.familyName = ""; - this.givenName = ""; - this.additionalNames = []; - this.prefixes = []; - this.suffixes = []; -} - - -var ContactEmail = function() -{ - this.types = []; - this.address = ""; -} - -var ContactPhoneNumber = function() -{ - this.types = []; - this.number = ""; -} - - -var Contacts = function() -{ - this.records = []; -} - -Contacts.prototype.find = function(obj, win, fail) -{ - if(obj.name != null) - { - // Build up the search term that we'll use in SQL, based on the structure/contents of the contact object passed into find. - var searchTerm = ''; - if (obj.name.givenName && obj.name.givenName.length > 0) { - searchTerm = obj.name.givenName.split(' ').join('%'); - } - if (obj.name.familyName && obj.name.familyName.length > 0) { - searchTerm += obj.name.familyName.split(' ').join('%'); - } - if (!obj.name.familyName && !obj.name.givenName && obj.name.formatted) { - searchTerm = obj.name.formatted; - } - ContactHook.search(searchTerm, "", ""); - } - this.win = win; - this.fail = fail; -} - -Contacts.prototype.droidFoundContact = function(name, npa, email) -{ - var contact = new Contact(); - contact.name = new ContactName(); - contact.name.formatted = name; - contact.name.givenName = name; - var mail = new ContactEmail(); - mail.types.push("home"); - mail.address = email; - contact.emails.push(mail); - phone = new ContactPhoneNumber(); - phone.types.push("home"); - phone.number = npa; - contact.phones.push(phone); - this.records.push(contact); -} - -Contacts.prototype.droidDone = function() -{ - this.win(this.records); -} - -PhoneGap.addConstructor(function() { - if(typeof navigator.contacts == "undefined") navigator.contacts = new Contacts(); -}); -var Crypto = function() -{ -} - -Crypto.prototype.encrypt = function(seed, string, callback) -{ - GapCrypto.encrypt(seed, string); - this.encryptWin = callback; -} - -Crypto.prototype.decrypt = function(seed, string, callback) -{ - GapCrypto.decrypt(seed, string); - this.decryptWin = callback; -} - -Crypto.prototype.gotCryptedString = function(string) -{ - this.encryptWin(string); -} - -Crypto.prototype.getPlainString = function(string) -{ - this.decryptWin(string); -} - -PhoneGap.addConstructor(function() { - if (typeof navigator.Crypto == "undefined") - { - navigator.Crypto = new Crypto(); - } -}); - -/** - * 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(); - this.line1Number = window.DroidGap.getLine1Number(); - this.deviceId = window.DroidGap.getDeviceId(); - this.simSerialNumber = window.DroidGap.getSimSerialNumber(); - this.subscriberId = window.DroidGap.getSubscriberId(); - } - } catch(e) { - this.available = false; - } -} - -/* - * You must explicitly override the back button. - */ - -Device.prototype.overrideBackButton = function() -{ - BackButton.override(); -} - -/* - * This resets the back button to the default behaviour - */ - -Device.prototype.resetBackButton = function() -{ - BackButton.reset(); -} - -/* - * This terminates the activity! - */ -Device.prototype.exitApp = function() -{ - BackButton.exitApp(); -} - -PhoneGap.addConstructor(function() { - navigator.device = window.device = new Device(); -}); - - -PhoneGap.onDeviceReady = new PhoneGap.Channel(); - -PhoneGap.__document_addEventListener = document.addEventListener; - -document.addEventListener = function(evt, handler, capture) { - if (evt.toLowerCase() == 'deviceready') { - PhoneGap.onDeviceReady.sob(handler); - } else { - PhoneGap.__document_addEventListener.call(document, evt, handler); - } -} - -document.addEventListener('DOMContentLoaded', function() { - PhoneGap.onDeviceReady.fire(); -}) - - -PhoneGap.addConstructor(function() { if (typeof navigator.fileMgr == "undefined") navigator.fileMgr = new FileMgr();}); - - -/** - * This class provides iPhone read and write access to the mobile device file system. - * Based loosely on http://www.w3.org/TR/2009/WD-FileAPI-20091117/#dfn-empty - */ -function FileMgr() -{ - this.fileWriters = {}; // empty maps - this.fileReaders = {}; - - this.docsFolderPath = "../../Documents"; - this.tempFolderPath = "../../tmp"; - this.freeDiskSpace = -1; - this.getFileBasePaths(); -} - -// private, called from Native Code -FileMgr.prototype._setPaths = function(docs,temp) -{ - this.docsFolderPath = docs; - this.tempFolderPath = temp; -} - -// private, called from Native Code -FileMgr.prototype._setFreeDiskSpace = function(val) -{ - this.freeDiskSpace = val; -} - - -// FileWriters add/remove -// called internally by writers -FileMgr.prototype.addFileWriter = function(filePath,fileWriter) -{ - this.fileWriters[filePath] = fileWriter; -} - -FileMgr.prototype.removeFileWriter = function(filePath) -{ - this.fileWriters[filePath] = null; -} - -// File readers add/remove -// called internally by readers -FileMgr.prototype.addFileReader = function(filePath,fileReader) -{ - this.fileReaders[filePath] = fileReader; -} - -FileMgr.prototype.removeFileReader = function(filePath) -{ - this.fileReaders[filePath] = null; -} - -/******************************************* - * - * private reader callback delegation - * called from native code - */ -FileMgr.prototype.reader_onloadstart = function(filePath,result) -{ - this.fileReaders[filePath].onloadstart(result); -} - -FileMgr.prototype.reader_onprogress = function(filePath,result) -{ - this.fileReaders[filePath].onprogress(result); -} - -FileMgr.prototype.reader_onload = function(filePath,result) -{ - this.fileReaders[filePath].result = unescape(result); - this.fileReaders[filePath].onload(this.fileReaders[filePath].result); -} - -FileMgr.prototype.reader_onerror = function(filePath,err) -{ - this.fileReaders[filePath].result = err; - this.fileReaders[filePath].onerror(err); -} - -FileMgr.prototype.reader_onloadend = function(filePath,result) -{ - this.fileReaders[filePath].onloadend(result); -} - -/******************************************* - * - * private writer callback delegation - * called from native code -*/ -FileMgr.prototype.writer_onerror = function(filePath,err) -{ - this.fileWriters[filePath].onerror(err); -} - -FileMgr.prototype.writer_oncomplete = function(filePath,result) -{ - this.fileWriters[filePath].oncomplete(result); // result contains bytes written -} - - -FileMgr.prototype.getFileBasePaths = function() -{ - //PhoneGap.exec("File.getFileBasePaths"); -} - -FileMgr.prototype.testFileExists = function(fileName, successCallback, errorCallback) -{ - var test = FileUtil.testFileExists(fileName); - test ? successCallback() : errorCallback(); -} - -FileMgr.prototype.testDirectoryExists = function(dirName, successCallback, errorCallback) -{ - this.successCallback = successCallback; - this.errorCallback = errorCallback; - var test = FileUtil.testDirectoryExists(dirName); - test ? successCallback() : errorCallback(); -} - -FileMgr.prototype.createDirectory = function(dirName, successCallback, errorCallback) -{ - this.successCallback = successCallback; - this.errorCallback = errorCallback; - var test = FileUtil.createDirectory(dirName); - test ? successCallback() : errorCallback(); -} - -FileMgr.prototype.deleteDirectory = function(dirName, successCallback, errorCallback) -{ - this.successCallback = successCallback; - this.errorCallback = errorCallback; - var test = FileUtil.deleteDirectory(dirName); - test ? successCallback() : errorCallback(); -} - -FileMgr.prototype.deleteFile = function(fileName, successCallback, errorCallback) -{ - this.successCallback = successCallback; - this.errorCallback = errorCallback; - FileUtil.deleteFile(fileName); - test ? successCallback() : errorCallback(); -} - -FileMgr.prototype.getFreeDiskSpace = function(successCallback, errorCallback) -{ - if(this.freeDiskSpace > 0) - { - return this.freeDiskSpace; - } - else - { - this.successCallback = successCallback; - this.errorCallback = errorCallback; - this.freeDiskSpace = FileUtil.getFreeDiskSpace(); - (this.freeDiskSpace > 0) ? successCallback() : errorCallback(); - } -} - - -// File Reader - - -function FileReader() -{ - this.fileName = ""; - this.result = null; - this.onloadstart = null; - this.onprogress = null; - this.onload = null; - this.onerror = null; - this.onloadend = null; -} - - -FileReader.prototype.abort = function() -{ - // Not Implemented -} - -FileReader.prototype.readAsText = function(file) -{ - if(this.fileName && this.fileName.length > 0) - { - navigator.fileMgr.removeFileReader(this.fileName,this); - } - this.fileName = file; - navigator.fileMgr.addFileReader(this.fileName,this); - - return FileUtil.read(this.fileName); -} - -// File Writer - -function FileWriter() -{ - this.fileName = ""; - this.result = null; - this.readyState = 0; // EMPTY - this.result = null; - this.onerror = null; - this.oncomplete = null; -} - -FileWriter.prototype.writeAsText = function(file,text,bAppend) -{ - if(this.fileName && this.fileName.length > 0) - { - navigator.fileMgr.removeFileWriter(this.fileName,this); - } - this.fileName = file; - if(bAppend != true) - { - bAppend = false; // for null values - } - navigator.fileMgr.addFileWriter(file,this); - this.readyState = 0; // EMPTY - var call = FileUtil.write(file, text, bAppend); - this.result = null; -} -/** - * This class provides access to device GPS data. - * @constructor - */ -function Geolocation() { - /** - * The last known GPS position. - */ - this.lastPosition = null; - this.lastError = null; - this.listeners = null; -}; - -var geoListeners = []; - -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.lastPosition = loc; - 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; - - var key = geoListeners.push( {"success" : successCallback, "fail" : errorCallback }) - 1; - - // TO-DO: Get the names of the method and pass them as strings to the Java. - return Geo.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); - geoListeners[key].success(loc); -} - -Geolocation.prototype.fail = function(key) -{ - geoListeners[key].fail(); -} - -Geolocation.prototype.clearWatch = function(watchId) -{ - Geo.stop(watchId); -} - -PhoneGap.addConstructor(function() { - // Taken from Jesse's geo fix (similar problem) in PhoneGap iPhone. Go figure, same browser! - function __proxyObj(origObj, proxyObj, funkList) { - for (var v in funkList) { - origObj[funkList[v]] = proxyObj[funkList[v]]; - } - } - // In the case of Android, we can use the Native Geolocation Object if it exists, so only load this on 1.x devices - if (typeof navigator.geolocation == 'undefined') { - navigator.geolocation = new Geolocation(); - } -}); -function KeyEvent() -{ -} - -KeyEvent.prototype.backTrigger = function() -{ - var e = document.createEvent('Events'); - e.initEvent('backKeyDown'); - document.dispatchEvent(e); -} - -if (document.keyEvent == null || typeof document.keyEvent == 'undefined') -{ - window.keyEvent = document.keyEvent = new KeyEvent(); -} -/** - * 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() { - GapAudio.startPlayingAudio(this.src); -} - -Media.prototype.stop = function() { - GapAudio.stopPlayingAudio(); -} - -Media.prototype.startRecord = function() { - GapAudio.startRecordingAudio(this.src); -} - -Media.prototype.stopRecordingAudio = function() { - GapAudio.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; -}; -/** - * 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; -}; -/** - * - * @param {Object} uri - * @param {Function} win - * @param {Object} options (isIpAddress:boolean) - */ -Network.prototype.isReachable = function(uri, win, options) -{ - var status = new NetworkStatus(); - if(NetworkManager.isReachable(uri)) - { - if (NetworkManager.isWifiActive()) { - status.code = NetworkStatus.REACHABLE_VIA_WIFI_NETWORK; - } else { - status.code = NetworkStatus.REACHABLE_VIA_CARRIER_DATA_NETWORK; - } - } else { - status.code = NetworkStatus.NOT_REACHABLE; - } - win(status); -}; -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(); -}); - -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; -/* - * This is purely for the Android 1.5/1.6 HTML 5 Storage - * I was hoping that Android 2.0 would deprecate this, but given the fact that - * most manufacturers ship with Android 1.5 and do not do OTA Updates, this is required - */ - -var DroidDB = function() -{ - this.txQueue = []; -} - -DroidDB.prototype.addResult = function(rawdata, tx_id) -{ - eval("var data = " + rawdata); - var tx = this.txQueue[tx_id]; - tx.resultSet.push(data); -} - -DroidDB.prototype.completeQuery = function(tx_id) -{ - var tx = this.txQueue[tx_id]; - var r = new result(); - r.rows.resultSet = tx.resultSet; - r.rows.length = tx.resultSet.length; - tx.win(r); -} - -DroidDB.prototype.fail = function(reason, tx_id) -{ - var tx = this.txQueue[tx_id]; - tx.fail(reason); -} - -var DatabaseShell = function() -{ - -} - -DatabaseShell.prototype.transaction = function(process) -{ - tx = new Tx(); - process(tx); -} - -var Tx = function() -{ - droiddb.txQueue.push(this); - this.id = droiddb.txQueue.length - 1; - this.resultSet = []; -} - -Tx.prototype.executeSql = function(query, params, win, fail) -{ - droidStorage.executeSql(query, params, this.id); - tx.win = win; - tx.fail = fail; -} - -var result = function() -{ - this.rows = new Rows(); -} - -var Rows = function() -{ - this.resultSet = []; - this.length = 0; -} - -Rows.prototype.item = function(row_id) -{ - return this.resultSet[id]; -} - -var dbSetup = function(name, version, display_name, size) -{ - droidStorage.openDatabase(name, version, display_name, size) - db_object = new DatabaseShell(); - return db_object; -} - -PhoneGap.addConstructor(function() { - if (typeof window.openDatabase == "undefined") - { - navigator.openDatabase = window.openDatabase = dbSetup; - window.droiddb = new DroidDB(); - } -}); - diff --git a/framework/assets/js/phonegap.js.base b/framework/assets/js/phonegap.js.base index cde077e6f..d80adc836 100755 --- a/framework/assets/js/phonegap.js.base +++ b/framework/assets/js/phonegap.js.base @@ -112,7 +112,6 @@ PhoneGap.Channel.join = function(h, c) { if (!i) h(); }; - /** * Boolean flag indicating if the PhoneGap API is available and initialized. */ // TODO: Remove this, it is unused here ... -jm @@ -193,6 +192,20 @@ document.addEventListener = function(evt, handler, capture) { } }; +// Intercept calls to document.addEventListener and watch for deviceready +PhoneGap._document_addEventListener = document.addEventListener; + +document.addEventListener = function(evt, handler, capture) { + if (evt.toLowerCase() == 'deviceready') { + PhoneGap.onDeviceReady.sob(handler); + } else { + PhoneGap._document_addEventListener.call(document, evt, handler); + } +}; + + + + /** * 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 @@ -331,5 +344,4 @@ PhoneGap.close = function(context, func, params) { return func.apply(context, params); } } -}; - +}; \ No newline at end of file diff --git a/framework/src/com/phonegap/DroidGap.java b/framework/src/com/phonegap/DroidGap.java index b31507806..cd9bdb838 100755 --- a/framework/src/com/phonegap/DroidGap.java +++ b/framework/src/com/phonegap/DroidGap.java @@ -134,6 +134,11 @@ public class DroidGap extends Activity { root.addView(appView); + // Try firing the onNativeReady event in JS. If it fails because the JS is + // not loaded yet then just set a flag so that the onNativeReady can be fired + // from the JS side when the JS gets to that code. + appView.loadUrl("javascript:try{PhoneGap.onNativeReady.fire();}catch(e){_nativeReady = true;}"); + setContentView(root); } From 2b2b4f5dd435a9e7710f90e9940a7e55b3cfc69e Mon Sep 17 00:00:00 2001 From: Dave Johnson Date: Wed, 28 Jul 2010 17:26:23 -0700 Subject: [PATCH 03/13] javascript and native side of a URL caching plugin + android plugin framework is complete --- framework/assets/js/cache.js | 18 +++ framework/assets/js/phonegap.js.base | 28 ++++- framework/export-phonegap.jardesc | 17 --- framework/src/com/phonegap/DroidGap.java | 8 +- framework/src/com/phonegap/api/Command.java | 24 ++++ .../src/com/phonegap/api/CommandManager.java | 80 +++++++++++++ .../src/com/phonegap/api/CommandResult.java | 29 +++++ .../src/com/phonegap/api/impl/Cache.java | 110 ++++++++++++++++++ 8 files changed, 290 insertions(+), 24 deletions(-) create mode 100644 framework/assets/js/cache.js delete mode 100644 framework/export-phonegap.jardesc create mode 100644 framework/src/com/phonegap/api/Command.java create mode 100644 framework/src/com/phonegap/api/CommandManager.java create mode 100644 framework/src/com/phonegap/api/CommandResult.java create mode 100644 framework/src/com/phonegap/api/impl/Cache.java diff --git a/framework/assets/js/cache.js b/framework/assets/js/cache.js new file mode 100644 index 000000000..28d55ce2c --- /dev/null +++ b/framework/assets/js/cache.js @@ -0,0 +1,18 @@ +PhoneGap.addPlugin = function(name, obj) { + if ( !window.plugins ) { + window.plugins = {}; + } + + if ( !window.plugins[name] ) { + window.plugins[name] = obj; + } +} + +function Cache() { +} + +Cache.prototype.getCachedPathForURI = function(uri, success, fail) { + PhoneGap.execAsync(success, fail, 'com.phonegap.api.impl.Cache', 'getCachedPathForURI', [uri]); +}; + +PhoneGap.addPlugin('cache', new Cache()); \ No newline at end of file diff --git a/framework/assets/js/phonegap.js.base b/framework/assets/js/phonegap.js.base index d80adc836..0e24a82ae 100755 --- a/framework/assets/js/phonegap.js.base +++ b/framework/assets/js/phonegap.js.base @@ -6,7 +6,7 @@ if (typeof(DeviceInfo) != 'object') * information about the state of PhoneGap. * @class */ -PhoneGap = { +var PhoneGap = { queue: { ready: true, commands: [], @@ -205,6 +205,8 @@ document.addEventListener = function(evt, handler, capture) { +PhoneGap.callbackId = 0; +PhoneGap.callbacks = {}; /** * Execute a PhoneGap command in a queued fashion, to ensure commands do not @@ -213,12 +215,28 @@ document.addEventListener = function(evt, handler, capture) { * @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); +PhoneGap.exec = function(clazz, action, args) { + CommandManager.exec(clazz, action, callbackId, args.join('__PHONEGAP__'), false); }; +PhoneGap.execAsync = function(success, fail, clazz, action, args) { + var callbackId = clazz + PhoneGap.callbackId++; + PhoneGap.callbacks[callbackId] = {success:success, fail:fail}; + CommandManager.exec(clazz, action, callbackId, args.join('__PHONEGAP__'), true); + return callbackId; +}; + +PhoneGap.callbackSuccess = function(callbackId, args) { + PhoneGap.callbacks[callbackId].success.apply(this, JSON.parse(args)); + delete PhoneGap.callbacks[callbackId]; +}; + +PhoneGap.callbackFailure = function(callbackId, args) { + PhoneGap.callbacks[callbackId].fail.apply(this, JSON.parse(args)); + delete PhoneGap.callbacks[callbackId]; +}; + + /** * Internal function used to dispatch the request to PhoneGap. It processes the * command queue and executes the next command on the list. If one of the diff --git a/framework/export-phonegap.jardesc b/framework/export-phonegap.jardesc deleted file mode 100644 index 04227fe4a..000000000 --- a/framework/export-phonegap.jardesc +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/framework/src/com/phonegap/DroidGap.java b/framework/src/com/phonegap/DroidGap.java index cd9bdb838..ce9b76040 100755 --- a/framework/src/com/phonegap/DroidGap.java +++ b/framework/src/com/phonegap/DroidGap.java @@ -25,6 +25,9 @@ package com.phonegap; import java.io.File; +import com.phonegap.api.Command; +import com.phonegap.api.CommandManager; + import android.app.Activity; import android.app.AlertDialog; import android.content.ContentResolver; @@ -73,6 +76,7 @@ public class DroidGap extends Activity { private BrowserKey mKey; private AudioHandler audio; private CallbackServer callbackServer; + private CommandManager commandManager; private Uri imageUri; @@ -231,6 +235,7 @@ public class DroidGap extends Activity { private void bindBrowser(WebView appView) { callbackServer = new CallbackServer(); + commandManager = new CommandManager(appView, this); gap = new Device(appView, this); accel = new AccelListener(appView, this); launcher = new CameraLauncher(appView, this); @@ -243,6 +248,7 @@ public class DroidGap extends Activity { audio = new AudioHandler(appView, this); // This creates the new javascript interfaces for PhoneGap + appView.addJavascriptInterface(commandManager, "CommandManager"); appView.addJavascriptInterface(gap, "DroidGap"); appView.addJavascriptInterface(accel, "Accel"); appView.addJavascriptInterface(launcher, "GapCam"); @@ -263,7 +269,6 @@ public class DroidGap extends Activity { appView.addJavascriptInterface(geo, "Geo"); } } - public void loadUrl(String url) { @@ -288,7 +293,6 @@ public class DroidGap extends Activity { return this.callbackServer.getPort(); } - /** * Provides a hook for calling "alert" from javascript. Useful for * debugging your javascript. diff --git a/framework/src/com/phonegap/api/Command.java b/framework/src/com/phonegap/api/Command.java new file mode 100644 index 000000000..479a3535b --- /dev/null +++ b/framework/src/com/phonegap/api/Command.java @@ -0,0 +1,24 @@ +package com.phonegap.api; + +import android.content.Context; + +public interface Command { + /** + * Executes the request and returns JS code to change client state. + * + * @param action the command to execute + * @return a string with JavaScript code or null + */ + CommandResult execute(String action, String[] args); + + /** + * Determines if this command can process a request. + * + * @param action the command to execute + * + * @return true if this command understands the petition + */ + boolean accept(String action); + + void setContext(Context ctx); +} diff --git a/framework/src/com/phonegap/api/CommandManager.java b/framework/src/com/phonegap/api/CommandManager.java new file mode 100644 index 000000000..58bb146de --- /dev/null +++ b/framework/src/com/phonegap/api/CommandManager.java @@ -0,0 +1,80 @@ +package com.phonegap.api; + +import android.content.Context; +import android.webkit.WebView; + +import com.phonegap.DroidGap; + +/** + * Given a execution request detects matching {@link Command} and executes it. + */ +public final class CommandManager { + private static final String EXCEPTION_PREFIX = "[PhoneGap] *ERROR* Exception executing command ["; + private static final String EXCEPTION_SUFFIX = "]: "; + + private Command[] commands; + + private final Context ctx; + private final WebView app; + + public CommandManager(WebView app, Context ctx) { + this.ctx = ctx; + this.app = app; + } + + /** + * Receives a request for execution and fulfills it as long as one of + * the configured {@link Command} can understand it. Command precedence + * is important (just one of them will be executed). + * + * @param instruction any API command + * @return JS code to execute by the client or null + */ + public String exec(final String clazz, final String action, final String callbackId, + final String args, final boolean async) { + CommandResult cr = null; + try { + //final WebView wv = this.app; + final String _callbackId = callbackId; + final String[] aargs = args.split("__PHONEGAP__"); + Class c = Class.forName(clazz); + Class[] interfaces = c.getInterfaces(); + for (int j=0; j Date: Thu, 29 Jul 2010 11:20:16 -0700 Subject: [PATCH 04/13] check if file exists or not --- framework/src/com/phonegap/api/impl/Cache.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/src/com/phonegap/api/impl/Cache.java b/framework/src/com/phonegap/api/impl/Cache.java index 93e1f9f87..a9d54f4d1 100644 --- a/framework/src/com/phonegap/api/impl/Cache.java +++ b/framework/src/com/phonegap/api/impl/Cache.java @@ -44,8 +44,7 @@ public final class Cache implements Command { String filePath = fileDir + "/" + fileName; File f = new File(filePath); - // f.exists() - if (false) { + if (f.exists()) { result = "{ file: '"+filePath+"', status: 0 }"; } else { From 49de553ee879c3032e58e947b8684daba69f0812 Mon Sep 17 00:00:00 2001 From: Dave Johnson Date: Fri, 30 Jul 2010 12:23:55 -0700 Subject: [PATCH 05/13] refactored the Command stuff a bit more, added a spashscreen --- framework/assets/js/cache.js | 18 --- framework/assets/js/phonegap.js.base | 26 +++- framework/assets/js/splashscreen.js | 5 + framework/build.xml | 42 +++++- framework/gen/com/phonegap/R.java | 4 +- framework/res/drawable/splash.png | Bin 0 -> 2990 bytes framework/res/layout/preview.xml | 23 ---- framework/src/com/phonegap/DroidGap.java | 130 ++++++++++-------- framework/src/com/phonegap/SplashScreen.java | 15 ++ framework/src/com/phonegap/api/Command.java | 43 ++++-- .../src/com/phonegap/api/CommandManager.java | 123 ++++++++++++----- .../src/com/phonegap/api/CommandResult.java | 11 +- .../src/com/phonegap/api/impl/Cache.java | 109 --------------- 13 files changed, 277 insertions(+), 272 deletions(-) delete mode 100644 framework/assets/js/cache.js create mode 100644 framework/assets/js/splashscreen.js create mode 100755 framework/res/drawable/splash.png delete mode 100644 framework/res/layout/preview.xml create mode 100644 framework/src/com/phonegap/SplashScreen.java delete mode 100644 framework/src/com/phonegap/api/impl/Cache.java diff --git a/framework/assets/js/cache.js b/framework/assets/js/cache.js deleted file mode 100644 index 28d55ce2c..000000000 --- a/framework/assets/js/cache.js +++ /dev/null @@ -1,18 +0,0 @@ -PhoneGap.addPlugin = function(name, obj) { - if ( !window.plugins ) { - window.plugins = {}; - } - - if ( !window.plugins[name] ) { - window.plugins[name] = obj; - } -} - -function Cache() { -} - -Cache.prototype.getCachedPathForURI = function(uri, success, fail) { - PhoneGap.execAsync(success, fail, 'com.phonegap.api.impl.Cache', 'getCachedPathForURI', [uri]); -}; - -PhoneGap.addPlugin('cache', new Cache()); \ No newline at end of file diff --git a/framework/assets/js/phonegap.js.base b/framework/assets/js/phonegap.js.base index 0e24a82ae..237a19ee4 100755 --- a/framework/assets/js/phonegap.js.base +++ b/framework/assets/js/phonegap.js.base @@ -136,6 +136,19 @@ PhoneGap.addConstructor = function(func) { }); }; +/** + * Adds a plugin object to window.plugins + */ +PhoneGap.addPlugin = function(name, obj) { + if ( !window.plugins ) { + window.plugins = {}; + } + + if ( !window.plugins[name] ) { + window.plugins[name] = obj; + } +} + /** * onDOMContentLoaded channel is fired when the DOM content * of the page has been parsed. @@ -216,23 +229,22 @@ PhoneGap.callbacks = {}; * @param {String[]} [args] Zero or more arguments to pass to the method */ PhoneGap.exec = function(clazz, action, args) { - CommandManager.exec(clazz, action, callbackId, args.join('__PHONEGAP__'), false); + CommandManager.exec(clazz, action, callbackId, JSON.stringify(args), false); }; PhoneGap.execAsync = function(success, fail, clazz, action, args) { var callbackId = clazz + PhoneGap.callbackId++; PhoneGap.callbacks[callbackId] = {success:success, fail:fail}; - CommandManager.exec(clazz, action, callbackId, args.join('__PHONEGAP__'), true); - return callbackId; + return CommandManager.exec(clazz, action, callbackId, JSON.stringify(args), true); }; PhoneGap.callbackSuccess = function(callbackId, args) { - PhoneGap.callbacks[callbackId].success.apply(this, JSON.parse(args)); + PhoneGap.callbacks[callbackId].success(args); delete PhoneGap.callbacks[callbackId]; }; -PhoneGap.callbackFailure = function(callbackId, args) { - PhoneGap.callbacks[callbackId].fail.apply(this, JSON.parse(args)); +PhoneGap.callbackError = function(callbackId, args) { + PhoneGap.callbacks[callbackId].fail(args); delete PhoneGap.callbacks[callbackId]; }; @@ -353,7 +365,7 @@ PhoneGap.UUIDcreatePart = function(length) { }; PhoneGap.close = function(context, func, params) { - if (null == params) { + if (typeof params === 'undefined') { return function() { return func.apply(context, arguments); } diff --git a/framework/assets/js/splashscreen.js b/framework/assets/js/splashscreen.js new file mode 100644 index 000000000..cf27f7655 --- /dev/null +++ b/framework/assets/js/splashscreen.js @@ -0,0 +1,5 @@ +PhoneGap.addConstructor(function() { + if (typeof navigator.splashScreen == "undefined") { + navigator.splashScreen = SplashScreen; // SplashScreen object come from native side through addJavaScriptInterface + } +}); \ No newline at end of file diff --git a/framework/build.xml b/framework/build.xml index ce0af6a5d..285c1908b 100644 --- a/framework/build.xml +++ b/framework/build.xml @@ -64,21 +64,53 @@ --> - - + + + + var alert=function(){},device={},Element={},debug={}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/framework/gen/com/phonegap/R.java b/framework/gen/com/phonegap/R.java index 81a218106..7db0ceb34 100644 --- a/framework/gen/com/phonegap/R.java +++ b/framework/gen/com/phonegap/R.java @@ -12,15 +12,13 @@ public final class R { } public static final class drawable { public static final int icon=0x7f020000; + public static final int splash=0x7f020001; } public static final class id { 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 string { public static final int app_name=0x7f040000; diff --git a/framework/res/drawable/splash.png b/framework/res/drawable/splash.png new file mode 100755 index 0000000000000000000000000000000000000000..aa3cbc51fdc5316e3dc5c517c64ced4f1f4c7d61 GIT binary patch literal 2990 zcmeH}e>4+%AIA-kQH@(9az*u&bfrS*ZY)w#B4bp3EZL7z?E3vHquiTZ7x^*LHcs^* z8xu3b%(mMPGVIDDuC-ZpO@546eyo{2I-NQ_=iGbF({r9bpFiH`d(QW~&-?TFd_RAD zUsCgQ=+j4y{V8t-g8_IK5qe^)QY-ayr%*i;hhQjYg@tAhG9B z<{lBD7!(W@icE@nih`)Atv%)8=Hiz)JS7x*35L|KzclQF?Xq))!|!Z)w^B!O)rQ}{ zTXa(8x4<})V#Pn(^!mqB^p{DxM{RF9=FU!zvXNyXk;oaa;srJYXd8XA&-~m69pa>? zyQ~TT$XJzzx|Zg;5BgyEGt;W!zcwA>d|B>ulD5&8<-W@Fx#^EReM<8Et$$E}VB=EdbE6%3X7Vxi^=l;3Vl zL1R)Yh|4S4D_H9zjo<1$4y|`|cJ9@ez2jH|CgWL-QD|Tr>G`oFd@ozHa@VpK4JXv9Xnz*9BW%RF@sGA9fOm5+|ZR%M8@8tiaz!d5!jZpNbL^a ziH~X*cp`m@C>iRa1*e-NQVkGZ9|piwbgzWY3uY1;4AFmF9PG1D5ltxmZ^DasP~SP? zM(h5AP-vZ2V}VO)rx;Jr9MP>3c9&cxI|?$gA?UZDCND3qO0%0~G*7J(*&ukd^B@*8 z&XtM1Qd)BH5kaDV#+%{5Yn=j~Hx=3Lcf=eB4|rd56obKp%`aqjWP@WQq307CS!W4A zjF#49Z9}!h7QA*K%*G#!^pMaiOOR>Bm3bE$5(UYW9AUhfzE0v#8oyQmqb(n(ZrSv9 zr)AaT_E(@#!QbnZy0UX>xF;OUf+v*JVGdfCeFA~n)`AyB|31-^)FMxi=q$~c1PIvE z;!qK>f8VHM4C?@0Fi0}mkFFe&Y9qsK%V9h6Q83mB3A~69E4L4n()@(6tY?USKrWB# z-Ut)36N5}4ySJoVQJK@6o*Im_r%vJo)KKF`hS^6B?&e`>_Kd-cHa*di=w8UWEia0b zcJj)}32I)R?Av{8EA8QxVwLj@*b z7hZ!LDdPhJ1LEr2^;LdV)eRDQ;Npe|6MiA{y9%YCmL?g6E-oyPueK6>O$CTr$=3ev zShDn(aU3PvA!+F8Q;)PAz20;0+D5(&UnnoTH?r_U!ucgr@Zsl?vBOtcL}00F3<>xstKCxCl&hPSmxh@Wicz+QW2p)DDy72X2+6 zS$?l!Pl()fz3Fwmhrz>`ZA#U*io{d#K${-izEb%~QeC*-X>$3urlvy7wG1rTY9jpJ zbE&aTA^{b#g;{KC6rZw@yqv;p^&|qiiYVzFxQznXXhxxM%Hv|KE3vK zCt1OfdNAKXVzvbY1Y|(@24ovr#GZ1UNo){$dKwMWcen`O+gO`&S{?U|)RL0rQr#+& zAs-jQZ5_5rSv~#3d<}dGPx69y&>rVMV;AGtjImQqkJeWVi>w=J%V*;^Ou8WBs;#9( zdh6&V*Jx{+E(wlWKSXbThG6rmWCDV*P1rz$-Z=RR@k0IS#!X?-n&8>><>NE$1lvZ* zxXjxzI3xt^!%%FN2HWWe0Dj@vWyfKvoW$Ma()Beaq^{r~sq&ff9#?U}0v1Arwu5kZ z1Vio!fm}Y^vpi<0!(_*G8rW3#_xI!50hIR}8s@khJkX^f@ZE$%&3HoyjN1K!WD$l(Da2ZyK;$nW6~Pt5o{rT!Rp&OhXg zB0=8kN9t{x85;0;qL(2uU=EfL1VK7Wwg8k z5eoO9NHcg_XOEj)Ys=^E9W{Dkfn}HvSf&COuFYu=bET@aDaU zu0hgPY$3C`*@*CPE~|5La&n~)hihgq7~G6}=ySsre$SA9*vN7DeQ)~dJs*JN^Ot>= zs*$n&|E%&QhJ5ilf5j@$z+H0-+}W0RR91 literal 0 HcmV?d00001 diff --git a/framework/res/layout/preview.xml b/framework/res/layout/preview.xml deleted file mode 100644 index f7fe83aa7..000000000 --- a/framework/res/layout/preview.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - -