package com.hannesdorfmann.mosby3.sample.mail.base.view; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.util.Pair; import android.view.View; import android.widget.Toast; import com.hannesdorfmann.mosby3.sample.mail.IntentStarter; import com.hannesdorfmann.mosby3.sample.mail.R; import com.hannesdorfmann.mosby3.sample.mail.base.presenter.BaseRxMailPresenter; import com.hannesdorfmann.mosby3.sample.mail.mails.MailsAdapter; import com.hannesdorfmann.mosby3.sample.mail.mails.MailsAdapterHolders; import com.hannesdorfmann.mosby3.sample.mail.model.contact.Person; import com.hannesdorfmann.mosby3.sample.mail.model.mail.Mail; import java.util.List; import javax.inject.Inject; /** * Base class for fragments that want to dipslay a list of Mails * * @author Hannes Dorfmann */ public abstract class BaseMailsFragment<V extends BaseMailView<List<Mail>>, P extends BaseRxMailPresenter<V, List<Mail>>> extends AuthRefreshRecyclerFragment<List<Mail>, V, P> implements BaseMailView<List<Mail>>, MailsAdapter.MailClickedListener, MailsAdapter.PersonClickListener, MailsAdapter.MailStarListner { @Inject IntentStarter intentStarter; @Override protected int getLayoutRes() { return R.layout.fragment_mails_base; } @Override protected ListAdapter<List<Mail>> createAdapter() { return new MailsAdapter(getActivity(), this, this, this); } @Override public void onMailClicked(MailsAdapterHolders.MailViewHolder vh, Mail mail) { ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), Pair.create((View) vh.senderPic, getString(R.string.shared_mail_sender_pic)), Pair.create((View) vh.subject, getString(R.string.shared_mail_subject)), Pair.create((View) vh.date, getString(R.string.shared_mail_date)), Pair.create((View) vh.star, getString(R.string.shared_mail_star)), Pair.create(getActivity().findViewById(R.id.toolbar), getString(R.string.shared_mail_toolbar))); intentStarter.showMailDetails(getActivity(), mail, options.toBundle()); } @Override public void onPersonClicked(Person person) { intentStarter.showProfile(getActivity(), person); } @Override public void onMailStarClicked(Mail mail) { presenter.starMail(mail, !mail.isStarred()); } @Override public void markMailAsStared(int mailId) { // Search for the mail Mail mail = ((MailsAdapter) adapter).findMail(mailId); if (mail != null) { mail.setStarred(true); adapter.notifyDataSetChanged(); } } @Override public void markMailAsUnstared(int mailId) { // Search for the mail Mail mail = ((MailsAdapter) adapter).findMail(mailId); if (mail != null) { mail.setStarred(false); adapter.notifyDataSetChanged(); } } private void showStarErrorToast(int messageRes, Mail mail) { Toast.makeText(getActivity(), String.format(getString(messageRes), mail.getSender().getName()), Toast.LENGTH_SHORT).show(); } @Override public void showStaringFailed(Mail mail) { showStarErrorToast(R.string.error_staring_mail, mail); } @Override public void showUnstaringFailed(Mail mail) { showStarErrorToast(R.string.error_unstaring_mail, mail); } @Override public void markMailAsRead(Mail mail, boolean read) { MailsAdapter.MailInAdapterResult result = ((MailsAdapter) adapter).findMail(mail); if (result.isFound()) { result.getAdapterMail().read(read); adapter.notifyDataSetChanged(); } } }