summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/session
diff options
context:
space:
mode:
authorSascha Haeberling <haeberling@google.com>2015-04-13 14:06:16 -0700
committerSascha Haeberling <haeberling@google.com>2015-04-13 15:30:34 -0700
commit9c6f9b8085c2752758e0f5633958fd17cfc9307e (patch)
treeaef83a16163f81b76428b819b8c83d8de6e6b469 /src/com/android/camera/session
parent6a9e937e35091639211208960b36de1940a37c4d (diff)
downloadandroid_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')
-rw-r--r--src/com/android/camera/session/CaptureSessionImpl.java40
-rw-r--r--src/com/android/camera/session/CaptureSessionManager.java3
-rw-r--r--src/com/android/camera/session/CaptureSessionManagerImpl.java15
-rw-r--r--src/com/android/camera/session/PlaceholderManager.java42
-rw-r--r--src/com/android/camera/session/SessionNotifier.java5
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);