/* * Copyright (C) 2013 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.session; import android.graphics.Bitmap; import android.location.Location; import android.net.Uri; import com.android.camera.exif.ExifInterface; import com.android.camera.stats.CaptureSessionStatsCollector; import com.android.camera.util.Size; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.util.concurrent.ListenableFuture; import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * A session is an item that is in progress of being created and saved, such as * a photo sphere or HDR+ photo. */ public interface CaptureSession { /** Classes implementing this interface can produce a capture session. */ public static interface CaptureSessionCreator { /** Creates and starts a new capture session. */ public CaptureSession createAndStartEmpty(); } /** * Classes implementing this interface can listen to progress updates of * this session. */ public static interface ProgressListener { /** * Called when the progress is changed. * * @param progressPercent The current progress in percent. */ public void onProgressChanged(int progressPercent); /** * Called when the progress message is changed. * * @param messageId The current progress message ID. */ public void onStatusMessageChanged(int messageId); } /** * Classes implementing this interface can listen to progress updates of * this session. */ public static interface ImageLifecycleListener { /** * Occurs when, for a particular image type, an image capture has * started. This method is always executed, and will always be called * first. */ public void onCaptureStarted(); /** * Occurs when the tiny thumbnail bytes are received. */ public void onTinyThumb(); /** * Occurs when the medium thumbnail bytes are received. */ public void onMediumThumb(); /** * Occurs when rendering/processing/encoding starts for the full size image. */ public void onProcessingStarted(); /** * Occurs when the rendering/processing/encoding for the full size image * is completed. */ public void onProcessingComplete(); /** * This occurs after all the bytes are physically on disk. */ public void onCapturePersisted(); /** * This occurs if a capture session is created but is later canceled for * some reason. */ public void onCaptureCanceled(); /** * This occurs if a capture session is created but failed to persist the * final image. */ public void onCaptureFailed(); } /** Returns the title/name of this session. */ public String getTitle(); /** Returns the location of this session or null. */ public Location getLocation(); /** Sets the location of this session. */ public void setLocation(Location location); /** * Set the progress in percent for the current session. If set to or left at * 0, no progress bar is shown. */ public void setProgress(int percent); /** * Returns the progress of this session in percent. */ public int getProgress(); /** * Returns the current progress message. */ public int getProgressMessageId(); /** * Changes the progress status message of this session. * * @param messageId the ID of the new message */ public void setProgressMessage(int messageId); /** * For an ongoing session, this updates the currently displayed thumbnail. * * @param bitmap the thumbnail to be shown while the session is in progress. */ public void updateThumbnail(Bitmap bitmap); /** * For an ongoing session, this updates the capture indicator thumbnail. * * @param bitmap the thumbnail to be shown while the session is in progress. * update the capture indicator * @param rotationDegrees the rotation of the thumbnail in degrees */ public void updateCaptureIndicatorThumbnail(Bitmap bitmap, int rotationDegrees); /** * Starts an empty session with the given placeholder size. * * @param listener receives events as the session progresses. * @param pictureSize the size, in pixels of the empty placeholder. */ public void startEmpty(@Nullable ImageLifecycleListener listener, @Nonnull Size pictureSize); /** * Starts the session by adding a placeholder to the filmstrip and adding * notifications. * * @param listener receives events as the session progresses. * @param placeholder a valid encoded bitmap to be used as the placeholder. * @param progressMessageId the message to be used to the progress * notification initially. This can later be changed using * {@link #setProgressMessage(int)}. */ public void startSession(@Nullable ImageLifecycleListener listener, @Nonnull byte[] placeholder, int progressMessageId); /** * Starts the session by adding a placeholder to the filmstrip and adding * notifications. * * @param listener receives events as the session progresses. * @param placeholder a valid bitmap to be used as the placeholder. * @param progressMessageId the message to be used to the progress * notification initially. This can later be changed using * {@link #setProgressMessage(int)}. */ @VisibleForTesting public void startSession(@Nullable ImageLifecycleListener listener, @Nonnull Bitmap placeholder, int progressMessageId); /** * Starts the session by marking the item as in-progress and adding * notifications. * * @param listener receives events as the session progresses. * @param uri the URI of the item to be re-processed. * @param progressMessageId the message to be used to the progress * notification initially. This can later be changed using * {@link #setProgressMessage(int)}. */ public void startSession(@Nullable ImageLifecycleListener listener, @Nonnull Uri uri, int progressMessageId); /** * Cancel the session without a final result. The session will be removed * from the film strip, progress notifications will be cancelled. */ public void cancel(); /** * Finish the session by saving the image to disk. Will add the final item * in the film strip and remove the progress notifications. * * @param data the data of the data (e.g. JPEG bytes) that should be written * to disk. * @param width the width of the media item, in pixels. * @param height the height of the media item, in pixels. * @param orientation the orientaiton of the media item, in degrees. * @param exif the EXIF information for this media item. * @return A future that will provide the URI once the item is saved. URI * might be absent if the data could not be saved successfull, which * in turn means if a URI is returned it is guaranteed that the * media item was successfully written to disk. */ public ListenableFuture> saveAndFinish(byte[] data, int width, int height, int orientation, ExifInterface exif); /** * Will create and return a {@link StackSaver} for saving out a number of * media items to a stack. The name of the stack will be the title of this * capture session. */ public StackSaver getStackSaver(); /** * Finishes the session. Resources may be held during notification of * finished state, {@link #finalizeSession()} must be called to fully complete * the session. */ public void finish(); /** * Finish the session and indicate it failed. Resources may be held during * notification of finished state, {@link #finalizeSession()} must be called to * fully complete the session. */ public void finishWithFailure(int failureMessageId, boolean removeFromFilmstrip); /** * All processing complete, finalize the session and remove any resources. */ public void finalizeSession(); /** * Returns the file to where the final output of this session should be * stored. This is only available after startSession has been called and * will become unavailable after finish() was called. */ public TemporarySessionFile getTempOutputFile(); /** * Returns the URI to the final output of this session. This is only * available after startSession has been called. */ public Uri getUri(); /** * Updates the preview from the file created from * {@link #getTempOutputFile()}. */ public void updatePreview(); /** * Adds a progress listener to this session. */ public void addProgressListener(ProgressListener listener); /** * Removes the given progress listener from this session. */ public void removeProgressListener(ProgressListener listener); /** * Returns the associated StatsCollector Object * @return */ public CaptureSessionStatsCollector getCollector(); }