From b80e383511d2dd05069b3db95c62095c4dff2815 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 17 Feb 2017 18:26:09 +0300 Subject: implement swipe to dismiss --- org.fox.ttrss/build.gradle | 1 + .../main/java/org/fox/ttrss/HeadlinesFragment.java | 67 ++++++++++++++++++++-- .../src/main/res/layout/fragment_headlines.xml | 4 +- .../src/main/res/layout/headlines_row_undo.xml | 29 ++++++++++ org.fox.ttrss/src/main/res/values/strings.xml | 2 + org.fox.ttrss/src/main/res/xml/preferences.xml | 6 ++ 6 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 org.fox.ttrss/src/main/res/layout/headlines_row_undo.xml (limited to 'org.fox.ttrss') diff --git a/org.fox.ttrss/build.gradle b/org.fox.ttrss/build.gradle index 94373e3a..f00ba64f 100755 --- a/org.fox.ttrss/build.gradle +++ b/org.fox.ttrss/build.gradle @@ -39,6 +39,7 @@ dependencies { compile 'me.relex:circleindicator:1.1.1@aar' compile 'com.viewpagerindicator:library:2.4.1' compile 'com.nhaarman.listviewanimations:lib-core:3.1.0@aar' + compile 'com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar' compile 'com.android.support:customtabs:23.0.0' compile files('libs/nineoldandroids-2.4.0.jar') compile files('libs/YouTubeAndroidPlayerApi.jar') diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java index 63871a98..6dbd62c7 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java @@ -17,6 +17,8 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.Fragment; @@ -34,6 +36,7 @@ import android.view.Display; import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -57,6 +60,10 @@ import com.amulyakhare.textdrawable.util.ColorGenerator; import com.google.gson.JsonElement; import com.nhaarman.listviewanimations.appearance.AnimationAdapter; import com.nhaarman.listviewanimations.appearance.simple.SwingBottomInAnimationAdapter; +import com.nhaarman.listviewanimations.itemmanipulation.DynamicListView; +import com.nhaarman.listviewanimations.itemmanipulation.swipedismiss.OnDismissCallback; +import com.nhaarman.listviewanimations.itemmanipulation.swipedismiss.undo.SimpleSwipeUndoAdapter; +import com.nhaarman.listviewanimations.itemmanipulation.swipedismiss.undo.UndoAdapter; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; @@ -117,7 +124,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, private int m_maxImageSize = 0; private boolean m_compactLayoutMode = false; private int m_listPreviousVisibleItem; - private ListView m_list; + private DynamicListView m_list; private ImageLoader m_imageLoader = ImageLoader.getInstance(); private View m_listLoadingView; private View m_topChangedView; @@ -469,10 +476,12 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, } }); - m_list = (ListView)view.findViewById(R.id.headlines_list); + m_list = (DynamicListView) view.findViewById(R.id.headlines_list); FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.headlines_fab); + boolean enableSwipeToDismiss = m_prefs.getBoolean("headlines_swipe_to_dismiss", true); + if (! (getActivity() instanceof DetailActivity)) { m_list.setOnTouchListener(new ShowHideOnScroll(fab)); @@ -482,6 +491,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, refresh(false); } }); + } else { fab.setVisibility(View.GONE); } @@ -520,9 +530,41 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, m_animationAdapter.setAbsListView(m_list); m_list.setAdapter(m_animationAdapter); + if (enableSwipeToDismiss) { + + SimpleSwipeUndoAdapter swipeUndoAdapter = new SimpleSwipeUndoAdapter(m_adapter, m_activity, + new OnDismissCallback() { + @Override + public void onDismiss(final ViewGroup listView, final int[] reverseSortedPositions) { + for (int position : reverseSortedPositions) { + Article article = m_adapter.getItem(position); + + Log.d(TAG, "onSwipeDismiss: " + article); + + if (article != null) { + if (article.unread) { + article.unread = false; + m_activity.saveArticleUnread(article); + } + + m_adapter.remove(article); + m_adapter.notifyDataSetChanged(); + } + } + } + } + ); + + swipeUndoAdapter.setAbsListView(m_list); + m_list.setAdapter(swipeUndoAdapter); + m_list.enableSimpleSwipeUndo(); + } + + m_list.setOnItemClickListener(this); m_list.setOnScrollListener(this); - registerForContextMenu(m_list); + + if (!enableSwipeToDismiss) registerForContextMenu(m_list); if (m_activity.isSmallScreen()) { m_activity.setTitle(m_feed.title); @@ -838,7 +880,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, public boolean flavorImageEmbedded; } - private class ArticleListAdapter extends ArrayAdapter
{ + private class ArticleListAdapter extends ArrayAdapter
implements UndoAdapter { private ArrayList
items; public static final int VIEW_NORMAL = 0; @@ -1571,6 +1613,23 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); } } + + @NonNull + @Override + public View getUndoView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + View view = convertView; + + if (view == null) { + view = LayoutInflater.from(m_activity).inflate(R.layout.headlines_row_undo, parent, false); + } + return view; + } + + @NonNull + @Override + public View getUndoClickView(@NonNull View view) { + return view.findViewById(R.id.headlines_row_undo_button); + } } diff --git a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml index 7b7244a3..ddca91fd 100644 --- a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml +++ b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml @@ -11,12 +11,12 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - - +