summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/filtershow/FilterShowActivity.java39
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java8
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java65
-rw-r--r--src/com/android/gallery3d/filtershow/tools/SaveImage.java3
-rw-r--r--src/com/android/gallery3d/filtershow/ui/ExportDialog.java2
5 files changed, 76 insertions, 41 deletions
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index 592c756a4..4448b6914 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -25,12 +25,14 @@ import java.util.Locale;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
@@ -212,6 +214,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
private AlertDialog.Builder mBackAlertDialogBuilder;
private ProgressDialog mLoadingDialog;
+ private long mRequestId = -1;
public ProcessingService getProcessingService() {
return mBoundService;
@@ -221,6 +224,34 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
return !PhotoPage.ACTION_NEXTGEN_EDIT.equalsIgnoreCase(mAction);
}
+ public long getRequestId() {
+ return mRequestId;
+ }
+
+ private void registerFilter() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(ProcessingService.SAVE_IMAGE_COMPLETE_ACTION);
+ registerReceiver(mHandlerReceiver, filter);
+ }
+
+ private final BroadcastReceiver mHandlerReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (ProcessingService.SAVE_IMAGE_COMPLETE_ACTION.equals(action) &&
+ !isSimpleEditAction()) {
+ Bundle bundle = intent.getExtras();
+ long requestId = bundle.getLong(ProcessingService.KEY_REQUEST_ID);
+ //only handle own request
+ if (requestId == mRequestId) {
+ Uri saveUri = Uri.parse(bundle.getString(ProcessingService.KEY_URL));
+ boolean releaseDualCam = bundle.getBoolean(ProcessingService.KEY_DUALCAM);
+ completeSaveImage(saveUri, releaseDualCam);
+ }
+ }
+ }
+ };
+
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
@@ -232,8 +263,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
* cast its IBinder to a concrete class and directly access it.
*/
mBoundService = ((ProcessingService.LocalBinder)service).getService();
- mBoundService.setFiltershowActivity(FilterShowActivity.this);
- mBoundService.onStart();
+ updateUIAfterServiceStarted();
}
@Override
@@ -270,6 +300,9 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
}
public void updateUIAfterServiceStarted() {
+ //This activity will have more than one running instances
+ //mRequestId to distinguish the different instance's request
+ mRequestId = System.currentTimeMillis();
MasterImage.setMaster(mMasterImage);
ImageFilter.setActivityForMemoryToasts(this);
mUserPresetsManager = new UserPresetsManager(this);
@@ -296,6 +329,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
}
clearGalleryBitmapPool();
+ registerFilter();
doBindService();
getWindow().setBackgroundDrawable(new ColorDrawable(Color.GRAY));
setContentView(R.layout.filtershow_splashscreen);
@@ -1333,6 +1367,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
}
mUserPresetsManager.close();
+ unregisterReceiver(mHandlerReceiver);
doUnbindService();
if (mReleaseDualCamOnDestory && DualCameraNativeEngine.getInstance().isLibLoaded())
DualCameraNativeEngine.getInstance().releaseDepthMap();
diff --git a/src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java b/src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java
index 209849424..1e7e9757c 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/ImageSavingTask.java
@@ -39,6 +39,7 @@ public class ImageSavingTask extends ProcessingTask {
float sizeFactor;
Bitmap previewImage;
boolean exit;
+ long requsetId;
}
static class UpdateBitmap implements Update {
@@ -58,6 +59,7 @@ public class ImageSavingTask extends ProcessingTask {
static class URIResult implements Result {
Uri uri;
boolean exit;
+ long requestId;
}
public ImageSavingTask(ProcessingService service) {
@@ -67,7 +69,7 @@ public class ImageSavingTask extends ProcessingTask {
public void saveImage(Uri sourceUri, Uri selectedUri,
File destinationFile, ImagePreset preset,
Bitmap previewImage, boolean flatten,
- int quality, float sizeFactor, boolean exit) {
+ int quality, float sizeFactor, boolean exit, long requestId) {
SaveRequest request = new SaveRequest();
request.sourceUri = sourceUri;
request.selectedUri = selectedUri;
@@ -78,6 +80,7 @@ public class ImageSavingTask extends ProcessingTask {
request.sizeFactor = sizeFactor;
request.previewImage = previewImage;
request.exit = exit;
+ request.requsetId = requestId;
postRequest(request);
}
@@ -119,13 +122,14 @@ public class ImageSavingTask extends ProcessingTask {
URIResult result = new URIResult();
result.uri = uri;
result.exit = request.exit;
+ result.requestId = request.requsetId;
return result;
}
@Override
public void onResult(Result message) {
URIResult result = (URIResult) message;
- mProcessingService.completeSaveImage(result.uri, result.exit, true);
+ mProcessingService.completeSaveImage(result.uri, result.requestId, result.exit, true);
}
@Override
diff --git a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
index a79339eb8..72f692534 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
@@ -26,6 +26,7 @@ import android.graphics.Bitmap;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Binder;
+import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
@@ -54,6 +55,12 @@ public class ProcessingService extends Service {
private static final String FLATTEN = "flatten";
private static final String SIZE_FACTOR = "sizeFactor";
private static final String EXIT = "exit";
+ private static final String REQUEST_ID = "request_id";
+
+ public static final String SAVE_IMAGE_COMPLETE_ACTION = "save_image_complete_action";
+ public static final String KEY_URL = "key_url";
+ public static final String KEY_REQUEST_ID = "request_id";
+ public static final String KEY_DUALCAM = "dualCam";
private ProcessingTaskController mProcessingTaskController;
private ImageSavingTask mImageSavingTask;
@@ -63,14 +70,7 @@ public class ProcessingService extends Service {
private RenderingRequestTask mRenderingRequestTask;
private final IBinder mBinder = new LocalBinder();
- private FilterShowActivity mFiltershowActivity;
-
- private boolean mSaving = false;
- private boolean mNeedsAlive = false;
- public void setFiltershowActivity(FilterShowActivity filtershowActivity) {
- mFiltershowActivity = filtershowActivity;
- }
public void setOriginalBitmap(Bitmap originalBitmap) {
if (mUpdatePreviewTask == null) {
@@ -143,7 +143,7 @@ public class ProcessingService extends Service {
public static Intent getSaveIntent(Context context, ImagePreset preset, File destination,
Uri selectedImageUri, Uri sourceImageUri, boolean doFlatten, int quality,
- float sizeFactor, boolean needsExit) {
+ float sizeFactor, boolean needsExit, long requestId) {
Intent processIntent = new Intent(context, ProcessingService.class);
processIntent.putExtra(ProcessingService.SOURCE_URI,
sourceImageUri.toString());
@@ -158,6 +158,7 @@ public class ProcessingService extends Service {
preset.getJsonString(ImagePreset.JASON_SAVED));
processIntent.putExtra(ProcessingService.SAVING, true);
processIntent.putExtra(ProcessingService.EXIT, needsExit);
+ processIntent.putExtra(ProcessingService.REQUEST_ID, requestId);
if (doFlatten) {
processIntent.putExtra(ProcessingService.FLATTEN, true);
}
@@ -186,12 +187,10 @@ public class ProcessingService extends Service {
tearDownPipeline();
mProcessingTaskController.quit();
MasterImage.setMaster(null);
- mFiltershowActivity = null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
- mNeedsAlive = true;
if (intent != null && intent.getBooleanExtra(SAVING, false)) {
// we save using an intent to keep the service around after the
// activity has been destroyed.
@@ -203,6 +202,7 @@ public class ProcessingService extends Service {
float sizeFactor = intent.getFloatExtra(SIZE_FACTOR, 1);
boolean flatten = intent.getBooleanExtra(FLATTEN, false);
boolean exit = intent.getBooleanExtra(EXIT, false);
+ long requestId = intent.getLongExtra(REQUEST_ID, -1);
Uri sourceUri = Uri.parse(source);
Uri selectedUri = null;
if (selected != null) {
@@ -214,11 +214,9 @@ public class ProcessingService extends Service {
}
ImagePreset preset = new ImagePreset();
preset.readJsonFromString(presetJson);
- mNeedsAlive = false;
- mSaving = true;
handleSaveRequest(sourceUri, selectedUri, destinationFile, preset,
MasterImage.getImage().getHighresImage(),
- flatten, quality, sizeFactor, exit);
+ flatten, quality, sizeFactor, exit, requestId);
}
return START_REDELIVER_INTENT;
}
@@ -228,16 +226,21 @@ public class ProcessingService extends Service {
return mBinder;
}
- public void onStart() {
- mNeedsAlive = true;
- if (!mSaving && mFiltershowActivity != null) {
- mFiltershowActivity.updateUIAfterServiceStarted();
+
+ //a lot of FilterShowActivity 's running instances bind to this service(only one instance)
+ //use broadcast result to notify FilterShowActivity 's instances to update UI
+ private void broadcastState(String action, Bundle bundle) {
+ Intent intent = new Intent();
+ intent.setAction(action);
+ if (bundle != null) {
+ intent.putExtras(bundle);
}
+ sendBroadcast(intent);
}
public void handleSaveRequest(Uri sourceUri, Uri selectedUri,
File destinationFile, ImagePreset preset, Bitmap previewImage,
- boolean flatten, int quality, float sizeFactor, boolean exit) {
+ boolean flatten, int quality, float sizeFactor, boolean exit, long requestId) {
mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotifyMgr.cancelAll();
@@ -254,7 +257,7 @@ public class ProcessingService extends Service {
// Process the image
mImageSavingTask.saveImage(sourceUri, selectedUri, destinationFile,
- preset, previewImage, flatten, quality, sizeFactor, exit);
+ preset, previewImage, flatten, quality, sizeFactor, exit, requestId);
}
public void updateNotificationWithBitmap(Bitmap bitmap) {
@@ -267,13 +270,9 @@ public class ProcessingService extends Service {
mNotifyMgr.notify(mNotificationId, mBuilder.build());
}
- public void completePreviewSaveImage(Uri result, boolean exit) {
- if (exit && !mNeedsAlive && !mFiltershowActivity.isSimpleEditAction()) {
- mFiltershowActivity.completeSaveImage(result, false);
- }
- }
+ public void completeSaveImage(Uri result, long requestId,
+ boolean exit, boolean releaseDualCam) {
- public void completeSaveImage(Uri result, boolean exit, boolean releaseDualCam) {
if (SHOW_IMAGE) {
// TODO: we should update the existing image in Gallery instead
Intent viewImage = new Intent(Intent.ACTION_VIEW, result);
@@ -281,19 +280,15 @@ public class ProcessingService extends Service {
startActivity(viewImage);
}
mNotifyMgr.cancel(mNotificationId);
- if (!exit) {
- stopForeground(true);
- stopSelf();
- return;
- }
stopForeground(true);
stopSelf();
- if (mNeedsAlive) {
- // If the app has been restarted while we were saving...
- mFiltershowActivity.updateUIAfterServiceStarted();
- } else if (exit || mFiltershowActivity.isSimpleEditAction()) {
+ if (exit) {
// terminate now
- mFiltershowActivity.completeSaveImage(result, releaseDualCam);
+ Bundle bundle = new Bundle();
+ bundle.putString(KEY_URL, result.toString());
+ bundle.putLong(KEY_REQUEST_ID, requestId);
+ bundle.putBoolean(KEY_DUALCAM, releaseDualCam);
+ broadcastState(SAVE_IMAGE_COMPLETE_ACTION, bundle);
}
}
diff --git a/src/com/android/gallery3d/filtershow/tools/SaveImage.java b/src/com/android/gallery3d/filtershow/tools/SaveImage.java
index cbe0f91a3..ca65d6c82 100644
--- a/src/com/android/gallery3d/filtershow/tools/SaveImage.java
+++ b/src/com/android/gallery3d/filtershow/tools/SaveImage.java
@@ -625,7 +625,8 @@ public class SaveImage {
float scaleFactor = 1f;
Intent processIntent = ProcessingService.getSaveIntent(filterShowActivity, preset,
- destination, selectedImageUri, sourceImageUri, flatten, 90, scaleFactor, true);
+ destination, selectedImageUri, sourceImageUri, flatten, 90,
+ scaleFactor, true, filterShowActivity.getRequestId());
filterShowActivity.startService(processIntent);
diff --git a/src/com/android/gallery3d/filtershow/ui/ExportDialog.java b/src/com/android/gallery3d/filtershow/ui/ExportDialog.java
index 1b8625946..15992797b 100644
--- a/src/com/android/gallery3d/filtershow/ui/ExportDialog.java
+++ b/src/com/android/gallery3d/filtershow/ui/ExportDialog.java
@@ -169,7 +169,7 @@ public class ExportDialog extends DialogFragment implements View.OnClickListener
float scaleFactor = mExportWidth / (float) mOriginalBounds.width();
Intent processIntent = ProcessingService.getSaveIntent(activity, MasterImage
.getImage().getPreset(), dest, activity.getSelectedImageUri(), sourceUri,
- true, mSeekBar.getProgress(), scaleFactor, false);
+ true, mSeekBar.getProgress(), scaleFactor, false, -1);
activity.startService(processIntent);
dismiss();
break;