package org.appsroid.fxpro;
import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import org.appsroid.fxpro.bitmap.BitmapLoader;
import org.appsroid.fxpro.bitmap.BitmapProcessing;
import org.appsroid.fxpro.bitmap.BitmapWriter;
import org.appsroid.fxpro.dialog.BackDialog;
import org.appsroid.fxpro.dialog.LoadingDialog;
import org.appsroid.fxpro.library.Constants;
import org.appsroid.fxpro.library.Toaster;
import org.appsroid.fxpro.library.UriToUrl;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Vibrator;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class PhotoActivity extends Activity {
private Animation animation;
private ImageView image_holder;
private Bitmap last_bitmap;
private int source_id;
private Uri imageUri;
private String imageUrl;
private LinearLayout btn_holder;
private ImageView undo_btn;
private ImageView save_btn;
private ArrayList<String> effects;
private LinearLayout holder_target;
private LinearLayout apply_set;
private RelativeLayout toolbox;
private String selected_effect;
private LoadingDialog loading_dialog;
private LinearLayout effect_box;
private int tint_color = 0xFF1E8D24;
private boolean flip_v = false;
private boolean flip_h = false;
private int boost_type = 1;
private SeekBar hue_value;
private TextView hue_label;
private SeekBar sat_value;
private TextView sat_label;
private SeekBar bright_value;
private TextView bright_label;
private SeekBar cont_value;
private TextView cont_label;
private SeekBar gRed_value;
private TextView gRed_label;
private SeekBar gGreen_value;
private TextView gGreen_label;
private SeekBar gBlue_value;
private TextView gBlue_label;
private SeekBar bRed_value;
private TextView bRed_label;
private SeekBar bGreen_value;
private TextView bGreen_label;
private SeekBar bBlue_value;
private TextView bBlue_label;
private SeekBar rotate_value;
private TextView rotate_label;
private SeekBar boost_value;
private TextView boost_label;
private String outputURL = null;
private SeekBar cdepth_value;
private TextView cdepth_label;
private boolean save_status = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo);
image_holder = (ImageView) findViewById(R.id.source_image);
btn_holder = (LinearLayout) findViewById(R.id.btn_holder);
undo_btn = (ImageView) findViewById(R.id.undo_btn);
save_btn = (ImageView) findViewById(R.id.save_btn);
loading_dialog = new LoadingDialog(PhotoActivity.this);
effect_box = (LinearLayout) findViewById(R.id.effects_holder);
apply_set = (LinearLayout) findViewById(R.id.effect_set_box);
toolbox = (RelativeLayout) findViewById(R.id.toolbox);
hue_value = (SeekBar) findViewById(R.id.hue_value);
hue_label = (TextView) findViewById(R.id.hue_label);
sat_value = (SeekBar) findViewById(R.id.sat_value);
sat_label = (TextView) findViewById(R.id.sat_label);
bright_value = (SeekBar) findViewById(R.id.brightness_value);
bright_label = (TextView) findViewById(R.id.brightness_label);
cont_value = (SeekBar) findViewById(R.id.contrast_value);
cont_label = (TextView) findViewById(R.id.contrast_label);
gRed_value = (SeekBar) findViewById(R.id.gRed_value);
gRed_label = (TextView) findViewById(R.id.gRed_label);
gGreen_value = (SeekBar) findViewById(R.id.gGreen_value);
gGreen_label = (TextView) findViewById(R.id.gGreen_label);
gBlue_value = (SeekBar) findViewById(R.id.gBlue_value);
gBlue_label = (TextView) findViewById(R.id.gBlue_label);
bRed_value = (SeekBar) findViewById(R.id.bRed_value);
bRed_label = (TextView) findViewById(R.id.bRed_label);
bGreen_value = (SeekBar) findViewById(R.id.bGreen_value);
bGreen_label = (TextView) findViewById(R.id.bGreen_label);
bBlue_value = (SeekBar) findViewById(R.id.bBlue_value);
bBlue_label = (TextView) findViewById(R.id.bBlue_label);
rotate_value = (SeekBar) findViewById(R.id.rotate_value);
rotate_label = (TextView) findViewById(R.id.rotate_label);
boost_value = (SeekBar) findViewById(R.id.boost_value);
boost_label = (TextView) findViewById(R.id.boost_label);
cdepth_value = (SeekBar) findViewById(R.id.cdepth_value);
cdepth_label = (TextView) findViewById(R.id.cdepth_label);
if (savedInstanceState == null) {
source_id = getIntent().getExtras().getInt(Constants.EXTRA_KEY_IMAGE_SOURCE);
imageUri = getIntent().getData();
effects = new ArrayList<String>();
try {
loadImage();
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_img_not_found);
backToMain();
}
} else {
effects = savedInstanceState.getStringArrayList(Constants.KEY_EFFECTS_LIST);
imageUrl = savedInstanceState.getString(Constants.KEY_URL);
source_id = savedInstanceState.getInt(Constants.KEY_SOURCE_ID);
setImage((Bitmap) savedInstanceState.getParcelable(Constants.KEY_BITMAP));
}
if (effects.size() > 0) {
btn_holder.setVisibility(View.VISIBLE);
flyIn();
} else {
btn_holder.clearAnimation();
}
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
overridePendingTransition(0, 0);
super.onStop();
}
public void toggleToolbox(View view) {
if (toolbox.getVisibility() == View.VISIBLE) {
toolbox.setVisibility(View.GONE);
} else {
toolbox.setVisibility(View.VISIBLE);
}
}
private void flyIn() {
hideLoading();
btn_holder.setVisibility(View.VISIBLE);
if (effects.isEmpty()) {
undo_btn.setVisibility(View.GONE);
save_btn.setVisibility(View.GONE);
} else {
undo_btn.setVisibility(View.VISIBLE);
save_btn.setVisibility(View.VISIBLE);
}
animation = AnimationUtils.loadAnimation(this, R.anim.holder_top_fast);
btn_holder.startAnimation(animation);
}
private Bitmap bitmap() {
try {
return ((BitmapDrawable) image_holder.getDrawable()).getBitmap();
} catch (Exception e) {
return null;
}
}
private void flyOut(final String method_name) {
if (!loading_dialog.isShowing()) {
displayLoading();
try {
if (method_name.equals("reloadImage")) {
Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
}
} catch (Exception e) {}
animation = AnimationUtils.loadAnimation(this, R.anim.holder_top_back_fast);
btn_holder.startAnimation(animation);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
}
@Override
public void onAnimationRepeat(Animation arg0) {
}
@Override
public void onAnimationEnd(Animation arg0) {
animation.setAnimationListener(null);
btn_holder.clearAnimation();
btn_holder.setVisibility(View.GONE);
callMethod(method_name);
}
});
}
}
private void callMethod(String method_name) {
try {
Method method = getClass().getDeclaredMethod(method_name);
method.invoke(this, new Object[] {});
} catch (Exception e) {}
}
private void setImage(Bitmap bitmap) {
hideLoading();
try {
if (bitmap != null) {
image_holder.setImageBitmap(bitmap);
} else {
Toaster.make(getApplicationContext(), R.string.error_img_not_found);
backToMain();
}
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_img_not_found);
backToMain();
}
}
public void applyTint(View view) {
if (tint_color != Color.parseColor(view.getTag().toString())) {
tint_color = Color.parseColor(view.getTag().toString());
applyTempSelectedEffect();
}
}
public void onFlipV(View view) {
flip_v = !flip_v;
applyTempSelectedEffect();
}
public void onFlipH(View view) {
flip_h = !flip_h;
applyTempSelectedEffect();
}
public void onClickBoostType(View view) {
boost_type = Integer.parseInt(view.getTag().toString());
modifyBoostHolder();
applyTempSelectedEffect();
}
public void setSelectedEffect(View view) {
if (!loading_dialog.isShowing()) {
if (selected_effect.equals("tint")) {
selected_effect = selected_effect + "_#" + Integer.toHexString(tint_color);
} else if (selected_effect.equals("brightness")) {
if (bright_value.getProgress() == 200) {
selected_effect = "";
bright_value.setOnSeekBarChangeListener(null);
} else {
selected_effect = selected_effect + "_" + bright_value.getProgress(); }
} else if (selected_effect.equals("contrast")) {
if (cont_value.getProgress() == 50) {
selected_effect = "";
cont_value.setOnSeekBarChangeListener(null);
} else {
selected_effect = selected_effect + "_" + cont_value.getProgress();
}
} else if (selected_effect.equals("flip")) {
if (rotate_value.getProgress() == 0 && !flip_v && !flip_h) {
selected_effect = "";
rotate_value.setOnSeekBarChangeListener(null);
} else {
selected_effect = selected_effect + "_" + (flip_h ? "t" : "f") + "_" + (flip_v ? "t" : "f") + "_" + rotate_value.getProgress();
}
} else if (selected_effect.equals("hue")) {
selected_effect = selected_effect + "_" + hue_value.getProgress();
} else if (selected_effect.equals("gamma")) {
selected_effect = selected_effect + "_" + gRed_value.getProgress() + "_" + gGreen_value.getProgress() + "_" + gBlue_value.getProgress();
} else if (selected_effect.equals("cdepth")) {
selected_effect = selected_effect + "_" + cdepth_value.getProgress();
} else if (selected_effect.equals("cbalance")) {
if (bRed_value.getProgress() == 100 && bGreen_value.getProgress() == 100 && bBlue_value.getProgress() == 100) {
selected_effect = "";
bRed_value.setOnSeekBarChangeListener(null);
bGreen_value.setOnSeekBarChangeListener(null);
bBlue_value.setOnSeekBarChangeListener(null);
} else {
selected_effect = selected_effect + "_" + bRed_value.getProgress() + "_" + bGreen_value.getProgress() + "_" + bBlue_value.getProgress();
}
} else if (selected_effect.equals("boost")) {
selected_effect = selected_effect + "_" + boost_type + "_" + boost_value.getProgress();
} else if (selected_effect.equals("saturation")) {
if (sat_value.getProgress() == 100) {
selected_effect = "";
sat_value.setOnSeekBarChangeListener(null);
} else {
selected_effect = selected_effect + "_" + sat_value.getProgress();
}
}
applyEffect(selected_effect, true, false);
hideEffectHolder();
}
}
public void cancelSelectedEffect(View view) {
if (!loading_dialog.isShowing()) {
setImage(last_bitmap.copy(last_bitmap.getConfig(), true));
try {
last_bitmap.recycle();
last_bitmap = null;
} catch (Exception e) {}
hideEffectHolder();
}
}
private void applyTempSelectedEffect() {
applyEffect(selected_effect, false, true);
}
private void handleEffect(String effect) {
ArrayList<String> noOptions = new ArrayList<String>();
noOptions.add("invert");
noOptions.add("grayscale");
noOptions.add("noise");
noOptions.add("sepia");
noOptions.add("sharpen");
noOptions.add("emboss");
noOptions.add("gaussian");
noOptions.add("sketch");
noOptions.add("vignette");
if (noOptions.indexOf(effect) == -1) {
last_bitmap = bitmap().copy(bitmap().getConfig(), false);
selected_effect = effect;
displayEffectHolder();
// Set default if exists
if (effect.equals("tint") || effect.equals("hue") || effect.equals("gamma") || effect.equals("cdepth") || effect.equals("boost")) {
applyTempSelectedEffect();
}
} else {
applyEffect(effect, true, true);
}
}
private void hideEffectHolder() {
displayEffectsBox();
if (selected_effect.startsWith("hue")) {
hue_value.setOnSeekBarChangeListener(null);
} else if (selected_effect.startsWith("brightness")) {
bright_value.setOnSeekBarChangeListener(null);
} else if (selected_effect.startsWith("contrast")) {
cont_value.setOnSeekBarChangeListener(null);
} else if (selected_effect.startsWith("flip")) {
rotate_value.setOnSeekBarChangeListener(null);
} else if (selected_effect.startsWith("gamma")) {
gRed_value.setOnSeekBarChangeListener(null);
gGreen_value.setOnSeekBarChangeListener(null);
gBlue_value.setOnSeekBarChangeListener(null);
} else if (selected_effect.startsWith("cdepth")) {
cdepth_value.setOnSeekBarChangeListener(null);
} else if (selected_effect.startsWith("gamma")) {
bRed_value.setOnSeekBarChangeListener(null);
bGreen_value.setOnSeekBarChangeListener(null);
bBlue_value.setOnSeekBarChangeListener(null);
} else if (selected_effect.startsWith("boost")) {
boost_value.setOnSeekBarChangeListener(null);
} else if (selected_effect.startsWith("saturation")) {
sat_value.setOnSeekBarChangeListener(null);
}
animation = AnimationUtils.loadAnimation(this, R.anim.holder_bottom_back_fast);
holder_target.startAnimation(animation);
animation = AnimationUtils.loadAnimation(this, R.anim.holder_top_back_fast);
apply_set.startAnimation(animation);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
}
@Override
public void onAnimationRepeat(Animation arg0) {
}
@Override
public void onAnimationEnd(Animation arg0) {
animation.setAnimationListener(null);
holder_target.clearAnimation();
apply_set.clearAnimation();
holder_target.setVisibility(View.GONE);
apply_set.setVisibility(View.GONE);
flyIn();
}
});
}
OnSeekBarChangeListener onHueChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyHueHolder();
}
};
OnSeekBarChangeListener onSatChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifySaturationHolder();
}
};
OnSeekBarChangeListener onBrightChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyBrightnessHolder();
}
};
OnSeekBarChangeListener onCDepthChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyCDepthHolder();
}
};
OnSeekBarChangeListener onContChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyContrastHolder();
}
};
OnSeekBarChangeListener onRotateChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyRotateHolder();
}
};
OnSeekBarChangeListener onGRedChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyGammaHolder();
}
};
OnSeekBarChangeListener onGGreenChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyGammaHolder();
}
};
OnSeekBarChangeListener onBGreenChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyBalanceHolder();
}
};
OnSeekBarChangeListener onBRedChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyBalanceHolder();
}
};
OnSeekBarChangeListener onBBlueChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyBalanceHolder();
}
};
OnSeekBarChangeListener onGBlueChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyGammaHolder();
}
};
OnSeekBarChangeListener onBoostChange = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
applyTempSelectedEffect();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
modifyBoostHolder();
}
};
private void displayEffectHolder() {
hideEffectsBox(true);
hideLoading();
if (selected_effect.equals("hue")) {
hue_value.setProgress(180);
modifyHueHolder();
hue_value.setOnSeekBarChangeListener(onHueChange);
} else if (selected_effect.equals("brightness")) {
bright_value.setProgress(200);
modifyBrightnessHolder();
bright_value.setOnSeekBarChangeListener(onBrightChange);
} else if (selected_effect.equals("contrast")) {
cont_value.setProgress(50);
modifyContrastHolder();
cont_value.setOnSeekBarChangeListener(onContChange);
} else if (selected_effect.equals("flip")) {
flip_h = false;
flip_v = false;
rotate_value.setProgress(0);
modifyRotateHolder();
rotate_value.setOnSeekBarChangeListener(onRotateChange);
} else if (selected_effect.equals("gamma")) {
gRed_value.setProgress(24);
gGreen_value.setProgress(24);
gBlue_value.setProgress(24);
modifyGammaHolder();
gRed_value.setOnSeekBarChangeListener(onGRedChange);
gGreen_value.setOnSeekBarChangeListener(onGGreenChange);
gBlue_value.setOnSeekBarChangeListener(onGBlueChange);
} else if (selected_effect.equals("cdepth")) {
cdepth_value.setProgress(1);
modifyCDepthHolder();
cdepth_value.setOnSeekBarChangeListener(onCDepthChange);
} else if (selected_effect.equals("cbalance")) {
bRed_value.setProgress(100);
bGreen_value.setProgress(100);
bBlue_value.setProgress(100);
modifyBalanceHolder();
bRed_value.setOnSeekBarChangeListener(onBRedChange);
bGreen_value.setOnSeekBarChangeListener(onBGreenChange);
bBlue_value.setOnSeekBarChangeListener(onBBlueChange);
} else if (selected_effect.equals("boost")) {
boost_type = 1;
boost_value.setProgress(100);
modifyBoostHolder();
boost_value.setOnSeekBarChangeListener(onBoostChange);
} else if (selected_effect.equals("saturation")) {
sat_value.setProgress(100);
modifySaturationHolder();
sat_value.setOnSeekBarChangeListener(onSatChange);
}
holder_target = (LinearLayout) findViewById(getResources().getIdentifier("holder_" + selected_effect, "id", getPackageName()));
/*
// SET MAX SIZE FOR TOOL BOX OF FILTER
DisplayMetrics metrics = getResources().getDisplayMetrics();
holder_target.getLayoutParams().width = Math.min(700, metrics.widthPixels);
holder_target.requestLayout();
*/
holder_target.setVisibility(View.VISIBLE);
apply_set.setVisibility(View.VISIBLE);
animation = AnimationUtils.loadAnimation(this, R.anim.holder_bottom_fast);
holder_target.startAnimation(animation);
animation = AnimationUtils.loadAnimation(this, R.anim.holder_top_fast);
apply_set.startAnimation(animation);
}
private void hideEffectsBox(boolean with_btn_holder) {
if (with_btn_holder) {
animation = AnimationUtils.loadAnimation(this, R.anim.holder_top_back_fast);
btn_holder.startAnimation(animation);
}
animation = AnimationUtils.loadAnimation(this, R.anim.effect_box_back);
effect_box.startAnimation(animation);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
}
@Override
public void onAnimationRepeat(Animation arg0) {
}
@Override
public void onAnimationEnd(Animation arg0) {
animation.setAnimationListener(null);
effect_box.clearAnimation();
effect_box.setVisibility(View.GONE);
}
});
}
private void displayEffectsBox() {
effect_box.setVisibility(View.VISIBLE);
animation = AnimationUtils.loadAnimation(this, R.anim.effect_box);
effect_box.startAnimation(animation);
}
private void modifyRotateHolder() {
rotate_label.setText(getString(R.string.rotate).replace(":value:", rotate_value.getProgress() + ""));
}
private void modifyBoostHolder() {
int boost_label_id;
if (boost_type == 1) {
boost_label_id = R.string.redP;
} else if (boost_type == 2) {
boost_label_id = R.string.greenP;
} else {
boost_label_id = R.string.blueP;
}
boost_label.setText(getString(boost_label_id).replace(":value:", boost_value.getProgress() + ""));
}
private void modifyHueHolder() {
hue_label.setText(getString(R.string.hue).replace(":value:", hue_value.getProgress() + ""));
}
private void modifySaturationHolder() {
sat_label.setText(getString(R.string.sat).replace(":value:", sat_value.getProgress() + ""));
}
private void modifyCDepthHolder() {
cdepth_label.setText(getString(R.string.cdepth).replace(":value:", (int) Math.pow(2, cdepth_value.getProgress() + 4) + ""));
}
private void modifyGammaHolder() {
gRed_label.setText(getString(R.string.red).replace(":value:", ((double) (gRed_value.getProgress() + 2) / 10) + ""));
gGreen_label.setText(getString(R.string.green).replace(":value:", ((double) (gGreen_value.getProgress() + 2) / 10) + ""));
gBlue_label.setText(getString(R.string.blue).replace(":value:", ((double) (gBlue_value.getProgress() + 2) / 10) + ""));
}
private void modifyBalanceHolder() {
bRed_label.setText(getString(R.string.redP).replace(":value:", (double) bRed_value.getProgress() + ""));
bGreen_label.setText(getString(R.string.greenP).replace(":value:", (double) bGreen_value.getProgress() + ""));
bBlue_label.setText(getString(R.string.blueP).replace(":value:", (double) bBlue_value.getProgress() + ""));
}
private void modifyBrightnessHolder() {
bright_label.setText(getString(R.string.brightness).replace(":value:", ((bright_value.getProgress() - 200) * 100 / 200) + ""));
}
private void modifyContrastHolder() {
cont_label.setText(getString(R.string.contrast).replace(":value:", (cont_value.getProgress() - 50) + ""));
}
private void applyEffect(String effect, boolean set, boolean apply) {
if (set) {
effects.add(effect);
try {
last_bitmap.recycle();
last_bitmap = null;
} catch(Exception e) {}
} else {
setImage(last_bitmap.copy(last_bitmap.getConfig(), true));
}
if (apply) {
new ApplyEffects(bitmap()).execute(effect);
}
}
private class ApplyEffects extends AsyncTask<String, Void, Bitmap> {
Bitmap bitmap;
public ApplyEffects(Bitmap input_bitmap) {
bitmap = input_bitmap.copy(input_bitmap.getConfig(), true);
input_bitmap.recycle();
input_bitmap = null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
try {
image_holder.setImageBitmap(null);
} catch (Exception e) {}
if (!loading_dialog.isShowing()) {
displayLoading();
}
}
@Override
protected Bitmap doInBackground(String... input_effects) {
for (String effect : input_effects) {
// Handle properties
if (effect.startsWith("tint") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
tint_color = Color.parseColor(properties[1]);
} else if (effect.startsWith("hue") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
hue_value.setProgress(Integer.parseInt(properties[1]));
} else if (effect.startsWith("brightness") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
bright_value.setProgress(Integer.parseInt(properties[1]));
} else if (effect.startsWith("contrast") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
cont_value.setProgress(Integer.parseInt(properties[1]));
} else if (effect.startsWith("flip") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
flip_h = (properties[1].equals("t"));
flip_v = (properties[2].equals("t"));
rotate_value.setProgress(Integer.parseInt(properties[3]));
} else if (effect.startsWith("gamma") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
gRed_value.setProgress(Integer.parseInt(properties[1]));
gGreen_value.setProgress(Integer.parseInt(properties[2]));
gBlue_value.setProgress(Integer.parseInt(properties[3]));
} else if (effect.startsWith("cdepth") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
cdepth_value.setProgress(Integer.parseInt(properties[1]));
} else if (effect.startsWith("cbalance") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
bRed_value.setProgress(Integer.parseInt(properties[1]));
bGreen_value.setProgress(Integer.parseInt(properties[2]));
bBlue_value.setProgress(Integer.parseInt(properties[3]));
} else if (effect.startsWith("boost") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
boost_type = Integer.parseInt(properties[1]);
boost_value.setProgress(Integer.parseInt(properties[2]));
} else if (effect.startsWith("saturation") && effect.contains("_")) {
String[] properties = effect.split("_");
effect = properties[0];
sat_value.setProgress(Integer.parseInt(properties[1]));
}
// Apply Filters
if (effect.equals("brightness")) {
try{
bitmap = BitmapProcessing.brightness(bitmap, bright_value.getProgress() - 200);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("contrast")) {
try{
bitmap = BitmapProcessing.contrast(bitmap, cont_value.getProgress() - 50);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("noise")) {
try{
bitmap = BitmapProcessing.noise(bitmap);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("flip")) {
try{
bitmap = BitmapProcessing.rotate(BitmapProcessing.flip(bitmap, flip_h, flip_v), (float) rotate_value.getProgress());
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("hue")) {
try {
bitmap = BitmapProcessing.hue(bitmap, (float) hue_value.getProgress());
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("tint")) {
try{
bitmap = BitmapProcessing.tint(bitmap, tint_color);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("gamma")) {
try{
bitmap = BitmapProcessing.gamma(bitmap, (double) gRed_value.getProgress(), (double) gGreen_value.getProgress(), (double) gBlue_value.getProgress());
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("invert")) {
try{
bitmap = BitmapProcessing.invert(bitmap);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("grayscale")) {
try {
bitmap = BitmapProcessing.grayscale(bitmap);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("sepia")) {
try{
bitmap = BitmapProcessing.sepia(bitmap);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("sharpen")) {
try{
bitmap = BitmapProcessing.sharpen(bitmap);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("gaussian")) {
try{
bitmap = BitmapProcessing.gaussian(bitmap);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("cbalance")) {
try{
bitmap = BitmapProcessing.cfilter(bitmap, (double) bRed_value.getProgress(), (double) bGreen_value.getProgress(), (double) bBlue_value.getProgress());
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("cdepth")) {
try{
bitmap = BitmapProcessing.cdepth(bitmap, (int) Math.pow(2, 7 - cdepth_value.getProgress()));
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("emboss")) {
try{
bitmap = BitmapProcessing.emboss(bitmap);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("boost")) {
try{
bitmap = BitmapProcessing.boost(bitmap, boost_type, (float) boost_value.getProgress());
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("sketch")) {
try {
bitmap = BitmapProcessing.sketch(BitmapProcessing.grayscale(bitmap));
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("vignette")) {
try {
bitmap = BitmapProcessing.vignette(bitmap);
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
} else if (effect.equals("saturation")) {
try {
bitmap = BitmapProcessing.saturation(bitmap, sat_value.getProgress());
} catch (Exception e) {
Toaster.make(getApplicationContext(), R.string.error_apply_effect);
}
}
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (save_status) {
int counter = 0;
String fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1, imageUrl.lastIndexOf("."));
File path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File file = new File(path, "EffectsPro");
try {
file.mkdirs();
} catch(Exception e) {}
file = new File(path, "EffectsPro/" + fileName + ".jpg");
while (file.exists()) {
counter++;
file = new File(path, "EffectsPro/" + fileName + "(" + counter + ").jpg");
}
outputURL = file.getAbsolutePath();
new BitmapWriterWorker(file, bitmap).execute();
} else {
if (btn_holder.getVisibility() == View.GONE) {
flyIn();
}
setImage(bitmap);
}
}
}
private class BitmapWriterWorker extends BitmapWriter {
public BitmapWriterWorker(File input_file, Bitmap input_bitmap) {
super(input_file, input_bitmap);
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
Toaster.make(getApplicationContext(), getString(R.string.saved).replace(":url:", outputURL));
} else {
Toaster.make(getApplicationContext(), R.string.save_failed);
}
backToMain();
}
}
private void loadImage() throws Exception {
BitmapWorkerTask bitmaporker = new BitmapWorkerTask();
bitmaporker.execute();
}
private class BitmapWorkerTask extends AsyncTask<Void, Void, Bitmap> {
DisplayMetrics metrics;
BitmapLoader bitmapLoader;
public BitmapWorkerTask() {
metrics = getResources().getDisplayMetrics();
imageUrl = UriToUrl.get(getApplicationContext(), imageUri);
bitmapLoader = new BitmapLoader();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
toolbox.setVisibility(View.GONE);
}
// Decode image in background.
@Override
protected Bitmap doInBackground(Void... arg0) {
try {
return bitmapLoader.load(getApplicationContext(), new int[] { metrics.widthPixels, metrics.heightPixels }, imageUrl);
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
toolbox.setVisibility(View.VISIBLE);
setImage(bitmap);
} else {
Toaster.make(getApplicationContext(), R.string.error_img_not_found);
backToMain();
}
}
}
@Override
public void onBackPressed() {
if (apply_set.getVisibility() == View.VISIBLE){
cancelSelectedEffect(null);
} else {
displayBackDialog();
}
}
private void displayBackDialog() {
final BackDialog dialog = new BackDialog(PhotoActivity.this);
dialog.positive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
backToMain();
}
});
dialog.negative.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
private void recycleBitmap() {
try {
bitmap().recycle();
image_holder.setImageBitmap(null);
} catch (Exception e) {}
}
private void backToMain(){
recycleBitmap();
if (loading_dialog.isShowing()) {
hideLoading();
}
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
overridePendingTransition(0, 0);
if (source_id == 1) {
UriToUrl.deleteUri(getApplicationContext(), imageUri);
}
if (save_status || source_id == 1) {
UriToUrl.sendBroadcast(getApplicationContext(), outputURL);
}
finish();
}
@SuppressWarnings("unused")
private void reloadImage() {
new RevertEffects().execute();
}
private class RevertEffects extends AsyncTask<Void, Void, Bitmap> {
@Override
protected void onPreExecute() {
image_holder.setVisibility(View.GONE);
super.onPreExecute();
}
@Override
protected Bitmap doInBackground(Void... arg0) {
DisplayMetrics metrics = getResources().getDisplayMetrics();
BitmapLoader bitmapLoader = new BitmapLoader();
recycleBitmap();
try {
return bitmapLoader.load(getApplicationContext(), new int[] { metrics.widthPixels, metrics.heightPixels }, imageUrl);
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
image_holder.setVisibility(View.VISIBLE);
if (effects.size() < 2) {
effects = new ArrayList<String>();
setImage(bitmap);
flyIn();
} else {
effects.remove(effects.size() - 1);
String[] effects_array = new String[effects.size()];
effects_array = effects.toArray(effects_array);
new ApplyEffects(bitmap).execute(effects_array);
}
} else {
Toaster.make(getApplicationContext(), R.string.error_img_not_found);
backToMain();
}
}
}
@SuppressWarnings("unused")
private void saveImage() {
new recycleAllBitmaps().execute();
}
private class recycleAllBitmaps extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
recycleBitmap();
ImageView imageView;
int id;
for (int i = 1; i < 20; i++) {
id = getResources().getIdentifier("effect_img" + i, "id", getPackageName());
imageView = (ImageView) findViewById(id);
try {
((BitmapDrawable) imageView.getDrawable()).getBitmap().recycle();
imageView.setImageBitmap(null);
} catch (Exception e) {}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
save_status = true;
ViewGroup root = (ViewGroup) toolbox.getRootView();
root.removeView(toolbox);
root.removeView(image_holder);
System.gc();
new OriginalImageLoader().execute();
}
}
private class OriginalImageLoader extends AsyncTask<Void, Void, Bitmap> {
@Override
protected Bitmap doInBackground(Void... arg0) {
BitmapLoader bitmapLoader = new BitmapLoader();
try {
return bitmapLoader.load(getApplicationContext(), imageUrl);
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
String[] effects_array = new String[effects.size()];
effects_array = effects.toArray(effects_array);
new ApplyEffects(bitmap).execute(effects.toArray(effects_array));
} else {
Toaster.make(getApplicationContext(), R.string.error_img_not_found);
backToMain();
}
}
}
public void onClickUndo(View view) {
if (!loading_dialog.isShowing()) {
flyOut("reloadImage");
}
}
public void onClickSave(View view) {
if (!loading_dialog.isShowing()) {
hideEffectsBox(false);
flyOut("saveImage");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(Constants.KEY_URL, imageUrl);
outState.putInt(Constants.KEY_SOURCE_ID, source_id);
outState.putStringArrayList(Constants.KEY_EFFECTS_LIST, effects);
outState.putParcelable(Constants.KEY_BITMAP, bitmap());
}
public void onClickEffectButton(View view){
if (!loading_dialog.isShowing()) {
displayLoading();
if (effects.size() == 0) {
btn_holder.setVisibility(View.GONE);
}
handleEffect(view.getTag().toString());
}
}
private void displayLoading() {
loading_dialog.show();
}
private void hideLoading() {
try {
loading_dialog.dismiss();
} catch (Exception e) {}
}
}