package com.ch_linghu.fanfoudroid.ui.module;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ViewSwitcher.ViewFactory;
import com.ch_linghu.fanfoudroid.R;
/**
* ActivityFlipper, 和 {@link ViewFactory} 类似, 只是设计用于切换activity.
*
* 切换的前后顺序取决与注册时的先后顺序
*
* USAGE: <code>
* ActivityFlipper mFlipper = new ActivityFlipper(this);
* mFlipper.addActivity(TwitterActivity.class);
* mFlipper.addActivity(MentionActivity.class);
* mFlipper.addActivity(DmActivity.class);
*
* // switch activity
* mFlipper.setCurrentActivity(TwitterActivity.class);
* mFlipper.showNext();
* mFlipper.showPrevious();
*
* // or without set current activity
* mFlipper.showNextOf(TwitterActivity.class);
* mFlipper.showPreviousOf(TwitterActivity.class);
*
* // or auto mode, use the context as current activity
* mFlipper.autoShowNext();
* mFlipper.autoShowPrevious();
*
* // set toast
* mFlipper.setToastResource(new int[] {
* R.drawable.point_left,
* R.drawable.point_center,
* R.drawable.point_right
* });
*
* // set Animation
* mFlipper.setInAnimation(R.anim.push_left_in);
* mFlipper.setOutAnimation(R.anim.push_left_out);
* mFlipper.setPreviousInAnimation(R.anim.push_right_in);
* mFlipper.setPreviousOutAnimation(R.anim.push_right_out);
* </code>
*
*/
public class ActivityFlipper implements IFlipper {
private static final String TAG = "ActivityFlipper";
private static final int SHOW_NEXT = 0;
private static final int SHOW_PROVIOUS = 1;
private int mDirection = SHOW_NEXT;
private boolean mToastEnabled = false;
private int[] mToastResourcesMap = new int[] {};
private boolean mAnimationEnabled = false;
private int mNextInAnimation = -1;
private int mNextOutAnimation = -1;
private int mPreviousInAnimation = -1;
private int mPreviousOutAnimation = -1;
private Activity mActivity;
private List<Class<?>> mActivities = new ArrayList<Class<?>>();;
private int mWhichActivity = 0;
public ActivityFlipper() {
}
public ActivityFlipper(Activity activity) {
mActivity = activity;
}
/**
* Launch Activity
*
* @param cls
* class of activity
*/
public void launchActivity(Class<?> cls) {
Log.v(TAG, "launch activity :" + cls.getName());
Intent intent = new Intent();
intent.setClass(mActivity, cls);
mActivity.startActivity(intent);
}
public void setToastResource(int[] resourceIds) {
mToastEnabled = true;
mToastResourcesMap = resourceIds;
}
private void maybeShowToast(int whichActicity) {
if (mToastEnabled && whichActicity < mToastResourcesMap.length) {
final Toast myToast = new Toast(mActivity);
final ImageView myView = new ImageView(mActivity);
myView.setImageResource(mToastResourcesMap[whichActicity]);
myToast.setView(myView);
myToast.setDuration(Toast.LENGTH_SHORT);
myToast.setGravity(Gravity.BOTTOM | Gravity.CENTER, 0, 0);
myToast.show();
}
}
private void maybeShowAnimation(int whichActivity) {
if (mAnimationEnabled) {
boolean showPrevious = (mDirection == SHOW_PROVIOUS);
if (showPrevious && mPreviousInAnimation != -1
&& mPreviousOutAnimation != -1) {
mActivity.overridePendingTransition(mPreviousInAnimation,
mPreviousOutAnimation);
return; // use Previous Animation
}
if (mNextInAnimation != -1 && mNextOutAnimation != -1) {
mActivity.overridePendingTransition(mNextInAnimation,
mNextOutAnimation);
}
}
}
/**
* Launch Activity by index
*
* @param whichActivity
* the index of Activity
*/
private void launchActivity(int whichActivity) {
launchActivity(mActivities.get(whichActivity));
maybeShowToast(whichActivity);
maybeShowAnimation(whichActivity);
}
/**
* Add Activity NOTE: 添加的顺序很重要
*
* @param cls
* class of activity
*/
public void addActivity(Class<?> cls) {
mActivities.add(cls);
}
/**
* Get index of the Activity
*
* @param cls
* class of activity
* @return
*/
private int getIndexOf(Class<?> cls) {
int index = mActivities.indexOf(cls);
if (-1 == index) {
Log.e(TAG, "No such activity: " + cls.getName());
}
return index;
}
@SuppressWarnings("unused")
private Class<?> getActivityAt(int index) {
if (index > 0 && index < mActivities.size()) {
return mActivities.get(index);
}
return null;
}
/**
* Show next activity(already setCurrentActivity)
*/
@Override
public void showNext() {
mDirection = SHOW_NEXT;
setDisplayedActivity(mWhichActivity + 1, true);
}
/**
* Show next activity of
*
* @param cls
* class of activity
*/
public void showNextOf(Class<?> cls) {
setCurrentActivity(cls);
showNext();
}
/**
* Show next activity(use current context as a activity)
*/
public void autoShowNext() {
showNextOf(mActivity.getClass());
}
/**
* Show previous activity(already setCurrentActivity)
*/
@Override
public void showPrevious() {
mDirection = SHOW_PROVIOUS;
setDisplayedActivity(mWhichActivity - 1, true);
}
/**
* Show previous activity of
*
* @param cls
* class of activity
*/
public void showPreviousOf(Class<?> cls) {
setCurrentActivity(cls);
showPrevious();
}
/**
* Show previous activity(use current context as a activity)
*/
public void autoShowPrevious() {
showPreviousOf(mActivity.getClass());
}
/**
* Sets which child view will be displayed
*
* @param whichActivity
* the index of the child view to display
* @param display
* display immediately
*/
public void setDisplayedActivity(int whichActivity, boolean display) {
mWhichActivity = whichActivity;
if (whichActivity >= getCount()) {
mWhichActivity = 0;
} else if (whichActivity < 0) {
mWhichActivity = getCount() - 1;
}
if (display) {
launchActivity(mWhichActivity);
}
}
/**
* Set current Activity
*
* @param cls
* class of activity
*/
public void setCurrentActivity(Class<?> cls) {
setDisplayedActivity(getIndexOf(cls), false);
}
public void setInAnimation(int resourceId) {
setEnableAnimation(true);
mNextInAnimation = resourceId;
}
public void setOutAnimation(int resourceId) {
setEnableAnimation(true);
mNextOutAnimation = resourceId;
}
public void setPreviousInAnimation(int resourceId) {
mPreviousInAnimation = resourceId;
}
public void setPreviousOutAnimation(int resourceId) {
mPreviousOutAnimation = resourceId;
}
public void setEnableAnimation(boolean enable) {
mAnimationEnabled = enable;
}
/**
* Count activities
*
* @return the number of activities
*/
public int getCount() {
return mActivities.size();
}
}