From 9f1ffdd3e04e7334271a12ab493618f1c38f555a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Fri, 17 Feb 2017 15:49:33 +0100 Subject: [android] change Mapbox#getInstance to Mapbox#initialize and disallow duplicate initialization --- .../src/main/java/com/mapbox/mapboxsdk/Mapbox.java | 28 +++++++++++----------- .../DuplicateInitializationException.java | 20 ++++++++++++++++ .../exceptions/InvalidAccessTokenException.java | 2 +- .../mapboxsdk/testapp/MapboxApplication.java | 2 +- .../testapp/activity/offline/OfflineActivity.java | 2 +- .../com/mapbox/weartestapp/MapboxApplication.java | 2 +- 6 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/exceptions/DuplicateInitializationException.java 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 f954073974..ead83fe1f2 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 @@ -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.DuplicateInitializationException; import com.mapbox.mapboxsdk.location.LocationSource; import com.mapbox.mapboxsdk.net.ConnectivityReceiver; import com.mapbox.services.android.telemetry.MapboxTelemetry; @@ -22,25 +23,26 @@ public final class Mapbox { private Boolean connected; /** - * Get an instance of Mapbox. + * Initialize the Mapbox object. *

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

* * @param context Android context which holds or is an application context * @param accessToken Mapbox access token - * @return the single instance of Mapbox */ - public static synchronized Mapbox getInstance(@NonNull Context context, @NonNull String accessToken) { - if (INSTANCE == null) { - Context appContext = context.getApplicationContext(); - INSTANCE = new Mapbox(appContext, accessToken); - LocationEngine locationEngine = new LocationSource(appContext); - locationEngine.setPriority(LocationEnginePriority.NO_POWER); - MapboxTelemetry.getInstance().initialize(appContext, accessToken, locationEngine); - ConnectivityReceiver.instance(appContext); + public static void initialize(@NonNull Context context, @NonNull String accessToken) { + if (INSTANCE != null) { + throw new DuplicateInitializationException(); } - return INSTANCE; + + validateAccessToken(accessToken); + Context appContext = context.getApplicationContext(); + INSTANCE = new Mapbox(appContext, accessToken); + LocationEngine locationEngine = new LocationSource(appContext); + locationEngine.setPriority(LocationEnginePriority.NO_POWER); + MapboxTelemetry.getInstance().initialize(appContext, accessToken, locationEngine); + ConnectivityReceiver.instance(appContext); } private Mapbox(@NonNull Context context, @NonNull String accessToken) { @@ -54,7 +56,6 @@ public final class Mapbox { * @return Mapbox Access Token */ public static String getAccessToken() { - validateAccessToken(); return INSTANCE.accessToken; } @@ -63,8 +64,7 @@ public final class Mapbox { * * @throws InvalidAccessTokenException exception thrown when not using a valid accessToken */ - private static void validateAccessToken() throws InvalidAccessTokenException { - String accessToken = INSTANCE.accessToken; + public static void validateAccessToken(String accessToken) throws InvalidAccessTokenException { if (TextUtils.isEmpty(accessToken) || (!accessToken.toLowerCase(MapboxConstants.MAPBOX_LOCALE).startsWith("pk.") && !accessToken.toLowerCase(MapboxConstants.MAPBOX_LOCALE).startsWith("sk."))) { throw new InvalidAccessTokenException(); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/exceptions/DuplicateInitializationException.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/exceptions/DuplicateInitializationException.java new file mode 100644 index 0000000000..3cedf1ade8 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/exceptions/DuplicateInitializationException.java @@ -0,0 +1,20 @@ +package com.mapbox.mapboxsdk.exceptions; + +import android.content.Context; +import android.os.Bundle; + +import com.mapbox.mapboxsdk.maps.MapView; + +/** + * A {@code DuplicateInitializationException} is thrown by {@link com.mapbox.mapboxsdk.Mapbox} + * when the global Mapbox singleton has been initialized already + * + * @see MapView#onCreate(Bundle) + * @see com.mapbox.mapboxsdk.Mapbox#getInstance(Context, String) + */ +public class DuplicateInitializationException extends RuntimeException { + + public DuplicateInitializationException() { + super("Mapbox singleton can only be initialized once"); + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/exceptions/InvalidAccessTokenException.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/exceptions/InvalidAccessTokenException.java index 95851fc1d2..f05d69d7bc 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/exceptions/InvalidAccessTokenException.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/exceptions/InvalidAccessTokenException.java @@ -16,7 +16,7 @@ import com.mapbox.mapboxsdk.maps.MapView; public class InvalidAccessTokenException extends RuntimeException { public InvalidAccessTokenException() { - super("\nUsing MapView requires setting a valid access token. Use Mapbox.getInstance(Context context, " + super("\nUsing MapView requires setting a valid access token. Use Mapbox.initialize(Context context, " + "String accessToken) to provide one. " + "\nPlease see https://www.mapbox.com/help/create-api-access-token/ to learn how to create one." + "\nMore information in this guide https://www.mapbox.com/help/first-steps-android-sdk/#access-tokens."); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MapboxApplication.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MapboxApplication.java index a10c6eaad3..5c0ea017bb 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MapboxApplication.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MapboxApplication.java @@ -37,7 +37,7 @@ public class MapboxApplication extends Application { .penaltyDeath() .build()); - Mapbox.getInstance(getApplicationContext(), getString(R.string.mapbox_access_token)); + Mapbox.initialize(getApplicationContext(), getString(R.string.mapbox_access_token)); } private void initializeLogger() { diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java index c2b0cb0769..408c534ab5 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java @@ -67,7 +67,7 @@ public class OfflineActivity extends AppCompatActivity // You can use Mapbox.setConnected(Boolean) to manually set the connectivity // state of your app. This will override any checks performed via the ConnectivityManager. - // Mapbox.getInstance().setConnected(false); + // Mapbox.setConnected(false); Boolean connected = Mapbox.isConnected(); Timber.d(String.format(MapboxConstants.MAPBOX_LOCALE, "Mapbox is connected: %b", connected)); diff --git a/platform/android/MapboxGLAndroidSDKWearTestApp/src/main/java/com/mapbox/weartestapp/MapboxApplication.java b/platform/android/MapboxGLAndroidSDKWearTestApp/src/main/java/com/mapbox/weartestapp/MapboxApplication.java index cbbdcb8493..564bc62442 100644 --- a/platform/android/MapboxGLAndroidSDKWearTestApp/src/main/java/com/mapbox/weartestapp/MapboxApplication.java +++ b/platform/android/MapboxGLAndroidSDKWearTestApp/src/main/java/com/mapbox/weartestapp/MapboxApplication.java @@ -11,7 +11,7 @@ public class MapboxApplication extends Application { @Override public void onCreate() { super.onCreate(); - Mapbox.getInstance(getApplicationContext(), getString(R.string.mapbox_access_token)); + Mapbox.initialize(getApplicationContext(), getString(R.string.mapbox_access_token)); LeakCanary.install(this); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() -- cgit v1.2.1