diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index d5afb20cd4..8789cd258e 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -834,8 +834,13 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc return super.shouldUpRecreateTask(targetIntent); } + public boolean abShowing = true; public ValueAnimator abAnimator = null; + public boolean isActionBarShown() { + return abShowing; + } + public void showActionBar(boolean show) { ViewGroup abv = findViewById(R.id.action_bar); if (abv == null) { @@ -847,6 +852,10 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc else ab.hide(); } else { + if (abShowing == show) + return; + abShowing = show; + int height = Helper.getActionBarHeight(this); int current = abv.getLayoutParams().height; int target = (show ? height : 0); diff --git a/app/src/main/java/eu/faircode/email/FragmentBase.java b/app/src/main/java/eu/faircode/email/FragmentBase.java index 9b27102c51..d7d7a91c73 100644 --- a/app/src/main/java/eu/faircode/email/FragmentBase.java +++ b/app/src/main/java/eu/faircode/email/FragmentBase.java @@ -106,6 +106,14 @@ public class FragmentBase extends Fragment { return null; } + protected boolean isActionBarShown() { + FragmentActivity activity = getActivity(); + if (activity instanceof ActivityBase) + return ((ActivityBase) activity).isActionBarShown(); + else + return false; + } + protected void showActionBar(boolean show) { FragmentActivity activity = getActivity(); if (activity instanceof ActivityBase) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index ee290ffb09..126e202e1a 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -771,6 +771,21 @@ public class FragmentMessages extends FragmentBase } } + @Override + public void onLayoutCompleted(RecyclerView.State state) { + super.onLayoutCompleted(state); + if (!isActionBarShown()) + try { + int range = computeVerticalScrollRange(state); + int extend = computeVerticalScrollExtent(state); + boolean canScrollVertical = (range > extend); + if (!canScrollVertical) // anymore + showActionBar(true); + } catch (Throwable ex) { + Log.e(ex); + } + } + @Override public void onItemsAdded(@NonNull RecyclerView recyclerView, int positionStart, int itemCount) { iProperties.layoutChanged(); @@ -1122,13 +1137,17 @@ public class FragmentMessages extends FragmentBase } } - if (hide_toolbar && dy != 0) { - int range = rv.computeVerticalScrollRange(); - int extend = rv.computeVerticalScrollExtent(); - int offset = rv.computeVerticalScrollOffset(); - boolean canScrollVertical = (range > extend); - show = (!canScrollVertical || (offset == 0 || dy < 0)); - } + if (hide_toolbar && dy != 0) + try { + int range = rv.computeVerticalScrollRange(); + int extend = rv.computeVerticalScrollExtent(); + boolean canScrollVertical = (range > extend); + show = (!canScrollVertical || + (dy < 0 || rv.computeVerticalScrollOffset() == 0)); + } catch (Throwable ex) { + Log.e(ex); + show = true; + } } @Override