/* 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; import java.util.ArrayList; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.text.Html; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.prasanna.android.stacknetwork.model.Answer; import com.prasanna.android.stacknetwork.model.Comment; import com.prasanna.android.stacknetwork.model.InboxItem; import com.prasanna.android.stacknetwork.model.InboxItem.ItemType; import com.prasanna.android.stacknetwork.model.Post; import com.prasanna.android.stacknetwork.model.Post.PostType; import com.prasanna.android.stacknetwork.receiver.RestQueryResultReceiver; import com.prasanna.android.stacknetwork.receiver.RestQueryResultReceiver.StackXRestQueryResultReceiver; import com.prasanna.android.stacknetwork.service.AnswersIntentService; import com.prasanna.android.stacknetwork.service.PostIntentService; import com.prasanna.android.stacknetwork.utils.DateTimeUtils; import com.prasanna.android.stacknetwork.utils.MarkdownFormatter; import com.prasanna.android.stacknetwork.utils.StackXQuickActionMenu; import com.prasanna.android.stacknetwork.utils.StringConstants; public class InboxItemActivity extends AbstractUserActionBarActivity implements StackXRestQueryResultReceiver { private RestQueryResultReceiver receiver; private InboxItem item; private Comment comment; private View postTitleLayout; private StackXQuickActionMenu stackXQuickActionMenu; @Override public void onCreate(android.os.Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); item = (InboxItem) getIntent().getSerializableExtra(StringConstants.INBOX_ITEM); super.onCreate(savedInstanceState); setContentView(R.layout.inbox_item_detail); stackXQuickActionMenu = new StackXQuickActionMenu(this); receiver = new RestQueryResultReceiver(new Handler()); receiver.setReceiver(this); postTitleLayout = findViewById(R.id.postTitleLayout); setupQuickActionMenuClick(); showInboxItem(); getPostDetail(); } private void setupQuickActionMenuClick() { final ImageView imageView = (ImageView) findViewById(R.id.quickActionMenu); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { stackXQuickActionMenu.build().show(v); } }); } private void showInboxItem() { TextView textView = (TextView) findViewById(R.id.postTitle); textView.setText(Html.fromHtml(item.title)); textView = (TextView) findViewById(R.id.postType); switch (item.itemType) { case COMMENT: if (item.questionId != -1) textView.setText(item.itemType.getRepr() + " on question"); else textView.setText(item.itemType.getRepr() + " on answer"); break; case NEW_ANSWER: default: textView.setText(item.itemType.getRepr()); break; } if (item.site != null) { textView = (TextView) findViewById(R.id.postSite); textView.setText("Asked in " + Html.fromHtml(item.site.name)); } } private void getPostDetail() { setProgressBarIndeterminateVisibility(true); Intent intent = new Intent(this, PostIntentService.class); intent.putExtra(StringConstants.SITE, item.site.apiSiteParameter); if (item.itemType.equals(ItemType.NEW_ANSWER)) { intent.putExtra(StringConstants.ACTION, PostIntentService.GET_POST); intent.putExtra(StringConstants.POST_ID, item.answerId); } else { intent.putExtra(StringConstants.ACTION, PostIntentService.GET_POST_COMMENT); intent.putExtra(StringConstants.COMMENT_ID, item.commentId); } intent.putExtra(StringConstants.RESULT_RECEIVER, receiver); startService(intent); } @Override protected void setActionBarTitleAndIcon() { if (item == null || item.site == null) super.setActionBarTitleAndIcon(); setActionBarTitle(item.title); setActionBarHomeIcon(item.site); } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean ret = super.onCreateOptionsMenu(menu); if (menu != null) menu.removeItem(R.id.menu_refresh); return ret & true; } @Override protected void refresh() { throw new UnsupportedOperationException("Refersh not supported"); } @Override protected boolean shouldSearchViewBeEnabled() { return false; } @Override public void onReceiveResult(int resultCode, Bundle resultData) { setProgressBarIndeterminateVisibility(false); switch (resultCode) { case PostIntentService.GET_POST: showPostDetail((Post) resultData.getSerializable(StringConstants.POST)); break; case PostIntentService.GET_POST_COMMENT: comment = (Comment) resultData.getSerializable(StringConstants.COMMENT); if (comment != null) { boolean commentOnAnswer = isCommentOnAnswer(); showPostDetail(comment); if (commentOnAnswer) startGetAnswerService(); } else showPostBody(item.body); break; case AnswersIntentService.GET_ANSWER: setupOnClickForViewMyAnswer((Answer) resultData.getSerializable(StringConstants.ANSWER)); break; case AnswersIntentService.ERROR: break; } } private void startGetAnswerService() { Intent getAnswerIntent = new Intent(this, AnswersIntentService.class); getAnswerIntent.putExtra(StringConstants.SITE, item.site.apiSiteParameter); getAnswerIntent.putExtra(StringConstants.ACTION, AnswersIntentService.GET_ANSWER); getAnswerIntent.putExtra(StringConstants.ID, item.answerId); getAnswerIntent.putExtra(StringConstants.RESULT_RECEIVER, receiver); startService(getAnswerIntent); setProgressBarIndeterminateVisibility(true); } private boolean isCommentOnAnswer() { return comment.type != null && comment.type.equals(PostType.ANSWER); } private void showPostDetail(Post stackXItem) { TextView textView = (TextView) findViewById(R.id.responseUserAndTime); textView.setText(DateTimeUtils.getElapsedDurationSince(stackXItem.creationDate) + " by " + Html.fromHtml(stackXItem.owner.getDisplayName())); if (stackXItem.owner.isRegistered()) { stackXQuickActionMenu.addUserProfileItem(stackXItem.owner.id, Html.fromHtml(stackXItem.owner.displayName) .toString(), item.site); } setupOnClickForViewQuestion(item.questionId); showPostBody(stackXItem.body); } protected void showPostBody(String body) { ArrayList<View> views = MarkdownFormatter.parse(this, body); if (views != null) { LinearLayout postBodyLayout = (LinearLayout) findViewById(R.id.postBody); for (final View view : views) postBodyLayout.addView(view); } } private void setupOnClickForViewMyAnswer(Answer answer) { final LinearLayout postContextLayout = (LinearLayout) findViewById(R.id.postContext); ArrayList<View> views = MarkdownFormatter.parse(this, answer.body); if (views != null) { for (final View view : views) postContextLayout.addView(view); } addViewAnswerToQuickActionMenu(postContextLayout); setupOnClickForViewQuestion(answer.questionId); } private void addViewAnswerToQuickActionMenu(final LinearLayout postContextLayout) { stackXQuickActionMenu.addItem(R.string.answer, new OnClickListener() { @Override public void onClick(View v) { if (postContextLayout.getVisibility() == View.VISIBLE) { postContextLayout.startAnimation(AnimationUtils.loadAnimation(InboxItemActivity.this, android.R.anim.slide_out_right)); postContextLayout.setVisibility(View.GONE); } else { postContextLayout.startAnimation(AnimationUtils.loadAnimation(InboxItemActivity.this, android.R.anim.slide_in_left)); postContextLayout.setVisibility(View.VISIBLE); } } }); } private void setupOnClickForViewQuestion(final long questionId) { postTitleLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startQuestionDetailActivity(questionId); } }); } private void startQuestionDetailActivity(long questionId) { Intent displayQuestionIntent = new Intent(InboxItemActivity.this, QuestionActivity.class); displayQuestionIntent.setAction(StringConstants.QUESTION_ID); displayQuestionIntent.putExtra(StringConstants.QUESTION_ID, questionId); displayQuestionIntent.putExtra(StringConstants.SITE, item.site.apiSiteParameter); startActivity(displayQuestionIntent); } }