FaceView.java revision d480002ccad05cf992c628c72884091c36cc654c
141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li/*
241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * Copyright (C) 2011 The Android Open Source Project
341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li *
441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License");
541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * you may not use this file except in compliance with the License.
641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * You may obtain a copy of the License at
741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li *
841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li *      http://www.apache.org/licenses/LICENSE-2.0
941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li *
1041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * Unless required by applicable law or agreed to in writing, software
1141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS,
1241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * See the License for the specific language governing permissions and
1441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * limitations under the License.
1541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li */
1641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
1741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Lipackage com.android.camera.ui;
1841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
1941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport com.android.camera.R;
2041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport com.android.camera.Util;
2141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
2241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.content.Context;
2341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.graphics.Canvas;
2441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.graphics.Matrix;
2541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.graphics.RectF;
2641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.graphics.drawable.Drawable;
2741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.hardware.Camera.Face;
2841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.util.AttributeSet;
2941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.util.Log;
3041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.view.View;
3141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
3241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Lipublic class FaceView extends View {
3341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private final String TAG = "FaceView";
3441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private final boolean LOGV = false;
3541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private int mDisplayOrientation;
3641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private boolean mMirror;
37d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li    private boolean mPause;
3841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private Matrix mMatrix = new Matrix();
3941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private RectF mRect = new RectF();
4041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private Face[] mFaces;
4141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private Drawable mFaceRect;
4241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
4341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    public FaceView(Context context, AttributeSet attrs) {
4441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        super(context, attrs);
4541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        mFaceRect = getResources().getDrawable(R.drawable.focus_focused);
4641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    }
4741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
4841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    public void setFaces(Face[] faces) {
4941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        if (LOGV) Log.v(TAG, "Num of faces=" + faces.length);
50d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li        if (mPause) return;
5141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        mFaces = faces;
5241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        invalidate();
5341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    }
5441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
5541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    public void setDisplayOrientation(int orientation) {
5641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        mDisplayOrientation = orientation;
5741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        if (LOGV) Log.v(TAG, "mDisplayOrientation=" + orientation);
5841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    }
5941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
6041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    public void setMirror(boolean mirror) {
6141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        mMirror = mirror;
6241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        if (LOGV) Log.v(TAG, "mMirror=" + mirror);
6341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    }
6441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
6541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    public boolean faceExists() {
6641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        return (mFaces != null && mFaces.length > 0);
6741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    }
6841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
6941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    public void clearFaces() {
7041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        mFaces = null;
7141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        invalidate();
7241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    }
7341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
74d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li    public void pause() {
75d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li        mPause = true;
76d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li    }
77d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li
78d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li    public void resume() {
79d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li        mPause = false;
80d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li    }
81d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li
8241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    private void dumpRect(RectF rect, String msg) {
8341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        Log.v(TAG, msg + "=(" + rect.left + "," + rect.top
8441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                + "," + rect.right + "," + rect.bottom + ")");
8541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    }
8641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
8741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    @Override
8841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    protected void onDraw(Canvas canvas) {
8941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        if (mFaces != null && mFaces.length > 0) {
9041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li            // Prepare the matrix.
9141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li            Util.prepareMatrix(mMatrix, mMirror, mDisplayOrientation, getWidth(),
9241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                    getHeight());
9341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
9441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li            for (int i = 0; i < mFaces.length; i++) {
9541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                // Transform the coordinates.
9641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                mRect.set(mFaces[i].rect);
9741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                if (LOGV) dumpRect(mRect, "Original rect");
9841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                mMatrix.mapRect(mRect);
9941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                if (LOGV) dumpRect(mRect, "Transformed rect");
10041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li
10141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                mFaceRect.setBounds(Math.round(mRect.left), Math.round(mRect.top),
10241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                        Math.round(mRect.right), Math.round(mRect.bottom));
10341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li                mFaceRect.draw(canvas);
10441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li            }
10541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        }
10641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li        super.onDraw(canvas);
10741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li    }
10841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li}
109