diff --git a/CHANGELOG.md b/CHANGELOG.md
index 406603630c..02f26304a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,12 @@
For support you can use [the contact form](https://contact.faircode.eu/?product=fairemailsupport).
+### Next version
+
+* Auto hide top toolbar when scrolling messages
+* Small improvements and minor bug fixes
+* Updated translations
+
### 1.2028 - 2023-01-06
* Small improvements and minor bug fixes
diff --git a/app/src/main/assets/CHANGELOG.md b/app/src/main/assets/CHANGELOG.md
index 406603630c..02f26304a4 100644
--- a/app/src/main/assets/CHANGELOG.md
+++ b/app/src/main/assets/CHANGELOG.md
@@ -6,6 +6,12 @@
For support you can use [the contact form](https://contact.faircode.eu/?product=fairemailsupport).
+### Next version
+
+* Auto hide top toolbar when scrolling messages
+* Small improvements and minor bug fixes
+* Updated translations
+
### 1.2028 - 2023-01-06
* Small improvements and minor bug fixes
diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java
index 1b82c9ed54..15bf11ccba 100644
--- a/app/src/main/java/eu/faircode/email/ActivityBase.java
+++ b/app/src/main/java/eu/faircode/email/ActivityBase.java
@@ -20,6 +20,7 @@ package eu.faircode.email;
*/
import android.Manifest;
+import android.animation.ValueAnimator;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
@@ -42,6 +43,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
@@ -832,6 +834,43 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc
return super.shouldUpRecreateTask(targetIntent);
}
+ public ValueAnimator abAnimator = null;
+
+ public void showActionBar(boolean show) {
+ ViewGroup abv = findViewById(R.id.action_bar);
+ if (abv == null) {
+ ActionBar ab = getSupportActionBar();
+ if (ab == null)
+ return;
+ if (show)
+ ab.show();
+ else
+ ab.hide();
+ } else {
+ if (abAnimator == null) {
+ abAnimator = ValueAnimator.ofInt(0, Helper.getActionBarHeight(this));
+ abAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator anim) {
+ abv.getLayoutParams().height = (Integer) anim.getAnimatedValue();
+ abv.requestLayout();
+ }
+ });
+ abAnimator.setDuration(250L);
+ } else
+ abAnimator.cancel();
+
+ int target = (show ? Helper.getActionBarHeight(this) : 0);
+ if (abv.getLayoutParams().height == target)
+ return;
+
+ if (show)
+ abAnimator.start();
+ else
+ abAnimator.reverse();
+ }
+ }
+
Handler getMainHandler() {
return ApplicationEx.getMainHandler();
}
diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java
index 5ec622e274..2dc5f0e836 100644
--- a/app/src/main/java/eu/faircode/email/ActivityView.java
+++ b/app/src/main/java/eu/faircode/email/ActivityView.java
@@ -1301,6 +1301,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
if (count == 0)
finish();
else {
+ showActionBar(true);
+
if (count < lastBackStackCount) {
Intent intent = getIntent();
intent.setAction(null);
diff --git a/app/src/main/java/eu/faircode/email/FragmentBase.java b/app/src/main/java/eu/faircode/email/FragmentBase.java
index 3bdbbae940..9b27102c51 100644
--- a/app/src/main/java/eu/faircode/email/FragmentBase.java
+++ b/app/src/main/java/eu/faircode/email/FragmentBase.java
@@ -106,6 +106,12 @@ public class FragmentBase extends Fragment {
return null;
}
+ protected void showActionBar(boolean show) {
+ FragmentActivity activity = getActivity();
+ if (activity instanceof ActivityBase)
+ ((ActivityBase) activity).showActionBar(show);
+ }
+
protected void setCount(String count) {
this.count = count;
updateSubtitle();
diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java
index 63acdce0c3..293f47cf4b 100644
--- a/app/src/main/java/eu/faircode/email/FragmentMessages.java
+++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java
@@ -27,6 +27,7 @@ import static android.text.format.DateUtils.FORMAT_SHOW_WEEKDAY;
import static android.view.KeyEvent.ACTION_DOWN;
import static android.view.KeyEvent.ACTION_UP;
import static androidx.recyclerview.widget.RecyclerView.NO_POSITION;
+import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE;
import static org.openintents.openpgp.OpenPgpSignatureResult.RESULT_KEY_MISSING;
import static org.openintents.openpgp.OpenPgpSignatureResult.RESULT_NO_SIGNATURE;
import static org.openintents.openpgp.OpenPgpSignatureResult.RESULT_VALID_KEY_CONFIRMED;
@@ -338,6 +339,7 @@ public class FragmentMessages extends FragmentBase
private WebView printWebView = null;
+ private boolean hide_toolbar;
private boolean cards;
private boolean dividers;
private boolean category;
@@ -478,7 +480,7 @@ public class FragmentMessages extends FragmentBase
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
- swipenav = prefs.getBoolean("swipenav", true);
+ hide_toolbar = prefs.getBoolean("hide_toolbar", true);
cards = prefs.getBoolean("cards", true);
dividers = prefs.getBoolean("dividers", true);
category = prefs.getBoolean("group_category", false);
@@ -488,6 +490,7 @@ public class FragmentMessages extends FragmentBase
date_bold = prefs.getBoolean("date_bold", false);
threading = (prefs.getBoolean("threading", true) ||
args.getBoolean("force_threading"));
+ swipenav = prefs.getBoolean("swipenav", true);
seekbar = prefs.getBoolean("seekbar", false);
actionbar = prefs.getBoolean("actionbar", true);
boolean actionbar_swap = prefs.getBoolean("actionbar_swap", false);
@@ -1105,6 +1108,8 @@ public class FragmentMessages extends FragmentBase
});
rvMessage.addOnScrollListener(new RecyclerView.OnScrollListener() {
+ private boolean show = true;
+
@Override
public void onScrolled(@NonNull RecyclerView rv, int dx, int dy) {
if (dy != 0) {
@@ -1115,6 +1120,19 @@ public class FragmentMessages extends FragmentBase
updateExpanded();
}
}
+
+ if (hide_toolbar) {
+ int range = rv.computeVerticalScrollRange();
+ int extend = rv.computeVerticalScrollExtent();
+ boolean canScrollVertical = (range > extend);
+ show = (!canScrollVertical || (rv.computeVerticalScrollOffset() == 0 || dy < 0));
+ }
+ }
+
+ @Override
+ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+ if (hide_toolbar && newState == SCROLL_STATE_IDLE)
+ showActionBar(show);
}
});
diff --git a/app/src/main/java/eu/faircode/email/FragmentOptions.java b/app/src/main/java/eu/faircode/email/FragmentOptions.java
index c4e4b097ab..e9366b139a 100644
--- a/app/src/main/java/eu/faircode/email/FragmentOptions.java
+++ b/app/src/main/java/eu/faircode/email/FragmentOptions.java
@@ -131,7 +131,7 @@ public class FragmentOptions extends FragmentBase {
"cards", "beige", "tabular_card_bg", "shadow_unread", "shadow_border", "shadow_highlight", "dividers",
"portrait2", "portrait2c", "portrait_min_size", "landscape", "landscape_min_size",
"column_width",
- "nav_categories", "nav_count", "nav_unseen_drafts", "nav_count_pinned", "navbar_colorize",
+ "hide_toolbar", "nav_categories", "nav_count", "nav_unseen_drafts", "nav_count_pinned", "navbar_colorize",
"indentation", "date", "date_week", "date_fixed", "date_bold", "threading", "threading_unread",
"highlight_unread", "highlight_color", "color_stripe", "color_stripe_wide",
"avatars", "bimi", "favicons", "generated_icons", "identicons", "circular", "saturation", "brightness", "threshold",
diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java b/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java
index 29be80fe5a..2c2b960516 100644
--- a/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java
+++ b/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java
@@ -87,6 +87,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
private SwitchCompat swClosePane;
private TextView tvColumnWidth;
private SeekBar sbColumnWidth;
+ private SwitchCompat swHideToolbar;
private SwitchCompat swNavOptions;
private SwitchCompat swNavCategories;
private SwitchCompat swNavMessageCount;
@@ -196,7 +197,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
"date", "date_week", "date_fixed", "date_bold", "group_category",
"cards", "beige", "tabular_card_bg", "shadow_unread", "shadow_border", "shadow_highlight", "dividers",
"portrait2", "portrait2c", "landscape", "close_pane", "column_width",
- "nav_options", "nav_categories", "nav_count", "nav_unseen_drafts", "nav_count_pinned", "navbar_colorize",
+ "hide_toolbar", "nav_options", "nav_categories", "nav_count", "nav_unseen_drafts", "nav_count_pinned", "navbar_colorize",
"threading", "threading_unread", "indentation", "seekbar", "actionbar", "actionbar_swap", "actionbar_color",
"highlight_unread", "highlight_color", "color_stripe", "color_stripe_wide",
"avatars", "bimi", "gravatars", "libravatars", "favicons", "favicons_partial", "generated_icons", "identicons",
@@ -250,6 +251,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
swClosePane = view.findViewById(R.id.swClosePane);
tvColumnWidth = view.findViewById(R.id.tvColumnWidth);
sbColumnWidth = view.findViewById(R.id.sbColumnWidth);
+ swHideToolbar = view.findViewById(R.id.swHideToolbar);
swNavOptions = view.findViewById(R.id.swNavOptions);
swNavCategories = view.findViewById(R.id.swNavCategories);
swNavMessageCount = view.findViewById(R.id.swNavMessageCount);
@@ -582,6 +584,13 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
}
});
+ swHideToolbar.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
+ prefs.edit().putBoolean("hide_toolbar", checked).apply();
+ }
+ });
+
swNavOptions.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@@ -1409,6 +1418,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
tvColumnWidth.setText(getString(R.string.title_advanced_column_width, NF.format(column_width)));
sbColumnWidth.setProgress(column_width);
+ swHideToolbar.setChecked(prefs.getBoolean("hide_toolbar", true));
swNavOptions.setChecked(prefs.getBoolean("nav_options", true));
swNavCategories.setChecked(prefs.getBoolean("nav_categories", false));
swNavMessageCount.setChecked(prefs.getBoolean("nav_count", false));
diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java
index db092d2f6b..5915ec3a9f 100644
--- a/app/src/main/java/eu/faircode/email/Helper.java
+++ b/app/src/main/java/eu/faircode/email/Helper.java
@@ -883,14 +883,19 @@ public class Helper {
// View
+ static Integer actionBarHeight = null;
+
static int getActionBarHeight(Context context) {
- int actionBarHeight;
- TypedValue tv = new TypedValue();
- if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
- DisplayMetrics dm = context.getResources().getDisplayMetrics();
- return TypedValue.complexToDimensionPixelSize(tv.data, dm);
- } else
- return Helper.dp2pixels(context, 56);
+ if (actionBarHeight == null) {
+ TypedValue tv = new TypedValue();
+ if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
+ DisplayMetrics dm = context.getResources().getDisplayMetrics();
+ actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, dm);
+ } else
+ actionBarHeight = Helper.dp2pixels(context, 56);
+ }
+
+ return actionBarHeight;
}
static int getBottomNavigationHeight(Context context) {
diff --git a/app/src/main/res/layout/fragment_options_display.xml b/app/src/main/res/layout/fragment_options_display.xml
index 21bcf37651..a14446dda9 100644
--- a/app/src/main/res/layout/fragment_options_display.xml
+++ b/app/src/main/res/layout/fragment_options_display.xml
@@ -537,6 +537,17 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
+
+
Minimum screen size for splitting the screen
Collapse row or column when closing a conversation
Message column width / row height: %1$s %%
+ Hide top toolbar when scrolling messages
Show navigation menu options
Show account categories in the navigation menu
Pin navigation menu
diff --git a/metadata/en-US/changelogs/2028.txt b/metadata/en-US/changelogs/2028.txt
index 9c986f8da3..aa94e659d5 100644
--- a/metadata/en-US/changelogs/2028.txt
+++ b/metadata/en-US/changelogs/2028.txt
@@ -6,6 +6,12 @@ Pelecanimimus
For support you can use the contact form.
+Next version
+
+* Auto hide top toolbar when scrolling messages
+* Small improvements and minor bug fixes
+* Updated translations
+
1.2028 - 2023-01-06
* Small improvements and minor bug fixes