~fab4mazz/bus-torino/nearbyarrivals

« back to all changes in this revision

Viewing changes to src/it/reyboz/bustorino/middleware/AppLocationManager.java

  • Committer: Fabio Mazza
  • Date: 2019-09-11 20:34:43 UTC
  • Revision ID: fab4mazz@gmail.com-20190911203443-rec7c4z6cna9yvgo
Added the possibility to search nearby arrivals, first version

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
    private final String BUNDLE_LOCATION =  "location";
46
46
    private static AppLocationManager instance;
47
47
    private int oldGPSLocStatus = LOCATION_UNAVAILABLE;
 
48
    private int minimum_time_milli = -1;
48
49
 
49
50
    private ArrayList<WeakReference<LocationRequester>> requestersRef = new ArrayList<>();
50
51
 
60
61
    }
61
62
    
62
63
 
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;
64
66
        try {
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();
69
72
        }
70
73
    }
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();
 
80
            else {
 
81
                minimum_time_milli = Math.min(cReq.getLocationCriteria().getTimeInterval(),minimum_time_milli);
 
82
            }
76
83
        }
 
84
        Log.d(DEBUG_TAG,"Updated requesters, got "+requestersRef.size()+" listeners to update every "+minimum_time_milli+" ms at least");
77
85
    }
78
86
 
79
87
 
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)){
87
96
                present = true;
 
97
                minimum_time_milli = Math.min(cReq.getLocationCriteria().getTimeInterval(),minimum_time_milli);
88
98
            }
89
99
        }
90
100
        if(!present) {
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());
93
105
        }
94
106
        if(requestersRef.size()>0){
95
 
            startRequestingPosition();
 
107
            requestGPSPositionUpdates();
 
108
 
96
109
        }
97
110
 
98
111
    }
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();
 
118
            else {
 
119
                minimum_time_milli = Math.min(cReq.getLocationCriteria().getTimeInterval(),minimum_time_milli);
 
120
            }
 
121
        }
 
122
        if(requestersRef.size()<=0){
 
123
            locMan.removeUpdates(this);
 
124
        } else {
 
125
            requestGPSPositionUpdates();
104
126
        }
105
127
    }
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();
122
145
            else{
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());
126
152
                }
127
 
 
 
153
                //update minimum time interval
 
154
                new_min_interval = Math.min(requester.getLocationCriteria().getTimeInterval(),new_min_interval);
128
155
            }
129
156
        }
 
157
        minimum_time_milli = new_min_interval;
130
158
        if(requestersRef.size()==0){
131
159
            //stop requesting the position
132
160
            locMan.removeUpdates(this);
151
179
 
152
180
    @Override
153
181
    public void onProviderEnabled(String provider) {
154
 
        startRequestingPosition();
 
182
        requestGPSPositionUpdates();
155
183
    }
156
184
 
157
185
    @Override
163
191
    public interface LocationRequester{
164
192
        void onLocationChanged(Location loc);
165
193
        void onLocationStatusChanged(int status);
 
194
        long getLastUpdateTimeMillis();
166
195
        LocationCriteria getLocationCriteria();
167
196
    }
168
197
}