diff options
author | Tom Hennen <tom.hennen@gmail.com> | 2015-09-19 14:40:01 -0400 |
---|---|---|
committer | Tom Hennen <tom.hennen@gmail.com> | 2015-09-20 14:21:15 -0400 |
commit | 1993f779e8b25507a4096effd72618937c2f4ad0 (patch) | |
tree | 53b14b25a51af25844bde6eacc91af87ae4e0eb7 /app/src/main/java/de | |
parent | a89edfcad4f69a7f8ddbce62ca33d4ba80d4a9ad (diff) | |
download | AntennaPod-1993f779e8b25507a4096effd72618937c2f4ad0.zip |
basic favorite functionality
Diffstat (limited to 'app/src/main/java/de')
5 files changed, 181 insertions, 18 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java index 5aed66013..b2932ddb7 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -64,7 +64,8 @@ public class AllEpisodesFragment extends Fragment { EventDistributor.FEED_LIST_UPDATE | EventDistributor.DOWNLOAD_QUEUED | EventDistributor.UNREAD_ITEMS_UPDATE | - EventDistributor.PLAYER_STATUS_UPDATE; + EventDistributor.PLAYER_STATUS_UPDATE | + EventDistributor.FAVORITE_UPDATE; private static final int RECENT_EPISODES_LIMIT = 150; private static final String DEFAULT_PREF_NAME = "PrefAllEpisodesFragment"; @@ -87,7 +88,7 @@ public class AllEpisodesFragment extends Fragment { private boolean viewsCreated = false; private final boolean showOnlyNewEpisodes; - private AtomicReference<MainActivity> activity = new AtomicReference<MainActivity>(); + protected AtomicReference<MainActivity> mainActivity = new AtomicReference<MainActivity>(); private DownloadObserver downloadObserver = null; @@ -125,7 +126,7 @@ public class AllEpisodesFragment extends Fragment { public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); - this.activity.set((MainActivity) getActivity()); + this.mainActivity.set((MainActivity) getActivity()); if (downloadObserver != null) { downloadObserver.setActivity(getActivity()); downloadObserver.onResume(); @@ -153,7 +154,7 @@ public class AllEpisodesFragment extends Fragment { @Override public void onAttach(Activity activity) { super.onAttach(activity); - this.activity.set((MainActivity) getActivity()); + this.mainActivity.set((MainActivity) getActivity()); } @Override @@ -188,7 +189,7 @@ public class AllEpisodesFragment extends Fragment { protected void resetViewState() { listAdapter = null; - activity.set(null); + mainActivity.set(null); viewsCreated = false; if (downloadObserver != null) { downloadObserver.onPause(); @@ -313,7 +314,7 @@ public class AllEpisodesFragment extends Fragment { viewsCreated = true; - if (itemsLoaded && activity.get() != null) { + if (itemsLoaded && mainActivity.get() != null) { onFragmentLoaded(); } @@ -375,11 +376,11 @@ public class AllEpisodesFragment extends Fragment { private void onFragmentLoaded() { if (listAdapter == null) { - listAdapter = new AllEpisodesListAdapter(activity.get(), itemAccess, - new DefaultActionButtonCallback(activity.get()), showOnlyNewEpisodes); + listAdapter = new AllEpisodesListAdapter(mainActivity.get(), itemAccess, + new DefaultActionButtonCallback(mainActivity.get()), showOnlyNewEpisodes); listView.setAdapter(listAdapter); listView.setEmptyView(txtvEmpty); - downloadObserver = new DownloadObserver(activity.get(), new Handler(), downloadObserverCallback); + downloadObserver = new DownloadObserver(mainActivity.get(), new Handler(), downloadObserverCallback); downloadObserver.onResume(); } listAdapter.notifyDataSetChanged(); @@ -452,12 +453,7 @@ public class AllEpisodesFragment extends Fragment { }; private void updateShowOnlyEpisodesListViewState() { - if (showOnlyNewEpisodes) { - listView.setEmptyView(null); - txtvEmpty.setVisibility(View.GONE); - } else { - listView.setEmptyView(txtvEmpty); - } + listView.setEmptyView(txtvEmpty); } protected void loadItems() { @@ -479,7 +475,7 @@ public class AllEpisodesFragment extends Fragment { episodes = data.first; queuedItemsIds = data.second; itemsLoaded = true; - if (viewsCreated && activity.get() != null) { + if (viewsCreated && mainActivity.get() != null) { onFragmentLoaded(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java index e234d95ad..f23981935 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java @@ -23,7 +23,8 @@ public class EpisodesFragment extends Fragment { public static final int POS_NEW_EPISODES = 0; public static final int POS_ALL_EPISODES = 1; - public static final int TOTAL_COUNT = 2; + public static final int POS_FAV_EPISODES = 2; + public static final int TOTAL_COUNT = 3; private TabLayout tabLayout; @@ -91,6 +92,8 @@ public class EpisodesFragment extends Fragment { return new AllEpisodesFragment(); case POS_NEW_EPISODES: return new NewEpisodesFragment(); + case POS_FAV_EPISODES: + return new FavoriteEpisodesFragment(); } return null; } @@ -107,6 +110,8 @@ public class EpisodesFragment extends Fragment { return resources.getString(R.string.all_episodes_short_label); case POS_NEW_EPISODES: return resources.getString(R.string.new_label); + case POS_FAV_EPISODES: + return resources.getString(R.string.favorite_episodes_label); default: return super.getPageTitle(position); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java new file mode 100644 index 000000000..aff1e575a --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java @@ -0,0 +1,130 @@ +package de.danoeh.antennapod.fragment; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.mobeta.android.dslv.DragSortListView; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken; +import de.danoeh.antennapod.core.util.gui.UndoBarController; +import de.greenrobot.event.EventBus; + + +/** + * Like 'EpisodesFragment' except that it only shows favorite episodes and + * supports swiping to remove from favorites. + */ + +public class FavoriteEpisodesFragment extends AllEpisodesFragment { + + public static final String TAG = "FavoriteEpisodesFrag"; + + private static final String PREF_NAME = "PrefFavoriteEpisodesFragment"; + + private UndoBarController undoBarController; + + public FavoriteEpisodesFragment() { + super(false, PREF_NAME); + } + + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + startItemLoader(); + } + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + } + + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + } + + @Override + protected void resetViewState() { + super.resetViewState(); + undoBarController = null; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View root = super.onCreateViewHelper(inflater, container, savedInstanceState, + R.layout.episodes_fragment_with_undo); + + listView.setRemoveListener(which -> { + Log.d(TAG, "remove(" + which + ")"); + stopItemLoader(); + FeedItem item = (FeedItem) listView.getAdapter().getItem(which); + + // TODO: actually remove the item from favorites + + undoBarController.showUndoBar(false, + getString(R.string.removed_from_favorites), new FeedItemUndoToken(item, + which) + ); + + throw new RuntimeException("can't remove yet"); + }); + + undoBarController = new UndoBarController<FeedItemUndoToken>(root.findViewById(R.id.undobar), new UndoBarController.UndoListener<FeedItemUndoToken>() { + + private final Context context = getActivity(); + + @Override + public void onUndo(FeedItemUndoToken token) { + if (token != null) { + long itemId = token.getFeedItemId(); + // TODO: put it back DBWriter.markItemPlayed(FeedItem.NEW, itemId); + throw new RuntimeException("can't undo remove yet"); + } + } + + @Override + public void onHide(FeedItemUndoToken token) { + // nothing to do + } + }); + return root; + } + + @Override + protected void startItemLoader() { + if (itemLoader != null) { + itemLoader.cancel(true); + } + itemLoader = new FavItemLoader(); + itemLoader.execute(); + } + + private class FavItemLoader extends AllEpisodesFragment.ItemLoader { + + @Override + protected Object[] doInBackground(Void... params) { + Context context = mainActivity.get(); + if (context != null) { + return new Object[]{ + DBReader.getFavoriteItemsList(), + DBReader.getQueueIDList() + }; + } else { + return null; + } + } + } + +} diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java index d454208c1..41630f6d9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -63,7 +63,7 @@ public class NewEpisodesFragment extends AllEpisodesFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = super.onCreateViewHelper(inflater, container, savedInstanceState, - R.layout.new_episodes_fragment); + R.layout.episodes_fragment_with_undo); listView.setRemoveListener(new DragSortListView.RemoveListener() { @Override @@ -109,4 +109,30 @@ public class NewEpisodesFragment extends AllEpisodesFragment { return root; } + @Override + protected void startItemLoader() { + if (itemLoader != null) { + itemLoader.cancel(true); + } + itemLoader = new NewItemLoader(); + itemLoader.execute(); + } + + private class NewItemLoader extends AllEpisodesFragment.ItemLoader { + + @Override + protected Object[] doInBackground(Void... params) { + Context context = mainActivity.get(); + if (context != null) { + return new Object[] { + DBReader.getNewItemsList(), + DBReader.getQueueIDList(), + null // see ItemAccess.isNew + }; + } else { + return null; + } + } + } + } diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java index 510ea2760..ede40c53f 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java @@ -193,6 +193,12 @@ public class FeedItemMenuHandler { case R.id.remove_from_queue_item: DBWriter.removeQueueItem(context, selectedItem, true); break; + case R.id.add_to_favorites_item: + DBWriter.addFavoriteItem(selectedItem); + break; + case R.id.remove_from_favorites_item: + DBWriter.removeFavoriteItem(selectedItem); + break; case R.id.reset_position: selectedItem.getMedia().setPosition(0); DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, true); |