summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorMartin Fietz <Martin.Fietz@gmail.com>2015-11-06 00:20:59 +0100
committerMartin Fietz <Martin.Fietz@gmail.com>2015-11-06 00:20:59 +0100
commit51aba83ae2cfeab919fa25aa9efd898af856a21f (patch)
tree89ca07adf5128b515dd96abfeef968eb75ecea1a /app
parent32a47d0f652a579007a9035a0c4ffe5aeeebdd31 (diff)
downloadAntennaPod-51aba83ae2cfeab919fa25aa9efd898af856a21f.zip
RecyclerView context menus (with ripple)
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java97
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java11
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java26
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java35
-rw-r--r--app/src/main/res/layout/new_episodes_listitem.xml1
5 files changed, 82 insertions, 88 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java
index c72c95feb..0aad26a28 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java
@@ -7,8 +7,10 @@ import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.text.format.DateUtils;
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.view.ViewGroup;
@@ -51,6 +53,8 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
private final boolean showOnlyNewEpisodes;
private final WeakReference<MainActivity> mainActivityRef;
+ private int position = -1;
+
public AllEpisodesRecycleAdapter(Context context,
MainActivity mainActivity,
ItemAccess itemAccess,
@@ -96,6 +100,10 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
public void onBindViewHolder(final Holder holder, int position) {
final FeedItem item = itemAccess.getItem(position);
if (item == null) return;
+ holder.itemView.setOnLongClickListener(v -> {
+ this.position = position;
+ return false;
+ });
holder.item = item;
holder.position = position;
holder.placeholder.setVisibility(View.VISIBLE);
@@ -189,6 +197,10 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
return itemAccess.getItem(position);
}
+ public int getPosition() {
+ return position;
+ }
+
private class CoverTarget extends GlideDrawableImageViewTarget {
private final WeakReference<Uri> fallback;
@@ -235,63 +247,8 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
}
};
- private Menu popupMenu;
- private final FeedItemMenuHandler.MenuInterface contextMenuInterface = new FeedItemMenuHandler.MenuInterface() {
- @Override
- public void setItemVisibility(int id, boolean visible) {
- if(popupMenu == null) {
- return;
- }
- MenuItem item = popupMenu.findItem(id);
- if (item != null) {
- item.setVisible(visible);
- }
- }
- };
-
- private final boolean showContextMenu(View view) {
- // Create a PopupMenu, giving it the clicked view for an anchor
- MainActivity mainActivity = this.mainActivityRef.get();
- if (mainActivity == null) {
- Log.d(TAG, "mainActivity is null");
- return false;
- }
- PopupMenu popup = new PopupMenu(mainActivity, view);
- Menu menu = popup.getMenu();
-
- // Inflate our menu resource into the PopupMenu's Menu
- popup.getMenuInflater().inflate(R.menu.allepisodes_context, popup.getMenu());
-
- Holder holder = (Holder) view.getTag();
- FeedItem item = holder.item;
- if (item == null) {
- return false;
- }
-
- popupMenu = menu;
- FeedItemMenuHandler.onPrepareMenu(context, contextMenuInterface, item, true, null);
-
- // Set a listener so we are notified if a menu item is clicked
- popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem menuItem) {
- try {
- FeedItemMenuHandler.onMenuItemClicked(context, menuItem.getItemId(), item);
- return true;
- } catch (DownloadRequestException e) {
- e.printStackTrace();
- }
- return false;
- }
- });
-
- popup.show();
- return true;
- }
-
-
public class Holder extends RecyclerView.ViewHolder
- implements View.OnClickListener, View.OnLongClickListener{
+ implements View.OnClickListener, View.OnCreateContextMenuListener {
TextView placeholder;
TextView title;
TextView pubDate;
@@ -308,7 +265,7 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
public Holder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
- itemView.setOnLongClickListener(this);
+ itemView.setOnCreateContextMenuListener(this);
}
@Override
@@ -321,12 +278,30 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
public FeedItem getFeedItem() { return item; }
- public int getItemPosition() { return position; }
-
@Override
- public boolean onLongClick(View view) {
- return showContextMenu(view);
+ public void onCreateContextMenu(final ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ FeedItem item = itemAccess.getItem(getAdapterPosition());
+
+ MenuInflater inflater = mainActivityRef.get().getMenuInflater();
+ inflater.inflate(R.menu.allepisodes_context, menu);
+
+ if (item != null) {
+ menu.setHeaderTitle(item.getTitle());
+ }
+
+ FeedItemMenuHandler.MenuInterface contextMenuInterface = (id, visible) -> {
+ if (menu == null) {
+ return;
+ }
+ MenuItem item1 = menu.findItem(id);
+ if (item1 != null) {
+ item1.setVisible(visible);
+ }
+ };
+ FeedItemMenuHandler.onPrepareMenu(mainActivityRef.get(), contextMenuInterface, item, true,
+ null);
}
+
}
public interface ItemAccess {
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
index 539c2786f..3402d39f1 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
@@ -58,6 +58,8 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
private boolean locked;
+ private int position = -1;
+
public QueueRecyclerAdapter(MainActivity mainActivity,
ItemAccess itemAccess,
ActionButtonCallback actionButtonCallback,
@@ -84,13 +86,19 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
public void onBindViewHolder(ViewHolder holder, int pos) {
FeedItem item = itemAccess.getItem(pos);
holder.bind(item);
- holder.position = pos;
+ holder.itemView.setOnLongClickListener(v -> {
+ position = pos;
+ return false;
+ });
}
public int getItemCount() {
return itemAccess.getCount();
}
+ public int getPosition() {
+ return position;
+ }
public class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnCreateContextMenuListener {
@@ -106,7 +114,6 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
private final ImageButton butSecondary;
private FeedItem item;
- private int position;
public ViewHolder(View v) {
super(v);
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 c3249771f..07b9cb904 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
@@ -18,6 +18,7 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
import android.widget.ProgressBar;
import android.widget.Toast;
@@ -39,7 +40,9 @@ 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.menuhandler.FeedItemMenuHandler;
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
import de.danoeh.antennapod.view.DividerItemDecoration;
import rx.Observable;
@@ -261,6 +264,28 @@ public class AllEpisodesFragment extends Fragment {
}
@Override
+ public boolean onContextItemSelected(MenuItem item) {
+ if(!isVisible()) {
+ return false;
+ }
+ int pos = listAdapter.getPosition();
+ FeedItem selectedItem = itemAccess.getItem(pos);
+
+ if (selectedItem == null) {
+ Log.i(TAG, "Selected item at position " + pos + " 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;
+ }
+ }
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return onCreateViewHelper(inflater, container, savedInstanceState,
R.layout.all_episodes_fragment);
@@ -280,6 +305,7 @@ public class AllEpisodesFragment extends Fragment {
recyclerView.setHasFixedSize(true);
RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(getActivity(), null);
recyclerView.addItemDecoration(itemDecoration);
+ registerForContextMenu(recyclerView);
progLoading = (ProgressBar) root.findViewById(R.id.progLoading);
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 cf159b4a1..4031e7065 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -79,9 +79,6 @@ public class QueueFragment extends Fragment {
private TextView txtvEmpty;
private ProgressBar progLoading;
- private ContextMenu contextMenu;
- private AdapterView.AdapterContextMenuInfo lastMenuInfo = null;
-
private List<FeedItem> queue;
private List<Downloader> downloaderList;
@@ -166,7 +163,10 @@ public class QueueFragment extends Fragment {
recyclerAdapter.notifyDataSetChanged();
break;
case MOVED:
- // ItemTouchHelper already handled everything
+ int from = FeedItemUtil.indexOfItemWithId(queue, event.item.getId());
+ int to = event.position;
+ Collections.swap(queue, from, to);
+ recyclerAdapter.notifyItemMoved(from, to);
break;
}
}
@@ -217,7 +217,6 @@ public class QueueFragment extends Fragment {
}
private void resetViewState() {
- unregisterForContextMenu(recyclerView);
blockDownloadObserverUpdate = false;
if (downloadObserver != null) {
downloadObserver.onPause();
@@ -319,32 +318,19 @@ public class QueueFragment extends Fragment {
} 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 boolean onContextItemSelected(MenuItem item) {
- AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
- if(menuInfo == null) {
- menuInfo = lastMenuInfo;
+ if(!isVisible()) {
+ return false;
}
- FeedItem selectedItem = itemAccess.getItem(menuInfo.position);
+ int pos = recyclerAdapter.getPosition();
+ FeedItem selectedItem = itemAccess.getItem(pos);
if (selectedItem == null) {
- Log.i(TAG, "Selected item at position " + menuInfo.position + " was null, ignoring selection");
+ Log.i(TAG, "Selected item at position " + pos + " was null, ignoring selection");
return super.onContextItemSelected(item);
}
@@ -371,6 +357,7 @@ public class QueueFragment extends Fragment {
RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(getActivity(), null);
recyclerView.addItemDecoration(itemDecoration);
recyclerView.setHasFixedSize(true);
+ registerForContextMenu(recyclerView);
itemTouchHelper = new ItemTouchHelper(
new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.RIGHT) {
@@ -380,8 +367,6 @@ public class QueueFragment extends Fragment {
int from = viewHolder.getAdapterPosition();
int to = target.getAdapterPosition();
Log.d(TAG, "move(" + from + ", " + to + ")");
- Collections.swap(queue, from, to);
- recyclerAdapter.notifyItemMoved(from, to);
DBWriter.moveQueueItem(from, to, true);
return true;
}
diff --git a/app/src/main/res/layout/new_episodes_listitem.xml b/app/src/main/res/layout/new_episodes_listitem.xml
index ec5ab1e6a..7a5652c45 100644
--- a/app/src/main/res/layout/new_episodes_listitem.xml
+++ b/app/src/main/res/layout/new_episodes_listitem.xml
@@ -5,6 +5,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/listitem_threeline_height"
android:orientation="horizontal"
+ android:background="?attr/selectableItemBackground"
tools:background="@android:color/darker_gray">
<RelativeLayout