package com.quran.labs.androidquran.ui.fragment; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.quran.labs.androidquran.QuranApplication; import com.quran.labs.androidquran.R; import com.quran.labs.androidquran.database.BookmarksDBAdapter; import com.quran.labs.androidquran.model.bookmark.BookmarkResult; import com.quran.labs.androidquran.presenter.bookmark.BookmarkPresenter; import com.quran.labs.androidquran.presenter.bookmark.BookmarksContextualModePresenter; import com.quran.labs.androidquran.ui.QuranActivity; import com.quran.labs.androidquran.ui.helpers.QuranListAdapter; import com.quran.labs.androidquran.ui.helpers.QuranRow; import java.util.List; import javax.inject.Inject; public class BookmarksFragment extends Fragment implements QuranListAdapter.QuranTouchListener { private RecyclerView recyclerView; private QuranListAdapter bookmarksAdapter; @Inject BookmarkPresenter bookmarkPresenter; @Inject BookmarksContextualModePresenter bookmarksContextualModePresenter; public static BookmarksFragment newInstance(){ return new BookmarksFragment(); } @Override public void onAttach(Context context) { super.onAttach(context); ((QuranApplication) context.getApplicationContext()).getApplicationComponent().inject(this); setHasOptionsMenu(true); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.quran_list, container, false); final Context context = getActivity(); recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(context)); recyclerView.setItemAnimator(new DefaultItemAnimator()); bookmarksAdapter = new QuranListAdapter(context, recyclerView, new QuranRow[0], true); bookmarksAdapter.setQuranTouchListener(this); recyclerView.setAdapter(bookmarksAdapter); return view; } @Override public void onStart() { super.onStart(); bookmarkPresenter.bind(this); bookmarksContextualModePresenter.bind(this); } @Override public void onStop() { bookmarkPresenter.unbind(this); bookmarksContextualModePresenter.unbind(this); super.onStop(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); MenuItem sortItem = menu.findItem(R.id.sort); if (sortItem != null) { sortItem.setVisible(true); sortItem.setEnabled(true); if (BookmarksDBAdapter.SORT_DATE_ADDED == bookmarkPresenter.getSortOrder()) { MenuItem sortByDate = menu.findItem(R.id.sort_date); sortByDate.setChecked(true); } else { MenuItem sortByLocation = menu.findItem(R.id.sort_location); sortByLocation.setChecked(true); } MenuItem groupByTags = menu.findItem(R.id.group_by_tags); groupByTags.setChecked(bookmarkPresenter.isGroupedByTags()); MenuItem showRecents = menu.findItem(R.id.show_recents); showRecents.setChecked(bookmarkPresenter.isShowingRecents()); } } @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); switch (itemId) { case R.id.sort_date: bookmarkPresenter.setSortOrder(BookmarksDBAdapter.SORT_DATE_ADDED); item.setChecked(true); return true; case R.id.sort_location: { bookmarkPresenter.setSortOrder(BookmarksDBAdapter.SORT_LOCATION); item.setChecked(true); return true; } case R.id.group_by_tags: { bookmarkPresenter.toggleGroupByTags(); item.setChecked(bookmarkPresenter.isGroupedByTags()); return true; } case R.id.show_recents: { bookmarkPresenter.toggleShowRecents(); item.setChecked(bookmarkPresenter.isShowingRecents()); return true; } } return super.onOptionsItemSelected(item); } public void onNewData(BookmarkResult items) { bookmarksAdapter.setShowTags(bookmarkPresenter.shouldShowInlineTags()); bookmarksAdapter.setElements( items.rows.toArray(new QuranRow[items.rows.size()]), items.tagMap); bookmarksAdapter.notifyDataSetChanged(); } @Override public void onClick(QuranRow row, int position) { if (bookmarksContextualModePresenter.isInActionMode()) { boolean checked = isValidSelection(row) && !bookmarksAdapter.isItemChecked(position); bookmarksAdapter.setItemChecked(position, checked); bookmarksContextualModePresenter.invalidateActionMode(false); } else { bookmarksAdapter.setItemChecked(position, false); handleRowClicked(getActivity(), row); } } @Override public boolean onLongClick(QuranRow row, int position) { if (isValidSelection(row)) { bookmarksAdapter.setItemChecked(position, !bookmarksAdapter.isItemChecked(position)); if (bookmarksContextualModePresenter.isInActionMode() && bookmarksAdapter.getCheckedItems().size() == 0) { bookmarksContextualModePresenter.finishActionMode(); } else { bookmarksContextualModePresenter.invalidateActionMode(true); } return true; } return false; } private boolean isValidSelection(QuranRow selected) { return selected.isBookmark() || (selected.isBookmarkHeader() && selected.tagId >= 0); } private View.OnClickListener mOnUndoClickListener = new View.OnClickListener() { @Override public void onClick(View v) { bookmarkPresenter.cancelDeletion(); bookmarkPresenter.requestData(true); } }; public void prepareContextualMenu(Menu menu) { boolean[] menuVisibility = bookmarkPresenter.getContextualOperationsForItems(bookmarksAdapter.getCheckedItems()); menu.findItem(R.id.cab_edit_tag).setVisible(menuVisibility[0]); menu.findItem(R.id.cab_delete).setVisible(menuVisibility[1]); menu.findItem(R.id.cab_tag_bookmark).setVisible(menuVisibility[2]); } public boolean onContextualActionClicked(int itemId) { Activity currentActivity = getActivity(); if (currentActivity instanceof QuranActivity) { QuranActivity activity = (QuranActivity) currentActivity; switch (itemId) { case R.id.cab_delete: { final List<QuranRow> selected = bookmarksAdapter.getCheckedItems(); final int size = selected.size(); final Resources res = getResources(); bookmarkPresenter.deleteAfterSomeTime(selected); Snackbar snackbar = Snackbar.make(recyclerView, res.getQuantityString(R.plurals.bookmark_tag_deleted, size, size), BookmarkPresenter.DELAY_DELETION_DURATION_IN_MS); snackbar.setAction(R.string.undo, mOnUndoClickListener); snackbar.getView().setBackgroundColor(ContextCompat.getColor(activity, R.color.snackbar_background_color)); snackbar.show(); return true; } case R.id.cab_new_tag: { activity.addTag(); return true; } case R.id.cab_edit_tag: { handleTagEdit(activity, bookmarksAdapter.getCheckedItems()); return true; } case R.id.cab_tag_bookmark: { handleTagBookmarks(activity, bookmarksAdapter.getCheckedItems()); return true; } } } return false; } public void onCloseContextualActionMenu() { bookmarksAdapter.uncheckAll(); } private void handleRowClicked(Activity activity, QuranRow row) { if (!row.isHeader() && activity instanceof QuranActivity) { QuranActivity quranActivity = (QuranActivity) activity; if (row.isAyahBookmark()) { quranActivity.jumpToAndHighlight(row.page, row.sura, row.ayah); } else { quranActivity.jumpTo(row.page); } } } private void handleTagEdit(QuranActivity activity, List<QuranRow> selected) { if (selected.size() == 1) { QuranRow row = selected.get(0); activity.editTag(row.tagId, row.text); } } private void handleTagBookmarks(QuranActivity activity, List<QuranRow> selected) { long[] ids = new long[selected.size()]; for (int i = 0, selectedItems = selected.size(); i < selectedItems; i++) { ids[i] = selected.get(i).bookmarkId; } activity.tagBookmarks(ids); } }