• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.camera.one;
18 
19 import android.content.Context;
20 import android.graphics.Bitmap;
21 import android.location.Location;
22 import android.net.Uri;
23 import android.view.Surface;
24 
25 import com.android.camera.session.CaptureSession;
26 import com.android.camera.util.Size;
27 
28 import java.io.File;
29 
30 /**
31  * OneCamera is a camera API tailored around our Google Camera application
32  * needs. It's not a general purpose API but instead offers an API with exactly
33  * what's needed from the app's side.
34  */
35 public interface OneCamera {
36 
37     /** Which way the camera is facing. */
38     public static enum Facing {
39         FRONT, BACK;
40     }
41 
42     /**
43      * Auto focus system status; 1:1 mapping from camera2 AF_STATE.
44      * <ul>
45      * <li>{@link #INACTIVE}</li>
46      * <li>{@link #ACTIVE_SCAN}</li>
47      * <li>{@link #ACTIVE_FOCUSED}</li>
48      * <li>{@link #ACTIVE_UNFOCUSED}</li>
49      * <li>{@link #PASSIVE_SCAN}</li>
50      * <li>{@link #PASSIVE_FOCUSED}</li>
51      * <li>{@link #PASSIVE_UNFOCUSED}</li>
52      * </ul>
53      */
54     public static enum AutoFocusState {
55         /** Indicates AF system is inactive for some reason (could be an error). */
56         INACTIVE,
57         /** Indicates active scan in progress. */
58         ACTIVE_SCAN,
59         /** Indicates active scan success (in focus). */
60         ACTIVE_FOCUSED,
61         /** Indicates active scan failure (not in focus). */
62         ACTIVE_UNFOCUSED,
63         /** Indicates passive scan in progress. */
64         PASSIVE_SCAN,
65         /** Indicates passive scan success (in focus). */
66         PASSIVE_FOCUSED,
67         /** Indicates passive scan failure (not in focus). */
68         PASSIVE_UNFOCUSED
69     }
70 
71     /**
72      * Auto focus system mode.
73      * <ul>
74      * <li>{@link #CONTINUOUS_PICTURE}</li>
75      * <li>{@link #AUTO}</li>
76      * </ul>
77      */
78     public static enum AutoFocusMode {
79         /** System is continuously focusing. */
80         CONTINUOUS_PICTURE,
81         /** System is running a triggered scan. */
82         AUTO
83     }
84 
85     /**
86      * Classes implementing this interface will be called when the camera was
87      * opened or failed to open.
88      */
89     public static interface OpenCallback {
90         /**
91          * Called when the camera was opened successfully.
92          *
93          * @param camera the camera instance that was successfully opened
94          */
onCameraOpened(OneCamera camera)95         public void onCameraOpened(OneCamera camera);
96 
97         /**
98          * Called if opening the camera failed.
99          */
onFailure()100         public void onFailure();
101 
102         /**
103          * Called if the camera is closed or disconnected while attempting to
104          * open.
105          */
onCameraClosed()106         public void onCameraClosed();
107     }
108 
109     /**
110      * Classes implementing this interface will be called when the camera was
111      * closed.
112      */
113     public static interface CloseCallback {
114         /** Called when the camera was fully closed. */
onCameraClosed()115         public void onCameraClosed();
116     }
117 
118     /**
119      * Classes implementing this interface can be informed when we're ready to
120      * take a picture of if setting up the capture pipeline failed.
121      */
122     public static interface CaptureReadyCallback {
123         /** After this is called, the system is ready for capture requests. */
onReadyForCapture()124         public void onReadyForCapture();
125 
126         /**
127          * Indicates that something went wrong during setup and the system is
128          * not ready for capture requests.
129          */
onSetupFailed()130         public void onSetupFailed();
131     }
132 
133     /**
134      * Classes implementing this interface can be informed when the state of
135      * capture changes.
136      */
137     public static interface ReadyStateChangedListener {
138         /**
139          * Called when the camera is either ready or not ready to take a picture
140          * right now.
141          */
onReadyStateChanged(boolean readyForCapture)142         public void onReadyStateChanged(boolean readyForCapture);
143     }
144 
145     /**
146      * A class implementing this interface can be passed into the call to take a
147      * picture in order to receive the resulting image or updated about the
148      * progress.
149      */
150     public static interface PictureCallback {
151         /**
152          * Called near the the when an image is being exposed for cameras which
153          * are exposing a single frame, so that a UI can be presented for the
154          * capture.
155          */
onQuickExpose()156         public void onQuickExpose();
157 
158         /**
159          * Called when a thumbnail image is provided before the final image is
160          * finished.
161          */
onThumbnailResult(Bitmap bitmap)162         public void onThumbnailResult(Bitmap bitmap);
163 
164         /**
165          * Called when the final picture is done taking
166          *
167          * @param session the capture session
168          */
onPictureTaken(CaptureSession session)169         public void onPictureTaken(CaptureSession session);
170 
171         /**
172          * Called when the picture has been saved to disk.
173          *
174          * @param uri the URI of the stored data.
175          */
onPictureSaved(Uri uri)176         public void onPictureSaved(Uri uri);
177 
178         /**
179          * Called when picture taking failed.
180          */
onPictureTakenFailed()181         public void onPictureTakenFailed();
182 
183         /**
184          * Called when capture session is reporting a processing update. This
185          * should only be called by capture sessions that require the user to
186          * hold still for a while.
187          *
188          * @param progress a value from 0...1, indicating the current processing
189          *            progress.
190          */
onTakePictureProgress(float progress)191         public void onTakePictureProgress(float progress);
192     }
193 
194     /**
195      * Classes implementing this interface will be called whenever the camera
196      * encountered an error.
197      */
198     public static interface CameraErrorListener {
199         /** Called when the camera encountered an error. */
onCameraError()200         public void onCameraError();
201     }
202 
203     /**
204      * Classes implementing this interface will be called when the state of the
205      * focus changes. Guaranteed not to stay stuck in scanning state past some
206      * reasonable timeout even if Camera API is stuck.
207      */
208     public static interface FocusStateListener {
209         /**
210          * Called when state of auto focus system changes.
211          *
212          * @param state Current auto focus state.
213          * @param frameNumber Frame number if available.
214          */
onFocusStatusUpdate(AutoFocusState state, long frameNumber)215         public void onFocusStatusUpdate(AutoFocusState state, long frameNumber);
216     }
217 
218     /**
219      * Parameters to be given to photo capture requests.
220      */
221     public static final class PhotoCaptureParameters {
222         /**
223          * Flash modes.
224          * <p>
225          * Has to be in sync with R.arrays.pref_camera_flashmode_entryvalues.
226          */
227         public static enum Flash {
228             AUTO, OFF, ON
229         }
230 
231         /** The title/filename (without suffix) for this capture. */
232         public String title = null;
233         /** Called when the capture is completed or failed. */
234         public PictureCallback callback = null;
235         /** The device orientation so we can compute the right JPEG rotation. */
236         public int orientation = Integer.MIN_VALUE;
237         /** The heading of the device at time of capture. In degrees. */
238         public int heading = Integer.MIN_VALUE;
239         /** Flash mode for this capture. */
240         public Flash flashMode = Flash.AUTO;
241         /** The location of this capture. */
242         public Location location = null;
243 
244         /** Set this to provide a debug folder for this capture. */
245         public File debugDataFolder;
246 
247         /**
248          * Checks whether all required values are set. If one is missing, it
249          * throws a {@link RuntimeException}.
250          */
checkSanity()251         public void checkSanity() {
252             checkRequired(title);
253             checkRequired(callback);
254             checkRequired(orientation);
255             checkRequired(heading);
256         }
257 
checkRequired(int num)258         private void checkRequired(int num) {
259             if (num == Integer.MIN_VALUE) {
260                 throw new RuntimeException("Photo capture parameter missing.");
261             }
262         }
263 
checkRequired(Object obj)264         private void checkRequired(Object obj) {
265             if (obj == null) {
266                 throw new RuntimeException("Photo capture parameter missing.");
267             }
268         }
269     }
270 
271     /**
272      * Meters and triggers auto focus scan with ROI around tap point.
273      * <p/>
274      * Normalized coordinates are referenced to portrait preview window with
275      * (0, 0) top left and (1, 1) bottom right. Rotation has no effect.
276      *
277      * @param nx normalized x coordinate.
278      * @param ny normalized y coordinate.
279      */
triggerFocusAndMeterAtPoint(float nx, float ny)280     public void triggerFocusAndMeterAtPoint(float nx, float ny);
281 
282     /**
283      * Call this to take a picture.
284      *
285      * @param params parameters for taking pictures.
286      * @param session the capture session for this picture.
287      */
takePicture(PhotoCaptureParameters params, CaptureSession session)288     public void takePicture(PhotoCaptureParameters params, CaptureSession session);
289 
290     /**
291      * Sets or replaces a listener that is called whenever the camera encounters
292      * an error.
293      */
setCameraErrorListener(CameraErrorListener listener)294     public void setCameraErrorListener(CameraErrorListener listener);
295 
296     /**
297      * Sets or replaces a listener that is called whenever the focus state of
298      * the camera changes.
299      */
setFocusStateListener(FocusStateListener listener)300     public void setFocusStateListener(FocusStateListener listener);
301 
302     /**
303      * Sets or replaces a listener that is called whenever the state of the
304      * camera changes to be either ready or not ready to take another picture.
305      */
setReadyStateChangedListener(ReadyStateChangedListener listener)306     public void setReadyStateChangedListener(ReadyStateChangedListener listener);
307 
308     /**
309      * Starts a preview stream and renders it to the given surface.
310      */
startPreview(Surface surface, CaptureReadyCallback listener)311     public void startPreview(Surface surface, CaptureReadyCallback listener);
312 
313     /**
314      * Sets the size of the viewfinder.
315      * <p>
316      * The preview size requested from the camera device will depend on this as
317      * well as the requested photo/video aspect ratio.
318      */
setViewfinderSize(int width, int height)319     public void setViewfinderSize(int width, int height);
320 
321     /**
322      * @return Whether this camera supports flash.
323      * @param if true, returns whether flash is supported in enhanced mode. If
324      *        false, whether flash is supported in normal capture mode.
325      */
isFlashSupported(boolean enhanced)326     public boolean isFlashSupported(boolean enhanced);
327 
328     /**
329      * @return Whether this camera supports enhanced mode, such as HDR.
330      */
isSupportingEnhancedMode()331     public boolean isSupportingEnhancedMode();
332 
333     /**
334      * Closes the camera.
335      *
336      * @param closeCallback Optional. Called as soon as the camera is fully
337      *            closed.
338      */
close(CloseCallback closeCallback)339     public void close(CloseCallback closeCallback);
340 
341     /**
342      * @return A list of all supported resolutions.
343      */
getSupportedSizes()344     public Size[] getSupportedSizes();
345 
346     /**
347      * @return The aspect ratio of the full size capture (usually the native
348      *         resolution of the camera).
349      */
getFullSizeAspectRatio()350     public float getFullSizeAspectRatio();
351 
352     /**
353      * @return Whether this camera is facing to the back.
354      */
isBackFacing()355     public boolean isBackFacing();
356 
357     /**
358      * @return Whether this camera is facing to the front.
359      */
isFrontFacing()360     public boolean isFrontFacing();
361 
362     /**
363      * Get the maximum zoom value.
364      *
365      * @return A float number to represent the maximum zoom value(>= 1.0).
366      */
getMaxZoom()367     public float getMaxZoom();
368 
369     /**
370      * This function sets the current zoom ratio value.
371      * <p>
372      * The zoom range must be [1.0, maxZoom]. The maxZoom can be queried by
373      * {@link #getMaxZoom}.
374      *
375      * @param zoom Zoom ratio value passed to scaler.
376      */
setZoom(float zoom)377     public void setZoom(float zoom);
378 
379     /**
380      * Based on the selected picture size, this returns the best preview size.
381      *
382      * @param pictureSize the picture size as selected by the user. A camera
383      *            might choose not to obey these and therefore the returned
384      *            preview size might not match the aspect ratio of the given
385      *            size.
386      * @param context the android application context
387      * @return The preview size that best matches the picture aspect ratio that
388      *         will be taken.
389      */
pickPreviewSize(Size pictureSize, Context context)390     public Size pickPreviewSize(Size pictureSize, Context context);
391 }
392