/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.ui.view;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.galaxy.meetup.client.android.R;
public class SlidingPanelLayout extends ScrollableViewGroup {
private OnSlidingPanelStateChange mListener;
private int mMaxNavigationBarWidth;
private int mMinNavigationBarWidth;
private int mNavigationBarWidth;
private int mNavigationBarWidthPercent;
private boolean mOpen;
private View mPanel;
private Drawable mShadow;
private int mShadowWidth;
//===========================================================================
// Constructor
//===========================================================================
public SlidingPanelLayout(Context context) {
super(context);
setBackgroundColor(0);
setScrollEnabled(true);
setVertical(false);
}
public SlidingPanelLayout(Context context, AttributeSet attributeset) {
super(context, attributeset);
setBackgroundColor(0);
setScrollEnabled(true);
setVertical(false);
}
public SlidingPanelLayout(Context context, AttributeSet attributeset, int i) {
super(context, attributeset, i);
setBackgroundColor(0);
setScrollEnabled(true);
setVertical(false);
}
//===========================================================================
// Private function
//===========================================================================
private boolean isScrolling() {
int i = getScroll();
boolean flag;
if(i != 0 && i != -mNavigationBarWidth)
flag = true;
else
flag = false;
return flag;
}
//===========================================================================
// Protected function
//===========================================================================
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if(getScrollX() < 0) {
mShadow.setBounds(-mShadowWidth, 0, 0, getHeight());
mShadow.draw(canvas);
}
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
protected void onFinishInflate() {
super.onFinishInflate();
if(getChildCount() != 1) {
throw new IllegalStateException((new StringBuilder()).append(getClass().getName()).append(" should have exactly one child").toString());
} else {
mPanel = getChildAt(0);
Resources resources = getResources();
mShadowWidth = resources.getDimensionPixelSize(R.dimen.host_shadow_width);
mMinNavigationBarWidth = resources.getDimensionPixelSize(R.dimen.host_min_navigation_bar_width);
mMaxNavigationBarWidth = resources.getDimensionPixelSize(R.dimen.host_max_navigation_bar_width);
mNavigationBarWidthPercent = resources.getInteger(R.integer.host_navigation_bar_width_percent);
mShadow = resources.getDrawable(R.drawable.navigation_shadow);
return;
}
}
protected void onLayout(boolean flag, int i, int j, int k, int l) {
mPanel.layout(0, 0, k - i, l - j);
if(!isScrolling())
if(!mOpen)
scrollTo(0, 0);
else
scrollTo(-mNavigationBarWidth, 0);
}
protected void onMeasure(int i, int j) {
int k = android.view.View.MeasureSpec.getSize(i);
int l = android.view.View.MeasureSpec.getSize(j);
super.onMeasure(i, j);
mPanel.measure(android.view.View.MeasureSpec.makeMeasureSpec(k, 0x40000000), android.view.View.MeasureSpec.makeMeasureSpec(l, 0x40000000));
mNavigationBarWidth = Math.min(Math.max((k * mNavigationBarWidthPercent) / 100, mMinNavigationBarWidth), mMaxNavigationBarWidth);
setScrollLimits(-mNavigationBarWidth, 0);
}
protected void onScrollChanged(int i, int j, int k, int l) {
super.onScrollChanged(i, j, k, l);
if(i == 0) {
mOpen = false;
if(mListener != null)
mListener.onPanelClosed();
return;
} else {
if(i == -mNavigationBarWidth && mListener != null) {
// TODO
}
}
}
protected final void onScrollFinished(int i) {
if (i < 0) {
smoothScrollTo(-mNavigationBarWidth);
} else {
mOpen = false;
smoothScrollTo(0);
}
}
//===========================================================================
// Public function
//===========================================================================
public final void close() {
if(mOpen) {
setScrollEnabled(false);
smoothScrollTo(0);
}
}
public final int getNavigationBarWidth() {
return mNavigationBarWidth;
}
public final boolean isOpen() {
return mOpen;
}
public boolean onInterceptTouchEvent(MotionEvent motionevent)
{
if(!mOpen) {
return false;
} else {
double i = motionevent.getX() - (float)mNavigationBarWidth;
if(i >= 0) {
super.onInterceptTouchEvent(motionevent);
return true;
}
return false;
}
}
public void onRestoreInstanceState(Parcelable parcelable) {
SavedState savedstate = (SavedState)parcelable;
super.onRestoreInstanceState(savedstate.getSuperState());
mOpen = savedstate.open;
setScrollEnabled(mOpen);
}
public Parcelable onSaveInstanceState() {
SavedState savedstate = new SavedState(super.onSaveInstanceState());
savedstate.open = mOpen;
return savedstate;
}
public boolean onTouchEvent(MotionEvent motionevent) {
if(!mOpen) {
return false;
} else {
if(motionevent.getX() < (float)mNavigationBarWidth) {
boolean flag2 = isScrolling();
if(!flag2)
return false;
}
return super.onTouchEvent(motionevent);
}
}
public final void open() {
if(!mOpen) {
mOpen = true;
setScrollEnabled(true);
smoothScrollTo(-mNavigationBarWidth);
}
}
public boolean performClick() {
super.performClick();
close();
return true;
}
public void setOnSlidingPanelStateChange(OnSlidingPanelStateChange onslidingpanelstatechange) {
mListener = onslidingpanelstatechange;
}
//===========================================================================
// Inner class
//===========================================================================
public static interface OnSlidingPanelStateChange {
void onPanelClosed();
}
static class SavedState extends View.BaseSavedState {
boolean open;
public String toString() {
String s = Integer.toHexString(System.identityHashCode(this));
return (new StringBuilder("HostLayout.SavedState{")).append(s).append(" open=").append(open).append("}").toString();
}
public void writeToParcel(Parcel parcel, int i) {
super.writeToParcel(parcel, i);
if(open)
parcel.writeInt(1);
else
parcel.writeInt(0);
}
public static final android.os.Parcelable.Creator CREATOR = new android.os.Parcelable.Creator() {
public final Object createFromParcel(Parcel parcel) {
return new SavedState(parcel, (byte)0);
}
public final Object[] newArray(int i) {
return new SavedState[i];
}
};
private SavedState(Parcel parcel) {
super(parcel);
boolean flag;
if(parcel.readInt() != 0)
open = true;
else
open = false;
}
SavedState(Parcel parcel, byte byte0) {
this(parcel);
}
SavedState(Parcelable parcelable) {
super(parcelable);
}
}
}