mirror of
https://github.com/apache/cordova-android.git
synced 2025-04-22 16:50:45 +08:00
added onNativeReady and onDOMContentLoaded events
This commit is contained in:
parent
ca01781766
commit
8e5de2cb7b
@ -11,251 +11,13 @@ PhoneGap = {
|
|||||||
ready: true,
|
ready: true,
|
||||||
commands: [],
|
commands: [],
|
||||||
timer: null
|
timer: null
|
||||||
},
|
|
||||||
_constructors: []
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Boolean flag indicating if the PhoneGap API is available and initialized.
|
|
||||||
*/ // TODO: Remove this, it is unused here ... -jm
|
|
||||||
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' )
|
|
||||||
{
|
|
||||||
func();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PhoneGap._constructors.push(func);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
// run our constructors list
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// all constructors run, now fire the deviceready event
|
|
||||||
var e = document.createEvent('Events');
|
|
||||||
e.initEvent('deviceready');
|
|
||||||
document.dispatchEvent(e);
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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. It processes the
|
|
||||||
* command queue and executes the next command on the list. If one of the
|
|
||||||
* arguments is a JavaScript object, it will be passed on the QueryString of the
|
|
||||||
* url, which will be turned into a dictionary on the other end.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
PhoneGap.run_command = function() {
|
|
||||||
if (!PhoneGap.available || !PhoneGap.queue.ready)
|
|
||||||
return;
|
|
||||||
|
|
||||||
PhoneGap.queue.ready = false;
|
|
||||||
|
|
||||||
var args = PhoneGap.queue.commands.shift();
|
|
||||||
if (PhoneGap.queue.commands.length == 0) {
|
|
||||||
clearInterval(PhoneGap.queue.timer);
|
|
||||||
PhoneGap.queue.timer = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var uri = [];
|
|
||||||
var dict = null;
|
|
||||||
for (var i = 1; i < args.length; i++) {
|
|
||||||
var arg = args[i];
|
|
||||||
if (arg == undefined || arg == null)
|
|
||||||
arg = '';
|
|
||||||
if (typeof(arg) == 'object')
|
|
||||||
dict = arg;
|
|
||||||
else
|
|
||||||
uri.push(encodeURIComponent(arg));
|
|
||||||
}
|
|
||||||
var url = "gap://" + args[0] + "/" + uri.join("/");
|
|
||||||
if (dict != null) {
|
|
||||||
var query_args = [];
|
|
||||||
for (var name in dict) {
|
|
||||||
if (typeof(name) != 'string')
|
|
||||||
continue;
|
|
||||||
query_args.push(encodeURIComponent(name) + "=" + encodeURIComponent(dict[name]));
|
|
||||||
}
|
|
||||||
if (query_args.length > 0)
|
|
||||||
url += "?" + query_args.join("&");
|
|
||||||
}
|
|
||||||
document.location = url;
|
|
||||||
|
|
||||||
};
|
|
||||||
function Acceleration(x, y, z)
|
|
||||||
{
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.z = z;
|
|
||||||
this.timestamp = new Date().getTime();
|
|
||||||
this.win = null;
|
|
||||||
this.fail = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var accelListeners = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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") {
|
|
||||||
if(this.lastAcceleration)
|
|
||||||
successCallback(accel);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
watchAcceleration(this.gotCurrentAcceleration, this.fail);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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.
|
|
||||||
* @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;
|
|
||||||
var accel = Acceleration(0,0,0);
|
|
||||||
accel.win = successCallback;
|
|
||||||
accel.fail = errorCallback;
|
|
||||||
accel.opts = options;
|
|
||||||
var key = accelListeners.push( accel ) - 1;
|
|
||||||
Accel.start(frequency, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears the specified accelerometer watch.
|
|
||||||
* @param {String} watchId The ID of the watch returned from #watchAcceleration.
|
|
||||||
*/
|
|
||||||
Accelerometer.prototype.clearWatch = function(watchId) {
|
|
||||||
Accel.stop(watchId);
|
|
||||||
}
|
|
||||||
|
|
||||||
Accelerometer.prototype.epicFail = function(watchId, message) {
|
|
||||||
accelWatcher[key].fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
PhoneGap.Channel = function(type)
|
||||||
{
|
{
|
||||||
this.type = type;
|
this.type = type;
|
||||||
@ -336,7 +98,279 @@ PhoneGap.Channel.merge = function(h, e) {
|
|||||||
(!e[j].fired?e[j].sob(f):i--);
|
(!e[j].fired?e[j].sob(f):i--);
|
||||||
}
|
}
|
||||||
if (!i) h();
|
if (!i) h();
|
||||||
}/**
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Boolean flag indicating if the PhoneGap API is available and initialized.
|
||||||
|
*/ // TODO: Remove this, it is unused here ... -jm
|
||||||
|
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) {
|
||||||
|
PhoneGap.onDeviceReady.sob(function() {
|
||||||
|
try {
|
||||||
|
func();
|
||||||
|
} catch(e) {
|
||||||
|
if (typeof(debug['log']) == 'function') {
|
||||||
|
debug.log("Failed to run constructor: " + debug.processMessage(e));
|
||||||
|
} else {
|
||||||
|
alert("Failed to run constructor: " + e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
PhoneGap.onDOMContentLoaded = new PhoneGap.Channel();
|
||||||
|
PhoneGap.onNativeReady = new PhoneGap.Channel();
|
||||||
|
|
||||||
|
if (_nativeReady) PhoneGap.onNativeReady.fire();
|
||||||
|
|
||||||
|
PhoneGap.onDeviceReady = new PhoneGap.Channel();
|
||||||
|
|
||||||
|
PhoneGap.Channel.merge(function() {
|
||||||
|
PhoneGap.onDeviceReady.fire();
|
||||||
|
}, [ PhoneGap.onDOMContentLoaded, PhoneGap.onNativeReady ]);
|
||||||
|
|
||||||
|
|
||||||
|
// Listen for DOMContentLoaded
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
PhoneGap.onDOMContentLoaded.fire();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// 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
|
||||||
|
* 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. It processes the
|
||||||
|
* command queue and executes the next command on the list. If one of the
|
||||||
|
* arguments is a JavaScript object, it will be passed on the QueryString of the
|
||||||
|
* url, which will be turned into a dictionary on the other end.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
PhoneGap.run_command = function() {
|
||||||
|
if (!PhoneGap.available || !PhoneGap.queue.ready)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PhoneGap.queue.ready = false;
|
||||||
|
|
||||||
|
var args = PhoneGap.queue.commands.shift();
|
||||||
|
if (PhoneGap.queue.commands.length == 0) {
|
||||||
|
clearInterval(PhoneGap.queue.timer);
|
||||||
|
PhoneGap.queue.timer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var uri = [];
|
||||||
|
var dict = null;
|
||||||
|
for (var i = 1; i < args.length; i++) {
|
||||||
|
var arg = args[i];
|
||||||
|
if (arg == undefined || arg == null)
|
||||||
|
arg = '';
|
||||||
|
if (typeof(arg) == 'object')
|
||||||
|
dict = arg;
|
||||||
|
else
|
||||||
|
uri.push(encodeURIComponent(arg));
|
||||||
|
}
|
||||||
|
var url = "gap://" + args[0] + "/" + uri.join("/");
|
||||||
|
if (dict != null) {
|
||||||
|
var query_args = [];
|
||||||
|
for (var name in dict) {
|
||||||
|
if (typeof(name) != 'string')
|
||||||
|
continue;
|
||||||
|
query_args.push(encodeURIComponent(name) + "=" + encodeURIComponent(dict[name]));
|
||||||
|
}
|
||||||
|
if (query_args.length > 0)
|
||||||
|
url += "?" + query_args.join("&");
|
||||||
|
}
|
||||||
|
document.location = url;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
PhoneGap.close = function(context, func, params) {
|
||||||
|
if (null == params) {
|
||||||
|
return function() {
|
||||||
|
return func.apply(context, arguments);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return function() {
|
||||||
|
return func.apply(context, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Acceleration(x, y, z)
|
||||||
|
{
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
this.timestamp = new Date().getTime();
|
||||||
|
this.win = null;
|
||||||
|
this.fail = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var accelListeners = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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") {
|
||||||
|
if(this.lastAcceleration)
|
||||||
|
successCallback(accel);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
watchAcceleration(this.gotCurrentAcceleration, this.fail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
||||||
|
* @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;
|
||||||
|
var accel = new Acceleration(0,0,0);
|
||||||
|
accel.win = successCallback;
|
||||||
|
accel.fail = errorCallback;
|
||||||
|
accel.opts = options;
|
||||||
|
var key = accelListeners.push( accel ) - 1;
|
||||||
|
Accel.start(frequency, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the specified accelerometer watch.
|
||||||
|
* @param {String} watchId The ID of the watch returned from #watchAcceleration.
|
||||||
|
*/
|
||||||
|
Accelerometer.prototype.clearWatch = function(watchId) {
|
||||||
|
Accel.stop(watchId);
|
||||||
|
}
|
||||||
|
|
||||||
|
Accelerometer.prototype.epicFail = function(watchId, message) {
|
||||||
|
accelWatcher[key].fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
});
|
||||||
|
/**
|
||||||
* This class provides access to device Compass data.
|
* This class provides access to device Compass data.
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
@ -607,23 +641,6 @@ PhoneGap.addConstructor(function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
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();});
|
PhoneGap.addConstructor(function() { if (typeof navigator.fileMgr == "undefined") navigator.fileMgr = new FileMgr();});
|
||||||
|
|
||||||
|
|
||||||
@ -929,14 +946,12 @@ PhoneGap.addConstructor(function() {
|
|||||||
origObj[funkList[v]] = proxyObj[funkList[v]];
|
origObj[funkList[v]] = proxyObj[funkList[v]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// In case a native geolocation object exists, proxy the native one over to a diff object so that we can overwrite the native implementation.
|
// 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') {
|
if (typeof navigator.geolocation == 'undefined') {
|
||||||
navigator._geo = new Geolocation();
|
|
||||||
__proxyObj(navigator.geolocation, navigator._geo, ["setLocation", "getCurrentPosition", "watchPosition", "clearWatch", "setError", "start", "stop", "gotCurrentPosition"]);
|
|
||||||
} else {
|
|
||||||
navigator.geolocation = new Geolocation();
|
navigator.geolocation = new Geolocation();
|
||||||
}
|
}
|
||||||
});function KeyEvent()
|
});
|
||||||
|
function KeyEvent()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,20 +57,3 @@ Device.prototype.exitApp = function()
|
|||||||
PhoneGap.addConstructor(function() {
|
PhoneGap.addConstructor(function() {
|
||||||
navigator.device = window.device = new Device();
|
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();
|
|
||||||
})
|
|
@ -11,10 +11,98 @@ PhoneGap = {
|
|||||||
ready: true,
|
ready: true,
|
||||||
commands: [],
|
commands: [],
|
||||||
timer: null
|
timer: null
|
||||||
},
|
}
|
||||||
_constructors: []
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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<i; j++) {
|
||||||
|
(!e[j].fired?e[j].sob(f):i--);
|
||||||
|
}
|
||||||
|
if (!i) h();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Boolean flag indicating if the PhoneGap API is available and initialized.
|
* Boolean flag indicating if the PhoneGap API is available and initialized.
|
||||||
*/ // TODO: Remove this, it is unused here ... -jm
|
*/ // TODO: Remove this, it is unused here ... -jm
|
||||||
@ -26,23 +114,9 @@ PhoneGap.available = DeviceInfo.uuid != undefined;
|
|||||||
* @param {Function} func The function callback you want run once PhoneGap is initialized
|
* @param {Function} func The function callback you want run once PhoneGap is initialized
|
||||||
*/
|
*/
|
||||||
PhoneGap.addConstructor = function(func) {
|
PhoneGap.addConstructor = function(func) {
|
||||||
var state = document.readyState;
|
PhoneGap.onDeviceReady.sob(function() {
|
||||||
if ( state == 'loaded' || state == 'complete' )
|
|
||||||
{
|
|
||||||
func();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PhoneGap._constructors.push(func);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
// run our constructors list
|
|
||||||
while (PhoneGap._constructors.length > 0) {
|
|
||||||
var constructor = PhoneGap._constructors.shift();
|
|
||||||
try {
|
try {
|
||||||
constructor();
|
func();
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
if (typeof(debug['log']) == 'function') {
|
if (typeof(debug['log']) == 'function') {
|
||||||
debug.log("Failed to run constructor: " + debug.processMessage(e));
|
debug.log("Failed to run constructor: " + debug.processMessage(e));
|
||||||
@ -50,9 +124,41 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
alert("Failed to run constructor: " + e.message);
|
alert("Failed to run constructor: " + e.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
PhoneGap.onDOMContentLoaded = new PhoneGap.Channel();
|
||||||
|
PhoneGap.onNativeReady = new PhoneGap.Channel();
|
||||||
|
|
||||||
|
if (_nativeReady) PhoneGap.onNativeReady.fire();
|
||||||
|
|
||||||
|
PhoneGap.onDeviceReady = new PhoneGap.Channel();
|
||||||
|
|
||||||
|
PhoneGap.Channel.merge(function() {
|
||||||
|
PhoneGap.onDeviceReady.fire();
|
||||||
|
}, [ PhoneGap.onDOMContentLoaded, PhoneGap.onNativeReady ]);
|
||||||
|
|
||||||
|
|
||||||
|
// Listen for DOMContentLoaded
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
PhoneGap.onDOMContentLoaded.fire();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// 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 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
|
* execute with any race conditions, and only run when PhoneGap is ready to
|
||||||
@ -181,3 +287,14 @@ PhoneGap.UUIDcreatePart = function(length) {
|
|||||||
return uuidpart;
|
return uuidpart;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PhoneGap.close = function(context, func, params) {
|
||||||
|
if (null == params) {
|
||||||
|
return function() {
|
||||||
|
return func.apply(context, arguments);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return function() {
|
||||||
|
return func.apply(context, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -132,6 +132,11 @@ public class DroidGap extends Activity {
|
|||||||
|
|
||||||
root.addView(appView);
|
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);
|
setContentView(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user