Indicate selected menu item state in drawer (1/2)
Bug 28754805
Change-Id: Ie3aa9bab80266515b49ab33d75be4b188b7eb954
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 888db49..a8c8956 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -49,6 +49,7 @@
import com.android.contacts.common.util.ViewUtil;
import com.android.contacts.editor.ContactEditorFragment;
import com.android.contacts.group.GroupListItem;
+import com.android.contacts.group.GroupMetadata;
import com.android.contacts.group.GroupUtil;
import com.android.contacts.group.GroupsFragment;
import com.android.contacts.group.GroupsFragment.GroupsListener;
@@ -59,7 +60,11 @@
import com.android.contactsbind.Assistants;
import com.android.contactsbind.HelpUtils;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
/**
* A common superclass for Contacts activities with a navigation drawer.
@@ -81,6 +86,13 @@
protected GroupsFragment mGroupsFragment;
protected AccountFiltersFragment mAccountFiltersFragment;
+ // Checkable menu item lookup maps. Every map declared here should be added to
+ // clearCheckedMenus() so that they can be cleared.
+ // TODO find a better way to handle selected menu item state, when swicthing to fragments.
+ protected Map<Long, MenuItem> mGroupMenuMap = new HashMap<>();
+ protected Map<ContactListFilter, MenuItem> mFilterMenuMap = new HashMap<>();
+ protected Map<Integer, MenuItem> mIdMenuMap = new HashMap<>();
+
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
@@ -109,6 +121,10 @@
mNavigationView.setNavigationItemSelectedListener(this);
final Menu menu = mNavigationView.getMenu();
+
+ final MenuItem allContacts = menu.findItem(R.id.nav_all_contacts);
+ mIdMenuMap.put(R.id.nav_all_contacts, allContacts);
+
final boolean showBlockedNumbers = PhoneCapabilityTester.isPhone(this)
&& ContactsUtils.FLAG_N_FEATURE
&& BlockedNumberContractCompat.canCurrentUserBlockNumbers(this);
@@ -119,6 +135,9 @@
if (Assistants.getDuplicatesActivityIntent(this) == null) {
menu.removeItem(R.id.nav_find_duplicates);
+ } else {
+ final MenuItem findDup = menu.findItem(R.id.nav_find_duplicates);
+ mIdMenuMap.put(R.id.nav_find_duplicates, findDup);
}
if (!HelpUtils.isHelpAndFeedbackAvailable()) {
@@ -126,6 +145,19 @@
}
loadGroupsAndFilters();
+
+ if (isDuplicatesActivity()) {
+ clearCheckedMenus();
+ mIdMenuMap.get(R.id.nav_find_duplicates).setCheckable(true);
+ mIdMenuMap.get(R.id.nav_find_duplicates).setChecked(true);
+ }
+ }
+
+ /**
+ * Returns true if child class is DuplicatesActivity
+ */
+ protected boolean isDuplicatesActivity() {
+ return false;
}
// Set up fragment manager to load groups and filters.
@@ -174,6 +206,7 @@
final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
final SubMenu subMenu = groupsMenuItem.getSubMenu();
subMenu.removeGroup(R.id.nav_groups_items);
+ mGroupMenuMap = new HashMap<>();
if (groupListItems != null) {
// Add each group
@@ -184,6 +217,7 @@
final String title = groupListItem.getTitle();
final MenuItem menuItem =
subMenu.add(R.id.nav_groups_items, Menu.NONE, Menu.NONE, title);
+ mGroupMenuMap.put(groupListItem.getGroupId(), menuItem);
menuItem.setIcon(R.drawable.ic_menu_label);
menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
@@ -211,6 +245,27 @@
return true;
}
});
+
+ if (getGroupMetadata() != null) {
+ updateGroupMenu(getGroupMetadata());
+ }
+ }
+
+ protected void updateGroupMenu(GroupMetadata groupMetadata) {
+ clearCheckedMenus();
+ if (groupMetadata != null && mGroupMenuMap != null
+ && mGroupMenuMap.get(groupMetadata.groupId) != null) {
+ mGroupMenuMap.get(groupMetadata.groupId).setCheckable(true);
+ mGroupMenuMap.get(groupMetadata.groupId).setChecked(true);
+ }
+ }
+
+ /**
+ * Returns group metadata if the child class is {@link GroupMembersActivity}, and null
+ * otherwise.
+ */
+ protected GroupMetadata getGroupMetadata() {
+ return null;
}
protected void onGroupMenuItemClicked(long groupId) {
@@ -229,6 +284,7 @@
final MenuItem filtersMenuItem = menu.findItem(R.id.nav_filters);
final SubMenu subMenu = filtersMenuItem.getSubMenu();
subMenu.removeGroup(R.id.nav_filters_items);
+ mFilterMenuMap = new HashMap<>();
if (accountFilterItems == null || accountFilterItems.size() < 2) {
return;
@@ -239,6 +295,7 @@
final String accountName = filter.accountName;
final MenuItem menuItem = subMenu.add(R.id.nav_filters_items, Menu.NONE, Menu.NONE,
accountName);
+ mFilterMenuMap.put(filter, menuItem);
final Intent intent = new Intent();
intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@@ -257,10 +314,36 @@
// Get rid of the default memu item overlay and show original account icons.
menuItem.getIcon().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_ATOP);
}
+
+ if (getContactListFilter() != null) {
+ updateFilterMenu(getContactListFilter());
+ }
+ }
+
+ protected void updateFilterMenu(ContactListFilter filter) {
+ clearCheckedMenus();
+ if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
+ if (mIdMenuMap != null && mIdMenuMap.get(R.id.nav_all_contacts) != null) {
+ mIdMenuMap.get(R.id.nav_all_contacts).setCheckable(true);
+ mIdMenuMap.get(R.id.nav_all_contacts).setChecked(true);
+ }
+ } else {
+ if (mFilterMenuMap != null && mFilterMenuMap.get(filter) != null) {
+ mFilterMenuMap.get(filter).setCheckable(true);
+ mFilterMenuMap.get(filter).setChecked(true);
+ }
+ }
}
/**
- * @return true if the child activity should finish after launching another activity.
+ * Returns the current filter if the child class is {@link PeopleActivity}, and null otherwise.
+ */
+ protected ContactListFilter getContactListFilter() {
+ return null;
+ }
+
+ /**
+ * Returns true if the child activity should finish after launching another activity.
*/
protected abstract boolean shouldFinish();
@@ -318,4 +401,18 @@
return ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
}
+ private void clearCheckedMenus() {
+ clearCheckedMenu(mFilterMenuMap);
+ clearCheckedMenu(mGroupMenuMap);
+ clearCheckedMenu(mIdMenuMap);
+ }
+
+ private void clearCheckedMenu(Map<?, MenuItem> map) {
+ final Iterator it = map.entrySet().iterator();
+ while (it.hasNext()) {
+ Entry pair = (Entry)it.next();
+ map.get(pair.getKey()).setCheckable(false);
+ map.get(pair.getKey()).setChecked(false);
+ }
+ }
}