/*
* Copyright 2010 Daniel Kurka
*
* 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.
*/
package com.googlecode.gwtphonegap.client.geolocation.js;
import com.google.gwt.core.client.JavaScriptObject;
import com.googlecode.gwtphonegap.client.geolocation.Geolocation;
import com.googlecode.gwtphonegap.client.geolocation.GeolocationCallback;
import com.googlecode.gwtphonegap.client.geolocation.GeolocationOptions;
import com.googlecode.gwtphonegap.client.geolocation.GeolocationWatcher;
/**
*
* Geolocation provides location information for the device, such as latitude
* and longitude. Common sources of location information include Global
* Positioning System (GPS) and location inferred from network signals such as
* IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs. No
* guarantee is given that the API returns the device's actual location.
*
* This API is based on the W3C Geo location API Specification. Some devices
* already provide an implementation of this spec. For those devices, the
* built-in support is used instead of replacing it with PhoneGap's
* implementation. For devices that don't have geolocation support, PhoneGap's
* implementation should be compatible with the W3C specification.
*
* @author Daniel Kurka
*
*/
public class GeolocationMobileImpl implements Geolocation {
@Override
public void getCurrentPosition(GeolocationCallback callback) {
getCurrentPosition(callback, null);
}
@Override
public native void getCurrentPosition(GeolocationCallback callback, GeolocationOptions options)/*-{
var successCallback = function(data) {
@com.googlecode.gwtphonegap.client.geolocation.js.GeolocationMobileImpl::onSuccess(Lcom/googlecode/gwtphonegap/client/geolocation/GeolocationCallback;Lcom/googlecode/gwtphonegap/client/geolocation/js/PositionJsImpl;)(callback, data);
};
var errorCallback = function(error) {
@com.googlecode.gwtphonegap.client.geolocation.js.GeolocationMobileImpl::onFailure(Lcom/googlecode/gwtphonegap/client/geolocation/GeolocationCallback;Lcom/googlecode/gwtphonegap/client/geolocation/js/PositionErrorJSOImpl;)(callback, error);
};
var localOptions = this.@com.googlecode.gwtphonegap.client.geolocation.js.GeolocationMobileImpl::createOptions(Lcom/googlecode/gwtphonegap/client/geolocation/GeolocationOptions;)(options);
$wnd.navigator.geolocation.getCurrentPosition($entry(successCallback),
$entry(errorCallback), localOptions);
}-*/;
public native String watchPosition0(GeolocationOptions options, GeolocationCallback callback)/*-{
var successCallback = function(data) {
@com.googlecode.gwtphonegap.client.geolocation.js.GeolocationMobileImpl::onSuccess(Lcom/googlecode/gwtphonegap/client/geolocation/GeolocationCallback;Lcom/googlecode/gwtphonegap/client/geolocation/js/PositionJsImpl;)(callback, data);
};
var errorCallback = function(error) {
@com.googlecode.gwtphonegap.client.geolocation.js.GeolocationMobileImpl::onFailure(Lcom/googlecode/gwtphonegap/client/geolocation/GeolocationCallback;Lcom/googlecode/gwtphonegap/client/geolocation/js/PositionErrorJSOImpl;)(callback, error);
};
var localOptions = this.@com.googlecode.gwtphonegap.client.geolocation.js.GeolocationMobileImpl::createOptions(Lcom/googlecode/gwtphonegap/client/geolocation/GeolocationOptions;)(options);
var watcherId = $wnd.navigator.geolocation.watchPosition(
$entry(successCallback), $entry(errorCallback), localOptions);
return watcherId;
}-*/;
private static void onFailure(GeolocationCallback callback, PositionErrorJSOImpl error) {
callback.onFailure(error);
}
private static void onSuccess(GeolocationCallback callback, PositionJsImpl position) {
callback.onSuccess(position);
}
private native void clearWatch0(String watcher) /*-{
$wnd.navigator.geolocation.clearWatch(watcher);
}-*/;
private native JavaScriptObject createOptions(GeolocationOptions options)/*-{
var localOptions = {};
if (options == null)
return localOptions;
localOptions.enableHighAccuracy = options.@com.googlecode.gwtphonegap.client.geolocation.GeolocationOptions::isEnableHighAccuracy()();
var maxage = options.@com.googlecode.gwtphonegap.client.geolocation.GeolocationOptions::getMaximumAge()();
if (maxage > 0) {
localOptions.maximumAge = maxage;
}
var timeout = options.@com.googlecode.gwtphonegap.client.geolocation.GeolocationOptions::getTimeout()();
if (timeout > 0) {
localOptions.timeout = timeout;
}
return localOptions;
}-*/;
@Override
public void clearWatch(GeolocationWatcher watcher) {
if (!(watcher instanceof GeolocationWatcherJSOImpl)) {
throw new IllegalStateException();
}
GeolocationWatcherJSOImpl geolocationWatcherJSOImpl = (GeolocationWatcherJSOImpl) watcher;
clearWatch0(geolocationWatcherJSOImpl.getId());
}
@Override
public GeolocationWatcher watchPosition(GeolocationOptions options, GeolocationCallback callback) {
String id = watchPosition0(options, callback);
return new GeolocationWatcherJSOImpl(id);
}
}