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