diff options
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.java | 108 |
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; + } +} |