diff options
Diffstat (limited to 'src')
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; |
