diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java')
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java | 135 |
1 files changed, 74 insertions, 61 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..b35ff0aa9 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java @@ -5,10 +5,13 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.helper.ItemTouchHelper; 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; @@ -22,6 +25,7 @@ import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.GlideDrawableImageViewTarget; import com.joanzapata.iconify.Iconify; +import com.nineoldandroids.view.ViewHelper; import java.lang.ref.WeakReference; @@ -51,6 +55,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 +102,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 +199,12 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR return itemAccess.getItem(position); } + public int getPosition() { + int pos = position; + position = -1; // reset + return pos; + } + private class CoverTarget extends GlideDrawableImageViewTarget { private final WeakReference<Uri> fallback; @@ -235,63 +251,10 @@ 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, + ItemTouchHelperViewHolder { TextView placeholder; TextView title; TextView pubDate; @@ -308,7 +271,7 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR public Holder(View itemView) { super(itemView); itemView.setOnClickListener(this); - itemView.setOnLongClickListener(this); + itemView.setOnCreateContextMenuListener(this); } @Override @@ -319,14 +282,42 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR } } - public FeedItem getFeedItem() { return item; } + @Override + public void onItemSelected() { + ViewHelper.setAlpha(itemView, 0.5f); + } - public int getItemPosition() { return position; } + @Override + public void onItemClear() { + ViewHelper.setAlpha(itemView, 1.0f); + } + + public FeedItem getFeedItem() { return item; } @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 { @@ -340,4 +331,26 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR boolean isInQueue(FeedItem item); } + + /** + * Notifies a View Holder of relevant callbacks from + * {@link ItemTouchHelper.Callback}. + */ + public interface ItemTouchHelperViewHolder { + + /** + * Called when the {@link ItemTouchHelper} first registers an + * item as being moved or swiped. + * Implementations should update the item view to indicate + * it's active state. + */ + void onItemSelected(); + + + /** + * Called when the {@link ItemTouchHelper} has completed the + * move or swipe, and the active item state should be cleared. + */ + void onItemClear(); + } } |