/* Copyright (C) 2014 Prasanna Thirumalai This file is part of StackX. StackX is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. StackX is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with StackX. If not, see <http://www.gnu.org/licenses/>. */ package com.prasanna.android.stacknetwork.fragment; import java.util.ArrayList; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.Html; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.prasanna.android.stacknetwork.QuestionActivity; import com.prasanna.android.stacknetwork.R; import com.prasanna.android.stacknetwork.adapter.ItemListAdapter.ListItemView; import com.prasanna.android.stacknetwork.model.Question; import com.prasanna.android.stacknetwork.utils.AppUtils; import com.prasanna.android.stacknetwork.utils.DateTimeUtils; import com.prasanna.android.stacknetwork.utils.OperatingSite; import com.prasanna.android.stacknetwork.utils.StackXQuickActionMenu; import com.prasanna.android.stacknetwork.utils.StringConstants; import com.prasanna.android.stacknetwork.utils.TagsViewBuilder; import com.prasanna.android.views.QuickActionMenu; public abstract class AbstractQuestionListFragment extends ItemListFragment<Question> implements ListItemView<Question> { private final Bundle bundle = new Bundle(); static class QuestionViewHolder { LinearLayout tagsLayout; TextView title; TextView score; TextView answerCount; TextView views; TextView owner; TextView bountyAmount; ArrayList<TextView> tagViews; TextView answerCountAnswered; ImageView quickActionImg; } @Override public void onActivityCreated(Bundle savedInstanceState) { registerForContextMenu(getListView()); super.onActivityCreated(savedInstanceState); } @Override public View getView(Question item, int position, View convertView, ViewGroup parent) { return buildView(convertView, getActivity(), item); } @Override public void onListItemClick(ListView l, View v, int position, long id) { if (itemListAdapter != null && itemListAdapter.getCount() > position) { Intent displayQuestionIntent = new Intent(getActivity(), QuestionActivity.class); displayQuestionIntent.setAction(StringConstants.QUESTION); displayQuestionIntent.putExtra(StringConstants.QUESTION, itemListAdapter.getItem(position)); displayQuestionIntent.putExtra(StringConstants.CACHED, false); displayQuestionIntent.putExtra(StringConstants.SITE, OperatingSite.getSite().apiSiteParameter); startActivity(displayQuestionIntent); } } @Override public String getReceiverExtraName() { return StringConstants.QUESTIONS; } private View buildView(View convertView, final Context context, final Question question) { FrameLayout questionRowLayout = (FrameLayout) convertView; QuestionViewHolder holder; if (questionRowLayout == null) { holder = new QuestionViewHolder(); questionRowLayout = (FrameLayout) getActivity().getLayoutInflater().inflate(R.layout.question_snippet_layout, null); holder.tagsLayout = (LinearLayout) questionRowLayout.findViewById(R.id.questionSnippetTags); holder.score = (TextView) questionRowLayout.findViewById(R.id.score); holder.answerCount = (TextView) questionRowLayout.findViewById(R.id.answerCount); holder.answerCountAnswered = (TextView) questionRowLayout.findViewById(R.id.answerCountAnswered); holder.title = (TextView) questionRowLayout.findViewById(R.id.itemTitle); holder.views = (TextView) questionRowLayout.findViewById(R.id.questionViewsValue); holder.owner = (TextView) questionRowLayout.findViewById(R.id.questionOwner); holder.bountyAmount = (TextView) questionRowLayout.findViewById(R.id.itemBountyAmount); holder.quickActionImg = (ImageView) questionRowLayout.findViewById(R.id.itemContextMenu); questionRowLayout.setTag(holder); } else holder = (QuestionViewHolder) questionRowLayout.getTag(); if (question.bountyAmount > 0) { holder.bountyAmount.setText("+" + String.valueOf(question.bountyAmount)); holder.bountyAmount.setVisibility(View.VISIBLE); } questionRowLayout.setId((int) question.id); setValuesForQuestionView(holder, question); buildTagsView(question, holder); setupQuickActionMenu(question, holder); return questionRowLayout; } protected void buildTagsView(final Question question, final QuestionViewHolder holder) { TagsViewBuilder.buildView(getActivity(), holder.tagsLayout, question.tags); } /* Shouldn't I recycle quick action menu as well? Yes, but how? */ private void setupQuickActionMenu(final Question question, QuestionViewHolder holder) { final QuickActionMenu quickActionMenu = initQuickActionMenu(question); holder.quickActionImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { quickActionMenu.show(v); } }); } protected QuickActionMenu initQuickActionMenu(final Question question) { StackXQuickActionMenu quickActionMenu = new StackXQuickActionMenu(getActivity()); quickActionMenu.addUserProfileItem(question.owner.id, Html.fromHtml(question.owner.displayName).toString()); return quickActionMenu.addSimilarQuestionsItem(question.title).addRelatedQuickActionItem(question.id) .addEmailQuickActionItem(question.title, question.body).build(); } protected void setValuesForQuestionView(QuestionViewHolder holder, Question question) { holder.score.setText(AppUtils.formatNumber(question.score)); if (question.hasAcceptedAnswer) { holder.answerCountAnswered.setText(AppUtils.formatNumber(question.answerCount)); holder.answerCountAnswered.setVisibility(View.VISIBLE); holder.answerCount.setVisibility(View.GONE); } else { holder.answerCount.setText(AppUtils.formatNumber(question.answerCount)); holder.answerCount.setVisibility(View.VISIBLE); holder.answerCountAnswered.setVisibility(View.GONE); } holder.title.setText(Html.fromHtml(question.title)); holder.views.setText("Views:" + AppUtils.formatNumber(question.viewCount)); if (question.owner.displayName != null) { holder.owner.setText(DateTimeUtils.getElapsedDurationSince(question.creationDate) + " by " + Html.fromHtml(question.owner.displayName)); } } public Bundle getBundle() { return bundle; } }