package org.goodev.discourse.api; import android.util.SparseArray; import org.goodev.discourse.api.data.Category; import org.goodev.discourse.api.data.Topic; import org.goodev.discourse.api.data.User; import java.util.ArrayList; import java.util.HashMap; public class Categories { public static final int VIEW_TYPE_TOPIC_ITEM = 0; public static final int VIEW_TYPE_CATEGORY_HEADER = 1; public static final int VIEW_TYPE_CATEGORY_FOOTER = 2; public static final int VIEW_TYPE_LOADING = 3; private final HashMap<Long, ArrayList<Topic>> mTopics = new HashMap<Long, ArrayList<Topic>>(); private final ArrayList<Category> mCategories = new ArrayList<Category>(); private final HashMap<Long, User> mUsers = new HashMap<Long, User>(); private final SparseArray<Category> mSparseCategories = new SparseArray<Category>(); private CategoryList mCategoryList; public CategoryList getCategoryList() { return mCategoryList; } public void setCategoryList(CategoryList data) { mCategoryList = data; } public void putCategory(Category c) { mCategories.add(c); } public ArrayList<Category> getCategories() { return mCategories; } public void putUser(User data) { mUsers.put(data.id, data); } public User getUser(Long id) { return mUsers.get(id); } public void putTopic(Long categoryId, Topic data) { ArrayList<Topic> topics = mTopics.get(categoryId); if (topics == null) { topics = new ArrayList<Topic>(); mTopics.put(categoryId, topics); } topics.add(data); } public ArrayList<Topic> getTopic(Long categoryId) { return mTopics.get(categoryId); } public int getSize() { mSparseCategories.clear(); final ArrayList<Category> categories = mCategories; if (categories.size() == 0) { return 0; } int size = 0; int index = 0; final HashMap<Long, ArrayList<Topic>> topicsList = mTopics; for (Category c : categories) { mSparseCategories.append(size + index, c); ArrayList<Topic> topics = topicsList.get(c.id); if (topics != null) { size += topics.size(); } mSparseCategories.append(size + index + 1, new Category(c, true)); // category header and footer size += 2; } return size; } public int getItemType(int position) { final ArrayList<Category> categories = mCategories; if (categories.size() == 0) { return VIEW_TYPE_LOADING; } Category cat = mSparseCategories.get(position); if (cat != null) { return cat.isFooter ? VIEW_TYPE_CATEGORY_FOOTER : VIEW_TYPE_CATEGORY_HEADER; } return VIEW_TYPE_TOPIC_ITEM; } public Object getItem(int position) { final ArrayList<Category> categories = mCategories; if (categories.size() == 0) { return null; } Category cat = mSparseCategories.get(position); if (cat != null) { return cat; } int size = 0; final HashMap<Long, ArrayList<Topic>> topicsList = mTopics; for (Category c : categories) { size += 1; ArrayList<Topic> topics = topicsList.get(c.id); if (topics != null) { if (size + topics.size() >= position + 1) { Topic t = topics.get(position - size); return t; } size += topics.size(); } // category header and footer size += 1; } return null; } public void clear() { mCategories.clear(); mCategoryList = null; mSparseCategories.clear(); mTopics.clear(); mUsers.clear(); } public static class CategoryList { public boolean can_create_topic; public boolean can_create_category; public String draft; public String draft_key; public long draft_sequence; } }