mirror of
https://github.com/apache/cordova-android.git
synced 2025-05-14 07:10:40 +08:00
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
This commit is contained in:
parent
27c4de6aa0
commit
f7a4a0aef8
1
droidgap
1
droidgap
@ -7,6 +7,7 @@ class Build
|
|||||||
|
|
||||||
def initialize(*a)
|
def initialize(*a)
|
||||||
@android_sdk_path, @name, @pkg, @www, @path = 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__))
|
@android_dir = File.expand_path(File.dirname(__FILE__))
|
||||||
@framework_dir = File.join(@android_dir, "framework")
|
@framework_dir = File.join(@android_dir, "framework")
|
||||||
end
|
end
|
||||||
|
@ -12,8 +12,6 @@
|
|||||||
document.getElementById("platform").innerHTML = device.platform;
|
document.getElementById("platform").innerHTML = device.platform;
|
||||||
document.getElementById("version").innerHTML = device.version;
|
document.getElementById("version").innerHTML = device.version;
|
||||||
document.getElementById("uuid").innerHTML = device.uuid;
|
document.getElementById("uuid").innerHTML = device.uuid;
|
||||||
console.log("Height:" + window.innerHeight);
|
|
||||||
console.log("Width:" + window.innerWidth);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var getLocation = function() {
|
var getLocation = function() {
|
||||||
@ -114,9 +112,7 @@
|
|||||||
function init(){
|
function init(){
|
||||||
document.addEventListener("touchmove", preventBehavior, false);
|
document.addEventListener("touchmove", preventBehavior, false);
|
||||||
document.addEventListener("deviceready", deviceInfo, true);
|
document.addEventListener("deviceready", deviceInfo, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
@ -37,44 +37,25 @@ PhoneGap.addConstructor = function(func) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
(function()
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
{
|
// run our constructors list
|
||||||
var timer = setInterval(function()
|
while (PhoneGap._constructors.length > 0) {
|
||||||
{
|
var constructor = PhoneGap._constructors.shift();
|
||||||
|
try {
|
||||||
var state = document.readyState;
|
constructor();
|
||||||
|
} catch(e) {
|
||||||
if ( state == 'loaded' || state == 'complete' )
|
if (typeof(debug['log']) == 'function') {
|
||||||
{
|
debug.log("Failed to run constructor: " + debug.processMessage(e));
|
||||||
clearInterval(timer); // stop looking
|
} else {
|
||||||
// run our constructors list
|
alert("Failed to run constructor: " + e.message);
|
||||||
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');
|
// all constructors run, now fire the deviceready event
|
||||||
document.dispatchEvent(e);
|
var e = document.createEvent('Events');
|
||||||
}
|
e.initEvent('deviceready');
|
||||||
}, 5);
|
document.dispatchEvent(e);
|
||||||
})();
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@ -139,20 +120,11 @@ function Acceleration(x, y, z)
|
|||||||
this.y = y;
|
this.y = y;
|
||||||
this.z = z;
|
this.z = z;
|
||||||
this.timestamp = new Date().getTime();
|
this.timestamp = new Date().getTime();
|
||||||
|
this.win = null;
|
||||||
|
this.fail = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need to define these for android
|
var accelListeners = [];
|
||||||
_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.
|
* This class provides access to device accelerometer data.
|
||||||
@ -180,12 +152,33 @@ Accelerometer.prototype.getCurrentAcceleration = function(successCallback, error
|
|||||||
|
|
||||||
// Created for iPhone, Iphone passes back _accel obj litteral
|
// Created for iPhone, Iphone passes back _accel obj litteral
|
||||||
if (typeof successCallback == "function") {
|
if (typeof successCallback == "function") {
|
||||||
var accel = new Acceleration(_accel.x,_accel.y,_accel.z);
|
if(this.lastAcceleration)
|
||||||
Accelerometer.lastAcceleration = accel;
|
successCallback(accel);
|
||||||
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.
|
* Asynchronously aquires the acceleration repeatedly at a given interval.
|
||||||
* @param {Function} successCallback The function to call each time the acceleration
|
* @param {Function} successCallback The function to call each time the acceleration
|
||||||
@ -198,12 +191,13 @@ Accelerometer.prototype.getCurrentAcceleration = function(successCallback, error
|
|||||||
|
|
||||||
Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) {
|
Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) {
|
||||||
// TODO: add the interval id to a list so we can clear all watches
|
// TODO: add the interval id to a list so we can clear all watches
|
||||||
var frequency = (options != undefined)? options.frequency : 10000;
|
var frequency = (options != undefined)? options.frequency : 10000;
|
||||||
|
var accel = Acceleration(0,0,0);
|
||||||
Accel.start(frequency);
|
accel.win = successCallback;
|
||||||
return setInterval(function() {
|
accel.fail = errorCallback;
|
||||||
navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options);
|
accel.opts = options;
|
||||||
}, frequency);
|
var key = accelListeners.push( accel ) - 1;
|
||||||
|
Accel.start(frequency, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -211,8 +205,11 @@ Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallb
|
|||||||
* @param {String} watchId The ID of the watch returned from #watchAcceleration.
|
* @param {String} watchId The ID of the watch returned from #watchAcceleration.
|
||||||
*/
|
*/
|
||||||
Accelerometer.prototype.clearWatch = function(watchId) {
|
Accelerometer.prototype.clearWatch = function(watchId) {
|
||||||
Accel.stop();
|
Accel.stop(watchId);
|
||||||
clearInterval(watchId);
|
}
|
||||||
|
|
||||||
|
Accelerometer.prototype.epicFail = function(watchId, message) {
|
||||||
|
accelWatcher[key].fail();
|
||||||
}
|
}
|
||||||
|
|
||||||
PhoneGap.addConstructor(function() {
|
PhoneGap.addConstructor(function() {
|
||||||
@ -259,7 +256,87 @@ Camera.prototype.fail = function(err)
|
|||||||
PhoneGap.addConstructor(function() {
|
PhoneGap.addConstructor(function() {
|
||||||
if (typeof navigator.camera == "undefined") navigator.camera = new Camera();
|
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<i; j++) {
|
||||||
|
(!e[j].fired?e[j].sob(f):i--);
|
||||||
|
}
|
||||||
|
if (!i) h();
|
||||||
|
}/**
|
||||||
* This class provides access to device Compass data.
|
* This class provides access to device Compass data.
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
@ -286,7 +363,7 @@ function Compass() {
|
|||||||
*/
|
*/
|
||||||
Compass.prototype.getCurrentHeading = function(successCallback, errorCallback, options) {
|
Compass.prototype.getCurrentHeading = function(successCallback, errorCallback, options) {
|
||||||
if (this.lastHeading == null) {
|
if (this.lastHeading == null) {
|
||||||
this.start(options);
|
CompassHook.start();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (typeof successCallback == "function") {
|
if (typeof successCallback == "function") {
|
||||||
@ -488,18 +565,64 @@ function Device() {
|
|||||||
this.version = window.DroidGap.getOSVersion();
|
this.version = window.DroidGap.getOSVersion();
|
||||||
this.gapVersion = window.DroidGap.getVersion();
|
this.gapVersion = window.DroidGap.getVersion();
|
||||||
this.platform = window.DroidGap.getPlatform();
|
this.platform = window.DroidGap.getPlatform();
|
||||||
this.name = window.DroidGap.getProductName();
|
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) {
|
} catch(e) {
|
||||||
this.available = false;
|
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() {
|
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();
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
PhoneGap.addConstructor(function() { if (typeof navigator.fileMgr == "undefined") navigator.fileMgr = new FileMgr();});
|
PhoneGap.addConstructor(function() { if (typeof navigator.fileMgr == "undefined") navigator.fileMgr = new FileMgr();});
|
||||||
|
|
||||||
@ -628,7 +751,7 @@ FileMgr.prototype.createDirectory = function(dirName, successCallback, errorCall
|
|||||||
{
|
{
|
||||||
this.successCallback = successCallback;
|
this.successCallback = successCallback;
|
||||||
this.errorCallback = errorCallback;
|
this.errorCallback = errorCallback;
|
||||||
var test = FileUtils.createDirectory(dirName);
|
var test = FileUtil.createDirectory(dirName);
|
||||||
test ? successCallback() : errorCallback();
|
test ? successCallback() : errorCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,7 +759,7 @@ FileMgr.prototype.deleteDirectory = function(dirName, successCallback, errorCall
|
|||||||
{
|
{
|
||||||
this.successCallback = successCallback;
|
this.successCallback = successCallback;
|
||||||
this.errorCallback = errorCallback;
|
this.errorCallback = errorCallback;
|
||||||
var test = FileUtils.deleteDirectory(dirName);
|
var test = FileUtil.deleteDirectory(dirName);
|
||||||
test ? successCallback() : errorCallback();
|
test ? successCallback() : errorCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -644,7 +767,7 @@ FileMgr.prototype.deleteFile = function(fileName, successCallback, errorCallback
|
|||||||
{
|
{
|
||||||
this.successCallback = successCallback;
|
this.successCallback = successCallback;
|
||||||
this.errorCallback = errorCallback;
|
this.errorCallback = errorCallback;
|
||||||
FileUtils.deleteFile(fileName);
|
FileUtil.deleteFile(fileName);
|
||||||
test ? successCallback() : errorCallback();
|
test ? successCallback() : errorCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -658,7 +781,7 @@ FileMgr.prototype.getFreeDiskSpace = function(successCallback, errorCallback)
|
|||||||
{
|
{
|
||||||
this.successCallback = successCallback;
|
this.successCallback = successCallback;
|
||||||
this.errorCallback = errorCallback;
|
this.errorCallback = errorCallback;
|
||||||
this.freeDiskSpace = FileUtils.getFreeDiskSpace();
|
this.freeDiskSpace = FileUtil.getFreeDiskSpace();
|
||||||
(this.freeDiskSpace > 0) ? successCallback() : errorCallback();
|
(this.freeDiskSpace > 0) ? successCallback() : errorCallback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -799,33 +922,28 @@ Geolocation.prototype.clearWatch = function(watchId)
|
|||||||
Geo.stop(watchId);
|
Geo.stop(watchId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PhoneGap.addConstructor(function() {
|
PhoneGap.addConstructor(function() {
|
||||||
navigator._geo = new Geolocation();
|
// Taken from Jesse's geo fix (similar problem) in PhoneGap iPhone. Go figure, same browser!
|
||||||
__proxyObj(navigator.geolocation, navigator._geo,
|
function __proxyObj(origObj, proxyObj, funkList) {
|
||||||
["setLocation", "getCurrentPosition", "watchPosition",
|
for (var v in funkList) {
|
||||||
"clearWatch", "setError", "start", "stop", "gotCurrentPosition"]
|
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.
|
||||||
|
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();
|
||||||
|
}
|
||||||
});function KeyEvent()
|
});function KeyEvent()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyEvent.prototype.menuTrigger = function()
|
KeyEvent.prototype.backTrigger = function()
|
||||||
{
|
{
|
||||||
var e = document.createEvent('Events');
|
var e = document.createEvent('Events');
|
||||||
e.initEvent('menuKeyDown');
|
e.initEvent('backKeyDown');
|
||||||
document.dispatchEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeyEvent.prototype.searchTrigger= function()
|
|
||||||
{
|
|
||||||
var e = document.createEvent('Events');
|
|
||||||
e.initEvent('searchKeyDown');
|
|
||||||
document.dispatchEvent(e);
|
document.dispatchEvent(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -879,19 +997,19 @@ MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Media.prototype.play = function() {
|
Media.prototype.play = function() {
|
||||||
DroidGap.startPlayingAudio(this.src);
|
GapAudio.startPlayingAudio(this.src);
|
||||||
}
|
}
|
||||||
|
|
||||||
Media.prototype.stop = function() {
|
Media.prototype.stop = function() {
|
||||||
DroidGap.stopPlayingAudio();
|
GapAudio.stopPlayingAudio();
|
||||||
}
|
}
|
||||||
|
|
||||||
Media.prototype.startRecord = function() {
|
Media.prototype.startRecord = function() {
|
||||||
DroidGap.startRecordingAudio(this.src);
|
GapAudio.startRecordingAudio(this.src);
|
||||||
}
|
}
|
||||||
|
|
||||||
Media.prototype.stopRecordingAudio = function() {
|
Media.prototype.stopRecordingAudio = function() {
|
||||||
DroidGap.stopRecordingAudio();
|
GapAudio.stopRecordingAudio();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1179,10 +1297,10 @@ var dbSetup = function(name, version, display_name, size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PhoneGap.addConstructor(function() {
|
PhoneGap.addConstructor(function() {
|
||||||
if (typeof navigator.openDatabase == "undefined")
|
if (typeof window.openDatabase == "undefined")
|
||||||
{
|
{
|
||||||
navigator.openDatabase = window.openDatabase = dbSetup;
|
navigator.openDatabase = window.openDatabase = dbSetup;
|
||||||
window.droiddb = new DroidDB();
|
window.droiddb = new DroidDB();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
81
framework/assets/js/channel.js
Normal file
81
framework/assets/js/channel.js
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
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();
|
||||||
|
}
|
@ -57,3 +57,20 @@ 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();
|
||||||
|
})
|
@ -37,52 +37,21 @@ PhoneGap.addConstructor = function(func) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
(function()
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
{
|
// run our constructors list
|
||||||
var timer = setInterval(function()
|
while (PhoneGap._constructors.length > 0) {
|
||||||
{
|
var constructor = PhoneGap._constructors.shift();
|
||||||
|
try {
|
||||||
var state = document.readyState;
|
constructor();
|
||||||
|
} catch(e) {
|
||||||
if ( state == 'loaded' || state == 'complete' )
|
if (typeof(debug['log']) == 'function') {
|
||||||
{
|
debug.log("Failed to run constructor: " + debug.processMessage(e));
|
||||||
clearInterval(timer); // stop looking
|
} else {
|
||||||
// run our constructors list
|
alert("Failed to run constructor: " + e.message);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Start listening for callbacks from Java
|
}
|
||||||
PhoneGap.JSCallback();
|
}
|
||||||
|
});
|
||||||
// all constructors run, now fire the deviceready event
|
|
||||||
var e = document.createEvent('Events');
|
|
||||||
e.initEvent('deviceready');
|
|
||||||
document.dispatchEvent(e);
|
|
||||||
|
|
||||||
// Fire the onresume event, since first one happens before we are inited
|
|
||||||
var e = document.createEvent('Events');
|
|
||||||
e.initEvent('onresume');
|
|
||||||
document.dispatchEvent(e);
|
|
||||||
}
|
|
||||||
}, 5);
|
|
||||||
})();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user