From 839f09b06e9175397b8f241fed8f5005eb064dd8 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sat, 3 Oct 2020 09:01:59 +0300 Subject: move fab to activity view out of specific fragments --- .../main/java/org/fox/ttrss/ArticleFragment.java | 33 ++-------- .../main/java/org/fox/ttrss/DetailActivity.java | 17 ++++++ .../main/java/org/fox/ttrss/HeadlinesFragment.java | 23 ------- .../main/java/org/fox/ttrss/MasterActivity.java | 18 ++++++ .../fox/ttrss/offline/OfflineArticleFragment.java | 41 ++----------- .../fox/ttrss/offline/OfflineDetailActivity.java | 32 +++++++++- .../util/DetailActivityScrollingViewBehavior.java | 71 ++++++++++++++++++++++ .../res/layout-sw600dp-land/activity_detail.xml | 43 ------------- .../res/layout-sw600dp-land/activity_master.xml | 25 ++++++-- .../res/layout-sw600dp-port/activity_detail.xml | 43 ------------- .../main/res/layout-sw600dp/activity_detail.xml | 59 ++++++++++++++++++ .../src/main/res/layout/activity_detail.xml | 8 +-- .../src/main/res/layout/activity_detail_phone.xml | 11 +++- .../src/main/res/layout/activity_master_phone.xml | 27 +++----- .../src/main/res/layout/fragment_article.xml | 12 +--- .../src/main/res/layout/fragment_headlines.xml | 19 ++---- 16 files changed, 254 insertions(+), 228 deletions(-) create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/DetailActivityScrollingViewBehavior.java delete mode 100644 org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_detail.xml delete mode 100644 org.fox.ttrss/src/main/res/layout-sw600dp-port/activity_detail.xml create mode 100644 org.fox.ttrss/src/main/res/layout-sw600dp/activity_detail.xml diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java index 40250046..3a5c52a5 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java @@ -27,8 +27,6 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; -import androidx.core.widget.NestedScrollView; - import org.fox.ttrss.types.Article; import org.fox.ttrss.types.Attachment; @@ -51,7 +49,7 @@ public class ArticleFragment extends StateSavedFragment { protected FrameLayout m_customViewContainer; protected View m_contentView; protected FSVideoChromeClient m_chromeClient; - protected View m_fab; + //protected View m_fab; protected int m_articleFontSize; protected int m_articleSmallFontSize; protected boolean m_acceleratedWebview = true; @@ -85,7 +83,7 @@ public class ArticleFragment extends StateSavedFragment { m_customViewContainer.setVisibility(View.VISIBLE); m_customViewContainer.addView(view); - if (m_fab != null) m_fab.setVisibility(View.GONE); + //if (m_fab != null) m_fab.setVisibility(View.GONE); m_activity.showSidebar(false); @@ -111,8 +109,8 @@ public class ArticleFragment extends StateSavedFragment { m_customViewContainer.removeView(m_customView); m_callback.onCustomViewHidden(); - if (m_fab != null && m_prefs.getBoolean("enable_article_fab", true)) - m_fab.setVisibility(View.VISIBLE); + /*if (m_fab != null && m_prefs.getBoolean("enable_article_fab", true)) + m_fab.setVisibility(View.VISIBLE);*/ m_customView = null; @@ -181,29 +179,6 @@ public class ArticleFragment extends StateSavedFragment { return view; } */ - NestedScrollView scrollView = view.findViewById(R.id.article_scrollview); - m_fab = view.findViewById(R.id.article_fab); - - if (scrollView != null && m_fab != null) { - if (m_prefs.getBoolean("enable_article_fab", true)) { - //scrollView.setOnTouchListener(new ShowHideOnScroll(m_fab)); - - m_fab.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - try { - m_activity.openUri(Uri.parse(m_article.link)); - } catch (Exception e) { - e.printStackTrace(); - m_activity.toast(R.string.error_other_error); - } - } - }); - } else { - m_fab.setVisibility(View.GONE); - } - } - m_articleFontSize = Integer.parseInt(m_prefs.getString("article_font_size_sp", "16")); m_articleSmallFontSize = Math.max(10, Math.min(18, m_articleFontSize - 2)); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java index 3452ffa8..3144fc74 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java @@ -13,6 +13,8 @@ import android.util.Log; import android.view.MenuItem; import android.view.View; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import org.fox.ttrss.types.Article; import org.fox.ttrss.types.ArticleList; import org.fox.ttrss.types.Feed; @@ -60,6 +62,21 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList findViewById(R.id.headlines_fragment).setVisibility(View.GONE); } + FloatingActionButton fab = findViewById(R.id.detail_fab); + + if (fab != null && m_prefs.getBoolean("enable_article_fab", true)) { + fab.show(); + + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (m_activeArticle != null) { + openUri(Uri.parse(m_activeArticle.link)); + } + } + }); + } + if (savedInstanceState == null) { Intent i = getIntent(); 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 9f17abb7..b060871b 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 @@ -58,7 +58,6 @@ import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.GlideDrawableImageViewTarget; import com.bumptech.glide.request.target.Target; -import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; import com.google.gson.JsonElement; @@ -122,7 +121,6 @@ public class HeadlinesFragment extends StateSavedFragment { @State boolean m_compactLayoutMode = false; private RecyclerView m_list; private LinearLayoutManager m_layoutManager; - private FloatingActionButton m_fab; private MediaPlayer m_mediaPlayer; private TextureView m_activeTexture; @@ -337,8 +335,6 @@ public class HeadlinesFragment extends StateSavedFragment { m_list.setAdapter(m_adapter); - m_fab = view.findViewById(R.id.headlines_fab); - if (m_prefs.getBoolean("headlines_swipe_to_dismiss", true) && !m_prefs.getBoolean("headlines_mark_read_scroll", false) ) { ItemTouchHelper swipeHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) { @@ -412,17 +408,6 @@ public class HeadlinesFragment extends StateSavedFragment { } - if (! (getActivity() instanceof DetailActivity)) { - m_fab.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - refresh(false); - } - }); - } else { - m_fab.hide(); - } - m_list.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { @@ -459,14 +444,6 @@ public class HeadlinesFragment extends StateSavedFragment { public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); - if (! (getActivity() instanceof DetailActivity)) { - if (dy > 0) { - m_fab.hide(); - } else if (dy < 0) { - m_fab.show(); - } - } - int firstVisibleItem = m_layoutManager.findFirstVisibleItemPosition(); int lastVisibleItem = m_layoutManager.findLastVisibleItemPosition(); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java index 44a9a7c3..e4f11757 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java @@ -16,6 +16,7 @@ import android.view.Gravity; import android.view.MenuItem; import android.view.View; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.gson.JsonElement; import org.fox.ttrss.types.Article; @@ -205,6 +206,23 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList m_drawerLayout.openDrawer(Gravity.START); } } + + FloatingActionButton fab = findViewById(R.id.master_fab); + + if (fab != null) { + fab.show(); + + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + + if (hf != null && hf.isAdded()) { + hf.refresh(false); + } + } + }); + } } protected void onPostCreate(Bundle savedInstanceState) { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java index f34449f5..4f328bcb 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java @@ -28,9 +28,6 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; -import androidx.core.widget.NestedScrollView; -import androidx.fragment.app.Fragment; - import org.fox.ttrss.R; import org.fox.ttrss.util.ImageCacheService; import org.jsoup.Jsoup; @@ -39,12 +36,13 @@ import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.net.MalformedURLException; -import java.net.URI; import java.net.URL; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; +import androidx.fragment.app.Fragment; + public class OfflineArticleFragment extends Fragment { private final String TAG = this.getClass().getSimpleName(); @@ -59,7 +57,7 @@ public class OfflineArticleFragment extends Fragment { protected FrameLayout m_customViewContainer; protected View m_contentView; protected FSVideoChromeClient m_chromeClient; - protected View m_fab; + //protected View m_fab; public void initialize(int articleId) { m_articleId = articleId; @@ -90,7 +88,7 @@ public class OfflineArticleFragment extends Fragment { m_customViewContainer.setVisibility(View.VISIBLE); m_customViewContainer.addView(view); - if (m_fab != null) m_fab.setVisibility(View.GONE); + //if (m_fab != null) m_fab.setVisibility(View.GONE); m_activity.showSidebar(false); @@ -116,8 +114,8 @@ public class OfflineArticleFragment extends Fragment { m_customViewContainer.removeView(m_customView); m_callback.onCustomViewHidden(); - if (m_fab != null && m_prefs.getBoolean("enable_article_fab", true)) - m_fab.setVisibility(View.VISIBLE); + /*if (m_fab != null && m_prefs.getBoolean("enable_article_fab", true)) + m_fab.setVisibility(View.VISIBLE);*/ m_customView = null; @@ -205,33 +203,6 @@ public class OfflineArticleFragment extends Fragment { final String link = m_cursor.getString(m_cursor.getColumnIndex("link")); - NestedScrollView scrollView = view.findViewById(R.id.article_scrollview); - m_fab = view.findViewById(R.id.article_fab); - - if (scrollView != null && m_fab != null) { - if (m_prefs.getBoolean("enable_article_fab", true)) { - //scrollView.setOnTouchListener(new ShowHideOnScroll(m_fab)); - - m_fab.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - try { - URL url = new URL(link.trim()); - String uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), - url.getPort(), url.getPath(), url.getQuery(), url.getRef()).toString(); - - m_activity.openUri(Uri.parse(uri)); - } catch (Exception e) { - e.printStackTrace(); - m_activity.toast(R.string.error_other_error); - } - } - }); - } else { - m_fab.setVisibility(View.GONE); - } - } - int articleFontSize = Integer.parseInt(m_prefs.getString("article_font_size_sp", "16")); int articleSmallFontSize = Math.max(10, Math.min(18, articleFontSize - 2)); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java index 9fcf6072..22d7e362 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteStatement; +import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.provider.BaseColumns; @@ -12,6 +13,8 @@ import android.util.Log; import android.view.MenuItem; import android.view.View; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import org.fox.ttrss.Application; import org.fox.ttrss.R; @@ -28,7 +31,8 @@ public class OfflineDetailActivity extends OfflineActivity implements OfflineHea private ActionBarDrawerToggle m_drawerToggle; private DrawerLayout m_drawerLayout; - + private int m_activeArticleId; + @SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { @@ -125,7 +129,29 @@ public class OfflineDetailActivity extends OfflineActivity implements OfflineHea } } - } + } + + FloatingActionButton fab = findViewById(R.id.detail_fab); + + if (fab != null && m_prefs.getBoolean("enable_article_fab", true)) { + fab.show(); + + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (m_activeArticleId != 0) { + Cursor article = getArticleById(m_activeArticleId); + + if (article != null) { + openUri(Uri.parse(article.getString(article.getColumnIndex("link")))); + + article.close(); + } + } + } + }); + } + } protected void onPostCreate(Bundle savedInstanceState) { @@ -153,6 +179,8 @@ public class OfflineDetailActivity extends OfflineActivity implements OfflineHea @Override public void onArticleSelected(int articleId, boolean open) { + m_activeArticleId = articleId; + if (!open) { SQLiteStatement stmt = getDatabase().compileStatement( "UPDATE articles SET modified = 1, unread = 0 " + "WHERE " + BaseColumns._ID diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DetailActivityScrollingViewBehavior.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DetailActivityScrollingViewBehavior.java new file mode 100644 index 00000000..85e8ae4b --- /dev/null +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DetailActivityScrollingViewBehavior.java @@ -0,0 +1,71 @@ +package org.fox.ttrss.util; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.util.AttributeSet; +import android.view.View; + +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.view.ViewCompat; + +public class DetailActivityScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior { + + private SharedPreferences m_prefs; + + public DetailActivityScrollingViewBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + + m_prefs = PreferenceManager + .getDefaultSharedPreferences(context); + } + + @Override + public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { + return super.layoutDependsOn(parent, child, dependency) || + dependency instanceof FloatingActionButton; + } + + @Override + public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, + @NonNull View child, @NonNull View directTargetChild, + @NonNull View target, int axes, int type) { + // Ensure we react to vertical scrolling + return axes == ViewCompat.SCROLL_AXIS_VERTICAL || + super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type); + } + + @Override + public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, + @NonNull View child, @NonNull View target, int dx, int dy, + @NonNull int[] consumed, int type) { + super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type); + + if (m_prefs.getBoolean("enable_article_fab", true)) { + if (dy > 0) { + // User scrolled down -> hide the FAB + List dependencies = coordinatorLayout.getDependencies(child); + for (View view : dependencies) { + if (view instanceof FloatingActionButton) { + ((FloatingActionButton) view).hide(); + } + } + } else if (dy < 0) { + // User scrolled up -> show the FAB + List dependencies = coordinatorLayout.getDependencies(child); + for (View view : dependencies) { + if (view instanceof FloatingActionButton) { + ((FloatingActionButton) view).show(); + } + } + } + } + + } +} \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_detail.xml b/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_detail.xml deleted file mode 100644 index 0e904edc..00000000 --- a/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_detail.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_master.xml b/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_master.xml index c89f3baa..9ba663f6 100644 --- a/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_master.xml +++ b/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_master.xml @@ -2,6 +2,7 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:fitsSystemWindows="true" + xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> @@ -29,16 +30,30 @@ android:background="?feedlistBackground" > - - - + + + + + + diff --git a/org.fox.ttrss/src/main/res/layout-sw600dp-port/activity_detail.xml b/org.fox.ttrss/src/main/res/layout-sw600dp-port/activity_detail.xml deleted file mode 100644 index 47c84639..00000000 --- a/org.fox.ttrss/src/main/res/layout-sw600dp-port/activity_detail.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout-sw600dp/activity_detail.xml b/org.fox.ttrss/src/main/res/layout-sw600dp/activity_detail.xml new file mode 100644 index 00000000..95215992 --- /dev/null +++ b/org.fox.ttrss/src/main/res/layout-sw600dp/activity_detail.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/activity_detail.xml b/org.fox.ttrss/src/main/res/layout/activity_detail.xml index c35ab296..8f36bbd6 100644 --- a/org.fox.ttrss/src/main/res/layout/activity_detail.xml +++ b/org.fox.ttrss/src/main/res/layout/activity_detail.xml @@ -1,9 +1,9 @@ +xmlns:android="http://schemas.android.com/apk/res/android" +android:layout_width="match_parent" +android:layout_height="match_parent"> - + \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/activity_detail_phone.xml b/org.fox.ttrss/src/main/res/layout/activity_detail_phone.xml index 157ad794..6d9a8dbd 100644 --- a/org.fox.ttrss/src/main/res/layout/activity_detail_phone.xml +++ b/org.fox.ttrss/src/main/res/layout/activity_detail_phone.xml @@ -10,6 +10,15 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + @@ -20,7 +29,7 @@ diff --git a/org.fox.ttrss/src/main/res/layout/activity_master_phone.xml b/org.fox.ttrss/src/main/res/layout/activity_master_phone.xml index d63d9fb9..6ae5064f 100644 --- a/org.fox.ttrss/src/main/res/layout/activity_master_phone.xml +++ b/org.fox.ttrss/src/main/res/layout/activity_master_phone.xml @@ -10,6 +10,15 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + @@ -20,29 +29,13 @@ - - - - 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 647afce8..9f09290f 100755 --- a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml +++ b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml @@ -1,10 +1,9 @@ + android:id="@+id/headlines_fragment" + android:background="?android:colorBackground" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> - - \ No newline at end of file -- cgit v1.2.3