summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d
diff options
context:
space:
mode:
authorhuiyan <huiyan@codeaurora.org>2016-04-27 15:28:45 +0800
committerhuiyan <huiyan@codeaurora.org>2016-05-09 16:30:19 +0800
commit3de604ea8251c1d16c9c9e9d194b6b0f6975c775 (patch)
treeb8ab1dec4b1717ca4f8b507a71954e2d7cd6ccb1 /src/com/android/gallery3d
parent213e60d133e3b137d8d6d57748d0f653c5f05303 (diff)
downloadandroid_packages_apps_Gallery2-3de604ea8251c1d16c9c9e9d194b6b0f6975c775.tar.gz
android_packages_apps_Gallery2-3de604ea8251c1d16c9c9e9d194b6b0f6975c775.tar.bz2
android_packages_apps_Gallery2-3de604ea8251c1d16c9c9e9d194b6b0f6975c775.zip
Gallery2: Fix FilterShowActivity load fail and force close
There are two running instances of FilterShowActivity, one instantiate from Gallery path, the other instantiate from Camera path. The two activity instances bind to the same ProcessingService instance. If one instaces save image by the service, the service is always in saving state, so other instance cannot load and the NullPointerException occur. Remove the saving condition and use broadcast result to notify FilterShowActivity 's instances to update UI in ProcessingService. In FilterShowActivity load the ui immediately after bind to service and use the request id to distinguish the different instance's request. Change-Id: Ief6e746bba5670f397977639df0ba7fb903a4925 CRs-Fixed: 1002161 1000423
Diffstat (limited to 'src/com/android/gallery3d')
-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;