From de672d0c0528b7e52129461b0cae2c26a6db4c93 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 7 Jan 2023 11:26:19 +0100 Subject: [PATCH] Added auto hide toolbar --- CHANGELOG.md | 6 +++ app/src/main/assets/CHANGELOG.md | 6 +++ .../java/eu/faircode/email/ActivityBase.java | 39 +++++++++++++++++++ .../java/eu/faircode/email/ActivityView.java | 2 + .../java/eu/faircode/email/FragmentBase.java | 6 +++ .../eu/faircode/email/FragmentMessages.java | 20 +++++++++- .../eu/faircode/email/FragmentOptions.java | 2 +- .../email/FragmentOptionsDisplay.java | 12 +++++- .../main/java/eu/faircode/email/Helper.java | 19 +++++---- .../res/layout/fragment_options_display.xml | 13 ++++++- app/src/main/res/values/strings.xml | 1 + metadata/en-US/changelogs/2028.txt | 6 +++ 12 files changed, 121 insertions(+), 11 deletions(-) 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