summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fietz <Martin.Fietz@gmail.com>2015-11-07 01:25:15 +0100
committerMartin Fietz <Martin.Fietz@gmail.com>2015-11-07 01:25:15 +0100
commit8286a76cdf580f4adc1e536cabd3cb3ce3427f15 (patch)
tree7e13fddbad9b3606bbc6065a099df10fce7c1cad
parent47886205f6dd265f3c212c0fb14a44ba88444e31 (diff)
downloadAntennaPod-8286a76cdf580f4adc1e536cabd3cb3ce3427f15.zip
Fancy drag/swipe effect
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java38
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java39
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java27
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java26
4 files changed, 128 insertions, 2 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 1d04baf7a..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,6 +5,7 @@ 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;
@@ -24,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;
@@ -250,7 +252,9 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
};
public class Holder extends RecyclerView.ViewHolder
- implements View.OnClickListener, View.OnCreateContextMenuListener {
+ implements View.OnClickListener,
+ View.OnCreateContextMenuListener,
+ ItemTouchHelperViewHolder {
TextView placeholder;
TextView title;
TextView pubDate;
@@ -278,6 +282,16 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
}
}
+ @Override
+ public void onItemSelected() {
+ ViewHelper.setAlpha(itemView, 0.5f);
+ }
+
+ @Override
+ public void onItemClear() {
+ ViewHelper.setAlpha(itemView, 1.0f);
+ }
+
public FeedItem getFeedItem() { return item; }
@Override
@@ -317,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();
+ }
}
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 3402d39f1..062f883bc 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
@@ -26,6 +26,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;
@@ -101,7 +102,9 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
}
public class ViewHolder extends RecyclerView.ViewHolder
- implements View.OnClickListener, View.OnCreateContextMenuListener {
+ implements View.OnClickListener,
+ View.OnCreateContextMenuListener,
+ ItemTouchHelperViewHolder {
private final ImageView dragHandle;
private final TextView placeholder;
@@ -170,6 +173,16 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
itemAccess.getQueueIds());
}
+ @Override
+ public void onItemSelected() {
+ ViewHelper.setAlpha(itemView, 0.5f);
+ }
+
+ @Override
+ public void onItemClear() {
+ ViewHelper.setAlpha(itemView, 1.0f);
+ }
+
public void bind(FeedItem item) {
this.item = item;
if(locked) {
@@ -248,6 +261,8 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
.dontAnimate()
.into(new CoverTarget(item.getFeed().getImageUri(), placeholder, cover));
}
+
+
}
@@ -306,4 +321,26 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
int getItemDownloadProgressPercent(FeedItem item);
LongList getQueueIds();
}
+
+ /**
+ * 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();
+ }
}
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 00ed99444..d684c064c 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java
@@ -14,6 +14,7 @@ import java.util.List;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.adapter.AllEpisodesRecycleAdapter;
+import de.danoeh.antennapod.adapter.QueueRecyclerAdapter;
import de.danoeh.antennapod.core.event.QueueEvent;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
@@ -104,6 +105,32 @@ public class NewEpisodesFragment extends AllEpisodesFragment {
snackbar.show();
h.postDelayed(r, (int)Math.ceil(snackbar.getDuration() * 1.05f));
}
+
+ @Override
+ public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,
+ int actionState) {
+ // We only want the active item
+ if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
+ if (viewHolder instanceof AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) {
+ AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder itemViewHolder =
+ (AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) viewHolder;
+ itemViewHolder.onItemSelected();
+ }
+ }
+
+ super.onSelectedChanged(viewHolder, actionState);
+ }
+ @Override
+ public void clearView(RecyclerView recyclerView,
+ RecyclerView.ViewHolder viewHolder) {
+ super.clearView(recyclerView, viewHolder);
+
+ if (viewHolder instanceof AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) {
+ AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder itemViewHolder =
+ (AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) viewHolder;
+ itemViewHolder.onItemClear();
+ }
+ }
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
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 ecd2c77a2..709d7038a 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -402,6 +402,32 @@ public class QueueFragment extends Fragment {
public boolean isItemViewSwipeEnabled() {
return false == UserPreferences.isQueueLocked();
}
+
+ @Override
+ public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,
+ int actionState) {
+ // We only want the active item
+ if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
+ if (viewHolder instanceof QueueRecyclerAdapter.ItemTouchHelperViewHolder) {
+ QueueRecyclerAdapter.ItemTouchHelperViewHolder itemViewHolder =
+ (QueueRecyclerAdapter.ItemTouchHelperViewHolder) viewHolder;
+ itemViewHolder.onItemSelected();
+ }
+ }
+
+ super.onSelectedChanged(viewHolder, actionState);
+ }
+ @Override
+ public void clearView(RecyclerView recyclerView,
+ RecyclerView.ViewHolder viewHolder) {
+ super.clearView(recyclerView, viewHolder);
+
+ if (viewHolder instanceof QueueRecyclerAdapter.ItemTouchHelperViewHolder) {
+ QueueRecyclerAdapter.ItemTouchHelperViewHolder itemViewHolder =
+ (QueueRecyclerAdapter.ItemTouchHelperViewHolder) viewHolder;
+ itemViewHolder.onItemClear();
+ }
+ }
}
);
itemTouchHelper.attachToRecyclerView(recyclerView);