From de52966826fef4f602215295d8ed8fe60184eef7 Mon Sep 17 00:00:00 2001 From: kaiyiz Date: Mon, 21 Jul 2014 16:47:27 +0800 Subject: SnapdragonCamera: Switch to SD card when internal storage is full When internal storage is full, switch to SD card for storage. Change the save path from internal storage to SD card when updateStorageSpace is called if: 1. Internal storage is the current save path and does not have enough space 2. SD card has enough space Display a toast message and update display of the save path menu item when the storage path is switched. CRs-Fixed: 687210 Change-Id: I6a9804e4f64e6d55c6aebd889ac2ce5e887cfa5a --- src/com/android/camera/CameraActivity.java | 4 ++ src/com/android/camera/CameraModule.java | 2 + src/com/android/camera/PhotoModule.java | 6 ++ src/com/android/camera/Storage.java | 69 ++++++++++++++-------- src/com/android/camera/VideoMenu.java | 8 +++ src/com/android/camera/VideoModule.java | 7 +++ src/com/android/camera/VideoUI.java | 4 ++ .../android/camera/WideAnglePanoramaModule.java | 8 +++ 8 files changed, 83 insertions(+), 25 deletions(-) (limited to 'src/com/android/camera') diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 4ad1bd0d0..36b5111ca 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -1359,6 +1359,10 @@ public class CameraActivity extends Activity protected void updateStorageSpace() { mStorageSpaceBytes = Storage.getAvailableSpace(); + if (Storage.switchSavePath()) { + mStorageSpaceBytes = Storage.getAvailableSpace(); + mCurrentModule.onSwitchSavePath(); + } } protected long getStorageSpaceBytes() { diff --git a/src/com/android/camera/CameraModule.java b/src/com/android/camera/CameraModule.java index 48d7eec4a..2c8f5a91b 100644 --- a/src/com/android/camera/CameraModule.java +++ b/src/com/android/camera/CameraModule.java @@ -68,4 +68,6 @@ public interface CameraModule { public boolean arePreviewControlsVisible(); public void resizeForPreviewAspectRatio(); + + public void onSwitchSavePath(); } diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index 4948772c1..2e5466c62 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -697,6 +697,12 @@ public class PhotoModule mUI.setAspectRatio((float) size.width / size.height); } + @Override + public void onSwitchSavePath() { + mUI.setPreference(CameraSettings.KEY_CAMERA_SAVEPATH, "1"); + Toast.makeText(mActivity, R.string.on_switch_save_path_to_sdcard, + Toast.LENGTH_SHORT).show(); + } private void keepMediaProviderInstance() { // We want to keep a reference to MediaProvider in camera's lifecycle. diff --git a/src/com/android/camera/Storage.java b/src/com/android/camera/Storage.java index d27cf259f..53950f2f2 100644 --- a/src/com/android/camera/Storage.java +++ b/src/com/android/camera/Storage.java @@ -216,8 +216,8 @@ public class Storage { } } - public static long getAvailableSpace() { - if (isSaveSDCard() && SDCard.instance().isWriteable()) { + private static long getSDCardAvailableSpace() { + if (SDCard.instance().isWriteable()) { File dir = new File(SDCard.instance().getDirectory()); dir.mkdirs(); try { @@ -227,32 +227,51 @@ public class Storage { } catch (Exception e) { } return UNKNOWN_SIZE; - } else if (isSaveSDCard() && !SDCard.instance().isWriteable()) { - return UNKNOWN_SIZE; - } else { - String state = Environment.getExternalStorageState(); - Log.d(TAG, "External storage state=" + state); - if (Environment.MEDIA_CHECKING.equals(state)) { - return PREPARING; - } - if (!Environment.MEDIA_MOUNTED.equals(state)) { - return UNAVAILABLE; - } + } + return UNKNOWN_SIZE; + } - File dir = new File(DIRECTORY); - dir.mkdirs(); - if (!dir.isDirectory() || !dir.canWrite()) { - return UNAVAILABLE; - } + private static long getInternalStorageAvailableSpace() { + String state = Environment.getExternalStorageState(); + Log.d(TAG, "External storage state=" + state); + if (Environment.MEDIA_CHECKING.equals(state)) { + return PREPARING; + } + if (!Environment.MEDIA_MOUNTED.equals(state)) { + return UNAVAILABLE; + } - try { - StatFs stat = new StatFs(DIRECTORY); - return stat.getAvailableBlocks() * (long) stat.getBlockSize(); - } catch (Exception e) { - Log.i(TAG, "Fail to access external storage", e); - } - return UNKNOWN_SIZE; + File dir = new File(DIRECTORY); + dir.mkdirs(); + if (!dir.isDirectory() || !dir.canWrite()) { + return UNAVAILABLE; + } + + try { + StatFs stat = new StatFs(DIRECTORY); + return stat.getAvailableBlocks() * (long) stat.getBlockSize(); + } catch (Exception e) { + Log.i(TAG, "Failed to access external storage", e); + } + return UNKNOWN_SIZE; + } + + public static long getAvailableSpace() { + if (isSaveSDCard()) { + return getSDCardAvailableSpace(); + } else { + return getInternalStorageAvailableSpace(); + } + } + + public static boolean switchSavePath() { + if (!isSaveSDCard() + && getInternalStorageAvailableSpace() <= LOW_STORAGE_THRESHOLD_BYTES + && getSDCardAvailableSpace() > LOW_STORAGE_THRESHOLD_BYTES) { + setSaveSDCard(true); + return true; } + return false; } /** diff --git a/src/com/android/camera/VideoMenu.java b/src/com/android/camera/VideoMenu.java index c15033529..ae6d67072 100644 --- a/src/com/android/camera/VideoMenu.java +++ b/src/com/android/camera/VideoMenu.java @@ -160,6 +160,14 @@ public class VideoMenu extends PieController } } + public void setPreference(String key, String value) { + ListPreference pref = mPreferenceGroup.findPreference(key); + if (pref != null && !value.equals(pref.getValue())) { + pref.setValue(value); + reloadPreferences(); + } + } + @Override public void overrideSettings(final String ... keyvalues) { super.overrideSettings(keyvalues); diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 97cb8e490..224f9f7eb 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -877,6 +877,13 @@ public class VideoModule implements CameraModule, (double) mProfile.videoFrameWidth / mProfile.videoFrameHeight); } + @Override + public void onSwitchSavePath() { + mUI.setPreference(CameraSettings.KEY_CAMERA_SAVEPATH, "1"); + Toast.makeText(mActivity, R.string.on_switch_save_path_to_sdcard, + Toast.LENGTH_SHORT).show(); + } + @Override public void installIntentFilter() { // install an intent filter to receive SD card related events. diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java index 75105822b..328645a30 100644 --- a/src/com/android/camera/VideoUI.java +++ b/src/com/android/camera/VideoUI.java @@ -846,4 +846,8 @@ public class VideoUI implements PieRenderer.PieListener, R.drawable.ic_recording_indicator, 0, 0, 0); mPauseButton.setPaused(false); } + + public void setPreference(String key, String value) { + mVideoMenu.setPreference(key, value); + } } diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java index 4594b2ac6..61a416f37 100644 --- a/src/com/android/camera/WideAnglePanoramaModule.java +++ b/src/com/android/camera/WideAnglePanoramaModule.java @@ -44,6 +44,7 @@ import android.view.OrientationEventListener; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.widget.Toast; import com.android.camera.PhotoModule; import com.android.camera.CameraManager.CameraProxy; import com.android.camera.app.OrientationManager; @@ -883,6 +884,13 @@ public class WideAnglePanoramaModule public void resizeForPreviewAspectRatio() { } + @Override + public void onSwitchSavePath() { + mPreferences.edit().putString(CameraSettings.KEY_CAMERA_SAVEPATH, "1").apply(); + Toast.makeText(mActivity, R.string.on_switch_save_path_to_sdcard, + Toast.LENGTH_SHORT).show(); + } + @Override public void onResumeBeforeSuper() { mPaused = false; -- cgit v1.2.3