From ca5111208896f11ec8b004228cace3902b085cda Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 22 May 2019 10:53:28 +0200 Subject: [PATCH] Added nav to message bottom --- .../eu/faircode/email/FragmentMessages.java | 60 +++++++++++++------ .../baseline_vertical_align_bottom_24.xml | 10 ++++ ...xml => baseline_vertical_align_top_24.xml} | 2 +- app/src/main/res/layout/fragment_messages.xml | 15 ++++- 4 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_vertical_align_bottom_24.xml rename app/src/main/res/drawable/{baseline_home_24.xml => baseline_vertical_align_top_24.xml} (81%) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 21f702c042..13bcb9b60d 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -121,6 +121,7 @@ public class FragmentMessages extends FragmentBase { private TextView tvNoEmail; private FixedRecyclerView rvMessage; private SeekBar seekBar; + private ImageButton ibDown; private ImageButton ibUp; private BottomNavigationView bottom_navigation; private ContentLoadingProgressBar pbWait; @@ -265,6 +266,7 @@ public class FragmentMessages extends FragmentBase { tvNoEmail = view.findViewById(R.id.tvNoEmail); rvMessage = view.findViewById(R.id.rvMessage); seekBar = view.findViewById(R.id.seekBar); + ibDown = view.findViewById(R.id.ibDown); ibUp = view.findViewById(R.id.ibUp); bottom_navigation = view.findViewById(R.id.bottom_navigation); pbWait = view.findViewById(R.id.pbWait); @@ -456,28 +458,17 @@ public class FragmentMessages extends FragmentBase { } }); - ibUp.setOnClickListener(new View.OnClickListener() { + ibDown.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - int pos = llm.findLastVisibleItemPosition(); - if (pos != RecyclerView.NO_POSITION) - do { - Long key = adapter.getKeyAtPosition(pos); - if (key != null && isExpanded(key)) { - int first = llm.findFirstVisibleItemPosition(); - View child = rvMessage.getChildAt(pos - (first < 0 ? 0 : first)); - if (child != null) { - TranslateAnimation bounce = new TranslateAnimation( - 0, 0, Helper.dp2pixels(getContext(), 12), 0); - bounce.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)); - child.startAnimation(bounce); - } + scrollToVisibleItem(llm, true); + } + }); - rvMessage.scrollToPosition(pos); - break; - } - pos--; - } while (pos >= 0); + ibUp.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + scrollToVisibleItem(llm, false); } }); @@ -646,6 +637,7 @@ public class FragmentMessages extends FragmentBase { swipeRefresh.setEnabled(pull); tvNoEmail.setVisibility(View.GONE); seekBar.setVisibility(View.GONE); + ibDown.setVisibility(View.GONE); ibUp.setVisibility(View.GONE); bottom_navigation.getMenu().findItem(R.id.action_prev).setEnabled(false); bottom_navigation.getMenu().findItem(R.id.action_next).setEnabled(false); @@ -775,6 +767,35 @@ public class FragmentMessages extends FragmentBase { super.onDestroy(); } + private void scrollToVisibleItem(LinearLayoutManager llm, boolean bottom) { + int pos = llm.findLastVisibleItemPosition(); + if (pos == RecyclerView.NO_POSITION) + return; + + do { + Long key = adapter.getKeyAtPosition(pos); + if (key != null && isExpanded(key)) { + int first = llm.findFirstVisibleItemPosition(); + View child = rvMessage.getChildAt(pos - (first < 0 ? 0 : first)); + + if (child != null) { + TranslateAnimation bounce = new TranslateAnimation( + 0, 0, Helper.dp2pixels(getContext(), bottom ? -12 : 12), 0); + bounce.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)); + child.startAnimation(bounce); + } + + if (bottom && child != null) + llm.scrollToPositionWithOffset(pos, rvMessage.getHeight() - llm.getDecoratedMeasuredHeight(child)); + else + rvMessage.scrollToPosition(pos); + + break; + } + pos--; + } while (pos >= 0); + } + private void onSwipeRefresh() { Bundle args = new Bundle(); args.putLong("folder", folder); @@ -854,6 +875,7 @@ public class FragmentMessages extends FragmentBase { if ("expanded".equals(name)) { if (enabled) handleExpand(id); + ibDown.setVisibility(values.get(name).size() > 0 ? View.VISIBLE : View.GONE); ibUp.setVisibility(values.get(name).size() > 0 ? View.VISIBLE : View.GONE); } } diff --git a/app/src/main/res/drawable/baseline_vertical_align_bottom_24.xml b/app/src/main/res/drawable/baseline_vertical_align_bottom_24.xml new file mode 100644 index 0000000000..7b402aaf4b --- /dev/null +++ b/app/src/main/res/drawable/baseline_vertical_align_bottom_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/baseline_home_24.xml b/app/src/main/res/drawable/baseline_vertical_align_top_24.xml similarity index 81% rename from app/src/main/res/drawable/baseline_home_24.xml rename to app/src/main/res/drawable/baseline_vertical_align_top_24.xml index 8a0e3d978f..b9e954930f 100644 --- a/app/src/main/res/drawable/baseline_home_24.xml +++ b/app/src/main/res/drawable/baseline_vertical_align_top_24.xml @@ -6,5 +6,5 @@ android:tint="?attr/colorControlNormal"> + android:pathData="M8,11h3v10h2V11h3l-4,-4 -4,4zM4,3v2h16V3H4z"/> diff --git a/app/src/main/res/layout/fragment_messages.xml b/app/src/main/res/layout/fragment_messages.xml index 29d8055a34..b2ef625650 100644 --- a/app/src/main/res/layout/fragment_messages.xml +++ b/app/src/main/res/layout/fragment_messages.xml @@ -180,12 +180,23 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + +