/*
Copyright (C) 2013 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.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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;
import com.prasanna.android.stacknetwork.adapter.ItemListAdapter.ListItemView;
import com.prasanna.android.stacknetwork.model.Answer;
import com.prasanna.android.stacknetwork.service.UserIntentService;
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.views.QuickActionMenu;
public class UserAnswerListFragment extends ItemListFragment<Answer> implements ListItemView<Answer> {
private static final String TAG = UserAnswerListFragment.class.getSimpleName();
private static final int ANSWER_PREVIEW_LEN = 200;
private static final String ANS_CONTNUES = "...";
private static final String MULTIPLE_NEW_LINES_AT_END = "[\\s]+$";
private int page = 1;
private Intent intent;
private static class ViewHolder {
TextView itemTitle;
TextView answerScore;
TextView answerTime;
TextView answerBody;
ImageView quickActionMenuImg;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (itemsContainer == null) {
itemsContainer = (LinearLayout) inflater.inflate(R.layout.list_view, null);
itemListAdapter =
new ItemListAdapter<Answer>(getActivity(), R.layout.answer_snippet, new ArrayList<Answer>(), this);
itemsContainer.removeView(itemsContainer.findViewById(R.id.scoreAndAns));
}
return itemsContainer;
}
@Override
protected void startIntentService() {
showProgressBar();
intent = getIntentForService(UserIntentService.class, null);
if (intent != null) {
intent.putExtra(StringConstants.ACTION, UserIntentService.GET_USER_ANSWERS);
intent.putExtra(StringConstants.ME, getActivity().getIntent().getBooleanExtra(StringConstants.ME, false));
intent.putExtra(StringConstants.USER_ID, getActivity().getIntent().getLongExtra(StringConstants.USER_ID, 0L));
intent.putExtra(StringConstants.PAGE, page++);
intent.putExtra(StringConstants.RESULT_RECEIVER, resultReceiver);
startService(intent);
}
}
@Override
public String getReceiverExtraName() {
return StringConstants.ANSWERS;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
registerForContextMenu(getListView());
super.onActivityCreated(savedInstanceState);
registerForContextMenu(getListView());
}
@Override
public void onResume() {
super.onResume();
if (itemListAdapter != null && itemListAdapter.getCount() == 0)
startIntentService();
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected ViewGroup getParentLayout() {
return itemsContainer;
}
@Override
public View getView(final Answer answer, int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = getActivity().getLayoutInflater().inflate(R.layout.answer_snippet, null);
viewHolder = new ViewHolder();
viewHolder.itemTitle = (TextView) convertView.findViewById(R.id.itemTitle);
viewHolder.answerScore = (TextView) convertView.findViewById(R.id.answerScore);
viewHolder.answerTime = (TextView) convertView.findViewById(R.id.answerTime);
viewHolder.answerBody = (TextView) convertView.findViewById(R.id.answerBodyPreview);
viewHolder.quickActionMenuImg = (ImageView) convertView.findViewById(R.id.itemContextMenu);
convertView.setTag(viewHolder);
} else
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.itemTitle.setText(Html.fromHtml(answer.title));
viewHolder.answerScore.setText(AppUtils.formatNumber(answer.score));
if (answer.accepted)
viewHolder.answerScore.setTextColor(getResources().getColor(R.color.ledGreen));
else
viewHolder.answerScore.setTextColor(Color.DKGRAY);
viewHolder.answerTime.setText(DateTimeUtils.getElapsedDurationSince(answer.creationDate));
if (answer.body != null) {
String answerBody = answer.body.replaceAll(MULTIPLE_NEW_LINES_AT_END, "");
answerBody = answerBody.replaceAll("\\<*p>", "");
if (answerBody.length() > ANSWER_PREVIEW_LEN) {
answerBody = answerBody.substring(0, ANSWER_PREVIEW_LEN);
viewHolder.answerBody.setText(Html.fromHtml(answerBody + ANS_CONTNUES));
} else
viewHolder.answerBody.setText(Html.fromHtml(answerBody));
}
setupQuickActionMenu(answer, viewHolder);
return convertView;
}
/* Shouldn't I recycle quick action menu as well? Yes, but how? */
private void setupQuickActionMenu(final Answer answer, final ViewHolder holder) {
final QuickActionMenu quickActionMenu = initQuickActionMenu(answer);
holder.quickActionMenuImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
quickActionMenu.show(v);
}
});
}
protected QuickActionMenu initQuickActionMenu(final Answer answer) {
return new StackXQuickActionMenu(getActivity()).addSimilarQuestionsItem(answer.title)
.addRelatedQuickActionItem(answer.questionId)
.addEmailQuickActionItem(answer.title, AppUtils.createEmailBody(answer)).build();
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = new Intent(getActivity(), QuestionActivity.class);
intent.setAction(StringConstants.QUESTION_ID);
intent.putExtra(StringConstants.QUESTION_ID, itemListAdapter.getItem(position).questionId);
intent.putExtra(StringConstants.SITE, OperatingSite.getSite().apiSiteParameter);
startActivity(intent);
}
}