package com.fastaccess.ui.widgets; import android.content.Context; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.StringRes; import android.support.v4.widget.NestedScrollView; import android.util.AttributeSet; import com.fastaccess.R; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import icepick.Icepick; import icepick.State; /** * Created by Kosh on 20 Nov 2016, 12:21 AM */ public class StateLayout extends NestedScrollView { private static final int SHOW_PROGRESS_STATE = 1; private static final int HIDE_PROGRESS_STATE = 2; private static final int HIDE_RELOAD_STATE = 3; private static final int SHOW_RELOAD_STATE = 4; private static final int SHOW_EMPTY_STATE = 7; private static final int HIDDEN = 5; private static final int SHOWN = 6; private OnClickListener onReloadListener; @BindView(R.id.empty_text) FontTextView emptyText; @BindView(R.id.reload) FontButton reload; @State int layoutState = HIDDEN; @State String emptyTextValue; @State boolean showReload = true; @OnClick(R.id.reload) void onReload() { if (onReloadListener != null) { onReloadListener.onClick(reload); } } public StateLayout(Context context) { super(context); } public StateLayout(Context context, AttributeSet attrs) { super(context, attrs); } public StateLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void showProgress() { layoutState = SHOW_PROGRESS_STATE; setVisibility(VISIBLE); emptyText.setVisibility(GONE); reload.setVisibility(GONE); } public void hideProgress() { layoutState = HIDE_PROGRESS_STATE; emptyText.setVisibility(VISIBLE); reload.setVisibility(VISIBLE); setVisibility(GONE); } public void hideReload() { layoutState = HIDE_RELOAD_STATE; reload.setVisibility(GONE); emptyText.setVisibility(GONE); setVisibility(GONE); } public void showReload(int adapterCount) { showReload = adapterCount == 0; showReload(); } protected void showReload() { hideProgress(); if (showReload) { layoutState = SHOW_RELOAD_STATE; reload.setVisibility(VISIBLE); emptyText.setVisibility(VISIBLE); setVisibility(VISIBLE); } } public void setEmptyText(@StringRes int resId) { setEmptyText(getResources().getString(resId)); } public void setEmptyText(@NonNull String text) { this.emptyTextValue = text; emptyText.setText(text); } public void showEmptyState() { hideProgress(); hideReload(); setVisibility(VISIBLE); emptyText.setVisibility(VISIBLE); layoutState = SHOW_EMPTY_STATE;// last so it override visibility state. } public void setOnReloadListener(OnClickListener onReloadListener) { this.onReloadListener = onReloadListener; } @Override public void setVisibility(int visibility) { super.setVisibility(visibility); if (visibility == GONE || visibility == INVISIBLE) { layoutState = HIDDEN; } else { layoutState = SHOWN; } } @Override protected void onFinishInflate() { super.onFinishInflate(); inflate(getContext(), R.layout.empty_layout, this); if (isInEditMode()) return; ButterKnife.bind(this); emptyText.setFreezesText(true); } @Override protected void onDetachedFromWindow() { onReloadListener = null; super.onDetachedFromWindow(); } @Override public Parcelable onSaveInstanceState() { return Icepick.saveInstanceState(this, super.onSaveInstanceState()); } @Override public void onRestoreInstanceState(Parcelable state) { super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state)); onHandleLayoutState(); } private void onHandleLayoutState() { setEmptyText(emptyTextValue); switch (layoutState) { case SHOW_PROGRESS_STATE: showProgress(); break; case HIDE_PROGRESS_STATE: hideProgress(); break; case HIDE_RELOAD_STATE: hideReload(); break; case SHOW_RELOAD_STATE: showReload(); break; case HIDDEN: setVisibility(GONE); break; case SHOW_EMPTY_STATE: showEmptyState(); break; case SHOWN: setVisibility(VISIBLE); showReload(); break; } } }