From ba73e507b845764f21228e023df111cddc9f7518 Mon Sep 17 00:00:00 2001 From: Guardiola31337 Date: Mon, 6 May 2019 11:28:03 -0400 Subject: [android] convert context and resources cache path change callback from FileSource#setResourcesCachePath and offline manager from CopyTempDatabaseFileTask into hard references --- .../mapbox/mapboxsdk/offline/OfflineManager.java | 62 +++++++++++----------- .../com/mapbox/mapboxsdk/storage/FileSource.java | 11 +--- 2 files changed, 33 insertions(+), 40 deletions(-) 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 5808411d43..2be5418f1f 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 @@ -7,6 +7,7 @@ import android.os.Handler; import android.os.Looper; import android.support.annotation.Keep; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.mapbox.mapboxsdk.LibraryLoader; import com.mapbox.mapboxsdk.Mapbox; @@ -21,7 +22,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.lang.ref.WeakReference; import java.nio.channels.FileChannel; /** @@ -227,42 +227,43 @@ public class OfflineManager { final File src = new File(path); final FileUtils.OnCheckFileReadPermissionListener fileReadPermissionListener = new FileUtils.OnCheckFileReadPermissionListener() { - @Override - public void onReadPermissionGranted() { - new FileUtils.CheckFileWritePermissionTask(new FileUtils.OnCheckFileWritePermissionListener() { - @Override - public void onWritePermissionGranted() { - // path writable, merge and update schema in place if necessary - mergeOfflineDatabaseFiles(src, callback, false); - } - - @Override - public void onError() { - // path not writable, copy the the file to temp directory, then merge and update schema on a copy if - // necessary - File dst = new File(FileSource.getInternalCachePath(context), src.getName()); - new CopyTempDatabaseFileTask(OfflineManager.this, callback).execute(src, dst); - } - }).execute(src); - } + @Override + public void onReadPermissionGranted() { + new FileUtils.CheckFileWritePermissionTask(new FileUtils.OnCheckFileWritePermissionListener() { + @Override + public void onWritePermissionGranted() { + // path writable, merge and update schema in place if necessary + mergeOfflineDatabaseFiles(src, callback, false); + } - @Override - public void onError() { - // path not readable, abort - callback.onError("Secondary database needs to be located in a readable path."); - } - }; + @Override + public void onError() { + // path not writable, copy the the file to temp directory, then merge and update schema on a copy if + // necessary + File dst = new File(FileSource.getInternalCachePath(context), src.getName()); + new CopyTempDatabaseFileTask(OfflineManager.this, callback).execute(src, dst); + } + }).execute(src); + } + + @Override + public void onError() { + // path not readable, abort + callback.onError("Secondary database needs to be located in a readable path."); + } + }; new FileUtils.CheckFileReadPermissionTask(fileReadPermissionListener).execute(src); } private static final class CopyTempDatabaseFileTask extends AsyncTask { + // Safe to retain as it enforces only retaining the Application context @NonNull - private final WeakReference offlineManagerWeakReference; - @NonNull + private final OfflineManager offlineManager; + @Nullable private MergeOfflineRegionsCallback callback; - CopyTempDatabaseFileTask(OfflineManager offlineManager, MergeOfflineRegionsCallback callback) { - this.offlineManagerWeakReference = new WeakReference<>(offlineManager); + CopyTempDatabaseFileTask(@NonNull OfflineManager offlineManager, @Nullable MergeOfflineRegionsCallback callback) { + this.offlineManager = offlineManager; this.callback = callback; } @@ -283,8 +284,7 @@ public class OfflineManager { protected void onPostExecute(Object object) { MergeOfflineRegionsCallback localCallback = callback; callback = null; - OfflineManager offlineManager = offlineManagerWeakReference.get(); - if (object instanceof File && offlineManager != null) { + if (object instanceof File) { // successfully copied the file, perform merge File dst = (File) object; offlineManager.mergeOfflineDatabaseFiles(dst, localCallback, true); 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 index cc4988b549..82bd3b5f19 100644 --- 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 @@ -20,7 +20,6 @@ import com.mapbox.mapboxsdk.utils.FileUtils; import com.mapbox.mapboxsdk.utils.ThreadUtils; import java.io.File; -import java.lang.ref.WeakReference; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -270,9 +269,9 @@ public class FileSource { * @param path the new database path * @param callback the callback to obtain the result */ - public static void setResourcesCachePath(@NonNull Context context, + public static void setResourcesCachePath(final Context context, @NonNull final String path, - @NonNull ResourcesCachePathChangeCallback callback) { + final ResourcesCachePathChangeCallback callback) { final String fileSourceActivatedMessage = "Cannot set path, file source is activated." + " Make sure that the map or a resources download is not running."; if (getInstance(context).isActivated()) { @@ -282,14 +281,9 @@ public class FileSource { // no need to change the path callback.onSuccess(path); } else { - final WeakReference contextWeakReference = new WeakReference<>(context); - final WeakReference callbackWeakReference = new WeakReference<>(callback); new FileUtils.CheckFileWritePermissionTask(new FileUtils.OnCheckFileWritePermissionListener() { @Override public void onWritePermissionGranted() { - final Context context = contextWeakReference.get(); - final ResourcesCachePathChangeCallback callback = callbackWeakReference.get(); - if (callback == null) { Logger.w(TAG, "Lost callback reference."); return; @@ -316,7 +310,6 @@ public class FileSource { @Override public void onError() { - final ResourcesCachePathChangeCallback callback = callbackWeakReference.get(); if (callback != null) { String message = "Path is not writable: " + path; Logger.e(TAG, message); -- cgit v1.2.1