package slidenerd.vivz.bucketdrops.adapters;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import io.realm.Realm;
import io.realm.RealmResults;
import slidenerd.vivz.bucketdrops.R;
import slidenerd.vivz.bucketdrops.beans.Drop;
import slidenerd.vivz.bucketdrops.extras.Util;
import slidenerd.vivz.bucketdrops.home.AppBucketDrops;
import static slidenerd.vivz.bucketdrops.extras.Constants.SORT_ASCENDING_DATE;
/**
* Created by vivz on 18/07/15.
*/
public class AdapterDrops extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements OnSwipeListener {
public static final int ITEM = 1;
public static final int NO_ITEM = 2;
public static final int FOOTER = 3;
private Context mContext;
private LayoutInflater mInflater;
private AddListener mAddListener;
private MarkListener mMarkListener;
private Realm mRealm;
private RealmResults<Drop> mResults;
private int mSort;
public AdapterDrops(Context context, Realm realm, RealmResults<Drop> results) {
mRealm = realm;
mContext = context;
mInflater = LayoutInflater.from(context);
updateResults(results);
}
public void updateResults(RealmResults<Drop> results) {
mResults = results;
mSort = AppBucketDrops.loadSortOption();
notifyDataSetChanged();
}
@Override
public long getItemId(int position) {
if (mResults == null) {
return RecyclerView.NO_ID;
} else {
return position < mResults.size() ? mResults.get(position).getAdded() : RecyclerView.NO_ID;
}
}
public void setMarkListener(MarkListener listener) {
mMarkListener = listener;
}
public void setAddListener(AddListener listener) {
mAddListener = listener;
}
/**
* Returns the total number of items in the data set hold by the adapter.
*
* @return The total number of items in this adapter.
*/
@Override
public int getItemCount() {
if (mResults == null) {
return 0;
} else if (mResults.isEmpty()) {
return mSort == SORT_ASCENDING_DATE ? 0 : 2;
} else {
return mResults.size() + 1;
}
}
@Override
public int getItemViewType(int position) {
if (mResults == null) {
return ITEM;
} else if (mResults.isEmpty()) {
if (mSort == SORT_ASCENDING_DATE) {
return ITEM;
} else {
if (position == 0) {
return NO_ITEM;
} else {
return FOOTER;
}
}
} else {
if (position < mResults.size()) {
return ITEM;
} else {
return FOOTER;
}
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == FOOTER) {
View root = mInflater.inflate(R.layout.footer, parent, false);
FooterHolder viewHolder = new FooterHolder(root);
return viewHolder;
} else if (viewType == NO_ITEM) {
View root = mInflater.inflate(R.layout.no_item, parent, false);
NoItemsHolder viewHolder = new NoItemsHolder(root);
return viewHolder;
} else {
View root = mInflater.inflate(R.layout.row_drop, parent, false);
DropHolder dropHolder = new DropHolder(root);
return dropHolder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
if (viewHolder instanceof DropHolder) {
DropHolder dropHolder = (DropHolder) viewHolder;
Drop drop = mResults.get(position);
dropHolder.setWhat(drop.getWhat());
dropHolder.setWhen(drop.getWhen());
dropHolder.setBackground(drop.isCompleted());
} else if (viewHolder instanceof FooterHolder) {
FooterHolder footerHolder = (FooterHolder) viewHolder;
footerHolder.mBtnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mAddListener != null) {
mAddListener.add();
}
}
});
}
}
public void markComplete(int position) {
if (position < mResults.size()) {
Drop drop = mResults.get(position);
mRealm.beginTransaction();
drop.setCompleted(true);
notifyDataSetChanged();
mRealm.commitTransaction();
}
}
/**
* @param position the position of the row_drop that was swiped within the RecyclerView
*/
@Override
public void onSwipe(int position) {
if (position < mResults.size()) {
mRealm.beginTransaction();
mResults.get(position).removeFromRealm();
mRealm.commitTransaction();
notifyDataSetChanged();
}
if (mResults.isEmpty() && mSort != SORT_ASCENDING_DATE) {
mSort = SORT_ASCENDING_DATE;
AppBucketDrops.storeSortOption(mSort);
notifyDataSetChanged();
}
}
public void add(Drop drop) {
mRealm.beginTransaction();
mRealm.copyToRealmOrUpdate(drop);
mRealm.commitTransaction();
notifyDataSetChanged();
}
/**
* An interface that notifies your class when any row_drop is clicked from your RecyclerView
*/
public interface MarkListener {
/**
* @param position is the position of the row_drop that was clicked by the user inside the RecylerView
*/
void onMark(int position);
}
public class NoItemsHolder extends RecyclerView.ViewHolder {
public NoItemsHolder(View itemView) {
super(itemView);
}
}
public class DropHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView mTextWhat;
private TextView mTextWhen;
private View mRoot;
public DropHolder(View itemView) {
super(itemView);
mRoot = itemView;
mTextWhat = (TextView) mRoot.findViewById(R.id.tv_what);
mTextWhen = (TextView) mRoot.findViewById(R.id.text_when);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (mMarkListener != null) {
//Notify interested classes about the row_drop that was clicked at the current position
mMarkListener.onMark(getAdapterPosition());
}
}
public void setWhat(String text) {
mTextWhat.setText(text);
}
public void setWhen(long when) {
mTextWhen.setText(Util.getFormattedDate(when));
}
@SuppressLint("NewApi")
public void setBackground(boolean isCompleted) {
//For items whose status is marked as complete, we would like to highlight them with a different background
Drawable background = null;
if (isCompleted) {
background = new ColorDrawable(Color.argb(237, 142, 121, 187));
} else {
background = mContext.getResources().getDrawable(R.drawable.bg_row_drop);
}
if (Util.isJellyBeanOrMore()) {
mRoot.setBackgroundDrawable(background);
} else {
mRoot.setBackground(background);
}
}
}
public class FooterHolder extends RecyclerView.ViewHolder {
private Button mBtnAdd;
public FooterHolder(View itemView) {
super(itemView);
mBtnAdd = (Button) itemView.findViewById(R.id.btn_footer);
mBtnAdd.setTypeface(Util.loadRalewayThin(mContext));
}
}
}