OSDN Git Service

Merge "Fix incorrect key translation in Settings refactor" into lmp-dev
authorAlan Newberger <alann@google.com>
Mon, 6 Oct 2014 21:20:50 +0000 (21:20 +0000)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Mon, 6 Oct 2014 21:20:51 +0000 (21:20 +0000)
src/com/android/camera/CameraActivity.java
src/com/android/camera/PhotoModule.java
src/com/android/camera/settings/AppUpgrader.java

index 25735ed..471c275 100644 (file)
@@ -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();
     }
 
index bed2684..7544e8b 100644 (file)
@@ -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();
         }
 
index 8e4d1db..bb15d38 100644 (file)
@@ -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);
+            }
         }
     }