package com.battlelancer.seriesguide.ui; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.view.ViewCompat; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.PopupMenu; import com.battlelancer.seriesguide.R; import com.battlelancer.seriesguide.SgApp; import com.battlelancer.seriesguide.adapters.ListItemsAdapter; import com.battlelancer.seriesguide.provider.SeriesGuideContract.ListItems; import com.battlelancer.seriesguide.provider.SeriesGuideContract.Shows; import com.battlelancer.seriesguide.settings.ListsDistillationSettings; import com.battlelancer.seriesguide.ui.dialogs.ManageListsDialogFragment; import com.battlelancer.seriesguide.util.ListsTools; import com.battlelancer.seriesguide.util.Utils; import com.uwetrottmann.androidutils.AndroidUtils; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; /** * Displays one user created list which includes a mixture of shows, seasons and episodes. */ public class ListsFragment extends Fragment implements OnItemClickListener, View.OnClickListener { /** LoaderManager is created unique to fragment, so use same id for all of them */ private static final int LOADER_ID = 1; private static final String TAG = "Lists"; public static ListsFragment newInstance(String list_id) { ListsFragment f = new ListsFragment(); Bundle args = new Bundle(); args.putString(InitBundle.LIST_ID, list_id); f.setArguments(args); return f; } interface InitBundle { String LIST_ID = "list_id"; } private ListItemsAdapter mAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_list, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new ListItemsAdapter(getActivity(), onContextMenuClickListener); if (getView() == null) { return; } // setup grid view GridView gridView = (GridView) getView().findViewById(android.R.id.list); // enable app bar scrolling out of view only on L or higher ViewCompat.setNestedScrollingEnabled(gridView, AndroidUtils.isLollipopOrHigher()); gridView.setAdapter(mAdapter); gridView.setOnItemClickListener(this); gridView.setEmptyView(getView().findViewById(android.R.id.empty)); gridView.setFastScrollAlwaysVisible(false); gridView.setFastScrollEnabled(true); getLoaderManager().initLoader(LOADER_ID, getArguments(), loaderCallbacks); } @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } @Override public void onClick(View v) { getActivity().openContextMenu(v); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final Cursor listItem = (Cursor) mAdapter.getItem(position); int itemType = listItem.getInt(ListItemsAdapter.Query.ITEM_TYPE); String itemRefId = listItem.getString(ListItemsAdapter.Query.ITEM_REF_ID); Intent intent = null; switch (itemType) { case 1: { // display show overview intent = new Intent(getActivity(), OverviewActivity.class); intent.putExtra(OverviewActivity.EXTRA_INT_SHOW_TVDBID, Integer.valueOf(itemRefId)); break; } case 2: { // display episodes of season intent = new Intent(getActivity(), EpisodesActivity.class); intent.putExtra(EpisodesActivity.InitBundle.SEASON_TVDBID, Integer.valueOf(itemRefId)); break; } case 3: { // display episode details intent = new Intent(getActivity(), EpisodesActivity.class); intent.putExtra(EpisodesActivity.InitBundle.EPISODE_TVDBID, Integer.valueOf(itemRefId)); break; } } if (intent != null) { Utils.startActivityWithAnimation(getActivity(), intent, view); } } @SuppressWarnings("UnusedParameters") @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(ListsDistillationSettings.ListsSortOrderChangedEvent event) { // sort order has changed, reload lists getLoaderManager().restartLoader(LOADER_ID, getArguments(), loaderCallbacks); } private LoaderManager.LoaderCallbacks<Cursor> loaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { String listId = args.getString(InitBundle.LIST_ID); return new CursorLoader(getActivity(), ListItems.CONTENT_WITH_DETAILS_URI, ListItemsAdapter.Query.PROJECTION, // items of this list, but exclude any if show was removed from the database // (the join on show data will fail, hence the show id will be 0/null) ListItems.SELECTION_LIST + " AND " + Shows.REF_SHOW_ID + ">0", new String[] { listId }, ListsDistillationSettings.getSortQuery(getActivity()) ); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } }; private ListItemsAdapter.OnContextMenuClickListener onContextMenuClickListener = new ListItemsAdapter.OnContextMenuClickListener() { @Override public void onClick(View view, ListItemsAdapter.ListItemViewHolder viewHolder) { PopupMenu popupMenu = new PopupMenu(view.getContext(), view); popupMenu.inflate(R.menu.lists_popup_menu); popupMenu.setOnMenuItemClickListener( new PopupMenuItemClickListener(SgApp.from(getActivity()), getFragmentManager(), viewHolder.itemId, viewHolder.itemTvdbId, viewHolder.itemType)); popupMenu.show(); } }; private static class PopupMenuItemClickListener implements PopupMenu.OnMenuItemClickListener { private final SgApp app; private final FragmentManager fragmentManager; private final String itemId; private final int itemTvdbId; private final int itemType; public PopupMenuItemClickListener(SgApp app, FragmentManager fm, String itemId, int itemTvdbId, int itemType) { this.app = app; this.fragmentManager = fm; this.itemId = itemId; this.itemTvdbId = itemTvdbId; this.itemType = itemType; } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.menu_action_lists_manage: { ManageListsDialogFragment.showListsDialog(itemTvdbId, itemType, fragmentManager); Utils.trackContextMenu(app, TAG, "Manage lists"); return true; } case R.id.menu_action_lists_remove: { ListsTools.removeListItem(app, itemId); Utils.trackContextMenu(app, TAG, "Remove from list"); return true; } } return false; } } }