package im.actor.sdk.view.emoji.stickers;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import java.util.ArrayList;
import java.util.List;
import im.actor.core.api.ApiStickerDescriptor;
import im.actor.core.entity.Sticker;
import im.actor.core.entity.StickerPack;
import im.actor.runtime.mvvm.Value;
import im.actor.runtime.mvvm.ValueChangedListener;
import im.actor.sdk.controllers.ActorBinder;
import im.actor.sdk.util.Screen;
import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard;
import static im.actor.sdk.util.ActorSDKMessenger.messenger;
public class StickersAdapter extends RecyclerView.Adapter<StickersAdapter.StickerViewHolder> {
private ArrayList<Sticker> stickers = new ArrayList<>();
private EmojiKeyboard keyboard;
private PacksAdapter packsAdapter;
private RecyclerView recyclerView;
private ActorBinder binder;
private boolean updatePackSelector = true;
int topPack = -1;
public StickersAdapter(EmojiKeyboard keyboard, RecyclerView recyclerView) {
this.keyboard = keyboard;
this.recyclerView = recyclerView;
binder = new ActorBinder();
binder.bind(messenger().getAvailableStickersVM().getOwnStickerPacks(), new ValueChangedListener<ArrayList<StickerPack>>() {
@Override
public void onChanged(ArrayList<StickerPack> val, Value<ArrayList<StickerPack>> valueModel) {
stickers.clear();
for (StickerPack pack : val) {
List<Sticker> stickers = pack.getStickers();
if (stickers.size() > 0) {
Sticker sticker = stickers.get(0);
StickersAdapter.this.stickers.add(new StickerCat(sticker.toApi(), sticker.getCollectionId(), sticker.getCollectionAccessHash()));
}
StickersAdapter.this.stickers.addAll(stickers);
}
notifyDataSetChanged();
}
});
final GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (getItemViewType(position) == 1) {
return layoutManager.getSpanCount();
} else {
return 1;
}
}
});
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
Sticker s;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int firstVisiblePosition = layoutManager.findFirstCompletelyVisibleItemPosition();
if (firstVisiblePosition == -1) {
return;
}
s = stickers.get(firstVisiblePosition);
Integer newTopPack = s.getCollectionId();
if (newTopPack != null && newTopPack != topPack) {
topPack = newTopPack;
if (packsAdapter != null && updatePackSelector) {
packsAdapter.selectPack(newTopPack);
} else {
updatePackSelector = true;
}
}
}
});
}
@Override
public int getItemViewType(int position) {
return stickers.get(position) instanceof StickerCat ? 1 : 0;
}
@Override
public StickerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0:
StickerView itemView = new StickerView(parent.getContext());
int stSize = Screen.dp(70);
itemView.setLayoutParams(new FrameLayout.LayoutParams(stSize, stSize));
return new StickerViewHolder(itemView);
default:
View cat = new View(parent.getContext());
cat.setLayoutParams(new FrameLayout.LayoutParams(1, 1));
return new StickerCatHolder(cat);
}
}
@Override
public void onBindViewHolder(StickerViewHolder holder, int position) {
holder.bind(stickers.get(position));
}
@Override
public int getItemCount() {
return stickers.size();
}
public class StickerViewHolder extends RecyclerView.ViewHolder {
Sticker s;
StickerView sv;
public StickerViewHolder(View itemView) {
super(itemView);
if (itemView instanceof StickerView) {
int padding = Screen.dp(5);
sv = (StickerView) itemView;
sv.setPadding(padding, padding, padding, padding);
sv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (s != null) {
// s.setThumb(sv.getThumb());
keyboard.onStickerClicked(s);
}
}
});
}
}
public void bind(Sticker s) {
this.s = s;
sv.bind(s.getImage256(), StickerView.STICKER_SMALL);
}
}
private class StickerCatHolder extends StickerViewHolder {
public StickerCatHolder(View itemView) {
super(itemView);
}
@Override
public void bind(Sticker s) {
}
}
private class StickerCat extends Sticker {
public StickerCat(ApiStickerDescriptor descriptor, Integer collectionId, Long collectionAccessHash) {
super(descriptor, collectionId, collectionAccessHash);
}
}
public void setPacksAdapter(PacksAdapter packsAdapter) {
this.packsAdapter = packsAdapter;
}
public void scrollToSticker(Sticker s) {
updatePackSelector = false;
int position = 0;
for (Sticker st : stickers) {
if (st.getId() == s.getId()) {
break;
}
position++;
}
((GridLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);
}
public ActorBinder getBinder() {
return binder;
}
public void release() {
if (binder != null) {
binder.unbindAll();
}
}
}