package de.danoeh.antennapod.fragment; import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; import android.support.v7.view.ActionMode; import android.util.Log; import android.view.*; import android.widget.*; import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.FeedItemlistActivity; import de.danoeh.antennapod.adapter.FeedlistAdapter; import de.danoeh.antennapod.asynctask.FeedRemover; import de.danoeh.antennapod.dialog.ConfirmationDialog; import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.feed.EventDistributor; import de.danoeh.antennapod.feed.Feed; import de.danoeh.antennapod.storage.DBReader; import de.danoeh.antennapod.storage.DownloadRequestException; import de.danoeh.antennapod.storage.FeedItemStatistics; import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler; import java.util.List; public class FeedlistFragment extends Fragment implements ActionMode.Callback, AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { private static final String TAG = "FeedlistFragment"; private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | EventDistributor.FEED_LIST_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE; public static final String EXTRA_SELECTED_FEED = "extra.de.danoeh.antennapod.activity.selected_feed"; private FeedlistAdapter fla; private List feeds; private List feedItemStatistics; private Feed selectedFeed; private ActionMode mActionMode; private GridView gridView; private ListView listView; private TextView emptyView; private FeedlistAdapter.ItemAccess itemAccess = new FeedlistAdapter.ItemAccess() { @Override public Feed getItem(int position) { if (feeds != null) { return feeds.get(position); } else { return null; } } @Override public FeedItemStatistics getFeedItemStatistics(int position) { if (feedItemStatistics != null && position < feedItemStatistics.size()) { return feedItemStatistics.get(position); } else { return null; } } @Override public int getCount() { if (feeds != null) { return feeds.size(); } else { return 0; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (AppConfig.DEBUG) Log.d(TAG, "Creating"); fla = new FeedlistAdapter(getActivity(), itemAccess); loadFeeds(); } private void loadFeeds() { AsyncTask loadTask = new AsyncTask() { @Override protected List[] doInBackground(Void... params) { Context context = getActivity(); if (context != null) { return new List[]{DBReader.getFeedList(context), DBReader.getFeedStatisticsList(context)}; } else { return null; } } @Override protected void onPostExecute(List[] result) { super.onPostExecute(result); if (result != null) { feeds = result[0]; feedItemStatistics = result[1]; setEmptyViewIfListIsEmpty(); if (fla != null) { fla.notifyDataSetChanged(); } } else { Log.e(TAG, "Failed to load feeds"); } } }; loadTask.execute(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View result = inflater.inflate(R.layout.feedlist, container, false); listView = (ListView) result.findViewById(android.R.id.list); gridView = (GridView) result.findViewById(R.id.grid); emptyView = (TextView) result.findViewById(android.R.id.empty); return result; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (listView != null) { listView.setOnItemClickListener(this); listView.setOnItemLongClickListener(this); listView.setAdapter(fla); listView.setEmptyView(emptyView); if (AppConfig.DEBUG) Log.d(TAG, "Using ListView"); } else { gridView.setOnItemClickListener(this); gridView.setOnItemLongClickListener(this); gridView.setAdapter(fla); gridView.setEmptyView(emptyView); if (AppConfig.DEBUG) Log.d(TAG, "Using GridView"); } setEmptyViewIfListIsEmpty(); } @Override public void onResume() { super.onResume(); if (AppConfig.DEBUG) Log.d(TAG, "Resuming"); EventDistributor.getInstance().register(contentUpdate); } @Override public void onDestroy() { super.onDestroy(); EventDistributor.getInstance().unregister(contentUpdate); } @Override public void onPause() { super.onPause(); if (mActionMode != null) { mActionMode.finish(); } } private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((EVENTS & arg) != 0) { if (AppConfig.DEBUG) Log.d(TAG, "Received contentUpdate Intent."); loadFeeds(); } } }; @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { FeedMenuHandler.onCreateOptionsMenu(mode.getMenuInflater(), menu); mode.setTitle(selectedFeed.getTitle()); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return FeedMenuHandler.onPrepareOptionsMenu(menu, selectedFeed); } @SuppressLint("NewApi") @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { try { if (FeedMenuHandler.onOptionsItemClicked(getActivity(), item, selectedFeed)) { loadFeeds(); } else { switch (item.getItemId()) { case R.id.remove_item: final FeedRemover remover = new FeedRemover( getActivity(), selectedFeed) { @Override protected void onPostExecute(Void result) { super.onPostExecute(result); loadFeeds(); } }; ConfirmationDialog conDialog = new ConfirmationDialog( getActivity(), R.string.remove_feed_label, R.string.feed_delete_confirmation_msg) { @Override public void onConfirmButtonPressed( DialogInterface dialog) { dialog.dismiss(); remover.executeAsync(); } }; conDialog.createNewDialog().show(); break; } } } catch (DownloadRequestException e) { e.printStackTrace(); DownloadRequestErrorDialogCreator.newRequestErrorDialog( getActivity(), e.getMessage()); } mode.finish(); return true; } private boolean actionModeDestroyWorkaround = false; // TODO remove this workaround private boolean skipWorkAround = Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH; @Override public void onDestroyActionMode(ActionMode mode) { if (skipWorkAround || actionModeDestroyWorkaround) { mActionMode = null; selectedFeed = null; fla.setSelectedItemIndex(FeedlistAdapter.SELECTION_NONE); actionModeDestroyWorkaround = false; } else { actionModeDestroyWorkaround = true; } } @Override public void onItemClick(AdapterView arg0, View arg1, int position, long id) { Feed selection = fla.getItem(position); Intent showFeed = new Intent(getActivity(), FeedItemlistActivity.class); showFeed.putExtra(EXTRA_SELECTED_FEED, selection.getId()); getActivity().startActivity(showFeed); } @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { Feed selection = fla.getItem(position); if (selection != null) { if (AppConfig.DEBUG) Log.d(TAG, "Selected Feed with title " + selection.getTitle()); if (mActionMode != null) { mActionMode.finish(); } fla.setSelectedItemIndex(position); selectedFeed = selection; mActionMode = ((ActionBarActivity) getActivity()).startSupportActionMode(FeedlistFragment.this); } return true; } private AbsListView getMainView() { return (listView != null) ? listView : gridView; } private void setEmptyViewIfListIsEmpty() { if (getMainView() != null && emptyView != null && feeds != null) { if (feeds.isEmpty()) { emptyView.setText(R.string.no_feeds_label); } } } }