package ru.ltst.u2020mvp.ui.gallery.view;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.support.v4.util.Pair;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import ru.ltst.u2020mvp.R;
import ru.ltst.u2020mvp.base.ComponentFinder;
import ru.ltst.u2020mvp.base.mvp.BaseView;
import ru.ltst.u2020mvp.data.api.model.response.Image;
import ru.ltst.u2020mvp.ui.gallery.GalleryActivity;
import ru.ltst.u2020mvp.ui.gallery.GalleryComponent;
import ru.ltst.u2020mvp.ui.misc.AndroidSubscriptions;
import ru.ltst.u2020mvp.ui.misc.BetterViewAnimator;
import ru.ltst.u2020mvp.ui.misc.GridInsetDecoration;
import ru.ltst.u2020mvp.util.DrawableUtils;
import rx.Observable;
import rx.Subscriber;
public class GalleryView extends LinearLayout implements BaseView {
public static final int COLUMNS_COUNT = 2;
@Bind(R.id.gallery_grid) RecyclerView galleryView;
@Bind(R.id.gallery_animator) BetterViewAnimator animator;
@Bind(R.id.gallery_toolbar) Toolbar toolbar;
@Bind(R.id.gallery_swipe_refresh) SwipeRefreshLayout swipeRefreshLayout;
@Bind(R.id.trending_loading_message) TextView loadingMessageView;
@Inject Picasso picasso;
@Inject GalleryActivity.Presenter presenter;
private final GalleryAdapter adapter;
private final List<Subscriber<? super Pair<Image, ImageView>>> clickSubscribers = new ArrayList<>();
private final Observable.OnSubscribe<Pair<Image, ImageView>> clickOnSubscribe = subscriber -> {
clickSubscribers.add(subscriber);
subscriber.add(AndroidSubscriptions.unsubscribeInUiThread(() -> clickSubscribers.remove(subscriber)));
};
public GalleryView(Context context, AttributeSet attrs) {
super(context, attrs);
GalleryComponent component = ComponentFinder.findActivityComponent(context);
component.inject(this);
adapter = new GalleryAdapter(getContext(), picasso);
adapter.setOnClickListener(new GalleryAdapter.OnClickListener() {
@Override
public void onImageClicked(Image image, GalleryItemView view) {
Pair<Image, ImageView> item = new Pair<Image, ImageView>(image, view.image);
for (Subscriber<? super Pair<Image, ImageView>> subscriber : clickSubscribers) {
subscriber.onNext(item);
}
}
});
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
ButterKnife.bind(this);
final StaggeredGridLayoutManager layout = new StaggeredGridLayoutManager(COLUMNS_COUNT, StaggeredGridLayoutManager.VERTICAL);
galleryView.setLayoutManager(layout);
galleryView.setItemAnimator(new DefaultItemAnimator());
galleryView.addItemDecoration(new GridInsetDecoration(getContext(), R.dimen.grid_inset));
galleryView.setAdapter(adapter);
swipeRefreshLayout.setOnRefreshListener(() -> presenter.refresh());
AnimationDrawable ellipsis =
(AnimationDrawable) DrawableUtils.getDrawable(getContext(), R.drawable.dancing_ellipsis);
loadingMessageView.setCompoundDrawablesWithIntrinsicBounds(null, null, ellipsis, null);
ellipsis.start();
}
public GalleryAdapter getAdapter() {
return adapter;
}
public Observable<Pair<Image, ImageView>> observeImageClicks() {
return Observable.create(clickOnSubscribe);
}
public void setRefreshed() {
if (swipeRefreshLayout.isRefreshing())
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void showLoading() {
animator.setDisplayedChildId(R.id.trending_loading);
}
@Override
public void showContent() {
animator.setDisplayedChildId(R.id.gallery_swipe_refresh);
}
@Override
public void showError(Throwable throwable) {
animator.setDisplayedChildId(R.id.trending_error);
}
@Override
public void showEmpty() {
animator.setDisplayedChildId(R.id.trending_empty);
}
public interface Injector {
void inject(GalleryView view);
}
}