blob: 555f6cb4e127881ea92c54e9546057776b589c22 [file] [log] [blame]
/*
* Copyright (C) 2014 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.camera.one;
import android.graphics.Bitmap;
import android.net.Uri;
import android.view.Surface;
import com.android.camera.session.CaptureSession;
import com.android.camera.util.Size;
import java.io.File;
/**
* OneCamera is a camera API tailored around our Google Camera application
* needs. It's not a general purpose API but instead offers an API with exactly
* what's needed from the app's side.
*/
public interface OneCamera {
/** Which way the camera is facing. */
public static enum Facing {
FRONT, BACK;
}
/**
* Auto focus system status.
* <ul>
* <li>{@link #INACTIVE}</li>
* <li>{@link #SCANNING}</li>
* <li>{@link #STOPPED_FOCUSED}</li>
* <li>{@link #STOPPED_UNFOCUSED}</li>
* </ul>
*/
public static enum AutoFocusState {
/** Indicates AF system is inactive for some reason (could be an error). */
INACTIVE,
/** Indicates scan in progress. */
SCANNING,
/** Indicates scan success (camera in focus). */
STOPPED_FOCUSED,
/** Indicates scan or other failure. */
STOPPED_UNFOCUSED
}
/**
* Auto focus system mode.
* <ul>
* <li>{@link #CONTINUOUS_PICTURE}</li>
* <li>{@link #AUTO}</li>
* </ul>
*/
public static enum AutoFocusMode {
/** System is continuously focusing. */
CONTINUOUS_PICTURE,
/** System is running a triggered scan. */
AUTO
}
/**
* Classes implementing this interface will be called when the camera was
* opened or failed to open.
*/
public static interface OpenCallback {
/**
* Called when the camera was opened successfully.
*
* @param camera the camera instance that was successfully opened
*/
public void onCameraOpened(OneCamera camera);
/**
* Called if opening the camera failed.
*/
public void onFailure();
}
/**
* Classes implementing this interface will be called when the camera was
* closed.
*/
public static interface CloseCallback {
/** Called when the camera was fully closed. */
public void onCameraClosed();
}
/**
* Classes implementing this interface can be informed when we're ready to
* take a picture of if setting up the capture pipeline failed.
*/
public static interface CaptureReadyCallback {
/** After this is called, the system is ready for capture requests. */
public void onReadyForCapture();
/**
* Indicates that something went wrong during setup and the system is
* not ready for capture requests.
*/
public void onSetupFailed();
}
/**
* A class implementing this interface can be passed into the call to take a
* picture in order to receive the resulting image or updated about the
* progress.
*/
public static interface PictureCallback {
/**
* Called when a thumbnail image is provided before the final image is
* finished.
*/
public void onThumbnailResult(Bitmap bitmap);
/**
* Called when the final picture is done taking
*
* @param session the capture session
*/
public void onPictureTaken(CaptureSession session);
/**
* Called when the picture has been saved to disk.
*
* @param uri the URI of the stored data.
*/
public void onPictureSaved(Uri uri);
/**
* Called when picture taking failed.
*/
public void onPictureTakenFailed();
/**
* Called if the capture session requires processing to update the the
* implementer about the current progress.
*
* @param progressPercent a value from 0-100, indicating the current
* processing progress.
*/
public void onTakePictureProgress(int progressPercent);
}
/**
* Classes implementing this interface will be called whenever the camera
* encountered an error.
*/
public static interface CameraErrorListener {
/** Called when the camera encountered an error. */
public void onCameraError();
}
/**
* Classes implementing this interface will be called when the state of the
* focus changes. Guaranteed not to stay stuck in scanning state past some
* reasonable timeout even if Camera API is stuck.
*/
public static interface FocusStateListener {
/**
* Called when mode or state of auto focus system changes.
*
* @param mode Is manual AF trigger cycle active.
* @param state Current state: scanning, focused, not focused, inactive.
*/
public void onFocusStatusUpdate(AutoFocusMode mode, AutoFocusState state);
}
/**
* Parameters to be given to photo capture requests.
*/
public static final class PhotoCaptureParameters {
/**
* Flash modes.
* <p>
* Has to be in sync with R.arrays.pref_camera_flashmode_entryvalues.
*/
public static enum Flash {
AUTO, OFF, ON
}
/** The title/filename (without suffix) for this capture. */
public String title = null;
/** Called when the capture is completed or failed. */
public PictureCallback callback = null;
/** The device orientation so we can compute the right JPEG rotation. */
public int orientation = Integer.MIN_VALUE;
/** The heading of the device at time of capture. In degrees. */
public int heading = Integer.MIN_VALUE;
/** Flash mode for this capture. */
public Flash flashMode = Flash.AUTO;
// TODO: Add Location
/** Set this to provide a debug folder for this capture. */
public File debugDataFolder;
/**
* Checks whether all required values are set. If one is missing, it
* throws a {@link RuntimeException}.
*/
public void checkSanity() {
checkRequired(title);
checkRequired(callback);
checkRequired(orientation);
checkRequired(heading);
}
private void checkRequired(int num) {
if (num == Integer.MIN_VALUE) {
throw new RuntimeException("Photo capture parameter missing.");
}
}
private void checkRequired(Object obj) {
if (obj == null) {
throw new RuntimeException("Photo capture parameter missing.");
}
}
}
/**
* Triggers auto focus scan for default ROI.
*/
public void triggerAutoFocus();
/**
* Meters and triggers auto focus scan with ROI around tap point.
* <p/>
* Normalized coordinates are referenced to portrait preview window
* with 0,0 top left and 1,1 bottom right. Rotation has no effect.
*
* @param nx normalized x coordinate.
* @param nx normalized y coordinate.
*/
public void triggerFocusAndMeterAtPoint(float nx, float ny);
/**
* Call this to take a picture.
*
* @param params parameters for taking pictures.
* @param session the capture session for this picture.
*/
public void takePicture(PhotoCaptureParameters params, CaptureSession session);
/**
* Sets or replaces a listener that is called whenever the camera encounters
* an error.
*/
public void setCameraErrorListener(CameraErrorListener listener);
/**
* Sets or replaces a listener that is called whenever the focus state of
* the camera changes.
*/
public void setFocusStateListener(FocusStateListener listener);
/**
* Starts a preview stream and renders it to the given surface.
*/
public void startPreview(Surface surface, CaptureReadyCallback listener);
/**
* Sets the size of the viewfinder.
* <p>
* The preview size requested from the camera device will depend on this as
* well as the requested photo/video aspect ratio.
*/
public void setViewFinderSize(int width, int height);
/**
* @return Whether this camera supports flash.
* @param if true, returns whether flash is supported in enhanced mode. If
* false, whether flash is supported in normal capture mode.
*/
public boolean isFlashSupported(boolean enhanced);
/**
* @return Whether this camera supports enhanced mode, such as HDR.
*/
public boolean isSupportingEnhancedMode();
/**
* Closes the camera.
*
* @param closeCallback Optional. Called as soon as the camera is fully
* closed.
*/
public void close(CloseCallback closeCallback);
/**
* @return A list of all supported resolutions.
*/
public Size[] getSupportedSizes();
/**
* @return The aspect ratio of the full size capture (usually the native
* resolution of the camera).
*/
public double getFullSizeAspectRatio();
/**
* @return Whether this camera is facing to the back.
*/
public boolean isBackFacing();
/**
* @return Whether this camera is facing to the front.
*/
public boolean isFrontFacing();
}