From 85778b4aaa4a4cd2ae7fde80bb01afdc3632d123 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 30 Jan 2015 10:40:15 -0500 Subject: Added option to empty/clear the queue. Used the word 'clear' because it seems more active than 'empty'. For issue #593 --- app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java | 3 +++ 1 file changed, 3 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 ca8543b4c..e71c425e0 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -175,6 +175,9 @@ public class QueueFragment extends Fragment { DBTasks.refreshAllFeeds(getActivity(), feeds); } return true; + case R.id.clear_queue: + DBWriter.clearQueue(getActivity()); + return true; case R.id.queue_sort_alpha_asc: QueueSorter.sort(getActivity(), QueueSorter.Rule.ALPHA_ASC, true); return true; -- cgit v1.2.3 From 2bea83706b37c7fe5d4b687236aaad4ccca6a0c9 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 30 Jan 2015 12:55:38 -0500 Subject: added confirmation when clearing the queue. for issue #593 --- .../de/danoeh/antennapod/fragment/QueueFragment.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 e71c425e0..913b544a5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -2,8 +2,8 @@ package de.danoeh.antennapod.fragment; import android.app.Activity; import android.content.Context; +import android.content.DialogInterface; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; @@ -30,6 +30,7 @@ import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.DefaultActionButtonCallback; import de.danoeh.antennapod.adapter.QueueListAdapter; import de.danoeh.antennapod.core.asynctask.DownloadObserver; +import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; @@ -176,7 +177,19 @@ public class QueueFragment extends Fragment { } return true; case R.id.clear_queue: - DBWriter.clearQueue(getActivity()); + // make sure the user really wants to clear the queue + ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(), + R.string.clear_queue_label, + R.string.clear_queue_confirmation_msg) { + + @Override + public void onConfirmButtonPressed( + DialogInterface dialog) { + dialog.dismiss(); + DBWriter.clearQueue(getActivity()); + } + }; + conDialog.createNewDialog().show(); return true; case R.id.queue_sort_alpha_asc: QueueSorter.sort(getActivity(), QueueSorter.Rule.ALPHA_ASC, true); -- cgit v1.2.3 From 49c714a5a5720eb2abb42f178088475084b41031 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 30 Jan 2015 13:06:32 -0500 Subject: added confirmation dialog when marking all episodes as read. #596 --- .../danoeh/antennapod/fragment/NewEpisodesFragment.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 d97ede0ef..24991144e 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -2,6 +2,7 @@ package de.danoeh.antennapod.fragment; import android.app.Activity; import android.content.Context; +import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; @@ -29,6 +30,7 @@ import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.DefaultActionButtonCallback; import de.danoeh.antennapod.adapter.NewEpisodesListAdapter; import de.danoeh.antennapod.core.asynctask.DownloadObserver; +import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; @@ -190,8 +192,19 @@ public class NewEpisodesFragment extends Fragment { } return true; case R.id.mark_all_read_item: - DBWriter.markAllItemsRead(getActivity()); - Toast.makeText(getActivity(), R.string.mark_all_read_msg, Toast.LENGTH_SHORT).show(); + ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(), + R.string.mark_all_read_label, + R.string.mark_all_read_confirmation_msg) { + + @Override + public void onConfirmButtonPressed( + DialogInterface dialog) { + dialog.dismiss(); + DBWriter.markAllItemsRead(getActivity()); + Toast.makeText(getActivity(), R.string.mark_all_read_msg, Toast.LENGTH_SHORT).show(); + } + }; + conDialog.createNewDialog().show(); return true; case R.id.episode_filter_item: boolean newVal = !item.isChecked(); -- cgit v1.2.3 From 8f9c9c8d3bb63a2257ad710ec4283d47c3df8bc9 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 28 Feb 2015 19:23:39 +0100 Subject: Add ability to clear the download log, as requested in AntennaPod/AntennaPod#506 --- .../antennapod/fragment/DownloadLogFragment.java | 52 ++++++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 c40fce351..0f6f7d53c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -1,25 +1,35 @@ package de.danoeh.antennapod.fragment; import android.content.Context; +import android.content.res.TypedArray; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ListFragment; +import android.support.v4.view.MenuItemCompat; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.widget.ListView; +import java.util.List; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.DownloadLogAdapter; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DBReader; - -import java.util.List; +import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.menuhandler.MenuItemUtils; +import de.danoeh.antennapod.menuhandler.NavDrawerActivity; /** * Shows the download log */ public class DownloadLogFragment extends ListFragment { + private static final String TAG = "DownloadLogFragment"; + private List downloadLog; private DownloadLogAdapter adapter; @@ -29,6 +39,7 @@ public class DownloadLogFragment extends ListFragment { @Override public void onStart() { super.onStart(); + setHasOptionsMenu(true); EventDistributor.getInstance().register(contentUpdate); startItemLoader(); } @@ -63,7 +74,7 @@ public class DownloadLogFragment extends ListFragment { } setListShown(true); adapter.notifyDataSetChanged(); - + getActivity().supportInvalidateOptionsMenu(); } private DownloadLogAdapter.ItemAccess itemAccess = new DownloadLogAdapter.ItemAccess() { @@ -105,6 +116,41 @@ public class DownloadLogFragment extends ListFragment { } } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + 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}); + clearHistory.setIcon(drawables.getDrawable(0)); + drawables.recycle(); + } + } + + @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()); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (!super.onOptionsItemSelected(item)) { + switch (item.getItemId()) { + case R.id.clear_history_item: + DBWriter.clearDownloadLog(getActivity()); + return true; + default: + return false; + } + } else { + return true; + } + } + private class ItemLoader extends AsyncTask> { @Override -- cgit v1.2.3 From 83090581889ea62e39a79b7c0ca53b15f65a91d4 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 2 Mar 2015 16:36:18 +0100 Subject: Persist scroll position in Queue view --- .../danoeh/antennapod/fragment/QueueFragment.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 913b544a5..ebfe03382 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -3,6 +3,7 @@ package de.danoeh.antennapod.fragment; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; +import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; @@ -66,6 +67,10 @@ public class QueueFragment extends Fragment { private boolean viewsCreated = false; private boolean isUpdatingFeeds = false; + private static final String PREFS = "QueueFragment"; + private static final String PREF_KEY_LIST_TOP = "list_top"; + private static final String PREF_KEY_LIST_SELECTION = "list_selection"; + private AtomicReference activity = new AtomicReference(); private DownloadObserver downloadObserver = null; @@ -103,6 +108,18 @@ public class QueueFragment extends Fragment { } } + @Override + public void onPause() { + super.onPause(); + SharedPreferences prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + View v = listView.getChildAt(0); + int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop()); + editor.putInt(PREF_KEY_LIST_SELECTION, listView.getFirstVisiblePosition()); + editor.putInt(PREF_KEY_LIST_TOP, top); + editor.commit(); + } + @Override public void onStop() { super.onStop(); @@ -329,6 +346,11 @@ public class QueueFragment extends Fragment { } listAdapter.notifyDataSetChanged(); + SharedPreferences prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); + int listSelection = prefs.getInt(PREF_KEY_LIST_SELECTION, 0); + int top = prefs.getInt(PREF_KEY_LIST_TOP, 0); + listView.setSelectionFromTop(listSelection, top); + // we need to refresh the options menu because it sometimes // needs data that may have just been loaded. getActivity().supportInvalidateOptionsMenu(); -- cgit v1.2.3 From dcada04621fb79c3c236152629fab9f0e90d5712 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sun, 1 Mar 2015 16:35:23 +0100 Subject: Delete items from the queue by swiping --- app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 913b544a5..49129c999 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -301,6 +301,10 @@ public class QueueFragment extends Fragment { @Override public void remove(int which) { + Log.d(TAG, "remove("+which+")"); + final FeedItem item = queue.remove(which); + DBWriter.removeQueueItem(getActivity(), item.getId(), false); + listAdapter.notifyDataSetChanged(); } }); -- cgit v1.2.3 From 6c81f6c868971fc343cfa49d54927dd845a39ede Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Wed, 4 Mar 2015 10:41:40 +0100 Subject: MERGE stash. --- .../danoeh/antennapod/fragment/QueueFragment.java | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 49129c999..30238ff51 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -366,6 +366,33 @@ public class QueueFragment extends Fragment { return (itemsLoaded) ? queue.get(position) : null; } + @Override + public long getItemDownloadedBytes(FeedItem item) { + if (downloaderList != null) { + for (Downloader downloader : downloaderList) { + if (downloader.getDownloadRequest().getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA + && downloader.getDownloadRequest().getFeedfileId() == item.getMedia().getId()) { + Log.d(TAG, "downloaded bytes: " + downloader.getDownloadRequest().getSoFar()); + return downloader.getDownloadRequest().getSoFar(); + } + } + } + return 0; + } + + @Override + public long getItemDownloadSize(FeedItem item) { + if (downloaderList != null) { + for (Downloader downloader : downloaderList) { + if (downloader.getDownloadRequest().getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA + && downloader.getDownloadRequest().getFeedfileId() == item.getMedia().getId()) { + Log.d(TAG, "downloaded size: " + downloader.getDownloadRequest().getSize()); + return downloader.getDownloadRequest().getSize(); + } + } + } + return 0; + } @Override public int getItemDownloadProgressPercent(FeedItem item) { if (downloaderList != null) { -- cgit v1.2.3 From 9444f266730b4b2b2a064a3d2557962d5db16a5f Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Wed, 4 Mar 2015 14:34:35 +0100 Subject: Show UndoBar when dismiss-by-swipe --- .../danoeh/antennapod/fragment/QueueFragment.java | 30 +++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 30238ff51..62a01d0ad 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -6,6 +6,7 @@ import android.content.DialogInterface; 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.v7.widget.SearchView; import android.util.Log; @@ -42,6 +43,8 @@ import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequester; 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.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; @@ -59,6 +62,8 @@ public class QueueFragment extends Fragment { private TextView txtvEmpty; private ProgressBar progLoading; + private UndoBarController undoBarController; + private List queue; private List downloaderList; @@ -120,6 +125,7 @@ public class QueueFragment extends Fragment { unregisterForContextMenu(listView); listAdapter = null; activity.set(null); + undoBarController = null; viewsCreated = false; blockDownloadObserverUpdate = false; if (downloadObserver != null) { @@ -302,12 +308,30 @@ public class QueueFragment extends Fragment { @Override public void remove(int which) { Log.d(TAG, "remove("+which+")"); - final FeedItem item = queue.remove(which); - DBWriter.removeQueueItem(getActivity(), item.getId(), false); - listAdapter.notifyDataSetChanged(); + 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) + ); } }); + 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); + } + } + }); + + registerForContextMenu(listView); if (!itemsLoaded) { -- cgit v1.2.3 From 2ce366da6418dfed08447cf100fd8af39345bcea Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 5 Mar 2015 09:42:46 +0100 Subject: Show duration and pubDate on episode display ... which was - despite the commit message - missing from last commit... --- .../java/de/danoeh/antennapod/fragment/ItemFragment.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 ac9e744ed..e80bf5f14 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -16,6 +16,7 @@ import android.support.v4.util.Pair; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.Toolbar; import android.text.TextUtils; +import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -49,6 +50,7 @@ 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.Converter; import de.danoeh.antennapod.core.util.QueueAccess; import de.danoeh.antennapod.core.util.playback.Timeline; import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; @@ -91,6 +93,8 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba private View header; private WebView webvDescription; private TextView txtvTitle; + private TextView txtvDuration; + private TextView txtvPublished; private ImageView imgvCover; private ProgressBar progbarDownload; private ProgressBar progbarLoading; @@ -166,6 +170,8 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba header = inflater.inflate(R.layout.feeditem_fragment_header, toolbar, false); root = (ViewGroup) layout.findViewById(R.id.content_root); txtvTitle = (TextView) header.findViewById(R.id.txtvTitle); + txtvDuration = (TextView) header.findViewById(R.id.txtvDuration); + txtvPublished = (TextView) header.findViewById(R.id.txtvPublished); if (Build.VERSION.SDK_INT >= 14) { // ellipsize is causing problems on old versions, see #448 txtvTitle.setEllipsize(TextUtils.TruncateAt.END); } @@ -313,6 +319,8 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba private void updateAppearance() { txtvTitle.setText(item.getTitle()); + txtvPublished.setText(DateUtils.formatDateTime(getActivity(), item.getPubDate().getTime(), DateUtils.FORMAT_ABBREV_ALL)); + Picasso.with(getActivity()).load(item.getImageUri()) .fit() .into(imgvCover); @@ -348,7 +356,10 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba } drawables.recycle(); - } else { + } else {if(media.getDuration() > 0) { + txtvDuration.setText(Converter.getDurationStringLong(media.getDuration())); + } + boolean isDownloading = DownloadRequester.getInstance().isDownloadingFile(media); TypedArray drawables = getActivity().obtainStyledAttributes(new int[]{R.attr.av_play, R.attr.av_download, R.attr.action_stream, R.attr.content_discard, R.attr.navigation_cancel}); -- cgit v1.2.3 From d3e1fcdcba3a5f9dabbceb30686101ae74251e6e Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 6 Mar 2015 16:41:28 +0100 Subject: Fix for false restore where swipe to dismiss scrolls to the top of the list --- .../danoeh/antennapod/fragment/QueueFragment.java | 37 +++++++++++++++------- 1 file changed, 26 insertions(+), 11 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 3e60f1af0..da33c6ea3 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -116,13 +116,7 @@ public class QueueFragment extends Fragment { @Override public void onPause() { super.onPause(); - SharedPreferences prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = prefs.edit(); - View v = listView.getChildAt(0); - int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop()); - editor.putInt(PREF_KEY_LIST_SELECTION, listView.getFirstVisiblePosition()); - editor.putInt(PREF_KEY_LIST_TOP, top); - editor.commit(); + saveScrollPosition(); } @Override @@ -138,6 +132,30 @@ public class QueueFragment extends Fragment { this.activity.set((MainActivity) activity); } + private void saveScrollPosition() { + SharedPreferences prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + View v = listView.getChildAt(0); + int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop()); + editor.putInt(PREF_KEY_LIST_SELECTION, listView.getFirstVisiblePosition()); + editor.putInt(PREF_KEY_LIST_TOP, top); + editor.commit(); + } + + private void restoreScrollPosition() { + SharedPreferences prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); + int listSelection = prefs.getInt(PREF_KEY_LIST_SELECTION, 0); + int top = prefs.getInt(PREF_KEY_LIST_TOP, 0); + if(listSelection > 0 || top > 0) { + listView.setSelectionFromTop(listSelection, top); + // restore once, then forget + SharedPreferences.Editor editor = prefs.edit(); + editor.putInt(PREF_KEY_LIST_SELECTION, 0); + editor.putInt(PREF_KEY_LIST_TOP, 0); + editor.commit(); + } + } + private void resetViewState() { unregisterForContextMenu(listView); listAdapter = null; @@ -374,10 +392,7 @@ public class QueueFragment extends Fragment { } listAdapter.notifyDataSetChanged(); - SharedPreferences prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); - int listSelection = prefs.getInt(PREF_KEY_LIST_SELECTION, 0); - int top = prefs.getInt(PREF_KEY_LIST_TOP, 0); - listView.setSelectionFromTop(listSelection, top); + restoreScrollPosition(); // we need to refresh the options menu because it sometimes // needs data that may have just been loaded. -- cgit v1.2.3 From 24e0db1cdef2d6bb84f489bc26be66d83449aadd Mon Sep 17 00:00:00 2001 From: Ercan Erden Date: Tue, 24 Feb 2015 04:21:11 -0500 Subject: Add ability to search iTunes for podcasts --- .../antennapod/fragment/AddFeedFragment.java | 10 +- .../antennapod/fragment/ItunesSearchFragment.java | 193 +++++++++++++++++++++ 2 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 f5ae5a777..e4ae1683b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java @@ -8,6 +8,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.DefaultOnlineFeedViewActivity; import de.danoeh.antennapod.activity.MainActivity; @@ -41,10 +42,18 @@ public class AddFeedFragment extends Fragment { Button butBrowserGpoddernet = (Button) root.findViewById(R.id.butBrowseGpoddernet); Button butOpmlImport = (Button) root.findViewById(R.id.butOpmlImport); Button butConfirm = (Button) root.findViewById(R.id.butConfirm); + Button butSearchITunes = (Button) root.findViewById(R.id.butSearchItunes); final MainActivity activity = (MainActivity) getActivity(); activity.getMainActivtyActionBar().setTitle(R.string.add_feed_label); + butSearchITunes.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + activity.loadChildFragment(new ItunesSearchFragment()); + } + }); + butBrowserGpoddernet.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -53,7 +62,6 @@ public class AddFeedFragment extends Fragment { }); butOpmlImport.setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { startActivity(new Intent(getActivity(), diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java new file mode 100644 index 000000000..c14b0cc6e --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java @@ -0,0 +1,193 @@ +package de.danoeh.antennapod.fragment; + +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v7.widget.SearchView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.GridView; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +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 static de.danoeh.antennapod.adapter.itunes.ItunesAdapter.*; + +//Searches iTunes store for given string and displays results in a list +public class ItunesSearchFragment extends Fragment { + final String TAG = "ItunesSearchFragment"; + /** + * Search input field + */ + private SearchView searchView; + + /** + * Adapter responsible with the search results + */ + private ItunesAdapter adapter; + + /** + * List of podcasts retreived from the search + */ + private List searchResults; + + /** + * Replace adapter data with provided search results from SearchTask. + * @param result List of Podcast objects containing search results + */ + void updateData(List result) { + this.searchResults = result; + adapter.clear(); + + //ArrayAdapter.addAll() requires minsdk > 10 + for(Podcast p: result) { + adapter.add(p); + } + + adapter.notifyDataSetInvalidated(); + } + + /** + * Constructor + */ + public ItunesSearchFragment() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + adapter = new ItunesAdapter(getActivity(), new ArrayList()); + + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_itunes_search, container, false); + GridView gridView = (GridView) view.findViewById(R.id.gridView); + gridView.setAdapter(adapter); + + //Show information about the podcast when the list item is clicked + gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Intent intent = new Intent(getActivity(), + DefaultOnlineFeedViewActivity.class); + + //Tell the OnlineFeedViewActivity where to go + String url = searchResults.get(position).feedUrl; + intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, url); + + intent.putExtra(DefaultOnlineFeedViewActivity.ARG_TITLE, "iTunes"); + startActivity(intent); + } + }); + + //Configure search input view to be expanded by default with a visible submit button + searchView = (SearchView) view.findViewById(R.id.itunes_search_view); + searchView.setIconifiedByDefault(false); + searchView.setIconified(false); + searchView.setSubmitButtonEnabled(true); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String s) { + //This prevents onQueryTextSubmit() from being called twice when keyboard is used + //to submit the query. + searchView.clearFocus(); + new SearchTask(s).execute(); + return false; + } + + @Override + public boolean onQueryTextChange(String s) { + return false; + } + }); + + return view; + } + + /** + * Search the iTunes store for podcasts using the given query + */ + class SearchTask extends AsyncTask { + /** + * Incomplete iTunes API search URL + */ + final String apiUrl = "https://itunes.apple.com/search?media=podcast&term=%s"; + + /** + * Search terms + */ + final String query; + + /** + * Search result + */ + final List taskData = new ArrayList<>(); + + /** + * Constructor + * + * @param query Search string + */ + public SearchTask(String query){ + this.query = query; + } + + //Get the podcast data + @Override + protected Void doInBackground(Void... params) { + + //Spaces in the query need to be replaced with '+' character. + String formattedUrl = String.format(apiUrl, query).replace(' ', '+'); + + HttpClient client = new DefaultHttpClient(); + HttpGet get = new HttpGet(formattedUrl); + + try { + HttpResponse response = client.execute(get); + String resultString = EntityUtils.toString(response.getEntity()); + JSONObject result = new JSONObject(resultString); + JSONArray j = result.getJSONArray("results"); + + for (int i = 0; i < j.length(); i++){ + JSONObject podcastJson = j.getJSONObject(i); + Podcast podcast = new Podcast(podcastJson); + taskData.add(podcast); + } + + } catch (IOException | JSONException e) { + e.printStackTrace(); + } + return null; + } + + //Save the data and update the list + @Override + protected void onPostExecute(Void aVoid) { + super.onPostExecute(aVoid); + updateData(taskData); + } + } +} -- cgit v1.2.3 From 596462b7a2805748dcae4e80c4ff83200f915d09 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Tue, 17 Mar 2015 12:36:04 +0100 Subject: Gpodder categories shows title instead of tag and additionally the usage --- .../antennapod/fragment/gpodnet/TagFragment.java | 12 ++++++------ .../antennapod/fragment/gpodnet/TagListFragment.java | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java index c8cdbcfed..e2450f03d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java @@ -24,11 +24,11 @@ public class TagFragment extends PodcastListFragment { private GpodnetTag tag; - public static TagFragment newInstance(String tagName) { - Validate.notNull(tagName); + public static TagFragment newInstance(GpodnetTag tag) { + Validate.notNull(tag); TagFragment fragment = new TagFragment(); Bundle args = new Bundle(); - args.putString("tag", tagName); + args.putParcelable("tag", tag); fragment.setArguments(args); return fragment; } @@ -38,14 +38,14 @@ public class TagFragment extends PodcastListFragment { super.onCreate(savedInstanceState); Bundle args = getArguments(); - Validate.isTrue(args != null && args.getString("tag") != null, "args invalid"); - tag = new GpodnetTag(args.getString("tag")); + Validate.isTrue(args != null && args.getParcelable("tag") != null, "args invalid"); + tag = args.getParcelable("tag"); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - ((MainActivity) getActivity()).getMainActivtyActionBar().setTitle(tag.getName()); + ((MainActivity) getActivity()).getMainActivtyActionBar().setTitle(tag.getTitle()); } @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 24e0e4caa..cc87407b4 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 @@ -10,14 +10,13 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.TextView; -import java.util.ArrayList; import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.adapter.gpodnet.TagListAdapter; import de.danoeh.antennapod.core.gpoddernet.GpodnetService; import de.danoeh.antennapod.core.gpoddernet.GpodnetServiceException; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetTag; @@ -67,15 +66,21 @@ public class TagListFragment extends ListFragment { getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - String selectedTag = (String) getListAdapter().getItem(position); + GpodnetTag tag = (GpodnetTag) getListAdapter().getItem(position); MainActivity activity = (MainActivity) getActivity(); - activity.loadChildFragment(TagFragment.newInstance(selectedTag)); + activity.loadChildFragment(TagFragment.newInstance(tag)); } }); startLoadTask(); } + @Override + public void onResume() { + super.onResume(); + ((MainActivity) getActivity()).getMainActivtyActionBar().setTitle(R.string.add_feed_label); + } + @Override public void onDestroyView() { super.onDestroyView(); @@ -121,11 +126,7 @@ public class TagListFragment extends ListFragment { final Context context = getActivity(); if (context != null) { if (gpodnetTags != null) { - List tagNames = new ArrayList(); - for (GpodnetTag tag : gpodnetTags) { - tagNames.add(tag.getName()); - } - setListAdapter(new ArrayAdapter(context, android.R.layout.simple_list_item_1, tagNames)); + setListAdapter(new TagListAdapter(context, android.R.layout.simple_list_item_1, gpodnetTags)); } else if (exception != null) { TextView txtvError = new TextView(getActivity()); txtvError.setText(exception.getMessage()); -- cgit v1.2.3 From 1a63f26de402c45b2fdbadc5887a940273ea2bbc Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Sun, 29 Mar 2015 15:12:20 -0400 Subject: added remove handler for list view. Not working yet because dslv.startDrag returns false unless the list view supports dragging. I'm not sure we want dragging, just fling remove. --- .../antennapod/fragment/NewEpisodesFragment.java | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 24991144e..e96c428fe 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -9,6 +9,7 @@ import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v7.widget.SearchView; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -43,6 +44,7 @@ import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.QueueAccess; +import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; @@ -242,6 +244,34 @@ public class NewEpisodesFragment extends Fragment { } }); + listView.setDragSortListener(new DragSortListView.DragSortListener() { + + @Override + public void drag(int from, int to) { + // no drag + } + + @Override + public void drop(int from, int to) { + // no drop + } + + @Override + public void remove(int which) { + Log.d(TAG, "remove("+which+")"); + stopItemLoader(); + FeedItem item = (FeedItem) listView.getAdapter().getItem(which); + DBWriter.markItemRead(getActivity(), item.getId(), true); + // TODO: provide undo? + /* + undoBarController.showUndoBar(false, + getString(R.string.removed_from_queue), new FeedItemUndoToken(item, + which) + ); + */ + } + }); + final int secondColor = (UserPreferences.getTheme() == R.style.Theme_AntennaPod_Dark) ? R.color.swipe_refresh_secondary_color_dark : R.color.swipe_refresh_secondary_color_light; if (!itemsLoaded) { -- cgit v1.2.3 From 71db0368c45ff6cb7b669982b68fdfefd8606352 Mon Sep 17 00:00:00 2001 From: volhol Date: Tue, 31 Mar 2015 01:33:04 +0200 Subject: Direct play from the the lists Pause/play buttons work; position in media item not always updated yet --- app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java | 3 +++ .../main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java | 3 +++ .../java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java | 3 +++ app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java | 3 +++ 4 files changed, 12 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 5312beeeb..ff68d267d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -296,6 +296,9 @@ public class ItemlistFragment extends ListFragment { updateProgressBarVisibility(); } } + if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { + adapter.notifyDataSetChanged(); + } } }; 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 24991144e..39b72f2e2 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -340,6 +340,9 @@ public class NewEpisodesFragment extends Fragment { getActivity().supportInvalidateOptionsMenu(); } } + if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { + listAdapter.notifyDataSetChanged(); + } } }; 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 f6d2d5d07..96f9742a0 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -171,6 +171,9 @@ public class PlaybackHistoryFragment extends ListFragment { startItemLoader(); getActivity().supportInvalidateOptionsMenu(); } + if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { + adapter.notifyDataSetChanged(); + } } }; 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 da33c6ea3..b48b52514 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -477,6 +477,9 @@ public class QueueFragment extends Fragment { getActivity().supportInvalidateOptionsMenu(); } } + if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { + listAdapter.notifyDataSetChanged(); + } } }; -- cgit v1.2.3 From 247ef778aaa4cbb5acc657c5d501e79ef177a337 Mon Sep 17 00:00:00 2001 From: volhol Date: Wed, 1 Apr 2015 12:47:35 +0200 Subject: Direct play from the the lists position in media item is now updated --- .../main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java | 6 ++---- .../java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java | 6 ++---- .../de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java | 7 +++---- app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java | 6 ++---- 4 files changed, 9 insertions(+), 16 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 ff68d267d..acb07626c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -66,7 +66,8 @@ public class ItemlistFragment extends ListFragment { private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | EventDistributor.QUEUE_UPDATE - | EventDistributor.UNREAD_ITEMS_UPDATE; + | EventDistributor.UNREAD_ITEMS_UPDATE + | EventDistributor.PLAYER_STATUS_UPDATE; public static final String EXTRA_SELECTED_FEEDITEM = "extra.de.danoeh.antennapod.activity.selected_feeditem"; public static final String ARGUMENT_FEED_ID = "argument.de.danoeh.antennapod.feed_id"; @@ -296,9 +297,6 @@ public class ItemlistFragment extends ListFragment { updateProgressBarVisibility(); } } - if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { - adapter.notifyDataSetChanged(); - } } }; 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 39b72f2e2..5cafd370e 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -54,7 +54,8 @@ public class NewEpisodesFragment extends Fragment { private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | EventDistributor.QUEUE_UPDATE | - EventDistributor.UNREAD_ITEMS_UPDATE; + EventDistributor.UNREAD_ITEMS_UPDATE | + EventDistributor.PLAYER_STATUS_UPDATE; private static final int RECENT_EPISODES_LIMIT = 150; private static final String PREF_NAME = "PrefNewEpisodesFragment"; @@ -340,9 +341,6 @@ public class NewEpisodesFragment extends Fragment { getActivity().supportInvalidateOptionsMenu(); } } - if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { - listAdapter.notifyDataSetChanged(); - } } }; 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 96f9742a0..ab38af106 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -34,6 +34,8 @@ import de.danoeh.antennapod.menuhandler.NavDrawerActivity; public class PlaybackHistoryFragment extends ListFragment { private static final String TAG = "PlaybackHistoryFragment"; + private static final int EVENTS = EventDistributor.PLAYBACK_HISTORY_UPDATE | + EventDistributor.PLAYER_STATUS_UPDATE; private List playbackHistory; private QueueAccess queue; @@ -167,13 +169,10 @@ public class PlaybackHistoryFragment extends ListFragment { @Override public void update(EventDistributor eventDistributor, Integer arg) { - if ((arg & EventDistributor.PLAYBACK_HISTORY_UPDATE) != 0) { + if ((arg & EVENTS) != 0) { startItemLoader(); getActivity().supportInvalidateOptionsMenu(); } - if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { - adapter.notifyDataSetChanged(); - } } }; 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 b48b52514..70a231cad 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -56,7 +56,8 @@ public class QueueFragment extends Fragment { private static final String TAG = "QueueFragment"; private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | - EventDistributor.QUEUE_UPDATE; + EventDistributor.QUEUE_UPDATE | + EventDistributor.PLAYER_STATUS_UPDATE; private DragSortListView listView; private QueueListAdapter listAdapter; @@ -477,9 +478,6 @@ public class QueueFragment extends Fragment { getActivity().supportInvalidateOptionsMenu(); } } - if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { - listAdapter.notifyDataSetChanged(); - } } }; -- cgit v1.2.3 From c277166f77351bdeda7c2dc10db21df420fb2987 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 3 Apr 2015 10:47:01 -0400 Subject: Can now undo swipe to mark as read. Behavior isn't ideal when the user is displaying all the items in their feed. (you can swipe new and read items and they don't go away (obviously)). --- .../antennapod/fragment/NewEpisodesFragment.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 e96c428fe..715222295 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -7,6 +7,7 @@ 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.v7.widget.SearchView; import android.util.Log; @@ -45,6 +46,7 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.QueueAccess; import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken; +import de.danoeh.antennapod.core.util.gui.UndoBarController; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; @@ -68,6 +70,8 @@ public class NewEpisodesFragment extends Fragment { private TextView txtvEmpty; private ProgressBar progLoading; + private UndoBarController undoBarController; + private List unreadItems; private List recentItems; private QueueAccess queueAccess; @@ -135,6 +139,7 @@ public class NewEpisodesFragment extends Fragment { listAdapter = null; activity.set(null); viewsCreated = false; + undoBarController = null; if (downloadObserver != null) { downloadObserver.onPause(); } @@ -262,6 +267,10 @@ public class NewEpisodesFragment extends Fragment { stopItemLoader(); FeedItem item = (FeedItem) listView.getAdapter().getItem(which); DBWriter.markItemRead(getActivity(), item.getId(), true); + undoBarController.showUndoBar(false, + getString(R.string.marked_as_read_label), new FeedItemUndoToken(item, + which) + ); // TODO: provide undo? /* undoBarController.showUndoBar(false, @@ -272,6 +281,19 @@ public class NewEpisodesFragment extends Fragment { } }); + 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.markItemRead(getActivity(), itemId, false); + } + } + }); + final int secondColor = (UserPreferences.getTheme() == R.style.Theme_AntennaPod_Dark) ? R.color.swipe_refresh_secondary_color_dark : R.color.swipe_refresh_secondary_color_light; if (!itemsLoaded) { -- cgit v1.2.3 From 0aed6ce38309d93079ddfa9384dfa0d55bb7512f Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 3 Apr 2015 11:00:52 -0400 Subject: switched to use just RemoveListener --- .../antennapod/fragment/NewEpisodesFragment.java | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 715222295..02d560599 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -249,18 +249,7 @@ public class NewEpisodesFragment extends Fragment { } }); - listView.setDragSortListener(new DragSortListView.DragSortListener() { - - @Override - public void drag(int from, int to) { - // no drag - } - - @Override - public void drop(int from, int to) { - // no drop - } - + listView.setRemoveListener(new DragSortListView.RemoveListener() { @Override public void remove(int which) { Log.d(TAG, "remove("+which+")"); @@ -271,13 +260,6 @@ public class NewEpisodesFragment extends Fragment { getString(R.string.marked_as_read_label), new FeedItemUndoToken(item, which) ); - // TODO: provide undo? - /* - undoBarController.showUndoBar(false, - getString(R.string.removed_from_queue), new FeedItemUndoToken(item, - which) - ); - */ } }); -- cgit v1.2.3 From 8deb1860e27b325de8444b38c22f41bedd8085bf Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 3 Apr 2015 14:51:16 -0400 Subject: 'All Episodes' by default now only shows new episodes. The user can still easily show all episodes via the menu. The view also now greys out the background for any non-new episodes. --- .../main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 02d560599..de00cf3ae 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -379,7 +379,7 @@ public class NewEpisodesFragment extends Fragment { private void updateShowOnlyEpisodes() { SharedPreferences prefs = getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); - showOnlyNewEpisodes = prefs.getBoolean(PREF_EPISODE_FILTER_BOOL, false); + showOnlyNewEpisodes = prefs.getBoolean(PREF_EPISODE_FILTER_BOOL, true); } private void setShowOnlyNewEpisodes(boolean newVal) { -- cgit v1.2.3 From e7bde8ff8202c3d5734d1d24409d94ebd4ea2d72 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Sun, 5 Apr 2015 11:34:06 -0400 Subject: switched to 'New Episodes', also displaying queue first in the drawer --- .../main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 de00cf3ae..6a4e6bbee 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -230,7 +230,7 @@ public class NewEpisodesFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); - ((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.all_episodes_label); + ((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.new_episodes_label); View root = inflater.inflate(R.layout.new_episodes_fragment, container, false); -- cgit v1.2.3 From 2a5c7e04548cee22258e0231325d11d8288e2b9f Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Sun, 5 Apr 2015 16:52:51 -0400 Subject: now persisting the scroll position for New Episodes --- .../antennapod/fragment/NewEpisodesFragment.java | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 5601000dc..8bc4099a9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -64,7 +64,8 @@ public class NewEpisodesFragment extends Fragment { private static final int RECENT_EPISODES_LIMIT = 150; private static final String PREF_NAME = "PrefNewEpisodesFragment"; private static final String PREF_EPISODE_FILTER_BOOL = "newEpisodeFilterEnabled"; - + private static final String PREF_KEY_LIST_TOP = "list_top"; + private static final String PREF_KEY_LIST_SELECTION = "list_selection"; private DragSortListView listView; private NewEpisodesListAdapter listAdapter; @@ -117,6 +118,12 @@ public class NewEpisodesFragment extends Fragment { } } + @Override + public void onPause() { + super.onPause(); + saveScrollPosition(); + } + @Override public void onStop() { super.onStop(); @@ -136,6 +143,30 @@ public class NewEpisodesFragment extends Fragment { resetViewState(); } + private void saveScrollPosition() { + SharedPreferences prefs = getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + View v = listView.getChildAt(0); + int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop()); + editor.putInt(PREF_KEY_LIST_SELECTION, listView.getFirstVisiblePosition()); + editor.putInt(PREF_KEY_LIST_TOP, top); + editor.commit(); + } + + private void restoreScrollPosition() { + SharedPreferences prefs = getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); + int listSelection = prefs.getInt(PREF_KEY_LIST_SELECTION, 0); + int top = prefs.getInt(PREF_KEY_LIST_TOP, 0); + if(listSelection > 0 || top > 0) { + listView.setSelectionFromTop(listSelection, top); + // restore once, then forget + SharedPreferences.Editor editor = prefs.edit(); + editor.putInt(PREF_KEY_LIST_SELECTION, 0); + editor.putInt(PREF_KEY_LIST_TOP, 0); + editor.commit(); + } + } + private void resetViewState() { listAdapter = null; activity.set(null); @@ -302,6 +333,7 @@ public class NewEpisodesFragment extends Fragment { downloadObserver.onResume(); } listAdapter.notifyDataSetChanged(); + restoreScrollPosition(); getActivity().supportInvalidateOptionsMenu(); updateShowOnlyEpisodesListViewState(); } -- cgit v1.2.3