diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2016-09-08 17:53:00 +0200 |
---|---|---|
committer | Ivo van Dongen <info@ivovandongen.nl> | 2016-09-23 10:47:54 +0200 |
commit | 742d6d827567608f94b0743b7bac5dbef94724e3 (patch) | |
tree | b42d617cf2e8ac60f7a91b339ef3fccccca02043 | |
parent | 3ddb8dfc86753120d2ea2c3befdf2430c1c56562 (diff) | |
download | qtlocation-mapboxgl-742d6d827567608f94b0743b7bac5dbef94724e3.tar.gz |
[android] set connectivity state pro-actively
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(); |