package cn.mutils.app.ui;
import android.content.Context;
import android.content.Intent;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import cn.mutils.app.event.listener.OnActivityResultListener;
import cn.mutils.app.event.listener.OnSelectedChangeListener;
import cn.mutils.app.ui.core.ICachedViewManager;
import cn.mutils.app.ui.core.IStateView;
import cn.mutils.app.ui.core.IStateViewManager;
import cn.mutils.app.ui.core.UICore;
import cn.mutils.core.event.Dispatcher;
@SuppressWarnings({"unused", "RedundantIfStatement"})
public class StateViewPager extends ViewPager implements IStateView, IStateViewManager, ICachedViewManager {
protected boolean mCreateDispatched;
protected List<View> mCachedViews = new ArrayList<View>();
/**
* -1 for default
*/
protected int mSelectedIndex = -1;
protected OnSelectedChangeListener mOnSelectedChangeListener;
protected IStateViewManager mManager;
protected Dispatcher mDispatcher = new Dispatcher();
public StateViewPager(Context context) {
super(context);
}
public StateViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setOnSelectedChangeListener(OnSelectedChangeListener listener) {
mOnSelectedChangeListener = listener;
}
@Override
public IStateView getSelectedView() {
if (mSelectedIndex >= 0 && mSelectedIndex < mCachedViews.size()) {
View v = mCachedViews.get(mSelectedIndex);
if (v instanceof IStateView) {
return (IStateView) v;
}
}
return null;
}
public int getSelectedIndex() {
return mSelectedIndex;
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
this.setCurrentItem(item);
}
@Override
public void setCurrentItem(int item) {
this.setSelectedIndex(item);
}
public void setSelectedIndex(int selectedIndex) {
if (!mCreateDispatched) {
this.onCreate();
}
if (selectedIndex < 0 || selectedIndex >= mCachedViews.size()) {
return;
}
if (mSelectedIndex == selectedIndex) {
return;
}
if (mSelectedIndex != -1) {
View view = mCachedViews.get(mSelectedIndex);
if (view instanceof IStateView) {
((IStateView) view).onPause();
((IStateView) view).onStop();
}
view = mCachedViews.get(selectedIndex);
if (view instanceof IStateView) {
((IStateView) view).onStart();
((IStateView) view).onResume();
}
if (mOnSelectedChangeListener != null) {
mOnSelectedChangeListener.onChanged(this, selectedIndex);
}
}
mSelectedIndex = selectedIndex;
super.setCurrentItem(mSelectedIndex);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
for (int i = 0, size = this.getChildCount(); i < size; i++) {
View v = this.getChildAt(i);
mCachedViews.add(v);
if (v instanceof IStateView) {
this.bind((IStateView) v);
}
}
}
@Override
public void onCreate() {
if (this.mCreateDispatched) {
return;
}
this.mCreateDispatched = true;
for (View v : mCachedViews) {
if (v instanceof IStateView) {
UICore.dispatchCreate((IStateView) v);
}
}
this.removeAllViews();
this.setAdapter(new OStateViewPagerAdapter());
}
@Override
public void onStart() {
UICore.dispatchStart(this);
}
@Override
public void onResume() {
UICore.dispatchResume(this);
}
@Override
public void onPause() {
UICore.dispatchPause(this);
}
@Override
public void onStop() {
UICore.dispatchStop(this);
}
@Override
public void onDestroy() {
for (View view : this.mCachedViews) {
if (view instanceof IStateView) {
((IStateView) view).onDestroy();
}
}
}
@Override
public boolean onInterceptBackPressed() {
if (UICore.interceptBackPressed(this)) {
return true;
}
return false;
}
@Override
public void startActivity(Intent intent) {
UICore.startActivity(this, intent);
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
UICore.startActivityForResult(this, intent, requestCode);
}
@Override
public void onActivityResult(Context context, int requestCode, int resultCode, Intent data) {
UICore.onActivityResult(this, requestCode, resultCode, data);
}
@Override
public IStateViewManager getManager() {
return mManager;
}
@Override
public void setManager(IStateViewManager manager) {
mManager = manager;
}
@Override
public void bind(IStateView stateView) {
stateView.setManager(this);
}
@Override
public void notify(Object message) {
if (mManager != null) {
mManager.notify(message);
}
}
@Override
public <T extends View> T findViewById(int id, Class<T> viewClass) {
return UICore.findViewById(this, id, viewClass);
}
@Override
public List<IStateView> getBindStateViews() {
return null;
}
@Override
public boolean redirectToSelectedView() {
return true;
}
@Override
public boolean isCreateDispatched() {
return mCreateDispatched;
}
@Override
public void setCreateDispatched(boolean dispatched) {
mCreateDispatched = dispatched;
}
@Override
public List<OnActivityResultListener> getOnActivityResultListeners() {
return mDispatcher.getListeners(OnActivityResultListener.EVENT_TYPE, OnActivityResultListener.class);
}
@Override
public void addOnActivityResultListener(OnActivityResultListener listener) {
mDispatcher.addListener(OnActivityResultListener.EVENT_TYPE, listener);
}
@Override
public void removeOnActivityResultListener(OnActivityResultListener listener) {
mDispatcher.removeListener(OnActivityResultListener.EVENT_TYPE, listener);
}
@Override
public List<View> getCachedViews() {
return mCachedViews;
}
class OStateViewPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return mCachedViews.size();
}
@Override
public boolean isViewFromObject(View v, Object o) {
return v.equals(o);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View v = mCachedViews.get(position);
if (indexOfChild(v) != -1) {
removeView(v);
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View v = mCachedViews.get(position);
if (indexOfChild(v) == -1) {
addView(v);
}
return v;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
setSelectedIndex(position);
}
}
}