summaryrefslogtreecommitdiffstats
path: root/camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java
diff options
context:
space:
mode:
authorSol Boucher <solb@google.com>2014-06-18 11:08:04 -0700
committerSol Boucher <solb@google.com>2014-06-18 11:42:10 -0700
commit4f425ba476d62b4be7078f2084af37cf306b31c6 (patch)
treeaadd2deb7a12c92e3c7c6ba9d83296f47a682065 /camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java
parente224f6688362452a4f9021e54f4a2fdc73dee2c5 (diff)
downloadandroid_frameworks_ex-4f425ba476d62b4be7078f2084af37cf306b31c6.tar.gz
android_frameworks_ex-4f425ba476d62b4be7078f2084af37cf306b31c6.tar.bz2
android_frameworks_ex-4f425ba476d62b4be7078f2084af37cf306b31c6.zip
camera2-portability: Rename CameraManager to CameraAgent
This resolves a naming clash with a class in the new camera2 framework API. Change-Id: Id53aa3e0bbe9e9edaa82b0aec695fd835c3d0ef9
Diffstat (limited to 'camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java')
-rw-r--r--camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java581
1 files changed, 581 insertions, 0 deletions
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java b/camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java
new file mode 100644
index 0000000..91598e3
--- /dev/null
+++ b/camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java
@@ -0,0 +1,581 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ex.camera2.portability;
+
+import android.annotation.TargetApi;
+import android.graphics.SurfaceTexture;
+import android.hardware.Camera;
+import android.hardware.Camera.OnZoomChangeListener;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.SurfaceHolder;
+
+/**
+ * An interface which provides possible camera device operations.
+ *
+ * The client should call {@code CameraAgent.openCamera} to get an instance
+ * of {@link CameraAgent.CameraProxy} to control the camera. Classes
+ * implementing this interface should have its own one unique {@code Thread}
+ * other than the main thread for camera operations. Camera device callbacks
+ * are wrapped since the client should not deal with
+ * {@code android.hardware.Camera} directly.
+ *
+ * TODO: provide callback interfaces for:
+ * {@code android.hardware.Camera.ErrorCallback},
+ * {@code android.hardware.Camera.OnZoomChangeListener}, and
+ */
+public interface CameraAgent {
+ public static final long CAMERA_OPERATION_TIMEOUT_MS = 2500;
+
+ public static class CameraStartPreviewCallbackForward
+ implements CameraStartPreviewCallback {
+ private final Handler mHandler;
+ private final CameraStartPreviewCallback mCallback;
+
+ public static CameraStartPreviewCallbackForward getNewInstance(
+ Handler handler, CameraStartPreviewCallback cb) {
+ if (handler == null || cb == null) {
+ return null;
+ }
+ return new CameraStartPreviewCallbackForward(handler, cb);
+ }
+
+ private CameraStartPreviewCallbackForward(Handler h,
+ CameraStartPreviewCallback cb) {
+ mHandler = h;
+ mCallback = cb;
+ }
+
+ @Override
+ public void onPreviewStarted() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onPreviewStarted();
+ }
+ });
+ }
+ }
+
+ /**
+ * A callback helps to invoke the original callback on another
+ * {@link android.os.Handler}.
+ */
+ public static class CameraOpenCallbackForward implements CameraOpenCallback {
+ private final Handler mHandler;
+ private final CameraOpenCallback mCallback;
+
+ /**
+ * Returns a new instance of {@link FaceDetectionCallbackForward}.
+ *
+ * @param handler The handler in which the callback will be invoked in.
+ * @param cb The callback to be invoked.
+ * @return The instance of the {@link FaceDetectionCallbackForward}, or
+ * null if any parameter is null.
+ */
+ public static CameraOpenCallbackForward getNewInstance(
+ Handler handler, CameraOpenCallback cb) {
+ if (handler == null || cb == null) {
+ return null;
+ }
+ return new CameraOpenCallbackForward(handler, cb);
+ }
+
+ private CameraOpenCallbackForward(Handler h, CameraOpenCallback cb) {
+ // Given that we are using the main thread handler, we can create it
+ // here instead of holding onto the PhotoModule objects. In this
+ // way, we can avoid memory leak.
+ mHandler = new Handler(Looper.getMainLooper());
+ mCallback = cb;
+ }
+
+ @Override
+ public void onCameraOpened(final CameraProxy camera) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onCameraOpened(camera);
+ }
+ });
+ }
+
+ @Override
+ public void onCameraDisabled(final int cameraId) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onCameraDisabled(cameraId);
+ }
+ });
+ }
+
+ @Override
+ public void onDeviceOpenFailure(final int cameraId, final String info) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onDeviceOpenFailure(cameraId, info);
+ }
+ });
+ }
+
+ @Override
+ public void onDeviceOpenedAlready(final int cameraId, final String info) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onDeviceOpenedAlready(cameraId, info);
+ }
+ });
+ }
+
+ @Override
+ public void onReconnectionFailure(final CameraAgent mgr, final String info) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onReconnectionFailure(mgr, info);
+ }
+ });
+ }
+ }
+
+ /**
+ * A handler for all camera api runtime exceptions.
+ * The default behavior is to throw the runtime exception.
+ */
+ public interface CameraExceptionCallback {
+ public void onCameraException(RuntimeException e);
+ }
+
+ /**
+ * An interface which wraps
+ * {@link android.hardware.Camera.ErrorCallback}
+ */
+ public interface CameraErrorCallback {
+ public void onError(int error, CameraProxy camera);
+ }
+
+ /**
+ * An interface which wraps
+ * {@link android.hardware.Camera.AutoFocusCallback}.
+ */
+ public interface CameraAFCallback {
+ public void onAutoFocus(boolean focused, CameraProxy camera);
+ }
+
+ /**
+ * An interface which wraps
+ * {@link android.hardware.Camera.AutoFocusMoveCallback}.
+ */
+ public interface CameraAFMoveCallback {
+ public void onAutoFocusMoving(boolean moving, CameraProxy camera);
+ }
+
+ /**
+ * An interface which wraps
+ * {@link android.hardware.Camera.ShutterCallback}.
+ */
+ public interface CameraShutterCallback {
+ public void onShutter(CameraProxy camera);
+ }
+
+ /**
+ * An interface which wraps
+ * {@link android.hardware.Camera.PictureCallback}.
+ */
+ public interface CameraPictureCallback {
+ public void onPictureTaken(byte[] data, CameraProxy camera);
+ }
+
+ /**
+ * An interface which wraps
+ * {@link android.hardware.Camera.PreviewCallback}.
+ */
+ public interface CameraPreviewDataCallback {
+ public void onPreviewFrame(byte[] data, CameraProxy camera);
+ }
+
+ /**
+ * An interface which wraps
+ * {@link android.hardware.Camera.FaceDetectionListener}.
+ */
+ public interface CameraFaceDetectionCallback {
+ /**
+ * Callback for face detection.
+ *
+ * @param faces Recognized face in the preview.
+ * @param camera The camera which the preview image comes from.
+ */
+ public void onFaceDetection(Camera.Face[] faces, CameraProxy camera);
+ }
+
+ /**
+ * An interface to be called when the camera preview has started.
+ */
+ public interface CameraStartPreviewCallback {
+ /**
+ * Callback when the preview starts.
+ */
+ public void onPreviewStarted();
+ }
+
+ /**
+ * An interface to be called for any events when opening or closing the
+ * camera device. This error callback is different from the one defined
+ * in the framework, {@link android.hardware.Camera.ErrorCallback}, which
+ * is used after the camera is opened.
+ */
+ public interface CameraOpenCallback {
+ /**
+ * Callback when camera open succeeds.
+ */
+ public void onCameraOpened(CameraProxy camera);
+
+ /**
+ * Callback when {@link com.android.camera.CameraDisabledException} is
+ * caught.
+ *
+ * @param cameraId The disabled camera.
+ */
+ public void onCameraDisabled(int cameraId);
+
+ /**
+ * Callback when {@link com.android.camera.CameraHardwareException} is
+ * caught.
+ *
+ * @param cameraId The camera with the hardware failure.
+ * @param info The extra info regarding this failure.
+ */
+ public void onDeviceOpenFailure(int cameraId, String info);
+
+ /**
+ * Callback when trying to open the camera which is already opened.
+ *
+ * @param cameraId The camera which is causing the open error.
+ */
+ public void onDeviceOpenedAlready(int cameraId, String info);
+
+ /**
+ * Callback when {@link java.io.IOException} is caught during
+ * {@link android.hardware.Camera#reconnect()}.
+ *
+ * @param mgr The {@link CameraAgent}
+ * with the reconnect failure.
+ */
+ public void onReconnectionFailure(CameraAgent mgr, String info);
+ }
+
+ /**
+ * Opens the camera of the specified ID asynchronously. The camera device
+ * will be opened in the camera handler thread and will be returned through
+ * the {@link CameraAgent.CameraOpenCallback#
+ * onCameraOpened(com.android.camera.cameradevice.CameraAgent.CameraProxy)}.
+ *
+ * @param handler The {@link android.os.Handler} in which the callback
+ * was handled.
+ * @param callback The callback for the result.
+ * @param cameraId The camera ID to open.
+ */
+ public void openCamera(Handler handler, int cameraId, CameraOpenCallback callback);
+
+ /**
+ * Closes the camera device.
+ *
+ * @param camera The camera to close. {@code null} means all.
+ * @param synced Whether this call should be synchronous.
+ */
+ public void closeCamera(CameraProxy camera, boolean synced);
+
+ /**
+ * Sets a callback for handling camera api runtime exceptions on
+ * a handler.
+ */
+ public void setCameraDefaultExceptionCallback(CameraExceptionCallback callback,
+ Handler handler);
+
+ /**
+ * Recycles the resources used by this instance. CameraAgent will be in
+ * an unusable state after calling this.
+ */
+ public void recycle();
+
+ /**
+ * @return The camera devices info.
+ */
+ public CameraDeviceInfo getCameraDeviceInfo();
+
+ /**
+ * An interface that takes camera operation requests and post messages to the
+ * camera handler thread. All camera operations made through this interface is
+ * asynchronous by default except those mentioned specifically.
+ */
+ public interface CameraProxy {
+
+ /**
+ * Returns the underlying {@link android.hardware.Camera} object used
+ * by this proxy. This method should only be used when handing the
+ * camera device over to {@link android.media.MediaRecorder} for
+ * recording.
+ */
+ @Deprecated
+ public android.hardware.Camera getCamera();
+
+ /**
+ * @return The camera ID associated to by this
+ * {@link CameraAgent.CameraProxy}.
+ */
+ public int getCameraId();
+
+ /**
+ * @return The camera capabilities.
+ */
+ public CameraCapabilities getCapabilities();
+
+ /**
+ * Reconnects to the camera device. On success, the camera device will
+ * be returned through {@link CameraAgent
+ * .CameraOpenCallback#onCameraOpened(com.android.camera.cameradevice.CameraAgent
+ * .CameraProxy)}.
+ * @see android.hardware.Camera#reconnect()
+ *
+ * @param handler The {@link android.os.Handler} in which the callback
+ * was handled.
+ * @param cb The callback when any error happens.
+ */
+ public void reconnect(Handler handler, CameraOpenCallback cb);
+
+ /**
+ * Unlocks the camera device.
+ *
+ * @see android.hardware.Camera#unlock()
+ */
+ public void unlock();
+
+ /**
+ * Locks the camera device.
+ * @see android.hardware.Camera#lock()
+ */
+ public void lock();
+
+ /**
+ * Sets the {@link android.graphics.SurfaceTexture} for preview.
+ *
+ * @param surfaceTexture The {@link SurfaceTexture} for preview.
+ */
+ public void setPreviewTexture(final SurfaceTexture surfaceTexture);
+
+ /**
+ * Blocks until a {@link android.graphics.SurfaceTexture} has been set
+ * for preview.
+ *
+ * @param surfaceTexture The {@link SurfaceTexture} for preview.
+ */
+ public void setPreviewTextureSync(final SurfaceTexture surfaceTexture);
+
+ /**
+ * Sets the {@link android.view.SurfaceHolder} for preview.
+ *
+ * @param surfaceHolder The {@link SurfaceHolder} for preview.
+ */
+ public void setPreviewDisplay(final SurfaceHolder surfaceHolder);
+
+ /**
+ * Starts the camera preview.
+ */
+ public void startPreview();
+
+ /**
+ * Starts the camera preview and executes a callback on a handler once
+ * the preview starts.
+ */
+ public void startPreviewWithCallback(Handler h, CameraStartPreviewCallback cb);
+
+ /**
+ * Stops the camera preview synchronously.
+ * {@code stopPreview()} must be synchronous to ensure that the caller can
+ * continues to release resources related to camera preview.
+ */
+ public void stopPreview();
+
+ /**
+ * Sets the callback for preview data.
+ *
+ * @param handler The {@link android.os.Handler} in which the callback was handled.
+ * @param cb The callback to be invoked when the preview data is available.
+ * @see android.hardware.Camera#setPreviewCallback(android.hardware.Camera.PreviewCallback)
+ */
+ public void setPreviewDataCallback(Handler handler, CameraPreviewDataCallback cb);
+
+ /**
+ * Sets the one-time callback for preview data.
+ *
+ * @param handler The {@link android.os.Handler} in which the callback was handled.
+ * @param cb The callback to be invoked when the preview data for
+ * next frame is available.
+ * @see android.hardware.Camera#setPreviewCallback(android.hardware.Camera.PreviewCallback)
+ */
+ public void setOneShotPreviewCallback(Handler handler, CameraPreviewDataCallback cb);
+
+ /**
+ * Sets the callback for preview data.
+ *
+ * @param handler The handler in which the callback will be invoked.
+ * @param cb The callback to be invoked when the preview data is available.
+ * @see android.hardware.Camera#setPreviewCallbackWithBuffer(android.hardware.Camera.PreviewCallback)
+ */
+ public void setPreviewDataCallbackWithBuffer(Handler handler, CameraPreviewDataCallback cb);
+
+ /**
+ * Adds buffer for the preview callback.
+ *
+ * @param callbackBuffer The buffer allocated for the preview data.
+ */
+ public void addCallbackBuffer(byte[] callbackBuffer);
+
+ /**
+ * Starts the auto-focus process. The result will be returned through the callback.
+ *
+ * @param handler The handler in which the callback will be invoked.
+ * @param cb The auto-focus callback.
+ */
+ public void autoFocus(Handler handler, CameraAFCallback cb);
+
+ /**
+ * Cancels the auto-focus process.
+ */
+ public void cancelAutoFocus();
+
+ /**
+ * Sets the auto-focus callback
+ *
+ * @param handler The handler in which the callback will be invoked.
+ * @param cb The callback to be invoked when the preview data is available.
+ */
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+ public void setAutoFocusMoveCallback(Handler handler, CameraAFMoveCallback cb);
+
+ /**
+ * Instrument the camera to take a picture.
+ *
+ * @param handler The handler in which the callback will be invoked.
+ * @param shutter The callback for shutter action, may be null.
+ * @param raw The callback for uncompressed data, may be null.
+ * @param postview The callback for postview image data, may be null.
+ * @param jpeg The callback for jpeg image data, may be null.
+ * @see android.hardware.Camera#takePicture(
+ * android.hardware.Camera.ShutterCallback,
+ * android.hardware.Camera.PictureCallback,
+ * android.hardware.Camera.PictureCallback)
+ */
+ public void takePicture(
+ Handler handler,
+ CameraShutterCallback shutter,
+ CameraPictureCallback raw,
+ CameraPictureCallback postview,
+ CameraPictureCallback jpeg);
+
+ /**
+ * Sets the display orientation for camera to adjust the preview orientation.
+ *
+ * @param degrees The rotation in degrees. Should be 0, 90, 180 or 270.
+ */
+ public void setDisplayOrientation(int degrees);
+
+ /**
+ * Sets the listener for zoom change.
+ *
+ * @param listener The listener.
+ */
+ public void setZoomChangeListener(OnZoomChangeListener listener);
+
+ /**
+ * Sets the face detection listener.
+ *
+ * @param handler The handler in which the callback will be invoked.
+ * @param callback The callback for face detection results.
+ */
+ public void setFaceDetectionCallback(Handler handler, CameraFaceDetectionCallback callback);
+
+ /**
+ * Starts the face detection.
+ */
+ public void startFaceDetection();
+
+ /**
+ * Stops the face detection.
+ */
+ public void stopFaceDetection();
+
+ /**
+ * Registers an error callback.
+ *
+ * @param handler The handler on which the callback will be invoked.
+ * @param cb The error callback.
+ * @see android.hardware.Camera#setErrorCallback(android.hardware.Camera.ErrorCallback)
+ */
+ public void setErrorCallback(Handler handler, CameraErrorCallback cb);
+
+ /**
+ * Sets the camera parameters.
+ *
+ * @param params The camera parameters to use.
+ */
+ @Deprecated
+ public void setParameters(Camera.Parameters params);
+
+ /**
+ * Gets the current camera parameters synchronously. This method is
+ * synchronous since the caller has to wait for the camera to return
+ * the parameters. If the parameters are already cached, it returns
+ * immediately.
+ */
+ @Deprecated
+ public Camera.Parameters getParameters();
+
+ /**
+ * Gets the current camera settings synchronously.
+ * <p>This method is synchronous since the caller has to wait for the
+ * camera to return the parameters. If the parameters are already
+ * cached, it returns immediately.</p>
+ */
+ public CameraSettings getSettings();
+
+ /**
+ * Applies the settings to the camera device.
+ *
+ * @param settings The settings to use on the device.
+ * @return Whether the settings can be applied.
+ */
+ public boolean applySettings(CameraSettings settings);
+
+ /**
+ * Forces {@code CameraProxy} to update the cached version of the camera
+ * settings regardless of the dirty bit.
+ */
+ public void refreshSettings();
+
+ /**
+ * Enables/Disables the camera shutter sound.
+ *
+ * @param enable {@code true} to enable the shutter sound,
+ * {@code false} to disable it.
+ */
+ public void enableShutterSound(boolean enable);
+ }
+}