package cn.mutils.app.ui;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewParent;
import android.widget.RelativeLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import cn.mutils.app.data.IAsyncDataQueueOwner;
import cn.mutils.app.data.IAsyncDataTask;
import cn.mutils.app.event.listener.OnActivityResultListener;
import cn.mutils.app.net.INetQueueOwner;
import cn.mutils.app.net.INetTask;
import cn.mutils.app.os.IHandlerProvider;
import cn.mutils.app.task.DelayTask;
import cn.mutils.app.ui.core.IContentViewOwner;
import cn.mutils.app.ui.core.IRunOnceHolder;
import cn.mutils.app.ui.core.ISessionHolder;
import cn.mutils.app.ui.core.IStateView;
import cn.mutils.app.ui.core.IStateViewManager;
import cn.mutils.app.ui.core.IToastOwner;
import cn.mutils.app.ui.core.UICore;
import cn.mutils.core.err.CookieExpiredException;
import cn.mutils.core.event.Dispatcher;
import cn.mutils.core.task.IStoppable;
import cn.mutils.core.task.IStoppableManager;
@SuppressWarnings({"RedundantIfStatement", "unused"})
@SuppressLint("ShowToast")
public class StateView extends RelativeLayout implements IStateView, ISessionHolder, IRunOnceHolder, IHandlerProvider,
IStateViewManager, IStoppableManager, IToastOwner, IContentViewOwner {
protected IStateViewManager mManager;
protected List<IStateView> mBindViews;
protected List<IStoppable> mBindStoppables;
protected Dispatcher mDispatcher;
protected InfoToast mInfoToast;
protected Toast mToast;
protected boolean mCreateDispatched;
protected List<Runnable> mRunOnceOnResumeList;
protected Handler mHandler;
public StateView(Context context) {
super(context);
init(context, null);
}
public StateView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public StateView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
protected void init(Context context, AttributeSet attrs) {
}
@Override
public IStateViewManager getManager() {
return mManager;
}
@Override
public void setManager(IStateViewManager manager) {
this.mManager = manager;
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
bindStateViews();
}
protected void bindStateViews() {
UICore.bindStateViews(this, this);
}
@Override
public void bind(IStateView stateView) {
UICore.bind(this, stateView);
}
public void bind(IStoppable stoppable) {
UICore.bind(this, stoppable);
}
@Override
public boolean isSessionHolder() {
return false;
}
@Override
public void validateSession() {
}
@Override
public boolean hasSession() {
return false;
}
@Override
public boolean isSessionChanged() {
return false;
}
@Override
public void onSessionChanged() {
}
public void runOnceOnResume(Runnable r) {
if (mRunOnceOnResumeList == null) {
mRunOnceOnResumeList = new ArrayList<Runnable>();
}
mRunOnceOnResumeList.add(r);
}
@Override
public void onCreate() {
UICore.injectContentView(this);
}
@Override
public void onStart() {
UICore.dispatchStart(this);
}
@Override
public void onResume() {
UICore.dispatchResume(this);
// Validate session or user login state
if (this.isSessionHolder()) {
this.validateSession();
if (this.isSessionChanged()) {
getMainHandler().post(new OnSessionChangedRunnable());
}
}
if (mRunOnceOnResumeList != null) {
for (Runnable r : mRunOnceOnResumeList) {
r.run();
}
mRunOnceOnResumeList.clear();
}
}
@Override
public void onPause() {
UICore.dispatchPause(this);
}
@Override
public void onStop() {
UICore.dispatchStop(this);
}
@Override
public void onDestroy() {
if (mRunOnceOnResumeList != null) {
mRunOnceOnResumeList.clear();
}
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
}
UICore.dispatchDestroy(this);
}
@Override
public boolean onInterceptBackPressed() {
if (UICore.interceptBackPressed(this)) {
return true;
}
return false;
}
public boolean onInterceptGesture() {
return false;
}
public boolean onGestureTouch(View v, MotionEvent event) {
if (onInterceptGesture()) {
return false;
}
ViewParent parent = getParent();
if (parent != null) {
if (parent instanceof StateViewFlipper) {
return ((StateViewFlipper) parent).getGestureListener().onTouch(v, event);
}
}
return false;
}
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);
}
public Context getApplicationContext() {
return getContext().getApplicationContext();
}
public void start(DelayTask delayedTask) {
this.bind(delayedTask.start());
}
public void add(INetTask<?, ?> task) {
Context context = this.getContext();
if (context instanceof INetQueueOwner) {
this.bind(task);
((INetQueueOwner) context).getNetQueue().add(task);
}
}
public void add(IAsyncDataTask<?> task) {
Context context = this.getContext();
if (context instanceof IAsyncDataQueueOwner) {
this.bind(task);
((IAsyncDataQueueOwner) context).getAsyncDataQueue().add(task);
}
}
public void setContentView(int layoutRes) {
LayoutInflater.from(getContext()).inflate(layoutRes, this);
bindStateViews();
UICore.injectResources(this);
UICore.injectEvents(this);
}
public void setContentView(View view) {
this.addView(view);
bindStateViews();
UICore.injectResources(this);
UICore.injectEvents(this);
}
@Override
public void notify(Object message) {
if (message == null) {
return;
}
if (message instanceof CookieExpiredException) {
if (this.isSessionHolder()) {
this.validateSession();
}
}
if (mManager != null) {
mManager.notify(message);
}
}
@Override
public void stopAll() {
UICore.stopAll(this);
}
@Override
public void stopAll(boolean includeLockable) {
UICore.stopAll(this, includeLockable);
}
@Override
public <T extends View> T findViewById(int id, Class<T> viewClass) {
return UICore.findViewById(this, id, viewClass);
}
@Override
public List<IStateView> getBindStateViews() {
if (mBindViews == null) {
mBindViews = new ArrayList<IStateView>();
}
return mBindViews;
}
@Override
public List<IStoppable> getBindStoppables() {
if (mBindStoppables == null) {
mBindStoppables = new LinkedList<IStoppable>();
}
return mBindStoppables;
}
@Override
public boolean redirectToSelectedView() {
return false;
}
@Override
public IStateView getSelectedView() {
return null;
}
@Override
public boolean isCreateDispatched() {
return mCreateDispatched;
}
@Override
public void setCreateDispatched(boolean dispatched) {
mCreateDispatched = dispatched;
}
@Override
public Handler getMainHandler() {
if (mHandler == null) {
mHandler = new Handler(Looper.getMainLooper());
}
return mHandler;
}
public InfoToast getInfoToast() {
return mInfoToast;
}
public Toast getToast() {
Context context = this.getContext();
if (context instanceof IToastOwner) {
return ((IToastOwner) context).getToast();
}
if (mToast == null) {
mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
}
return mToast;
}
@Override
public void toast(CharSequence s) {
UICore.toast(this, s);
}
@Override
public void toast(int resId, Object... args) {
UICore.toast(this, resId, args);
}
@Override
public IToastOwner getToastOwner() {
return this;
}
@Override
public List<OnActivityResultListener> getOnActivityResultListeners() {
if (mDispatcher == null) {
mDispatcher = new Dispatcher();
}
return mDispatcher.getListeners(OnActivityResultListener.EVENT_TYPE, OnActivityResultListener.class);
}
@Override
public void addOnActivityResultListener(OnActivityResultListener listener) {
if (mDispatcher == null) {
mDispatcher = new Dispatcher();
}
mDispatcher.addListener(OnActivityResultListener.EVENT_TYPE, listener);
}
@Override
public void removeOnActivityResultListener(OnActivityResultListener listener) {
if (mDispatcher == null) {
return;
}
mDispatcher.removeListener(OnActivityResultListener.EVENT_TYPE, listener);
}
class OnSessionChangedRunnable implements Runnable {
@Override
public void run() {
onSessionChanged();
}
}
}