From b0cfb2f1e716359c77680f11b46b3ec8b46dd781 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 28 Apr 2019 11:32:00 +0200 Subject: [PATCH] Allow collapsing part of main navigation menu --- .../java/eu/faircode/email/ActivitySetup.java | 5 ++- .../java/eu/faircode/email/ActivityView.java | 45 ++++++++++++------- .../java/eu/faircode/email/DrawerAdapter.java | 21 ++++++--- .../java/eu/faircode/email/DrawerItem.java | 16 +++++++ .../main/res/layout/item_drawer_expander.xml | 16 +++++++ 5 files changed, 79 insertions(+), 24 deletions(-) create mode 100644 app/src/main/res/layout/item_drawer_expander.xml diff --git a/app/src/main/java/eu/faircode/email/ActivitySetup.java b/app/src/main/java/eu/faircode/email/ActivitySetup.java index 435b6ccef7..b65badafcf 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySetup.java +++ b/app/src/main/java/eu/faircode/email/ActivitySetup.java @@ -85,8 +85,9 @@ import javax.crypto.spec.PBEKeySpec; public class ActivitySetup extends ActivityBilling implements FragmentManager.OnBackStackChangedListener { private View view; private DrawerLayout drawerLayout; - private ListView drawerList; private ActionBarDrawerToggle drawerToggle; + private ListView drawerList; + private DrawerAdapter drawerArray; private boolean hasAccount; private String password; @@ -132,7 +133,7 @@ public class ActivitySetup extends ActivityBilling implements FragmentManager.On drawerList = findViewById(R.id.drawer_list); - final DrawerAdapter drawerArray = new DrawerAdapter(this); + drawerArray = new DrawerAdapter(this, false); drawerList.setAdapter(drawerArray); drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index f1faa9328e..880dcbb1c6 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -99,10 +99,11 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB private String startup; private View view; - private DrawerLayout drawerLayout; private Group grpPane; - private ListView drawerList; + private DrawerLayout drawerLayout; private ActionBarDrawerToggle drawerToggle; + private ListView drawerList; + private DrawerAdapter drawerArray; private long message = -1; private long attachment = -1; @@ -157,11 +158,11 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB getSupportActionBar().setDisplayHomeAsUpEnabled(true); + grpPane = findViewById(R.id.grpPane); + drawerLayout = findViewById(R.id.drawer_layout); drawerLayout.setScrimColor(Helper.resolveColor(this, R.attr.colorDrawerScrim)); - grpPane = findViewById(R.id.grpPane); - drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.app_name, R.string.app_name) { public void onDrawerClosed(View view) { super.onDrawerClosed(view); @@ -177,7 +178,9 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB drawerList = findViewById(R.id.drawer_list); - final DrawerAdapter drawerArray = new DrawerAdapter(ActivityView.this); + boolean minimal = prefs.getBoolean("minimal", false); + drawerArray = new DrawerAdapter(this, minimal); + drawerList.setAdapter(drawerArray); drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @@ -198,6 +201,9 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB case R.string.menu_setup: onMenuSetup(); break; + case R.string.title_legend_expander: + onMenuCollapse(); + return; case R.string.menu_legend: onMenuLegend(); break; @@ -351,18 +357,19 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB items.add(new DrawerItem(-5, R.drawable.baseline_settings_applications_24, R.string.menu_setup)); items.add(new DrawerItem(-6)); - items.add(new DrawerItem(-7, R.drawable.baseline_help_24, R.string.menu_legend)); + items.add(new DrawerItem(-7, R.string.title_legend_expander)); + items.add(new DrawerItem(-8, R.drawable.baseline_help_24, R.string.menu_legend).setCollapsible()); if (Helper.getIntentFAQ().resolveActivity(getPackageManager()) != null) - items.add(new DrawerItem(-8, R.drawable.baseline_question_answer_24, R.string.menu_faq)); + items.add(new DrawerItem(-9, R.drawable.baseline_question_answer_24, R.string.menu_faq).setCollapsible()); if (BuildConfig.BETA_RELEASE) - items.add(new DrawerItem(-9, R.drawable.baseline_report_problem_24, R.string.menu_issue)); + items.add(new DrawerItem(-10, R.drawable.baseline_report_problem_24, R.string.menu_issue).setCollapsible()); if (Helper.getIntentPrivacy().resolveActivity(getPackageManager()) != null) - items.add(new DrawerItem(-10, R.drawable.baseline_account_box_24, R.string.menu_privacy)); + items.add(new DrawerItem(-11, R.drawable.baseline_account_box_24, R.string.menu_privacy).setCollapsible()); - items.add(new DrawerItem(-11, R.drawable.baseline_info_24, R.string.menu_about)); + items.add(new DrawerItem(-12, R.drawable.baseline_info_24, R.string.menu_about).setCollapsible()); boolean pro = (getIntentPro() == null || getIntentPro().resolveActivity(getPackageManager()) != null); boolean invite = (getIntentInvite().resolveActivity(getPackageManager()) != null); @@ -370,19 +377,19 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB boolean other = (getIntentOtherApps().resolveActivity(getPackageManager()) != null); if (pro || invite || rate || other) - items.add(new DrawerItem(-12)); + items.add(new DrawerItem(-13).setCollapsible()); if (pro) - items.add(new DrawerItem(-13, R.drawable.baseline_monetization_on_24, R.string.menu_pro)); + items.add(new DrawerItem(-14, R.drawable.baseline_monetization_on_24, R.string.menu_pro).setCollapsible()); if (invite) - items.add(new DrawerItem(-14, R.drawable.baseline_people_24, R.string.menu_invite)); + items.add(new DrawerItem(-15, R.drawable.baseline_people_24, R.string.menu_invite).setCollapsible()); if (rate) - items.add(new DrawerItem(-15, R.drawable.baseline_star_24, R.string.menu_rate)); + items.add(new DrawerItem(-16, R.drawable.baseline_star_24, R.string.menu_rate).setCollapsible()); if (other) - items.add(new DrawerItem(-16, R.drawable.baseline_get_app_24, R.string.menu_other)); + items.add(new DrawerItem(-17, R.drawable.baseline_get_app_24, R.string.menu_other).setCollapsible()); drawerArray.set(items); } @@ -954,6 +961,14 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB startActivity(new Intent(ActivityView.this, ActivitySetup.class)); } + private void onMenuCollapse() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + boolean minimal = !prefs.getBoolean("minimal", false); + prefs.edit().putBoolean("minimal", minimal).apply(); + drawerArray.set(minimal); + drawerArray.notifyDataSetChanged(); + } + private void onMenuLegend() { if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) getSupportFragmentManager().popBackStack("legend", FragmentManager.POP_BACK_STACK_INCLUSIVE); diff --git a/app/src/main/java/eu/faircode/email/DrawerAdapter.java b/app/src/main/java/eu/faircode/email/DrawerAdapter.java index 409fd54a8d..c5c70f8aab 100644 --- a/app/src/main/java/eu/faircode/email/DrawerAdapter.java +++ b/app/src/main/java/eu/faircode/email/DrawerAdapter.java @@ -15,10 +15,12 @@ import java.util.ArrayList; import java.util.List; public class DrawerAdapter extends ArrayAdapter { + private boolean collapsed = false; private List items = new ArrayList<>(); - DrawerAdapter(@NonNull Context context) { + DrawerAdapter(@NonNull Context context, boolean collapsed) { super(context, -1); + this.collapsed = collapsed; } @NonNull @@ -28,6 +30,7 @@ public class DrawerAdapter extends ArrayAdapter { ImageView iv = row.findViewById(R.id.ivItem); TextView tv = row.findViewById(R.id.tvItem); + ImageView expander = row.findViewById(R.id.ivExpander); if (iv != null) { iv.setImageResource(item.getIcon()); @@ -42,9 +45,19 @@ public class DrawerAdapter extends ArrayAdapter { item.getHighlight() ? R.attr.colorUnread : android.R.attr.textColorSecondary)); } + if (expander != null) + expander.setImageLevel(collapsed ? 1 /* more */ : 0 /* less */); + + row.setVisibility(item.isCollapsible() && collapsed ? View.GONE : View.VISIBLE); + return row; } + void set(boolean collapsed) { + this.collapsed = collapsed; + notifyDataSetChanged(); + } + void set(List items) { this.items = items; notifyDataSetChanged(); @@ -74,10 +87,4 @@ public class DrawerAdapter extends ArrayAdapter { DrawerItem item = getItem(position); return (item == null ? 0 : item.getId()); } - - @Override - public boolean isEnabled(int position) { - DrawerItem item = getItem(position); - return (item != null && item.isEnabled()); - } } diff --git a/app/src/main/java/eu/faircode/email/DrawerItem.java b/app/src/main/java/eu/faircode/email/DrawerItem.java index 2891396966..19399774c1 100644 --- a/app/src/main/java/eu/faircode/email/DrawerItem.java +++ b/app/src/main/java/eu/faircode/email/DrawerItem.java @@ -11,12 +11,19 @@ public class DrawerItem { private int resid; private String title; private boolean highlight; + private boolean collapsible = false; DrawerItem(long id) { this.id = id; this.layout = R.layout.item_drawer_separator; } + DrawerItem(long id, int resid) { + this.id = id; + this.menu = resid; + this.layout = R.layout.item_drawer_expander; + } + DrawerItem(long id, int icon, int resid) { this.id = id; this.menu = resid; @@ -43,6 +50,11 @@ public class DrawerItem { this.highlight = highlight; } + DrawerItem setCollapsible() { + this.collapsible = true; + return this; + } + int getLayout() { return this.layout; } @@ -76,4 +88,8 @@ public class DrawerItem { boolean getHighlight() { return this.highlight; } + + boolean isCollapsible() { + return this.collapsible; + } } diff --git a/app/src/main/res/layout/item_drawer_expander.xml b/app/src/main/res/layout/item_drawer_expander.xml new file mode 100644 index 0000000000..417636a373 --- /dev/null +++ b/app/src/main/res/layout/item_drawer_expander.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file