package com.android.camera;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import android.os.Environment;
import android.os.StatFs;
import android.util.Log;
import android.content.Context;
import com.android.camera.util.CameraUtil;
public class StorageUtil {
private static final boolean DEBUG = true;
private static final String TAG = "StorageUtil";
private static StorageUtil mInstance;
public static synchronized StorageUtil newInstance() {
if (mInstance == null) {
mInstance = new StorageUtil();
}
return mInstance;
}
private static final String DIRECTORY_DCIM = Environment.DIRECTORY_DCIM;
private static final String DIRECTORY_CAMERA = "/Camera";
private static final String DIRECTORY_DEFAULT =
"/".concat(DIRECTORY_DCIM).concat(DIRECTORY_CAMERA);
private static final String CAMERA_DEFAULT_STORAGE =
Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM).toString();
private static final int VAL_DEFAULT_ROOT_DIRECTORY_SIZE = 2;
public static final String KEY_DEFAULT_INTERNAL = "Internal";
public static final String KEY_DEFAULT_EXTERNAL = "External";
public static final long UNAVAILABLE = -1L;
public static final long PREPARING = -2L;
public static final long UNKNOWN_SIZE = -3L;
// SPRD: bug 256269 Listener for init over Imp by CameraActivity
public interface UpdataPathListener {
public void UpdatPath();
}
// default construct
public StorageUtil() {
CameraUtil.P(DEBUG, TAG, "create StorageUtil instance");
}
private String mVideoStorage;
private String mCameraStorage;
private UpdataPathListener mUpdataPathListener;
// SPRD: bug 256269 set Listener
public void setmUpdataPathListener(UpdataPathListener mUpdataPathListener) {
this.mUpdataPathListener = mUpdataPathListener;
}
public void initialize(ListPreference preference) {
if (preference != null) {
String key = preference.getKey();
String value = preference.getValue();
int mode = (!CameraSettings.KEY_VIDEO_STORAGE_PATH.equals(key) ?
CameraUtil.MODE_CAMERA : CameraUtil.MODE_VIDEO);
if (isImageStorage(mode) && mCameraStorage == null) {
mCameraStorage = value;
}
if (isVideoStorage(mode) && mVideoStorage == null) {
mVideoStorage = value;
}
boolean needInitialize = (value == null);
if (needInitialize) {
value = getDefaultRootDirectory();
if (isImageStorage(mode)) mCameraStorage = value;
if (isVideoStorage(mode)) mVideoStorage = value;
}
// SPRD: bug 256269 do UpdatPath function in CameraActivity
mUpdataPathListener.UpdatPath();
// for test print log
if (DEBUG) {
String message =
String.format("initialize mCameraStorage=%s, mVideoStorage=%s",
new Object[] { mCameraStorage, mVideoStorage });
CameraUtil.P(DEBUG, TAG, message);
}
}
}
public void resetStorageByMode(int mode, String path) {
if (isImageStorage(mode) && !mCameraStorage.equals(path)) {
mCameraStorage = path;
}
if (isVideoStorage(mode) && !mVideoStorage.equals(path)) {
mVideoStorage = path;
}
// SPRD: bug 256269 do UpdatPath function in CameraActivity
// mUpdataPathListener.UpdatPath();
syncThumbnailPath();
}
public void syncThumbnailPath() {
if (mUpdataPathListener != null) {
mUpdataPathListener.UpdatPath();
}
}
public long getAvailableSpace(int mode) {
String path = null;
if (isImageStorage(mode)) {
path = mCameraStorage;
}
if (isVideoStorage(mode)) {
path = mVideoStorage;
}
String state = null;
Map<String, String> roots = supportedRootDirectory();
String internal = roots.get(KEY_DEFAULT_INTERNAL);
String external = roots.get(KEY_DEFAULT_EXTERNAL);
if (internal == null && external == null) {
return UNAVAILABLE;
} else if (path != null && internal != null && path.contains(internal)) {
state = Environment.getExternalStorageState();
} else if (path != null && external != null && path.contains(external)) {
state = Environment.getExternalStorageState();
}
if (Environment.MEDIA_CHECKING.equals(state)) {
return PREPARING;
}
File dir = new File(path);
dir.mkdirs();
if (!dir.isDirectory() || !dir.canWrite()) {
return UNAVAILABLE;
}
try {
StatFs stat = new StatFs(path);
// return (stat.getAvailableBlocksLong() * stat.getBlockSizeLong());
return stat.getAvailableBlocks() * (long) stat.getBlockSize();
} catch (Exception e) {
Log.i(TAG, "Fail to access storage", e);
}
return UNKNOWN_SIZE;
}
public long getInternalAvailableSpace() {
String spath = Environment.getExternalStorageDirectory().getAbsolutePath();
String state = null;
File dir = new File(spath);
dir.mkdirs();
if (!dir.isDirectory() || !dir.canWrite()) {
return UNAVAILABLE;
}
try {
StatFs stat = new StatFs(spath);
// return (stat.getAvailableBlocksLong() * stat.getBlockSizeLong());
return stat.getAvailableBlocks() * (long) stat.getBlockSize();
} catch (Exception e) {
Log.i(TAG, "Fail to access storage", e);
}
return UNKNOWN_SIZE;
}
public String getStorageByMode(int mode) {
String path = null;
if (isImageStorage(mode)) {
path = mCameraStorage;
}
if (isVideoStorage(mode)) {
path = mVideoStorage;
}
return path;
}
public Map<String, String> supportedRootDirectory() {
Map<String, String> result = null;
String
internal_state = Environment.getExternalStorageState(),
external_state = Environment.getExternalStorageState();
boolean
internal_mounted = (Environment.MEDIA_MOUNTED.equals(internal_state)),
external_mounted = (Environment.MEDIA_MOUNTED.equals(external_state));
String
internal = (internal_mounted ?
Environment.getExternalStorageDirectory().getAbsolutePath() : null),
external = (external_mounted ?
Environment.getExternalStorageDirectory().getAbsolutePath() : null);
if (DEBUG) {
String message =
String.format("supported internal{%s, %s}, external{%s, %s}",
new Object[] { internal_mounted, internal, external_mounted, external});
CameraUtil.P(DEBUG, TAG, message);
}
result = new HashMap<String, String>(VAL_DEFAULT_ROOT_DIRECTORY_SIZE);
result.put(KEY_DEFAULT_INTERNAL, internal);
result.put(KEY_DEFAULT_EXTERNAL, external);
return result;
}
public String getDefaultRootDirectory() {
String result = null;
Map<String, String> roots = supportedRootDirectory();
String internal = roots.get(KEY_DEFAULT_INTERNAL);
String external = roots.get(KEY_DEFAULT_EXTERNAL);
if (internal != null) result = (internal.concat(DIRECTORY_DEFAULT));
if (external != null) result = (external.concat(DIRECTORY_DEFAULT));
if (internal == null && external == null) result = CAMERA_DEFAULT_STORAGE;
return result;
}
private boolean isImageStorage(int mode) {
return (CameraUtil.MODE_VIDEO != mode);
}
private boolean isVideoStorage(int mode) {
return (CameraUtil.MODE_VIDEO == mode);
}
public String getStoragePath(Context ctx, int mode) {
String result = null;
StoragePathPreference mPreference = StoragePathPreference.getInstance(ctx);
result = mPreference.readStorage(mode);
if (Storage.VAL_DEFAULT_CONFIG_PATH.equals(result)) {
result = getDefaultRootDirectory();
}
if (isImageStorage(mode)) {
mCameraStorage = result;
}
if (isVideoStorage(mode)) {
mVideoStorage = result;
}
return result;
}
}