package com.lateensoft.pathfinder.toolkit.adapters.nav;
import com.lateensoft.pathfinder.toolkit.R;
import android.content.Context;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.lateensoft.pathfinder.toolkit.views.BasePageFragment;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class NavDrawerAdapter implements ExpandableListAdapter {
private Context m_context;
List<NavDrawerGroupItem> m_items;
private NavDrawerItem m_selectedItem = null;
public NavDrawerAdapter(Context context, List<NavDrawerGroupItem> navDrawerItems) {
m_context = context;
m_items = navDrawerItems;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
View row = convertView;
ItemHolder holder;
if(row == null) {
LayoutInflater inflater = LayoutInflater.from(m_context);
row = inflater.inflate(R.layout.nav_drawer_item, parent, false);
holder = new ItemHolder();
holder.name = (TextView)row.findViewById(R.id.tv_item_label);
holder.icon = (ImageView)row.findViewById(R.id.iv_item_icon);
holder.groupState = (ImageView)row.findViewById(R.id.iv_group_state);
row.setTag(holder);
} else {
holder = (ItemHolder)row.getTag();
}
NavDrawerItem child = (NavDrawerItem) getChild(groupPosition, childPosition);
if (child != null) {
holder.name.setText(child.getText());
holder.icon.setImageResource(child.getIconResId());
holder.icon.setVisibility(child.getIconVisibility());
}
holder.groupState.setImageResource(R.drawable.expander_open_holo_dark);
holder.groupState.setVisibility(View.INVISIBLE);
if (child != null && child == m_selectedItem) {
row.setBackgroundColor(m_context.getResources().getColor(android.R.color.holo_blue_light));
} else {
row.setBackgroundColor(m_context.getResources().getColor(R.color.holo_dialog_lighter_grey));
}
return row;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
View row = convertView;
ItemHolder holder;
if(row == null) {
LayoutInflater inflater = LayoutInflater.from(m_context);
row = inflater.inflate(R.layout.nav_drawer_item, parent, false);
holder = new ItemHolder();
holder.name = (TextView)row.findViewById(R.id.tv_item_label);
holder.icon = (ImageView)row.findViewById(R.id.iv_item_icon);
holder.groupState = (ImageView)row.findViewById(R.id.iv_group_state);
row.setTag(holder);
}
else {
holder = (ItemHolder)row.getTag();
}
NavDrawerGroupItem group = (NavDrawerGroupItem) getGroup(groupPosition);
if (group != null) {
holder.name.setText(group.getText());
holder.icon.setImageResource(group.getIconResId());
}
if (isExpanded) {
holder.groupState.setImageResource(R.drawable.expander_open_holo_dark);
} else {
holder.groupState.setImageResource(R.drawable.expander_close_holo_dark);
}
boolean hasChildren = getChildrenCount(groupPosition) != 0;
if (hasChildren) {
holder.groupState.setVisibility(View.VISIBLE);
} else {
holder.groupState.setVisibility(View.INVISIBLE);
}
// Show the selection indicator on the group, or on the character group is collapsed while a child is selected
if (group != null && (group == m_selectedItem ||
(m_selectedItem instanceof NavDrawerChildItem &&
((NavDrawerChildItem) m_selectedItem).getGroup() == group && !isExpanded))) {
row.setBackgroundColor(m_context.getResources().getColor(android.R.color.holo_blue_light));
} else {
row.setBackgroundColor(m_context.getResources().getColor(R.color.holo_dialog_grey));
}
return row;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
List<NavDrawerChildItem> children = m_items.get(groupPosition).getChildren();
return children != null ? children.get(childPosition) : null;
}
@Override
public Object getGroup(int groupPosition) {
return m_items.get(groupPosition);
}
@Override
public long getGroupId(int groupPosition) {
return ((Integer) groupPosition).longValue();
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return ((Integer) childPosition).longValue();
}
@Override
public int getGroupCount() {
return m_items.size();
}
@Override
public int getChildrenCount(int groupPosition) {
List<NavDrawerChildItem> children = m_items.get(groupPosition).getChildren();
return children != null ? children.size() : 0;
}
private static long COMBINED_ID_GROUP_MOD = 10000L;
@Override
public long getCombinedChildId(long groupId, long childId) {
return groupId * COMBINED_ID_GROUP_MOD + (childId + 1);
}
@Override
public long getCombinedGroupId(long groupId) {
return groupId * COMBINED_ID_GROUP_MOD;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
@Override
public boolean isEmpty() {
return m_items.isEmpty();
}
@Override
public void onGroupCollapsed(int groupPosition) {
}
@Override
public void onGroupExpanded(int groupPosition) {
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
}
public void setSelectedItem(NavDrawerItem item) {
m_selectedItem = item;
}
public NavDrawerItem getSelectedItem() {
return m_selectedItem;
}
public int getGroupIndexForItem(NavDrawerItem item) {
boolean isGroup = item instanceof NavDrawerGroupItem;
for (int i = 0; i < m_items.size(); i++) {
NavDrawerGroupItem group = m_items.get(i);
if ((isGroup && item == group) ||
(!isGroup && group.getChildren() != null && group.getChildren().contains(item))) {
return i;
}
}
return -1;
}
public int getChildIndexForItem(NavDrawerItem item) {
if (item instanceof NavDrawerGroupItem) return -1;
for (NavDrawerGroupItem group : m_items) {
List<NavDrawerChildItem> children = group.getChildren();
if (children != null) {
for (int i = 0; i < children.size(); i++) {
if (item == children.get(i)) {
return i;
}
}
}
}
return -1;
}
public NavDrawerItem getItemForFragment(@NotNull Class<? extends BasePageFragment> fragmentClass) {
for (NavDrawerGroupItem group : m_items) {
if (fragmentClass.equals(group.getFragmentClass())) return group;
List<NavDrawerChildItem> children = group.getChildren();
if (children != null) {
for (NavDrawerChildItem child : children) {
if (fragmentClass.equals(child.getFragmentClass())) {
return child;
}
}
}
}
return null;
}
static class ItemHolder {
TextView name;
ImageView icon;
ImageView groupState;
}
}