summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/camera/CameraActivity.java21
-rw-r--r--src/com/android/camera/PhotoModule.java144
-rw-r--r--src/com/android/camera/settings/AppUpgrader.java8
3 files changed, 85 insertions, 88 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 25735ed81..471c2757d 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -1638,8 +1638,6 @@ public class CameraActivity extends Activity
performDeletion();
mCurrentModule.pause();
mOrientationManager.pause();
- // Close the camera and wait for the operation done.
- mCameraController.closeCamera(true);
mPanoramaViewHelper.onPause();
mLocalImagesObserver.setForegroundChangeListener(null);
@@ -1652,6 +1650,17 @@ public class CameraActivity extends Activity
UsageStatistics.instance().backgrounded();
+ // Close the camera and wait for the operation done. But if we time out
+ // via RuntimeException, just continue pausing, and request a finish().
+ try {
+ mCameraController.closeCamera(true);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Exception while closing camera", e);
+ if (!isFinishing()) {
+ finish();
+ }
+ }
+
super.onPause();
}
@@ -1862,9 +1871,13 @@ public class CameraActivity extends Activity
mSettingsManager = null;
mOrientationManager = null;
mButtonManager = null;
- CameraAgentFactory.recycle(CameraAgentFactory.CameraApi.API_1);
- CameraAgentFactory.recycle(CameraAgentFactory.CameraApi.AUTO);
mSoundPlayer.release();
+ try {
+ CameraAgentFactory.recycle(CameraAgentFactory.CameraApi.API_1);
+ CameraAgentFactory.recycle(CameraAgentFactory.CameraApi.AUTO);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "CameraAgentFactory exception during destroy", e);
+ }
super.onDestroy();
}
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index bed2684ed..7544e8bfc 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -163,13 +163,6 @@ public class PhotoModule
private boolean mAwbLockSupported;
private boolean mContinuousFocusSupported;
- /*
- * If true, attempts to start the preview will be denied. This ensures that
- * we never call startPreview multiple times when making changes to
- * settings.
- */
- private boolean mStartPreviewLock = false;
-
// The degrees of the device rotated clockwise from its natural orientation.
private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
@@ -624,6 +617,7 @@ public class PhotoModule
Keys.KEY_USER_SELECTED_ASPECT_RATIO);
Log.e(TAG, "aspect ratio after setting it to true=" + aspectRatio);
if (newAspectRatio != currentAspectRatio) {
+ Log.i(TAG, "changing aspect ratio from dialog");
stopPreview();
startPreview();
mUI.setRunnableForNextFrame(dialogHandlingFinishedRunnable);
@@ -637,6 +631,7 @@ public class PhotoModule
@Override
public void onPreviewUIReady() {
+ Log.i(TAG, "onPreviewUIReady");
startPreview();
}
@@ -1037,6 +1032,7 @@ public class PhotoModule
@Override
public void onPictureTaken(final byte[] originalJpegData, final CameraProxy camera) {
+ Log.i(TAG, "onPictureTaken");
mAppController.setShutterEnabled(true);
if (mPaused) {
return;
@@ -1368,7 +1364,7 @@ public class PhotoModule
@Override
public void onCameraAvailable(CameraProxy cameraProxy) {
- Log.v(TAG, "onCameraAvailable");
+ Log.i(TAG, "onCameraAvailable");
if (mPaused) {
return;
}
@@ -1385,21 +1381,13 @@ public class PhotoModule
// Do camera parameter dependent initialization.
mCameraSettings = mCameraDevice.getSettings();
- // HACK: The call to setCameraParameters(UPDATE_PARAM_ALL) may
- // eventually recurse back into startPreview().
- // To avoid calling startPreview() twice, first acquire
- // mStartPreviewLock.
- mStartPreviewLock = true;
- try {
- setCameraParameters(UPDATE_PARAM_ALL);
- // Set a listener which updates camera parameters based
- // on changed settings.
- SettingsManager settingsManager = mActivity.getSettingsManager();
- settingsManager.addListener(this);
- mCameraPreviewParamsReady = true;
- } finally {
- mStartPreviewLock = false;
- }
+
+ setCameraParameters(UPDATE_PARAM_ALL);
+ // Set a listener which updates camera parameters based
+ // on changed settings.
+ SettingsManager settingsManager = mActivity.getSettingsManager();
+ settingsManager.addListener(this);
+ mCameraPreviewParamsReady = true;
startPreview();
@@ -1414,6 +1402,7 @@ public class PhotoModule
@Override
public void onCaptureRetake() {
+ Log.i(TAG, "onCaptureRetake");
if (mPaused) {
return;
}
@@ -1928,6 +1917,7 @@ public class PhotoModule
/** Only called by UI thread. */
private void setupPreview() {
+ Log.i(TAG, "setupPreview");
mFocusManager.resetTouchFocus();
startPreview();
}
@@ -1962,59 +1952,55 @@ public class PhotoModule
* The start/stop preview should only run on the UI thread.
*/
private void startPreview() {
- // HACK: The call to setCameraParameters(UPDATE_PARAM_ALL) may
- // eventually recurse back into startPreview().
- // To avoid calling startPreview() twice, we must acquire
- // mStartPreviewLock.
- if (mStartPreviewLock || mCameraDevice == null) {
+ if (mCameraDevice == null) {
+ Log.i(TAG, "attempted to start preview before camera device");
// do nothing
return;
}
- mStartPreviewLock = true;
- try {
- if (!checkPreviewPreconditions()) {
- return;
- }
- mCameraDevice.setErrorCallback(mHandler, mErrorCallback);
- setDisplayOrientation();
+ if (!checkPreviewPreconditions()) {
+ return;
+ }
- if (!mSnapshotOnIdle) {
- // If the focus mode is continuous autofocus, call cancelAutoFocus
- // to resume it because it may have been paused by autoFocus call.
- if (mFocusManager.getFocusMode(mCameraSettings.getCurrentFocusMode()) ==
- CameraCapabilities.FocusMode.CONTINUOUS_PICTURE) {
- mCameraDevice.cancelAutoFocus();
- }
- mFocusManager.setAeAwbLock(false); // Unlock AE and AWB.
+ mCameraDevice.setErrorCallback(mHandler, mErrorCallback);
+ setDisplayOrientation();
+
+ if (!mSnapshotOnIdle) {
+ // If the focus mode is continuous autofocus, call cancelAutoFocus
+ // to resume it because it may have been paused by autoFocus call.
+ if (mFocusManager.getFocusMode(mCameraSettings.getCurrentFocusMode()) ==
+ CameraCapabilities.FocusMode.CONTINUOUS_PICTURE) {
+ mCameraDevice.cancelAutoFocus();
}
- setCameraParameters(UPDATE_PARAM_ALL);
- mCameraDevice.setPreviewTexture(mActivity.getCameraAppUI().getSurfaceTexture());
-
- Log.i(TAG, "startPreview");
- // If we're using API2 in portability layers, don't use startPreviewWithCallback()
- // b/17576554
- CameraAgent.CameraStartPreviewCallback startPreviewCallback =
- new CameraAgent.CameraStartPreviewCallback() {
- @Override
- public void onPreviewStarted() {
- mFocusManager.onPreviewStarted();
- PhotoModule.this.onPreviewStarted();
- SessionStatsCollector.instance().previewActive(true);
- if (mSnapshotOnIdle) {
- mHandler.post(mDoSnapRunnable);
- }
+ mFocusManager.setAeAwbLock(false); // Unlock AE and AWB.
+ }
+ setCameraParameters(UPDATE_PARAM_ALL);
+
+ updateParametersPictureSize();
+
+ mCameraDevice.setPreviewTexture(mActivity.getCameraAppUI().getSurfaceTexture());
+
+ Log.i(TAG, "startPreview");
+ // If we're using API2 in portability layers, don't use startPreviewWithCallback()
+ // b/17576554
+ CameraAgent.CameraStartPreviewCallback startPreviewCallback =
+ new CameraAgent.CameraStartPreviewCallback() {
+ @Override
+ public void onPreviewStarted() {
+ mFocusManager.onPreviewStarted();
+ PhotoModule.this.onPreviewStarted();
+ SessionStatsCollector.instance().previewActive(true);
+ if (mSnapshotOnIdle) {
+ mHandler.post(mDoSnapRunnable);
}
- };
- if (GservicesHelper.useCamera2ApiThroughPortabilityLayer(mActivity)) {
- mCameraDevice.startPreview();
- startPreviewCallback.onPreviewStarted();
- } else {
- mCameraDevice.startPreviewWithCallback(new Handler(Looper.getMainLooper()),
- startPreviewCallback);
- }
- } finally {
- mStartPreviewLock = false;
+ }
+ };
+ if (GservicesHelper.useCamera2ApiThroughPortabilityLayer(mActivity)) {
+ mCameraDevice.startPreview();
+ startPreviewCallback.onPreviewStarted();
+ } else {
+ mCameraDevice.startPreviewWithCallback(new Handler(Looper.getMainLooper()),
+ startPreviewCallback);
}
}
@@ -2130,9 +2116,6 @@ public class PhotoModule
CameraCapabilities.FocusMode.CONTINUOUS_PICTURE
);
- // Set picture size.
- updateParametersPictureSize();
-
// Set JPEG quality.
updateParametersPictureQuality();
@@ -2150,8 +2133,14 @@ public class PhotoModule
}
}
+ /**
+ * This method sets picture size parameters. Size parameters should only be
+ * set when the preview is stopped, and so this method is only invoked in
+ * {@link #startPreview()} just before starting the preview.
+ */
private void updateParametersPictureSize() {
if (mCameraDevice == null) {
+ Log.w(TAG, "attempting to set picture size without caemra device");
return;
}
@@ -2187,16 +2176,7 @@ public class PhotoModule
Log.v(TAG, "setting preview size. optimal: " + optimalSize + "original: " + original);
mCameraSettings.setPreviewSize(optimalSize);
- // Zoom related settings will be changed for different preview
- // sizes, so set and read the parameters to get latest values
- if (mHandler.getLooper() == Looper.myLooper()) {
- Log.v(TAG, "matched looper, setting up preview");
- // On UI thread only, not when camera starts up
- setupPreview();
- } else {
- Log.v(TAG, "no looper match, directly applying settings");
- mCameraDevice.applySettings(mCameraSettings);
- }
+ mCameraDevice.applySettings(mCameraSettings);
mCameraSettings = mCameraDevice.getSettings();
}
diff --git a/src/com/android/camera/settings/AppUpgrader.java b/src/com/android/camera/settings/AppUpgrader.java
index 8e4d1db2e..bb15d38dd 100644
--- a/src/com/android/camera/settings/AppUpgrader.java
+++ b/src/com/android/camera/settings/AppUpgrader.java
@@ -334,8 +334,12 @@ public class AppUpgrader extends SettingsUpgrader {
Map<String, ?> entries = oldPrefs.getAll();
for (Map.Entry<String, ?> entry : entries.entrySet()) {
String key = entry.getKey();
- String value = entry.getValue().toString();
- newPrefs.edit().putString(key, value).apply();
+ Object value = entry.getValue();
+ if (value != null) {
+ newPrefs.edit().putString(key, String.valueOf(value)).apply();
+ } else {
+ Log.w(TAG, "skipped upgrade for null key " + key);
+ }
}
}