diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/fragment')
18 files changed, 593 insertions, 243 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java index e4ae1683b..bbe6fab46 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java @@ -20,7 +20,8 @@ import de.danoeh.antennapod.fragment.gpodnet.GpodnetMainFragment; * Provides actions for adding new podcast subscriptions */ public class AddFeedFragment extends Fragment { - private static final String TAG = "AddFeedFragment"; + + public static final String TAG = "AddFeedFragment"; /** * Preset value for url text field. 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 2eef7b635..ff5485251 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -8,7 +8,10 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; +import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; +import android.util.Log; +import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -28,7 +31,7 @@ import java.util.concurrent.atomic.AtomicReference; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.DefaultActionButtonCallback; -import de.danoeh.antennapod.adapter.NewEpisodesListAdapter; +import de.danoeh.antennapod.adapter.AllEpisodesListAdapter; import de.danoeh.antennapod.core.asynctask.DownloadObserver; import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.feed.EventDistributor; @@ -40,19 +43,21 @@ import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; -import de.danoeh.antennapod.core.util.QueueAccess; +import de.danoeh.antennapod.core.util.LongList; +import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; /** * Shows unread or recently published episodes */ public class AllEpisodesFragment extends Fragment { - private static final String TAG = "AllEpisodesFragment"; + + public static final String TAG = "AllEpisodesFragment"; + private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | - EventDistributor.QUEUE_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE | EventDistributor.PLAYER_STATUS_UPDATE; @@ -63,18 +68,19 @@ public class AllEpisodesFragment extends Fragment { private String prefName; protected DragSortListView listView; - private NewEpisodesListAdapter listAdapter; + private AllEpisodesListAdapter listAdapter; private TextView txtvEmpty; private ProgressBar progLoading; + private ContextMenu contextMenu; - private List<FeedItem> unreadItems; - private List<FeedItem> recentItems; - private QueueAccess queueAccess; + private List<FeedItem> episodes; + private LongList queuedItemsIds; + private LongList newItemsIds; private List<Downloader> downloaderList; private boolean itemsLoaded = false; private boolean viewsCreated = false; - private boolean showOnlyNewEpisodes = false; + private final boolean showOnlyNewEpisodes; private AtomicReference<MainActivity> activity = new AtomicReference<MainActivity>(); @@ -192,11 +198,12 @@ public class AllEpisodesFragment extends Fragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { inflater.inflate(R.menu.new_episodes, menu); - final SearchView sv = new SearchView(getActivity()); - MenuItemUtils.addSearchItem(menu, sv); + MenuItem searchItem = menu.findItem(R.id.action_search); + final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + MenuItemUtils.adjustTextColor(getActivity(), sv); sv.setQueryHint(getString(R.string.search_hint)); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override @@ -218,10 +225,10 @@ public class AllEpisodesFragment extends Fragment { @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { MenuItem menuItem = menu.findItem(R.id.mark_all_read_item); if (menuItem != null) { - menuItem.setVisible(unreadItems != null && !unreadItems.isEmpty()); + menuItem.setVisible(episodes != null && !episodes.isEmpty()); } } } @@ -291,6 +298,8 @@ public class AllEpisodesFragment extends Fragment { } }); + registerForContextMenu(listView); + if (!itemsLoaded) { progLoading.setVisibility(View.VISIBLE); txtvEmpty.setVisibility(View.GONE); @@ -305,9 +314,59 @@ public class AllEpisodesFragment extends Fragment { return root; } + private final FeedItemMenuHandler.MenuInterface contextMenuInterface = new FeedItemMenuHandler.MenuInterface() { + @Override + public void setItemVisibility(int id, boolean visible) { + if(contextMenu == null) { + return; + } + MenuItem item = contextMenu.findItem(id); + if (item != null) { + item.setVisible(visible); + } + } + }; + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + AdapterView.AdapterContextMenuInfo adapterInfo = (AdapterView.AdapterContextMenuInfo) menuInfo; + FeedItem item = itemAccess.getItem(adapterInfo.position); + + MenuInflater inflater = getActivity().getMenuInflater(); + inflater.inflate(R.menu.allepisodes_context, menu); + + if (item != null) { + menu.setHeaderTitle(item.getTitle()); + } + + contextMenu = menu; + FeedItemMenuHandler.onPrepareMenu(contextMenuInterface, item, true, queuedItemsIds); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); + FeedItem selectedItem = itemAccess.getItem(menuInfo.position); + + if (selectedItem == null) { + Log.i(TAG, "Selected item at position " + menuInfo.position + " was null, ignoring selection"); + return super.onContextItemSelected(item); + } + + try { + return FeedItemMenuHandler.onMenuItemClicked(getActivity(), item.getItemId(), selectedItem); + } catch (DownloadRequestException e) { + e.printStackTrace(); + Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show(); + return true; + } + } + private void onFragmentLoaded() { if (listAdapter == null) { - listAdapter = new NewEpisodesListAdapter(activity.get(), itemAccess, new DefaultActionButtonCallback(activity.get())); + listAdapter = new AllEpisodesListAdapter(activity.get(), itemAccess, + new DefaultActionButtonCallback(activity.get()), showOnlyNewEpisodes); listView.setAdapter(listAdapter); listView.setEmptyView(txtvEmpty); downloadObserver = new DownloadObserver(activity.get(), new Handler(), downloadObserverCallback); @@ -336,12 +395,12 @@ public class AllEpisodesFragment extends Fragment { } }; - private NewEpisodesListAdapter.ItemAccess itemAccess = new NewEpisodesListAdapter.ItemAccess() { + private AllEpisodesListAdapter.ItemAccess itemAccess = new AllEpisodesListAdapter.ItemAccess() { @Override public int getCount() { if (itemsLoaded) { - return (showOnlyNewEpisodes) ? unreadItems.size() : recentItems.size(); + return episodes.size(); } return 0; } @@ -349,7 +408,7 @@ public class AllEpisodesFragment extends Fragment { @Override public FeedItem getItem(int position) { if (itemsLoaded) { - return (showOnlyNewEpisodes) ? unreadItems.get(position) : recentItems.get(position); + return episodes.get(position); } return null; } @@ -370,7 +429,17 @@ public class AllEpisodesFragment extends Fragment { @Override public boolean isInQueue(FeedItem item) { if (itemsLoaded) { - return queueAccess.contains(item.getId()); + return queuedItemsIds.contains(item.getId()); + } else { + return false; + } + } + + @Override + public boolean isNew(FeedItem item) { + if (itemsLoaded) { + // should actually never be called in NewEpisodesFragment, but better safe than sorry + return showOnlyNewEpisodes || newItemsIds.contains(item.getId()); } else { return false; } @@ -402,7 +471,7 @@ public class AllEpisodesFragment extends Fragment { private ItemLoader itemLoader; - private void startItemLoader() { + protected void startItemLoader() { if (itemLoader != null) { itemLoader.cancel(true); } @@ -432,9 +501,19 @@ public class AllEpisodesFragment extends Fragment { protected Object[] doInBackground(Void... params) { Context context = activity.get(); if (context != null) { - return new Object[]{DBReader.getUnreadItemsList(context), - DBReader.getRecentlyPublishedEpisodes(context, RECENT_EPISODES_LIMIT), - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + if(showOnlyNewEpisodes) { + return new Object[] { + DBReader.getNewItemsList(context), + DBReader.getQueueIDList(context), + null // see ItemAccess.isNew + }; + } else { + return new Object[]{ + DBReader.getRecentlyPublishedEpisodes(context, RECENT_EPISODES_LIMIT), + DBReader.getQueueIDList(context), + DBReader.getNewItemIds(context) + }; + } } else { return null; } @@ -447,9 +526,9 @@ public class AllEpisodesFragment extends Fragment { progLoading.setVisibility(View.GONE); if (lists != null) { - unreadItems = (List<FeedItem>) lists[0]; - recentItems = (List<FeedItem>) lists[1]; - queueAccess = (QueueAccess) lists[2]; + episodes = (List<FeedItem>) lists[0]; + queuedItemsIds = (LongList) lists[1]; + newItemsIds = (LongList) lists[2]; itemsLoaded = true; if (viewsCreated && activity.get() != null) { onFragmentLoaded(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index d63d66966..3ca5b3c89 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -8,6 +8,7 @@ import android.support.v4.app.ListFragment; import android.view.View; import android.widget.ListView; +import java.util.Collections; import java.util.List; import de.danoeh.antennapod.R; @@ -17,7 +18,6 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.core.util.QueueAccess; /** * Displays all running downloads and provides a button to delete them @@ -26,11 +26,9 @@ public class CompletedDownloadsFragment extends ListFragment { private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOADLOG_UPDATE | - EventDistributor.QUEUE_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE; private List<FeedItem> items; - private QueueAccess queue; private DownloadedEpisodesListAdapter listAdapter; private boolean viewCreated = false; @@ -155,7 +153,7 @@ public class CompletedDownloadsFragment extends ListFragment { } } - private class ItemLoader extends AsyncTask<Void, Void, Object[]> { + private class ItemLoader extends AsyncTask<Void, Void, List<FeedItem>> { @Override protected void onPreExecute() { @@ -166,11 +164,10 @@ public class CompletedDownloadsFragment extends ListFragment { } @Override - protected void onPostExecute(Object[] results) { + protected void onPostExecute(List<FeedItem> results) { super.onPostExecute(results); if (results != null) { - items = (List<FeedItem>) results[0]; - queue = (QueueAccess) results[1]; + items = results; itemsLoaded = true; if (viewCreated && getActivity() != null) { onFragmentLoaded(); @@ -179,13 +176,12 @@ public class CompletedDownloadsFragment extends ListFragment { } @Override - protected Object[] doInBackground(Void... params) { + protected List<FeedItem> doInBackground(Void... params) { Context context = getActivity(); if (context != null) { - return new Object[]{DBReader.getDownloadedItems(context), - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + return DBReader.getDownloadedItems(context); } - return null; + return Collections.emptyList(); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java index 0f6f7d53c..074a87ea0 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -20,8 +20,6 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; /** * Shows the download log @@ -119,7 +117,7 @@ public class DownloadLogFragment extends ListFragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { MenuItem clearHistory = menu.add(Menu.NONE, R.id.clear_history_item, Menu.CATEGORY_CONTAINER, R.string.clear_history_label); MenuItemCompat.setShowAsAction(clearHistory, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); TypedArray drawables = getActivity().obtainStyledAttributes(new int[]{R.attr.content_discard}); @@ -131,8 +129,11 @@ public class DownloadLogFragment extends ListFragment { @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { - menu.findItem(R.id.clear_history_item).setVisible(downloadLog != null && !downloadLog.isEmpty()); + if (itemsLoaded) { + MenuItem menuItem = menu.findItem(R.id.clear_history_item); + if(menuItem != null) { + menuItem.setVisible(downloadLog != null && !downloadLog.isEmpty()); + } } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java index 712db1421..1ce379cf8 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java @@ -17,6 +17,8 @@ import de.danoeh.antennapod.R; */ public class DownloadsFragment extends Fragment { + public static final String TAG = "DownloadsFragment"; + public static final String ARG_SELECTED_TAB = "selected_tab"; public static final int POS_RUNNING = 0; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java index a42658057..fdb128f03 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java @@ -13,7 +13,6 @@ import android.widget.TextView; import com.squareup.picasso.Picasso; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.util.Converter; @@ -54,8 +53,7 @@ public class ExternalPlayerFragment extends Fragment { @Override public void onClick(View v) { - if (BuildConfig.DEBUG) - Log.d(TAG, "layoutInfo was clicked"); + Log.d(TAG, "layoutInfo was clicked"); if (controller.getMedia() != null) { startActivity(PlaybackService.getPlayerActivityIntent( @@ -90,14 +88,10 @@ public class ExternalPlayerFragment extends Fragment { @Override public void onBufferStart() { - // TODO Auto-generated method stub - } @Override public void onBufferEnd() { - // TODO Auto-generated method stub - } @Override @@ -153,7 +147,6 @@ public class ExternalPlayerFragment extends Fragment { butPlay.setOnClickListener(controller .newOnPlayButtonClickListener()); } - } @Override @@ -170,8 +163,6 @@ public class ExternalPlayerFragment extends Fragment { @Override public void onPlaybackSpeedChange() { - // TODO Auto-generated method stub - } }; } @@ -185,8 +176,7 @@ public class ExternalPlayerFragment extends Fragment { @Override public void onDestroy() { super.onDestroy(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Fragment is about to be destroyed"); + Log.d(TAG, "Fragment is about to be destroyed"); if (controller != null) { controller.release(); } @@ -201,8 +191,7 @@ public class ExternalPlayerFragment extends Fragment { } private boolean loadMediaInfo() { - if (BuildConfig.DEBUG) - Log.d(TAG, "Loading media info"); + Log.d(TAG, "Loading media info"); if (controller.serviceAvailable()) { Playable media = controller.getMedia(); if (media != null) { @@ -221,13 +210,11 @@ public class ExternalPlayerFragment extends Fragment { } return true; } else { - Log.w(TAG, - "loadMediaInfo was called while the media object of playbackService was null!"); + Log.w(TAG, "loadMediaInfo was called while the media object of playbackService was null!"); return false; } } else { - Log.w(TAG, - "loadMediaInfo was called while playbackService was null!"); + Log.w(TAG, "loadMediaInfo was called while playbackService was null!"); return false; } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java index e80bf5f14..51a1e2252 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -17,6 +17,7 @@ import android.support.v7.widget.PopupMenu; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.text.format.DateUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -43,6 +44,7 @@ import de.danoeh.antennapod.core.asynctask.DownloadObserver; import de.danoeh.antennapod.core.feed.EventDistributor; 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.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; @@ -51,18 +53,20 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.Converter; -import de.danoeh.antennapod.core.util.QueueAccess; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.playback.Timeline; import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; +import de.greenrobot.event.EventBus; /** * Displays information about a FeedItem and actions. */ -public class ItemFragment extends Fragment implements LoaderManager.LoaderCallbacks<Pair<FeedItem, QueueAccess>> { +public class ItemFragment extends Fragment implements LoaderManager.LoaderCallbacks<Pair<FeedItem, LongList>> { + + private static final String TAG = "ItemFragment"; private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | - EventDistributor.QUEUE_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE; private static final String ARG_FEEDITEM = "feeditem"; @@ -84,7 +88,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba private boolean itemsLoaded = false; private long itemID; private FeedItem item; - private QueueAccess queue; + private LongList queue; private String webviewData; private DownloadObserver downloadObserver; private List<Downloader> downloaderList; @@ -124,6 +128,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); if (downloadObserver != null) { downloadObserver.setActivity(getActivity()); downloadObserver.onResume(); @@ -138,6 +143,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); } private void resetViewState() { @@ -264,7 +270,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba return; } popupMenu.getMenu().clear(); - popupMenu.inflate(R.menu.feeditem_dialog); + popupMenu.inflate(R.menu.feeditem_options); if (item.hasMedia()) { FeedItemMenuHandler.onPrepareMenu(popupMenuInterface, item, true, queue); } else { @@ -387,25 +393,29 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba } } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + getLoaderManager().restartLoader(0, null, ItemFragment.this); + } @Override - public Loader<Pair<FeedItem, QueueAccess>> onCreateLoader(int id, Bundle args) { - return new DBTaskLoader<Pair<FeedItem, QueueAccess>>(getActivity()) { + public Loader<Pair<FeedItem,LongList>> onCreateLoader(int id, Bundle args) { + return new DBTaskLoader<Pair<FeedItem,LongList>>(getActivity()) { @Override - public Pair<FeedItem, QueueAccess> loadInBackground() { + public Pair<FeedItem,LongList> loadInBackground() { FeedItem data1 = DBReader.getFeedItem(getContext(), itemID); if (data1 != null) { Timeline t = new Timeline(getActivity(), data1); webviewData = t.processShownotes(false); } - QueueAccess data2 = QueueAccess.IDListAccess(DBReader.getQueueIDList(getContext())); + LongList data2 = DBReader.getQueueIDList(getContext()); return Pair.create(data1, data2); } }; } @Override - public void onLoadFinished(Loader<Pair<FeedItem, QueueAccess>> loader, Pair<FeedItem, QueueAccess> data) { + public void onLoadFinished(Loader<Pair<FeedItem,LongList>> loader, Pair<FeedItem,LongList> data) { if (data != null) { item = data.first; @@ -420,8 +430,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba } @Override - public void onLoaderReset(Loader<Pair<FeedItem, QueueAccess>> loader) { - + public void onLoaderReset(Loader<Pair<FeedItem,LongList>> loader) { } private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java index acb07626c..a9cbe8291 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -9,27 +9,33 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ListFragment; +import android.support.v4.view.MenuItemCompat; + import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.SearchView; import android.util.Log; +import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.widget.AdapterView; +import android.widget.IconTextView; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; +import android.widget.RelativeLayout; import android.widget.TextView; +import com.joanzapata.android.iconify.Iconify; import com.squareup.picasso.Picasso; import org.apache.commons.lang3.Validate; import java.util.List; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.FeedInfoActivity; import de.danoeh.antennapod.activity.MainActivity; @@ -42,19 +48,23 @@ import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedEvent; import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedItemFilter; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; -import de.danoeh.antennapod.core.util.QueueAccess; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.gui.MoreContentListFooterUtil; +import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.menuhandler.FeedMenuHandler; import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; +import de.greenrobot.event.EventBus; /** * Displays a list of FeedItems. @@ -65,7 +75,6 @@ public class ItemlistFragment extends ListFragment { private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED - | EventDistributor.QUEUE_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE | EventDistributor.PLAYER_STATUS_UPDATE; @@ -73,10 +82,13 @@ public class ItemlistFragment extends ListFragment { public static final String ARGUMENT_FEED_ID = "argument.de.danoeh.antennapod.feed_id"; protected FeedItemlistAdapter adapter; + private ContextMenu contextMenu; private long feedID; private Feed feed; - protected QueueAccess queue; + private LongList queuedItemsIds; + private LongList newItemsIds; + private boolean itemsLoaded = false; private boolean viewsCreated = false; @@ -87,6 +99,10 @@ public class ItemlistFragment extends ListFragment { private MoreContentListFooterUtil listFooter; private boolean isUpdatingFeed; + + private IconTextView txtvFailure; + + private TextView txtvInformation; /** * Creates new ItemlistFragment which shows the Feeditems of a specific @@ -118,6 +134,7 @@ public class ItemlistFragment extends ListFragment { public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); if (downloadObserver != null) { downloadObserver.setActivity(getActivity()); downloadObserver.onResume(); @@ -131,6 +148,7 @@ public class ItemlistFragment extends ListFragment { public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); stopItemLoader(); } @@ -177,11 +195,12 @@ public class ItemlistFragment extends ListFragment { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { FeedMenuHandler.onCreateOptionsMenu(inflater, menu); - final SearchView sv = new SearchView(getActivity()); - MenuItemUtils.addSearchItem(menu, sv); + MenuItem searchItem = menu.findItem(R.id.action_search); + final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + MenuItemUtils.adjustTextColor(getActivity(), sv); sv.setQueryHint(getString(R.string.search_hint)); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override @@ -204,7 +223,7 @@ public class ItemlistFragment extends ListFragment { @Override public void onPrepareOptionsMenu(Menu menu) { - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { FeedMenuHandler.onPrepareOptionsMenu(menu, feed); } } @@ -221,7 +240,7 @@ public class ItemlistFragment extends ListFragment { @Override protected void onPostExecute(Void result) { super.onPostExecute(result); - ((MainActivity) getActivity()).loadNavFragment(MainActivity.POS_NEW, null); + ((MainActivity) getActivity()).loadFragment(NewEpisodesFragment.TAG, null); } }; ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(), @@ -252,10 +271,61 @@ public class ItemlistFragment extends ListFragment { } else { return true; } + } + private final FeedItemMenuHandler.MenuInterface contextMenuInterface = new FeedItemMenuHandler.MenuInterface() { + @Override + public void setItemVisibility(int id, boolean visible) { + if(contextMenu == null) { + return; + } + MenuItem item = contextMenu.findItem(id); + if (item != null) { + item.setVisible(visible); + } + } + }; + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + AdapterView.AdapterContextMenuInfo adapterInfo = (AdapterView.AdapterContextMenuInfo) menuInfo; + + // because of addHeaderView(), positions are increased by 1! + FeedItem item = itemAccess.getItem(adapterInfo.position-1); + + MenuInflater inflater = getActivity().getMenuInflater(); + inflater.inflate(R.menu.feeditemlist_context, menu); + + if (item != null) { + menu.setHeaderTitle(item.getTitle()); + } + + contextMenu = menu; + FeedItemMenuHandler.onPrepareMenu(contextMenuInterface, item, true, queuedItemsIds); } @Override + public boolean onContextItemSelected(MenuItem item) { + AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); + // because of addHeaderView(), positions are increased by 1! + FeedItem selectedItem = itemAccess.getItem(menuInfo.position-1); + + if (selectedItem == null) { + Log.i(TAG, "Selected item at position " + menuInfo.position + " was null, ignoring selection"); + return super.onContextItemSelected(item); + } + + try { + return FeedItemMenuHandler.onMenuItemClicked(getActivity(), item.getItemId(), selectedItem); + } catch (DownloadRequestException e) { + // context menu doesn't contain download functionality + return true; + } + } + + + @Override public void setListAdapter(ListAdapter adapter) { // This workaround prevents the ListFragment from setting a list adapter when its state is restored. // This is only necessary on API 10 because addFooterView throws an internal exception in this case. @@ -269,6 +339,8 @@ public class ItemlistFragment extends ListFragment { super.onViewCreated(view, savedInstanceState); ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle(""); + registerForContextMenu(getListView()); + viewsCreated = true; if (itemsLoaded) { onFragmentLoaded(); @@ -283,13 +355,24 @@ public class ItemlistFragment extends ListFragment { } } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + startItemLoader(); + } + + public void onEvent(FeedEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + if(event.feedId == feedID) { + startItemLoader(); + } + } + private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((EVENTS & arg) != 0) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Received contentUpdate Intent."); + Log.d(TAG, "Received contentUpdate Intent. arg " + arg); if ((EventDistributor.DOWNLOAD_QUEUED & arg) != 0) { updateProgressBarVisibility(); } else { @@ -323,6 +406,7 @@ public class ItemlistFragment extends ListFragment { downloadObserver = new DownloadObserver(getActivity(), new Handler(), downloadObserverCallback); downloadObserver.onResume(); } + refreshHeaderView(); setListShown(true); adapter.notifyDataSetChanged(); @@ -336,6 +420,32 @@ public class ItemlistFragment extends ListFragment { } + private void refreshHeaderView() { + if(feed.hasLastUpdateFailed()) { + txtvFailure.setVisibility(View.VISIBLE); + } else { + txtvFailure.setVisibility(View.GONE); + } + if(feed.getItemFilter() != null) { + FeedItemFilter filter = feed.getItemFilter(); + if(filter.getValues().length > 0) { + if(feed.hasLastUpdateFailed()) { + RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) txtvInformation.getLayoutParams(); + p.addRule(RelativeLayout.BELOW, R.id.txtvFailure); + } + txtvInformation.setText("{fa-info-circle} " + this.getString(R.string.filtered_label)); + Iconify.addIcons(txtvInformation); + txtvInformation.setVisibility(View.VISIBLE); + } else { + txtvInformation.setVisibility(View.GONE); + } + } else { + + txtvInformation.setVisibility(View.GONE); + } + } + + private DownloadObserver.Callback downloadObserverCallback = new DownloadObserver.Callback() { @Override public void onContentChanged() { @@ -369,6 +479,8 @@ public class ItemlistFragment extends ListFragment { ImageView imgvBackground = (ImageView) header.findViewById(R.id.imgvBackground); ImageView imgvCover = (ImageView) header.findViewById(R.id.imgvCover); ImageButton butShowInfo = (ImageButton) header.findViewById(R.id.butShowInfo); + txtvInformation = (TextView) header.findViewById(R.id.txtvInformation); + txtvFailure = (IconTextView) header.findViewById(R.id.txtvFailure); txtvTitle.setText(feed.getTitle()); txtvAuthor.setText(feed.getAuthor()); @@ -399,6 +511,7 @@ public class ItemlistFragment extends ListFragment { }); } + private void setupFooterView() { if (getListView() == null || feed == null) { Log.e(TAG, "Unable to setup listview: listView = null or feed = null"); @@ -431,17 +544,22 @@ public class ItemlistFragment extends ListFragment { @Override public FeedItem getItem(int position) { - return (feed != null) ? feed.getItemAtIndex(true, position) : null; + return (feed != null) ? feed.getItemAtIndex(position) : null; } @Override public int getCount() { - return (feed != null) ? feed.getNumOfItems(true) : 0; + return (feed != null) ? feed.getNumOfItems() : 0; } @Override public boolean isInQueue(FeedItem item) { - return (queue != null) && queue.contains(item.getId()); + return (queuedItemsIds != null) && queuedItemsIds.contains(item.getId()); + } + + @Override + public boolean isNew(FeedItem item) { + return (newItemsIds != null) && newItemsIds.contains(item.getId()); } @Override @@ -480,8 +598,14 @@ public class ItemlistFragment extends ListFragment { long feedID = params[0]; Context context = getActivity(); if (context != null) { - return new Object[]{DBReader.getFeed(context, feedID), - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + Feed feed = DBReader.getFeed(context, feedID); + if(feed.getItemFilter() != null) { + FeedItemFilter filter = feed.getItemFilter(); + feed.setItems(filter.filter(context, feed.getItems())); + } + LongList queuedItemsIds = DBReader.getQueueIDList(context); + LongList newItemsIds = DBReader.getNewItemIds(context); + return new Object[] { feed, queuedItemsIds, newItemsIds }; } else { return null; } @@ -492,7 +616,8 @@ public class ItemlistFragment extends ListFragment { super.onPostExecute(res); if (res != null) { feed = (Feed) res[0]; - queue = (QueueAccess) res[1]; + queuedItemsIds = (LongList) res[1]; + newItemsIds = res[2] == null ? null : (LongList) res[2]; itemsLoaded = true; if (viewsCreated) { onFragmentLoaded(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java index c14b0cc6e..16789d694 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.fragment; import android.content.Intent; +import android.content.res.Resources; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -28,6 +29,7 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.DefaultOnlineFeedViewActivity; import de.danoeh.antennapod.activity.OnlineFeedViewActivity; import de.danoeh.antennapod.adapter.itunes.ItunesAdapter; +import de.danoeh.antennapod.core.preferences.UserPreferences; import static de.danoeh.antennapod.adapter.itunes.ItunesAdapter.*; @@ -124,6 +126,13 @@ public class ItunesSearchFragment extends Fragment { } }); + SearchView.SearchAutoComplete textField = (SearchView.SearchAutoComplete) searchView.findViewById(de.danoeh.antennapod.R.id.search_src_text); + if(UserPreferences.getTheme() == de.danoeh.antennapod.R.style.Theme_AntennaPod_Dark) { + textField.setTextColor(Resources.getSystem().getColor(android.R.color.white)); + } else { + textField.setTextColor(Resources.getSystem().getColor(android.R.color.black)); + } + return view; } 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 c2bbae42d..4bce3c7ba 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -1,7 +1,7 @@ package de.danoeh.antennapod.fragment; +import android.content.Context; import android.os.Bundle; -import android.os.Parcelable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -11,17 +11,25 @@ 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.preferences.UserPreferences; +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 new episodes and * supports swiping to mark as read. */ + public class NewEpisodesFragment extends AllEpisodesFragment { - private static final String TAG = "NewEpisodesFragment"; + public static final String TAG = "NewEpisodesFragment"; + private static final String PREF_NAME = "PrefNewEpisodesFragment"; private UndoBarController undoBarController; @@ -30,6 +38,23 @@ public class NewEpisodesFragment extends AllEpisodesFragment { super(true, 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(); @@ -55,18 +80,30 @@ public class NewEpisodesFragment extends AllEpisodesFragment { } }); - undoBarController = new UndoBarController(root.findViewById(R.id.undobar), new UndoBarController.UndoListener() { + undoBarController = new UndoBarController<FeedItemUndoToken>(root.findViewById(R.id.undobar), new UndoBarController.UndoListener<FeedItemUndoToken>() { + + private final Context context = getActivity(); + @Override - public void onUndo(Parcelable token) { - // Perform the undo - FeedItemUndoToken undoToken = (FeedItemUndoToken) token; + public void onUndo(FeedItemUndoToken token) { if (token != null) { - long itemId = undoToken.getFeedItemId(); - int position = undoToken.getPosition(); - DBWriter.markItemRead(getActivity(), itemId, false); + long itemId = token.getFeedItemId(); + DBWriter.markItemRead(context, itemId, false); + } + } + @Override + public void onHide(FeedItemUndoToken token) { + if (token != null && context != null) { + long itemId = token.getFeedItemId(); + FeedItem item = DBReader.getFeedItem(context, itemId); + FeedMedia media = item.getMedia(); + if(media != null && media.hasAlmostEnded() && UserPreferences.isAutoDelete()) { + DBWriter.deleteFeedMediaOfItem(context, media.getId()); + } } } }); return root; } + } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java index 9002227d6..9099829d8 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -7,7 +7,9 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ListFragment; +import android.support.v4.util.Pair; import android.support.v4.view.MenuItemCompat; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -25,20 +27,22 @@ import de.danoeh.antennapod.core.asynctask.DownloadObserver; import de.danoeh.antennapod.core.feed.EventDistributor; 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.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.core.util.QueueAccess; -import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; +import de.danoeh.antennapod.core.util.LongList; +import de.greenrobot.event.EventBus; public class PlaybackHistoryFragment extends ListFragment { - private static final String TAG = "PlaybackHistoryFragment"; + + public static final String TAG = "PlaybackHistoryFragment"; + private static final int EVENTS = EventDistributor.PLAYBACK_HISTORY_UPDATE | EventDistributor.PLAYER_STATUS_UPDATE; private List<FeedItem> playbackHistory; - private QueueAccess queue; + private LongList queue; private FeedItemlistAdapter adapter; private boolean itemsLoaded = false; @@ -66,12 +70,14 @@ public class PlaybackHistoryFragment extends ListFragment { public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); } @Override public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); stopItemLoader(); } @@ -133,7 +139,7 @@ public class PlaybackHistoryFragment extends ListFragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { MenuItem clearHistory = menu.add(Menu.NONE, R.id.clear_history_item, Menu.CATEGORY_CONTAINER, R.string.clear_history_label); MenuItemCompat.setShowAsAction(clearHistory, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); TypedArray drawables = getActivity().obtainStyledAttributes(new int[]{R.attr.content_discard}); @@ -145,7 +151,7 @@ public class PlaybackHistoryFragment extends ListFragment { @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { MenuItem menuItem = menu.findItem(R.id.clear_history_item); if (menuItem != null) { menuItem.setVisible(playbackHistory != null && !playbackHistory.isEmpty()); @@ -168,6 +174,11 @@ public class PlaybackHistoryFragment extends ListFragment { } } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + startItemLoader(); + } + private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { @Override @@ -215,6 +226,11 @@ public class PlaybackHistoryFragment extends ListFragment { } @Override + public boolean isNew(FeedItem item) { + return false; + } + + @Override public int getItemDownloadProgressPercent(FeedItem item) { if (downloaderList != null) { for (Downloader downloader : downloaderList) { @@ -254,27 +270,27 @@ public class PlaybackHistoryFragment extends ListFragment { } } - private class ItemLoader extends AsyncTask<Void, Void, Object[]> { + private class ItemLoader extends AsyncTask<Void, Void, Pair<List<FeedItem>,LongList>> { @Override - protected Object[] doInBackground(Void... params) { + protected Pair<List<FeedItem>,LongList> doInBackground(Void... params) { Context context = activity.get(); if (context != null) { - List<FeedItem> ph = DBReader.getPlaybackHistory(context); - DBReader.loadFeedDataOfFeedItemlist(context, ph); - return new Object[]{ph, - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + List<FeedItem> history = DBReader.getPlaybackHistory(context); + LongList queue = DBReader.getQueueIDList(context); + DBReader.loadFeedDataOfFeedItemlist(context, history); + return Pair.create(history, queue); } else { return null; } } @Override - protected void onPostExecute(Object[] res) { + protected void onPostExecute(Pair<List<FeedItem>,LongList> res) { super.onPostExecute(res); if (res != null) { - playbackHistory = (List<FeedItem>) res[0]; - queue = (QueueAccess) res[1]; + playbackHistory = res.first; + queue = res.second; itemsLoaded = true; if (viewsCreated) { onFragmentLoaded(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 70a231cad..d82c7b8f7 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -7,8 +7,8 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; -import android.os.Parcelable; import android.support.v4.app.Fragment; +import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.util.Log; import android.view.ContextMenu; @@ -21,6 +21,7 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ProgressBar; import android.widget.TextView; +import android.widget.Toast; import com.mobeta.android.dslv.DragSortListView; @@ -37,26 +38,32 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; 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.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.QueueSorter; import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken; import de.danoeh.antennapod.core.util.gui.UndoBarController; +import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; +import de.greenrobot.event.EventBus; /** * Shows all items in the queue */ public class QueueFragment extends Fragment { - private static final String TAG = "QueueFragment"; + + public static final String TAG = "QueueFragment"; + private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | - EventDistributor.QUEUE_UPDATE | EventDistributor.PLAYER_STATUS_UPDATE; private DragSortListView listView; @@ -64,7 +71,9 @@ public class QueueFragment extends Fragment { private TextView txtvEmpty; private ProgressBar progLoading; - private UndoBarController undoBarController; + private ContextMenu contextMenu; + + private UndoBarController<FeedItemUndoToken> undoBarController; private List<FeedItem> queue; private List<Downloader> downloaderList; @@ -104,6 +113,7 @@ public class QueueFragment extends Fragment { public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); this.activity.set((MainActivity) getActivity()); if (downloadObserver != null) { downloadObserver.setActivity(getActivity()); @@ -124,7 +134,11 @@ public class QueueFragment extends Fragment { public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); stopItemLoader(); + if(undoBarController.isShowing()) { + undoBarController.close(); + } } @Override @@ -133,6 +147,15 @@ public class QueueFragment extends Fragment { this.activity.set((MainActivity) activity); } + public void onEventMainThread(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + if(event.action == QueueEvent.Action.REMOVED) { + undoBarController.showUndoBar(false, getString(R.string.removed_from_queue), + new FeedItemUndoToken(event.item, event.position)); + } + startItemLoader(); + } + private void saveScrollPosition() { SharedPreferences prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); @@ -185,11 +208,12 @@ public class QueueFragment extends Fragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { inflater.inflate(R.menu.queue, menu); - final SearchView sv = new SearchView(getActivity()); - MenuItemUtils.addSearchItem(menu, sv); + MenuItem searchItem = menu.findItem(R.id.action_search); + final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + MenuItemUtils.adjustTextColor(getActivity(), sv); sv.setQueryHint(getString(R.string.search_hint)); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override @@ -204,6 +228,9 @@ public class QueueFragment extends Fragment { return false; } }); + + MenuItemUtils.refreshLockItem(getActivity(), menu); + isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } } @@ -212,6 +239,17 @@ public class QueueFragment extends Fragment { public boolean onOptionsItemSelected(MenuItem item) { if (!super.onOptionsItemSelected(item)) { switch (item.getItemId()) { + case R.id.queue_lock: + boolean locked = !UserPreferences.isQueueLocked(); + if(locked) { + listView.setDragEnabled(false); + } else { + listView.setDragEnabled(true); + } + UserPreferences.setQueueLocked(locked); + getActivity().supportInvalidateOptionsMenu(); + listAdapter.setLocked(locked); + return true; case R.id.refresh_item: List<Feed> feeds = ((MainActivity) getActivity()).getFeeds(); if (feeds != null) { @@ -260,6 +298,19 @@ public class QueueFragment extends Fragment { } + private final FeedItemMenuHandler.MenuInterface contextMenuInterface = new FeedItemMenuHandler.MenuInterface() { + @Override + public void setItemVisibility(int id, boolean visible) { + if(contextMenu == null) { + return; + } + MenuItem item = contextMenu.findItem(id); + if (item != null) { + item.setVisible(visible); + } + } + }; + @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); @@ -273,8 +324,12 @@ public class QueueFragment extends Fragment { menu.setHeaderTitle(item.getTitle()); } - menu.findItem(R.id.move_to_top_item).setEnabled(!queue.isEmpty() && queue.get(0) != item); - menu.findItem(R.id.move_to_bottom_item).setEnabled(!queue.isEmpty() && queue.get(queue.size() - 1) != item); + contextMenu = menu; + LongList queueIds = new LongList(queue.size()); + for(FeedItem queueItem : queue) { + queueIds.add(queueItem.getId()); + } + FeedItemMenuHandler.onPrepareMenu(contextMenuInterface, item, true, queueIds); } @Override @@ -287,21 +342,16 @@ public class QueueFragment extends Fragment { return super.onContextItemSelected(item); } - switch (item.getItemId()) { - case R.id.move_to_top_item: - DBWriter.moveQueueItemToTop(getActivity(), selectedItem.getId(), true); - return true; - case R.id.move_to_bottom_item: - DBWriter.moveQueueItemToBottom(getActivity(), selectedItem.getId(), true); - return true; - case R.id.remove_from_queue_item: - DBWriter.removeQueueItem(getActivity(), selectedItem.getId(), false); - return true; - default: - return super.onContextItemSelected(item); + try { + return FeedItemMenuHandler.onMenuItemClicked(getActivity(), item.getItemId(), selectedItem); + } catch (DownloadRequestException e) { + e.printStackTrace(); + Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show(); + return true; } } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); @@ -313,6 +363,12 @@ public class QueueFragment extends Fragment { progLoading = (ProgressBar) root.findViewById(R.id.progLoading); listView.setEmptyView(txtvEmpty); + if(UserPreferences.isQueueLocked()) { + listView.setDragEnabled(false); + } else { + listView.setDragEnabled(true); + } + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @@ -343,30 +399,40 @@ public class QueueFragment extends Fragment { @Override public void remove(int which) { - Log.d(TAG, "remove("+which+")"); + Log.d(TAG, "remove(" + which + ")"); stopItemLoader(); FeedItem item = (FeedItem) listView.getAdapter().getItem(which); - DBWriter.removeQueueItem(getActivity(), item.getId(), true); - undoBarController.showUndoBar(false, - getString(R.string.removed_from_queue), new FeedItemUndoToken(item, - which) - ); + DBWriter.removeQueueItem(getActivity(), item, true); } }); - undoBarController = new UndoBarController(root.findViewById(R.id.undobar), new UndoBarController.UndoListener() { - @Override - public void onUndo(Parcelable token) { - // Perform the undo - FeedItemUndoToken undoToken = (FeedItemUndoToken) token; - if (token != null) { - long itemId = undoToken.getFeedItemId(); - int position = undoToken.getPosition(); - DBWriter.addQueueItemAt(getActivity(), itemId, position, false); - } - } - }); + 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(); + int position = token.getPosition(); + DBWriter.addQueueItemAt(context, itemId, position, false); + } + } + @Override + public void onHide(FeedItemUndoToken token) { + if (token != null && context != null) { + long itemId = token.getFeedItemId(); + FeedItem item = DBReader.getFeedItem(context, itemId); + FeedMedia media = item.getMedia(); + if(media != null && media.hasAlmostEnded() && UserPreferences.isAutoDelete()) { + DBWriter.deleteFeedMediaOfItem(context, media.getId()); + } + } + } + + }); registerForContextMenu(listView); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java index f578d4338..b1b61f74b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java @@ -5,15 +5,21 @@ import android.os.Handler; import android.support.v4.app.ListFragment; import android.view.View; import android.widget.ListView; +import android.widget.Toast; + +import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.DownloadlistAdapter; import de.danoeh.antennapod.core.asynctask.DownloadObserver; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.Downloader; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequester; -import java.util.List; - /** * Displays all running downloads and provides actions to cancel them */ @@ -73,7 +79,17 @@ public class RunningDownloadsFragment extends ListFragment { @Override public void onSecondaryActionClick(Downloader downloader) { - DownloadRequester.getInstance().cancelDownload(getActivity(), downloader.getDownloadRequest().getSource()); + DownloadRequest downloadRequest = downloader.getDownloadRequest(); + DownloadRequester.getInstance().cancelDownload(getActivity(), downloadRequest.getSource()); + + if(downloadRequest.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA && + UserPreferences.isEnableAutodownload()) { + FeedMedia media = DBReader.getFeedMedia(getActivity(), downloadRequest.getFeedfileId()); + DBWriter.setFeedItemAutoDownload(getActivity(), media.getItem(), false); + Toast.makeText(getActivity(), R.string.download_canceled_autodownload_enabled_msg, Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(getActivity(), R.string.download_canceled_msg, Toast.LENGTH_SHORT).show(); + } } }; } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index cf96bb094..fc6225409 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -13,6 +13,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.ListView; +import java.util.Collections; import java.util.List; import de.danoeh.antennapod.R; @@ -23,11 +24,7 @@ import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedComponent; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.SearchResult; -import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.FeedSearcher; -import de.danoeh.antennapod.core.util.QueueAccess; -import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; /** * Performs a search operation on all feeds or one specific feed and displays the search result. @@ -44,8 +41,6 @@ public class SearchFragment extends ListFragment { private boolean viewCreated = false; private boolean itemsLoaded = false; - private QueueAccess queue; - /** * Create a new SearchFragment that searches all feeds. */ @@ -125,7 +120,7 @@ public class SearchFragment extends ListFragment { SearchResult result = (SearchResult) l.getAdapter().getItem(position); FeedComponent comp = result.getComponent(); if (comp.getClass() == Feed.class) { - ((MainActivity) getActivity()).loadFeedFragment(comp.getId()); + ((MainActivity) getActivity()).loadFeedFragmentById(comp.getId()); } else { if (comp.getClass() == FeedItem.class) { FeedItem item = (FeedItem) comp; @@ -137,7 +132,7 @@ public class SearchFragment extends ListFragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + if (itemsLoaded) { MenuItem item = menu.add(Menu.NONE, R.id.search_item, Menu.NONE, R.string.search_label); MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); final SearchView sv = new SearchView(getActivity()); @@ -165,8 +160,7 @@ public class SearchFragment extends ListFragment { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & (EventDistributor.UNREAD_ITEMS_UPDATE - | EventDistributor.DOWNLOAD_HANDLED - | EventDistributor.QUEUE_UPDATE)) != 0) { + | EventDistributor.DOWNLOAD_HANDLED)) != 0) { startSearchTask(); } } @@ -209,17 +203,16 @@ public class SearchFragment extends ListFragment { } } - private class SearchTask extends AsyncTask<Bundle, Void, Object[]> { + private class SearchTask extends AsyncTask<Bundle, Void, List<SearchResult>> { @Override - protected Object[] doInBackground(Bundle... params) { + protected List<SearchResult> doInBackground(Bundle... params) { String query = params[0].getString(ARG_QUERY); long feed = params[0].getLong(ARG_FEED); Context context = getActivity(); if (context != null) { - return new Object[]{FeedSearcher.performSearch(context, query, feed), - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + return FeedSearcher.performSearch(context, query, feed); } else { - return null; + return Collections.emptyList(); } } @@ -232,12 +225,11 @@ public class SearchFragment extends ListFragment { } @Override - protected void onPostExecute(Object[] results) { + protected void onPostExecute(List<SearchResult> results) { super.onPostExecute(results); if (results != null) { itemsLoaded = true; - searchResults = (List<SearchResult>) results[0]; - queue = (QueueAccess) results[1]; + searchResults = results; if (viewCreated) { onFragmentLoaded(); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java index 45b2403c8..55d4b940f 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java @@ -31,8 +31,8 @@ public class GpodnetMainFragment extends Fragment { private static final int NUM_PAGES = 2; - private static final int POS_TAGS = 0; - private static final int POS_TOPLIST = 1; + private static final int POS_TOPLIST = 0; + private static final int POS_TAGS = 1; private static final int POS_SUGGESTIONS = 2; Resources resources; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java index 15a0b55b1..6139a4901 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java @@ -5,11 +5,23 @@ import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.widget.SearchView; import android.util.Log; -import android.view.*; -import android.widget.*; +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 android.widget.AdapterView; +import android.widget.Button; +import android.widget.GridView; +import android.widget.ProgressBar; +import android.widget.TextView; + +import java.util.List; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.DefaultOnlineFeedViewActivity; import de.danoeh.antennapod.activity.MainActivity; @@ -19,14 +31,12 @@ import de.danoeh.antennapod.core.gpoddernet.GpodnetService; import de.danoeh.antennapod.core.gpoddernet.GpodnetServiceException; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetPodcast; import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; - -import java.util.List; /** * Displays a list of GPodnetPodcast-Objects in a GridView */ public abstract class PodcastListFragment extends Fragment { + private static final String TAG = "PodcastListFragment"; private GridView gridView; @@ -43,24 +53,24 @@ public abstract class PodcastListFragment extends Fragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - if (!MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { - final android.support.v7.widget.SearchView sv = new android.support.v7.widget.SearchView(getActivity()); - MenuItemUtils.addSearchItem(menu, sv); - sv.setQueryHint(getString(R.string.gpodnet_search_hint)); - sv.setOnQueryTextListener(new android.support.v7.widget.SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String s) { - sv.clearFocus(); - ((MainActivity) getActivity()).loadChildFragment(SearchListFragment.newInstance(s)); - return true; - } + inflater.inflate(R.menu.gpodder_podcasts, menu); + MenuItem searchItem = menu.findItem(R.id.action_search); + final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + MenuItemUtils.adjustTextColor(getActivity(), sv); + sv.setQueryHint(getString(R.string.gpodnet_search_hint)); + sv.setOnQueryTextListener(new android.support.v7.widget.SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String s) { + sv.clearFocus(); + ((MainActivity) getActivity()).loadChildFragment(SearchListFragment.newInstance(s)); + return true; + } - @Override - public boolean onQueryTextChange(String s) { - return false; - } - }); - } + @Override + public boolean onQueryTextChange(String s) { + return false; + } + }); } @Override @@ -90,7 +100,7 @@ public abstract class PodcastListFragment extends Fragment { } protected void onPodcastSelected(GpodnetPodcast selection) { - if (BuildConfig.DEBUG) Log.d(TAG, "Selected podcast: " + selection.toString()); + Log.d(TAG, "Selected podcast: " + selection.toString()); Intent intent = new Intent(getActivity(), DefaultOnlineFeedViewActivity.class); intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, selection.getUrl()); intent.putExtra(DefaultOnlineFeedViewActivity.ARG_TITLE, getString(R.string.gpodnet_main_label)); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/SearchListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/SearchListFragment.java index 635842196..613e06805 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/SearchListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/SearchListFragment.java @@ -1,9 +1,11 @@ package de.danoeh.antennapod.fragment.gpodnet; import android.os.Bundle; +import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuInflater; +import android.view.MenuItem; import org.apache.commons.lang3.Validate; @@ -14,7 +16,6 @@ import de.danoeh.antennapod.core.gpoddernet.GpodnetService; import de.danoeh.antennapod.core.gpoddernet.GpodnetServiceException; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetPodcast; import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; /** * Performs a search on the gpodder.net directory and displays the results. @@ -45,25 +46,26 @@ public class SearchListFragment extends PodcastListFragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - final SearchView sv = new SearchView(getActivity()); - if (!MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { - MenuItemUtils.addSearchItem(menu, sv); - sv.setQueryHint(getString(R.string.gpodnet_search_hint)); - sv.setQuery(query, false); - sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String s) { - sv.clearFocus(); - changeQuery(s); - return true; - } + super.onCreateOptionsMenu(menu, inflater); + // parent already inflated menu + MenuItem searchItem = menu.findItem(R.id.action_search); + final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + MenuItemUtils.adjustTextColor(getActivity(), sv); + sv.setQueryHint(getString(R.string.gpodnet_search_hint)); + sv.setQuery(query, false); + sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String s) { + sv.clearFocus(); + changeQuery(s); + return true; + } - @Override - public boolean onQueryTextChange(String s) { - return false; - } - }); - } + @Override + public boolean onQueryTextChange(String s) { + return false; + } + }); } @Override diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java index cc87407b4..5bd567a2f 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java @@ -5,9 +5,11 @@ import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ListFragment; +import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.TextView; @@ -21,9 +23,9 @@ import de.danoeh.antennapod.core.gpoddernet.GpodnetService; import de.danoeh.antennapod.core.gpoddernet.GpodnetServiceException; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetTag; import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; public class TagListFragment extends ListFragment { + private static final String TAG = "TagListFragment"; private static final int COUNT = 50; @@ -36,27 +38,27 @@ public class TagListFragment extends ListFragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - if (!MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { - final SearchView sv = new SearchView(getActivity()); - MenuItemUtils.addSearchItem(menu, sv); - sv.setQueryHint(getString(R.string.gpodnet_search_hint)); - sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String s) { - Activity activity = getActivity(); - if (activity != null) { - sv.clearFocus(); - ((MainActivity) activity).loadChildFragment(SearchListFragment.newInstance(s)); - } - return true; + inflater.inflate(R.menu.gpodder_podcasts, menu); + MenuItem searchItem = menu.findItem(R.id.action_search); + final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + MenuItemUtils.adjustTextColor(getActivity(), sv); + sv.setQueryHint(getString(R.string.gpodnet_search_hint)); + sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String s) { + Activity activity = getActivity(); + if (activity != null) { + sv.clearFocus(); + ((MainActivity) activity).loadChildFragment(SearchListFragment.newInstance(s)); } + return true; + } - @Override - public boolean onQueryTextChange(String s) { - return false; - } - }); - } + @Override + public boolean onQueryTextChange(String s) { + return false; + } + }); } @Override |