diff options
author | Sascha Haeberling <haeberling@google.com> | 2015-04-13 14:06:16 -0700 |
---|---|---|
committer | Sascha Haeberling <haeberling@google.com> | 2015-04-13 15:30:34 -0700 |
commit | 9c6f9b8085c2752758e0f5633958fd17cfc9307e (patch) | |
tree | aef83a16163f81b76428b819b8c83d8de6e6b469 /src/com/android/camera/session | |
parent | 6a9e937e35091639211208960b36de1940a37c4d (diff) | |
download | android_packages_apps_Camera2-9c6f9b8085c2752758e0f5633958fd17cfc9307e.tar.gz android_packages_apps_Camera2-9c6f9b8085c2752758e0f5633958fd17cfc9307e.tar.bz2 android_packages_apps_Camera2-9c6f9b8085c2752758e0f5633958fd17cfc9307e.zip |
Add proper support for canceling sessions.
Bug: 19384186
Change-Id: I45b0262947dcd4257d54e706f3cffc69b6bd4bc9
Diffstat (limited to 'src/com/android/camera/session')
5 files changed, 66 insertions, 39 deletions
diff --git a/src/com/android/camera/session/CaptureSessionImpl.java b/src/com/android/camera/session/CaptureSessionImpl.java index 8602d7302..0cb5257c9 100644 --- a/src/com/android/camera/session/CaptureSessionImpl.java +++ b/src/com/android/camera/session/CaptureSessionImpl.java @@ -50,6 +50,8 @@ public class CaptureSessionImpl implements CaptureSession { private final SessionNotifier mSessionNotifier; /** Used for adding/removing/updating placeholders for in-progress sessions. */ private final PlaceholderManager mPlaceholderManager; + /** A place holder for this capture session. */ + private PlaceholderManager.Placeholder mPlaceHolder; /** Used to store images on disk and to add them to the media store. */ private final MediaSaver mMediaSaver; /** The title of the item being processed. */ @@ -72,8 +74,6 @@ public class CaptureSessionImpl implements CaptureSession { private int mProgressPercent = 0; /** A message ID for the current progress state. */ private int mProgressMessageId; - /** A place holder for this capture session. */ - private PlaceholderManager.Session mPlaceHolderSession; private Uri mContentUri; /** Whether this image was finished. */ private volatile boolean mIsFinished; @@ -163,7 +163,7 @@ public class CaptureSessionImpl implements CaptureSession { @Override public void updateThumbnail(Bitmap bitmap) { - mPlaceholderManager.replacePlaceholder(mPlaceHolderSession, bitmap); + mPlaceholderManager.replacePlaceholder(mPlaceHolder, bitmap); mSessionNotifier.notifySessionUpdated(mUri); } @@ -179,9 +179,9 @@ public class CaptureSessionImpl implements CaptureSession { } mProgressMessageId = -1; - mPlaceHolderSession = mPlaceholderManager.insertEmptyPlaceholder(mTitle, pictureSize, + mPlaceHolder = mPlaceholderManager.insertEmptyPlaceholder(mTitle, pictureSize, mSessionStartMillis); - mUri = mPlaceHolderSession.outputUri; + mUri = mPlaceHolder.outputUri; mSessionManager.putSession(mUri, this); mSessionNotifier.notifyTaskQueued(mUri); } @@ -193,9 +193,9 @@ public class CaptureSessionImpl implements CaptureSession { } mProgressMessageId = progressMessageId; - mPlaceHolderSession = mPlaceholderManager.insertPlaceholder(mTitle, placeholder, + mPlaceHolder = mPlaceholderManager.insertPlaceholder(mTitle, placeholder, mSessionStartMillis); - mUri = mPlaceHolderSession.outputUri; + mUri = mPlaceHolder.outputUri; mSessionManager.putSession(mUri, this); mSessionNotifier.notifyTaskQueued(mUri); onCaptureIndicatorUpdate(placeholder, 0); @@ -208,13 +208,13 @@ public class CaptureSessionImpl implements CaptureSession { } mProgressMessageId = progressMessageId; - mPlaceHolderSession = mPlaceholderManager.insertPlaceholder(mTitle, placeholder, + mPlaceHolder = mPlaceholderManager.insertPlaceholder(mTitle, placeholder, mSessionStartMillis); - mUri = mPlaceHolderSession.outputUri; + mUri = mPlaceHolder.outputUri; mSessionManager.putSession(mUri, this); mSessionNotifier.notifyTaskQueued(mUri); Optional<Bitmap> placeholderBitmap = - mPlaceholderManager.getPlaceholder(mPlaceHolderSession); + mPlaceholderManager.getPlaceholder(mPlaceHolder); if (placeholderBitmap.isPresent()) { onCaptureIndicatorUpdate(placeholderBitmap.get(), 0); } @@ -224,7 +224,7 @@ public class CaptureSessionImpl implements CaptureSession { public synchronized void startSession(Uri uri, int progressMessageId) { mUri = uri; mProgressMessageId = progressMessageId; - mPlaceHolderSession = mPlaceholderManager.convertToPlaceholder(uri); + mPlaceHolder = mPlaceholderManager.convertToPlaceholder(uri); mSessionManager.putSession(mUri, this); mSessionNotifier.notifyTaskQueued(mUri); @@ -234,6 +234,12 @@ public class CaptureSessionImpl implements CaptureSession { public synchronized void cancel() { if (isStarted()) { mSessionManager.removeSession(mUri); + mSessionNotifier.notifyTaskCanceled(mUri); + } + + if (mPlaceHolder != null) { + mPlaceholderManager.removePlaceholder(mPlaceHolder); + mPlaceHolder = null; } } @@ -243,7 +249,7 @@ public class CaptureSessionImpl implements CaptureSession { final SettableFuture<Optional<Uri>> futureResult = SettableFuture.create(); mIsFinished = true; - if (mPlaceHolderSession == null) { + if (mPlaceHolder == null) { mMediaSaver.addImage( data, mTitle, mSessionStartMillis, mLocation, width, height, orientation, exif, new MediaSaver.OnMediaSavedListener() { @@ -254,7 +260,7 @@ public class CaptureSessionImpl implements CaptureSession { }); } else { try { - mContentUri = mPlaceholderManager.finishPlaceholder(mPlaceHolderSession, mLocation, + mContentUri = mPlaceholderManager.finishPlaceholder(mPlaceHolder, mLocation, orientation, exif, data, width, height, FilmstripItemData.MIME_TYPE_JPEG); mSessionNotifier.notifyTaskDone(mUri); futureResult.set(Optional.fromNullable(mUri)); @@ -274,7 +280,7 @@ public class CaptureSessionImpl implements CaptureSession { @Override public void finish() { - if (mPlaceHolderSession == null) { + if (mPlaceHolder == null) { throw new IllegalStateException( "Cannot call finish without calling startSession first."); } @@ -348,7 +354,7 @@ public class CaptureSessionImpl implements CaptureSession { BitmapFactory.Options options = new BitmapFactory.Options(); Bitmap placeholder = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length, options); - mPlaceholderManager.replacePlaceholder(mPlaceHolderSession, placeholder); + mPlaceholderManager.replacePlaceholder(mPlaceHolder, placeholder); mSessionNotifier.notifySessionUpdated(mUri); } }); @@ -356,7 +362,7 @@ public class CaptureSessionImpl implements CaptureSession { @Override public void finishWithFailure(int failureMessageId, boolean removeFromFilmstrip) { - if (mPlaceHolderSession == null) { + if (mPlaceHolder == null) { throw new IllegalStateException( "Cannot call finish without calling startSession first."); } @@ -381,7 +387,7 @@ public class CaptureSessionImpl implements CaptureSession { @Override public void finalizeSession() { - mPlaceholderManager.removePlaceholder(mPlaceHolderSession); + mPlaceholderManager.removePlaceholder(mPlaceHolder); } private void onCaptureIndicatorUpdate(Bitmap indicator, int rotationDegrees) { diff --git a/src/com/android/camera/session/CaptureSessionManager.java b/src/com/android/camera/session/CaptureSessionManager.java index 4aca93648..aaf11633f 100644 --- a/src/com/android/camera/session/CaptureSessionManager.java +++ b/src/com/android/camera/session/CaptureSessionManager.java @@ -58,6 +58,9 @@ public interface CaptureSessionManager { /** Called when the session with the given Uri failed processing. */ public void onSessionFailed(Uri mediaUri, int failureMessageId, boolean removeFromFilmstrip); + /** Called when the session with the given Uri was canceled. */ + public void onSessionCanceled(Uri mediaUri); + /** Called when the session with the given Uri has progressed. */ public void onSessionProgress(Uri mediaUri, int progress); diff --git a/src/com/android/camera/session/CaptureSessionManagerImpl.java b/src/com/android/camera/session/CaptureSessionManagerImpl.java index 7d7fd6584..641287398 100644 --- a/src/com/android/camera/session/CaptureSessionManagerImpl.java +++ b/src/com/android/camera/session/CaptureSessionManagerImpl.java @@ -118,6 +118,21 @@ public class CaptureSessionManagerImpl implements CaptureSessionManager { }); } + @Override + public void notifyTaskCanceled(final Uri uri) { + mMainHandler.execute(new Runnable() { + @Override + public void run() { + synchronized (mTaskListeners) { + for (SessionListener listener : mTaskListeners) { + listener.onSessionCanceled(uri); + } + } + finalizeSession(uri); + } + }); + } + /** * Notifies all task listeners that the task with the given URI has * progressed to the given state. diff --git a/src/com/android/camera/session/PlaceholderManager.java b/src/com/android/camera/session/PlaceholderManager.java index 7ed77799f..b54405f88 100644 --- a/src/com/android/camera/session/PlaceholderManager.java +++ b/src/com/android/camera/session/PlaceholderManager.java @@ -43,12 +43,12 @@ public class PlaceholderManager { private final Context mContext; - public static class Session { + public static class Placeholder { final String outputTitle; final Uri outputUri; final long time; - Session(String title, Uri uri, long timestamp) { + Placeholder(String title, Uri uri, long timestamp) { outputTitle = title; outputUri = uri; time = timestamp; @@ -68,9 +68,9 @@ public class PlaceholderManager { * within the filmstrip). Millis since epoch. * @return A session instance representing the new placeholder. */ - public Session insertEmptyPlaceholder(String title, Size size, long timestamp) { + public Placeholder insertEmptyPlaceholder(String title, Size size, long timestamp) { Uri uri = Storage.addEmptyPlaceholder(size); - return new Session(title, uri, timestamp); + return new Placeholder(title, uri, timestamp); } /** @@ -82,7 +82,7 @@ public class PlaceholderManager { * within the filmstrip). Millis since epoch. * @return A session instance representing the new placeholder. */ - public Session insertPlaceholder(String title, Bitmap placeholder, long timestamp) { + public Placeholder insertPlaceholder(String title, Bitmap placeholder, long timestamp) { if (title == null || placeholder == null) { throw new IllegalArgumentException("Null argument passed to insertPlaceholder"); } @@ -95,10 +95,10 @@ public class PlaceholderManager { if (uri == null) { return null; } - return new Session(title, uri, timestamp); + return new Placeholder(title, uri, timestamp); } - public Session insertPlaceholder(String title, byte[] placeholder, long timestamp) { + public Placeholder insertPlaceholder(String title, byte[] placeholder, long timestamp) { if (title == null || placeholder == null) { throw new IllegalArgumentException("Null argument passed to insertPlaceholder"); } @@ -115,14 +115,14 @@ public class PlaceholderManager { * @return A session that can be used to update the progress of the new * session. */ - public Session convertToPlaceholder(Uri uri) { + public Placeholder convertToPlaceholder(Uri uri) { return createSessionFromUri(uri); } /** * This converts the placeholder in to a real media item * - * @param session the session that is being finished. + * @param placeholder the session that is being finished. * @param location the location of the image * @param orientation the orientation of the image * @param exif the exif of the image @@ -132,10 +132,10 @@ public class PlaceholderManager { * @param mimeType the mime type of the image * @return The content URI of the new media item. */ - public Uri finishPlaceholder(Session session, Location location, int orientation, + public Uri finishPlaceholder(Placeholder placeholder, Location location, int orientation, ExifInterface exif, byte[] jpeg, int width, int height, String mimeType) throws IOException { - Uri resultUri = Storage.updateImage(session.outputUri, mContext.getContentResolver(), - session.outputTitle, session.time, location, orientation, exif, jpeg, width, + Uri resultUri = Storage.updateImage(placeholder.outputUri, mContext.getContentResolver(), + placeholder.outputTitle, placeholder.time, location, orientation, exif, jpeg, width, height, mimeType); CameraUtil.broadcastNewPicture(mContext, resultUri); return resultUri; @@ -147,7 +147,7 @@ public class PlaceholderManager { * @param session the session to update * @param placeholder the placeholder bitmap */ - public void replacePlaceholder(Session session, Bitmap placeholder) { + public void replacePlaceholder(Placeholder session, Bitmap placeholder) { Storage.replacePlaceholder(session.outputUri, placeholder); CameraUtil.broadcastNewPicture(mContext, session.outputUri); } @@ -155,20 +155,20 @@ public class PlaceholderManager { /** * Retrieve the placeholder for a given session. * - * @param session the session for which to retrieve bitmap placeholder + * @param placeholder the session for which to retrieve bitmap placeholder */ - public Optional<Bitmap> getPlaceholder(Session session) { - return Storage.getPlaceholderForSession(session.outputUri); + public Optional<Bitmap> getPlaceholder(Placeholder placeholder) { + return Storage.getPlaceholderForSession(placeholder.outputUri); } /** * Remove the placeholder for a given session. * - * @param session the session for which to remove the bitmap placeholder. + * @param placeholder the session for which to remove the bitmap placeholder. */ - public void removePlaceholder(Session session) { - Storage.removePlaceholder(session.outputUri); + public void removePlaceholder(Placeholder placeholder) { + Storage.removePlaceholder(placeholder.outputUri); } /** @@ -177,7 +177,7 @@ public class PlaceholderManager { * <p> * TODO: Make sure this works with types other than images when needed. */ - private Session createSessionFromUri(Uri uri) { + private Placeholder createSessionFromUri(Uri uri) { ContentResolver resolver = mContext.getContentResolver(); Cursor cursor = resolver.query(uri, @@ -200,6 +200,6 @@ public class PlaceholderManager { name = name.substring(0, name.length() - Storage.JPEG_POSTFIX.length()); } - return new Session(name, uri, date); + return new Placeholder(name, uri, date); } } diff --git a/src/com/android/camera/session/SessionNotifier.java b/src/com/android/camera/session/SessionNotifier.java index 3107ae79f..2293bfdfe 100644 --- a/src/com/android/camera/session/SessionNotifier.java +++ b/src/com/android/camera/session/SessionNotifier.java @@ -32,7 +32,10 @@ public interface SessionNotifier { /** A task has failed to process. */ public void notifyTaskFailed(final Uri uri, final int failureMessageId, - boolean removeFromFilmstrip); + boolean removeFromFilmstrip); + + /** A task has been canceled. */ + public void notifyTaskCanceled(final Uri uri); /** A task has progressed. */ public void notifyTaskProgress(final Uri uri, final int progressPercent); |