package com.hannesdorfmann.mosby3.sample.mvp.lce.layout;
import android.annotation.TargetApi;
import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.hannesdorfmann.mosby3.mvp.viewstate.ViewState;
import com.hannesdorfmann.mosby3.mvp.viewstate.layout.MvpViewStateFrameLayout;
import com.hannesdorfmann.mosby3.mvp.viewstate.lce.data.CastedArrayListLceViewState;
import com.hannesdorfmann.mosby3.sample.R;
import com.hannesdorfmann.mosby3.sample.SampleApplication;
import com.hannesdorfmann.mosby3.sample.mvp.CountriesAdapter;
import com.hannesdorfmann.mosby3.sample.mvp.CountriesErrorMessage;
import com.hannesdorfmann.mosby3.sample.mvp.CountriesPresenter;
import com.hannesdorfmann.mosby3.sample.mvp.CountriesView;
import com.hannesdorfmann.mosby3.sample.mvp.lce.SimpleCountriesPresenter;
import com.hannesdorfmann.mosby3.sample.mvp.model.Country;
import java.util.List;
import butterknife.OnClick;
/**
* @author Hannes Dorfmann
*/
public class CountriesLayout extends MvpViewStateFrameLayout<CountriesView, CountriesPresenter, CastedArrayListLceViewState<List<Country>, CountriesView>>
implements CountriesView, SwipeRefreshLayout.OnRefreshListener {
@BindView(R.id.loadingView) View loadingView;
@BindView(R.id.errorView) TextView errorView;
@BindView(R.id.contentView) SwipeRefreshLayout contentView;
@BindView(R.id.recyclerView) RecyclerView recyclerView;
private CountriesAdapter adapter;
public CountriesLayout(Context context) {
super(context);
}
public CountriesLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CountriesLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(21)
public CountriesLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override protected void onFinishInflate() {
super.onFinishInflate();
ButterKnife.bind(this, this);
contentView.setOnRefreshListener(this);
adapter = new CountriesAdapter(getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(adapter);
}
@Override public CountriesPresenter createPresenter() {
return new SimpleCountriesPresenter();
}
@Override public CastedArrayListLceViewState<List<Country>, CountriesView> createViewState() {
return new CastedArrayListLceViewState<List<Country>, CountriesView>();
}
@Override public void onNewViewStateInstance() {
loadData(false);
}
@Override public void showLoading(boolean pullToRefresh) {
errorView.setVisibility(View.GONE);
if (pullToRefresh) {
if (pullToRefresh && !contentView.isRefreshing()) {
// Workaround for measure bug: https://code.google.com/p/android/issues/detail?id=77712
contentView.post(new Runnable() {
@Override public void run() {
contentView.setRefreshing(true);
}
});
}
contentView.setVisibility(View.VISIBLE);
} else {
loadingView.setVisibility(View.VISIBLE);
contentView.setVisibility(View.GONE);
}
getViewState().setStateShowLoading(pullToRefresh);
}
@Override public void showContent() {
loadingView.setVisibility(View.GONE);
errorView.setVisibility(View.GONE);
contentView.setVisibility(View.VISIBLE);
contentView.setRefreshing(false);
getViewState().setStateShowContent(adapter.getCountries());
}
@Override public void showError(Throwable e, boolean pullToRefresh) {
getViewState().setStateShowError(e, pullToRefresh);
String msg = CountriesErrorMessage.get(e, pullToRefresh, getContext());
loadingView.setVisibility(View.GONE);
if (pullToRefresh) {
contentView.setRefreshing(false);
if (!isRestoringViewState()) {
Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
}
} else {
contentView.setVisibility(View.GONE);
errorView.setText(msg);
errorView.setVisibility(View.VISIBLE);
}
}
@Override public void setData(List<Country> data) {
adapter.setCountries(data);
adapter.notifyDataSetChanged();
}
@Override public void loadData(boolean pullToRefresh) {
presenter.loadCountries(pullToRefresh);
}
@Override public void onRefresh() {
loadData(true);
}
@OnClick(R.id.errorView) public void onErrorViewClicked() {
loadData(false);
}
@Override protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
SampleApplication.getRefWatcher(getContext()).watch(this);
}
}