63
private void startRequestingPosition(){
64
private void requestGPSPositionUpdates(){
65
final int timeinterval = (minimum_time_milli>0 && minimum_time_milli<Integer.MAX_VALUE)? minimum_time_milli : 2000;
65
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 5, this);
67
locMan.removeUpdates(this);
68
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, timeinterval, 5, this);
66
69
} catch (SecurityException exc){
67
70
exc.printStackTrace();
68
71
Toast.makeText(con,"Cannot access GPS location",Toast.LENGTH_SHORT).show();
71
private void cleanRequesters(){
74
private void cleanAndUpdateRequesters(){
75
minimum_time_milli = Integer.MAX_VALUE;
72
76
ListIterator<WeakReference<LocationRequester>> iter = requestersRef.listIterator();
73
77
while(iter.hasNext()){
74
78
final LocationRequester cReq = iter.next().get();
75
79
if(cReq==null) iter.remove();
81
minimum_time_milli = Math.min(cReq.getLocationCriteria().getTimeInterval(),minimum_time_milli);
84
Log.d(DEBUG_TAG,"Updated requesters, got "+requestersRef.size()+" listeners to update every "+minimum_time_milli+" ms at least");
80
88
public void addLocationRequestFor(LocationRequester req){
81
89
boolean present = false;
90
minimum_time_milli = Integer.MAX_VALUE;
82
91
ListIterator<WeakReference<LocationRequester>> iter = requestersRef.listIterator();
83
92
while(iter.hasNext()){
84
93
final LocationRequester cReq = iter.next().get();
85
94
if(cReq==null) iter.remove();
86
95
else if(cReq.equals(req)){
97
minimum_time_milli = Math.min(cReq.getLocationCriteria().getTimeInterval(),minimum_time_milli);
91
101
WeakReference<LocationRequester> newref = new WeakReference<>(req);
92
102
requestersRef.add(newref);
103
minimum_time_milli = Math.min(req.getLocationCriteria().getTimeInterval(),minimum_time_milli);
104
Log.d(DEBUG_TAG,"Added new stop requester, instance of "+req.getClass().getSimpleName());
94
106
if(requestersRef.size()>0){
95
startRequestingPosition();
107
requestGPSPositionUpdates();
99
112
public void removeLocationRequestFor(LocationRequester req){
113
minimum_time_milli = Integer.MAX_VALUE;
100
114
ListIterator<WeakReference<LocationRequester>> iter = requestersRef.listIterator();
101
115
while(iter.hasNext()){
102
116
final LocationRequester cReq = iter.next().get();
103
117
if(cReq==null || cReq.equals(req)) iter.remove();
119
minimum_time_milli = Math.min(cReq.getLocationCriteria().getTimeInterval(),minimum_time_milli);
122
if(requestersRef.size()<=0){
123
locMan.removeUpdates(this);
125
requestGPSPositionUpdates();
106
128
private void sendLocationStatusToAll(int status){
116
138
public void onLocationChanged(Location location) {
117
139
Log.d("GPSLocationListener","found location:\nlat: "+location.getLatitude()+" lon: "+location.getLongitude()+"\naccuracy: "+location.getAccuracy());
118
140
ListIterator<WeakReference<LocationRequester>> iter = requestersRef.listIterator();
141
int new_min_interval = Integer.MAX_VALUE;
119
142
while(iter.hasNext()){
120
final LocationRequester cReq = iter.next().get();
121
if(cReq==null) iter.remove();
143
final LocationRequester requester = iter.next().get();
144
if(requester==null) iter.remove();
123
final LocationCriteria cr = cReq.getLocationCriteria();
124
if(location.getAccuracy()<cr.getMinAccuracy()){
125
cReq.onLocationChanged(location);
146
final long timeNow = System.currentTimeMillis();
147
final LocationCriteria criteria = requester.getLocationCriteria();
148
if(location.getAccuracy()<criteria.getMinAccuracy() &&
149
(timeNow - requester.getLastUpdateTimeMillis())>criteria.getTimeInterval()){
150
requester.onLocationChanged(location);
151
Log.d("AppLocationManager","Updating position for instance of requester "+requester.getClass().getSimpleName());
153
//update minimum time interval
154
new_min_interval = Math.min(requester.getLocationCriteria().getTimeInterval(),new_min_interval);
157
minimum_time_milli = new_min_interval;
130
158
if(requestersRef.size()==0){
131
159
//stop requesting the position
132
160
locMan.removeUpdates(this);