summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2016-09-08 17:53:00 +0200
committerIvo van Dongen <info@ivovandongen.nl>2016-09-23 10:47:54 +0200
commit742d6d827567608f94b0743b7bac5dbef94724e3 (patch)
treeb42d617cf2e8ac60f7a91b339ef3fccccca02043
parent3ddb8dfc86753120d2ea2c3befdf2430c1c56562 (diff)
downloadqtlocation-mapboxgl-742d6d827567608f94b0743b7bac5dbef94724e3.tar.gz
[android] set connectivity state pro-actively
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/MapboxAccountManager.java13
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/ConnectivityListener.java10
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/ConnectivityReceiver.java88
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/NativeConnectivityListener.java34
-rw-r--r--platform/android/config.cmake4
-rw-r--r--platform/android/src/connectivity_listener.cpp43
-rw-r--r--platform/android/src/connectivity_listener.hpp35
-rwxr-xr-xplatform/android/src/jni.cpp2
8 files changed, 225 insertions, 4 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/MapboxAccountManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/MapboxAccountManager.java
index 5770f54a85..fa53807306 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/MapboxAccountManager.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/MapboxAccountManager.java
@@ -8,6 +8,7 @@ import android.text.TextUtils;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.exceptions.InvalidAccessTokenException;
import com.mapbox.mapboxsdk.exceptions.MapboxAccountManagerNotStartedException;
+import com.mapbox.mapboxsdk.net.ConnectivityReceiver;
import com.mapbox.mapboxsdk.telemetry.MapboxEventManager;
public class MapboxAccountManager {
@@ -40,11 +41,16 @@ public class MapboxAccountManager {
*/
public static MapboxAccountManager start(Context context, String accessToken) {
if (mapboxAccountManager == null) {
+ //Create a new account manager
mapboxAccountManager = new MapboxAccountManager(context, accessToken);
+
+ //Initialize the event manager
+ MapboxEventManager.getMapboxEventManager().initialize(context, accessToken);
+
+ //Register a receiver to listen for connectivity updates
+ ConnectivityReceiver.instance(context);
}
- MapboxEventManager eventManager = MapboxEventManager.getMapboxEventManager();
- eventManager.initialize(mapboxAccountManager.applicationContext, mapboxAccountManager.accessToken);
return mapboxAccountManager;
}
@@ -92,8 +98,7 @@ public class MapboxAccountManager {
public boolean isConnected() {
ConnectivityManager cm = (ConnectivityManager) applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
- boolean result = (activeNetwork != null && activeNetwork.isConnected());
- return result;
+ return (activeNetwork != null && activeNetwork.isConnected());
}
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/ConnectivityListener.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/ConnectivityListener.java
new file mode 100644
index 0000000000..0528194528
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/ConnectivityListener.java
@@ -0,0 +1,10 @@
+package com.mapbox.mapboxsdk.net;
+
+/**
+ * Receives updates on connectivity state
+ */
+public interface ConnectivityListener {
+
+ void onNetworkStateChanged(boolean connected);
+
+}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/ConnectivityReceiver.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/ConnectivityReceiver.java
new file mode 100644
index 0000000000..823f463030
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/ConnectivityReceiver.java
@@ -0,0 +1,88 @@
+package com.mapbox.mapboxsdk.net;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * Interface definition for a callback to be invoked when connectivity changes.
+ * Not public api.
+ */
+public class ConnectivityReceiver extends BroadcastReceiver {
+ private static final String TAG = ConnectivityReceiver.class.getSimpleName();
+ private static ConnectivityReceiver INSTANCE;
+
+ /**
+ * Get or create the singleton instance
+ */
+ public static synchronized ConnectivityReceiver instance(Context context) {
+ if (INSTANCE == null) {
+ //Register new instance
+ INSTANCE = new ConnectivityReceiver();
+ context.registerReceiver(INSTANCE, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
+
+ //Add default listeners
+ INSTANCE.addListener(new NativeConnectivityListener());
+ }
+
+ return INSTANCE;
+ }
+
+ private List<ConnectivityListener> listeners = new CopyOnWriteArrayList<>();
+
+ private ConnectivityReceiver() {
+ }
+
+ /**
+ * @see BroadcastReceiver#onReceive(Context, Intent)
+ */
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ boolean connected = isConnected(context);
+ Log.v(TAG, "Connected: " + connected);
+
+ //Loop over listeners
+ for (ConnectivityListener listener : listeners) {
+ listener.onNetworkStateChanged(connected);
+ }
+ }
+
+ /**
+ * Add a listener to be notified
+ *
+ * @param listener the listener to add
+ */
+ public void addListener(@NonNull ConnectivityListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Remove a listener
+ *
+ * @param listener the listener to remove
+ */
+ public void removeListener(@NonNull ConnectivityListener listener) {
+ listeners.remove(listener);
+ }
+
+ /**
+ * Get current connectivity state
+ *
+ * @param context current Context
+ * @return true if connected
+ */
+ public boolean isConnected(Context context) {
+ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
+ return (activeNetwork != null && activeNetwork.isConnected());
+ }
+
+}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/NativeConnectivityListener.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/NativeConnectivityListener.java
new file mode 100644
index 0000000000..8b9307465c
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/net/NativeConnectivityListener.java
@@ -0,0 +1,34 @@
+package com.mapbox.mapboxsdk.net;
+
+/**
+ * Updates the native library's connectivity state
+ */
+class NativeConnectivityListener implements ConnectivityListener {
+
+ static {
+ System.loadLibrary("mapbox-gl");
+ }
+
+ private long nativePtr;
+ private boolean invalidated;
+
+ NativeConnectivityListener(long nativePtr) {
+ this.nativePtr = nativePtr;
+ }
+
+ NativeConnectivityListener() {
+ initialize();
+ }
+
+ @Override
+ public void onNetworkStateChanged(boolean connected) {
+ nativeOnConnectivityStateChanged(connected);
+ }
+
+ protected native void nativeOnConnectivityStateChanged(boolean connected);
+
+ protected native void initialize();
+
+ @Override
+ protected native void finalize() throws Throwable;
+}
diff --git a/platform/android/config.cmake b/platform/android/config.cmake
index 8eed13e53b..b995e758d1 100644
--- a/platform/android/config.cmake
+++ b/platform/android/config.cmake
@@ -125,6 +125,10 @@ add_library(mapbox-gl SHARED
platform/android/src/native_map_view.cpp
platform/android/src/native_map_view.hpp
+ # Connectivity
+ platform/android/src/connectivity_listener.cpp
+ platform/android/src/connectivity_listener.hpp
+
# Main jni bindings
platform/android/src/jni.cpp
platform/android/src/jni.hpp
diff --git a/platform/android/src/connectivity_listener.cpp b/platform/android/src/connectivity_listener.cpp
new file mode 100644
index 0000000000..df5c60a485
--- /dev/null
+++ b/platform/android/src/connectivity_listener.cpp
@@ -0,0 +1,43 @@
+#include "connectivity_listener.hpp"
+
+#include <mbgl/storage/network_status.hpp>
+#include <mbgl/platform/log.hpp>
+
+#include <jni/jni.hpp>
+
+namespace mbgl {
+namespace android {
+
+ /**
+ * Invoked when the construction is initiated from the jvm
+ */
+ ConnectivityListener::ConnectivityListener(jni::JNIEnv&) {}
+
+ ConnectivityListener::~ConnectivityListener() {}
+
+ void ConnectivityListener::onConnectivityStateChanged(jni::JNIEnv&, jni::jboolean connected) {
+ NetworkStatus::Set(connected ? NetworkStatus::Status::Online : NetworkStatus::Status::Offline);
+ }
+
+ jni::Class<ConnectivityListener> ConnectivityListener::javaClass;
+
+ void ConnectivityListener::registerNative(jni::JNIEnv& env) {
+ //Lookup the class
+ ConnectivityListener::javaClass = *jni::Class<ConnectivityListener>::Find(env).NewGlobalRef(env).release();
+
+ #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod<decltype(MethodPtr), (MethodPtr)>(name)
+
+ //Register the peer
+ jni::RegisterNativePeer<ConnectivityListener>(
+ env,
+ ConnectivityListener::javaClass,
+ "nativePtr",
+ std::make_unique<ConnectivityListener, JNIEnv&>,
+ "initialize",
+ "finalize",
+ METHOD(&ConnectivityListener::onConnectivityStateChanged, "nativeOnConnectivityStateChanged")
+ );
+ }
+
+} //android
+} //mbgl \ No newline at end of file
diff --git a/platform/android/src/connectivity_listener.hpp b/platform/android/src/connectivity_listener.hpp
new file mode 100644
index 0000000000..d457dcfd5a
--- /dev/null
+++ b/platform/android/src/connectivity_listener.hpp
@@ -0,0 +1,35 @@
+#pragma once
+
+#include <mbgl/util/noncopyable.hpp>
+
+#include <jni/jni.hpp>
+
+namespace mbgl {
+namespace android {
+
+class ConnectivityListener : private mbgl::util::noncopyable {
+public:
+
+ static constexpr auto Name() { return "com/mapbox/mapboxsdk/net/NativeConnectivityListener"; };
+
+ static jni::Class<ConnectivityListener> javaClass;
+
+ static void registerNative(jni::JNIEnv&);
+
+ /*
+ * Called when a Java object was created from the jvm side
+ */
+ ConnectivityListener(jni::JNIEnv&);
+
+ ~ConnectivityListener();
+
+ void onConnectivityStateChanged(jni::JNIEnv&, jni::jboolean);
+
+};
+
+} //android
+} //mbgl
+
+
+
+
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp
index 1a5efce726..d59ee1b617 100755
--- a/platform/android/src/jni.cpp
+++ b/platform/android/src/jni.cpp
@@ -11,6 +11,7 @@
#include "jni.hpp"
#include "java_types.hpp"
#include "native_map_view.hpp"
+#include "connectivity_listener.hpp"
#include "style/layers/layers.hpp"
#include "style/sources/sources.hpp"
@@ -1701,6 +1702,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
java::registerNatives(env);
registerNativeLayers(env);
registerNativeSources(env);
+ ConnectivityListener::registerNative(env);
latLngClass = &jni::FindClass(env, "com/mapbox/mapboxsdk/geometry/LatLng");
latLngClass = jni::NewGlobalRef(env, latLngClass).release();