summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java8
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java8
-rw-r--r--src/com/android/gallery3d/filtershow/tools/SaveImage.java86
3 files changed, 74 insertions, 28 deletions
diff --git a/src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java b/src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java
index c29376f6e..5c416bccc 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java
@@ -37,6 +37,7 @@ public class ImageSavingTask extends ProcessingTask {
boolean flatten;
int quality;
float sizeFactor;
+ Bitmap previewImage;
}
static class UpdateBitmap implements Update {
@@ -57,7 +58,8 @@ public class ImageSavingTask extends ProcessingTask {
}
public void saveImage(Uri sourceUri, Uri selectedUri,
- File destinationFile, ImagePreset preset, boolean flatten,
+ File destinationFile, ImagePreset preset,
+ Bitmap previewImage, boolean flatten,
int quality, float sizeFactor) {
SaveRequest request = new SaveRequest();
request.sourceUri = sourceUri;
@@ -67,6 +69,7 @@ public class ImageSavingTask extends ProcessingTask {
request.flatten = flatten;
request.quality = quality;
request.sizeFactor = sizeFactor;
+ request.previewImage = previewImage;
postRequest(request);
}
@@ -75,6 +78,7 @@ public class ImageSavingTask extends ProcessingTask {
Uri sourceUri = request.sourceUri;
Uri selectedUri = request.selectedUri;
File destinationFile = request.destinationFile;
+ Bitmap previewImage = request.previewImage;
ImagePreset preset = request.preset;
boolean flatten = request.flatten;
// We create a small bitmap showing the result that we can
@@ -83,7 +87,7 @@ public class ImageSavingTask extends ProcessingTask {
updateBitmap.bitmap = createNotificationBitmap(sourceUri, preset);
postUpdate(updateBitmap);
SaveImage saveImage = new SaveImage(mProcessingService, sourceUri,
- selectedUri, destinationFile,
+ selectedUri, destinationFile, previewImage,
new SaveImage.Callback() {
@Override
public void onProgress(int max, int current) {
diff --git a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
index 518f232f9..7d3767ae4 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
@@ -32,6 +32,7 @@ import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.filters.FiltersManager;
import com.android.gallery3d.filtershow.filters.ImageFilter;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.tools.SaveImage;
import java.io.File;
@@ -209,6 +210,7 @@ public class ProcessingService extends Service {
mNeedsAlive = false;
mSaving = true;
handleSaveRequest(sourceUri, selectedUri, destinationFile, preset,
+ MasterImage.getImage().getHighresImage(),
flatten, quality, sizeFactor);
}
return START_REDELIVER_INTENT;
@@ -227,8 +229,8 @@ public class ProcessingService extends Service {
}
public void handleSaveRequest(Uri sourceUri, Uri selectedUri,
- File destinationFile, ImagePreset preset, boolean flatten,
- int quality, float sizeFactor) {
+ File destinationFile, ImagePreset preset, Bitmap previewImage,
+ boolean flatten, int quality, float sizeFactor) {
mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotificationId++;
@@ -246,7 +248,7 @@ public class ProcessingService extends Service {
// Process the image
mImageSavingTask.saveImage(sourceUri, selectedUri, destinationFile,
- preset, flatten, quality, sizeFactor);
+ preset, previewImage, flatten, quality, sizeFactor);
}
public void updateNotificationWithBitmap(Bitmap bitmap) {
diff --git a/src/com/android/gallery3d/filtershow/tools/SaveImage.java b/src/com/android/gallery3d/filtershow/tools/SaveImage.java
index bd483d31b..a811e2e80 100644
--- a/src/com/android/gallery3d/filtershow/tools/SaveImage.java
+++ b/src/com/android/gallery3d/filtershow/tools/SaveImage.java
@@ -28,6 +28,7 @@ import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.provider.MediaStore.Images.ImageColumns;
import android.util.Log;
+import android.widget.Toast;
import com.android.gallery3d.common.Utils;
import com.android.gallery3d.exif.ExifInterface;
@@ -79,6 +80,7 @@ public class SaveImage {
private final Callback mCallback;
private final File mDestinationFile;
private final Uri mSelectedImageUri;
+ private final Bitmap mPreviewImage;
private int mCurrentProcessingStep = 1;
@@ -126,10 +128,11 @@ public class SaveImage {
* @return the newSourceUri
*/
public SaveImage(Context context, Uri sourceUri, Uri selectedImageUri,
- File destination, Callback callback) {
+ File destination, Bitmap previewImage, Callback callback) {
mContext = context;
mSourceUri = sourceUri;
mCallback = callback;
+ mPreviewImage = previewImage;
if (destination == null) {
mDestinationFile = getNewFile(context, selectedImageUri);
} else {
@@ -332,6 +335,33 @@ public class SaveImage {
newSourceUri = moveSrcToAuxIfNeeded(mSourceUri, mDestinationFile);
}
+ Uri savedUri = mSelectedImageUri;
+ if (mPreviewImage != null) {
+ Object xmp = getPanoramaXMPData(newSourceUri, preset);
+ ExifInterface exif = getExifData(newSourceUri);
+ // Set tags
+ long time = System.currentTimeMillis();
+ exif.addDateTimeStampTag(ExifInterface.TAG_DATE_TIME, time,
+ TimeZone.getDefault());
+ exif.setTag(exif.buildTag(ExifInterface.TAG_ORIENTATION,
+ ExifInterface.Orientation.TOP_LEFT));
+ // Remove old thumbnail
+ exif.removeCompressedThumbnail();
+ // If we succeed in writing the bitmap as a jpeg, return a uri.
+ if (putExifData(mDestinationFile, exif, mPreviewImage, quality)) {
+ putPanoramaXMPData(mDestinationFile, xmp);
+ // mDestinationFile will save the newSourceUri info in the XMP.
+ XmpPresets.writeFilterXMP(mContext, newSourceUri,
+ mDestinationFile, preset);
+
+ // After this call, mSelectedImageUri will be actually
+ // pointing at the new file mDestinationFile.
+ savedUri = SaveImage.linkNewFileToUri(mContext, mSelectedImageUri,
+ mDestinationFile, time, doAuxBackup);
+ }
+ Toast.makeText(mContext, "Computing high resolution image...", Toast.LENGTH_LONG);
+ }
+
// Stopgap fix for low-memory devices.
while (noBitmap) {
try {
@@ -377,10 +407,7 @@ public class SaveImage {
XmpPresets.writeFilterXMP(mContext, newSourceUri,
mDestinationFile, preset);
- // After this call, mSelectedImageUri will be actually
- // pointing at the new file mDestinationFile.
- uri = SaveImage.linkNewFileToUri(mContext, mSelectedImageUri,
- mDestinationFile, time, doAuxBackup);
+ uri = updateFile(mContext, savedUri, mDestinationFile, time);
}
updateProgress();
@@ -605,6 +632,34 @@ public class SaveImage {
public static Uri linkNewFileToUri(Context context, Uri sourceUri,
File file, long time, boolean deleteOriginal) {
File oldSelectedFile = getLocalFileFromUri(context, sourceUri);
+ final ContentValues values = getContentValues(context, sourceUri, file, time);
+
+ Uri result = sourceUri;
+
+ // In the case of incoming Uri is just a local file Uri (like a cached
+ // file), we can't just update the Uri. We have to create a new Uri.
+ boolean fileUri = isFileUri(sourceUri);
+
+ if (fileUri || oldSelectedFile == null || !deleteOriginal) {
+ result = context.getContentResolver().insert(
+ Images.Media.EXTERNAL_CONTENT_URI, values);
+ } else {
+ context.getContentResolver().update(sourceUri, values, null, null);
+ if (oldSelectedFile.exists()) {
+ oldSelectedFile.delete();
+ }
+ }
+ return result;
+ }
+
+ public static Uri updateFile(Context context, Uri sourceUri, File file, long time) {
+ final ContentValues values = getContentValues(context, sourceUri, file, time);
+ context.getContentResolver().update(sourceUri, values, null, null);
+ return sourceUri;
+ }
+
+ private static ContentValues getContentValues(Context context, Uri sourceUri,
+ File file, long time) {
final ContentValues values = new ContentValues();
time /= 1000;
@@ -622,8 +677,9 @@ public class SaveImage {
ImageColumns.DATE_TAKEN,
ImageColumns.LATITUDE, ImageColumns.LONGITUDE,
};
+
SaveImage.querySource(context, sourceUri, projection,
- new SaveImage.ContentResolverQueryCallback() {
+ new ContentResolverQueryCallback() {
@Override
public void onCursorResult(Cursor cursor) {
@@ -639,23 +695,7 @@ public class SaveImage {
}
}
});
-
- Uri result = sourceUri;
-
- // In the case of incoming Uri is just a local file Uri (like a cached
- // file), we can't just update the Uri. We have to create a new Uri.
- boolean fileUri = isFileUri(sourceUri);
-
- if (fileUri || oldSelectedFile == null || !deleteOriginal) {
- result = context.getContentResolver().insert(
- Images.Media.EXTERNAL_CONTENT_URI, values);
- } else {
- context.getContentResolver().update(sourceUri, values, null, null);
- if (oldSelectedFile.exists()) {
- oldSelectedFile.delete();
- }
- }
- return result;
+ return values;
}
/**