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" />
+
+