blob: c4b76c272d9d814ac7a61da23df1fb214dd10292 [file] [log] [blame]
/*
* 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<Optional<Uri>> 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();
}