package com.uservoice.uservoicesdk.ui; import android.content.Context; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import com.uservoice.uservoicesdk.R; import com.uservoice.uservoicesdk.activity.SearchActivity; import com.uservoice.uservoicesdk.babayaga.Babayaga; import com.uservoice.uservoicesdk.model.Article; import com.uservoice.uservoicesdk.model.BaseModel; import com.uservoice.uservoicesdk.model.Suggestion; import com.uservoice.uservoicesdk.rest.Callback; import com.uservoice.uservoicesdk.rest.RestResult; import com.uservoice.uservoicesdk.rest.RestTask; import java.util.ArrayList; import java.util.List; public class MixedSearchAdapter extends SearchAdapter<BaseModel> implements AdapterView.OnItemClickListener { public static int SCOPE_ALL = 0; public static int SCOPE_ARTICLES = 1; public static int SCOPE_IDEAS = 2; protected static int SEARCH_RESULT = 0; protected static int LOADING = 1; protected final FragmentActivity context; protected LayoutInflater inflater; public MixedSearchAdapter(FragmentActivity context) { this.context = context; inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public boolean isEnabled(int position) { return !loading; } public List<BaseModel> getScopedSearchResults() { if (scope == SCOPE_ALL) { return searchResults; } else if (scope == SCOPE_ARTICLES) { List<BaseModel> articles = new ArrayList<BaseModel>(); for (BaseModel model : searchResults) { if (model instanceof Article) articles.add(model); } return articles; } else if (scope == SCOPE_IDEAS) { List<BaseModel> ideas = new ArrayList<BaseModel>(); for (BaseModel model : searchResults) { if (model instanceof Suggestion) ideas.add(model); } return ideas; } return null; } @Override protected void searchResultsUpdated() { int articleResults = 0; int ideaResults = 0; for (BaseModel model : searchResults) { if (model instanceof Article) articleResults += 1; else ideaResults += 1; } ((SearchActivity) context).updateScopedSearch(searchResults.size(), articleResults, ideaResults); } @Override public int getCount() { return loading ? 1 : getScopedSearchResults().size(); } @Override public Object getItem(int position) { return loading ? null : getScopedSearchResults().get(position); } @Override public long getItemId(int position) { return 0; } @Override public int getItemViewType(int position) { return loading ? LOADING : SEARCH_RESULT; } @Override public int getViewTypeCount() { return 2; } @Override protected RestTask search(final String query, final Callback<List<BaseModel>> callback) { currentQuery = query; return Article.loadInstantAnswers(query, new Callback<List<BaseModel>>() { @Override public void onModel(List<BaseModel> list) { List<Article> articles = new ArrayList<Article>(); List<Suggestion> suggestions = new ArrayList<Suggestion>(); for (BaseModel model : list) { if (model instanceof Article) articles.add((Article) model); else if (model instanceof Suggestion) suggestions.add((Suggestion) model); } Babayaga.track(Babayaga.Event.SEARCH_ARTICLES, query, articles); Babayaga.track(Babayaga.Event.SEARCH_IDEAS, query, suggestions); callback.onModel(list); } @Override public void onError(RestResult error) { callback.onError(error); } }); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; int type = getItemViewType(position); if (view == null) { if (type == SEARCH_RESULT) view = inflater.inflate(R.layout.uv_instant_answer_item, null); else if (type == LOADING) view = inflater.inflate(R.layout.uv_loading_item, null); } if (type == SEARCH_RESULT) { Utils.displayInstantAnswer(view, (BaseModel) getItem(position)); } return view; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int type = getItemViewType(position); if (type == SEARCH_RESULT) Utils.showModel(context, (BaseModel) getItem(position)); } }