package com.hannesdorfmann.mosby3.sample.mail.label;
import android.animation.LayoutTransition;
import android.content.Context;
import android.os.Parcelable;
import android.support.v7.widget.ListPopupWindow;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.PopupWindow;
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.MvpViewStateLinearLayout;
import com.hannesdorfmann.mosby3.sample.mail.MailApplication;
import com.hannesdorfmann.mosby3.sample.mail.R;
import com.hannesdorfmann.mosby3.sample.mail.model.mail.Label;
import com.hannesdorfmann.mosby3.sample.mail.model.mail.Mail;
import com.hannesdorfmann.mosby3.sample.mail.utils.DimensUtils;
import java.util.List;
import icepick.Icepick;
import icepick.Icicle;
/**
* @author Hannes Dorfmann
*/
public class LabelLayout extends MvpViewStateLinearLayout<LabelView, LabelPresenter, LabelViewState>
implements LabelView {
@BindView(R.id.labelTextView) TextView labelView;
@BindView(R.id.labelLoadingView) View loadingView;
@Icicle Mail mail;
ListPopupWindow popUpWindow;
LabelAdapter adapter;
public LabelLayout(Context context) {
super(context);
init();
}
public LabelLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public LabelLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public LabelLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
@Override protected void onFinishInflate() {
super.onFinishInflate();
ButterKnife.bind(this, this);
}
private void init() {
View.inflate(getContext(), R.layout.view_label_layout, this);
LayoutTransition transition = new LayoutTransition();
transition.enableTransitionType(LayoutTransition.CHANGING);
this.setLayoutTransition(transition);
adapter = new LabelAdapter(getContext());
popUpWindow = new ListPopupWindow(getContext());
popUpWindow.setAnchorView(this);
popUpWindow.setAdapter(adapter);
popUpWindow.setWidth(DimensUtils.dpToPx(getContext(), 140));
popUpWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override public void onDismiss() {
showLabel();
}
});
popUpWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Label label = (Label) adapter.getItem(position);
if (!label.getName().equals(mail.getLabel())) {
presenter.setLabel(mail, label.getName());
popUpWindow.dismiss();
}
}
});
setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
loadData(false);
}
});
}
@Override protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
popUpWindow.setOnDismissListener(null);
if (popUpWindow.isShowing()) {
popUpWindow.dismiss();
}
}
public void setMail(Mail mail) {
this.mail = mail;
labelView.setText(mail.getLabel());
}
@Override public LabelPresenter createPresenter() {
return DaggerLabelLayoutComponent.builder()
.mailAppComponent(MailApplication.getMailComponents())
.build()
.presenter();
}
@Override public void showLoading(boolean pullToRefresh) {
loadingView.setVisibility(View.VISIBLE);
this.setClickable(false);
getViewState().setStateShowLoading(false);
}
@Override public void showContent() {
loadingView.setVisibility(View.GONE);
this.setClickable(true);
post(new Runnable() {
@Override public void run() { // Need for rotation changes
popUpWindow.show();
}
});
getViewState().setStateShowContent(adapter.getItems());
}
@Override public void showError(Throwable e, boolean pullToRefresh) {
if (!isRestoringViewState()) {
Toast.makeText(getContext(), R.string.error_loading_labels, Toast.LENGTH_SHORT).show();
}
showLabel();
}
@Override public void setData(List<Label> data) {
adapter.setItems(data);
adapter.notifyDataSetChanged();
}
@Override public void loadData(boolean pullToRefresh) {
presenter.loadLabels();
}
@Override public void showLabel() {
if (popUpWindow.isShowing()) {
popUpWindow.dismiss();
}
loadingView.setVisibility(View.GONE);
this.setClickable(true);
getViewState().setStateShowingLabel();
}
@Override public LabelViewState createViewState() {
return new LabelViewState();
}
@Override public void onNewViewStateInstance() {
showLabel();
}
@Override public Parcelable onSaveInstanceState() {
return Icepick.saveInstanceState(this, super.onSaveInstanceState());
}
@Override public void onRestoreInstanceState(Parcelable state) {
super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state));
}
@Override public void changeLabel(Mail m, String label) {
if (m.getId() == this.mail.getId()) {
mail.label(label);
labelView.setText(label);
}
}
@Override public void showChangeLabelFailed(Mail mail, Throwable t) {
Toast.makeText(getContext(), R.string.error_label_change_failed, Toast.LENGTH_SHORT).show();
}
}