1 /* 2 * Copyright (C) 2013 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.session; 18 19 import android.graphics.Bitmap; 20 import android.location.Location; 21 import android.net.Uri; 22 23 import com.android.camera.exif.ExifInterface; 24 import com.android.camera.stats.CaptureSessionStatsCollector; 25 import com.android.camera.util.Size; 26 import com.google.common.annotations.VisibleForTesting; 27 import com.google.common.base.Optional; 28 import com.google.common.util.concurrent.ListenableFuture; 29 30 import javax.annotation.Nonnull; 31 import javax.annotation.Nullable; 32 33 /** 34 * A session is an item that is in progress of being created and saved, such as 35 * a photo sphere or HDR+ photo. 36 */ 37 public interface CaptureSession { 38 39 /** Classes implementing this interface can produce a capture session. */ 40 public static interface CaptureSessionCreator { 41 /** Creates and starts a new capture session. */ createAndStartEmpty()42 public CaptureSession createAndStartEmpty(); 43 } 44 45 /** 46 * Classes implementing this interface can listen to progress updates of 47 * this session. 48 */ 49 public static interface ProgressListener { 50 /** 51 * Called when the progress is changed. 52 * 53 * @param progressPercent The current progress in percent. 54 */ onProgressChanged(int progressPercent)55 public void onProgressChanged(int progressPercent); 56 57 /** 58 * Called when the progress message is changed. 59 * 60 * @param messageId The current progress message ID. 61 */ onStatusMessageChanged(int messageId)62 public void onStatusMessageChanged(int messageId); 63 } 64 65 /** 66 * Classes implementing this interface can listen to progress updates of 67 * this session. 68 */ 69 public static interface ImageLifecycleListener { 70 /** 71 * Occurs when, for a particular image type, an image capture has 72 * started. This method is always executed, and will always be called 73 * first. 74 */ onCaptureStarted()75 public void onCaptureStarted(); 76 77 /** 78 * Occurs when the tiny thumbnail bytes are received. 79 */ onTinyThumb()80 public void onTinyThumb(); 81 82 /** 83 * Occurs when the medium thumbnail bytes are received. 84 */ onMediumThumb()85 public void onMediumThumb(); 86 87 /** 88 * Occurs when rendering/processing/encoding starts for the full size image. 89 */ onProcessingStarted()90 public void onProcessingStarted(); 91 92 /** 93 * Occurs when the rendering/processing/encoding for the full size image 94 * is completed. 95 */ onProcessingComplete()96 public void onProcessingComplete(); 97 98 /** 99 * This occurs after all the bytes are physically on disk. 100 */ onCapturePersisted()101 public void onCapturePersisted(); 102 103 /** 104 * This occurs if a capture session is created but is later canceled for 105 * some reason. 106 */ onCaptureCanceled()107 public void onCaptureCanceled(); 108 109 /** 110 * This occurs if a capture session is created but failed to persist the 111 * final image. 112 */ onCaptureFailed()113 public void onCaptureFailed(); 114 } 115 116 /** Returns the title/name of this session. */ getTitle()117 public String getTitle(); 118 119 /** Returns the location of this session or null. */ getLocation()120 public Location getLocation(); 121 122 /** Sets the location of this session. */ setLocation(Location location)123 public void setLocation(Location location); 124 125 /** 126 * Set the progress in percent for the current session. If set to or left at 127 * 0, no progress bar is shown. 128 */ setProgress(int percent)129 public void setProgress(int percent); 130 131 /** 132 * Returns the progress of this session in percent. 133 */ getProgress()134 public int getProgress(); 135 136 /** 137 * Returns the current progress message. 138 */ getProgressMessageId()139 public int getProgressMessageId(); 140 141 /** 142 * Changes the progress status message of this session. 143 * 144 * @param messageId the ID of the new message 145 */ setProgressMessage(int messageId)146 public void setProgressMessage(int messageId); 147 148 /** 149 * For an ongoing session, this updates the currently displayed thumbnail. 150 * 151 * @param bitmap the thumbnail to be shown while the session is in progress. 152 */ updateThumbnail(Bitmap bitmap)153 public void updateThumbnail(Bitmap bitmap); 154 155 /** 156 * For an ongoing session, this updates the capture indicator thumbnail. 157 * 158 * @param bitmap the thumbnail to be shown while the session is in progress. 159 * update the capture indicator 160 * @param rotationDegrees the rotation of the thumbnail in degrees 161 */ updateCaptureIndicatorThumbnail(Bitmap bitmap, int rotationDegrees)162 public void updateCaptureIndicatorThumbnail(Bitmap bitmap, int rotationDegrees); 163 164 /** 165 * Starts an empty session with the given placeholder size. 166 * 167 * @param listener receives events as the session progresses. 168 * @param pictureSize the size, in pixels of the empty placeholder. 169 */ startEmpty(@ullable ImageLifecycleListener listener, @Nonnull Size pictureSize)170 public void startEmpty(@Nullable ImageLifecycleListener listener, @Nonnull Size pictureSize); 171 172 /** 173 * Starts the session by adding a placeholder to the filmstrip and adding 174 * notifications. 175 * 176 * @param listener receives events as the session progresses. 177 * @param placeholder a valid encoded bitmap to be used as the placeholder. 178 * @param progressMessageId the message to be used to the progress 179 * notification initially. This can later be changed using 180 * {@link #setProgressMessage(int)}. 181 */ startSession(@ullable ImageLifecycleListener listener, @Nonnull byte[] placeholder, int progressMessageId)182 public void startSession(@Nullable ImageLifecycleListener listener, @Nonnull byte[] placeholder, 183 int progressMessageId); 184 185 /** 186 * Starts the session by adding a placeholder to the filmstrip and adding 187 * notifications. 188 * 189 * @param listener receives events as the session progresses. 190 * @param placeholder a valid bitmap to be used as the placeholder. 191 * @param progressMessageId the message to be used to the progress 192 * notification initially. This can later be changed using 193 * {@link #setProgressMessage(int)}. 194 */ 195 @VisibleForTesting startSession(@ullable ImageLifecycleListener listener, @Nonnull Bitmap placeholder, int progressMessageId)196 public void startSession(@Nullable ImageLifecycleListener listener, @Nonnull Bitmap placeholder, 197 int progressMessageId); 198 199 /** 200 * Starts the session by marking the item as in-progress and adding 201 * notifications. 202 * 203 * @param listener receives events as the session progresses. 204 * @param uri the URI of the item to be re-processed. 205 * @param progressMessageId the message to be used to the progress 206 * notification initially. This can later be changed using 207 * {@link #setProgressMessage(int)}. 208 */ startSession(@ullable ImageLifecycleListener listener, @Nonnull Uri uri, int progressMessageId)209 public void startSession(@Nullable ImageLifecycleListener listener, @Nonnull Uri uri, 210 int progressMessageId); 211 212 /** 213 * Cancel the session without a final result. The session will be removed 214 * from the film strip, progress notifications will be cancelled. 215 */ cancel()216 public void cancel(); 217 218 /** 219 * Finish the session by saving the image to disk. Will add the final item 220 * in the film strip and remove the progress notifications. 221 * 222 * @param data the data of the data (e.g. JPEG bytes) that should be written 223 * to disk. 224 * @param width the width of the media item, in pixels. 225 * @param height the height of the media item, in pixels. 226 * @param orientation the orientaiton of the media item, in degrees. 227 * @param exif the EXIF information for this media item. 228 * @return A future that will provide the URI once the item is saved. URI 229 * might be absent if the data could not be saved successfull, which 230 * in turn means if a URI is returned it is guaranteed that the 231 * media item was successfully written to disk. 232 */ saveAndFinish(byte[] data, int width, int height, int orientation, ExifInterface exif)233 public ListenableFuture<Optional<Uri>> saveAndFinish(byte[] data, int width, int height, 234 int orientation, ExifInterface exif); 235 236 /** 237 * Will create and return a {@link StackSaver} for saving out a number of 238 * media items to a stack. The name of the stack will be the title of this 239 * capture session. 240 */ getStackSaver()241 public StackSaver getStackSaver(); 242 243 /** 244 * Finishes the session. Resources may be held during notification of 245 * finished state, {@link #finalizeSession()} must be called to fully complete 246 * the session. 247 */ finish()248 public void finish(); 249 250 /** 251 * Finish the session and indicate it failed. Resources may be held during 252 * notification of finished state, {@link #finalizeSession()} must be called to 253 * fully complete the session. 254 */ finishWithFailure(int failureMessageId, boolean removeFromFilmstrip)255 public void finishWithFailure(int failureMessageId, boolean removeFromFilmstrip); 256 257 /** 258 * All processing complete, finalize the session and remove any resources. 259 */ finalizeSession()260 public void finalizeSession(); 261 262 /** 263 * Returns the file to where the final output of this session should be 264 * stored. This is only available after startSession has been called and 265 * will become unavailable after finish() was called. 266 */ getTempOutputFile()267 public TemporarySessionFile getTempOutputFile(); 268 269 /** 270 * Returns the URI to the final output of this session. This is only 271 * available after startSession has been called. 272 */ getUri()273 public Uri getUri(); 274 275 /** 276 * Updates the preview from the file created from 277 * {@link #getTempOutputFile()}. 278 */ updatePreview()279 public void updatePreview(); 280 281 /** 282 * Adds a progress listener to this session. 283 */ addProgressListener(ProgressListener listener)284 public void addProgressListener(ProgressListener listener); 285 286 /** 287 * Removes the given progress listener from this session. 288 */ removeProgressListener(ProgressListener listener)289 public void removeProgressListener(ProgressListener listener); 290 291 /** 292 * Returns the associated StatsCollector Object 293 * @return 294 */ getCollector()295 public CaptureSessionStatsCollector getCollector(); 296 } 297