diff --git a/app/src/main/java/eu/faircode/email/ActivitySetup.java b/app/src/main/java/eu/faircode/email/ActivitySetup.java index edc7339b67..7c19fab438 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySetup.java +++ b/app/src/main/java/eu/faircode/email/ActivitySetup.java @@ -29,6 +29,8 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.AssetFileDescriptor; import android.content.res.Configuration; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -50,6 +52,7 @@ import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Observer; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -134,10 +137,24 @@ public class ActivitySetup extends ActivityBilling implements FragmentManager.On drawerContainer = findViewById(R.id.drawer_container); rvMenu = drawerContainer.findViewById(R.id.rvMenu); - rvMenu.setLayoutManager(new LinearLayoutManager(this)); + LinearLayoutManager llm = new LinearLayoutManager(this); + rvMenu.setLayoutManager(llm); final AdapterNavMenu adapter = new AdapterNavMenu(this, this); rvMenu.setAdapter(adapter); + final Drawable d = getDrawable(R.drawable.divider); + DividerItemDecoration itemDecorator = new DividerItemDecoration(this, llm.getOrientation()) { + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + int pos = parent.getChildAdapterPosition(view); + NavMenuItem menu = adapter.get(pos); + Log.i("pos=" + pos + " separated=" + menu.isSeparated()); + outRect.set(0, 0, 0, menu.isSeparated() ? d.getIntrinsicHeight() : 0); + } + }; + itemDecorator.setDrawable(d); + rvMenu.addItemDecoration(itemDecorator); + PackageManager pm = getPackageManager(); final List menus = new ArrayList<>(); @@ -155,7 +172,7 @@ public class ActivitySetup extends ActivityBilling implements FragmentManager.On drawerLayout.closeDrawer(drawerContainer); onMenuImport(); } - })); + }).setSeparated()); menus.add(new NavMenuItem(R.drawable.baseline_palette_24, R.string.title_setup_theme, new Runnable() { @Override @@ -188,7 +205,7 @@ public class ActivitySetup extends ActivityBilling implements FragmentManager.On drawerLayout.closeDrawer(drawerContainer); onMenuContacts(); } - })); + }).setSeparated()); menus.add(new NavMenuItem(R.drawable.baseline_help_24, R.string.menu_legend, new Runnable() { @Override diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 75a31f8eb3..1866d3e0db 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -29,6 +29,8 @@ import android.content.IntentFilter; import android.content.IntentSender; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -60,6 +62,7 @@ import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Observer; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -106,8 +109,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB private RecyclerView rvFolder; private RecyclerView rvMenu; private ImageView ivExpander; - private RecyclerView rvMenuExtra1; - private RecyclerView rvMenuExtra2; + private RecyclerView rvMenuExtra; private long message = -1; private long attachment = -1; @@ -197,19 +199,27 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB ivExpander = drawerContainer.findViewById(R.id.ivExpander); - rvMenuExtra1 = drawerContainer.findViewById(R.id.rvMenuExtra1); - rvMenuExtra1.setLayoutManager(new LinearLayoutManager(this)); - final AdapterNavMenu e1adapter = new AdapterNavMenu(this, this); - rvMenuExtra1.setAdapter(e1adapter); + rvMenuExtra = drawerContainer.findViewById(R.id.rvMenuExtra); + LinearLayoutManager llm = new LinearLayoutManager(this); + rvMenuExtra.setLayoutManager(llm); + final AdapterNavMenu eadapter = new AdapterNavMenu(this, this); + rvMenuExtra.setAdapter(eadapter); - rvMenuExtra2 = drawerContainer.findViewById(R.id.rvMenuExtra2); - rvMenuExtra2.setLayoutManager(new LinearLayoutManager(this)); - final AdapterNavMenu e2adapter = new AdapterNavMenu(this, this); - rvMenuExtra2.setAdapter(e2adapter); + final Drawable d = getDrawable(R.drawable.divider); + DividerItemDecoration itemDecorator = new DividerItemDecoration(this, llm.getOrientation()) { + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + int pos = parent.getChildAdapterPosition(view); + NavMenuItem menu = eadapter.get(pos); + Log.i("pos=" + pos + " separated=" + menu.isSeparated()); + outRect.set(0, 0, 0, menu.isSeparated() ? d.getIntrinsicHeight() : 0); + } + }; + itemDecorator.setDrawable(d); + rvMenuExtra.addItemDecoration(itemDecorator); boolean minimal = prefs.getBoolean("minimal", false); - rvMenuExtra1.setVisibility(minimal ? View.GONE : View.VISIBLE); - rvMenuExtra2.setVisibility(minimal ? View.GONE : View.VISIBLE); + rvMenuExtra.setVisibility(minimal ? View.GONE : View.VISIBLE); ivExpander.setImageLevel(minimal ? 1 /* more */ : 0 /* less */); ivExpander.setOnClickListener(new View.OnClickListener() { @@ -217,8 +227,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB public void onClick(View v) { boolean minimal = !prefs.getBoolean("minimal", false); prefs.edit().putBoolean("minimal", minimal).apply(); - rvMenuExtra1.setVisibility(minimal ? View.GONE : View.VISIBLE); - rvMenuExtra2.setVisibility(minimal ? View.GONE : View.VISIBLE); + rvMenuExtra.setVisibility(minimal ? View.GONE : View.VISIBLE); ivExpander.setImageLevel(minimal ? 1 /* more */ : 0 /* less */); } }); @@ -267,9 +276,9 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB madapter.set(menus); - List extra1 = new ArrayList<>(); + List extra = new ArrayList<>(); - extra1.add(new NavMenuItem(R.drawable.baseline_help_24, R.string.menu_legend, new Runnable() { + extra.add(new NavMenuItem(R.drawable.baseline_help_24, R.string.menu_legend, new Runnable() { @Override public void run() { drawerLayout.closeDrawer(drawerContainer); @@ -278,7 +287,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB })); if (Helper.getIntentFAQ().resolveActivity(getPackageManager()) != null) - extra1.add(new NavMenuItem(R.drawable.baseline_question_answer_24, R.string.menu_faq, new Runnable() { + extra.add(new NavMenuItem(R.drawable.baseline_question_answer_24, R.string.menu_faq, new Runnable() { @Override public void run() { drawerLayout.closeDrawer(drawerContainer); @@ -293,7 +302,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB })); if (Helper.getIntentPrivacy().resolveActivity(getPackageManager()) != null) - extra1.add(new NavMenuItem(R.drawable.baseline_account_box_24, R.string.menu_privacy, new Runnable() { + extra.add(new NavMenuItem(R.drawable.baseline_account_box_24, R.string.menu_privacy, new Runnable() { @Override public void run() { drawerLayout.closeDrawer(drawerContainer); @@ -307,7 +316,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB } })); - extra1.add(new NavMenuItem(R.drawable.baseline_info_24, R.string.menu_about, new Runnable() { + extra.add(new NavMenuItem(R.drawable.baseline_info_24, R.string.menu_about, new Runnable() { @Override public void run() { onMenuAbout(); @@ -320,14 +329,10 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB checkUpdate(true); } } - })); - - e1adapter.set(extra1); - - List extra2 = new ArrayList<>(); + }).setSeparated()); if (getIntentPro() == null || getIntentPro().resolveActivity(getPackageManager()) != null) - extra2.add(new NavMenuItem(R.drawable.baseline_monetization_on_24, R.string.menu_pro, new Runnable() { + extra.add(new NavMenuItem(R.drawable.baseline_monetization_on_24, R.string.menu_pro, new Runnable() { @Override public void run() { drawerLayout.closeDrawer(drawerContainer); @@ -336,7 +341,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB })); if ((getIntentInvite().resolveActivity(getPackageManager()) != null)) - extra2.add(new NavMenuItem(R.drawable.baseline_people_24, R.string.menu_invite, new Runnable() { + extra.add(new NavMenuItem(R.drawable.baseline_people_24, R.string.menu_invite, new Runnable() { @Override public void run() { drawerLayout.closeDrawer(drawerContainer); @@ -345,7 +350,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB })); if (getIntentRate().resolveActivity(getPackageManager()) != null) - extra2.add(new NavMenuItem(R.drawable.baseline_star_24, R.string.menu_rate, new Runnable() { + extra.add(new NavMenuItem(R.drawable.baseline_star_24, R.string.menu_rate, new Runnable() { @Override public void run() { drawerLayout.closeDrawer(drawerContainer); @@ -354,7 +359,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB })); if (getIntentOtherApps().resolveActivity(getPackageManager()) != null) - extra2.add(new NavMenuItem(R.drawable.baseline_get_app_24, R.string.menu_other, new Runnable() { + extra.add(new NavMenuItem(R.drawable.baseline_get_app_24, R.string.menu_other, new Runnable() { @Override public void run() { drawerLayout.closeDrawer(drawerContainer); @@ -362,7 +367,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB } })); - e2adapter.set(extra2); + eadapter.set(extra); DB db = DB.getInstance(this); diff --git a/app/src/main/java/eu/faircode/email/AdapterNavMenu.java b/app/src/main/java/eu/faircode/email/AdapterNavMenu.java index 473c3ccebe..3091a9f80f 100644 --- a/app/src/main/java/eu/faircode/email/AdapterNavMenu.java +++ b/app/src/main/java/eu/faircode/email/AdapterNavMenu.java @@ -140,6 +140,10 @@ public class AdapterNavMenu extends RecyclerView.Adapter prev = new ArrayList<>(); private List next = new ArrayList<>(); diff --git a/app/src/main/java/eu/faircode/email/NavMenuItem.java b/app/src/main/java/eu/faircode/email/NavMenuItem.java index 50f877b7e9..caf2d3dc0d 100644 --- a/app/src/main/java/eu/faircode/email/NavMenuItem.java +++ b/app/src/main/java/eu/faircode/email/NavMenuItem.java @@ -8,6 +8,7 @@ public class NavMenuItem { private int icon; private int title; private Integer count = null; + private boolean separated = false; private Runnable click; private Runnable longClick; @@ -30,6 +31,11 @@ public class NavMenuItem { this.count = count; } + NavMenuItem setSeparated() { + this.separated = true; + return this; + } + int getIcon() { return this.icon; } @@ -42,6 +48,10 @@ public class NavMenuItem { return this.count; } + boolean isSeparated() { + return this.separated; + } + void onClick() { click.run(); } diff --git a/app/src/main/res/layout/include_nav.xml b/app/src/main/res/layout/include_nav.xml index c0f4a4b99f..86fc60ffc0 100644 --- a/app/src/main/res/layout/include_nav.xml +++ b/app/src/main/res/layout/include_nav.xml @@ -62,26 +62,10 @@ app:layout_constraintTop_toBottomOf="@id/vSeparatorMenu" /> - - - - diff --git a/app/src/main/res/layout/item_nav.xml b/app/src/main/res/layout/item_nav.xml index 94f8fcb57a..75c87532ec 100644 --- a/app/src/main/res/layout/item_nav.xml +++ b/app/src/main/res/layout/item_nav.xml @@ -2,7 +2,8 @@ + android:layout_height="wrap_content" + android:background="?attr/colorDrawerBackground">