diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index fdac76b551c9..bd55c5f3deeb 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.0+20 + +* Android: Migrated information cache methods to use instance methods. + ## 0.6.0+19 * Android: Fix memory leak due not unregistering ActivityLifecycleCallbacks. diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java index 0f4e97681a1a..c189b35a5491 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java @@ -4,7 +4,6 @@ package io.flutter.plugins.imagepicker; -import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; @@ -34,16 +33,13 @@ class ImagePickerCache { "flutter_image_picker_pending_image_uri"; private static final String SHARED_PREFERENCES_NAME = "flutter_image_picker_shared_preference"; - private static SharedPreferences getFilePref; + private SharedPreferences prefs; - static void setUpWithActivity(Activity activity) { - getFilePref = - activity - .getApplicationContext() - .getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); + ImagePickerCache(Context context) { + prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); } - static void saveTypeWithMethodCallName(String methodCallName) { + void saveTypeWithMethodCallName(String methodCallName) { if (methodCallName.equals(ImagePickerPlugin.METHOD_CALL_IMAGE)) { setType("image"); } else if (methodCallName.equals(ImagePickerPlugin.METHOD_CALL_VIDEO)) { @@ -51,25 +47,20 @@ static void saveTypeWithMethodCallName(String methodCallName) { } } - private static void setType(String type) { - if (getFilePref == null) { - return; - } - getFilePref.edit().putString(SHARED_PREFERENCE_TYPE_KEY, type).apply(); + private void setType(String type) { + + prefs.edit().putString(SHARED_PREFERENCE_TYPE_KEY, type).apply(); } - static void saveDemensionWithMethodCall(MethodCall methodCall) { - Double maxWidth = methodCall.argument("maxWidth"); - Double maxHeight = methodCall.argument("maxHeight"); + void saveDimensionWithMethodCall(MethodCall methodCall) { + Double maxWidth = methodCall.argument(MAP_KEY_MAX_WIDTH); + Double maxHeight = methodCall.argument(MAP_KEY_MAX_HEIGHT); setMaxDimension(maxWidth, maxHeight); } - private static void setMaxDimension(Double maxWidth, Double maxHeight) { - if (getFilePref == null) { - return; - } + private void setMaxDimension(Double maxWidth, Double maxHeight) { - SharedPreferences.Editor editor = getFilePref.edit(); + SharedPreferences.Editor editor = prefs.edit(); if (maxWidth != null) { editor.putLong(SHARED_PREFERENCE_MAX_WIDTH_KEY, Double.doubleToRawLongBits(maxWidth)); } @@ -79,29 +70,19 @@ private static void setMaxDimension(Double maxWidth, Double maxHeight) { editor.apply(); } - static void savePendingCameraMediaUriPath(Uri uri) { - if (getFilePref == null) { - return; - } - getFilePref - .edit() - .putString(SHARED_PREFERENCE_PENDING_IMAGE_URI_PATH_KEY, uri.getPath()) - .apply(); + void savePendingCameraMediaUriPath(Uri uri) { + prefs.edit().putString(SHARED_PREFERENCE_PENDING_IMAGE_URI_PATH_KEY, uri.getPath()).apply(); } - static String retrievePendingCameraMediaUriPath() { - if (getFilePref == null) { - return null; - } - return getFilePref.getString(SHARED_PREFERENCE_PENDING_IMAGE_URI_PATH_KEY, ""); + String retrievePendingCameraMediaUriPath() { + + return prefs.getString(SHARED_PREFERENCE_PENDING_IMAGE_URI_PATH_KEY, ""); } - static void saveResult( + void saveResult( @Nullable String path, @Nullable String errorCode, @Nullable String errorMessage) { - if (getFilePref == null) { - return; - } - SharedPreferences.Editor editor = getFilePref.edit(); + + SharedPreferences.Editor editor = prefs.edit(); if (path != null) { editor.putString(FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY, path); } @@ -114,50 +95,43 @@ static void saveResult( editor.apply(); } - static void clear() { - if (getFilePref == null) { - return; - } - getFilePref.edit().clear().apply(); + void clear() { + prefs.edit().clear().apply(); } - static Map getCacheMap() { - if (getFilePref == null) { - return new HashMap<>(); - } + Map getCacheMap() { + Map resultMap = new HashMap<>(); - Boolean hasData = false; + boolean hasData = false; - if (getFilePref.contains(FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY)) { - resultMap.put(MAP_KEY_PATH, getFilePref.getString(FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY, "")); + if (prefs.contains(FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY)) { + final String imagePathValue = prefs.getString(FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY, ""); + resultMap.put(MAP_KEY_PATH, imagePathValue); hasData = true; } - if (getFilePref.contains(SHARED_PREFERENCE_ERROR_CODE_KEY)) { - resultMap.put( - MAP_KEY_ERROR_CODE, getFilePref.getString(SHARED_PREFERENCE_ERROR_CODE_KEY, "")); + if (prefs.contains(SHARED_PREFERENCE_ERROR_CODE_KEY)) { + final String errorCodeValue = prefs.getString(SHARED_PREFERENCE_ERROR_CODE_KEY, ""); + resultMap.put(MAP_KEY_ERROR_CODE, errorCodeValue); hasData = true; - if (getFilePref.contains(SHARED_PREFERENCE_ERROR_MESSAGE_KEY)) { - resultMap.put( - MAP_KEY_ERROR_MESSAGE, getFilePref.getString(SHARED_PREFERENCE_ERROR_MESSAGE_KEY, "")); + if (prefs.contains(SHARED_PREFERENCE_ERROR_MESSAGE_KEY)) { + final String errorMessageValue = prefs.getString(SHARED_PREFERENCE_ERROR_MESSAGE_KEY, ""); + resultMap.put(MAP_KEY_ERROR_MESSAGE, errorMessageValue); } } if (hasData) { - if (getFilePref.contains(SHARED_PREFERENCE_TYPE_KEY)) { - resultMap.put(MAP_KEY_TYPE, getFilePref.getString(SHARED_PREFERENCE_TYPE_KEY, "")); + if (prefs.contains(SHARED_PREFERENCE_TYPE_KEY)) { + final String typeValue = prefs.getString(SHARED_PREFERENCE_TYPE_KEY, ""); + resultMap.put(MAP_KEY_TYPE, typeValue); } - - if (getFilePref.contains(SHARED_PREFERENCE_MAX_WIDTH_KEY)) { - resultMap.put( - MAP_KEY_MAX_WIDTH, - Double.longBitsToDouble(getFilePref.getLong(SHARED_PREFERENCE_MAX_WIDTH_KEY, 0))); + if (prefs.contains(SHARED_PREFERENCE_MAX_WIDTH_KEY)) { + final long maxWidthValue = prefs.getLong(SHARED_PREFERENCE_MAX_WIDTH_KEY, 0); + resultMap.put(MAP_KEY_MAX_WIDTH, Double.longBitsToDouble(maxWidthValue)); } - - if (getFilePref.contains(SHARED_PREFERENCE_MAX_HEIGHT_KEY)) { - resultMap.put( - MAP_KEY_MAX_HEIGHT, - Double.longBitsToDouble(getFilePref.getLong(SHARED_PREFERENCE_MAX_HEIGHT_KEY, 0))); + if (prefs.contains(SHARED_PREFERENCE_MAX_HEIGHT_KEY)) { + final long maxHeighValue = prefs.getLong(SHARED_PREFERENCE_MAX_HEIGHT_KEY, 0); + resultMap.put(MAP_KEY_MAX_HEIGHT, Double.longBitsToDouble(maxHeighValue)); } } diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index 2f2522f53c5c..2507904bf87d 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -80,6 +80,7 @@ public class ImagePickerDelegate private final Activity activity; private final File externalFilesDirectory; private final ImageResizer imageResizer; + private final ImagePickerCache cache; private final PermissionManager permissionManager; private final IntentResolver intentResolver; private final FileUriResolver fileUriResolver; @@ -112,13 +113,17 @@ interface OnPathReadyListener { private MethodCall methodCall; public ImagePickerDelegate( - final Activity activity, File externalFilesDirectory, ImageResizer imageResizer) { + final Activity activity, + final File externalFilesDirectory, + final ImageResizer imageResizer, + final ImagePickerCache cache) { this( activity, externalFilesDirectory, imageResizer, null, null, + cache, new PermissionManager() { @Override public boolean isPermissionGranted(String permissionName) { @@ -171,15 +176,16 @@ public void onScanCompleted(String path, Uri uri) { */ @VisibleForTesting ImagePickerDelegate( - Activity activity, - File externalFilesDirectory, - ImageResizer imageResizer, - MethodChannel.Result result, - MethodCall methodCall, - PermissionManager permissionManager, - IntentResolver intentResolver, - FileUriResolver fileUriResolver, - FileUtils fileUtils) { + final Activity activity, + final File externalFilesDirectory, + final ImageResizer imageResizer, + final MethodChannel.Result result, + final MethodCall methodCall, + final ImagePickerCache cache, + final PermissionManager permissionManager, + final IntentResolver intentResolver, + final FileUriResolver fileUriResolver, + final FileUtils fileUtils) { this.activity = activity; this.externalFilesDirectory = externalFilesDirectory; this.imageResizer = imageResizer; @@ -190,6 +196,7 @@ public void onScanCompleted(String path, Uri uri) { this.intentResolver = intentResolver; this.fileUriResolver = fileUriResolver; this.fileUtils = fileUtils; + this.cache = cache; } void saveStateBeforeResult() { @@ -197,28 +204,28 @@ void saveStateBeforeResult() { return; } - ImagePickerCache.saveTypeWithMethodCallName(methodCall.method); - ImagePickerCache.saveDemensionWithMethodCall(methodCall); + cache.saveTypeWithMethodCallName(methodCall.method); + cache.saveDimensionWithMethodCall(methodCall); if (pendingCameraMediaUri != null) { - ImagePickerCache.savePendingCameraMediaUriPath(pendingCameraMediaUri); + cache.savePendingCameraMediaUriPath(pendingCameraMediaUri); } } void retrieveLostImage(MethodChannel.Result result) { - Map resultMap = ImagePickerCache.getCacheMap(); - String path = (String) resultMap.get(ImagePickerCache.MAP_KEY_PATH); + Map resultMap = cache.getCacheMap(); + String path = (String) resultMap.get(cache.MAP_KEY_PATH); if (path != null) { - Double maxWidth = (Double) resultMap.get(ImagePickerCache.MAP_KEY_MAX_WIDTH); - Double maxHeight = (Double) resultMap.get(ImagePickerCache.MAP_KEY_MAX_HEIGHT); + Double maxWidth = (Double) resultMap.get(cache.MAP_KEY_MAX_WIDTH); + Double maxHeight = (Double) resultMap.get(cache.MAP_KEY_MAX_HEIGHT); String newPath = imageResizer.resizeImageIfNeeded(path, maxWidth, maxHeight); - resultMap.put(ImagePickerCache.MAP_KEY_PATH, newPath); + resultMap.put(cache.MAP_KEY_PATH, newPath); } if (resultMap.isEmpty()) { result.success(null); } else { result.success(resultMap); } - ImagePickerCache.clear(); + cache.clear(); } public void chooseVideoFromGallery(MethodCall methodCall, MethodChannel.Result result) { @@ -472,7 +479,7 @@ private void handleCaptureImageResult(int resultCode) { fileUriResolver.getFullImagePath( pendingCameraMediaUri != null ? pendingCameraMediaUri - : Uri.parse(ImagePickerCache.retrievePendingCameraMediaUriPath()), + : Uri.parse(cache.retrievePendingCameraMediaUriPath()), new OnPathReadyListener() { @Override public void onPathReady(String path) { @@ -491,7 +498,7 @@ private void handleCaptureVideoResult(int resultCode) { fileUriResolver.getFullImagePath( pendingCameraMediaUri != null ? pendingCameraMediaUri - : Uri.parse(ImagePickerCache.retrievePendingCameraMediaUriPath()), + : Uri.parse(cache.retrievePendingCameraMediaUriPath()), new OnPathReadyListener() { @Override public void onPathReady(String path) { @@ -536,14 +543,14 @@ private boolean setPendingMethodCallAndResult( pendingResult = result; // Clean up cache if a new image picker is launched. - ImagePickerCache.clear(); + cache.clear(); return true; } private void finishWithSuccess(String imagePath) { if (pendingResult == null) { - ImagePickerCache.saveResult(imagePath, null, null); + cache.saveResult(imagePath, null, null); return; } pendingResult.success(imagePath); @@ -556,7 +563,7 @@ private void finishWithAlreadyActiveError(MethodChannel.Result result) { private void finishWithError(String errorCode, String errorMessage) { if (pendingResult == null) { - ImagePickerCache.saveResult(null, errorCode, errorMessage); + cache.saveResult(null, errorCode, errorMessage); return; } pendingResult.error(errorCode, errorMessage, null); diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index bff7cf4b6cae..1276963623a0 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -37,7 +37,7 @@ public static void registerWith(PluginRegistry.Registrar registrar) { // we stop the registering process immediately because the ImagePicker requires an activity. return; } - ImagePickerCache.setUpWithActivity(registrar.activity()); + final ImagePickerCache cache = new ImagePickerCache(registrar.activity()); final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); @@ -46,7 +46,7 @@ public static void registerWith(PluginRegistry.Registrar registrar) { final ExifDataCopier exifDataCopier = new ExifDataCopier(); final ImageResizer imageResizer = new ImageResizer(externalFilesDirectory, exifDataCopier); final ImagePickerDelegate delegate = - new ImagePickerDelegate(registrar.activity(), externalFilesDirectory, imageResizer); + new ImagePickerDelegate(registrar.activity(), externalFilesDirectory, imageResizer, cache); registrar.addActivityResultListener(delegate); registrar.addRequestPermissionsResultListener(delegate); diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java index 02bb91b7914f..c0ccfa0dd478 100644 --- a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java @@ -35,6 +35,7 @@ public class ImagePickerDelegateTest { @Mock ImagePickerDelegate.IntentResolver mockIntentResolver; @Mock FileUtils mockFileUtils; @Mock Intent mockIntent; + @Mock ImagePickerCache cache; ImagePickerDelegate.FileUriResolver mockFileUriResolver; @@ -375,6 +376,7 @@ private ImagePickerDelegate createDelegate() { mockImageResizer, null, null, + cache, mockPermissionManager, mockIntentResolver, mockFileUriResolver, @@ -388,6 +390,7 @@ private ImagePickerDelegate createDelegateWithPendingResultAndMethodCall() { mockImageResizer, mockResult, mockMethodCall, + cache, mockPermissionManager, mockIntentResolver, mockFileUriResolver, diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index d43983ddc585..f34c6708eae0 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -6,7 +6,7 @@ authors: - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.0+19 +version: 0.6.0+20 flutter: plugin: