diff options
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 21 | ||||
-rw-r--r-- | src/com/android/camera/PhotoModule.java | 144 | ||||
-rw-r--r-- | src/com/android/camera/settings/AppUpgrader.java | 8 |
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); + } } } |