Navigation menu item separators

This commit is contained in:
M66B 2019-04-29 11:39:24 +02:00
parent ed5ee4ff04
commit b4092d5c5e
6 changed files with 71 additions and 50 deletions

View File

@ -29,6 +29,8 @@ import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.AssetFileDescriptor; import android.content.res.AssetFileDescriptor;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@ -50,6 +52,7 @@ import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -134,10 +137,24 @@ public class ActivitySetup extends ActivityBilling implements FragmentManager.On
drawerContainer = findViewById(R.id.drawer_container); drawerContainer = findViewById(R.id.drawer_container);
rvMenu = drawerContainer.findViewById(R.id.rvMenu); 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); final AdapterNavMenu adapter = new AdapterNavMenu(this, this);
rvMenu.setAdapter(adapter); 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(); PackageManager pm = getPackageManager();
final List<NavMenuItem> menus = new ArrayList<>(); final List<NavMenuItem> menus = new ArrayList<>();
@ -155,7 +172,7 @@ public class ActivitySetup extends ActivityBilling implements FragmentManager.On
drawerLayout.closeDrawer(drawerContainer); drawerLayout.closeDrawer(drawerContainer);
onMenuImport(); onMenuImport();
} }
})); }).setSeparated());
menus.add(new NavMenuItem(R.drawable.baseline_palette_24, R.string.title_setup_theme, new Runnable() { menus.add(new NavMenuItem(R.drawable.baseline_palette_24, R.string.title_setup_theme, new Runnable() {
@Override @Override
@ -188,7 +205,7 @@ public class ActivitySetup extends ActivityBilling implements FragmentManager.On
drawerLayout.closeDrawer(drawerContainer); drawerLayout.closeDrawer(drawerContainer);
onMenuContacts(); onMenuContacts();
} }
})); }).setSeparated());
menus.add(new NavMenuItem(R.drawable.baseline_help_24, R.string.menu_legend, new Runnable() { menus.add(new NavMenuItem(R.drawable.baseline_help_24, R.string.menu_legend, new Runnable() {
@Override @Override

View File

@ -29,6 +29,8 @@ import android.content.IntentFilter;
import android.content.IntentSender; import android.content.IntentSender;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@ -60,6 +62,7 @@ import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -106,8 +109,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
private RecyclerView rvFolder; private RecyclerView rvFolder;
private RecyclerView rvMenu; private RecyclerView rvMenu;
private ImageView ivExpander; private ImageView ivExpander;
private RecyclerView rvMenuExtra1; private RecyclerView rvMenuExtra;
private RecyclerView rvMenuExtra2;
private long message = -1; private long message = -1;
private long attachment = -1; private long attachment = -1;
@ -197,19 +199,27 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
ivExpander = drawerContainer.findViewById(R.id.ivExpander); ivExpander = drawerContainer.findViewById(R.id.ivExpander);
rvMenuExtra1 = drawerContainer.findViewById(R.id.rvMenuExtra1); rvMenuExtra = drawerContainer.findViewById(R.id.rvMenuExtra);
rvMenuExtra1.setLayoutManager(new LinearLayoutManager(this)); LinearLayoutManager llm = new LinearLayoutManager(this);
final AdapterNavMenu e1adapter = new AdapterNavMenu(this, this); rvMenuExtra.setLayoutManager(llm);
rvMenuExtra1.setAdapter(e1adapter); final AdapterNavMenu eadapter = new AdapterNavMenu(this, this);
rvMenuExtra.setAdapter(eadapter);
rvMenuExtra2 = drawerContainer.findViewById(R.id.rvMenuExtra2); final Drawable d = getDrawable(R.drawable.divider);
rvMenuExtra2.setLayoutManager(new LinearLayoutManager(this)); DividerItemDecoration itemDecorator = new DividerItemDecoration(this, llm.getOrientation()) {
final AdapterNavMenu e2adapter = new AdapterNavMenu(this, this); @Override
rvMenuExtra2.setAdapter(e2adapter); 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); boolean minimal = prefs.getBoolean("minimal", false);
rvMenuExtra1.setVisibility(minimal ? View.GONE : View.VISIBLE); rvMenuExtra.setVisibility(minimal ? View.GONE : View.VISIBLE);
rvMenuExtra2.setVisibility(minimal ? View.GONE : View.VISIBLE);
ivExpander.setImageLevel(minimal ? 1 /* more */ : 0 /* less */); ivExpander.setImageLevel(minimal ? 1 /* more */ : 0 /* less */);
ivExpander.setOnClickListener(new View.OnClickListener() { ivExpander.setOnClickListener(new View.OnClickListener() {
@ -217,8 +227,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
public void onClick(View v) { public void onClick(View v) {
boolean minimal = !prefs.getBoolean("minimal", false); boolean minimal = !prefs.getBoolean("minimal", false);
prefs.edit().putBoolean("minimal", minimal).apply(); prefs.edit().putBoolean("minimal", minimal).apply();
rvMenuExtra1.setVisibility(minimal ? View.GONE : View.VISIBLE); rvMenuExtra.setVisibility(minimal ? View.GONE : View.VISIBLE);
rvMenuExtra2.setVisibility(minimal ? View.GONE : View.VISIBLE);
ivExpander.setImageLevel(minimal ? 1 /* more */ : 0 /* less */); ivExpander.setImageLevel(minimal ? 1 /* more */ : 0 /* less */);
} }
}); });
@ -267,9 +276,9 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
madapter.set(menus); madapter.set(menus);
List<NavMenuItem> extra1 = new ArrayList<>(); List<NavMenuItem> 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 @Override
public void run() { public void run() {
drawerLayout.closeDrawer(drawerContainer); drawerLayout.closeDrawer(drawerContainer);
@ -278,7 +287,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
})); }));
if (Helper.getIntentFAQ().resolveActivity(getPackageManager()) != null) 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 @Override
public void run() { public void run() {
drawerLayout.closeDrawer(drawerContainer); drawerLayout.closeDrawer(drawerContainer);
@ -293,7 +302,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
})); }));
if (Helper.getIntentPrivacy().resolveActivity(getPackageManager()) != null) 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 @Override
public void run() { public void run() {
drawerLayout.closeDrawer(drawerContainer); 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 @Override
public void run() { public void run() {
onMenuAbout(); onMenuAbout();
@ -320,14 +329,10 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
checkUpdate(true); checkUpdate(true);
} }
} }
})); }).setSeparated());
e1adapter.set(extra1);
List<NavMenuItem> extra2 = new ArrayList<>();
if (getIntentPro() == null || getIntentPro().resolveActivity(getPackageManager()) != null) 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 @Override
public void run() { public void run() {
drawerLayout.closeDrawer(drawerContainer); drawerLayout.closeDrawer(drawerContainer);
@ -336,7 +341,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
})); }));
if ((getIntentInvite().resolveActivity(getPackageManager()) != null)) 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 @Override
public void run() { public void run() {
drawerLayout.closeDrawer(drawerContainer); drawerLayout.closeDrawer(drawerContainer);
@ -345,7 +350,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
})); }));
if (getIntentRate().resolveActivity(getPackageManager()) != null) 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 @Override
public void run() { public void run() {
drawerLayout.closeDrawer(drawerContainer); drawerLayout.closeDrawer(drawerContainer);
@ -354,7 +359,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
})); }));
if (getIntentOtherApps().resolveActivity(getPackageManager()) != null) 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 @Override
public void run() { public void run() {
drawerLayout.closeDrawer(drawerContainer); 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); DB db = DB.getInstance(this);

View File

@ -140,6 +140,10 @@ public class AdapterNavMenu extends RecyclerView.Adapter<AdapterNavMenu.ViewHold
diff.dispatchUpdatesTo(this); diff.dispatchUpdatesTo(this);
} }
NavMenuItem get(int pos) {
return items.get(pos);
}
private class DiffCallback extends DiffUtil.Callback { private class DiffCallback extends DiffUtil.Callback {
private List<NavMenuItem> prev = new ArrayList<>(); private List<NavMenuItem> prev = new ArrayList<>();
private List<NavMenuItem> next = new ArrayList<>(); private List<NavMenuItem> next = new ArrayList<>();

View File

@ -8,6 +8,7 @@ public class NavMenuItem {
private int icon; private int icon;
private int title; private int title;
private Integer count = null; private Integer count = null;
private boolean separated = false;
private Runnable click; private Runnable click;
private Runnable longClick; private Runnable longClick;
@ -30,6 +31,11 @@ public class NavMenuItem {
this.count = count; this.count = count;
} }
NavMenuItem setSeparated() {
this.separated = true;
return this;
}
int getIcon() { int getIcon() {
return this.icon; return this.icon;
} }
@ -42,6 +48,10 @@ public class NavMenuItem {
return this.count; return this.count;
} }
boolean isSeparated() {
return this.separated;
}
void onClick() { void onClick() {
click.run(); click.run();
} }

View File

@ -62,26 +62,10 @@
app:layout_constraintTop_toBottomOf="@id/vSeparatorMenu" /> app:layout_constraintTop_toBottomOf="@id/vSeparatorMenu" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMenuExtra1" android:id="@+id/rvMenuExtra"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" android:nestedScrollingEnabled="false"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivExpander" /> app:layout_constraintTop_toBottomOf="@id/ivExpander" />
<View
android:id="@+id/vSeparatorMenuExtra"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/colorSeparator"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/rvMenuExtra1" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMenuExtra2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/vSeparatorMenuExtra" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -2,7 +2,8 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:background="?attr/colorDrawerBackground">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clItem" android:id="@+id/clItem"