Merge pull request #4154 from osmandapp/live_monitoring_fixes

Live monitoring fixes
This commit is contained in:
vshcherb 2017-07-21 10:03:31 +02:00 committed by GitHub
commit 401725ddbf
5 changed files with 36 additions and 9 deletions

View file

@ -1936,6 +1936,8 @@
<string name="live_monitoring_interval">Online tracking interval</string>
<string name="live_monitoring_url_descr">Specify the web address with parameter syntax: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}</string>
<string name="live_monitoring_url">Online tracking web address</string>
<string name="live_monitoring_max_interval_to_send">Time buffer for online tracking</string>
<string name="live_monitoring_max_interval_to_send_desrc">Specify a time buffer to keep locations to send without connection</string>
<string name="gpx_monitoring_disabled_warn">Log track using GPX widget or via \'Trip recording\' settings.</string>
<string name="show_current_gpx_title">Show current track</string>
<string name="free_version_message">This free OsmAnd version is limited to %1$s downloads and does not support offline Wikipedia articles.</string>

View file

@ -1123,6 +1123,9 @@ public class OsmandSettings {
// this value string is synchronized with settings_pref.xml preference name
public final CommonPreference<Integer> LIVE_MONITORING_INTERVAL = new IntPreference("live_monitoring_interval", 5000).makeGlobal();
// this value string is synchronized with settings_pref.xml preference name
public final CommonPreference<Integer> LIVE_MONITORING_MAX_INTERVAL_TO_SEND = new IntPreference("live_monitoring_maximum_interval_to_send", 900000).makeGlobal();
// this value string is synchronized with settings_pref.xml preference name
public final CommonPreference<String> LIVE_MONITORING_URL = new StringPreference("live_monitoring_url",
"http://example.com?lat={0}&lon={1}&timestamp={2}&hdop={3}&altitude={4}&speed={5}").makeGlobal();

View file

@ -9,6 +9,7 @@ import java.net.URL;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
@ -34,10 +35,13 @@ public class LiveMonitoringHelper {
private long lastTimeUpdated;
private LatLon lastPoint;
private final static Log log = PlatformUtil.getLog(LiveMonitoringHelper.class);
private ConcurrentLinkedQueue<LiveMonitoringData> queue;
private boolean started = false;
public LiveMonitoringHelper(Context ctx){
this.ctx = ctx;
settings = ((OsmandApplication) ctx.getApplicationContext()).getSettings();
queue = new ConcurrentLinkedQueue<>();
}
public boolean isLiveMonitoringEnabled(){
@ -67,10 +71,18 @@ public class LiveMonitoringHelper {
record = false;
}
}
if (isLiveMonitoringEnabled()) {
if (!started) {
new LiveSender().execute(queue);
started = true;
}
} else {
started = false;
}
if(record) {
LiveMonitoringData data = new LiveMonitoringData((float)location.getLatitude(), (float)location.getLongitude(),
(float)location.getAltitude(), location.getSpeed(), location.getAccuracy(), location.getBearing(), locationTime);
new LiveSender().execute(data);
queue.add(data);
lastPoint = new LatLon(location.getLatitude(), location.getLongitude());
lastTimeUpdated = locationTime;
}
@ -99,16 +111,22 @@ public class LiveMonitoringHelper {
}
private class LiveSender extends AsyncTask<LiveMonitoringData, Void, Void> {
private class LiveSender extends AsyncTask<ConcurrentLinkedQueue<LiveMonitoringData>, Void, Void> {
@Override
protected Void doInBackground(LiveMonitoringData... params) {
for(LiveMonitoringData d : params){
sendData(d);
protected Void doInBackground(ConcurrentLinkedQueue<LiveMonitoringData>... concurrentLinkedQueues) {
while (isLiveMonitoringEnabled()) {
for (ConcurrentLinkedQueue queue : concurrentLinkedQueues) {
if (!queue.isEmpty()) {
LiveMonitoringData data = (LiveMonitoringData) queue.poll();
if (!(System.currentTimeMillis() - data.time > settings.LIVE_MONITORING_MAX_INTERVAL_TO_SEND.get())) {
sendData(data);
}
}
}
}
return null;
}
}
public void sendData(LiveMonitoringData data) {

View file

@ -131,6 +131,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
public static final int[] SECONDS = new int[] {0, 1, 2, 3, 5, 10, 15, 30, 60, 90};
public static final int[] MINUTES = new int[] {2, 3, 5};
public static final int[] MAX_INTERVAL_TO_SEND_MINUTES = new int[] {1, 2, 5, 10, 15, 20, 30, 60};
@Override

View file

@ -25,6 +25,7 @@ public class SettingsMonitoringActivity extends SettingsBaseActivity {
public static final int[] BG_MINUTES = new int[]{2, 3, 5, 10, 15, 30, 60, 90};
private static final int[] SECONDS = OsmandMonitoringPlugin.SECONDS;
private static final int[] MINUTES = OsmandMonitoringPlugin.MINUTES;
private static final int[] MAX_INTERVAL_TO_SEND_MINUTES = OsmandMonitoringPlugin.MAX_INTERVAL_TO_SEND_MINUTES;
public SettingsMonitoringActivity() {
super(true);
@ -136,6 +137,8 @@ public class SettingsMonitoringActivity extends SettingsBaseActivity {
cat.addPreference(liveMonitoring);
cat.addPreference(createTimeListPreference(settings.LIVE_MONITORING_INTERVAL, SECONDS,
MINUTES, 1000, R.string.live_monitoring_interval, R.string.live_monitoring_interval_descr));
cat.addPreference(createTimeListPreference(settings.LIVE_MONITORING_MAX_INTERVAL_TO_SEND, null,
MAX_INTERVAL_TO_SEND_MINUTES, 1000, R.string.live_monitoring_max_interval_to_send, R.string.live_monitoring_max_interval_to_send_desrc));
}
private void createNotificationSection(PreferenceScreen grp) {