summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/camera/CameraActivity.java170
-rw-r--r--src/com/android/camera/DisableCameraReceiver.java2
-rw-r--r--src/com/android/camera/FocusOverlayManager.java4
-rw-r--r--src/com/android/camera/Storage.java31
-rw-r--r--src/com/android/camera/VideoModule.java4
-rw-r--r--src/com/android/camera/app/CameraServicesImpl.java2
-rw-r--r--src/com/android/camera/app/DevicePluginBase.java35
-rw-r--r--src/com/android/camera/data/FilmstripContentQueries.java2
-rw-r--r--src/com/android/camera/data/FilmstripItemBase.java2
-rw-r--r--src/com/android/camera/exif/ExifOutputStream.java2
-rw-r--r--src/com/android/camera/one/v2/OneCameraImpl.java2
-rw-r--r--src/com/android/camera/processing/imagebackend/TaskCompressImageToJpeg.java3
-rw-r--r--src/com/android/camera/settings/AppUpgrader.java45
-rw-r--r--src/com/android/camera/settings/CameraSettingsActivity.java66
-rw-r--r--src/com/android/camera/settings/Keys.java27
-rw-r--r--src/com/android/camera/settings/SettingsUtil.java11
16 files changed, 363 insertions, 45 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index bf4889873..cf5b0cffc 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -44,9 +44,13 @@ import android.nfc.NfcEvent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.storage.StorageEventListener;
+import android.os.storage.StorageManager;
+import android.os.storage.StorageVolume;
import android.provider.MediaStore;
import android.provider.Settings;
import android.text.TextUtils;
@@ -73,6 +77,7 @@ import com.android.camera.app.CameraController;
import com.android.camera.app.CameraProvider;
import com.android.camera.app.CameraServices;
import com.android.camera.app.CameraServicesImpl;
+import com.android.camera.app.DevicePluginImpl;
import com.android.camera.app.FirstRunDialog;
import com.android.camera.app.LocationManager;
import com.android.camera.app.MemoryManager;
@@ -124,6 +129,7 @@ import com.android.camera.settings.Keys;
import com.android.camera.settings.PictureSizeLoader;
import com.android.camera.settings.ResolutionSetting;
import com.android.camera.settings.ResolutionUtil;
+import com.android.camera.settings.SettingsUtil;
import com.android.camera.settings.SettingsManager;
import com.android.camera.stats.UsageStatistics;
import com.android.camera.stats.profiler.Profile;
@@ -173,7 +179,8 @@ import java.util.List;
public class CameraActivity extends QuickActivity
implements AppController, CameraAgent.CameraOpenCallback,
- ShareActionProvider.OnShareTargetSelectedListener {
+ ShareActionProvider.OnShareTargetSelectedListener,
+ SettingsManager.OnSettingChangedListener {
private static final Log.Tag TAG = new Log.Tag("CameraActivity");
@@ -181,6 +188,8 @@ public class CameraActivity extends QuickActivity
"android.media.action.STILL_IMAGE_CAMERA_SECURE";
public static final String ACTION_IMAGE_CAPTURE_SECURE =
"android.media.action.IMAGE_CAPTURE_SECURE";
+ public static final String INTENT_GALLERY3D_STORAGE_CHANGE =
+ "com.android.gallery3d.STORAGE_CHANGE";
// The intent extra for camera from secure lock screen. True if the gallery
// should only show newly captured pictures. sSecureAlbumId does not
@@ -228,6 +237,7 @@ public class CameraActivity extends QuickActivity
private int mCurrentModeIndex;
private CameraModule mCurrentModule;
private ModuleManagerImpl mModuleManager;
+ private DevicePluginImpl mDevicePlugin;
private FrameLayout mAboveFilmstripControlLayout;
private FilmstripController mFilmstripController;
private boolean mFilmstripVisible;
@@ -237,6 +247,8 @@ public class CameraActivity extends QuickActivity
private Intent mResultDataForTesting;
private OnScreenHint mStorageHint;
private final Object mStorageSpaceLock = new Object();
+ private String mStoragePath;
+ private StorageManager mStorageManager;
private long mStorageSpaceBytes = Storage.LOW_STORAGE_THRESHOLD_BYTES;
private boolean mAutoRotateScreen;
private boolean mSecureCamera;
@@ -293,6 +305,11 @@ public class CameraActivity extends QuickActivity
/** First run dialog */
private FirstRunDialog mFirstRunDialog;
+ // Keep track of powershutter state
+ public boolean mPowerShutter;
+ // Keep track of max brightness state
+ public boolean mMaxBrightness;
+
@Override
public CameraAppUI getCameraAppUI() {
return mCameraAppUI;
@@ -532,6 +549,7 @@ public class CameraActivity extends QuickActivity
}
Log.v(TAG, "invoking onChangeCamera");
mCameraAppUI.onChangeCamera();
+ mDevicePlugin.onCameraOpened(camera);
}
private void resetExposureCompensationToDefault(CameraAgent.CameraProxy camera) {
@@ -565,6 +583,19 @@ public class CameraActivity extends QuickActivity
mFatalErrorHandler.onCameraReconnectFailure();
}
+ @Override
+ public void onSettingChanged(SettingsManager settingsManager, String key) {
+ if (key.equals(Keys.KEY_POWER_SHUTTER)) {
+ initPowerShutter();
+ } else if (key.equals(Keys.KEY_MAX_BRIGHTNESS)) {
+ initMaxBrightness();
+ } else if (key.equals(Keys.KEY_STORAGE)) {
+ if (setStoragePath()) {
+ updateStorageSpaceAndHint(null);
+ }
+ }
+ }
+
private static class MainHandler extends Handler {
final WeakReference<CameraActivity> mActivity;
@@ -1335,7 +1366,8 @@ public class CameraActivity extends QuickActivity
private void removeItemAt(int index) {
mDataAdapter.removeAt(index);
- if (mDataAdapter.getTotalNumber() > 1) {
+ final int placeholders = mSecureCamera ? 1 : 0;
+ if (mDataAdapter.getTotalNumber() > placeholders) {
showUndoDeletionBar();
} else {
// If camera preview is the only view left in filmstrip,
@@ -1496,6 +1528,12 @@ public class CameraActivity extends QuickActivity
ModulesInfo.setupModules(mAppContext, mModuleManager, mFeatureConfig);
+ mDevicePlugin = new DevicePluginImpl();
+ mDevicePlugin.onCreate(mAppContext);
+
+ initPowerShutter();
+ initMaxBrightness();
+
AppUpgrader appUpgrader = new AppUpgrader(this);
appUpgrader.upgrade(mSettingsManager);
@@ -1654,6 +1692,8 @@ public class CameraActivity extends QuickActivity
mMotionManager = getServices().getMotionManager();
+ syncStorageSettings();
+
mFirstRunDialog = new FirstRunDialog(this,
getAndroidContext(),
mResolutionSetting,
@@ -1820,6 +1860,7 @@ public class CameraActivity extends QuickActivity
mCurrentModule.pause();
mOrientationManager.pause();
mPanoramaViewHelper.onPause();
+ mLocationManager.recordLocation(false);
mLocalImagesObserver.setForegroundChangeListener(null);
mLocalImagesObserver.setActivityPaused(true);
@@ -1856,6 +1897,8 @@ public class CameraActivity extends QuickActivity
@Override
public void onResumeTasks() {
mPaused = false;
+
+ setStoragePath();
checkPermissions();
if (!mHasCriticalPermissions) {
Log.v(TAG, "onResume: Missing critical permissions.");
@@ -1920,14 +1963,6 @@ public class CameraActivity extends QuickActivity
mDataAdapter);
if (!mSecureCamera) {
mFilmstripController.setDataAdapter(mDataAdapter);
- if (!isCaptureIntent()) {
- mDataAdapter.requestLoad(new Callback<Void>() {
- @Override
- public void onCallback(Void result) {
- fillTemporarySessions();
- }
- });
- }
} else {
// Put a lock placeholder as the last image by setting its date to
// 0.
@@ -2160,6 +2195,9 @@ public class CameraActivity extends QuickActivity
if (mSecureCamera) {
unregisterReceiver(mShutdownReceiver);
}
+ if (mStorageManager != null) {
+ mStorageManager.unregisterListener(mStorageEventListener);
+ }
// Ensure anything that checks for "isPaused" returns true.
mPaused = true;
@@ -2182,6 +2220,9 @@ public class CameraActivity extends QuickActivity
if (mModeListView != null) {
mModeListView.setVisibilityChangedListener(null);
}
+ if (mDevicePlugin != null) {
+ mDevicePlugin.onDestroy();
+ }
mCameraController = null;
mSettingsManager = null;
mOrientationManager = null;
@@ -2208,9 +2249,39 @@ public class CameraActivity extends QuickActivity
}
}
+ protected void initPowerShutter() {
+ mPowerShutter = Keys.isPowerShutterOn(mSettingsManager);
+ if (mPowerShutter) {
+ getWindow().addPrivateFlags(
+ WindowManager.LayoutParams.PRIVATE_FLAG_PREVENT_POWER_KEY);
+ } else {
+ getWindow().clearPrivateFlags(
+ WindowManager.LayoutParams.PRIVATE_FLAG_PREVENT_POWER_KEY);
+ }
+ }
+
+ protected void initMaxBrightness() {
+ Window win = getWindow();
+ WindowManager.LayoutParams params = win.getAttributes();
+
+ mMaxBrightness = Keys.isMaxBrightnessOn(mSettingsManager);
+ if (mMaxBrightness) {
+ params.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL;
+ } else {
+ params.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
+ }
+
+ win.setAttributes(params);
+ }
+
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (!mFilmstripVisible) {
+ if (mPowerShutter && keyCode == KeyEvent.KEYCODE_POWER &&
+ event.getRepeatCount() == 0) {
+ mCurrentModule.onShutterButtonFocus(true);
+ return true;
+ }
if (mCurrentModule.onKeyDown(keyCode, event)) {
return true;
}
@@ -2229,6 +2300,10 @@ public class CameraActivity extends QuickActivity
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (!mFilmstripVisible) {
+ if (mPowerShutter && keyCode == KeyEvent.KEYCODE_POWER) {
+ mCurrentModule.onShutterButtonClick();
+ return true;
+ }
// If a module is in the middle of capture, it should
// consume the key event.
if (mCurrentModule.onKeyUp(keyCode, event)) {
@@ -3000,4 +3075,79 @@ public class CameraActivity extends QuickActivity
boolean showDetails = data.getAttributes().hasDetailedCaptureInfo();
detailsMenuItem.setVisible(showDetails);
}
+
+ protected boolean setStoragePath() {
+ String storagePath = mSettingsManager.getString(SettingsManager.SCOPE_GLOBAL,
+ Keys.KEY_STORAGE);
+ Storage.setRoot(storagePath);
+ if (storagePath.equals(mStoragePath)) {
+ return false;
+ }
+ mStoragePath = storagePath;
+
+ // Sync the swipe preview with the right path
+ if (mDataAdapter != null) {
+ if (!mSecureCamera) {
+ mDataAdapter.requestLoad(new Callback<Void>() {
+ @Override
+ public void onCallback(Void result) {
+ fillTemporarySessions();
+ }
+ });
+ }
+ }
+
+ // Update the gallery app
+ Intent intent = new Intent(INTENT_GALLERY3D_STORAGE_CHANGE);
+ intent.putExtra(Keys.KEY_STORAGE, mStoragePath);
+ sendBroadcast(intent);
+ return true;
+ }
+
+ protected void syncStorageSettings() {
+ if (mStorageManager == null) {
+ mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
+ mStorageManager.registerListener(mStorageEventListener);
+ }
+ StorageVolume[] volumes = mStorageManager.getVolumeList();
+ List<String> values = new ArrayList<String>(volumes.length);
+ List<StorageVolume> mountedVolumes = new ArrayList<StorageVolume>(volumes.length);
+
+ // Find all mounted volumes
+ String defaultValue = Environment.getExternalStorageDirectory().toString();
+ for (int i = 0; i < volumes.length; i++) {
+ StorageVolume v = volumes[i];
+ if (mStorageManager.getVolumeState(v.getPath()).equals(Environment.MEDIA_MOUNTED)) {
+ values.add(v.getPath());
+ mountedVolumes.add(v);
+ if (v.isPrimary()) {
+ defaultValue = v.getPath();
+ }
+ }
+ }
+ SettingsUtil.setMountedStorageVolumes(mountedVolumes);
+
+ mSettingsManager.setDefaults(Keys.KEY_STORAGE, defaultValue,
+ values.toArray(new String[values.size()]));
+
+ // Check if current volume is mounted. If not, restore the default storage path.
+ try {
+ mSettingsManager.getIndexOfCurrentValue(SettingsManager.SCOPE_GLOBAL,
+ Keys.KEY_STORAGE);
+ } catch (IllegalStateException e) {
+ mSettingsManager.setToDefault(SettingsManager.SCOPE_GLOBAL, Keys.KEY_STORAGE);
+ }
+
+ if (setStoragePath()) {
+ updateStorageSpaceAndHint(null);
+ }
+ }
+
+ private StorageEventListener mStorageEventListener = new StorageEventListener () {
+ @Override
+ public void onStorageStateChanged(String path, String oldState, String newState) {
+ Log.v(TAG, "onStorageStateChanged: " + path + "(" + oldState + "->" + newState + ")");
+ syncStorageSettings();
+ }
+ };
}
diff --git a/src/com/android/camera/DisableCameraReceiver.java b/src/com/android/camera/DisableCameraReceiver.java
index aea6ec5b9..5237c1d58 100644
--- a/src/com/android/camera/DisableCameraReceiver.java
+++ b/src/com/android/camera/DisableCameraReceiver.java
@@ -30,7 +30,7 @@ import com.android.camera.debug.Log;
// this receiver will be disabled, so it will not run again.
public class DisableCameraReceiver extends BroadcastReceiver {
private static final Log.Tag TAG = new Log.Tag("DisableCamRcver");
- private static final boolean CHECK_BACK_CAMERA_ONLY = true;
+ private static final boolean CHECK_BACK_CAMERA_ONLY = false;
private static final String ACTIVITIES[] = {
"com.android.camera.CameraLauncher",
};
diff --git a/src/com/android/camera/FocusOverlayManager.java b/src/com/android/camera/FocusOverlayManager.java
index c16d01b39..72d6f4393 100644
--- a/src/com/android/camera/FocusOverlayManager.java
+++ b/src/com/android/camera/FocusOverlayManager.java
@@ -584,8 +584,6 @@ public class FocusOverlayManager implements PreviewStatusListener.PreviewAreaCha
}
private boolean needAutoFocusCall(CameraCapabilities.FocusMode focusMode) {
- return !(focusMode == CameraCapabilities.FocusMode.INFINITY
- || focusMode == CameraCapabilities.FocusMode.FIXED
- || focusMode == CameraCapabilities.FocusMode.EXTENDED_DOF);
+ return focusMode == CameraCapabilities.FocusMode.AUTO;
}
}
diff --git a/src/com/android/camera/Storage.java b/src/com/android/camera/Storage.java
index 842f9a4f6..67e56ab71 100644
--- a/src/com/android/camera/Storage.java
+++ b/src/com/android/camera/Storage.java
@@ -46,10 +46,6 @@ import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
public class Storage {
- public static final String DCIM =
- Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString();
- public static final String DIRECTORY = DCIM + "/Camera";
- public static final File DIRECTORY_FILE = new File(DIRECTORY);
public static final String JPEG_POSTFIX = ".jpg";
public static final String GIF_POSTFIX = ".gif";
public static final long UNAVAILABLE = -1L;
@@ -72,6 +68,17 @@ public class Storage {
};
private static HashMap<Uri, Point> sSessionsToSizes = new HashMap<>();
private static HashMap<Uri, Integer> sSessionsToPlaceholderVersions = new HashMap<>();
+ private static String sRoot = Environment.getExternalStorageDirectory().toString();
+
+ public static void setRoot(String root) {
+ if (!root.equals(sRoot)) {
+ sSessionsToContentUris.clear();
+ sContentUrisToSessions.clear();
+ sSessionsToSizes.clear();
+ sSessionsToPlaceholderVersions.clear();
+ }
+ sRoot = root;
+ }
/**
* Save the image with default JPEG MIME type and add it to the MediaStore.
@@ -416,7 +423,7 @@ public class Storage {
}
private static String generateFilepath(String title, String mimeType) {
- return generateFilepath(DIRECTORY, title, mimeType);
+ return generateFilepath(generateDirectory(), title, mimeType);
}
public static String generateFilepath(String directory, String title, String mimeType) {
@@ -431,6 +438,14 @@ public class Storage {
return (new File(directory, title + extension)).getAbsolutePath();
}
+ private static String generateDCIM() {
+ return new File(sRoot, Environment.DIRECTORY_DCIM).toString();
+ }
+
+ public static String generateDirectory() {
+ return generateDCIM() + "/Camera";
+ }
+
/**
* Returns the jpeg bytes for a placeholder session
*
@@ -499,14 +514,14 @@ public class Storage {
return UNAVAILABLE;
}
- File dir = new File(DIRECTORY);
+ File dir = new File(generateDirectory());
dir.mkdirs();
if (!dir.isDirectory() || !dir.canWrite()) {
return UNAVAILABLE;
}
try {
- StatFs stat = new StatFs(DIRECTORY);
+ StatFs stat = new StatFs(generateDirectory());
return stat.getAvailableBlocks() * (long) stat.getBlockSize();
} catch (Exception e) {
Log.i(TAG, "Fail to access external storage", e);
@@ -519,7 +534,7 @@ public class Storage {
* imported. This is a temporary fix for bug#1655552.
*/
public static void ensureOSXCompatible() {
- File nnnAAAAA = new File(DCIM, "100ANDRO");
+ File nnnAAAAA = new File(generateDCIM(), "100ANDRO");
if (!(nnnAAAAA.exists() || nnnAAAAA.mkdirs())) {
Log.e(TAG, "Failed to create " + nnnAAAAA.getPath());
}
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 9a941c73e..59ff4babf 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -808,7 +808,7 @@ public class VideoModule extends CameraModule
*/
private static Point getDesiredPreviewSize(CameraCapabilities capabilities,
CamcorderProfile profile, Point previewScreenSize) {
- if (capabilities.getSupportedVideoSizes() == null) {
+ if (capabilities.getSupportedVideoSizes().size() == 0) {
// Driver doesn't support separate outputs for preview and video.
return new Point(profile.videoFrameWidth, profile.videoFrameHeight);
}
@@ -1222,7 +1222,7 @@ public class VideoModule extends CameraModule
// Used when emailing.
String filename = title + convertOutputFormatToFileExt(outputFileFormat);
String mime = convertOutputFormatToMimeType(outputFileFormat);
- String path = Storage.DIRECTORY + '/' + filename;
+ String path = Storage.generateDirectory() + '/' + filename;
String tmpPath = path + ".tmp";
mCurrentVideoValues = new ContentValues(9);
mCurrentVideoValues.put(Video.Media.TITLE, title);
diff --git a/src/com/android/camera/app/CameraServicesImpl.java b/src/com/android/camera/app/CameraServicesImpl.java
index a1a2e861e..8c02d5caf 100644
--- a/src/com/android/camera/app/CameraServicesImpl.java
+++ b/src/com/android/camera/app/CameraServicesImpl.java
@@ -65,7 +65,7 @@ public class CameraServicesImpl implements CameraServices {
PlaceholderManager mPlaceHolderManager = new PlaceholderManager(context);
SessionStorageManager mSessionStorageManager = SessionStorageManagerImpl.create(context);
- StackSaverFactory mStackSaverFactory = new StackSaverFactory(Storage.DIRECTORY,
+ StackSaverFactory mStackSaverFactory = new StackSaverFactory(Storage.generateDirectory(),
context.getContentResolver());
CaptureSessionFactory captureSessionFactory = new CaptureSessionFactoryImpl(
mMediaSaver, mPlaceHolderManager, mSessionStorageManager, mStackSaverFactory);
diff --git a/src/com/android/camera/app/DevicePluginBase.java b/src/com/android/camera/app/DevicePluginBase.java
new file mode 100644
index 000000000..8f934dd64
--- /dev/null
+++ b/src/com/android/camera/app/DevicePluginBase.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 The CyanogenMod Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.app;
+
+import android.content.Context;
+
+import com.android.ex.camera2.portability.CameraAgent;
+
+/**
+ * The interface defining device-specific application hooks
+ */
+public class DevicePluginBase {
+ public void onCreate(Context context) {
+ }
+
+ public void onDestroy() {
+ }
+
+ public void onCameraOpened(CameraAgent.CameraProxy camera) {
+ }
+}
diff --git a/src/com/android/camera/data/FilmstripContentQueries.java b/src/com/android/camera/data/FilmstripContentQueries.java
index a3c273ca9..5f8c60053 100644
--- a/src/com/android/camera/data/FilmstripContentQueries.java
+++ b/src/com/android/camera/data/FilmstripContentQueries.java
@@ -32,7 +32,7 @@ import java.util.List;
*/
public class FilmstripContentQueries {
private static final Log.Tag TAG = new Log.Tag("LocalDataQuery");
- private static final String CAMERA_PATH = Storage.DIRECTORY + "%";
+ private static final String CAMERA_PATH = Storage.generateDirectory() + "%";
private static final String SELECT_BY_PATH = MediaStore.MediaColumns.DATA + " LIKE ?";
public interface CursorToFilmstripItemFactory<I extends FilmstripItem> {
diff --git a/src/com/android/camera/data/FilmstripItemBase.java b/src/com/android/camera/data/FilmstripItemBase.java
index f225a0701..cc7ff54ac 100644
--- a/src/com/android/camera/data/FilmstripItemBase.java
+++ b/src/com/android/camera/data/FilmstripItemBase.java
@@ -146,7 +146,7 @@ public abstract class FilmstripItemBase<T extends FilmstripItemData> implements
}
// Check if this is a 'Camera' sub-directory.
- String cameraPathStr = Storage.DIRECTORY_FILE.getAbsolutePath();
+ String cameraPathStr = new File(Storage.generateDirectory()).getAbsolutePath();
String fileParentPathStr = directory.getParentFile().getAbsolutePath();
Log.d(TAG, "CameraPathStr: " + cameraPathStr + " fileParentPathStr: " + fileParentPathStr);
diff --git a/src/com/android/camera/exif/ExifOutputStream.java b/src/com/android/camera/exif/ExifOutputStream.java
index 3c7ed7d6e..d7c832069 100644
--- a/src/com/android/camera/exif/ExifOutputStream.java
+++ b/src/com/android/camera/exif/ExifOutputStream.java
@@ -482,7 +482,7 @@ class ExifOutputStream extends FilterOutputStream {
switch (tag.getDataType()) {
case ExifTag.TYPE_ASCII:
byte buf[] = tag.getStringByte();
- if (buf.length == tag.getComponentCount()) {
+ if (buf.length == tag.getComponentCount() && buf.length > 0) {
buf[buf.length - 1] = 0;
dataOutputStream.write(buf);
} else {
diff --git a/src/com/android/camera/one/v2/OneCameraImpl.java b/src/com/android/camera/one/v2/OneCameraImpl.java
index d4c7cba01..1e1fbc33d 100644
--- a/src/com/android/camera/one/v2/OneCameraImpl.java
+++ b/src/com/android/camera/one/v2/OneCameraImpl.java
@@ -161,7 +161,7 @@ public class OneCameraImpl extends AbstractOneCamera {
}
/** Directory to store raw DNG files in. */
- private static final File RAW_DIRECTORY = new File(Storage.DIRECTORY, "DNG");
+ private static final File RAW_DIRECTORY = new File(Storage.generateDirectory(), "DNG");
/** Current CONTROL_AF_MODE request to Camera2 API. */
private int mControlAFMode = CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
diff --git a/src/com/android/camera/processing/imagebackend/TaskCompressImageToJpeg.java b/src/com/android/camera/processing/imagebackend/TaskCompressImageToJpeg.java
index 2e5976c46..e1d1689cc 100644
--- a/src/com/android/camera/processing/imagebackend/TaskCompressImageToJpeg.java
+++ b/src/com/android/camera/processing/imagebackend/TaskCompressImageToJpeg.java
@@ -95,8 +95,7 @@ public class TaskCompressImageToJpeg extends TaskJpegEncode {
*/
public Map<Integer, Integer> exifGetMinimalTags(ExifInterface exif) {
Map<Integer, Integer> map = new HashMap<>();
- map.put(ExifInterface.TAG_ORIENTATION,
- ExifInterface.getRotationForOrientationValue((short) Exif.getOrientation(exif)));
+ map.put(ExifInterface.TAG_ORIENTATION, Exif.getOrientation(exif));
map.put(ExifInterface.TAG_PIXEL_X_DIMENSION, exif.getTagIntValue(
ExifInterface.TAG_PIXEL_X_DIMENSION));
map.put(ExifInterface.TAG_PIXEL_Y_DIMENSION, exif.getTagIntValue(
diff --git a/src/com/android/camera/settings/AppUpgrader.java b/src/com/android/camera/settings/AppUpgrader.java
index 92bd953d1..277960728 100644
--- a/src/com/android/camera/settings/AppUpgrader.java
+++ b/src/com/android/camera/settings/AppUpgrader.java
@@ -85,10 +85,21 @@ public class AppUpgrader extends SettingsUpgrader {
* resolution size on the N5 since we stored it with a swapped width/height.
*/
public static final int NEEDS_N5_16by9_RESOLUTION_SWAP = 7;
+
+ /**
+ * With this version, port over power shutter settings.
+ */
+ private static final int CAMERA_SETTINGS_POWER_SHUTTER = 8;
+
+ /**
+ * With this version, port over max brightness settings.
+ */
+ private static final int CAMERA_SETTINGS_MAX_BRIGHTNESS = 9;
+
/**
* Increment this value whenever new AOSP UpgradeSteps need to be executed.
*/
- public static final int APP_UPGRADE_VERSION = 7;
+ public static final int APP_UPGRADE_VERSION = 9;
private final AppController mAppController;
@@ -160,6 +171,14 @@ public class AppUpgrader extends SettingsUpgrader {
if (lastVersion < NEEDS_N5_16by9_RESOLUTION_SWAP) {
updateN516by9ResolutionIfNeeded(settingsManager);
}
+
+ if (lastVersion < CAMERA_SETTINGS_POWER_SHUTTER) {
+ upgradePowerShutter(settingsManager);
+ }
+
+ if (lastVersion < CAMERA_SETTINGS_MAX_BRIGHTNESS) {
+ upgradeMaxBrightness(settingsManager);
+ }
}
/**
@@ -431,6 +450,30 @@ public class AppUpgrader extends SettingsUpgrader {
}
}
+ private void upgradePowerShutter(SettingsManager settingsManager) {
+ SharedPreferences oldGlobalPreferences =
+ settingsManager.openPreferences(OLD_GLOBAL_PREFERENCES_FILENAME);
+ if (oldGlobalPreferences.contains(Keys.KEY_POWER_SHUTTER)) {
+ String powerShutter = removeString(oldGlobalPreferences, Keys.KEY_POWER_SHUTTER);
+ if (OLD_SETTINGS_VALUE_ON.equals(powerShutter)) {
+ settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_POWER_SHUTTER,
+ true);
+ }
+ }
+ }
+
+ private void upgradeMaxBrightness(SettingsManager settingsManager) {
+ SharedPreferences oldGlobalPreferences =
+ settingsManager.openPreferences(OLD_GLOBAL_PREFERENCES_FILENAME);
+ if (oldGlobalPreferences.contains(Keys.KEY_MAX_BRIGHTNESS)) {
+ String maxBrightness = removeString(oldGlobalPreferences, Keys.KEY_MAX_BRIGHTNESS);
+ if (OLD_SETTINGS_VALUE_ON.equals(maxBrightness)) {
+ settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_MAX_BRIGHTNESS,
+ true);
+ }
+ }
+ }
+
/**
* The R.integer.camera_mode_* indices were cleaned up, resulting in
* removals and renaming of certain values. In particular camera_mode_gcam
diff --git a/src/com/android/camera/settings/CameraSettingsActivity.java b/src/com/android/camera/settings/CameraSettingsActivity.java
index 50641fd22..4e05add96 100644
--- a/src/com/android/camera/settings/CameraSettingsActivity.java
+++ b/src/com/android/camera/settings/CameraSettingsActivity.java
@@ -23,6 +23,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
+import android.os.storage.StorageVolume;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
@@ -45,7 +46,6 @@ import com.android.camera.one.OneCameraModule;
import com.android.camera.settings.PictureSizeLoader.PictureSizes;
import com.android.camera.settings.SettingsUtil.SelectedVideoQualities;
import com.android.camera.util.CameraSettingsActivityHelper;
-import com.android.camera.util.GoogleHelpHelper;
import com.android.camera.util.Size;
import com.android.camera2.R;
import com.android.ex.camera2.portability.CameraAgentFactory;
@@ -139,7 +139,6 @@ public class CameraSettingsActivity extends FragmentActivity {
public static final String PREF_CATEGORY_RESOLUTION = "pref_category_resolution";
public static final String PREF_CATEGORY_ADVANCED = "pref_category_advanced";
- public static final String PREF_LAUNCH_HELP = "pref_launch_help";
private static final Log.Tag TAG = new Log.Tag("SettingsFragment");
private static DecimalFormat sMegaPixelFormat = new DecimalFormat("##0.0");
private String[] mCamcorderProfileNames;
@@ -147,10 +146,13 @@ public class CameraSettingsActivity extends FragmentActivity {
private String mPrefKey;
private boolean mHideAdvancedScreen;
private boolean mGetSubPrefAsRoot = true;
+ private boolean mPreferencesRemoved = false;
// Selected resolutions for the different cameras and sizes.
private PictureSizes mPictureSizes;
+ private List<StorageVolume> mStorageVolumes;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -190,6 +192,9 @@ public class CameraSettingsActivity extends FragmentActivity {
// Load the camera sizes.
loadSizes();
+ // Load storage volumes
+ loadStorageVolumeList();
+
// Send loaded sizes to additional preferences.
CameraSettingsActivityHelper.onSizesLoaded(this, mPictureSizes.backCameraSizes,
new ListPreferenceFiller() {
@@ -216,15 +221,17 @@ public class CameraSettingsActivity extends FragmentActivity {
setPreferenceScreenIntent(advancedScreen);
}
- Preference helpPref = findPreference(PREF_LAUNCH_HELP);
- helpPref.setOnPreferenceClickListener(
- new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- new GoogleHelpHelper(activity).launchGoogleHelp();
- return true;
- }
- });
+ // Fill Storage preference
+ final Preference storagePreference = findPreference(Keys.KEY_STORAGE);
+ if (storagePreference != null) {
+ if (mStorageVolumes == null) {
+ getPreferenceScreen().removePreference(storagePreference);
+ } else {
+ setEntries(storagePreference);
+ setSummary(storagePreference);
+ }
+ }
+
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@@ -285,18 +292,19 @@ public class CameraSettingsActivity extends FragmentActivity {
private void setVisibilities() {
PreferenceGroup resolutions =
(PreferenceGroup) findPreference(PREF_CATEGORY_RESOLUTION);
- if (mPictureSizes.backCameraSizes.isEmpty()) {
+ if ((mPictureSizes.backCameraSizes.isEmpty()) && !mPreferencesRemoved) {
recursiveDelete(resolutions,
findPreference(Keys.KEY_PICTURE_SIZE_BACK));
recursiveDelete(resolutions,
findPreference(Keys.KEY_VIDEO_QUALITY_BACK));
}
- if (mPictureSizes.frontCameraSizes.isEmpty()) {
+ if ((mPictureSizes.frontCameraSizes.isEmpty()) && !mPreferencesRemoved) {
recursiveDelete(resolutions,
findPreference(Keys.KEY_PICTURE_SIZE_FRONT));
recursiveDelete(resolutions,
findPreference(Keys.KEY_VIDEO_QUALITY_FRONT));
}
+ mPreferencesRemoved = true;
}
/**
@@ -374,6 +382,8 @@ public class CameraSettingsActivity extends FragmentActivity {
setEntriesForSelection(mPictureSizes.videoQualitiesBack.orNull(), listPreference);
} else if (listPreference.getKey().equals(Keys.KEY_VIDEO_QUALITY_FRONT)) {
setEntriesForSelection(mPictureSizes.videoQualitiesFront.orNull(), listPreference);
+ } else if (listPreference.getKey().equals(Keys.KEY_STORAGE)) {
+ setStorageEntriesForSelection(mStorageVolumes, listPreference);
}
}
@@ -453,6 +463,28 @@ public class CameraSettingsActivity extends FragmentActivity {
}
/**
+ * Sets the entries for the storage list preference.
+ *
+ * @param storageVolumes The storage volumes.
+ * @param preference The preference to set the entries for.
+ */
+ private void setStorageEntriesForSelection(List<StorageVolume> storageVolumes,
+ ListPreference preference) {
+ if (storageVolumes == null) {
+ return;
+ }
+ String[] entries = new String[storageVolumes.size()];
+ String[] entryValues = new String[storageVolumes.size()];
+ for (int i = 0; i < storageVolumes.size(); i++) {
+ StorageVolume v = storageVolumes.get(i);
+ entries[i] = v.getDescription(getActivity());
+ entryValues[i] = v.getPath();
+ }
+ preference.setEntries(entries);
+ preference.setEntryValues(entryValues);
+ }
+
+ /**
* Sets the summary for the given list preference.
*
* @param displayableSizes The human readable preferred sizes
@@ -500,6 +532,14 @@ public class CameraSettingsActivity extends FragmentActivity {
mPictureSizes = loader.computePictureSizes();
}
+ private void loadStorageVolumeList() {
+ mStorageVolumes = SettingsUtil.getMountedStorageVolumes();
+ if (mStorageVolumes.size() < 2) {
+ // Remove storage preference
+ mStorageVolumes = null;
+ }
+ }
+
/**
* @param size The photo resolution.
* @return A human readable and translated string for labeling the
diff --git a/src/com/android/camera/settings/Keys.java b/src/com/android/camera/settings/Keys.java
index 0339ea6c7..8cc643b2f 100644
--- a/src/com/android/camera/settings/Keys.java
+++ b/src/com/android/camera/settings/Keys.java
@@ -18,6 +18,8 @@ package com.android.camera.settings;
import android.content.Context;
+import android.os.Environment;
+
import com.android.camera.app.LocationManager;
import com.android.camera.util.ApiHelper;
import com.android.camera2.R;
@@ -81,6 +83,9 @@ public class Keys {
public static final String KEY_SHOULD_SHOW_SETTINGS_BUTTON_CLING =
"pref_should_show_settings_button_cling";
public static final String KEY_HAS_SEEN_PERMISSIONS_DIALOGS = "pref_has_seen_permissions_dialogs";
+ public static final String KEY_POWER_SHUTTER = "pref_power_shutter";
+ public static final String KEY_MAX_BRIGHTNESS = "pref_max_brightness";
+ public static final String KEY_STORAGE = "pref_camera_storage_key";
/**
* Set some number of defaults for the defined keys.
@@ -180,6 +185,12 @@ public class Keys {
settingsManager.setDefaults(KEY_SHOULD_SHOW_SETTINGS_BUTTON_CLING, true);
+ settingsManager.setDefaults(KEY_STORAGE,
+ Environment.getExternalStorageDirectory().toString(), null);
+ if (!settingsManager.isSet(SettingsManager.SCOPE_GLOBAL, KEY_STORAGE)) {
+ settingsManager.setToDefault(SettingsManager.SCOPE_GLOBAL, KEY_STORAGE);
+ }
+
}
/** Helper functions for some defined keys. */
@@ -223,5 +234,21 @@ public class Keys {
return settingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
KEY_CAMERA_GRID_LINES);
}
+
+ /**
+ * Returns whether power shutter is set on.
+ */
+ public static boolean isPowerShutterOn(SettingsManager settingsManager) {
+ return settingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
+ KEY_POWER_SHUTTER);
+ }
+
+ /**
+ * Returns whether max brightness is set on.
+ */
+ public static boolean isMaxBrightnessOn(SettingsManager settingsManager) {
+ return settingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
+ KEY_MAX_BRIGHTNESS);
+ }
}
diff --git a/src/com/android/camera/settings/SettingsUtil.java b/src/com/android/camera/settings/SettingsUtil.java
index f83fb8bcd..64fd8435d 100644
--- a/src/com/android/camera/settings/SettingsUtil.java
+++ b/src/com/android/camera/settings/SettingsUtil.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.media.CamcorderProfile;
+import android.os.storage.StorageVolume;
import android.util.SparseArray;
import com.android.camera.debug.Log;
@@ -491,6 +492,16 @@ public class SettingsUtil {
return -1;
}
+ private static List<StorageVolume> sMountedStorageVolumes;
+
+ public static void setMountedStorageVolumes(List<StorageVolume> volumes) {
+ sMountedStorageVolumes = volumes;
+ }
+
+ public static List<StorageVolume> getMountedStorageVolumes() {
+ return sMountedStorageVolumes;
+ }
+
public static interface CameraDeviceSelector {
/**
* Given the static characteristics of a specific camera device, decide whether it is the