1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/*
* 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 posision) {
callback.onSuccess(posision);
}
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.frequency = options.@com.googlecode.gwtphonegap.client.geolocation.GeolocationOptions::getFrequency()();
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);
}
}
|