diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 6adc3f043e..68992f241e 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -31,6 +31,7 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -40,6 +41,7 @@ import android.text.TextUtils; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ScrollView; import android.widget.Toast; @@ -78,6 +80,8 @@ import java.util.List; import javax.net.ssl.HttpsURLConnection; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; +import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_LOCKED_OPEN; +import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_UNLOCKED; public class ActivityView extends ActivityBilling implements FragmentManager.OnBackStackChangedListener { private String startup; @@ -138,8 +142,10 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB Configuration config = getResources().getConfiguration(); boolean normal = config.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_NORMAL); - boolean landscape = prefs.getBoolean("landscape", true); - Log.i("Orientation=" + config.orientation + " normal=" + normal + " landscape=" + landscape); + final boolean landscape = prefs.getBoolean("landscape", true); + final boolean landscape3 = prefs.getBoolean("landscape3", true); + Log.i("Orientation=" + config.orientation + " normal=" + normal + + " landscape=" + landscape + "/" + landscape3); view = LayoutInflater.from(this).inflate( config.orientation == ORIENTATION_PORTRAIT || !normal || !landscape @@ -154,13 +160,34 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB drawerLayout = findViewById(R.id.drawer_layout); + final ViewGroup childContent = (ViewGroup) drawerLayout.getChildAt(0); + final ViewGroup childDrawer = (ViewGroup) drawerLayout.getChildAt(1); drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.app_name, R.string.app_name) { public void onDrawerClosed(View view) { + if (landscape && landscape3 && + config.orientation == Configuration.ORIENTATION_LANDSCAPE) { + drawerLayout.setDrawerLockMode(LOCK_MODE_UNLOCKED); + drawerLayout.setScrimColor(Helper.resolveColor(ActivityView.this, R.attr.colorDrawerScrim)); + } super.onDrawerClosed(view); } public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); + if (landscape && landscape3 && + config.orientation == Configuration.ORIENTATION_LANDSCAPE) { + drawerLayout.setDrawerLockMode(LOCK_MODE_LOCKED_OPEN); + drawerLayout.setScrimColor(Color.TRANSPARENT); + } + } + + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + super.onDrawerSlide(drawerView, slideOffset); + if (landscape && landscape3 && + config.orientation == Configuration.ORIENTATION_LANDSCAPE) + childContent.setPaddingRelative( + Math.round(slideOffset * childDrawer.getLayoutParams().width), 0, 0, 0); } }; drawerLayout.addDrawerListener(drawerToggle); @@ -262,7 +289,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB final NavMenuItem navOperations = new NavMenuItem(R.drawable.baseline_dns_24, R.string.menu_operations, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuOperations(); } }); @@ -272,7 +300,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB menus.add(new NavMenuItem(R.drawable.baseline_list_24, R.string.title_log, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onShowLog(); } })); @@ -280,7 +309,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB menus.add(new NavMenuItem(R.drawable.baseline_reply_24, R.string.menu_answers, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuAnswers(); } })); @@ -288,7 +318,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB menus.add(new NavMenuItem(R.drawable.baseline_settings_applications_24, R.string.menu_setup, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuSetup(); } })); @@ -302,7 +333,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_help_24, R.string.menu_legend, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuLegend(); } })); @@ -310,13 +342,15 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_question_answer_24, R.string.menu_faq, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuFAQ(); } }, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onDebugInfo(); } }).setExternal(true)); @@ -325,7 +359,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_feedback_24, R.string.menu_issue, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuIssue(); } }).setExternal(true)); @@ -334,7 +369,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_bug_report_24, R.string.menu_test, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuTest(); } }).setExternal(true)); @@ -342,7 +378,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_account_box_24, R.string.menu_privacy, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuPrivacy(); } })); @@ -356,7 +393,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB @Override public void run() { if (!Helper.isPlayStoreInstall()) { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); checkUpdate(true); } } @@ -365,7 +403,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_monetization_on_24, R.string.menu_pro, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); startActivity(new Intent(ActivityView.this, ActivityBilling.class)); } })); @@ -374,7 +413,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_people_24, R.string.menu_invite, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuInvite(); } }).setExternal(true)); @@ -384,7 +424,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_star_24, R.string.menu_rate, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuRate(); } }).setExternal(true)); @@ -393,7 +434,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB extra.add(new NavMenuItem(R.drawable.baseline_get_app_24, R.string.menu_other, new Runnable() { @Override public void run() { - drawerLayout.closeDrawer(drawerContainer); + if (!drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); onMenuOtherApps(); } }).setExternal(true)); @@ -546,10 +588,11 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB @Override public void onBackPressed() { - if (drawerLayout.isDrawerOpen(drawerContainer)) + int count = getSupportFragmentManager().getBackStackEntryCount(); + if (drawerLayout.isDrawerOpen(drawerContainer) && + !drawerLayout.isLocked(drawerContainer)) drawerLayout.closeDrawer(drawerContainer); else { - int count = getSupportFragmentManager().getBackStackEntryCount(); if (exit || count > 1) super.onBackPressed(); else if (!backHandled()) { @@ -577,7 +620,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB if (count == 0) finish(); else { - if (drawerLayout.isDrawerOpen(drawerContainer)) + if (drawerLayout.isDrawerOpen(drawerContainer) && + !drawerLayout.isLocked(drawerContainer)) drawerLayout.closeDrawer(drawerContainer); drawerToggle.setDrawerIndicatorEnabled(count == 1); @@ -591,8 +635,12 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB @Override public boolean onOptionsItemSelected(MenuItem item) { - if (drawerToggle.onOptionsItemSelected(item)) + if (drawerToggle.onOptionsItemSelected(item)) { + int count = getSupportFragmentManager().getBackStackEntryCount(); + if (count == 1 && drawerLayout.isLocked(drawerContainer)) + drawerLayout.closeDrawer(drawerContainer); return true; + } return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/eu/faircode/email/DrawerLayoutEx.java b/app/src/main/java/eu/faircode/email/DrawerLayoutEx.java index d354eb2df3..0a1986f5d3 100644 --- a/app/src/main/java/eu/faircode/email/DrawerLayoutEx.java +++ b/app/src/main/java/eu/faircode/email/DrawerLayoutEx.java @@ -20,24 +20,17 @@ package eu.faircode.email; */ import android.content.Context; -import android.content.SharedPreferences; import android.content.res.Configuration; -import android.graphics.Color; -import android.os.Parcelable; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.drawerlayout.widget.DrawerLayout; -import androidx.preference.PreferenceManager; public class DrawerLayoutEx extends DrawerLayout { - private boolean locked = false; - public DrawerLayoutEx(@NonNull Context context) { super(context); } @@ -52,32 +45,14 @@ public class DrawerLayoutEx extends DrawerLayout { void setup(Configuration config, View drawerContainer) { setScrimColor(Helper.resolveColor(getContext(), R.attr.colorDrawerScrim)); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - boolean landscape = prefs.getBoolean("landscape", true); - boolean landscape3 = prefs.getBoolean("landscape3", false); - if (landscape && landscape3) { - ViewGroup childContent = (ViewGroup) getChildAt(0); - ViewGroup childDrawer = (ViewGroup) getChildAt(1); - if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) { - locked = true; - setDrawerLockMode(LOCK_MODE_LOCKED_OPEN); - setScrimColor(Color.TRANSPARENT); - childContent.setPaddingRelative(childDrawer.getLayoutParams().width, 0, 0, 0); - } else { - locked = false; - setDrawerLockMode(LOCK_MODE_UNLOCKED); - setScrimColor(Helper.resolveColor(getContext(), R.attr.colorDrawerScrim)); - childContent.setPaddingRelative(0, 0, 0, 0); - closeDrawer(drawerContainer, false); - } + if (config.orientation != Configuration.ORIENTATION_LANDSCAPE) { + setDrawerLockMode(LOCK_MODE_UNLOCKED); + closeDrawer(drawerContainer, false); } } - @Override - protected void onRestoreInstanceState(Parcelable state) { - super.onRestoreInstanceState(state); - locked = isLocked(); + public boolean isLocked(View view) { + return (getDrawerLockMode(view) != LOCK_MODE_UNLOCKED); } public boolean isLocked() { @@ -85,24 +60,8 @@ public class DrawerLayoutEx extends DrawerLayout { getDrawerLockMode(Gravity.RIGHT) == LOCK_MODE_LOCKED_OPEN); } - @Override - public boolean isDrawerOpen(@NonNull View drawer) { - return (!locked && super.isDrawerOpen(drawer)); - } - - @Override - public boolean isDrawerOpen(int drawerGravity) { - return (!locked && super.isDrawerOpen(drawerGravity)); - } - @Override public boolean onInterceptTouchEvent(final MotionEvent ev) { - return (!locked && super.onInterceptTouchEvent(ev)); - } - - @Override - public void closeDrawer(@NonNull View drawerView) { - if (!locked) - super.closeDrawer(drawerView); + return (!isLocked() && super.onInterceptTouchEvent(ev)); } } diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java b/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java index 76f6ddfa81..c4550fbbd9 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java @@ -569,7 +569,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer swLandscape.setChecked(prefs.getBoolean("landscape", true)); swLandscape.setEnabled(normal); - swLandscape3.setChecked(prefs.getBoolean("landscape3", false)); + swLandscape3.setChecked(prefs.getBoolean("landscape3", true)); swLandscape3.setEnabled(normal && swLandscape.isChecked()); String startup = prefs.getString("startup", "unified"); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72e2b61c8b..3cf64d7549 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -263,7 +263,7 @@ Manage connectivity Use two columns in landscape mode - Always show navigation menu in landscape mode + Allow fixed navigation menu in landscape mode Show on start screen Show cards Group by date