diff options
Diffstat (limited to 'src/com/android/camera/FocusOverlayManager.java')
-rw-r--r-- | src/com/android/camera/FocusOverlayManager.java | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/src/com/android/camera/FocusOverlayManager.java b/src/com/android/camera/FocusOverlayManager.java index 37d632745..9558944c0 100644 --- a/src/com/android/camera/FocusOverlayManager.java +++ b/src/com/android/camera/FocusOverlayManager.java @@ -29,6 +29,7 @@ import android.os.Message; import android.util.Log; import com.android.camera.util.CameraUtil; +import com.android.camera.util.UsageStatistics; import java.util.ArrayList; import java.util.List; @@ -76,8 +77,6 @@ public class FocusOverlayManager { private boolean mAeAwbLock; private Matrix mMatrix; - private int mPreviewWidth; // The width of the preview frame layout. - private int mPreviewHeight; // The height of the preview frame layout. private boolean mMirror; // true if the camera is front-facing. private int mDisplayOrientation; private List<Object> mFocusArea; // focus area in driver format @@ -94,6 +93,7 @@ public class FocusOverlayManager { private boolean mZslEnabled = false; //QCom Parameter to disable focus for ZSL private FocusUI mUI; + private final Rect mPreviewRect = new Rect(0, 0, 0, 0); public interface FocusUI { public boolean hasFaces(); @@ -160,13 +160,25 @@ public class FocusOverlayManager { } public void setPreviewSize(int previewWidth, int previewHeight) { - if (mPreviewWidth != previewWidth || mPreviewHeight != previewHeight) { - mPreviewWidth = previewWidth; - mPreviewHeight = previewHeight; + if (mPreviewRect.width() != previewWidth || mPreviewRect.height() != previewHeight) { + setPreviewRect(new Rect(0, 0, previewWidth, previewHeight)); + } + } + + /** This setter should be the only way to mutate mPreviewRect. */ + public void setPreviewRect(Rect previewRect) { + if (!mPreviewRect.equals(previewRect)) { + mPreviewRect.set(previewRect); setMatrix(); } } + /** Returns a copy of mPreviewRect so that outside class cannot modify preview + * rect except deliberately doing so through the setter. */ + public Rect getPreviewRect() { + return new Rect(mPreviewRect); + } + public void setMirror(boolean mirror) { mMirror = mirror; setMatrix(); @@ -178,10 +190,9 @@ public class FocusOverlayManager { } private void setMatrix() { - if (mPreviewWidth != 0 && mPreviewHeight != 0) { + if (mPreviewRect.width() != 0 && mPreviewRect.height() != 0) { Matrix matrix = new Matrix(); - CameraUtil.prepareMatrix(matrix, mMirror, mDisplayOrientation, - mPreviewWidth, mPreviewHeight); + CameraUtil.prepareMatrix(matrix, mMirror, mDisplayOrientation, getPreviewRect()); // In face detection, the matrix converts the driver coordinates to UI // coordinates. In tap focus, the inverted matrix converts the UI // coordinates to driver coordinates. @@ -348,12 +359,15 @@ public class FocusOverlayManager { public void onSingleTapUp(int x, int y) { if (!mInitialized || mState == STATE_FOCUSING_SNAP_ON_FINISH) return; + UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, + UsageStatistics.ACTION_TOUCH_FOCUS, x + "," + y); + // Let users be able to cancel previous touch focus. if ((!mFocusDefault) && (mState == STATE_FOCUSING || mState == STATE_SUCCESS || mState == STATE_FAIL)) { cancelAutoFocus(); } - if (mPreviewWidth == 0 || mPreviewHeight == 0) return; + if (mPreviewRect.width() == 0 || mPreviewRect.height() == 0) return; mFocusDefault = false; // Initialize mFocusArea. if (mFocusAreaSupported) { @@ -512,7 +526,7 @@ public class FocusOverlayManager { mMeteringArea = null; if (mFocusAreaSupported) { - initializeFocusAreas(mPreviewWidth / 2, mPreviewHeight / 2); + initializeFocusAreas(mPreviewRect.centerX(), mPreviewRect.centerY()); } // Reset metering area when no specific region is selected. if (mMeteringAreaSupported) { @@ -523,8 +537,10 @@ public class FocusOverlayManager { private void calculateTapArea(int x, int y, float areaMultiple, Rect rect) { int areaSize = (int) (getAreaSize() * areaMultiple); - int left = CameraUtil.clamp(x - areaSize / 2, 0, mPreviewWidth - areaSize); - int top = CameraUtil.clamp(y - areaSize / 2, 0, mPreviewHeight - areaSize); + int left = CameraUtil.clamp(x - areaSize / 2, mPreviewRect.left, + mPreviewRect.right - areaSize); + int top = CameraUtil.clamp(y - areaSize / 2, mPreviewRect.top, + mPreviewRect.bottom - areaSize); RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); mMatrix.mapRect(rectF); @@ -534,7 +550,7 @@ public class FocusOverlayManager { private int getAreaSize() { // Recommended focus area size from the manufacture is 1/8 of the image // width (i.e. longer edge of the image) - return Math.max(mPreviewWidth, mPreviewHeight) / 8; + return Math.max(mPreviewRect.width(), mPreviewRect.height()) / 8; } /* package */ int getFocusState() { |