1b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin/*
2b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Copyright (C) 2013 The Android Open Source Project
3b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin *
4b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * you may not use this file except in compliance with the License.
6b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * You may obtain a copy of the License at
7b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin *
8b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin *
10b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * See the License for the specific language governing permissions and
14b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * limitations under the License.
15b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */
16b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
17b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
18b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkinpackage android.hardware.camera2;
19b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
20b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkinimport android.graphics.Point;
21b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkinimport android.graphics.Rect;
22b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
23b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin/**
24b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Describes a face detected in an image.
25b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */
26b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkinpublic final class Face {
27b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
28b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
29b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The ID is {@code -1} when the optional set of fields is unsupported.
30b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
31b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see Face#Face(Rect, int)
32b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #getId()
33b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
34b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public static final int ID_UNSUPPORTED = -1;
35b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
36b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
37b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The minimum possible value for the confidence level.
38b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
39b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #getScore()
40b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
41b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public static final int SCORE_MIN = 1;
42b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
43b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
44b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The maximum possible value for the confidence level.
45b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
46b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #getScore()
47b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
48b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public static final int SCORE_MAX = 100;
49b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
50b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final Rect mBounds;
51b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final int mScore;
52b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final int mId;
53b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final Point mLeftEye;
54b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final Point mRightEye;
55b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final Point mMouth;
56b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
57b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
58b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * Create a new face with all fields set.
59b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
60b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional.
6104eceec132dddf39cd55cc39235cb7df1de00f9eZhijun He     * They are only required when the {@link CaptureResult} reports that the value of key
62b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} is
63b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_FULL}.
64b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
65b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
66b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * rightEyePosition, and mouthPosition may be independently null or not-null.</p>
67b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
68b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param bounds Bounds of the face.
69b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}.
70b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param id A unique ID per face visible to the tracker.
71b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param leftEyePosition The position of the left eye.
72b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param rightEyePosition The position of the right eye.
73b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param mouthPosition The position of the mouth.
74b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
75b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @throws IllegalArgumentException
76b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             if bounds is {@code null},
77b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             or if the confidence is not in the range of
78b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             {@value #SCORE_MIN}-{@value #SCORE_MAX},
79b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             or if id is {@value #ID_UNSUPPORTED} and
80b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *               leftEyePosition/rightEyePosition/mouthPosition aren't all null,
81b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             or else if id is negative.
82b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
83b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @hide
84b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
85b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Face(Rect bounds, int score, int id,
86b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            Point leftEyePosition, Point rightEyePosition, Point mouthPosition) {
87b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        checkNotNull("bounds", bounds);
88b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        if (score < SCORE_MIN || score > SCORE_MAX) {
89b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            throw new IllegalArgumentException("Confidence out of range");
90b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        } else if (id < 0 && id != ID_UNSUPPORTED) {
91b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            throw new IllegalArgumentException("Id out of range");
92b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        }
93b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        if (id == ID_UNSUPPORTED) {
94b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            checkNull("leftEyePosition", leftEyePosition);
95b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            checkNull("rightEyePosition", rightEyePosition);
96b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            checkNull("mouthPosition", mouthPosition);
97b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        }
98b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
99b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mBounds = bounds;
100b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mScore = score;
101b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mId = id;
102b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mLeftEye = leftEyePosition;
103b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mRightEye = rightEyePosition;
104b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mMouth = mouthPosition;
105b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
106b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
107b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
108b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * Create a new face without the optional fields.
109b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
110b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional.
111b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
112b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
113b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * rightEyePosition, and mouthPosition may be independently null or not-null. When devices
114b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * report the value of key {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} as
11504eceec132dddf39cd55cc39235cb7df1de00f9eZhijun He     * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_SIMPLE} in {@link CaptureResult},
116b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * the face id of each face is expected to be {@value #ID_UNSUPPORTED}, the leftEyePosition,
117b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * rightEyePosition, and mouthPositions are expected to be {@code null} for each face.</p>
118b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
119b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param bounds Bounds of the face.
120b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}.
121b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
122b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @throws IllegalArgumentException
123b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             if bounds is {@code null},
124b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             or if the confidence is not in the range of
125b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             {@value #SCORE_MIN}-{@value #SCORE_MAX}.
126b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
127b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @hide
128b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
129b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Face(Rect bounds, int score) {
130b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        this(bounds, score, ID_UNSUPPORTED,
131b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin                /*leftEyePosition*/null, /*rightEyePosition*/null, /*mouthPosition*/null);
132b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
133b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
134b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
135b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * Bounds of the face.
136b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
137b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>A rectangle relative to the sensor's
13868f40066c914aefc1f88819dd46dd1135fb9f5bcIgor Murashkin     * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE}, with (0,0)
139b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * representing the top-left corner of the active array rectangle.</p>
140b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
141b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>There is no constraints on the the Rectangle value other than it
142b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * is not-{@code null}.</p>
143b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
144b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Rect getBounds() {
145b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mBounds;
146b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
147b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
148b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
149b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The confidence level for the detection of the face.
150b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
151b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The range is {@value #SCORE_MIN} to {@value #SCORE_MAX}.
152b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * {@value #SCORE_MAX} is the highest confidence.</p>
153b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
154b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>Depending on the device, even very low-confidence faces may be
155b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * listed, so applications should filter out faces with low confidence,
156b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * depending on the use case. For a typical point-and-shoot camera
157b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * application that wishes to display rectangles around detected faces,
158b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * filtering out faces with confidence less than half of {@value #SCORE_MAX}
159b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * is recommended.</p>
160b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
161b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #SCORE_MAX
162b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #SCORE_MIN
163b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
164b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public int getScore() {
165b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mScore;
166b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
167b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
168b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
169b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * An unique id per face while the face is visible to the tracker.
170b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
171b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>
172b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * If the face leaves the field-of-view and comes back, it will get a new
173b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * id.</p>
174b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
175b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>This is an optional field, may not be supported on all devices.
176b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
177b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
178b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * rightEyePosition, and mouthPosition may be independently null or not-null. When devices
179b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * report the value of key {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} as
18004eceec132dddf39cd55cc39235cb7df1de00f9eZhijun He     * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_SIMPLE} in {@link CaptureResult},
181b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * the face id of each face is expected to be {@value #ID_UNSUPPORTED}.</p>
182b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
183b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>This value will either be {@value #ID_UNSUPPORTED} or
184b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * otherwise greater than {@code 0}.</p>
185b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
186b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #ID_UNSUPPORTED
187b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
188b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public int getId() {
189b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mId;
190b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
191b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
192b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
193b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The coordinates of the center of the left eye.
194b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
195b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The coordinates are in
196b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * the same space as the ones for {@link #getBounds}. This is an
197b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * optional field, may not be supported on all devices. If not
198b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * supported, the value will always be set to null.
199b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * This value will  always be null only if {@link #getId()} returns
200b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * {@value #ID_UNSUPPORTED}.</p>
201b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
202b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @return The left eye position, or {@code null} if unknown.
203b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
204b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Point getLeftEyePosition() {
205b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mLeftEye;
206b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
207b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
208b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
209b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The coordinates of the center of the right eye.
210b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
211b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The coordinates are
212b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * in the same space as the ones for {@link #getBounds}.This is an
213b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * optional field, may not be supported on all devices. If not
214b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * supported, the value will always be set to null.
215b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * This value will  always be null only if {@link #getId()} returns
216b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * {@value #ID_UNSUPPORTED}.</p>
217b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
218b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @return The right eye position, or {@code null} if unknown.
219b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
220b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Point getRightEyePosition() {
221b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mRightEye;
222b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
223b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
224b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
225b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The coordinates of the center of the mouth.
226b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
227b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The coordinates are in
228b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * the same space as the ones for {@link #getBounds}. This is an optional
229b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * field, may not be supported on all devices. If not
230b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * supported, the value will always be set to null.
231b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * This value will  always be null only if {@link #getId()} returns
232b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He     * {@value #ID_UNSUPPORTED}.</p>
233b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * </p>
234b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
235b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @return The mouth position, or {@code null} if unknown.
236b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
237b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Point getMouthPosition() {
238b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mMouth;
239b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
240b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
241b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
242b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * Represent the Face as a string for debugging purposes.
243b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
244b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    @Override
245b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public String toString() {
246b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return String.format("{ bounds: %s, score: %s, id: %d, " +
247b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin                "leftEyePosition: %s, rightEyePosition: %s, mouthPosition: %s }",
248b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin                mBounds, mScore, mId, mLeftEye, mRightEye, mMouth);
249b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
250b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
251b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private static void checkNotNull(String name, Object obj) {
252b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        if (obj == null) {
253b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            throw new IllegalArgumentException(name + " was required, but it was null");
254b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        }
255b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
256b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
257b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private static void checkNull(String name, Object obj) {
258b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        if (obj != null) {
259b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            throw new IllegalArgumentException(name + " was required to be null, but it wasn't");
260b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        }
261b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
262b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin}
263