summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/PhotoModule.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/PhotoModule.java')
-rw-r--r--src/com/android/camera/PhotoModule.java225
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() {}
+
}