diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2477984..8650bd8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,10 +5,11 @@
+
-
+
diff --git a/app/src/main/java/org/traccar/client/NetworkManager.java b/app/src/main/java/org/traccar/client/NetworkManager.java
new file mode 100644
index 0000000..de259ab
--- /dev/null
+++ b/app/src/main/java/org/traccar/client/NetworkManager.java
@@ -0,0 +1,62 @@
+/*
+ * 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.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+
+public class NetworkManager extends BroadcastReceiver {
+
+ private Context context;
+ private NetworkHandler handler;
+
+ public NetworkManager(Context context, NetworkHandler handler) {
+ this.context = context;
+ this.handler = handler;
+ }
+
+ public interface NetworkHandler {
+ void onNetworkUpdate(boolean isOnline);
+ }
+
+ public boolean isOnline() {
+ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
+ return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
+ }
+
+ public void start() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+ context.registerReceiver(this, filter);
+ }
+
+ public void stop() {
+ context.unregisterReceiver(this);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION) && handler != null) {
+ handler.onNetworkUpdate(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false));
+ }
+ }
+
+}
diff --git a/app/src/main/java/org/traccar/client/TrackingController.java b/app/src/main/java/org/traccar/client/TrackingController.java
index a5f2dfe..fc9656e 100644
--- a/app/src/main/java/org/traccar/client/TrackingController.java
+++ b/app/src/main/java/org/traccar/client/TrackingController.java
@@ -20,10 +20,11 @@ import android.content.SharedPreferences;
import android.os.Handler;
import android.preference.PreferenceManager;
-public class TrackingController implements PositionProvider.PositionListener {
+public class TrackingController implements PositionProvider.PositionListener, NetworkManager.NetworkHandler {
private static final int RETRY_DELAY = 30 * 1000;
+ private boolean isOnline;
private boolean isWaiting;
private Context context;
@@ -32,6 +33,7 @@ public class TrackingController implements PositionProvider.PositionListener {
private PositionProvider positionProvider;
private DatabaseHelper databaseHelper;
+ private NetworkManager networkManager;
public TrackingController(Context context) {
this.context = context;
@@ -42,13 +44,18 @@ public class TrackingController implements PositionProvider.PositionListener {
preferences.getString(MainActivity.KEY_PROVIDER, null),
Integer.parseInt(preferences.getString(MainActivity.KEY_INTERVAL, null)) * 1000);
databaseHelper = new DatabaseHelper(context);
+ networkManager = new NetworkManager(context, this);
+ isOnline = networkManager.isOnline();
}
public void start() {
+ read();
positionProvider.startUpdates();
+ networkManager.start();
}
public void stop() {
+ networkManager.stop();
positionProvider.stopUpdates();
handler.removeCallbacksAndMessages(null);
}
@@ -61,12 +68,38 @@ public class TrackingController implements PositionProvider.PositionListener {
}
}
+ @Override
+ public void onNetworkUpdate(boolean isOnline) {
+ if (!this.isOnline && isOnline) {
+ read();
+ }
+ this.isOnline = isOnline;
+ }
+
+ //
+ // State transition examples:
//
// write -> read -> send -> delete -> read
//
// read -> send -> retry -> read -> send
//
+ private void write(Position position) {
+ databaseHelper.insertPositionAsync(position, new DatabaseHelper.DatabaseHandler() {
+ @Override
+ public void onSuccess(Void result) {
+ if (isOnline && isWaiting) {
+ read();
+ isWaiting = false;
+ }
+ }
+
+ @Override
+ public void onFailure(RuntimeException error) {
+ }
+ });
+ }
+
private void read() {
databaseHelper.selectPositionAsync(new DatabaseHelper.DatabaseHandler() {
@Override
@@ -85,22 +118,6 @@ public class TrackingController implements PositionProvider.PositionListener {
});
}
- private void write(Position position) {
- databaseHelper.insertPositionAsync(position, new DatabaseHelper.DatabaseHandler() {
- @Override
- public void onSuccess(Void result) {
- if (isWaiting) {
- read();
- isWaiting = false;
- }
- }
-
- @Override
- public void onFailure(RuntimeException error) {
- }
- });
- }
-
private void delete(Position position) {
databaseHelper.deletePositionAsync(position.getId(), new DatabaseHelper.DatabaseHandler() {
@Override