blob: 389973e508c9931e62fc753d1c78436ed289be7d [file] [log] [blame]
package com.android.gallery3d.filtershow;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import com.android.gallery3d.filtershow.cache.ImageLoader;
import com.android.gallery3d.filtershow.filters.*;
import com.android.gallery3d.filtershow.imageshow.ImageBorder;
import com.android.gallery3d.filtershow.imageshow.ImageShow;
import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
import com.android.gallery3d.filtershow.imageshow.ImageStraighten;
import com.android.gallery3d.filtershow.imageshow.ImageZoom;
import com.android.gallery3d.filtershow.presets.*;
import com.android.gallery3d.filtershow.provider.SharedImageProvider;
import com.android.gallery3d.filtershow.tools.SaveCopyTask;
import com.android.gallery3d.filtershow.ui.ImageCurves;
import com.android.gallery3d.R;
import android.net.Uri;
import android.os.Bundle;
import android.renderscript.RenderScript;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ShareActionProvider;
import android.widget.ShareActionProvider.OnShareTargetSelectedListener;
import android.widget.Toast;
@TargetApi(16)
public class FilterShowActivity extends Activity implements OnItemClickListener,
OnShareTargetSelectedListener {
private ImageLoader mImageLoader = null;
private ImageShow mImageShow = null;
private ImageCurves mImageCurves = null;
private ImageBorder mImageBorders = null;
private ImageStraighten mImageStraighten = null;
private ImageZoom mImageZoom = null;
private View mListFx = null;
private View mListBorders = null;
private View mListGeometry = null;
private View mListColors = null;
private ImageButton mFxButton = null;
private ImageButton mBorderButton = null;
private ImageButton mGeometryButton = null;
private ImageButton mColorsButton = null;
private ImageButton mVignetteButton = null;
private ImageButton mCurvesButtonRGB = null;
private ImageButton mSharpenButton = null;
private ImageButton mContrastButton = null;
private ImageButton mSaturationButton = null;
private ImageButton mTintButton = null;
private ImageButton mVibranceButton = null;
private ImageButton mExposureButton = null;
private ImageButton mShadowRecoveryButton = null;
private static final int SELECT_PICTURE = 1;
private static final String LOGTAG = "FilterShowActivity";
protected static final boolean ANIMATE_PANELS = false;
private boolean mShowingHistoryPanel = false;
private boolean mShowingImageStatePanel = false;
private Vector<ImageShow> mImageViews = new Vector<ImageShow>();
private Vector<View> mListViews = new Vector<View>();
private Vector<ImageButton> mBottomPanelButtons = new Vector<ImageButton>();
private Vector<ImageButton> mColorsPanelButtons = new Vector<ImageButton>();
private ShareActionProvider mShareActionProvider;
private File mSharedOutputFile = null;
private boolean mSharingImage = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ImageFilterRS.setRenderScriptContext(this);
setContentView(R.layout.filtershow_activity);
ActionBar actionBar = getActionBar();
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setCustomView(R.layout.filtershow_actionbar);
actionBar.getCustomView().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
saveImage();
}
});
mImageLoader = new ImageLoader(getApplicationContext());
LinearLayout listFilters = (LinearLayout) findViewById(R.id.listFilters);
LinearLayout listBorders = (LinearLayout) findViewById(R.id.listBorders);
mImageShow = (ImageShow) findViewById(R.id.imageShow);
mImageCurves = (ImageCurves) findViewById(R.id.imageCurves);
mImageBorders = (ImageBorder) findViewById(R.id.imageBorder);
mImageStraighten = (ImageStraighten) findViewById(R.id.imageStraighten);
mImageZoom = (ImageZoom) findViewById(R.id.imageZoom);
mImageViews.add(mImageShow);
mImageViews.add(mImageCurves);
mImageViews.add(mImageBorders);
mImageViews.add(mImageStraighten);
mImageViews.add(mImageZoom);
mListFx = findViewById(R.id.fxList);
mListBorders = findViewById(R.id.bordersList);
mListGeometry = findViewById(R.id.gemoetryList);
mListColors = findViewById(R.id.colorsFxList);
mListViews.add(mListFx);
mListViews.add(mListBorders);
mListViews.add(mListGeometry);
mListViews.add(mListColors);
mFxButton = (ImageButton) findViewById(R.id.fxButton);
mBorderButton = (ImageButton) findViewById(R.id.borderButton);
mGeometryButton = (ImageButton) findViewById(R.id.geometryButton);
mColorsButton = (ImageButton) findViewById(R.id.colorsButton);
mBottomPanelButtons.add(mFxButton);
mBottomPanelButtons.add(mBorderButton);
mBottomPanelButtons.add(mGeometryButton);
mBottomPanelButtons.add(mColorsButton);
mFxButton.setSelected(true);
mVignetteButton = (ImageButton) findViewById(R.id.vignetteButton);
mCurvesButtonRGB = (ImageButton) findViewById(R.id.curvesButtonRGB);
mSharpenButton = (ImageButton) findViewById(R.id.sharpenButton);
mVibranceButton = (ImageButton) findViewById(R.id.vibranceButton);
mContrastButton = (ImageButton) findViewById(R.id.contrastButton);
mSaturationButton = (ImageButton) findViewById(R.id.saturationButton);
mTintButton = (ImageButton) findViewById(R.id.tintButton);
mExposureButton = (ImageButton) findViewById(R.id.exposureButton);
mShadowRecoveryButton = (ImageButton) findViewById(R.id.shadowRecoveryButton);
mColorsPanelButtons.add(mVignetteButton);
mColorsPanelButtons.add(mCurvesButtonRGB);
mColorsPanelButtons.add(mSharpenButton);
mColorsPanelButtons.add(mContrastButton);
mColorsPanelButtons.add(mSaturationButton);
mColorsPanelButtons.add(mTintButton);
mColorsPanelButtons.add(mVibranceButton);
mColorsPanelButtons.add(mExposureButton);
mColorsPanelButtons.add(mShadowRecoveryButton);
// TODO: instead of click listeners, make the activity the single
// listener and do a dispatch in the listener callback method.
findViewById(R.id.showOriginalButton).setOnTouchListener(createOnTouchShowOriginalButton());
findViewById(R.id.straightenButton).setOnClickListener(createOnClickStraightenButton());
findViewById(R.id.cropButton).setOnClickListener(createOnClickCropButton());
findViewById(R.id.rotateButton).setOnClickListener(createOnClickRotateButton());
findViewById(R.id.flipButton).setOnClickListener(createOnClickFlipButton());
mVignetteButton.setOnClickListener(createOnClickVignetteButton());
mCurvesButtonRGB.setOnClickListener(createOnClickCurvesRGBButton());
mSharpenButton.setOnClickListener(createOnClickSharpenButton());
mContrastButton.setOnClickListener(createOnClickContrastButton());
mSaturationButton.setOnClickListener(createOnClickSaturationButton());
mTintButton.setOnClickListener(createOnClickTintButton());
mVibranceButton.setOnClickListener(createOnClickVibranceButton());
mExposureButton.setOnClickListener(createOnClickExposureButton());
mShadowRecoveryButton.setOnClickListener(createOnClickShadowRecoveryButton());
mFxButton.setOnClickListener(createOnClickFxButton());
mBorderButton.setOnClickListener(createOnClickBorderButton());
mGeometryButton.setOnClickListener(createOnClickGeometryButton());
mColorsButton.setOnClickListener(createOnClickColorsButton());
findViewById(R.id.resetOperationsButton).setOnClickListener(
createOnClickResetOperationsButton());
ListView operationsList = (ListView) findViewById(R.id.operationsList);
operationsList.setAdapter(mImageShow.getHistoryAdapter());
operationsList.setOnItemClickListener(this);
ListView imageStateList = (ListView) findViewById(R.id.imageStateList);
imageStateList.setAdapter(mImageShow.getImageStateAdapter());
mImageLoader.setAdapter((HistoryAdapter) mImageShow.getHistoryAdapter());
fillListImages(listFilters);
fillListBorders(listBorders);
mImageShow.setImageLoader(mImageLoader);
mImageCurves.setImageLoader(mImageLoader);
mImageCurves.setMaster(mImageShow);
mImageBorders.setImageLoader(mImageLoader);
mImageBorders.setMaster(mImageShow);
mImageStraighten.setImageLoader(mImageLoader);
mImageStraighten.setMaster(mImageShow);
mImageZoom.setImageLoader(mImageLoader);
mImageZoom.setMaster(mImageShow);
Intent intent = getIntent();
String data = intent.getDataString();
if (data != null) {
Uri uri = Uri.parse(data);
mImageLoader.loadBitmap(uri);
} else {
pickImage();
}
}
public void completeSaveImage(Uri saveUri) {
if (mSharingImage && mSharedOutputFile != null) {
// Image saved, we unblock the content provider
Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
Uri.encode(mSharedOutputFile.getAbsolutePath()));
ContentValues values = new ContentValues();
values.put(SharedImageProvider.PREPARE, false);
getContentResolver().insert(uri, values);
}
setResult(RESULT_OK, new Intent().setData(saveUri));
finish();
}
@Override
public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
// First, let's tell the SharedImageProvider that it will need to wait for the image
Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
Uri.encode(mSharedOutputFile.getAbsolutePath()));
ContentValues values = new ContentValues();
values.put(SharedImageProvider.PREPARE, true);
getContentResolver().insert(uri, values);
mSharingImage = true;
// Process and save the image in the background.
mImageShow.saveImage(this, mSharedOutputFile);
return true;
}
private Intent getDefaultShareIntent() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType(SharedImageProvider.MIME_TYPE);
mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri());
Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
Uri.encode(mSharedOutputFile.getAbsolutePath()));
intent.putExtra(Intent.EXTRA_STREAM, uri);
return intent;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
MenuItem showHistory = menu.findItem(R.id.operationsButton);
if (mShowingHistoryPanel) {
showHistory.setTitle(R.string.hide_history_panel);
} else {
showHistory.setTitle(R.string.show_history_panel);
}
MenuItem showState = menu.findItem(R.id.showImageStateButton);
if (mShowingImageStatePanel) {
showState.setTitle(R.string.hide_imagestate_panel);
} else {
showState.setTitle(R.string.show_imagestate_panel);
}
mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
.getActionProvider();
mShareActionProvider.setShareIntent(getDefaultShareIntent());
mShareActionProvider.setOnShareTargetSelectedListener(this);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.undoButton: {
HistoryAdapter adapter = (HistoryAdapter) mImageShow
.getHistoryAdapter();
int position = adapter.undo();
mImageShow.onItemClick(position);
mImageShow.showToast("Undo");
invalidateViews();
return true;
}
case R.id.redoButton: {
HistoryAdapter adapter = (HistoryAdapter) mImageShow
.getHistoryAdapter();
int position = adapter.redo();
mImageShow.onItemClick(position);
mImageShow.showToast("Redo");
invalidateViews();
return true;
}
case R.id.showImageStateButton: {
toggleImageStatePanel();
return true;
}
case R.id.operationsButton: {
toggleHistoryPanel();
return true;
}
case android.R.id.home: {
saveImage();
return true;
}
}
return false;
}
private void fillListImages(LinearLayout listFilters) {
// TODO: use listview
// TODO: load the filters straight from the filesystem
ImagePreset[] preset = new ImagePreset[9];
int p = 0;
preset[p++] = new ImagePreset();
preset[p++] = new ImagePresetSaturated();
preset[p++] = new ImagePresetOld();
preset[p++] = new ImagePresetXProcessing();
preset[p++] = new ImagePresetBW();
preset[p++] = new ImagePresetBWRed();
preset[p++] = new ImagePresetBWGreen();
preset[p++] = new ImagePresetBWBlue();
for (int i = 0; i < p; i++) {
ImageSmallFilter filter = new ImageSmallFilter(getBaseContext());
preset[i].setIsFx(true);
filter.setImagePreset(preset[i]);
filter.setController(this);
filter.setImageLoader(mImageLoader);
listFilters.addView(filter);
}
// Default preset (original)
mImageShow.setImagePreset(preset[0]);
}
private void fillListBorders(LinearLayout listBorders) {
// TODO: use listview
// TODO: load the borders straight from the filesystem
int p = 0;
ImageFilter[] borders = new ImageFilter[8];
borders[p++] = new ImageFilterBorder(null);
Drawable npd3 = getResources().getDrawable(R.drawable.filtershow_border_film3);
borders[p++] = new ImageFilterBorder(npd3);
Drawable npd = getResources().getDrawable(
R.drawable.filtershow_border_scratch3);
borders[p++] = new ImageFilterBorder(npd);
Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_black);
borders[p++] = new ImageFilterBorder(npd2);
Drawable npd6 = getResources().getDrawable(
R.drawable.filtershow_border_rounded_black);
borders[p++] = new ImageFilterBorder(npd6);
Drawable npd4 = getResources().getDrawable(R.drawable.filtershow_border_white);
borders[p++] = new ImageFilterBorder(npd4);
Drawable npd5 = getResources().getDrawable(
R.drawable.filtershow_border_rounded_white);
borders[p++] = new ImageFilterBorder(npd5);
for (int i = 0; i < p; i++) {
ImageSmallFilter filter = new ImageSmallFilter(getBaseContext());
filter.setImageFilter(borders[i]);
filter.setController(this);
filter.setImageLoader(mImageLoader);
filter.setShowTitle(false);
listBorders.addView(filter);
}
}
// //////////////////////////////////////////////////////////////////////////////
// Some utility functions
public void showOriginalViews(boolean value) {
for (ImageShow views : mImageViews) {
views.showOriginal(value);
}
}
public void invalidateViews() {
for (ImageShow views : mImageViews) {
views.invalidate();
}
}
public void hideListViews() {
for (View view : mListViews) {
view.setVisibility(View.GONE);
}
}
public void hideImageViews() {
mImageShow.setShowControls(false); // reset
for (View view : mImageViews) {
view.setVisibility(View.GONE);
}
}
public void unselectBottomPanelButtons() {
for (ImageButton button : mBottomPanelButtons) {
button.setSelected(false);
}
}
public void unselectPanelButtons(Vector<ImageButton> buttons) {
for (ImageButton button : buttons) {
button.setSelected(false);
}
}
// //////////////////////////////////////////////////////////////////////////////
// Click handlers for the top row buttons
private OnTouchListener createOnTouchShowOriginalButton() {
return new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean show = false;
if ((event.getActionMasked() != MotionEvent.ACTION_UP)
|| (event.getActionMasked() == MotionEvent.ACTION_CANCEL)) {
show = true;
}
showOriginalViews(show);
return true;
}
};
}
// //////////////////////////////////////////////////////////////////////////////
// imageState panel...
private void toggleImageStatePanel() {
final View view = findViewById(R.id.mainPanel);
final View viewList = findViewById(R.id.imageStatePanel);
if (mShowingHistoryPanel) {
findViewById(R.id.historyPanel).setVisibility(View.INVISIBLE);
mShowingHistoryPanel = false;
}
if (!mShowingImageStatePanel) {
mShowingImageStatePanel = true;
view.animate().setDuration(200).x(-viewList.getWidth())
.withLayer().withEndAction(new Runnable() {
public void run() {
viewList.setAlpha(0);
viewList.setVisibility(View.VISIBLE);
viewList.animate().setDuration(100)
.alpha(1.0f).start();
}
}).start();
} else {
mShowingImageStatePanel = false;
viewList.setVisibility(View.INVISIBLE);
view.animate().setDuration(200).x(0).withLayer()
.start();
}
invalidateOptionsMenu();
}
// //////////////////////////////////////////////////////////////////////////////
// history panel...
private void toggleHistoryPanel() {
final View view = findViewById(R.id.mainPanel);
final View viewList = findViewById(R.id.historyPanel);
if (mShowingImageStatePanel) {
findViewById(R.id.imageStatePanel).setVisibility(View.INVISIBLE);
mShowingImageStatePanel = false;
}
if (!mShowingHistoryPanel) {
mShowingHistoryPanel = true;
view.animate().setDuration(200).x(-viewList.getWidth())
.withLayer().withEndAction(new Runnable() {
public void run() {
viewList.setAlpha(0);
viewList.setVisibility(View.VISIBLE);
viewList.animate().setDuration(100)
.alpha(1.0f).start();
}
}).start();
} else {
mShowingHistoryPanel = false;
viewList.setVisibility(View.INVISIBLE);
view.animate().setDuration(200).x(0).withLayer()
.start();
}
invalidateOptionsMenu();
}
private void resetHistory() {
HistoryAdapter adapter = (HistoryAdapter) mImageShow
.getHistoryAdapter();
adapter.reset();
ImagePreset original = new ImagePreset(adapter.getItem(0));
mImageShow.setImagePreset(original);
invalidateViews();
}
// reset button in the history panel.
private OnClickListener createOnClickResetOperationsButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
resetHistory();
}
};
}
// //////////////////////////////////////////////////////////////////////////////
// Now, let's deal with the bottom panel.
private OnClickListener createOnClickFxButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
hideListViews();
unselectBottomPanelButtons();
mImageShow.setVisibility(View.VISIBLE);
mListFx.setVisibility(View.VISIBLE);
mFxButton.setSelected(true);
}
};
}
private OnClickListener createOnClickBorderButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
hideListViews();
unselectBottomPanelButtons();
mImageBorders.setVisibility(View.VISIBLE);
mListBorders.setVisibility(View.VISIBLE);
mBorderButton.setSelected(true);
}
};
}
private OnClickListener createOnClickGeometryButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
hideListViews();
unselectBottomPanelButtons();
mImageStraighten.setVisibility(View.VISIBLE);
mListGeometry.setVisibility(View.VISIBLE);
mGeometryButton.setSelected(true);
if (ANIMATE_PANELS) {
mListGeometry.setX(mListGeometry.getWidth());
mListGeometry.animate().setDuration(200).x(0).withLayer().start();
}
}
};
}
private OnClickListener createOnClickColorsButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
hideListViews();
unselectBottomPanelButtons();
mListColors.setVisibility(View.VISIBLE);
mImageShow.setVisibility(View.VISIBLE);
mColorsButton.setSelected(true);
if (ANIMATE_PANELS) {
View view = findViewById(R.id.listColorsFx);
view.setX(mListColors.getWidth());
view.animate().setDuration(200).x(0).withLayer().start();
}
}
};
}
// //////////////////////////////////////////////////////////////////////////////
// Geometry sub-panel
private OnClickListener createOnClickStraightenButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageStraighten.setVisibility(View.VISIBLE);
mImageStraighten.showToast("Straighten", true);
}
};
}
private OnClickListener createOnClickCropButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.showToast("Crop", true);
}
};
}
private OnClickListener createOnClickRotateButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.showToast("Rotate", true);
}
};
}
private OnClickListener createOnClickFlipButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.showToast("Flip", true);
}
};
}
// //////////////////////////////////////////////////////////////////////////////
// Filters sub-panel
private OnClickListener createOnClickVignetteButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
ImageFilter filter = preset.getFilter("Vignette");
if (filter == null) {
ImageFilterVignette vignette = new ImageFilterVignette();
ImagePreset copy = new ImagePreset(preset);
copy.add(vignette);
copy.setHistoryName(vignette.getName());
copy.setIsFx(false);
filter = copy.getFilter("Vignette");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
unselectPanelButtons(mColorsPanelButtons);
mVignetteButton.setSelected(true);
invalidateViews();
}
};
}
private OnClickListener createOnClickCurvesRGBButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageCurves.setVisibility(View.VISIBLE);
unselectPanelButtons(mColorsPanelButtons);
mCurvesButtonRGB.setSelected(true);
mImageCurves.setUseRed(true);
mImageCurves.setUseGreen(true);
mImageCurves.setUseBlue(true);
mImageCurves.reloadCurve();
}
};
}
private OnClickListener createOnClickSharpenButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageZoom.setVisibility(View.VISIBLE);
mImageZoom.setShowControls(true);
ImagePreset preset = mImageZoom.getImagePreset();
ImageFilter filter = preset.getFilter("Sharpen");
if (filter == null) {
ImageFilterSharpen sharpen = new ImageFilterSharpen();
ImagePreset copy = new ImagePreset(preset);
copy.add(sharpen);
copy.setHistoryName(sharpen.getName());
copy.setIsFx(false);
filter = copy.getFilter("Sharpen");
mImageZoom.setImagePreset(copy);
}
mImageZoom.setCurrentFilter(filter);
unselectPanelButtons(mColorsPanelButtons);
mSharpenButton.setSelected(true);
invalidateViews();
}
};
}
private OnClickListener createOnClickContrastButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
ImageFilter filter = preset.getFilter("Contrast");
if (filter == null) {
ImageFilterContrast contrast = new ImageFilterContrast();
ImagePreset copy = new ImagePreset(preset);
copy.add(contrast);
copy.setHistoryName(contrast.getName());
copy.setIsFx(false);
filter = copy.getFilter("Contrast");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
unselectPanelButtons(mColorsPanelButtons);
mContrastButton.setSelected(true);
invalidateViews();
}
};
}
private OnClickListener createOnClickSaturationButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
ImageFilter filter = preset.getFilter("Saturated");
if (filter == null) {
ImageFilterSaturated sat = new ImageFilterSaturated();
ImagePreset copy = new ImagePreset(preset);
copy.add(sat);
copy.setHistoryName(sat.getName());
copy.setIsFx(false);
filter = copy.getFilter("Saturated");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
unselectPanelButtons(mColorsPanelButtons);
mSaturationButton.setSelected(true);
invalidateViews();
}
};
}
private OnClickListener createOnClickTintButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
ImageFilter filter = preset.getFilter("Hue");
if (filter == null) {
ImageFilterHue contrast = new ImageFilterHue();
ImagePreset copy = new ImagePreset(preset);
copy.add(contrast);
copy.setHistoryName(contrast.getName());
copy.setIsFx(false);
filter = copy.getFilter("Hue");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
unselectPanelButtons(mColorsPanelButtons);
mTintButton.setSelected(true);
invalidateViews();
}
};
}
private OnClickListener createOnClickVibranceButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
ImageFilter filter = preset.getFilter("Shadows");
if (filter == null) {
ImageFilterShadows contrast = new ImageFilterShadows();
ImagePreset copy = new ImagePreset(preset);
copy.add(contrast);
copy.setHistoryName(contrast.getName());
copy.setIsFx(false);
filter = copy.getFilter("Shadows");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
unselectPanelButtons(mColorsPanelButtons);
mVibranceButton.setSelected(true);
invalidateViews();
}
};
}
private OnClickListener createOnClickExposureButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
ImageFilter filter = preset.getFilter("Exposure");
if (filter == null) {
ImageFilterExposure bright = new ImageFilterExposure();
ImagePreset copy = new ImagePreset(preset);
copy.add(bright);
copy.setHistoryName(bright.getName());
copy.setIsFx(false);
filter = copy.getFilter("Exposure");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
unselectPanelButtons(mColorsPanelButtons);
mExposureButton.setSelected(true);
invalidateViews();
}
};
}
private OnClickListener createOnClickShadowRecoveryButton() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImageViews();
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
ImageFilter filter = preset.getFilter("Hue");
if (filter == null) {
ImageFilterHue contrast = new ImageFilterHue();
ImagePreset copy = new ImagePreset(preset);
copy.add(contrast);
copy.setHistoryName(contrast.getName());
copy.setIsFx(false);
filter = copy.getFilter("Hue");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
unselectPanelButtons(mColorsPanelButtons);
mShadowRecoveryButton.setSelected(true);
invalidateViews();
}
};
}
// //////////////////////////////////////////////////////////////////////////////
public float getPixelsFromDip(float value) {
Resources r = getResources();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
r.getDisplayMetrics());
}
public void useImagePreset(ImagePreset preset) {
if (preset == null) {
return;
}
ImagePreset copy = new ImagePreset(preset);
mImageShow.setImagePreset(copy);
if (preset.isFx()) {
// if it's an FX we rest the curve adjustment too
mImageCurves.resetCurve();
}
invalidateViews();
}
public void useImageFilter(ImageFilter imageFilter) {
if (imageFilter == null) {
return;
}
ImagePreset oldPreset = mImageShow.getImagePreset();
ImagePreset copy = new ImagePreset(oldPreset);
// TODO: use a numerical constant instead.
if (imageFilter.getName().equalsIgnoreCase("Border")) {
copy.remove("Border");
copy.setHistoryName("Border");
}
copy.add(imageFilter);
mImageShow.setImagePreset(copy);
invalidateViews();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
mImageShow.onItemClick(position);
invalidateViews();
}
public void pickImage() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
SELECT_PICTURE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.v(LOGTAG, "onActivityResult");
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();
mImageLoader.loadBitmap(selectedImageUri);
}
}
}
public void saveImage() {
Toast toast = Toast.makeText(getBaseContext(), getString(R.string.saving_image),
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
mImageShow.saveImage(this, null);
}
static {
System.loadLibrary("jni_filtershow_filters");
}
}