package com.hannesdorfmann.mosby3.sample.mail.mails;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityOptionsCompat;
import android.view.View;
import android.view.animation.OvershootInterpolator;
import com.hannesdorfmann.fragmentargs.annotation.Arg;
import com.hannesdorfmann.mosby3.sample.mail.IntentStarter;
import com.hannesdorfmann.mosby3.sample.mail.MailApplication;
import com.hannesdorfmann.mosby3.sample.mail.R;
import com.hannesdorfmann.mosby3.sample.mail.base.view.BaseMailsFragment;
import com.hannesdorfmann.mosby3.sample.mail.dagger.NavigationModule;
import com.hannesdorfmann.mosby3.sample.mail.model.mail.Label;
import com.hannesdorfmann.mosby3.sample.mail.model.mail.Mail;
import com.melnykov.fab.FloatingActionButton;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.OnClick;
/**
* @author Hannes Dorfmann
*/
public class MailsFragment extends BaseMailsFragment<MailsView, MailsPresenter>
implements MailsView, MailsAdapter.MailClickedListener, MailsAdapter.MailStarListner {
@Arg Label label;
@Inject IntentStarter intentStarter;
@BindView(R.id.createMail) FloatingActionButton createMailButton;
MailsComponent mailsComponent;
@Override protected int getLayoutRes() {
return R.layout.fragment_mails;
}
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
createMailButton.attachToRecyclerView(recyclerView);
}
@Override public MailsPresenter createPresenter() {
return mailsComponent.presenter();
}
@Override public void loadData(boolean b) {
presenter.load(b, label);
}
@Override protected void injectDependencies() {
mailsComponent = DaggerMailsComponent.builder()
.mailAppComponent(MailApplication.getMailComponents())
.navigationModule(new NavigationModule())
.build();
mailsComponent.inject(this);
}
@Override public void changeLabel(Mail mail, String labelName) {
MailsAdapter.MailInAdapterResult result = ((MailsAdapter) adapter).findMail(mail);
if (result.isFound() && !labelName.equals(this.label.getName())) {
// Found in adapter, but label has changed --> remove it
adapter.getItems().remove(result.getIndex());
adapter.notifyItemRemoved(result.getIndex());
if (adapter.getItemCount() == 0) {
emptyView.setVisibility(View.VISIBLE);
}
} else if (!result.isFound() && labelName.equals(this.label.getName())) {
// Not found, but should be added
adapter.getItems().add(result.getIndex(), mail);
adapter.notifyItemInserted(result.getIndex());
if (result.getIndex() == 0) {
recyclerView.scrollToPosition(0);
}
if (adapter.getItemCount() > 0) {
emptyView.setVisibility(View.GONE);
}
}
}
@Override public void showLoading(boolean pullToRefresh) {
super.showLoading(pullToRefresh);
if (!pullToRefresh) {
createMailButton.setVisibility(View.GONE);
}
}
@Override public void showError(Throwable e, boolean pullToRefresh) {
super.showError(e, pullToRefresh);
if (!pullToRefresh) {
createMailButton.setVisibility(View.GONE);
}
}
@OnClick(R.id.createMail) public void onCreateMailClicked() {
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), createMailButton,
getString(R.string.shared_write_action));
intentStarter.showWriteMail(getActivity(), null, options.toBundle());
}
@Override public void showContent() {
super.showContent();
if (createMailButton.getVisibility() != View.VISIBLE) {
createMailButton.setVisibility(View.VISIBLE);
if (!isRestoringViewState()) {
PropertyValuesHolder holderX = PropertyValuesHolder.ofFloat("scaleX", 0, 1);
PropertyValuesHolder holderY = PropertyValuesHolder.ofFloat("scaleY", 0, 1);
ObjectAnimator animator =
ObjectAnimator.ofPropertyValuesHolder(createMailButton, holderX, holderY);
animator.setInterpolator(new OvershootInterpolator());
animator.start();
}
}
}
}