package com.aviary.android.feather.effects;
import org.json.JSONException;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.aviary.android.feather.R;
import com.aviary.android.feather.library.filters.AdjustFilter;
import com.aviary.android.feather.library.filters.FilterLoaderFactory;
import com.aviary.android.feather.library.filters.FilterLoaderFactory.Filters;
import com.aviary.android.feather.library.moa.MoaActionList;
import com.aviary.android.feather.library.services.ConfigService;
import com.aviary.android.feather.library.services.EffectContext;
import com.aviary.android.feather.widget.AdjustImageView;
import com.aviary.android.feather.widget.AdjustImageView.FlipType;
import com.aviary.android.feather.widget.AdjustImageView.OnResetListener;
// TODO: Auto-generated Javadoc
/**
* The Class AdjustEffectPanel.
*/
public class AdjustEffectPanel extends AbstractContentPanel implements OnClickListener, OnResetListener {
private AdjustImageView mView;
private int animDuration = 400;
private int resetAnimDuration = 200;
boolean isClosing;
int currentStraightenPosition = 45;
static final int NEGATIVE_DIRECTION = -1;
static final int POSITIVE_DIRECTION = 1;
/** The enable3 d animation. */
boolean enable3DAnimation;
boolean enableFreeRotate;
/**
* Instantiates a new adjust effect panel.
*
* @param context
* the context
* @param adjust
* the adjust
*/
public AdjustEffectPanel( EffectContext context, Filters adjust ) {
super( context );
mFilter = FilterLoaderFactory.get( adjust );
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractEffectPanel#onCreate(android.graphics.Bitmap)
*/
@Override
public void onCreate( Bitmap bitmap ) {
super.onCreate( bitmap );
ConfigService config = getContext().getService( ConfigService.class );
if ( null != config ) {
animDuration = config.getInteger( R.integer.feather_adjust_tool_anim_time );
resetAnimDuration = config.getInteger( R.integer.feather_adjust_tool_reset_anim_time );
enable3DAnimation = config.getBoolean( R.integer.feather_adjust_tool_enable_3d_flip );
enableFreeRotate = config.getBoolean( R.integer.feather_rotate_enable_free_rotate );
} else {
enable3DAnimation = false;
enableFreeRotate = false;
}
mView = (AdjustImageView) getContentView().findViewById( R.id.image );
mView.setResetAnimDuration( resetAnimDuration );
mView.setCameraEnabled( enable3DAnimation );
mView.setEnableFreeRotate( enableFreeRotate );
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractEffectPanel#onActivate()
*/
@Override
public void onActivate() {
super.onActivate();
mView.setImageBitmap( mBitmap );
mView.setOnResetListener( this );
View v = getOptionView();
v.findViewById( R.id.button1 ).setOnClickListener( this );
v.findViewById( R.id.button2 ).setOnClickListener( this );
v.findViewById( R.id.button3 ).setOnClickListener( this );
v.findViewById( R.id.button4 ).setOnClickListener( this );
//
// straighten stuff
//
contentReady();
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractEffectPanel#onDeactivate()
*/
@Override
public void onDeactivate() {
mView.setOnResetListener( null );
super.onDeactivate();
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractEffectPanel#onDestroy()
*/
@Override
public void onDestroy() {
mView.setImageBitmap( null );
super.onDestroy();
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractOptionPanel#generateOptionView(android.view.LayoutInflater,
* android.view.ViewGroup)
*/
@Override
protected ViewGroup generateOptionView( LayoutInflater inflater, ViewGroup parent ) {
return (ViewGroup) inflater.inflate( R.layout.feather_adjust_panel, parent, false );
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractContentPanel#generateContentView(android.view.LayoutInflater)
*/
@Override
protected View generateContentView( LayoutInflater inflater ) {
return inflater.inflate( R.layout.feather_adjust_content, null );
}
/*
* (non-Javadoc)
*
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick( View v ) {
if ( !isActive() || !isEnabled() ) return;
final int id = v.getId();
if ( id == R.id.button1 ) {
mView.rotate90( false, animDuration );
} else if ( id == R.id.button2 ) {
mView.rotate90( true, animDuration );
} else if ( id == R.id.button3 ) {
mView.flip( true, animDuration );
} else if ( id == R.id.button4 ) {
mView.flip( false, animDuration );
}
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractEffectPanel#getIsChanged()
*/
@SuppressLint("NewApi")
@Override
public boolean getIsChanged() {
mLogger.info( "getIsChanged" );
boolean straightenStarted = mView.getStraightenStarted();
final int rotation = (int) mView.getRotation();
final int flip_type = mView.getFlipType();
return rotation != 0 || ( flip_type != FlipType.FLIP_NONE.nativeInt ) || straightenStarted;
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractContentPanel#getContentDisplayMatrix()
*/
@Override
public Matrix getContentDisplayMatrix() {
return null;
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractEffectPanel#onGenerateResult()
*/
@SuppressLint("NewApi")
@Override
protected void onGenerateResult() {
final int rotation = (int) mView.getRotation();
final double rotationFromStraighten = mView.getStraightenAngle();
final boolean horizontal = mView.getHorizontalFlip();
final boolean vertical = mView.getVerticalFlip();
final double growthFactor = ( 1 / mView.getGrowthFactor() );
mLogger.log( "rotation: " + rotation );
mLogger.log( "rotationFromStraigthen: " + rotationFromStraighten );
mLogger.log( "flip: " + horizontal + ", " + vertical );
mLogger.log( "growFactor: " + growthFactor );
AdjustFilter filter = (AdjustFilter) mFilter;
filter.setFlip( horizontal, vertical );
filter.setFixedRotation( rotation );
filter.setStraighten( rotationFromStraighten, growthFactor, growthFactor );
Bitmap output;
try {
output = filter.execute( mBitmap, null, 1, 1 );
} catch ( JSONException e ) {
e.printStackTrace();
onGenericError( e );
return;
}
mView.setImageBitmap( output );
onComplete( output, (MoaActionList) filter.getActions().clone() );
}
/*
* (non-Javadoc)
*
* @see com.aviary.android.feather.effects.AbstractEffectPanel#onCancel()
*/
@SuppressLint("NewApi")
@Override
public boolean onCancel() {
if ( isClosing ) return true;
isClosing = true;
setEnabled( false );
final int rotation = (int) mView.getRotation();
final boolean hflip = mView.getHorizontalFlip();
final boolean vflip = mView.getVerticalFlip();
boolean straightenStarted = mView.getStraightenStarted();
final double rotationFromStraighten = mView.getStraightenAngle();
if ( rotation != 0 || hflip || vflip || ( straightenStarted && rotationFromStraighten != 0) ) {
mView.reset();
return true;
} else {
return false;
}
}
/**
* Reset animation is complete, now it is safe to call the parent {@link EffectContext#cancel()} method and close the panel.
*/
@Override
public void onResetComplete() {
getContext().cancel();
}
}