Skip to content
Permalink
Browse files
…eolocation into dev
  • Loading branch information
purplecabbage committed Dec 3, 2013
2 parents eccd62b + 22055cc commit e05dae68c8710616678bb2a21a561cb9db20bbfe
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 0 deletions.
@@ -173,6 +173,9 @@ xmlns:android="http://schemas.android.com/apk/res/android"
<config-file target="package.appxmanifest" parent="/Package/Capabilities">
<DeviceCapability Name="location" />
</config-file>
<js-module src="src/windows8/GeolocationProxy.js" name="GeolocationProxy">
<merges target="" />
</js-module>
</platform>

<!-- firefoxos -->
@@ -0,0 +1,163 @@
/*
* Copyright 2013 Research In Motion Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

var PositionError = require('./PositionError'),
ids = {},
loc;

function ensureLocator() {
if (loc == null)
loc = new Windows.Devices.Geolocation.Geolocator();

return loc;
}

function createErrorCode() {
switch (loc.locationStatus) {
case Windows.Devices.Geolocation.PositionStatus.initializing:
// This status indicates that a location device is still initializing
case Windows.Devices.Geolocation.PositionStatus.noData:
// No location data is currently available
case Windows.Devices.Geolocation.PositionStatus.notInitialized:
// This status indicates that the app has not yet requested
// location data by calling GetGeolocationAsync() or
// registering an event handler for the positionChanged event.
case Windows.Devices.Geolocation.PositionStatus.notAvailable:
// Location is not available on this version of Windows
return PositionError.POSITION_UNAVAILABLE;

case Windows.Devices.Geolocation.PositionStatus.disabled:
// The app doesn't have permission to access location,
// either because location has been turned off.
return PositionError.PERMISSION_DENIED;

default:
break;
}
}

module.exports = {
getLocation: function (success, fail, args, env) {
ensureLocator();
if (loc != null)
{
var highAccuracy = args[0],
maxAge = args[1];

loc.desiredAccuracy = highAccuracy ?
Windows.Devices.Geolocation.PositionAccuracy.high :
Windows.Devices.Geolocation.PositionAccuracy.default;

loc.reportInterval = maxAge ? maxAge : 0;

loc.getGeopositionAsync().then(
function (pos) {
success({
latitude: pos.coordinate.latitude,
longitude: pos.coordinate.longitude,
altitude: pos.coordinate.altitude,
accuracy: pos.coordinate.accuracy,
heading: pos.coordinate.heading,
velocity: pos.coordinate.speed,
altitudeAccuracy: pos.coordinate.altitudeAccuracy,
timestamp: pos.coordinate.timestamp
});
},
function (err) {
fail({
code: createErrorCode(),
message: err.message
});
}
);
}
else
{
fail({
code: PositionError.POSITION_UNAVAILABLE,
message: "You do not have the required location services present on your system."
});
}
},

addWatch: function (success, fail, args, env) {
ensureLocator();
var clientId = args[0],
highAccuracy = args[1],

onPositionChanged = function (e) {
success({
latitude: e.position.coordinate.latitude,
longitude: e.position.coordinate.longitude,
altitude: e.position.coordinate.altitude,
accuracy: e.position.coordinate.accuracy,
heading: e.position.coordinate.heading,
velocity: e.position.coordinate.speed,
altitudeAccuracy: e.position.coordinate.altitudeAccuracy,
timestamp: e.position.coordinate.timestamp
});
},

onStatusChanged = function (e) {
switch (e.status) {
case Windows.Devices.Geolocation.PositionStatus.noData:
case Windows.Devices.Geolocation.PositionStatus.notAvailable:
fail({
code: PositionError.POSITION_UNAVAILABLE,
message: "Data from location services is currently unavailable or you do not have the required location services present on your system."
});
break;

case Windows.Devices.Geolocation.PositionStatus.disabled:
fail({
code: PositionError.PERMISSION_DENIED,
message: "Your location is currently turned off."
});
break;

case Windows.Devices.Geolocation.PositionStatus.initializing:
case Windows.Devices.Geolocation.PositionStatus.ready:
default:
break;
}
};

loc.desiredAccuracy = highAccuracy ?
Windows.Devices.Geolocation.PositionAccuracy.high :
Windows.Devices.Geolocation.PositionAccuracy.default;

loc.addEventListener("positionchanged", onPositionChanged);
loc.addEventListener("statuschanged", onStatusChanged);

ids[clientId] = { pos: onPositionChanged, status: onStatusChanged };
},

clearWatch: function (success, fail, args, env) {
var clientId = args[0],
callbacks = ids[clientId];

if (callbacks) {
loc.removeEventListener("positionchanged", callbacks.pos);
loc.removeEventListener("statuschanged", callbacks.status);

delete ids[clientId];
}

success && success();
}
};

require("cordova/windows8/commandProxy").add("Geolocation", module.exports);

0 comments on commit e05dae6

Please sign in to comment.