package yuku.alkitab.base.fr; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.os.Bundle; import android.support.v4.view.ViewCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import yuku.afw.V; import yuku.afw.storage.Preferences; import yuku.alkitab.base.S; import yuku.alkitab.base.U; import yuku.alkitab.base.fr.base.BaseGotoFragment; import yuku.alkitab.base.storage.Prefkey; import yuku.alkitab.base.util.BookNameSorter; import yuku.alkitab.debug.R; import yuku.alkitab.model.Book; public class GotoGridFragment extends BaseGotoFragment { public static final String TAG = GotoGridFragment.class.getSimpleName(); private static final String EXTRA_verse = "verse"; private static final String EXTRA_chapter = "chapter"; private static final String EXTRA_bookId = "bookId"; private static final int ANIM_DURATION = 200; View panelChapterVerse; TextView lSelectedBook; TextView lSelectedChapter; RecyclerView gridBook; RecyclerView gridChapter; RecyclerView gridVerse; Book[] books; BookAdapter bookAdapter; ChapterAdapter chapterAdapter; VerseAdapter verseAdapter; Book selectedBook; int selectedChapter; final View.OnClickListener lSelectedBook_click = v -> { selectedBook = null; selectedChapter = 0; transitionChapterToBook(); }; final View.OnClickListener lSelectedChapter_click = v -> { selectedChapter = 0; transitionVerseToChapter(); }; void transitionBookToChapter() { gridBook.setVisibility(View.INVISIBLE); panelChapterVerse.setVisibility(View.VISIBLE); gridChapter.setVisibility(View.VISIBLE); gridChapter.setAdapter(chapterAdapter = new ChapterAdapter(selectedBook)); gridVerse.setVisibility(View.INVISIBLE); animateFadeOutAndSlideLeft(gridBook, gridChapter); ViewCompat.jumpDrawablesToCurrentState(lSelectedBook); lSelectedBook.setAlpha(0.f); lSelectedBook.animate().alpha(1.f).setDuration(ANIM_DURATION); displaySelectedBookAndChapter(); } void transitionBookToVerse() { gridBook.setVisibility(View.INVISIBLE); panelChapterVerse.setVisibility(View.VISIBLE); gridVerse.setVisibility(View.VISIBLE); gridVerse.setAdapter(verseAdapter = new VerseAdapter(selectedBook, selectedChapter)); gridChapter.setVisibility(View.INVISIBLE); animateFadeOutAndSlideLeft(gridBook, gridVerse); ViewCompat.jumpDrawablesToCurrentState(lSelectedBook); lSelectedBook.setAlpha(0.f); lSelectedBook.animate().alpha(1.f).setDuration(ANIM_DURATION); displaySelectedBookAndChapter(); } void transitionChapterToBook() { gridBook.setVisibility(View.VISIBLE); panelChapterVerse.setVisibility(View.INVISIBLE); animateFadeOutAndSlideRight(gridChapter, gridBook); } void transitionChapterToVerse() { gridBook.setVisibility(View.INVISIBLE); panelChapterVerse.setVisibility(View.VISIBLE); gridChapter.setVisibility(View.INVISIBLE); gridVerse.setVisibility(View.VISIBLE); gridVerse.setAdapter(verseAdapter = new VerseAdapter(selectedBook, selectedChapter)); animateFadeOutAndSlideLeft(gridChapter, gridVerse); displaySelectedBookAndChapter(); } void transitionVerseToChapter() { gridBook.setVisibility(View.INVISIBLE); panelChapterVerse.setVisibility(View.VISIBLE); gridChapter.setVisibility(View.VISIBLE); gridChapter.setAdapter(chapterAdapter = new ChapterAdapter(selectedBook)); gridVerse.setVisibility(View.INVISIBLE); animateFadeOutAndSlideRight(gridVerse, gridChapter); displaySelectedBookAndChapter(); } static void animateFadeOutAndSlideLeft(final View fadingOut, final View slidingLeft) { fadingOut.setVisibility(View.VISIBLE); fadingOut.animate().alpha(0.f).setDuration(ANIM_DURATION).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { fadingOut.setAlpha(1.f); fadingOut.setVisibility(View.INVISIBLE); } }); slidingLeft.setX(slidingLeft.getWidth()); slidingLeft.animate().translationXBy(-slidingLeft.getWidth()).setDuration(ANIM_DURATION).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { slidingLeft.setVisibility(View.VISIBLE); } }); } static void animateFadeOutAndSlideRight(final View fadingOut, final View slidingRight) { fadingOut.setVisibility(View.VISIBLE); fadingOut.animate().alpha(0.f).setDuration(ANIM_DURATION).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { fadingOut.setAlpha(1.f); fadingOut.setVisibility(View.INVISIBLE); } }); slidingRight.setX(-slidingRight.getWidth()); slidingRight.animate().translationXBy(slidingRight.getWidth()).setDuration(ANIM_DURATION).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { slidingRight.setVisibility(View.VISIBLE); } }); } public static Bundle createArgs(int bookId, int chapter_1, int verse_1) { Bundle args = new Bundle(); args.putInt(EXTRA_bookId, bookId); args.putInt(EXTRA_chapter, chapter_1); args.putInt(EXTRA_verse, verse_1); return args; } protected void displaySelectedBookAndChapter() { lSelectedBook.setText(selectedBook.shortName); lSelectedBook.setTextColor(U.getForegroundColorOnDarkBackgroundByBookId(selectedBook.bookId)); if (selectedChapter == 0) { lSelectedChapter.setVisibility(View.GONE); } else { lSelectedChapter.setVisibility(View.VISIBLE); ViewCompat.jumpDrawablesToCurrentState(lSelectedChapter); lSelectedChapter.setText("" + selectedChapter); } } GridLayoutManager createLayoutManagerForNumbers() { return new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.goto_grid_numeric_num_columns)); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View res = inflater.inflate(R.layout.fragment_goto_grid, container, false); panelChapterVerse = V.get(res, R.id.panelChapterVerse); lSelectedBook = V.get(res, R.id.lSelectedBook); lSelectedChapter = V.get(res, R.id.lSelectedChapter); gridBook = V.get(res, R.id.gridBook); gridChapter = V.get(res, R.id.gridChapter); gridVerse = V.get(res, R.id.gridVerse); panelChapterVerse.setVisibility(View.INVISIBLE); gridBook.setVisibility(View.VISIBLE); gridChapter.setVisibility(View.INVISIBLE); gridVerse.setVisibility(View.INVISIBLE); gridBook.setLayoutManager(new GridLayoutManager(getActivity(), 6)); gridChapter.setLayoutManager(createLayoutManagerForNumbers()); gridVerse.setLayoutManager(createLayoutManagerForNumbers()); lSelectedBook.setOnClickListener(lSelectedBook_click); lSelectedChapter.setOnClickListener(lSelectedChapter_click); return res; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); books = S.activeVersion.getConsecutiveBooks(); gridBook.setAdapter(bookAdapter = new BookAdapter()); } public class VH extends RecyclerView.ViewHolder { public VH(final View itemView) { super(itemView); } } abstract class GridAdapter extends RecyclerView.Adapter<VH> { @Override public VH onCreateViewHolder(final ViewGroup parent, final int viewType) { return new VH(getActivity().getLayoutInflater().inflate(R.layout.item_goto_grid_cell, parent, false)); } @Override public void onBindViewHolder(final VH holder, final int position) { final TextView lName = (TextView) holder.itemView; lName.setText(textForView(position)); lName.setTextColor(textColorForView(position)); } abstract CharSequence textForView(int position); int textColorForView(int position) { return 0xffffffff; } } class BookAdapter extends GridAdapter { final Book[] books_grid; public BookAdapter() { // sort or not based on pref if (Preferences.getBoolean(R.string.pref_alphabeticBookSort_key, R.bool.pref_alphabeticBookSort_default)) { books_grid = BookNameSorter.sortAlphabetically(books); } else { books_grid = books.clone(); } } @Override public int getItemCount() { return books_grid.length; } @Override public void onBindViewHolder(final VH holder, final int position) { super.onBindViewHolder(holder, position); // must call this holder.itemView.setOnClickListener(v -> { selectedBook = bookAdapter.getItem(position); if (selectedBook.chapter_count == 1) { // for single-chapter books, jump directly to verse selection selectedChapter = 1; transitionBookToVerse(); } else { transitionBookToChapter(); } }); } public Book getItem(int position) { return books_grid[position]; } @Override CharSequence textForView(int position) { Book book = getItem(position); return BookNameSorter.getBookAbbr(book); } @Override int textColorForView(final int position) { final Book book = getItem(position); return U.getForegroundColorOnDarkBackgroundByBookId(book.bookId); } } class ChapterAdapter extends GridAdapter { private final Book book; public ChapterAdapter(Book book) { this.book = book; } @Override public int getItemCount() { return book.chapter_count; } @Override public void onBindViewHolder(final VH holder, final int position) { super.onBindViewHolder(holder, position); // must call this holder.itemView.setOnClickListener(v -> { selectedChapter = position + 1; if (Preferences.getBoolean(Prefkey.gotoAskForVerse, Prefkey.GOTO_ASK_FOR_VERSE_DEFAULT)) { transitionChapterToVerse(); } else { ((GotoFinishListener) getActivity()).onGotoFinished(GotoFinishListener.GOTO_TAB_grid, selectedBook.bookId, selectedChapter, 0); } }); } @Override CharSequence textForView(int position) { return String.valueOf(position + 1); } } class VerseAdapter extends GridAdapter { private final Book book; private final int chapter_1; public VerseAdapter(Book book, int chapter_1) { this.book = book; this.chapter_1 = chapter_1; } @Override public int getItemCount() { int chapter_0 = chapter_1 - 1; return chapter_0 < 0 || chapter_0 >= book.verse_counts.length? 0: book.verse_counts[chapter_0]; } @Override public void onBindViewHolder(final VH holder, final int position) { super.onBindViewHolder(holder, position); holder.itemView.setOnClickListener(v -> { final int selectedVerse = position + 1; ((GotoFinishListener) getActivity()).onGotoFinished(GotoFinishListener.GOTO_TAB_grid, selectedBook.bookId, selectedChapter, selectedVerse); }); } @Override CharSequence textForView(int position) { return String.valueOf(position + 1); } } }