package com.madeinhk.english_chinesedictionary;
import android.app.Activity;
import android.content.Context;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.madeinhk.model.ECDictionary;
import com.madeinhk.model.Word;
import com.mikepenz.lollipopshowcase.itemanimator.CustomItemAnimator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import de.greenrobot.event.EventBus;
public class FavouriteFragment extends Fragment {
private RecyclerView mRecyclerView;
private CardListAdapter mAdapter;
private View mEmptyView;
public FavouriteFragment() {
}
public static FavouriteFragment newInstance() {
FavouriteFragment fragment = new FavouriteFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_favourite, container, false);
mEmptyView = view.findViewById(R.id.empty_view);
mRecyclerView = (RecyclerView) view.findViewById(R.id.my_recycler_view);
// use a linear layout manager
mAdapter = new CardListAdapter(getActivity());
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.setItemAnimator(new CustomItemAnimator());
return view;
}
private class UpdateFavTask extends AsyncTask<Void, Void, List<Word>> {
@Override
protected List<Word> doInBackground(Void... params) {
ECDictionary ecDictionary = new ECDictionary(getActivity().getApplicationContext());
List<Word> favouriteWords = ecDictionary.getAllFavouriteWords();
favouriteWords = new AlgebraicOrderSorter().sort(favouriteWords);
return favouriteWords;
}
@Override
protected void onPostExecute(List<Word> wordList) {
showHideEmptyView(wordList.size() > 0);
mAdapter.setData(wordList);
mAdapter.notifyItemRangeInserted(0, wordList.size());
}
}
@Override
public void onStart() {
super.onStart();
}
private void showHideEmptyView(boolean hasData) {
if (hasData) {
mEmptyView.setVisibility(View.GONE);
} else {
mEmptyView.setVisibility(View.VISIBLE);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new UpdateFavTask().execute();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
}
public static class CardListAdapter extends RecyclerView.Adapter<CardListAdapter.ViewHolder> {
private List<SectionItem> mSections = new ArrayList<>();
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public RecyclerView mRecycleView;
public ViewHolder(View v) {
super(v);
mRecycleView = (RecyclerView) v.findViewById(R.id.words_list);
}
}
private Context mContext;
public CardListAdapter(Context context) {
mContext = context;
}
public void setData(List<Word> wordList) {
mSections.clear();
Character lastInitial = null;
List<Word> tmpList = new ArrayList<>();
for (Word word : wordList) {
Character initial = Character.toLowerCase(word.mWord.charAt(0));
if (!initial.equals(lastInitial)) {
if (tmpList.size() > 0) {
mSections.add(new SectionItem(lastInitial, tmpList));
}
tmpList = new ArrayList<>();
lastInitial = initial;
}
tmpList.add(word);
}
if (tmpList.size() > 0) {
mSections.add(new SectionItem(lastInitial, tmpList));
}
}
// Create new views (invoked by the layout manager)
@Override
public CardListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
CardView v = (CardView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.favourite_card_item, parent, false);
return new ViewHolder(v);
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// use a linear layout manager
LinearLayoutManager mLayoutManager = new LinearLayoutManager(mContext);
holder.mRecycleView.setLayoutManager(mLayoutManager);
holder.mRecycleView.setHasFixedSize(true);
holder.mRecycleView.setAdapter(new WordListAdapter(mSections.get(position)));
LinearLayoutManager mgr = new LinearLayoutManager(mContext);
holder.mRecycleView.setLayoutManager(mgr);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mSections.size();
}
static class SectionItem {
public SectionItem(Character initial, List<Word> words) {
this.mInitial = initial;
this.mWords = words;
}
public Character mInitial;
public List<Word> mWords;
}
public static class WordListAdapter extends RecyclerView.Adapter<WordListAdapter.ViewHolder> {
static final int TYPE_HEADER = 0;
static final int TYPE_DATA = 1;
private CardListAdapter.SectionItem mSection;
public WordListAdapter(CardListAdapter.SectionItem sectionItem) {
mSection = sectionItem;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
@Override
public WordListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
TextView textView;
if (viewType == TYPE_HEADER) {
textView = (TextView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.favourite_word_item_header, parent, false);
} else {
textView = (TextView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.favourite_word_item, parent, false);
}
return new ViewHolder(textView);
}
@Override
public int getItemViewType(int position) {
return (position == 0) ? TYPE_HEADER : TYPE_DATA;
}
@Override
public void onBindViewHolder(WordListAdapter.ViewHolder holder, int position) {
int itemType = getItemViewType(position);
if (itemType == TYPE_HEADER) {
TextView tv = holder.mTextView;
tv.setText(String.valueOf(Character.toUpperCase(mSection.mInitial)));
} else {
TextView tv = holder.mTextView;
final String word = mSection.mWords.get(position - 1).mWord;
tv.setText(word);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new DictionaryActivity.LookupWordEvent(word));
}
});
}
}
@Override
public int getItemCount() {
return mSection.mWords.size() + 1;
}
}
}
interface WordSorter {
public List<Word> sort(List<Word> words);
}
static class AlgebraicOrderSorter implements WordSorter {
@Override
public List<Word> sort(List<Word> words) {
Collections.sort(words, new Comparator<Word>() {
@Override
public int compare(Word lhs, Word rhs) {
return lhs.mWord.compareToIgnoreCase(rhs.mWord);
}
});
return words;
}
}
}