package com.uservoice.uservoicesdk.activity; import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.SearchView; import android.widget.TextView; import com.uservoice.uservoicesdk.R; import com.uservoice.uservoicesdk.Session; import com.uservoice.uservoicesdk.babayaga.Babayaga; import com.uservoice.uservoicesdk.dialog.SuggestionDialogFragment; import com.uservoice.uservoicesdk.flow.InitManager; import com.uservoice.uservoicesdk.model.Forum; 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 com.uservoice.uservoicesdk.ui.DefaultCallback; import com.uservoice.uservoicesdk.ui.PaginatedAdapter; import com.uservoice.uservoicesdk.ui.PaginationScrollListener; import com.uservoice.uservoicesdk.ui.SearchAdapter; import com.uservoice.uservoicesdk.ui.SearchExpandListener; import com.uservoice.uservoicesdk.ui.SearchQueryListener; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class ForumActivity extends BaseListActivity implements SearchActivity { private List<Suggestion> suggestions; private Forum forum; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle(R.string.uv_feedback_forum); suggestions = new ArrayList<Suggestion>(); getListView().setDivider(null); setListAdapter(new PaginatedAdapter<Suggestion>(this, R.layout.uv_suggestion_item, suggestions) { boolean initializing = true; @Override public void loadMore() { initializing = false; super.loadMore(); } @Override public int getViewTypeCount() { return super.getViewTypeCount() + 2; } @Override public boolean isEnabled(int position) { return getItemViewType(position) == 2 || super.isEnabled(position); } @Override public int getCount() { return super.getCount() + 2 + (initializing ? 1 : 0); } @Override public int getItemViewType(int position) { if (position == 0) return 2; if (position == 1) return 3; if (position == 2 && initializing) return LOADING; return super.getItemViewType(position - 2); } @Override public Object getItem(int position) { return super.getItem(position - 2); } @Override public View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); if (type == 2 || type == 3) { View view = convertView; if (view == null) { if (type == 2) { view = getLayoutInflater().inflate(R.layout.uv_text_item, null); TextView text = (TextView) view.findViewById(R.id.uv_text); text.setText(R.string.uv_post_an_idea); view.findViewById(R.id.uv_divider).setVisibility(View.GONE); view.findViewById(R.id.uv_text2).setVisibility(View.GONE); } else if (type == 3) { view = getLayoutInflater().inflate(R.layout.uv_header_item_light, null); TextView text = (TextView) view.findViewById(R.id.uv_header_text); text.setText(R.string.uv_idea_text_heading); } } return view; } else { return super.getView(position, convertView, parent); } } @Override protected void customizeLayout(View view, Suggestion model) { TextView textView = (TextView) view.findViewById(R.id.uv_suggestion_title); textView.setText(model.getTitle()); textView = (TextView) view.findViewById(R.id.uv_subscriber_count); textView.setText(String.valueOf(model.getNumberOfSubscribers())); textView = (TextView) view.findViewById(R.id.uv_suggestion_status); View colorView = view.findViewById(R.id.uv_suggestion_status_color); if (model.getStatus() == null) { textView.setVisibility(View.GONE); colorView.setVisibility(View.GONE); } else { int color = Color.parseColor(model.getStatusColor()); textView.setVisibility(View.VISIBLE); textView.setTextColor(color); textView.setText(model.getStatus().toUpperCase(Locale.getDefault())); colorView.setVisibility(View.VISIBLE); colorView.setBackgroundColor(color); } } @Override public void loadPage(int page, Callback<List<Suggestion>> callback) { Suggestion.loadSuggestions(forum, page, callback); } @Override public RestTask search(final String query, final Callback<List<Suggestion>> callback) { return Suggestion.searchSuggestions(forum, query, new Callback<List<Suggestion>>() { @Override public void onModel(List<Suggestion> model) { Babayaga.track(Babayaga.Event.SEARCH_IDEAS, query, model); callback.onModel(model); } @Override public void onError(RestResult error) { callback.onError(error); } }); } @Override public int getTotalNumberOfObjects() { return forum.getNumberOfOpenSuggestions(); } }); getListView().setOnScrollListener(new PaginationScrollListener(getModelAdapter()) { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (forum != null) super.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } }); getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (position == 0) { startActivity(new Intent(ForumActivity.this, PostIdeaActivity.class)); } else if (position != 1) { Suggestion suggestion = (Suggestion) getModelAdapter().getItem(position); Session.getInstance().setSuggestion(suggestion); SuggestionDialogFragment dialog = new SuggestionDialogFragment(suggestion); dialog.show(getSupportFragmentManager(), "SuggestionDialogFragment"); } } }); new InitManager(this, new Runnable() { @Override public void run() { loadForum(); Session.getInstance().setSignInListener(new Runnable() { @Override public void run() { if (forum != null) { getModelAdapter().reload(); } } }); } }).init(); } @SuppressLint("NewApi") @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.uv_forum, menu); if (hasActionBar()) { menu.findItem(R.id.uv_menu_search).setOnActionExpandListener(new SearchExpandListener(this)); SearchView search = (SearchView) menu.findItem(R.id.uv_menu_search).getActionView(); search.setOnQueryTextListener(new SearchQueryListener(this)); } else { menu.findItem(R.id.uv_menu_search).setVisible(false); } menu.findItem(R.id.uv_new_idea).setVisible(Session.getInstance().getConfig().shouldShowPostIdea()); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.uv_new_idea) { startActivity(new Intent(this, PostIdeaActivity.class)); return true; } return super.onOptionsItemSelected(item); } @Override protected void onStop() { Session.getInstance().setSignInListener(null); super.onStop(); } private void loadForum() { if (Session.getInstance().getForum() != null) { forum = Session.getInstance().getForum(); Babayaga.track(Babayaga.Event.VIEW_FORUM, forum.getId()); setTitle(forum.getName()); getModelAdapter().loadMore(); return; } Forum.loadForum(Session.getInstance().getConfig().getForumId(), new DefaultCallback<Forum>(this) { @Override public void onModel(Forum model) { Session.getInstance().setForum(model); forum = model; setTitle(forum.getName()); getModelAdapter().loadMore(); } }); } @Override public SearchAdapter<?> getSearchAdapter() { return getModelAdapter(); } @SuppressWarnings("unchecked") public PaginatedAdapter<Suggestion> getModelAdapter() { return (PaginatedAdapter<Suggestion>) getListAdapter(); } @Override public void showSearch() { } @Override public void hideSearch() { } public void suggestionUpdated(Suggestion model) { getModelAdapter().notifyDataSetChanged(); } }