blob: 983dbabf66c3c13d2132dc1bbe70b1f67bf1b0c2 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.plugins.imagepicker;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import io.flutter.plugin.common.MethodCall;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
class ImagePickerCache {
static final String MAP_KEY_PATH = "path";
static final String MAP_KEY_PATH_LIST = "pathList";
static final String MAP_KEY_MAX_WIDTH = "maxWidth";
static final String MAP_KEY_MAX_HEIGHT = "maxHeight";
static final String MAP_KEY_IMAGE_QUALITY = "imageQuality";
private static final String MAP_KEY_TYPE = "type";
private static final String MAP_KEY_ERROR_CODE = "errorCode";
private static final String MAP_KEY_ERROR_MESSAGE = "errorMessage";
private static final String FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY =
"flutter_image_picker_image_path";
private static final String SHARED_PREFERENCE_ERROR_CODE_KEY = "flutter_image_picker_error_code";
private static final String SHARED_PREFERENCE_ERROR_MESSAGE_KEY =
"flutter_image_picker_error_message";
private static final String SHARED_PREFERENCE_MAX_WIDTH_KEY = "flutter_image_picker_max_width";
private static final String SHARED_PREFERENCE_MAX_HEIGHT_KEY = "flutter_image_picker_max_height";
private static final String SHARED_PREFERENCE_IMAGE_QUALITY_KEY =
"flutter_image_picker_image_quality";
private static final String SHARED_PREFERENCE_TYPE_KEY = "flutter_image_picker_type";
private static final String SHARED_PREFERENCE_PENDING_IMAGE_URI_PATH_KEY =
"flutter_image_picker_pending_image_uri";
@VisibleForTesting
static final String SHARED_PREFERENCES_NAME = "flutter_image_picker_shared_preference";
private SharedPreferences prefs;
ImagePickerCache(Context context) {
prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
}
void saveTypeWithMethodCallName(String methodCallName) {
if (methodCallName.equals(ImagePickerPlugin.METHOD_CALL_IMAGE)
| methodCallName.equals(ImagePickerPlugin.METHOD_CALL_MULTI_IMAGE)) {
setType("image");
} else if (methodCallName.equals(ImagePickerPlugin.METHOD_CALL_VIDEO)) {
setType("video");
}
}
private void setType(String type) {
prefs.edit().putString(SHARED_PREFERENCE_TYPE_KEY, type).apply();
}
void saveDimensionWithMethodCall(MethodCall methodCall) {
Double maxWidth = methodCall.argument(MAP_KEY_MAX_WIDTH);
Double maxHeight = methodCall.argument(MAP_KEY_MAX_HEIGHT);
int imageQuality =
methodCall.argument(MAP_KEY_IMAGE_QUALITY) == null
? 100
: (int) methodCall.argument(MAP_KEY_IMAGE_QUALITY);
setMaxDimension(maxWidth, maxHeight, imageQuality);
}
private void setMaxDimension(Double maxWidth, Double maxHeight, int imageQuality) {
SharedPreferences.Editor editor = prefs.edit();
if (maxWidth != null) {
editor.putLong(SHARED_PREFERENCE_MAX_WIDTH_KEY, Double.doubleToRawLongBits(maxWidth));
}
if (maxHeight != null) {
editor.putLong(SHARED_PREFERENCE_MAX_HEIGHT_KEY, Double.doubleToRawLongBits(maxHeight));
}
if (imageQuality > -1 && imageQuality < 101) {
editor.putInt(SHARED_PREFERENCE_IMAGE_QUALITY_KEY, imageQuality);
} else {
editor.putInt(SHARED_PREFERENCE_IMAGE_QUALITY_KEY, 100);
}
editor.apply();
}
void savePendingCameraMediaUriPath(Uri uri) {
prefs.edit().putString(SHARED_PREFERENCE_PENDING_IMAGE_URI_PATH_KEY, uri.getPath()).apply();
}
String retrievePendingCameraMediaUriPath() {
return prefs.getString(SHARED_PREFERENCE_PENDING_IMAGE_URI_PATH_KEY, "");
}
void saveResult(
@Nullable ArrayList<String> path, @Nullable String errorCode, @Nullable String errorMessage) {
Set<String> imageSet = new HashSet<>();
imageSet.addAll(path);
SharedPreferences.Editor editor = prefs.edit();
if (path != null) {
editor.putStringSet(FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY, imageSet);
}
if (errorCode != null) {
editor.putString(SHARED_PREFERENCE_ERROR_CODE_KEY, errorCode);
}
if (errorMessage != null) {
editor.putString(SHARED_PREFERENCE_ERROR_MESSAGE_KEY, errorMessage);
}
editor.apply();
}
void clear() {
prefs.edit().clear().apply();
}
Map<String, Object> getCacheMap() {
Map<String, Object> resultMap = new HashMap<>();
ArrayList<String> pathList = new ArrayList<>();
boolean hasData = false;
if (prefs.contains(FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY)) {
final Set<String> imagePathList =
prefs.getStringSet(FLUTTER_IMAGE_PICKER_IMAGE_PATH_KEY, null);
if (imagePathList != null) {
pathList.addAll(imagePathList);
resultMap.put(MAP_KEY_PATH_LIST, pathList);
hasData = true;
}
}
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 (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 (prefs.contains(SHARED_PREFERENCE_TYPE_KEY)) {
final String typeValue = prefs.getString(SHARED_PREFERENCE_TYPE_KEY, "");
resultMap.put(MAP_KEY_TYPE, typeValue);
}
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 (prefs.contains(SHARED_PREFERENCE_MAX_HEIGHT_KEY)) {
final long maxHeightValue = prefs.getLong(SHARED_PREFERENCE_MAX_HEIGHT_KEY, 0);
resultMap.put(MAP_KEY_MAX_HEIGHT, Double.longBitsToDouble(maxHeightValue));
}
if (prefs.contains(SHARED_PREFERENCE_IMAGE_QUALITY_KEY)) {
final int imageQuality = prefs.getInt(SHARED_PREFERENCE_IMAGE_QUALITY_KEY, 100);
resultMap.put(MAP_KEY_IMAGE_QUALITY, imageQuality);
} else {
resultMap.put(MAP_KEY_IMAGE_QUALITY, 100);
}
}
return resultMap;
}
}