summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow/FilterShowActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/filtershow/FilterShowActivity.java')
-rw-r--r--src/com/android/gallery3d/filtershow/FilterShowActivity.java257
1 files changed, 173 insertions, 84 deletions
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index c1e4f6add..356a0a074 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -20,6 +20,7 @@ import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.app.ProgressDialog;
+import android.app.WallpaperManager;
import android.content.ContentValues;
import android.content.Intent;
import android.content.res.Configuration;
@@ -32,6 +33,7 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
@@ -58,6 +60,7 @@ import com.android.gallery3d.filtershow.filters.ImageFilter;
import com.android.gallery3d.filtershow.filters.ImageFilterBorder;
import com.android.gallery3d.filtershow.filters.ImageFilterBwFilter;
import com.android.gallery3d.filtershow.filters.ImageFilterContrast;
+import com.android.gallery3d.filtershow.filters.ImageFilterCurves;
import com.android.gallery3d.filtershow.filters.ImageFilterExposure;
import com.android.gallery3d.filtershow.filters.ImageFilterFx;
import com.android.gallery3d.filtershow.filters.ImageFilterHue;
@@ -65,6 +68,7 @@ import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
import com.android.gallery3d.filtershow.filters.ImageFilterRS;
import com.android.gallery3d.filtershow.filters.ImageFilterSaturated;
import com.android.gallery3d.filtershow.filters.ImageFilterShadows;
+import com.android.gallery3d.filtershow.filters.ImageFilterSharpen;
import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
import com.android.gallery3d.filtershow.filters.ImageFilterVibrance;
import com.android.gallery3d.filtershow.filters.ImageFilterVignette;
@@ -72,13 +76,13 @@ import com.android.gallery3d.filtershow.filters.ImageFilterWBalance;
import com.android.gallery3d.filtershow.imageshow.ImageBorder;
import com.android.gallery3d.filtershow.imageshow.ImageCrop;
import com.android.gallery3d.filtershow.imageshow.ImageFlip;
+import com.android.gallery3d.filtershow.imageshow.ImageRedEyes;
import com.android.gallery3d.filtershow.imageshow.ImageRotate;
import com.android.gallery3d.filtershow.imageshow.ImageShow;
import com.android.gallery3d.filtershow.imageshow.ImageSmallBorder;
import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
import com.android.gallery3d.filtershow.imageshow.ImageStraighten;
import com.android.gallery3d.filtershow.imageshow.ImageTinyPlanet;
-import com.android.gallery3d.filtershow.imageshow.ImageWithIcon;
import com.android.gallery3d.filtershow.imageshow.ImageZoom;
import com.android.gallery3d.filtershow.presets.ImagePreset;
import com.android.gallery3d.filtershow.provider.SharedImageProvider;
@@ -90,6 +94,7 @@ import com.android.gallery3d.filtershow.ui.Spline;
import com.android.gallery3d.util.GalleryUtils;
import java.io.File;
+import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.Vector;
@@ -97,14 +102,19 @@ import java.util.Vector;
public class FilterShowActivity extends Activity implements OnItemClickListener,
OnShareTargetSelectedListener {
- public static final String CROP_ACTION = "com.android.camera.action.EDITOR_CROP";
+ // fields for supporting crop action
+ public static final String CROP_ACTION = "com.android.camera.action.CROP";
+ private CropExtras mCropExtras = null;
+
public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
+ public static final int MAX_BMAP_IN_INTENT = 990000;
private final PanelController mPanelController = new PanelController();
private ImageLoader mImageLoader = null;
private ImageShow mImageShow = null;
private ImageCurves mImageCurves = null;
private ImageBorder mImageBorders = null;
+ private ImageRedEyes mImageRedEyes = null;
private ImageStraighten mImageStraighten = null;
private ImageZoom mImageZoom = null;
private ImageCrop mImageCrop = null;
@@ -117,6 +127,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
private View mListGeometry = null;
private View mListColors = null;
private View mListFilterButtons = null;
+ private View mSaveButton = null;
private ImageButton mFxButton = null;
private ImageButton mBorderButton = null;
@@ -155,7 +166,8 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
ImageFilterRS.setRenderScriptContext(this);
ImageShow.setDefaultBackgroundColor(getResources().getColor(R.color.background_screen));
- ImageSmallFilter.setDefaultBackgroundColor(getResources().getColor(R.color.background_main_toolbar));
+ ImageSmallFilter.setDefaultBackgroundColor(getResources().getColor(
+ R.color.background_main_toolbar));
// TODO: get those values from XML.
ImageZoom.setZoomedSize(getPixelsFromDip(256));
FramedTextButton.setTextSize((int) getPixelsFromDip(14));
@@ -180,7 +192,8 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setCustomView(R.layout.filtershow_actionbar);
- actionBar.getCustomView().setOnClickListener(new OnClickListener() {
+ mSaveButton = actionBar.getCustomView();
+ mSaveButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
saveImage();
@@ -202,9 +215,11 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mImageRotate = (ImageRotate) findViewById(R.id.imageRotate);
mImageFlip = (ImageFlip) findViewById(R.id.imageFlip);
mImageTinyPlanet = (ImageTinyPlanet) findViewById(R.id.imageTinyPlanet);
+ mImageRedEyes = (ImageRedEyes) findViewById(R.id.imageRedEyes);
mImageCrop.setAspectTextSize((int) getPixelsFromDip(18));
ImageCrop.setTouchTolerance((int) getPixelsFromDip(25));
+ ImageCrop.setMinCropSize((int) getPixelsFromDip(55));
mImageViews.add(mImageShow);
mImageViews.add(mImageCurves);
mImageViews.add(mImageBorders);
@@ -214,6 +229,10 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mImageViews.add(mImageRotate);
mImageViews.add(mImageFlip);
mImageViews.add(mImageTinyPlanet);
+ mImageViews.add(mImageRedEyes);
+ for (ImageShow imageShow : mImageViews) {
+ mImageLoader.addCacheListener(imageShow);
+ }
mListFx = findViewById(R.id.fxList);
mListBorders = findViewById(R.id.bordersList);
@@ -248,6 +267,8 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mImageFlip.setMaster(mImageShow);
mImageTinyPlanet.setImageLoader(mImageLoader);
mImageTinyPlanet.setMaster(mImageShow);
+ mImageRedEyes.setImageLoader(mImageLoader);
+ mImageRedEyes.setMaster(mImageShow);
mPanelController.setActivity(this);
@@ -260,6 +281,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mPanelController.addImageView(findViewById(R.id.imageFlip));
mPanelController.addImageView(findViewById(R.id.imageZoom));
mPanelController.addImageView(findViewById(R.id.imageTinyPlanet));
+ mPanelController.addImageView(findViewById(R.id.imageRedEyes));
mPanelController.addPanel(mFxButton, mListFx, 0);
mPanelController.addPanel(mBorderButton, mListBorders, 1);
@@ -269,86 +291,40 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mPanelController.addComponent(mGeometryButton, findViewById(R.id.cropButton));
mPanelController.addComponent(mGeometryButton, findViewById(R.id.rotateButton));
mPanelController.addComponent(mGeometryButton, findViewById(R.id.flipButton));
+ mPanelController.addComponent(mGeometryButton, findViewById(R.id.redEyeButton));
mPanelController.addPanel(mColorsButton, mListColors, 3);
- int[] recastIDs = {
- R.id.tinyplanetButton,
- R.id.vignetteButton,
- R.id.vibranceButton,
- R.id.contrastButton,
- R.id.saturationButton,
- R.id.bwfilterButton,
- R.id.wbalanceButton,
- R.id.hueButton,
- R.id.exposureButton,
- R.id.shadowRecoveryButton
- };
ImageFilter[] filters = {
new ImageFilterTinyPlanet(),
+ new ImageFilterWBalance(),
+ new ImageFilterExposure(),
new ImageFilterVignette(),
- new ImageFilterVibrance(),
new ImageFilterContrast(),
- new ImageFilterSaturated(),
- new ImageFilterBwFilter(),
- new ImageFilterWBalance(),
+ new ImageFilterShadows(),
+ new ImageFilterVibrance(),
+ new ImageFilterSharpen(),
+ new ImageFilterCurves(),
new ImageFilterHue(),
- new ImageFilterExposure(),
- new ImageFilterShadows()
+ new ImageFilterSaturated(),
+ new ImageFilterBwFilter()
};
for (int i = 0; i < filters.length; i++) {
ImageSmallFilter fView = new ImageSmallFilter(this);
- View v = listColors.findViewById(recastIDs[i]);
- int pos = listColors.indexOfChild(v);
- listColors.removeView(v);
-
filters[i].setParameter(filters[i].getPreviewParameter());
- if (v instanceof ImageButtonTitle)
- filters[i].setName(((ImageButtonTitle) v).getText());
+ filters[i].setName(getString(filters[i].getTextId()));
fView.setImageFilter(filters[i]);
fView.setController(this);
fView.setImageLoader(mImageLoader);
- fView.setId(recastIDs[i]);
- mPanelController.addComponent(mColorsButton, fView);
- listColors.addView(fView, pos);
- }
-
- int[] overlayIDs = {
- R.id.sharpenButton,
- R.id.curvesButtonRGB
- };
- int[] overlayBitmaps = {
- R.drawable.filtershow_button_colors_sharpen,
- R.drawable.filtershow_button_colors_curve
- };
- int[] overlayNames = {
- R.string.sharpness,
- R.string.curvesRGB
- };
-
- for (int i = 0; i < overlayIDs.length; i++) {
- ImageWithIcon fView = new ImageWithIcon(this);
- View v = listColors.findViewById(overlayIDs[i]);
- int pos = listColors.indexOfChild(v);
- listColors.removeView(v);
- final int sid = overlayNames[i];
- ImageFilterExposure efilter = new ImageFilterExposure() {
- {
- mName = getString(sid);
- }
- };
- efilter.setParameter(-300);
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
- overlayBitmaps[i]);
-
- fView.setIcon(bitmap);
- fView.setImageFilter(efilter);
- fView.setController(this);
- fView.setImageLoader(mImageLoader);
- fView.setId(overlayIDs[i]);
+ fView.setId(filters[i].getButtonId());
+ if (filters[i].getOverlayBitmaps() != 0) {
+ Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
+ filters[i].getOverlayBitmaps());
+ fView.setOverlayBitmap(bitmap);
+ }
mPanelController.addComponent(mColorsButton, fView);
- listColors.addView(fView, pos);
+ listColors.addView(fView);
}
mPanelController.addView(findViewById(R.id.applyEffect));
@@ -390,8 +366,37 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
pickImage();
}
+ // Handle behavior for various actions
String action = intent.getAction();
if (action.equalsIgnoreCase(CROP_ACTION)) {
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ mCropExtras = new CropExtras(extras.getInt(CropExtras.KEY_OUTPUT_X, 0),
+ extras.getInt(CropExtras.KEY_OUTPUT_Y, 0),
+ extras.getBoolean(CropExtras.KEY_SCALE, true) &&
+ extras.getBoolean(CropExtras.KEY_SCALE_UP_IF_NEEDED, false),
+ extras.getInt(CropExtras.KEY_ASPECT_X, 0),
+ extras.getInt(CropExtras.KEY_ASPECT_Y, 0),
+ extras.getBoolean(CropExtras.KEY_SET_AS_WALLPAPER, false),
+ extras.getBoolean(CropExtras.KEY_RETURN_DATA, false),
+ (Uri) extras.getParcelable(MediaStore.EXTRA_OUTPUT),
+ extras.getString(CropExtras.KEY_OUTPUT_FORMAT),
+ extras.getBoolean(CropExtras.KEY_SHOW_WHEN_LOCKED, false),
+ extras.getFloat(CropExtras.KEY_SPOTLIGHT_X),
+ extras.getFloat(CropExtras.KEY_SPOTLIGHT_Y));
+
+ if (mCropExtras.getShowWhenLocked()) {
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+ }
+ mImageShow.getImagePreset().mGeoData.setCropExtras(mCropExtras);
+
+ mImageCrop.setExtras(mCropExtras);
+ String s = getString(R.string.Fixed);
+ mImageCrop.setAspectString(s);
+ mImageCrop.setCropActionFlag(true);
+ mPanelController.setFixedAspect(mCropExtras.getAspectX() > 0
+ && mCropExtras.getAspectY() > 0);
+ }
mPanelController.showComponent(findViewById(R.id.cropButton));
} else if (action.equalsIgnoreCase(TINY_PLANET_ACTION)) {
mPanelController.showComponent(findViewById(R.id.tinyplanetButton));
@@ -411,7 +416,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mLoadBitmapTask.execute(uri);
}
- private class LoadBitmapTask extends AsyncTask<Uri, Void, Boolean> {
+ private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
View mTinyPlanetButton;
int mBitmapSize;
@@ -422,19 +427,26 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
@Override
protected Boolean doInBackground(Uri... params) {
- mImageLoader.loadBitmap(params[0], mBitmapSize);
- publishProgress();
- return mImageLoader.queryLightCycle360();
+ if (!mImageLoader.loadBitmap(params[0], mBitmapSize)) {
+ return false;
+ }
+ publishProgress(mImageLoader.queryLightCycle360());
+ return true;
}
@Override
- protected void onProgressUpdate(Void... values) {
+ protected void onProgressUpdate(Boolean... values) {
super.onProgressUpdate(values);
- if (isCancelled()) return;
+ if (isCancelled()) {
+ return;
+ }
final View filters = findViewById(R.id.filtersPanel);
final View loading = findViewById(R.id.loading);
loading.setVisibility(View.GONE);
filters.setVisibility(View.VISIBLE);
+ if (values[0]) {
+ mTinyPlanetButton.setVisibility(View.VISIBLE);
+ }
}
@Override
@@ -442,9 +454,10 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
if (isCancelled()) {
return;
}
- if (result) {
- mTinyPlanetButton.setVisibility(View.VISIBLE);
+ if (!result) {
+ cannotLoadImage();
}
+
mLoadBitmapTask = null;
super.onPostExecute(result);
}
@@ -640,6 +653,11 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
return false;
}
+ public void enableSave(boolean enable) {
+ if (mSaveButton != null)
+ mSaveButton.setEnabled(enable);
+ }
+
private void fillListImages(LinearLayout listFilters) {
// TODO: use listview
// TODO: load the filters straight from the filesystem
@@ -990,17 +1008,88 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
}
}
+ private boolean mSaveToExtraUri = false;
+ private boolean mSaveAsWallpaper = false;
+ private boolean mReturnAsExtra = false;
+ private boolean outputted = false;
+
public void saveImage() {
- if (mImageShow.hasModifications()) {
- // Get the name of the album, to which the image will be saved
- File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mImageLoader.getUri());
- int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
- String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
- showSavingProgress(albumName);
- mImageShow.saveImage(this, null);
- } else {
- finish();
+ // boolean outputted = false;
+ if (mCropExtras != null) {
+ if (mCropExtras.getExtraOutput() != null) {
+ mSaveToExtraUri = true;
+ outputted = true;
+ }
+ if (mCropExtras.getSetAsWallpaper()) {
+ mSaveAsWallpaper = true;
+ outputted = true;
+ }
+ if (mCropExtras.getReturnData()) {
+
+ mReturnAsExtra = true;
+ outputted = true;
+ }
+
+ if (outputted) {
+ mImageShow.getImagePreset().mGeoData.setUseCropExtrasFlag(true);
+ showSavingProgress(null);
+ mImageShow.returnFilteredResult(this);
+ }
+ }
+ if (!outputted) {
+ if (mImageShow.hasModifications()) {
+ // Get the name of the album, to which the image will be saved
+ File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mImageLoader.getUri());
+ int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
+ String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
+ showSavingProgress(albumName);
+ mImageShow.saveImage(this, null);
+ } else {
+ done();
+ }
+ }
+ }
+
+ public void onFilteredResult(Bitmap filtered) {
+ Intent intent = new Intent();
+ intent.putExtra(CropExtras.KEY_CROPPED_RECT, mImageShow.getImageCropBounds());
+ if (mSaveToExtraUri) {
+ mImageShow.saveToUri(filtered, mCropExtras.getExtraOutput(),
+ mCropExtras.getOutputFormat(), this);
+ }
+ if (mSaveAsWallpaper) {
+ try {
+ WallpaperManager.getInstance(this).setBitmap(filtered);
+ } catch (IOException e) {
+ Log.w(LOGTAG, "fail to set wall paper", e);
+ }
}
+ if (mReturnAsExtra) {
+ if (filtered != null) {
+ int bmapSize = filtered.getRowBytes() * filtered.getHeight();
+ /*
+ * Max size of Binder transaction buffer is 1Mb, so constrain
+ * Bitmap to be somewhat less than this, otherwise we get
+ * TransactionTooLargeExceptions.
+ */
+ if (bmapSize > MAX_BMAP_IN_INTENT) {
+ Log.w(LOGTAG, "Bitmap too large to be returned via intent");
+ } else {
+ intent.putExtra(CropExtras.KEY_DATA, filtered);
+ }
+ }
+ }
+ setResult(RESULT_OK, intent);
+ if (!mSaveToExtraUri) {
+ done();
+ }
+ }
+
+ public void done() {
+ if (outputted) {
+ hideSavingProgress();
+ }
+ finish();
}
static {