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