mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-01 10:32:51 +08:00
4b3255e4fd
- Removed thread delay to get accelerometer values. - Override Activity lifecycle methods to manage JavaScript timers and enable window.onunload to be called. This is needed for accelerometer to shut down correctly.
224 lines
7.0 KiB
JavaScript
224 lines
7.0 KiB
JavaScript
function Acceleration(x, y, z) {
|
|
this.x = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
this.timestamp = new Date().getTime();
|
|
}
|
|
|
|
/**
|
|
* This class provides access to device accelerometer data.
|
|
* @constructor
|
|
*/
|
|
function Accelerometer() {
|
|
|
|
/**
|
|
* The last known acceleration. type=Acceleration()
|
|
*/
|
|
this.lastAcceleration = null;
|
|
|
|
/**
|
|
* List of accelerometer watch listeners
|
|
*/
|
|
this.accelListeners = {};
|
|
|
|
/**
|
|
* List of accelerometer watch timers
|
|
*/
|
|
this.accelTimers = {};
|
|
|
|
/**
|
|
* Next id to use
|
|
*/
|
|
this.listenerId = 0;
|
|
|
|
/**
|
|
* Timer that turns off accelerometer when it reaches maximum time.
|
|
* This timer is only used for getCurrentAcceleration.
|
|
*/
|
|
this.turnOffTimer = 0;
|
|
|
|
// Turn off accelerometer if not accessed for certain amount of time
|
|
setInterval(function() {
|
|
navigator.accelerometer.turnOffTimer += 10;
|
|
if (navigator.accelerometer.turnOffTimer > Accelerometer.MAX_TIMER) {
|
|
Accel.stop("timer");
|
|
navigator.accelerometer.turnOffTimer = 0;
|
|
}
|
|
}, 10000);
|
|
}
|
|
|
|
Accelerometer.STOPPED = 0;
|
|
Accelerometer.STARTING = 1;
|
|
Accelerometer.RUNNING = 2;
|
|
Accelerometer.ERROR_FAILED_TO_START = 3;
|
|
Accelerometer.ERROR_NOT_FOUND = 4;
|
|
Accelerometer.ERROR_MSG = ["Not running", "Starting", "", "Failed to start", "Listener not found"];
|
|
|
|
/**
|
|
* Time (in seconds) to turn off accelerometer if getCurrentAcceleration() hasn't been called.
|
|
*/
|
|
Accelerometer.MAX_TIMER = 30;
|
|
|
|
/**
|
|
* 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) {
|
|
|
|
// successCallback required
|
|
if (typeof successCallback != "function") {
|
|
console.log("Accelerometer Error: successCallback is not a function");
|
|
return;
|
|
}
|
|
|
|
// errorCallback optional
|
|
if (errorCallback && (typeof errorCallback != "function")) {
|
|
console.log("Accelerometer Error: errorCallback is not a function");
|
|
return;
|
|
}
|
|
|
|
// Get current acceleration status
|
|
var status = Accel.getStatus();
|
|
|
|
// If running, then call successCallback
|
|
if (status == Accelerometer.RUNNING) {
|
|
try {
|
|
navigator.accelerometer.turnOffTimer = 0;
|
|
var accel = new Acceleration(Accel.getX(), Accel.getY(), Accel.getZ());
|
|
successCallback(accel);
|
|
} catch (e) {
|
|
console.log("Accelerometer Error in successCallback: " + e);
|
|
}
|
|
}
|
|
|
|
// If not running, then start it
|
|
else {
|
|
Accel.start("timer");
|
|
navigator.accelerometer.turnOffTimer = 0;
|
|
var obj = this;
|
|
|
|
// Wait until started
|
|
var timer = setInterval(function() {
|
|
var status = Accel.getStatus();
|
|
if (status != Accelerometer.STARTING) {
|
|
clearInterval(timer);
|
|
|
|
// 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 error
|
|
else {
|
|
console.log("Accelerometer Error: "+ Accelerometer.ERROR_MSG[status]);
|
|
try {
|
|
if (errorCallback) {
|
|
errorCallback(status);
|
|
}
|
|
} catch (e) {
|
|
console.log("Accelerometer Error in errorCallback: " + e);
|
|
}
|
|
}
|
|
}
|
|
}, 10);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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.
|
|
* @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;
|
|
|
|
// successCallback required
|
|
if (typeof successCallback != "function") {
|
|
console.log("Accelerometer Error: successCallback is not a function");
|
|
return;
|
|
}
|
|
|
|
// errorCallback optional
|
|
if (errorCallback && (typeof errorCallback != "function")) {
|
|
console.log("Accelerometer Error: errorCallback is not a function");
|
|
return;
|
|
}
|
|
|
|
var id = ""+(navigator.accelerometer.listenerId++);
|
|
navigator.accelerometer.accelListeners[id] = id;
|
|
Accel.start(id);
|
|
|
|
// Start watch timer
|
|
navigator.accelerometer.accelTimers[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.accelTimers[id]) {
|
|
clearInterval(navigator.accelerometer.accelTimers[id]);
|
|
delete navigator.accelerometer.accelTimers[id];
|
|
}
|
|
|
|
// Remove from watch list
|
|
if (id && navigator.accelerometer.accelListeners[id]) {
|
|
delete navigator.accelerometer.accelListeners[id];
|
|
}
|
|
|
|
// Stop accelerometer for this watch listener
|
|
if (id) {
|
|
try {
|
|
Accel.stop(id);
|
|
} catch (e) {
|
|
}
|
|
}
|
|
}
|
|
|
|
PhoneGap.addConstructor(function() {
|
|
if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer();
|
|
});
|