package pl.verdigo.libraries.drawer.internal;
import pl.verdigo.libraries.drawer.Drawer;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy;
public class RightDrawer extends Drawer
{
private DrawerProxy mDrawerProxy;
public RightDrawer(Context context, int layout)
{
super(context, layout);
}
protected int getTargetPosition()
{
return 0 - getDrawerWidth();
}
protected boolean isRightDrawer()
{
return true;
}
/**
* Creates DrawerProxy object.
*
* @return DrawerProxy object
*/
protected IDrawerProxy createDrawerProxy()
{
if (mDrawerProxy == null)
{
mDrawerProxy = new DrawerProxy(mDrawerActivity, mDrawer, mDrawerShadow, mDrawerContent);
}
return mDrawerProxy;
}
/**
* Handles touch events. If {@link Drawer} is not movable all touch events
* are ignored.
*
* @param view Touched view
* @param event Event
*/
public boolean onTouch(View view, MotionEvent event)
{
if (!mMovable)
{
return false;
}
int drawerWidth = getDrawerWidth();
if (event.getAction() == MotionEvent.ACTION_UP && isAllowCloseOnTouch())
{
int border = drawerWidth - (drawerWidth / 3);
if (mMovedPosition > 0 - border)
{
cancel();
return true;
}
else if (mMovedPosition >= drawerWidth && !mMovedBeyondMargin)
{
cancel();
return true;
}
mMovedBeyondMargin = false;
if (mMovedPosition < drawerWidth && isAnimationEnabled())
{
showWithAnimation();
}
else if (!isAnimationEnabled())
{
IDrawerProxy proxy = createDrawerProxy();
proxy.setPosition(drawerWidth);
}
mDeviation = 0;
mMoved = false;
mMovedPosition = 0;
return true;
}
if (event.getAction() == MotionEvent.ACTION_UP && !isAllowCloseOnTouch())
{
mMovedBeyondMargin = false;
if (isAnimationEnabled())
{
showWithAnimation();
}
else
{
IDrawerProxy proxy = createDrawerProxy();
proxy.setPosition(drawerWidth);
}
mDeviation = 0;
mMoved = false;
return true;
}
else if (event.getAction() == MotionEvent.ACTION_DOWN)
{
mDeviation = Math.round(event.getRawX()) + getDrawerWidth();
}
else if (event.getAction() == MotionEvent.ACTION_MOVE)
{
mMoved = true;
mMovedPosition = Math.round(event.getRawX() - mDeviation);
if (mMovedPosition < 0 - drawerWidth)
{
mMovedPosition = 0 - drawerWidth;
}
if (mMovedPosition >= 0)
{
mMovedPosition = 0;
}
else
{
mMovedBeyondMargin = true;
}
IDrawerProxy proxy = createDrawerProxy();
proxy.setPosition(mMovedPosition);
return true;
}
return false;
}
/**
* Internal DrawerProxy class to handle animation of {@link Drawer}
*
* @author Lukasz Milewski <lukasz.milewski@gmail.com>
*/
public class DrawerProxy implements IDrawerProxy
{
private int mOriginalWidth;
private View mView;
private View mViewAlpha;
private AnimatorProxy mViewAlphaProxy;
private View mViewShadow;
private View mViewWidth;
private int mDrawerWidth;
public DrawerProxy(View view, View viewWidth, View viewShadow, View alphaView)
{
mView = view;
mViewWidth = viewWidth;
mViewShadow = viewShadow;
mViewAlpha = alphaView;
mViewAlphaProxy = AnimatorProxy.wrap(alphaView);
mOriginalWidth = mActivityWidth;
mDrawerWidth = getDrawerWidth();
}
public int getLeft()
{
return mView.getPaddingLeft();
}
public void setAlpha(int position)
{
float value = (Float.valueOf(0 - position) / Float.valueOf(mDrawerWidth)) * 0.7f + 0.3f;
mViewAlphaProxy.setAlpha(value);
}
public void setPosition(int position)
{
setLeftPadding(mView, position);
setLeftPadding(mViewShadow, position + mOriginalWidth);
setWidth(mView, mOriginalWidth + position);
setWidth(mViewShadow, position);
setLeftMargin(mViewWidth, mOriginalWidth + position);
setWidth(mViewWidth, -1 * position);
if ((mMoveDrawer || mScaleDrawer) && !mTransform3dDrawer)
{
setLeftPadding(mViewAlpha, 0 - (mDrawerWidth + position));
}
else
{
int padding = 0 - (mDrawerWidth + position);
setLeftPadding(mViewAlpha, padding);
setWidth(mViewAlpha, mDrawerWidth + padding);
}
if (mFadeDrawer)
{
setAlpha(position);
}
// if (mScaleDrawer && !mTransform3dDrawer)
// {
// setScale(position);
// }
// if (mTransform3dDrawer)
// {
// setTransform3d(position);
// }
}
private void setLeftPadding(View view, int left)
{
view.setPadding(left, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
}
private void setLeftMargin(View view, int left)
{
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
params.setMargins(left, params.topMargin, params.rightMargin, params.bottomMargin);
view.setLayoutParams(params);
}
// private void setScale(int position)
// {
// float scale = (Float.valueOf(position) / Float.valueOf(mDrawerWidth)) * 0.2f + 0.8f;
// mViewAlphaProxy.setScaleX(scale);
// mViewAlphaProxy.setScaleY(scale);
// }
// @TargetApi(11)
// private void setTransform3d(int position)
// {
// int maxLeft = Math.round(mDrawerWidth * 0.9f);
// int negativePaddingLeft = -1 * (int) (maxLeft - (Float.valueOf(position) * 0.9f));
// setLeftPadding(mViewWidth, negativePaddingLeft);
//
// float scale = (Float.valueOf(position) / Float.valueOf(mDrawerWidth)) * 0.3f + 0.7f;
// mViewAlphaProxy.setScaleX(scale);
// mViewAlphaProxy.setScaleY(scale);
//
// float rotate = (Float.valueOf(position) / Float.valueOf(mDrawerWidth)) * 0.9f + 0.1f;
// mViewAlpha.setRotationY(-45 + (rotate * 45));
// }
private void setWidth(View view, int width)
{
ViewGroup.LayoutParams params = view.getLayoutParams();
params.width = width;
view.setLayoutParams(params);
}
}
}