package support.ui.content;
import android.content.Context;
import android.support.annotation.DrawableRes;
import android.support.annotation.IdRes;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.util.SparseArrayCompat;
import android.view.View;
import android.view.ViewGroup;
import com.anthony.rxlibrary.R;
import java.lang.reflect.Constructor;
import support.ui.utilities.LayoutHelper;
public final class ContentPresenter {
private static final int ID_NONE = -1;
private static final int LoadViewId = R.id.support_ui_load_view;
private static final int EmptyViewId = R.id.support_ui_empty_view;
private static final int ErrorViewId = R.id.support_ui_error_view;
private static final int ContentViewId = R.id.support_ui_content_view;
private SparseArrayCompat<Class<View>> mViewClassArray = new SparseArrayCompat<>(4);
private SparseArrayCompat<View> mViewArray = new SparseArrayCompat<>(4);
int mCurrentId = ID_NONE;
ViewGroup mContainer;
View mContentView;
Context mContext;
private EmptyView.OnEmptyViewClickListener onEmptyViewClickListener;
private ErrorView.OnErrorViewClickListener onErrorViewClickListener;
public ContentPresenter(Class<View> loadViewClass, Class<View> emptyViewClass, Class<View> errorViewClass) {
buildViewClassArray(loadViewClass, emptyViewClass, errorViewClass);
}
public ContentPresenter onCreate(Context context) {
mContext = context;
return this;
}
public ContentPresenter attachContainer(ViewGroup container) {
mContainer = container;
return this;
}
public ContentPresenter attachContentView(View contentView) {
mContentView = contentView;
return this;
}
public void setOnEmptyViewClickListener(EmptyView.OnEmptyViewClickListener listener) {
this.onEmptyViewClickListener = listener;
}
public void setOnErrorViewClickListener(
ErrorView.OnErrorViewClickListener onErrorViewClickListener) {
this.onErrorViewClickListener = onErrorViewClickListener;
}
public void onDestroyView() {
mCurrentId = ID_NONE;
mContentView = null;
mViewArray.clear();
}
public void onDestroy() {
onEmptyViewClickListener = null;
onErrorViewClickListener = null;
mContext = null;
mContainer = null;
mViewClassArray = null;
mViewArray = null;
}
/**
* 显示进度条
*/
public ContentPresenter displayLoadView() {
final int loadViewId = LoadViewId;
if (mCurrentId != loadViewId) {
displayView(loadViewId);
}
return this;
}
/**
* 显示空白页
*/
public ContentPresenter displayEmptyView() {
final int emptyViewId = EmptyViewId;
if (mCurrentId != emptyViewId) {
View view = displayView(emptyViewId);
if (view instanceof EmptyView) {
EmptyView emptyView = (EmptyView) view;
emptyView.setOnEmptyViewClickListener(onEmptyViewClickListener);
}
}
return this;
}
/**
* 显示错误页面
*/
public ContentPresenter displayErrorView() {
final int errorViewId = ErrorViewId;
if (mCurrentId != errorViewId) {
View view = displayView(errorViewId);
if (view instanceof ErrorView) {
ErrorView errorView = (ErrorView) view;
errorView.setOnErrorViewClickListener(onErrorViewClickListener);
}
}
return this;
}
/**
* 显示内容
*/
public ContentPresenter displayContentView() {
final int contentViewId = ContentViewId;
if (mCurrentId != contentViewId && mContentView != null) {
final ViewGroup container = mContainer;
container.removeAllViews();
final ViewGroup.LayoutParams layoutParams = LayoutHelper.createViewGroupLayoutParams();
container.addView(mContentView, layoutParams);
mCurrentId = contentViewId;
}
return this;
}
// empty start
public ContentPresenter buildEmptyImageView(@DrawableRes int drawableRes) {
View view = checkView(EmptyViewId);
if (view instanceof EmptyView) {
EmptyView emptyView = (EmptyView) view;
emptyView.buildEmptyImageView(drawableRes);
}
return this;
}
public ContentPresenter buildEmptyTitle(@StringRes int stringRes) {
return buildEmptyTitle(mContext.getResources().getString(stringRes));
}
public ContentPresenter buildEmptyTitle(String title) {
View view = checkView(EmptyViewId);
if (view instanceof EmptyView) {
EmptyView emptyView = (EmptyView) view;
emptyView.buildEmptyTitle(title);
}
return this;
}
public ContentPresenter buildEmptySubtitle(@StringRes int stringRes) {
return buildEmptySubtitle(mContext.getResources().getString(stringRes));
}
public ContentPresenter buildEmptySubtitle(String subtitle) {
View view = checkView(EmptyViewId);
if (view instanceof EmptyView) {
EmptyView emptyView = (EmptyView) view;
emptyView.buildEmptySubtitle(subtitle);
}
return this;
}
public ContentPresenter shouldDisplayEmptySubtitle(boolean display) {
View view = checkView(EmptyViewId);
if (view instanceof EmptyView) {
EmptyView emptyView = (EmptyView) view;
emptyView.shouldDisplayEmptySubtitle(display);
}
return this;
}
public ContentPresenter shouldDisplayEmptyTitle(boolean display) {
View view = checkView(EmptyViewId);
if (view instanceof EmptyView) {
EmptyView emptyView = (EmptyView) view;
emptyView.shouldDisplayEmptyTitle(display);
}
return this;
}
public ContentPresenter shouldDisplayEmptyImageView(boolean display) {
View view = checkView(EmptyViewId);
if (view instanceof EmptyView) {
EmptyView emptyView = (EmptyView) view;
emptyView.shouldDisplayEmptyImageView(display);
}
return this;
}
// error start
public ContentPresenter buildErrorImageView(@DrawableRes int drawableRes) {
View view = checkView(ErrorViewId);
if (view instanceof ErrorView) {
ErrorView errorView = (ErrorView) view;
errorView.buildErrorImageView(drawableRes);
}
return this;
}
public ContentPresenter buildErrorTitle(@StringRes int stringRes) {
return buildErrorTitle(mContext.getResources().getString(stringRes));
}
public ContentPresenter buildErrorTitle(String title) {
View view = checkView(ErrorViewId);
if (view instanceof ErrorView) {
ErrorView errorView = (ErrorView) view;
errorView.buildErrorTitle(title);
}
return this;
}
public ContentPresenter buildErrorSubtitle(@StringRes int stringRes) {
return buildErrorSubtitle(mContext.getResources().getString(stringRes));
}
public ContentPresenter buildErrorSubtitle(String subtitle) {
View view = checkView(ErrorViewId);
if (view instanceof ErrorView) {
ErrorView errorView = (ErrorView) view;
errorView.buildErrorSubtitle(subtitle);
}
return this;
}
public ContentPresenter shouldDisplayErrorSubtitle(boolean display) {
View view = checkView(ErrorViewId);
if (view instanceof ErrorView) {
ErrorView errorView = (ErrorView) view;
errorView.shouldDisplayErrorSubtitle(display);
}
return this;
}
public ContentPresenter shouldDisplayErrorTitle(boolean display) {
View view = checkView(ErrorViewId);
if (view instanceof ErrorView) {
ErrorView errorView = (ErrorView) view;
errorView.shouldDisplayErrorTitle(display);
}
return this;
}
public ContentPresenter shouldDisplayErrorImageView(boolean display) {
View view = checkView(ErrorViewId);
if (view instanceof ErrorView) {
ErrorView errorView = (ErrorView) view;
errorView.shouldDisplayErrorImageView(display);
}
return this;
}
private View displayView(@IdRes int viewId) {
final ViewGroup container = mContainer;
container.removeAllViews();
final View view = checkView(viewId);
final ViewGroup.LayoutParams layoutParams = LayoutHelper.createViewGroupLayoutParams();
container.removeView(view);
container.addView(view, layoutParams);
mCurrentId = viewId;
return view;
}
@Nullable
private View checkView(int viewId) {
final SparseArrayCompat<View> viewArray = mViewArray;
View view = viewArray.get(viewId);
if (view == null) {
view = buildView(viewId);
viewArray.put(viewId, view);
}
return view;
}
private ContentPresenter buildViewClassArray(Class<View> loadViewClass,
Class<View> emptyViewClass, Class<View> errorViewClass) {
final SparseArrayCompat<Class<View>> viewClassArray = mViewClassArray;
viewClassArray.put(LoadViewId, loadViewClass);
viewClassArray.put(EmptyViewId, emptyViewClass);
viewClassArray.put(ErrorViewId, errorViewClass);
return this;
}
@Nullable
private View buildView(int viewId) {
final SparseArrayCompat<Class<View>> viewClassArray = mViewClassArray;
final Class<View> viewClass = viewClassArray.get(viewId);
try {
Constructor<? extends View> constructor = viewClass.getDeclaredConstructor(Context.class);
final Context context = mContext;
return constructor.newInstance(context);
} catch (Throwable e) {
throw new RuntimeException(
"Unable to create View for" + viewClass + ". " + e.getLocalizedMessage(), e);
}
}
}