package com.netease.nim.uikit.contact.core.model;
import android.text.TextUtils;
import com.netease.nim.uikit.contact.core.item.AbsContactItem;
import com.netease.nim.uikit.contact.core.item.LabelItem;
import com.netease.nim.uikit.contact.core.query.TextQuery;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 通讯录列表数据抽象类
* Group定义
*
* Created by huangjun on 2015/2/10.
*/
public abstract class AbsContactDataList {
protected final ContactGroupStrategy groupStrategy;
protected final Map<String, Group> groupMap = new HashMap<>();
protected final Group groupNull = new Group(null, null);
private TextQuery query;
private static final class NoneGroupStrategy extends ContactGroupStrategy {
@Override
public String belongs(AbsContactItem item) {
return null;
}
@Override
public int compare(String lhs, String rhs) {
return 0;
}
}
public AbsContactDataList(ContactGroupStrategy groupStrategy) {
if (groupStrategy == null) {
groupStrategy = new NoneGroupStrategy();
}
this.groupStrategy = groupStrategy;
}
//
// ACCESS
//
public abstract int getCount();
public abstract boolean isEmpty();
public abstract AbsContactItem getItem(int index);
public abstract List<AbsContactItem> getItems();
public abstract Map<String, Integer> getIndexes();
public final TextQuery getQuery() {
return query;
}
public final String getQueryText() {
return query != null ? query.text : null;
}
public final void setQuery(TextQuery query) {
this.query = query;
}
//
// BUILD
//
public abstract void build();
public final void add(AbsContactItem item) {
if (item == null) {
return;
}
Group group;
String id = groupStrategy.belongs(item);
if (id == null) {
group = groupNull;
} else {
group = groupMap.get(id);
if (group == null) {
group = new Group(id, groupStrategy.getName(id));
groupMap.put(id, group);
}
}
group.add(item);
}
protected final void sortGroups(List<Group> groups) {
Collections.sort(groups, new Comparator<Group>() {
@Override
public int compare(Group lhs, Group rhs) {
return groupStrategy.compare(lhs.id, rhs.id);
}
});
}
@SuppressWarnings({"rawtypes", "unchecked"})
protected static final class Group {
final String id;
final String title;
final boolean hasHead;
final List items = new ArrayList();
Group(String id, String title) {
this.id = id;
this.title = title;
this.hasHead = !TextUtils.isEmpty(title);
}
int getCount() {
return items.size() + (hasHead ? 1 : 0);
}
AbsContactItem getItem(int index) {
if (hasHead) {
if (index == 0) {
return getHead();
} else {
index--;
return (AbsContactItem) (index >= 0 && index < items.size() ? items.get(index) : null);
}
} else {
return (AbsContactItem) (index >= 0 && index < items.size() ? items.get(index) : null);
}
}
AbsContactItem getHead() {
return hasHead ? new LabelItem(title) : null;
}
List<AbsContactItem> getItems() {
return items;
}
void add(AbsContactItem add) {
if (add instanceof Comparable) {
addComparable((Comparable<AbsContactItem>) add);
} else {
items.add(add);
}
}
void merge(Group group) {
for (Object item : group.items) {
add((AbsContactItem) item);
}
}
void addComparable(Comparable<AbsContactItem> add) {
if (items.size() < 8) {
for (int index = 0; index < items.size(); index++) {
Comparable<AbsContactItem> item = (Comparable<AbsContactItem>) items.get(index);
if ((item.compareTo((AbsContactItem) add)) > 0) {
items.add(index, add);
return;
}
}
items.add(add);
} else {
int index = Collections.binarySearch(items, add);
if (index < 0) {
index = -index;
--index;
}
if (index >= items.size()) {
items.add(add);
} else {
items.add(index, add);
}
}
}
}
}