From 20bff0bf8aceaee1e0ef95315230e74eacc72cd0 Mon Sep 17 00:00:00 2001 From: tobrun Date: Thu, 20 Dec 2018 12:56:08 +0100 Subject: [android] - make library loader modular --- .../java/com/mapbox/mapboxsdk/LibraryLoader.java | 102 +++++++++++---------- .../src/main/java/com/mapbox/mapboxsdk/Mapbox.java | 56 ++++++++++- .../java/com/mapbox/mapboxsdk/ModuleProvider.java | 6 ++ .../com/mapbox/mapboxsdk/ModuleProviderImpl.java | 23 ----- .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 6 +- .../mapboxsdk/module/ModuleProviderImpl.java | 33 +++++++ .../mapboxsdk/module/loader/LibraryLoaderImpl.java | 38 ++++++++ .../mapboxsdk/net/NativeConnectivityListener.java | 6 +- .../mapbox/mapboxsdk/offline/OfflineManager.java | 5 +- .../mapbox/mapboxsdk/offline/OfflineRegion.java | 5 +- 10 files changed, 203 insertions(+), 77 deletions(-) delete mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/ModuleProviderImpl.java create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/ModuleProviderImpl.java create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/loader/LibraryLoaderImpl.java diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/LibraryLoader.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/LibraryLoader.java index fb0904f051..d1db94f53a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/LibraryLoader.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/LibraryLoader.java @@ -1,52 +1,58 @@ package com.mapbox.mapboxsdk; -import com.mapbox.mapboxsdk.log.Logger; - -/** - * Loads the mapbox-gl shared library - *

- * By default uses the {@link System#loadLibrary(String)}, - * use {@link #setLibraryLoader(LibraryLoader)} to provide an alternative library loading hook. - *

- */ -public abstract class LibraryLoader { - - private static final String TAG = "Mbgl-LibraryLoader"; - - private static final LibraryLoader DEFAULT = new LibraryLoader() { - @Override - public void load(String name) { - System.loadLibrary(name); - } - }; - - private static volatile LibraryLoader loader = DEFAULT; - - /** - * Set the library loader that loads the shared library. - * - * @param libraryLoader the library loader - */ - public static void setLibraryLoader(LibraryLoader libraryLoader) { - loader = libraryLoader; - } - - /** - * Loads "libmapbox-gl.so" native shared library. - *

- * Catches UnsatisfiedLinkErrors and prints a warning to logcat. - *

- */ - public static void load() { - try { - loader.load("mapbox-gl"); - } catch (UnsatisfiedLinkError error) { - String message = "Failed to load native shared library."; - Logger.e(TAG, message, error); - MapStrictMode.strictModeViolation(message, error); - } - } - - public abstract void load(String name); + +public interface LibraryLoader { + + void load(); + } + + + +// +///** + + +// +//public abstract class LibraryLoader { +// +// private static final String TAG = "Mbgl-LibraryLoader"; +// +// private static final LibraryLoader DEFAULT = new LibraryLoader() { +// @Override +// public void load(String name) { +// System.loadLibrary(name); +// } +// }; +// +// private static volatile LibraryLoader loader = DEFAULT; +// +// /** +// * Set the library loader that loads the shared library. +// * +// * @param libraryLoader the library loader +// */ +// public static void setLibraryLoader(LibraryLoader libraryLoader) { +// loader = libraryLoader; +// } +// +// /** +// * Loads "libmapbox-gl.so" native shared library. +// *

+// * Catches UnsatisfiedLinkErrors and prints a warning to logcat. +// *

+// */ +// public static void load() { +// try { +// loader.load("mapbox-gl"); +// } catch (UnsatisfiedLinkError error) { +// String message = "Failed to load native shared library."; +// Logger.e(TAG, message, error); +// MapStrictMode.strictModeViolation(message, error); +// } +// } +// +// public abstract void load(String name); +//} +// diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java index b761c85e1c..9c4752b030 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java @@ -10,6 +10,7 @@ import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.exceptions.MapboxConfigurationException; import com.mapbox.mapboxsdk.log.Logger; import com.mapbox.mapboxsdk.maps.TelemetryDefinition; +import com.mapbox.mapboxsdk.module.ModuleProviderImpl; import com.mapbox.mapboxsdk.net.ConnectivityReceiver; import com.mapbox.mapboxsdk.storage.FileSource; import com.mapbox.mapboxsdk.utils.ThreadUtils; @@ -35,6 +36,8 @@ public final class Mapbox { private String accessToken; @Nullable private TelemetryDefinition telemetry; + @Nullable + private LibraryLoader libraryLoader; /** * Get an instance of Mapbox. @@ -49,14 +52,33 @@ public final class Mapbox { @UiThread @NonNull public static synchronized Mapbox getInstance(@NonNull Context context, @Nullable String accessToken) { + return getInstance(context, accessToken, null); + } + + /** + * Get an instance of Mapbox. + *

+ * This class manages the Mapbox access token, application context, and connectivity state. + *

+ * + * @param context Android context which holds or is an application context + * @param accessToken Mapbox access token + * @param libraryLoader Library loader used to load the native library + * @return the single instance of Mapbox + */ + @UiThread + @NonNull + public static synchronized Mapbox getInstance(@NonNull Context context, @Nullable String accessToken, + @Nullable LibraryLoader libraryLoader) { ThreadUtils.checkThread("Mapbox"); if (INSTANCE == null) { Context appContext = context.getApplicationContext(); - FileSource.initializeFileDirsPaths(appContext); INSTANCE = new Mapbox(appContext, accessToken); + initializeLibraryLoader(libraryLoader); if (isAccessTokenValid(accessToken)) { initializeTelemetry(); } + FileSource.initializeFileDirsPaths(appContext); ConnectivityReceiver.instance(appContext); } return INSTANCE; @@ -145,7 +167,36 @@ public final class Mapbox { } /** - * Get the module provider + * Initializes library loader. + * + * @param libraryLoader the library loader used to load native libraries + */ + private static void initializeLibraryLoader(LibraryLoader libraryLoader) { + if (libraryLoader != null) { + INSTANCE.libraryLoader = libraryLoader; + } else { + try { + INSTANCE.libraryLoader = getModuleProvider().obtainLibraryLoader(); + } catch (Exception exception) { + String message = "Error occurred while initializing library loader"; + Logger.e(TAG, message, exception); + MapStrictMode.strictModeViolation(message, exception); + } + } + } + + /** + * Get an instance of LibraryLoader if initialised. + * + * @return library loader used to load native libraries + */ + public static LibraryLoader getLibraryLoader() { + return INSTANCE.libraryLoader; + } + + + /** + * Get the module provider, internal use only * * @return moduleProvider */ @@ -157,6 +208,7 @@ public final class Mapbox { return moduleProvider; } + /** * Runtime validation of Mapbox creation. */ diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/ModuleProvider.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/ModuleProvider.java index 12a10cd86e..f1cc1f1ab5 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/ModuleProvider.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/ModuleProvider.java @@ -26,4 +26,10 @@ public interface ModuleProvider { @Nullable TelemetryDefinition obtainTelemetry(); + /** + * Get the concrete implementation of LibraryLoader + */ + @Nullable + LibraryLoader obtainLibraryLoader(); + } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/ModuleProviderImpl.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/ModuleProviderImpl.java deleted file mode 100644 index c64e91767c..0000000000 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/ModuleProviderImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.mapbox.mapboxsdk; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import com.mapbox.mapboxsdk.http.HttpRequest; -import com.mapbox.mapboxsdk.maps.TelemetryDefinition; -import com.mapbox.mapboxsdk.module.http.HttpRequestImpl; -import com.mapbox.mapboxsdk.module.telemetry.TelemetryImpl; - -public class ModuleProviderImpl implements ModuleProvider { - - @Override - @NonNull - public HttpRequest createHttpRequest() { - return new HttpRequestImpl(); - } - - @Override - @Nullable - public TelemetryDefinition obtainTelemetry() { - return new TelemetryImpl(); - } -} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 33d8a4881a..ac27ac9c0c 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -17,6 +17,7 @@ import com.mapbox.geojson.Feature; import com.mapbox.geojson.Geometry; import com.mapbox.mapboxsdk.LibraryLoader; import com.mapbox.mapboxsdk.MapStrictMode; +import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.annotations.Icon; import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.Polygon; @@ -81,7 +82,10 @@ final class NativeMapView { private MapboxMap.SnapshotReadyCallback snapshotReadyCallback; static { - LibraryLoader.load(); + LibraryLoader libraryLoader = Mapbox.getLibraryLoader(); + if (libraryLoader != null) { + libraryLoader.load(); + } } // diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/ModuleProviderImpl.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/ModuleProviderImpl.java new file mode 100644 index 0000000000..52f3ca163b --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/ModuleProviderImpl.java @@ -0,0 +1,33 @@ +package com.mapbox.mapboxsdk.module; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.mapbox.mapboxsdk.LibraryLoader; +import com.mapbox.mapboxsdk.ModuleProvider; +import com.mapbox.mapboxsdk.http.HttpRequest; +import com.mapbox.mapboxsdk.maps.TelemetryDefinition; +import com.mapbox.mapboxsdk.module.http.HttpRequestImpl; +import com.mapbox.mapboxsdk.module.loader.LibraryLoaderImpl; +import com.mapbox.mapboxsdk.module.telemetry.TelemetryImpl; + +public class ModuleProviderImpl implements ModuleProvider { + + @Override + @NonNull + public HttpRequest createHttpRequest() { + return new HttpRequestImpl(); + } + + @Override + @Nullable + public TelemetryDefinition obtainTelemetry() { + return new TelemetryImpl(); + } + + @Nullable + @Override + public LibraryLoader obtainLibraryLoader() { + return new LibraryLoaderImpl(); + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/loader/LibraryLoaderImpl.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/loader/LibraryLoaderImpl.java new file mode 100644 index 0000000000..e376f2aca1 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/loader/LibraryLoaderImpl.java @@ -0,0 +1,38 @@ +package com.mapbox.mapboxsdk.module.loader; + +import android.content.Context; + +import com.mapbox.mapboxsdk.LibraryLoader; +import com.mapbox.mapboxsdk.MapStrictMode; +import com.mapbox.mapboxsdk.log.Logger; + +import static android.content.ContentValues.TAG; + +/** + * Loads the mapbox-gl shared library + *

+ * By default uses the {@link System#loadLibrary(String)}, + * use {@link com.mapbox.mapboxsdk.Mapbox#getInstance(Context, String, LibraryLoader)} to provide an alternative + * library loading hook. + *

+ */ +public class LibraryLoaderImpl implements LibraryLoader { + + private boolean loaded; + + @Override + public void load() { + if (loaded) { + return; + } + + try { + System.loadLibrary("mapbox-gl"); + loaded = true; + } catch (UnsatisfiedLinkError error) { + String message = "Failed to load native shared library."; + Logger.e(TAG, message, error); + MapStrictMode.strictModeViolation(message, error); + } + } +} \ No newline at end of file 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 index 491013e874..73b8cd2d4c 100644 --- 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 @@ -3,6 +3,7 @@ package com.mapbox.mapboxsdk.net; import android.support.annotation.Keep; import com.mapbox.mapboxsdk.LibraryLoader; +import com.mapbox.mapboxsdk.Mapbox; /** * Updates the native library's connectivity state @@ -10,7 +11,10 @@ import com.mapbox.mapboxsdk.LibraryLoader; class NativeConnectivityListener implements ConnectivityListener { static { - LibraryLoader.load(); + LibraryLoader libraryLoader = Mapbox.getLibraryLoader(); + if (libraryLoader != null) { + libraryLoader.load(); + } } @Keep diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineManager.java index 6731efd4b8..50cafb14b0 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineManager.java @@ -39,7 +39,10 @@ public class OfflineManager { // static { - LibraryLoader.load(); + LibraryLoader libraryLoader = Mapbox.getLibraryLoader(); + if (libraryLoader != null) { + libraryLoader.load(); + } } // Native peer pointer diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java index 7bcc6ad234..96963bd689 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java @@ -25,7 +25,10 @@ public class OfflineRegion { // static { - LibraryLoader.load(); + LibraryLoader libraryLoader = Mapbox.getLibraryLoader(); + if (libraryLoader != null) { + libraryLoader.load(); + } } // Members -- cgit v1.2.1