From c40c411683da5db1e393e2172a451c3f9c511811 Mon Sep 17 00:00:00 2001 From: Angus Kong Date: Wed, 17 Jul 2013 15:59:03 -0700 Subject: Refine MediaSaveService to use memory limit. Change-Id: Ieeb06eddbd742896ecb7c50f0f51facaa77b2d21 --- src/com/android/camera/MediaSaveService.java | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/com/android/camera/MediaSaveService.java b/src/com/android/camera/MediaSaveService.java index e37b45cf2..40675b8c0 100644 --- a/src/com/android/camera/MediaSaveService.java +++ b/src/com/android/camera/MediaSaveService.java @@ -36,15 +36,16 @@ import java.io.File; * Service for saving images in the background thread. */ public class MediaSaveService extends Service { - private static final int SAVE_TASK_LIMIT = 3; - private static final String TAG = MediaSaveService.class.getSimpleName(); + // The memory limit for unsaved image is 20MB. + private static final int SAVE_TASK_MEMORY_LIMIT = 20 * 1024 * 1024; + private static final String TAG = "CAM_" + MediaSaveService.class.getSimpleName(); private final IBinder mBinder = new LocalBinder(); - private int mTaskNumber; private Listener mListener; + // Memory used by the total queued save request, in bytes. + private long mMemoryUse; interface Listener { - public void onQueueStatus(boolean full); } @@ -74,14 +75,13 @@ public class MediaSaveService extends Service { @Override public void onCreate() { - mTaskNumber = 0; + mMemoryUse = 0; } public boolean isQueueFull() { - return (mTaskNumber >= SAVE_TASK_LIMIT); + return (mMemoryUse >= SAVE_TASK_MEMORY_LIMIT); } - // Runs in main thread public void addImage(final byte[] data, String title, long date, Location loc, int width, int height, int orientation, ExifInterface exif, OnMediaSavedListener l, ContentResolver resolver) { @@ -93,13 +93,20 @@ public class MediaSaveService extends Service { (loc == null) ? null : new Location(loc), width, height, orientation, exif, resolver, l); - mTaskNumber++; + mMemoryUse += data.length; if (isQueueFull()) { onQueueFull(); } t.execute(); } + public void addImage(final byte[] data, String title, Location loc, + int width, int height, int orientation, ExifInterface exif, + OnMediaSavedListener l, ContentResolver resolver) { + addImage(data, title, System.currentTimeMillis(), loc, width, height, + orientation, exif, l, resolver); + } + public void addVideo(String path, long duration, ContentValues values, OnMediaSavedListener l, ContentResolver resolver) { // We don't set a queue limit for video saving because the file @@ -161,8 +168,9 @@ public class MediaSaveService extends Service { @Override protected void onPostExecute(Uri uri) { if (listener != null) listener.onMediaSaved(uri); - mTaskNumber--; - if (mTaskNumber == SAVE_TASK_LIMIT - 1) onQueueAvailable(); + boolean previouslyFull = isQueueFull(); + mMemoryUse -= data.length; + if (isQueueFull() != previouslyFull) onQueueAvailable(); } } -- cgit v1.2.3