summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java412
1 files changed, 0 insertions, 412 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java
deleted file mode 100644
index 07e5b7e16d..0000000000
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java
+++ /dev/null
@@ -1,412 +0,0 @@
-package com.mapbox.mapboxsdk.storage;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.os.AsyncTask;
-import android.os.Environment;
-import android.support.annotation.Keep;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.UiThread;
-import com.mapbox.mapboxsdk.MapStrictMode;
-import com.mapbox.mapboxsdk.Mapbox;
-import com.mapbox.mapboxsdk.constants.MapboxConstants;
-import com.mapbox.mapboxsdk.log.Logger;
-import com.mapbox.mapboxsdk.utils.FileUtils;
-import com.mapbox.mapboxsdk.utils.ThreadUtils;
-
-import java.io.File;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * Holds a central reference to the core's DefaultFileSource for as long as
- * there are active mapviews / offline managers
- */
-public class FileSource {
-
- private static final String TAG = "Mbgl-FileSource";
- private static final String MAPBOX_SHARED_PREFERENCE_RESOURCES_CACHE_PATH = "fileSourceResourcesCachePath";
- private static final Lock resourcesCachePathLoaderLock = new ReentrantLock();
- private static final Lock internalCachePathLoaderLock = new ReentrantLock();
- @Nullable
- private static String resourcesCachePath;
- private static String internalCachePath;
-
- /**
- * This callback allows implementors to transform URLs before they are requested
- * from the internet. This can be used add or remove custom parameters, or reroute
- * certain requests to other servers or endpoints.
- */
- @Keep
- public interface ResourceTransformCallback {
-
- /**
- * Called whenever a URL needs to be transformed.
- *
- * @param kind the kind of URL to be transformed.
- * @param url the URL to be transformed
- * @return a URL that will now be downloaded.
- */
- String onURL(@Resource.Kind int kind, String url);
-
- }
-
- /**
- * This callback receives an asynchronous response containing the new path of the
- * resources cache database.
- */
- @Keep
- public interface ResourcesCachePathChangeCallback {
-
- /**
- * Receives the new database path
- *
- * @param path the path of the current resources cache database
- */
- void onSuccess(@NonNull String path);
-
- /**
- * Receives an error message if setting the path was not successful
- *
- * @param message the error message
- */
- void onError(@NonNull String message);
-
- }
-
- // File source instance is kept alive after initialization
- private static FileSource INSTANCE;
-
- /**
- * Get the single instance of FileSource.
- *
- * @param context the context to derive the cache path from
- * @return the single instance of FileSource
- */
- @UiThread
- public static synchronized FileSource getInstance(@NonNull Context context) {
- if (INSTANCE == null) {
- INSTANCE = new FileSource(getResourcesCachePath(context));
- }
-
- return INSTANCE;
- }
-
- /**
- * Get files directory path for a context.
- *
- * @param context the context to derive the files directory path from
- * @return the files directory path
- */
- @NonNull
- private static String getCachePath(@NonNull Context context) {
- SharedPreferences preferences = context.getSharedPreferences(
- MapboxConstants.MAPBOX_SHARED_PREFERENCES, Context.MODE_PRIVATE);
- String cachePath = preferences.getString(MAPBOX_SHARED_PREFERENCE_RESOURCES_CACHE_PATH, null);
-
- if (!isPathWritable(cachePath)) {
- // Use default path
- cachePath = getDefaultCachePath(context);
-
- // Reset stored cache path
- SharedPreferences.Editor editor =
- context.getSharedPreferences(MapboxConstants.MAPBOX_SHARED_PREFERENCES, Context.MODE_PRIVATE).edit();
- editor.remove(MAPBOX_SHARED_PREFERENCE_RESOURCES_CACHE_PATH).apply();
- }
-
- return cachePath;
- }
-
- /**
- * Get the default resources cache path depending on the external storage configuration
- *
- * @param context the context to derive the files directory path from
- * @return the default directory path
- */
- @NonNull
- private static String getDefaultCachePath(@NonNull Context context) {
- if (isExternalStorageConfiguration(context) && isExternalStorageReadable()) {
- File externalFilesDir = context.getExternalFilesDir(null);
- if (externalFilesDir != null) {
- return externalFilesDir.getAbsolutePath();
- }
- }
- return context.getFilesDir().getAbsolutePath();
- }
-
- private static boolean isExternalStorageConfiguration(@NonNull Context context) {
- // Default value
- boolean isExternalStorageConfiguration = 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);
- if (appInfo.metaData != null) {
- isExternalStorageConfiguration = appInfo.metaData.getBoolean(
- MapboxConstants.KEY_META_DATA_SET_STORAGE_EXTERNAL,
- MapboxConstants.DEFAULT_SET_STORAGE_EXTERNAL
- );
- }
- } catch (PackageManager.NameNotFoundException exception) {
- Logger.e(TAG, "Failed to read the package metadata: ", exception);
- MapStrictMode.strictModeViolation(exception);
- } catch (Exception exception) {
- Logger.e(TAG, "Failed to read the storage key: ", exception);
- MapStrictMode.strictModeViolation(exception);
- }
- return isExternalStorageConfiguration;
- }
-
- /**
- * 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;
- }
-
- Logger.w(TAG, "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;
- }
-
- /**
- * Initializes file directories paths.
- *
- * @param context the context to derive paths from
- */
- @UiThread
- public static void initializeFileDirsPaths(Context context) {
- ThreadUtils.checkThread(TAG);
- lockPathLoaders();
- if (resourcesCachePath == null || internalCachePath == null) {
- new FileDirsPathsTask().execute(context);
- }
- }
-
- private static class FileDirsPathsTask extends AsyncTask<Context, Void, String[]> {
-
- @Override
- protected void onCancelled() {
- unlockPathLoaders();
- }
-
- @NonNull
- @Override
- protected String[] doInBackground(Context... contexts) {
- return new String[] {
- getCachePath(contexts[0]),
- contexts[0].getCacheDir().getAbsolutePath()
- };
- }
-
- @Override
- protected void onPostExecute(String[] paths) {
- resourcesCachePath = paths[0];
- internalCachePath = paths[1];
- unlockPathLoaders();
- }
- }
-
- /**
- * Get files directory path for a context.
- *
- * @param context the context to derive the files directory path from
- * @return the files directory path
- */
- @NonNull
- public static String getResourcesCachePath(@NonNull Context context) {
- resourcesCachePathLoaderLock.lock();
- try {
- if (resourcesCachePath == null) {
- resourcesCachePath = getCachePath(context);
- }
- return resourcesCachePath;
- } finally {
- resourcesCachePathLoaderLock.unlock();
- }
- }
-
- /**
- * Get internal cache path for a context.
- *
- * @param context the context to derive the internal cache path from
- * @return the internal cache path
- */
- public static String getInternalCachePath(@NonNull Context context) {
- internalCachePathLoaderLock.lock();
- try {
- if (internalCachePath == null) {
- internalCachePath = context.getCacheDir().getAbsolutePath();
- }
- return internalCachePath;
- } finally {
- internalCachePathLoaderLock.unlock();
- }
- }
-
- /**
- * Changes the path of the resources cache database.
- * Note that the external storage setting needs to be activated in the manifest.
- * <p>
- * The callback reference is <b>strongly kept</b> throughout the process,
- * so it needs to be wrapped in a weak reference or released on the client side if necessary.
- *
- * @param context the context of the path
- * @param path the new database path
- * @param callback the callback to obtain the result
- * @deprecated Use {@link #setResourcesCachePath(String, ResourcesCachePathChangeCallback)}
- */
- @Deprecated
- public static void setResourcesCachePath(@NonNull final Context context,
- @NonNull final String path,
- @NonNull final ResourcesCachePathChangeCallback callback) {
- setResourcesCachePath(path, callback);
- }
-
- /**
- * Changes the path of the resources cache database.
- * Note that the external storage setting needs to be activated in the manifest.
- * <p>
- * The callback reference is <b>strongly kept</b> throughout the process,
- * so it needs to be wrapped in a weak reference or released on the client side if necessary.
- *
- * @param path the new database path
- * @param callback the callback to obtain the result
- */
- public static void setResourcesCachePath(@NonNull final String path,
- @NonNull final ResourcesCachePathChangeCallback callback) {
- final Context applicationContext = Mapbox.getApplicationContext();
- final FileSource fileSource = FileSource.getInstance(applicationContext);
-
- if (fileSource.isActivated()) {
- String fileSourceActivatedMessage = "Cannot set path, file source is activated."
- + " Make sure that the map or a resources download is not running.";
- Logger.w(TAG, fileSourceActivatedMessage);
- callback.onError(fileSourceActivatedMessage);
- } else if (path.equals(getResourcesCachePath(applicationContext))) {
- // no need to change the path
- callback.onSuccess(path);
- } else {
- new FileUtils.CheckFileWritePermissionTask(new FileUtils.OnCheckFileWritePermissionListener() {
- @Override
- public void onWritePermissionGranted() {
- final SharedPreferences.Editor editor =
- applicationContext.getSharedPreferences(MapboxConstants.MAPBOX_SHARED_PREFERENCES,
- Context.MODE_PRIVATE).edit();
- editor.putString(MAPBOX_SHARED_PREFERENCE_RESOURCES_CACHE_PATH, path);
- editor.apply();
- internalSetResourcesCachePath(applicationContext, path, callback);
- }
-
- @Override
- public void onError() {
- String message = "Path is not writable: " + path;
- Logger.e(TAG, message);
- callback.onError(message);
- }
- }).execute(new File(path));
- }
- }
-
- private static void internalSetResourcesCachePath(@NonNull Context context, @NonNull String path,
- @NonNull final ResourcesCachePathChangeCallback callback) {
- final FileSource fileSource = getInstance(context);
- fileSource.setResourceCachePath(path, new ResourcesCachePathChangeCallback() {
- @Override
- public void onSuccess(@NonNull String path) {
- fileSource.deactivate();
- resourcesCachePathLoaderLock.lock();
- resourcesCachePath = path;
- resourcesCachePathLoaderLock.unlock();
- callback.onSuccess(path);
- }
-
- @Override
- public void onError(@NonNull String message) {
- fileSource.deactivate();
- callback.onError(message);
- }
- });
- fileSource.activate();
- }
-
- private static boolean isPathWritable(String path) {
- if (path == null || path.isEmpty()) {
- return false;
- }
- return new File(path).canWrite();
- }
-
- private static void lockPathLoaders() {
- internalCachePathLoaderLock.lock();
- resourcesCachePathLoaderLock.lock();
- }
-
- private static void unlockPathLoaders() {
- resourcesCachePathLoaderLock.unlock();
- internalCachePathLoaderLock.unlock();
- }
-
- @Keep
- private long nativePtr;
-
- private FileSource(String cachePath) {
- initialize(Mapbox.getAccessToken(), cachePath);
- }
-
- @Keep
- public native boolean isActivated();
-
- @Keep
- public native void activate();
-
- @Keep
- public native void deactivate();
-
- @Keep
- public native void setAccessToken(String accessToken);
-
- @NonNull
- @Keep
- public native String getAccessToken();
-
- @Keep
- public native void setApiBaseUrl(String baseUrl);
-
- /**
- * Sets a callback for transforming URLs requested from the internet
- * <p>
- * The callback will be executed on the main thread once for every requested URL.
- * </p>
- *
- * @param callback the callback to be invoked or null to reset
- */
- @Keep
- public native void setResourceTransform(final ResourceTransformCallback callback);
-
- @Keep
- private native void setResourceCachePath(String path, ResourcesCachePathChangeCallback callback);
-
- @Keep
- private native void initialize(String accessToken, String cachePath);
-
- @Override
- @Keep
- protected native void finalize() throws Throwable;
-
-}