summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java108
1 files changed, 90 insertions, 18 deletions
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 9d20e968c8..d093a86ff0 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
@@ -1,6 +1,9 @@
package com.mapbox.mapboxsdk;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Environment;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.annotation.NonNull;
@@ -10,13 +13,20 @@ import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.exceptions.InvalidAccessTokenException;
import com.mapbox.mapboxsdk.net.ConnectivityReceiver;
import com.mapbox.mapboxsdk.telemetry.MapboxEventManager;
+import com.mapbox.mapboxsdk.storage.DefaultFileSource;
-public final class Mapbox {
+import java.io.File;
+
+import timber.log.Timber;
+public final class Mapbox {
private static Mapbox INSTANCE;
private Context context;
- private String accessToken;
private Boolean connected;
+ private DefaultFileSource fileSource;
+
+ // Default database name
+ private static final String DATABASE_NAME = "mbgl-offline.db";
/**
* Get an instance of Mapbox.
@@ -28,29 +38,27 @@ public final class Mapbox {
* @param accessToken Mapbox access token
* @return the single instance of Mapbox
*/
- public static synchronized Mapbox getInstance(@NonNull Context context, @NonNull String accessToken) {
+ public static synchronized Mapbox getInstance(@NonNull Context context,
+ @NonNull String accessToken, String apiBaseURL) {
if (INSTANCE == null) {
+ validateAccessToken(accessToken);
Context appContext = context.getApplicationContext();
- INSTANCE = new Mapbox(appContext, accessToken);
+ INSTANCE = new Mapbox(appContext, accessToken, apiBaseURL);
MapboxEventManager.getMapboxEventManager().initialize(appContext, accessToken);
ConnectivityReceiver.instance(appContext);
}
return INSTANCE;
}
- private Mapbox(@NonNull Context context, @NonNull String accessToken) {
+ private Mapbox(@NonNull Context context, @NonNull String accessToken, String apiBaseURL) {
this.context = context;
- this.accessToken = accessToken;
- }
- /**
- * Access Token for this application.
- *
- * @return Mapbox Access Token
- */
- public static String getAccessToken() {
- validateAccessToken();
- return INSTANCE.accessToken;
+ String databasePath = getDatabasePath(context) + File.separator + DATABASE_NAME;
+ this.fileSource = new DefaultFileSource(databasePath, context.getPackageCodePath());
+ this.fileSource.setAccessToken(accessToken);
+ if (apiBaseURL != null && !TextUtils.isEmpty(apiBaseURL)) {
+ this.fileSource.setAPIBaseURL(apiBaseURL);
+ }
}
/**
@@ -58,8 +66,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;
+ private static void validateAccessToken(@NonNull 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();
@@ -74,6 +81,13 @@ public final class Mapbox {
}
/**
+ * Default file source
+ */
+ public static DefaultFileSource getDefaultFileSource() {
+ return INSTANCE.fileSource;
+ }
+
+ /**
* Manually sets the connectivity state of the app. This is useful for apps that control their
* own connectivity state and want to bypass any checks to the ConnectivityManager.
*
@@ -101,4 +115,62 @@ public final class Mapbox {
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return (activeNetwork != null && activeNetwork.isConnected());
}
-} \ No newline at end of file
+
+ /**
+ * Checks if external storage is available to at least read. In order for this to work, make
+ * sure you include <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+ * (or WRITE_EXTERNAL_STORAGE) for API level < 18 in your app Manifest.
+ * <p>
+ * Code from https://developer.android.com/guide/topics/data/data-storage.html#filesExternal
+ * </p>
+ *
+ * @return true if external storage is readable
+ */
+ public static boolean isExternalStorageReadable() {
+ String state = Environment.getExternalStorageState();
+ if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
+ return true;
+ }
+
+ Timber.w("External storage was requested but it isn't readable. For API level < 18"
+ + " make sure you've requested READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE"
+ + " permissions in your app Manifest (defaulting to internal storage).");
+
+ return false;
+ }
+
+ public static String getDatabasePath(Context context) {
+ // Default value
+ boolean setStorageExternal = MapboxConstants.DEFAULT_SET_STORAGE_EXTERNAL;
+
+ try {
+ // Try getting a custom value from the app Manifest
+ ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(
+ context.getPackageName(), PackageManager.GET_META_DATA);
+ setStorageExternal = appInfo.metaData.getBoolean(
+ MapboxConstants.KEY_META_DATA_SET_STORAGE_EXTERNAL,
+ MapboxConstants.DEFAULT_SET_STORAGE_EXTERNAL);
+ } catch (PackageManager.NameNotFoundException exception) {
+ Timber.e("Failed to read the package metadata: ", exception);
+ } catch (Exception exception) {
+ Timber.e("Failed to read the storage key: ", exception);
+ }
+
+ String databasePath = null;
+ if (setStorageExternal && isExternalStorageReadable()) {
+ try {
+ // Try getting the external storage path
+ databasePath = context.getExternalFilesDir(null).getAbsolutePath();
+ } catch (NullPointerException exception) {
+ Timber.e("Failed to obtain the external storage path: ", exception);
+ }
+ }
+
+ if (databasePath == null) {
+ // Default to internal storage
+ databasePath = context.getFilesDir().getAbsolutePath();
+ }
+
+ return databasePath;
+ }
+}