diff options
Diffstat (limited to 'src/com/android/camera/PhotoModule.java')
-rw-r--r-- | src/com/android/camera/PhotoModule.java | 225 |
1 files changed, 72 insertions, 153 deletions
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index c3d152716..7c4487b90 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -49,7 +49,6 @@ import android.os.SystemClock; import android.provider.MediaStore; import android.util.Log; import android.view.KeyEvent; -import android.view.MotionEvent; import android.view.OrientationEventListener; import android.view.SurfaceHolder; import android.view.View; @@ -64,7 +63,6 @@ import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.exif.ExifInterface; import com.android.gallery3d.exif.ExifTag; import com.android.gallery3d.exif.Rational; -import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.crop.CropActivity; import com.android.gallery3d.filtershow.crop.CropExtras; import com.android.gallery3d.util.UsageStatistics; @@ -75,7 +73,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; -import java.util.Collections; import java.util.Formatter; import java.util.List; @@ -127,8 +124,6 @@ public class PhotoModule private PhotoUI mUI; - // these are only used by Camera - // The activity is going to switch to the specified camera id. This is // needed because texture copy is done in GL thread. -1 means camera is not // switching. @@ -252,23 +247,21 @@ public class PhotoModule private PreferenceGroup mPreferenceGroup; private boolean mQuickCapture; - - CameraStartUpThread mCameraStartUpThread; - ConditionVariable mStartPreviewPrerequisiteReady = new ConditionVariable(); - private SensorManager mSensorManager; private float[] mGData = new float[3]; private float[] mMData = new float[3]; private float[] mR = new float[16]; private int mHeading = -1; + CameraStartUpThread mCameraStartUpThread; + ConditionVariable mStartPreviewPrerequisiteReady = new ConditionVariable(); + private MediaSaveService.OnMediaSavedListener mOnMediaSavedListener = new MediaSaveService.OnMediaSavedListener() { @Override public void onMediaSaved(Uri uri) { if (uri != null) { - mActivity.addSecureAlbumItemIfNeeded(false, uri); - Util.broadcastNewPicture(mActivity, uri); + mActivity.notifyNewMedia(uri); } } }; @@ -371,7 +364,8 @@ public class PhotoModule } case SWITCH_CAMERA_START_ANIMATION: { - ((CameraScreenNail) mActivity.mCameraScreenNail).animateSwitchCamera(); + // TODO: Need to revisit + // ((CameraScreenNail) mActivity.mCameraScreenNail).animateSwitchCamera(); break; } @@ -409,7 +403,7 @@ public class PhotoModule } @Override - public void init(CameraActivity activity, View parent, boolean reuseNail) { + public void init(CameraActivity activity, View parent) { mActivity = activity; mUI = new PhotoUI(activity, this, parent); mPreferences = new ComboPreferences(mActivity); @@ -423,15 +417,9 @@ public class PhotoModule mCameraStartUpThread = new CameraStartUpThread(); mCameraStartUpThread.start(); - // Surface texture is from camera screen nail and startPreview needs it. // This must be done before startPreview. mIsImageCaptureIntent = isImageCaptureIntent(); - if (reuseNail) { - mActivity.reuseCameraScreenNail(!mIsImageCaptureIntent); - } else { - mActivity.createCameraScreenNail(!mIsImageCaptureIntent); - } mPreferences.setLocalId(mActivity, mCameraId); CameraSettings.upgradeLocalPreferences(mPreferences.getLocal()); @@ -445,7 +433,6 @@ public class PhotoModule mQuickCapture = mActivity.getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false); mLocationManager = new LocationManager(mActivity, mUI); mSensorManager = (SensorManager)(mActivity.getSystemService(Context.SENSOR_SERVICE)); - } private void initializeControlByIntent() { @@ -458,10 +445,6 @@ public class PhotoModule private void onPreviewStarted() { mCameraStartUpThread = null; setCameraState(IDLE); - if (!ApiHelper.HAS_SURFACE_TEXTURE) { - // This may happen if surfaceCreated has arrived. - mCameraDevice.setPreviewDisplayAsync(mUI.getSurfaceHolder()); - } startFaceDetection(); locationFirstRun(); } @@ -520,16 +503,7 @@ public class PhotoModule int width = root.getWidth(); int height = root.getHeight(); mFocusManager.setPreviewSize(width, height); - // Full-screen screennail - if (Util.getDisplayRotation(mActivity) % 180 == 0) { - ((CameraScreenNail) mActivity.mCameraScreenNail).setPreviewFrameLayoutSize(width, height); - } else { - ((CameraScreenNail) mActivity.mCameraScreenNail).setPreviewFrameLayoutSize(height, width); - } - // Set touch focus listener. - mActivity.setSingleTapUpListener(root); openCameraCommon(); - onFullScreenChanged(mActivity.isInCameraApp()); } private void switchCamera() { @@ -566,6 +540,8 @@ public class PhotoModule mFocusManager.setParameters(mInitialParams); setupPreview(); + // reset zoom value index + mZoomValue = 0; openCameraCommon(); if (ApiHelper.HAS_SURFACE_TEXTURE) { @@ -592,11 +568,7 @@ public class PhotoModule } public void onScreenSizeChanged(int width, int height, int previewWidth, int previewHeight) { - Log.d(TAG, "Preview size changed."); if (mFocusManager != null) mFocusManager.setPreviewSize(width, height); - ((CameraScreenNail) mActivity.mCameraScreenNail).setPreviewFrameLayoutSize( - previewWidth, previewHeight); - mActivity.notifyScreenNailChanged(); } private void resetExposureCompensation() { @@ -726,12 +698,6 @@ public class PhotoModule } } - @Override - public boolean dispatchTouchEvent(MotionEvent m) { - if (mCameraState == SWITCHING_CAMERA) return true; - return mUI.dispatchTouchEvent(m); - } - private final class ShutterCallback implements android.hardware.Camera.ShutterCallback { @@ -786,9 +752,13 @@ public class PhotoModule if (mPaused) { return; } + //TODO: We should show the picture taken rather than frozen preview here + if (mIsImageCaptureIntent) { + stopPreview(); + } if (mSceneMode == Util.SCENE_MODE_HDR) { - mActivity.showSwitcher(); - mActivity.setSwipingEnabled(true); + mUI.showSwitcher(); + mUI.setSwipingEnabled(true); } mJpegPictureCallbackTime = System.currentTimeMillis(); @@ -809,6 +779,7 @@ public class PhotoModule Log.v(TAG, "mPictureDisplayedToJpegCallbackTime = " + mPictureDisplayedToJpegCallbackTime + "ms"); + /*TODO: // Only animate when in full screen capture mode // i.e. If monkey/a user swipes to the gallery during picture taking, // don't show animation @@ -819,7 +790,7 @@ public class PhotoModule ((CameraScreenNail) mActivity.mCameraScreenNail).animateSlide(); mHandler.sendEmptyMessageDelayed(CAPTURE_ANIMATION_DONE, CaptureAnimManager.getAnimationDuration()); - } + } */ mFocusManager.updateFocusUI(); // Ensure focus indicator is hidden. if (!mIsImageCaptureIntent) { if (ApiHelper.CAN_START_PREVIEW_IN_JPEG_CALLBACK) { @@ -957,14 +928,11 @@ public class PhotoModule switch (state) { case PhotoController.PREVIEW_STOPPED: case PhotoController.SNAPSHOT_IN_PROGRESS: - case PhotoController.FOCUSING: case PhotoController.SWITCHING_CAMERA: mUI.enableGestures(false); break; case PhotoController.IDLE: - if (mActivity.isInCameraApp()) { - mUI.enableGestures(true); - } + mUI.enableGestures(true); break; } } @@ -973,13 +941,12 @@ public class PhotoModule // Only animate when in full screen capture mode // i.e. If monkey/a user swipes to the gallery during picture taking, // don't show animation - if (ApiHelper.HAS_SURFACE_TEXTURE && !mIsImageCaptureIntent - && mActivity.mShowCameraAppView) { - // Start capture animation. - ((CameraScreenNail) mActivity.mCameraScreenNail).animateFlash(mDisplayRotation); - mUI.enablePreviewThumb(true); - mHandler.sendEmptyMessageDelayed(CAPTURE_ANIMATION_DONE, - CaptureAnimManager.getAnimationDuration()); + if (!mIsImageCaptureIntent) { + mUI.animateFlash(); + + // TODO: mUI.enablePreviewThumb(true); + // mHandler.sendEmptyMessageDelayed(CAPTURE_ANIMATION_DONE, + // CaptureAnimManager.getAnimationDuration()); } } @@ -1047,17 +1014,6 @@ public class PhotoModule } } - @Override - public void onFullScreenChanged(boolean full) { - mUI.onFullScreenChanged(full); - if (ApiHelper.HAS_SURFACE_TEXTURE) { - if (mActivity.mCameraScreenNail != null) { - ((CameraScreenNail) mActivity.mCameraScreenNail).setFullScreen(full); - } - return; - } - } - private void updateSceneMode() { // If scene mode is set, we cannot set flash mode, white balance, and // focus mode, instead, we read it from driver @@ -1236,8 +1192,8 @@ public class PhotoModule Log.v(TAG, "onShutterButtonClick: mCameraState=" + mCameraState); if (mSceneMode == Util.SCENE_MODE_HDR) { - mActivity.hideSwitcher(); - mActivity.setSwipingEnabled(false); + mUI.hideSwitcher(); + mUI.setSwipingEnabled(false); } // If the user wants to do a snapshot while the previous one is still // in progress, remember the fact and do it after we finish the previous @@ -1295,7 +1251,6 @@ public class PhotoModule mJpegPictureCallbackTime = 0; mZoomValue = 0; - // Start the preview if it is not started. if (mCameraState == PREVIEW_STOPPED && mCameraStartUpThread == null) { resetExposureCompensation(); @@ -1375,8 +1330,6 @@ public class PhotoModule mCameraDevice.cancelAutoFocus(); } stopPreview(); - // Release surface texture. - ((CameraScreenNail) mActivity.mCameraScreenNail).releaseSurfaceTexture(); mNamedImages = null; @@ -1438,6 +1391,13 @@ public class PhotoModule } @Override + public void updateCameraOrientation() { + if (mDisplayRotation != Util.getDisplayRotation(mActivity)) { + setDisplayOrientation(); + } + } + + @Override public void onActivityResult( int requestCode, int resultCode, Intent data) { switch (requestCode) { @@ -1507,7 +1467,7 @@ public class PhotoModule case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_FOCUS: - if (mActivity.isInCameraApp() && mFirstTimeInitialized) { + if (/*TODO: mActivity.isInCameraApp() &&*/ mFirstTimeInitialized) { if (event.getRepeatCount() == 0) { onShutterButtonFocus(true); } @@ -1540,7 +1500,7 @@ public class PhotoModule switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: - if (mActivity.isInCameraApp() && mFirstTimeInitialized) { + if (/*mActivity.isInCameraApp() && */ mFirstTimeInitialized) { onShutterButtonClick(); return true; } @@ -1573,13 +1533,15 @@ public class PhotoModule private void setDisplayOrientation() { mDisplayRotation = Util.getDisplayRotation(mActivity); mDisplayOrientation = Util.getDisplayOrientation(mDisplayRotation, mCameraId); - mCameraDisplayOrientation = Util.getDisplayOrientation(0, mCameraId); + mCameraDisplayOrientation = mDisplayOrientation; mUI.setDisplayOrientation(mDisplayOrientation); if (mFocusManager != null) { mFocusManager.setDisplayOrientation(mDisplayOrientation); } - // GLRoot also uses the DisplayRotation, and needs to be told to layout to update - mActivity.getGLRoot().requestLayoutContentPane(); + // Change the camera display orientation + if (mCameraDevice != null) { + mCameraDevice.setDisplayOrientation(mCameraDisplayOrientation); + } } // Only called by UI thread. @@ -1611,40 +1573,15 @@ public class PhotoModule mFocusManager.setAeAwbLock(false); // Unlock AE and AWB. } setCameraParameters(UPDATE_PARAM_ALL); - - if (ApiHelper.HAS_SURFACE_TEXTURE) { - CameraScreenNail screenNail = (CameraScreenNail) mActivity.mCameraScreenNail; - if (mUI.getSurfaceTexture() == null) { - Size size = mParameters.getPreviewSize(); - if (mCameraDisplayOrientation % 180 == 0) { - screenNail.setSize(size.width, size.height); - } else { - screenNail.setSize(size.height, size.width); - } - screenNail.enableAspectRatioClamping(); - mActivity.notifyScreenNailChanged(); - screenNail.acquireSurfaceTexture(); - CameraStartUpThread t = mCameraStartUpThread; - if (t != null && t.isCanceled()) { - return; // Exiting, so no need to get the surface texture. - } - mUI.setSurfaceTexture(screenNail.getSurfaceTexture()); - } else { - updatePreviewSize(screenNail); - } - mCameraDevice.setDisplayOrientation(mCameraDisplayOrientation); - Object st = mUI.getSurfaceTexture(); - if (st != null) { - mCameraDevice.setPreviewTextureAsync((SurfaceTexture) st); - } - } else { - mCameraDevice.setDisplayOrientation(mDisplayOrientation); - mCameraDevice.setPreviewDisplayAsync(mUI.getSurfaceHolder()); + // Let UI set its expected aspect ratio + mUI.setPreviewSize(mParameters.getPreviewSize()); + Object st = mUI.getSurfaceTexture(); + if (st != null) { + mCameraDevice.setPreviewTextureAsync((SurfaceTexture) st); } Log.v(TAG, "startPreview"); mCameraDevice.startPreviewAsync(); - mFocusManager.onPreviewStarted(); if (mSnapshotOnIdle) { @@ -1652,21 +1589,6 @@ public class PhotoModule } } - private void updatePreviewSize(CameraScreenNail snail) { - Size size = mParameters.getPreviewSize(); - int w = size.width; - int h = size.height; - if (mCameraDisplayOrientation % 180 != 0) { - w = size.height; - h = size.width; - } - if (snail.getWidth() != w || snail.getHeight() != h) { - snail.setSize(w, h); - } - snail.enableAspectRatioClamping(); - mActivity.notifyScreenNailChanged(); - } - @Override public void stopPreview() { if (mCameraDevice != null && mCameraState != PREVIEW_STOPPED) { @@ -1682,10 +1604,11 @@ public class PhotoModule private void updateCameraParametersInitialize() { // Reset preview frame rate to the maximum because it may be lowered by // video camera application. - List<Integer> frameRates = mParameters.getSupportedPreviewFrameRates(); - if (frameRates != null) { - Integer max = Collections.max(frameRates); - mParameters.setPreviewFrameRate(max); + int[] fpsRange = Util.getMaxPreviewFpsRange(mParameters); + if (fpsRange.length > 0) { + mParameters.setPreviewFpsRange( + fpsRange[Parameters.PREVIEW_FPS_MIN_INDEX], + fpsRange[Parameters.PREVIEW_FPS_MAX_INDEX]); } mParameters.set(Util.RECORDING_HINT, Util.FALSE); @@ -1760,6 +1683,7 @@ public class PhotoModule Size original = mParameters.getPreviewSize(); if (!original.equals(optimalSize)) { mParameters.setPreviewSize(optimalSize.width, optimalSize.height); + // 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()) { @@ -1950,16 +1874,12 @@ public class PhotoModule if (mPaused || mPendingSwitchCameraId != -1) return; mPendingSwitchCameraId = cameraId; - if (ApiHelper.HAS_SURFACE_TEXTURE) { - Log.v(TAG, "Start to copy texture. cameraId=" + cameraId); - // We need to keep a preview frame for the animation before - // releasing the camera. This will trigger onPreviewTextureCopied. - ((CameraScreenNail) mActivity.mCameraScreenNail).copyTexture(); - // Disable all camera controls. - setCameraState(SWITCHING_CAMERA); - } else { - switchCamera(); - } + + Log.v(TAG, "Start to switch camera. cameraId=" + cameraId); + // We need to keep a preview frame for the animation before + // releasing the camera. This will trigger onPreviewTextureCopied. + //TODO: Need to animate the camera switch + switchCamera(); } // Preview texture has been copied. Now camera can be released and the @@ -1975,7 +1895,7 @@ public class PhotoModule @Override public void onUserInteraction() { - if (!mActivity.isFinishing()) keepScreenOnAwhile(); + if (!mActivity.isFinishing()) keepScreenOnAwhile(); } private void resetScreenOn() { @@ -1989,11 +1909,6 @@ public class PhotoModule mHandler.sendEmptyMessageDelayed(CLEAR_SCREEN_DELAY, SCREEN_DELAY); } - // TODO: Delete this function after old camera code is removed - @Override - public void onRestorePreferencesClicked() { - } - @Override public void onOverriddenPreferencesClicked() { if (mPaused) return; @@ -2027,16 +1942,6 @@ public class PhotoModule } @Override - public boolean needsSwitcher() { - return !mIsImageCaptureIntent; - } - - @Override - public boolean needsPieMenu() { - return true; - } - - @Override public void onShowSwitcherPopup() { mUI.onShowSwitcherPopup(); } @@ -2101,4 +2006,18 @@ public class PhotoModule mHeading += 360; } } + + @Override + public void onSwitchMode(boolean toCamera) { + mUI.onSwitchMode(toCamera); + } + +/* Below is no longer needed, except to get rid of compile error + * TODO: Remove these + */ + + // TODO: Delete this function after old camera code is removed + @Override + public void onRestorePreferencesClicked() {} + } |