package de.danoeh.antennapod.fragment; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.GridView; import java.util.ArrayList; import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.NavListAdapter; import de.danoeh.antennapod.adapter.SubscriptionsAdapter; import de.danoeh.antennapod.core.asynctask.FeedRemover; import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.FeedItemUtil; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Fragment for displaying feed subscriptions */ public class SubscriptionFragment extends Fragment { public static final String TAG = "SubscriptionFragment"; private GridView mSubscriptionGridLayout; private DBReader.NavDrawerData mDrawerData; private SubscriptionsAdapter mSubscriptionAdapter; private NavListAdapter.ItemAccess mItemAccess; private List mSubscriptionList = new ArrayList<>(); private int mPosition = -1; public SubscriptionFragment() { } public void setItemAccess(NavListAdapter.ItemAccess itemAccess) { mItemAccess = itemAccess; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_subscriptions, container, false); mSubscriptionGridLayout = (GridView) root.findViewById(R.id.subscriptions_grid); registerForContextMenu(mSubscriptionGridLayout); return root; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mSubscriptionAdapter = new SubscriptionsAdapter((MainActivity)getActivity(), mItemAccess); mSubscriptionGridLayout.setAdapter(mSubscriptionAdapter); loadSubscriptions(); mSubscriptionGridLayout.setOnItemClickListener(mSubscriptionAdapter); if (getActivity() instanceof MainActivity) { ((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.subscriptions_label); } } private void loadSubscriptions() { Observable.fromCallable(() -> DBReader.getNavDrawerData()) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { mDrawerData = result; mSubscriptionList = mDrawerData.feeds; mSubscriptionAdapter.setItemAccess(mItemAccess); mSubscriptionAdapter.notifyDataSetChanged(); }, error -> { Log.e(TAG, Log.getStackTraceString(error)); }); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); AdapterView.AdapterContextMenuInfo adapterInfo = (AdapterView.AdapterContextMenuInfo) menuInfo; int position = adapterInfo.position; Object selectedObject = mSubscriptionAdapter.getItem(position); if (selectedObject.equals(SubscriptionsAdapter.ADD_ITEM_OBJ)) { mPosition = position; return; } Feed feed = (Feed)selectedObject; MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.nav_feed_context, menu); menu.setHeaderTitle(feed.getTitle()); mPosition = position; } @Override public boolean onContextItemSelected(MenuItem item) { final int position = mPosition; mPosition = -1; // reset if(position < 0) { return false; } Object selectedObject = mSubscriptionAdapter.getItem(position); if (selectedObject.equals(SubscriptionsAdapter.ADD_ITEM_OBJ)) { // this is the add object, do nothing return false; } Feed feed = (Feed)selectedObject; switch(item.getItemId()) { case R.id.mark_all_seen_item: Observable.fromCallable(() -> DBWriter.markFeedSeen(feed.getId())) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { loadSubscriptions(); }, error -> { Log.e(TAG, Log.getStackTraceString(error)); }); return true; case R.id.mark_all_read_item: Observable.fromCallable(() -> DBWriter.markFeedRead(feed.getId())) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { loadSubscriptions(); }, error -> { Log.e(TAG, Log.getStackTraceString(error)); }); return true; case R.id.remove_item: final FeedRemover remover = new FeedRemover(getContext(), feed) { @Override protected void onPostExecute(Void result) { super.onPostExecute(result); loadSubscriptions(); } }; ConfirmationDialog conDialog = new ConfirmationDialog(getContext(), R.string.remove_feed_label, R.string.feed_delete_confirmation_msg) { @Override public void onConfirmButtonPressed( DialogInterface dialog) { dialog.dismiss(); long mediaId = PlaybackPreferences.getCurrentlyPlayingFeedMediaId(); if (mediaId > 0 && FeedItemUtil.indexOfItemWithMediaId(feed.getItems(), mediaId) >= 0) { Log.d(TAG, "Currently playing episode is about to be deleted, skipping"); remover.skipOnCompletion = true; int playerStatus = PlaybackPreferences.getCurrentPlayerStatus(); if(playerStatus == PlaybackPreferences.PLAYER_STATUS_PLAYING) { getActivity().sendBroadcast(new Intent( PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE)); } } remover.executeAsync(); } }; conDialog.createNewDialog().show(); return true; default: return super.onContextItemSelected(item); } } @Override public void onResume() { super.onResume(); } }