From be0d556ed680908aa58f1268074c4c3063cbef87 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 20 Aug 2015 12:25:26 +1200 Subject: [PATCH] Re-implement mixed provider (fix #145) --- .../java/org/traccar/client/MainActivity.java | 5 - .../traccar/client/MixedPositionProvider.java | 117 ++++++++++++++++++ .../org/traccar/client/PositionProvider.java | 51 ++------ .../client/SimplePositionProvider.java | 58 +++++++++ .../traccar/client/TrackingController.java | 6 +- app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sr/strings.xml | 3 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/values.xml | 1 + 16 files changed, 205 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/org/traccar/client/MixedPositionProvider.java create mode 100644 app/src/main/java/org/traccar/client/SimplePositionProvider.java diff --git a/app/src/main/java/org/traccar/client/MainActivity.java b/app/src/main/java/org/traccar/client/MainActivity.java index 955cb44..9f61229 100644 --- a/app/src/main/java/org/traccar/client/MainActivity.java +++ b/app/src/main/java/org/traccar/client/MainActivity.java @@ -51,11 +51,6 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen addPreferencesFromResource(R.xml.preferences); initPreferences(); - // DELME - if (PreferenceManager.getDefaultSharedPreferences(this).getString(KEY_PROVIDER, null).equals("mixed")) { - PreferenceManager.getDefaultSharedPreferences(this).edit().putString(KEY_PROVIDER, LocationManager.GPS_PROVIDER).commit(); - } - if (getPreferenceScreen().getSharedPreferences().getBoolean(KEY_STATUS, false)) { setPreferencesEnabled(false); startService(new Intent(this, TrackingService.class)); diff --git a/app/src/main/java/org/traccar/client/MixedPositionProvider.java b/app/src/main/java/org/traccar/client/MixedPositionProvider.java new file mode 100644 index 0000000..298750a --- /dev/null +++ b/app/src/main/java/org/traccar/client/MixedPositionProvider.java @@ -0,0 +1,117 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * 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 org.traccar.client; + +import android.content.Context; +import android.location.GpsStatus; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Bundle; +import android.util.Log; + +public class MixedPositionProvider extends PositionProvider implements LocationListener, GpsStatus.Listener { + + private static int FIX_TIMEOUT = 30 * 1000; + + private LocationListener backupListener; + private long lastFixTime; + + public MixedPositionProvider(Context context, PositionListener listener) { + super(context, listener); + } + + public void startUpdates() { + lastFixTime = System.currentTimeMillis(); + locationManager.addGpsStatusListener(this); + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, period, 0, this); + } + + public void stopUpdates() { + locationManager.removeUpdates(this); + locationManager.removeGpsStatusListener(this); + stopBackupProvider(); + } + + private void startBackupProvider() { + Log.i(TAG, "backup provider start"); + if (backupListener == null) { + + backupListener = new LocationListener() { + @Override + public void onLocationChanged(Location location) { + Log.i(TAG, "backup provider location"); + updateLocation(location); + } + + @Override + public void onStatusChanged(String s, int i, Bundle bundle) { + } + + @Override + public void onProviderEnabled(String s) { + } + + @Override + public void onProviderDisabled(String s) { + } + }; + + locationManager.requestLocationUpdates( + LocationManager.NETWORK_PROVIDER, period, 0, backupListener); + } + } + + private void stopBackupProvider() { + Log.i(TAG, "backup provider stop"); + if (backupListener != null) { + locationManager.removeUpdates(backupListener); + backupListener = null; + } + } + + @Override + public void onLocationChanged(Location location) { + Log.i(TAG, "provider location"); + stopBackupProvider(); + lastFixTime = System.currentTimeMillis(); + updateLocation(location); + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + } + + @Override + public void onProviderEnabled(String provider) { + Log.i(TAG, "provider enabled"); + stopBackupProvider(); + } + + @Override + public void onProviderDisabled(String provider) { + Log.i(TAG, "provider disabled"); + startBackupProvider(); + } + + @Override + public void onGpsStatusChanged(int event) { + if (backupListener == null && System.currentTimeMillis() - (lastFixTime + period) > FIX_TIMEOUT) { + startBackupProvider(); + } + } + +} diff --git a/app/src/main/java/org/traccar/client/PositionProvider.java b/app/src/main/java/org/traccar/client/PositionProvider.java index 43d7611..d0ae8a8 100644 --- a/app/src/main/java/org/traccar/client/PositionProvider.java +++ b/app/src/main/java/org/traccar/client/PositionProvider.java @@ -21,17 +21,15 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.location.Location; -import android.location.LocationListener; import android.location.LocationManager; import android.os.BatteryManager; import android.os.Build; -import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; -public class PositionProvider implements LocationListener { +public abstract class PositionProvider { - private static final String TAG = PositionProvider.class.getSimpleName(); + protected static final String TAG = PositionProvider.class.getSimpleName(); public interface PositionListener { void onPositionUpdate(Position position); @@ -41,11 +39,13 @@ public class PositionProvider implements LocationListener { private final Context context; private final SharedPreferences preferences; - private final LocationManager locationManager; + protected final LocationManager locationManager; private String deviceId; - private String type; - private final long period; + protected String type; + protected final long period; + + private long lastUpdateTime; public PositionProvider(Context context, PositionListener listener) { this.context = context; @@ -58,49 +58,24 @@ public class PositionProvider implements LocationListener { period = Integer.parseInt(preferences.getString(MainActivity.KEY_INTERVAL, null)) * 1000; type = preferences.getString(MainActivity.KEY_PROVIDER, null); - if (!type.equals(LocationManager.NETWORK_PROVIDER)) { - type = LocationManager.GPS_PROVIDER; - } } - public void startUpdates() { - locationManager.requestLocationUpdates(type, period, 0, this); - } + public abstract void startUpdates(); - public void stopUpdates() { - locationManager.removeUpdates(this); - } + public abstract void stopUpdates(); - private long lastTime; - - @Override - public void onLocationChanged(Location location) { - if (location != null && location.getTime() != lastTime) { + protected void updateLocation(Location location) { + if (location != null && location.getTime() != lastUpdateTime) { Log.i(TAG, "location new"); - lastTime = location.getTime(); + lastUpdateTime = location.getTime(); listener.onPositionUpdate(new Position(deviceId, location, getBatteryLevel())); } else { Log.i(TAG, location != null ? "location old" : "location nil"); } } - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - Log.i(TAG, "provider status"); - } - - @Override - public void onProviderEnabled(String provider) { - Log.i(TAG, "provider enabled"); - } - - @Override - public void onProviderDisabled(String provider) { - Log.i(TAG, "provider disabled"); - } - @TargetApi(Build.VERSION_CODES.ECLAIR) - public double getBatteryLevel() { + private double getBatteryLevel() { if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.ECLAIR) { Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); diff --git a/app/src/main/java/org/traccar/client/SimplePositionProvider.java b/app/src/main/java/org/traccar/client/SimplePositionProvider.java new file mode 100644 index 0000000..1dd7dfd --- /dev/null +++ b/app/src/main/java/org/traccar/client/SimplePositionProvider.java @@ -0,0 +1,58 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * 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 org.traccar.client; + +import android.content.Context; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Bundle; + +public class SimplePositionProvider extends PositionProvider implements LocationListener { + + public SimplePositionProvider(Context context, PositionListener listener) { + super(context, listener); + if (!type.equals(LocationManager.NETWORK_PROVIDER)) { + type = LocationManager.GPS_PROVIDER; + } + } + + public void startUpdates() { + locationManager.requestLocationUpdates(type, period, 0, this); + } + + public void stopUpdates() { + locationManager.removeUpdates(this); + } + + @Override + public void onLocationChanged(Location location) { + updateLocation(location); + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + } + + @Override + public void onProviderEnabled(String provider) { + } + + @Override + public void onProviderDisabled(String provider) { + } + +} diff --git a/app/src/main/java/org/traccar/client/TrackingController.java b/app/src/main/java/org/traccar/client/TrackingController.java index 09c0e7b..d9a8eb3 100644 --- a/app/src/main/java/org/traccar/client/TrackingController.java +++ b/app/src/main/java/org/traccar/client/TrackingController.java @@ -55,7 +55,11 @@ public class TrackingController implements PositionProvider.PositionListener, Ne this.context = context; handler = new Handler(); preferences = PreferenceManager.getDefaultSharedPreferences(context); - positionProvider = new PositionProvider(context, this); + if (preferences.getString(MainActivity.KEY_PROVIDER, null).equals("mixed")) { + positionProvider = new MixedPositionProvider(context, this); + } else { + positionProvider = new SimplePositionProvider(context, this); + } databaseHelper = new DatabaseHelper(context); networkManager = new NetworkManager(context, this); isOnline = networkManager.isOnline(); diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 849d3b9..38d5e6f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -21,6 +21,7 @@ GPS Mobilní síť + Obojí Popředí služba Zvýšit prioritu služba diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 3229f0c..25d285c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -21,6 +21,7 @@ GPS udbyder Netværks udbyder + Mixet udbyder Forgrunden tjeneste Øg tjeneste prioritet diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index baf25c3..dc2ea29 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -21,6 +21,7 @@ GPS Netzwerk + Gemischt Vordergrund service Erhöhen service priorität diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 22efd88..7af1ba9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -21,6 +21,7 @@ Proveedor GPS Proveedor de red + Proveedor mixto Servicio de primer plano Aumentar prioridad de servicio diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 446bc4e..9ff189d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -21,6 +21,7 @@ Mode GPS uniquement Mode cellulaire uniquement + Mode hybride Un service de premier plan Augmenter la priorité de service diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 4ad525a..c3f18fd 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -21,6 +21,7 @@ GPS-lokalisering Nettverkslokalisering + Blandet lokalisering Forgrunnen tjeneste Øk tjeneste prioritet diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index ae5ac09..c3df469 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -21,6 +21,7 @@ Provedor GPS Provedor Rede + Provedor Misto Serviço primeiro plano Aumentar a prioridade de serviço diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5e6c9c5..6cb9e44 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -21,6 +21,7 @@ GPS провайдер Сетевой провайдер + Смешанный провайдер Приоритетный сервис Увеличить приоритет сервиса diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 6cbca3a..91eb6f7 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -21,9 +21,10 @@ GPS provajder Provajder Mreže + Oba zajedno provajdera Prvi plan servis - Povecanje usluga prioritet + Povecanje usluga prioritet Status O klijentu diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98d2890..1f7e899 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,6 +21,7 @@ GPS provider Network provider + Mixed provider Foreground service Increase service priority diff --git a/app/src/main/res/values/values.xml b/app/src/main/res/values/values.xml index 892f401..6a7ddb1 100644 --- a/app/src/main/res/values/values.xml +++ b/app/src/main/res/values/values.xml @@ -4,6 +4,7 @@ gps network + mixed