Added inline nav menu pinning

This commit is contained in:
M66B
2021-08-11 18:37:41 +02:00
parent b1a0ae247a
commit 5d069f5e9c
16 changed files with 187 additions and 157 deletions

View File

@@ -34,6 +34,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
@@ -87,7 +88,11 @@ import javax.net.ssl.HttpsURLConnection;
public class ActivityView extends ActivityBilling implements FragmentManager.OnBackStackChangedListener {
private String startup;
private boolean nav_pinned;
private boolean nav_expanded;
private int colorDrawerScrim;
private int layoutId;
private View view;
private View content_separator;
@@ -97,6 +102,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
private DrawerLayoutEx drawerLayout;
private ActionBarDrawerToggle drawerToggle;
private NestedScrollView drawerContainer;
private ImageButton ibPin;
private ImageButton ibExpanderNav;
private ImageButton ibExpanderAccount;
private RecyclerView rvAccount;
@@ -109,8 +115,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
private ImageButton ibExpanderExtra;
private RecyclerView rvMenuExtra;
private boolean nav_fixed;
private boolean expanded;
private AdapterNavAccount adapterNavAccount;
private AdapterNavUnified adapterNavUnified;
private AdapterNavFolder adapterNavFolder;
@@ -174,27 +178,28 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
if (savedInstanceState != null)
searching = savedInstanceState.getBoolean("fair:searching");
colorDrawerScrim = Helper.resolveColor(this, R.attr.colorDrawerScrim);
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
startup = prefs.getString("startup", "unified");
nav_pinned = getDrawerPinned();
nav_expanded = prefs.getBoolean("nav_expanded", true);
Configuration config = getResources().getConfiguration();
final boolean portrait2 = prefs.getBoolean("portrait2", false);
final boolean portrait2c = prefs.getBoolean("portrait2c", false);
final boolean portrait3 = prefs.getBoolean("portrait3", false);
final boolean landscape = prefs.getBoolean("landscape", true);
final boolean landscape3 = prefs.getBoolean("landscape3", true);
boolean portrait2 = prefs.getBoolean("portrait2", false);
boolean portrait2c = prefs.getBoolean("portrait2c", false);
boolean landscape = prefs.getBoolean("landscape", true);
Log.i("Orientation=" + config.orientation +
" portrait 2=" + portrait2 + " 2c=" + portrait2c + " nav=" + portrait3 +
" landscape 2=" + landscape + " nav=" + landscape3);
" portrait rows=" + portrait2 + " cols=" + portrait2c + " landscape cols=" + landscape);
int viewId;
if (config.orientation == ORIENTATION_PORTRAIT && portrait2c)
viewId = R.layout.activity_view_landscape_split;
layoutId = R.layout.activity_view_landscape_split;
else if (config.orientation == ORIENTATION_PORTRAIT || !landscape)
viewId = (portrait2 ? R.layout.activity_view_portrait_split : R.layout.activity_view_portrait);
layoutId = (portrait2 ? R.layout.activity_view_portrait_split : R.layout.activity_view_portrait);
else
viewId = R.layout.activity_view_landscape_split;
view = LayoutInflater.from(this).inflate(viewId, null);
layoutId = R.layout.activity_view_landscape_split;
view = LayoutInflater.from(this).inflate(layoutId, null);
setContentView(view);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@@ -237,10 +242,10 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
Log.i("Drawer opened");
owner.start();
if (((portrait3 && config.orientation == Configuration.ORIENTATION_PORTRAIT) ||
(landscape3 && config.orientation == Configuration.ORIENTATION_LANDSCAPE))) {
if (nav_pinned) {
drawerLayout.setDrawerLockMode(LOCK_MODE_LOCKED_OPEN);
childContent.setPaddingRelative(childDrawer.getLayoutParams().width, 0, 0, 0);
int padding = childDrawer.getLayoutParams().width;
childContent.setPaddingRelative(padding, 0, 0, 0);
}
}
@@ -253,69 +258,73 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
else
owner.stop();
if (((portrait3 && config.orientation == Configuration.ORIENTATION_PORTRAIT) ||
(landscape3 && config.orientation == Configuration.ORIENTATION_LANDSCAPE)))
childContent.setPaddingRelative(
Math.round(slideOffset * childDrawer.getLayoutParams().width), 0, 0, 0);
if (nav_pinned) {
int padding = Math.round(slideOffset * childDrawer.getLayoutParams().width);
childContent.setPaddingRelative(padding, 0, 0, 0);
}
}
};
drawerLayout.addDrawerListener(drawerToggle);
drawerContainer = findViewById(R.id.drawer_container);
int drawerWidth;
DisplayMetrics dm = getResources().getDisplayMetrics();
if (viewId == R.layout.activity_view_landscape_split && landscape3) {
drawerWidth = Helper.dp2pixels(this, 300);
nav_fixed = true;
} else if (viewId != R.layout.activity_view_landscape_split && portrait3) {
drawerWidth = Math.min(Helper.dp2pixels(this, 300), dm.widthPixels / 2);
nav_fixed = true;
} else {
int actionBarHeight;
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, dm);
else
actionBarHeight = Helper.dp2pixels(this, 56);
int screenWidth = Math.min(dm.widthPixels, dm.heightPixels);
int dp320 = Helper.dp2pixels(this, 320);
drawerWidth = Math.min(screenWidth - actionBarHeight, dp320);
}
int dp48 = Helper.dp2pixels(this, 48);
expanded = (!nav_fixed || prefs.getBoolean("nav_expanded", true));
ViewGroup.LayoutParams lparam = drawerContainer.getLayoutParams();
lparam.width = (expanded ? drawerWidth : dp48);
lparam.width = getDrawerWidth();
drawerContainer.setLayoutParams(lparam);
ibPin = drawerContainer.findViewById(R.id.ibPin);
ibPin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
nav_pinned = !nav_pinned;
if (config.orientation == ORIENTATION_PORTRAIT)
prefs.edit().putBoolean("portrait3", nav_pinned).apply();
else
prefs.edit().putBoolean("landscape3", nav_pinned).apply();
drawerLayout.setDrawerLockMode(nav_pinned ? LOCK_MODE_LOCKED_OPEN : LOCK_MODE_UNLOCKED);
drawerLayout.setScrimColor(nav_pinned ? Color.TRANSPARENT : colorDrawerScrim);
drawerLayout.openDrawer(drawerContainer, false);
ViewGroup.LayoutParams lparam = drawerContainer.getLayoutParams();
lparam.width = getDrawerWidth();
drawerContainer.setLayoutParams(lparam);
int padding = (nav_pinned ? childDrawer.getLayoutParams().width : 0);
childContent.setPaddingRelative(padding, 0, 0, 0);
ibPin.setImageLevel(nav_pinned ? 1 : 0);
}
});
ibPin.setImageLevel(nav_pinned ? 1 : 0);
ibPin.setVisibility(nav_expanded ? View.VISIBLE : View.GONE);
// Navigation expander
ibExpanderNav = drawerContainer.findViewById(R.id.ibExpanderNav);
ibExpanderNav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
expanded = !expanded;
prefs.edit().putBoolean("nav_expanded", expanded).apply();
nav_expanded = !nav_expanded;
prefs.edit().putBoolean("nav_expanded", nav_expanded).apply();
lparam.width = (expanded ? drawerWidth : dp48);
ViewGroup.LayoutParams lparam = drawerContainer.getLayoutParams();
lparam.width = getDrawerWidth();
drawerContainer.setLayoutParams(lparam);
if (nav_fixed)
childContent.setPaddingRelative(childDrawer.getLayoutParams().width, 0, 0, 0);
int padding = (nav_pinned ? childDrawer.getLayoutParams().width : 0);
childContent.setPaddingRelative(padding, 0, 0, 0);
ibExpanderNav.setImageLevel(expanded ? 0 : 1);
ibPin.setVisibility(nav_expanded ? View.VISIBLE : View.GONE);
ibExpanderNav.setImageLevel(nav_expanded ? 0 : 1);
adapterNavAccount.setExpanded(expanded);
adapterNavUnified.setExpanded(expanded);
adapterNavFolder.setExpanded(expanded);
adapterNavMenu.setExpanded(expanded);
adapterNavMenuExtra.setExpanded(expanded);
adapterNavAccount.setExpanded(nav_expanded);
adapterNavUnified.setExpanded(nav_expanded);
adapterNavFolder.setExpanded(nav_expanded);
adapterNavMenu.setExpanded(nav_expanded);
adapterNavMenuExtra.setExpanded(nav_expanded);
}
});
ibExpanderNav.setImageLevel(expanded ? 0 : 1);
ibExpanderNav.setVisibility(nav_fixed ? View.VISIBLE : View.GONE);
ibExpanderNav.setImageLevel(nav_expanded ? 0 : 1);
// Accounts
ibExpanderAccount = drawerContainer.findViewById(R.id.ibExpanderAccount);
@@ -560,7 +569,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
}
}));
adapterNavMenu.set(menus, expanded);
adapterNavMenu.set(menus, nav_expanded);
// Collapsible menus
@@ -663,7 +672,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
}
}).setExternal(true));
adapterNavMenuExtra.set(extra, expanded);
adapterNavMenuExtra.set(extra, nav_expanded);
// Live data
@@ -674,7 +683,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
public void onChanged(@Nullable List<TupleAccountEx> accounts) {
if (accounts == null)
accounts = new ArrayList<>();
adapterNavAccount.set(accounts, expanded);
adapterNavAccount.set(accounts, nav_expanded);
}
});
@@ -683,7 +692,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
public void onChanged(List<TupleFolderUnified> folders) {
if (folders == null)
folders = new ArrayList<>();
adapterNavUnified.set(folders, expanded);
adapterNavUnified.set(folders, nav_expanded);
}
});
@@ -692,7 +701,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
public void onChanged(List<TupleFolderNav> folders) {
if (folders == null)
folders = new ArrayList<>();
adapterNavFolder.set(folders, expanded);
adapterNavFolder.set(folders, nav_expanded);
}
});
@@ -708,7 +717,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
Log.i("Drawer start");
owner.start();
drawerLayout.setup(getResources().getConfiguration(), drawerContainer, drawerToggle);
setupDrawer();
drawerToggle.syncState();
}
@@ -762,14 +771,58 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerLayout.setup(newConfig, drawerContainer, drawerToggle);
nav_pinned = getDrawerPinned();
setupDrawer();
drawerToggle.onConfigurationChanged(newConfig);
}
private void setupDrawer() {
if (nav_pinned) {
drawerLayout.setScrimColor(Color.TRANSPARENT);
drawerLayout.openDrawer(drawerContainer, false);
drawerToggle.onDrawerOpened(drawerContainer);
} else {
drawerLayout.setScrimColor(colorDrawerScrim);
drawerLayout.closeDrawer(drawerContainer, false);
drawerToggle.onDrawerClosed(drawerContainer);
}
}
private boolean getDrawerPinned() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean portrait3 = prefs.getBoolean("portrait3", false);
boolean landscape3 = prefs.getBoolean("landscape3", true);
Configuration config = getResources().getConfiguration();
return (config.orientation == ORIENTATION_PORTRAIT ? portrait3 : landscape3);
}
private int getDrawerWidth() {
if (!nav_expanded)
return Helper.dp2pixels(this, 48);
DisplayMetrics dm = getResources().getDisplayMetrics();
if (layoutId == R.layout.activity_view_landscape_split && nav_pinned)
return Helper.dp2pixels(this, 300);
else if (layoutId != R.layout.activity_view_landscape_split && nav_pinned)
return Math.min(Helper.dp2pixels(this, 300), dm.widthPixels / 2);
else {
int actionBarHeight;
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, dm);
else
actionBarHeight = Helper.dp2pixels(this, 56);
int screenWidth = Math.min(dm.widthPixels, dm.heightPixels);
int dp320 = Helper.dp2pixels(this, 320);
return Math.min(screenWidth - actionBarHeight, dp320);
}
}
@Override
public void onBackPressed() {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (!nav_fixed &&
if (!nav_pinned &&
drawerLayout.isDrawerOpen(drawerContainer) &&
(!drawerLayout.isLocked(drawerContainer) || count == 1))
drawerLayout.closeDrawer(drawerContainer);

View File

@@ -20,9 +20,6 @@ package eu.faircode.email;
*/
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.Gravity;
@@ -31,9 +28,7 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.preference.PreferenceManager;
public class DrawerLayoutEx extends DrawerLayout {
public DrawerLayoutEx(@NonNull Context context) {
@@ -48,28 +43,11 @@ public class DrawerLayoutEx extends DrawerLayout {
super(context, attrs, defStyle);
}
void setup(Configuration config, View drawerContainer, ActionBarDrawerToggle drawerToggle) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
boolean portrait3 = prefs.getBoolean("portrait3", false);
boolean landscape3 = prefs.getBoolean("landscape3", true);
if (((portrait3 && config.orientation == Configuration.ORIENTATION_PORTRAIT) ||
(landscape3 && config.orientation == Configuration.ORIENTATION_LANDSCAPE))) {
setScrimColor(Color.TRANSPARENT);
openDrawer(drawerContainer, false);
drawerToggle.onDrawerOpened(drawerContainer);
} else {
setScrimColor(Helper.resolveColor(getContext(), R.attr.colorDrawerScrim));
closeDrawer(drawerContainer, false);
drawerToggle.onDrawerClosed(drawerContainer);
}
}
public boolean isLocked(View view) {
return (getDrawerLockMode(view) != LOCK_MODE_UNLOCKED);
}
public boolean isLocked() {
private boolean isLocked() {
return (getDrawerLockMode(Gravity.LEFT) == LOCK_MODE_LOCKED_OPEN ||
getDrawerLockMode(Gravity.RIGHT) == LOCK_MODE_LOCKED_OPEN);
}

View File

@@ -108,7 +108,7 @@ public class FragmentOptions extends FragmentBase {
"subscriptions",
"check_authentication", "check_reply_domain", "check_mx", "check_blocklist",
"send_pending",
"portrait2", "portrait2c", "portrait3", "landscape", "landscape3", "nav_count", "startup",
"portrait2", "portrait2c", "landscape", "nav_count", "startup",
"cards", "beige", "tabular_card_bg", "shadow_unread",
"indentation", "date", "date_bold", "threading", "threading_unread",
"highlight_unread", "highlight_color", "color_stripe",

View File

@@ -22,7 +22,6 @@ package eu.faircode.email;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
@@ -69,9 +68,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
private SwitchCompat swNavBarColorize;
private SwitchCompat swPortrait2;
private SwitchCompat swPortrait2c;
private SwitchCompat swPortrait3;
private SwitchCompat swLandscape;
private SwitchCompat swLandscape3;
private SwitchCompat swNavMessageCount;
private SwitchCompat swThreading;
@@ -157,7 +154,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
private final static String[] RESET_OPTIONS = new String[]{
"theme", "startup", "cards", "beige", "tabular_card_bg", "shadow_unread",
"date", "date_bold", "navbar_colorize",
"portrait2", "portrait2c", "portrait3", "landscape", "landscape3", "nav_count",
"portrait2", "portrait2c", "landscape", "nav_count",
"threading", "threading_unread", "indentation", "seekbar", "actionbar", "actionbar_color",
"highlight_unread", "highlight_color", "color_stripe",
"avatars", "bimi", "gravatars", "favicons", "generated_icons", "identicons", "circular", "saturation", "brightness", "threshold",
@@ -194,9 +191,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
swNavBarColorize = view.findViewById(R.id.swNavBarColorize);
swPortrait2 = view.findViewById(R.id.swPortrait2);
swPortrait2c = view.findViewById(R.id.swPortrait2c);
swPortrait3 = view.findViewById(R.id.swPortrait3);
swLandscape = view.findViewById(R.id.swLandscape);
swLandscape3 = view.findViewById(R.id.swLandscape3);
swNavMessageCount = view.findViewById(R.id.swNavMessageCount);
swThreading = view.findViewById(R.id.swThreading);
@@ -375,13 +370,6 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
}
});
swPortrait3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("portrait3", checked).apply();
}
});
swLandscape.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@@ -389,13 +377,6 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
}
});
swLandscape3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("landscape3", checked).apply();
}
});
swNavMessageCount.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@@ -1044,9 +1025,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
swNavBarColorize.setChecked(prefs.getBoolean("navbar_colorize", false));
swPortrait2.setChecked(prefs.getBoolean("portrait2", false));
swPortrait2c.setChecked(prefs.getBoolean("portrait2c", false) && !swPortrait2.isChecked());
swPortrait3.setChecked(prefs.getBoolean("portrait3", false));
swLandscape.setChecked(prefs.getBoolean("landscape", true));
swLandscape3.setChecked(prefs.getBoolean("landscape3", true));
swNavMessageCount.setChecked(prefs.getBoolean("nav_count", false));
swThreading.setChecked(prefs.getBoolean("threading", true));