package kr.kdev.dg1s.biowiki.ui.comments;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import kr.kdev.dg1s.biowiki.BioWiki;
import kr.kdev.dg1s.biowiki.R;
import kr.kdev.dg1s.biowiki.models.Comment;
import kr.kdev.dg1s.biowiki.models.Note;
import kr.kdev.dg1s.biowiki.ui.BWActionBarActivity;
import kr.kdev.dg1s.biowiki.ui.notifications.NotificationFragment;
import kr.kdev.dg1s.biowiki.util.AppLog;
public class CommentsActivity extends BWActionBarActivity
implements CommentsListFragment.OnCommentSelectedListener,
NotificationFragment.OnPostClickListener,
CommentActions.OnCommentChangeListener {
private static final String KEY_HIGHLIGHTED_COMMENT_ID = "highlighted_comment_id";
private final FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0)
mMenuDrawer.setDrawerIndicatorEnabled(true);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createMenuDrawer(R.layout.comment_activity);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(true);
setTitle(getString(R.string.tab_comments));
FragmentManager fm = getSupportFragmentManager();
fm.addOnBackStackChangedListener(mOnBackStackChangedListener);
if (savedInstanceState != null) {
// restore the highlighted comment (for tablet UI after rotation)
long commentId = savedInstanceState.getLong(KEY_HIGHLIGHTED_COMMENT_ID);
if (commentId != 0) {
if (hasListFragment())
getListFragment().setHighlightedCommentId(commentId);
}
}
}
@Override
public void onBlogChanged() {
super.onBlogChanged();
// clear the backstack
FragmentManager fm = getSupportFragmentManager();
fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
// clear and update the comment list
if (hasListFragment()) {
getListFragment().onBlogChanged();
getListFragment().clear();
reloadCommentList();
updateCommentList();
}
// clear comment detail
if (hasDetailFragment()) {
getDetailFragment().clear();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.basic_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (isLargeOrXLarge()) {
// let BWActionBarActivity handle it (toggles menu drawer)
return super.onOptionsItemSelected(item);
} else {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
return true;
}
}
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
AppLog.d(AppLog.T.COMMENTS, "comment activity new intent");
}
/*
* called from comment list & comment detail when comments are moderated/replied/trashed
*/
@Override
public void onCommentChanged(CommentActions.ChangedFrom changedFrom, CommentActions.ChangeType changeType) {
// update the comment counter on the menu drawer
updateMenuDrawer();
switch (changedFrom) {
case COMMENT_LIST:
reloadCommentDetail();
break;
case COMMENT_DETAIL:
switch (changeType) {
case TRASHED:
updateCommentList();
// remove the detail view since comment was deleted
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
}
break;
case REPLIED:
updateCommentList();
break;
default:
reloadCommentList();
break;
}
break;
}
}
private CommentDetailFragment getDetailFragment() {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(getString(R.string.fragment_tag_comment_detail));
if (fragment == null)
return null;
return (CommentDetailFragment) fragment;
}
private boolean hasDetailFragment() {
return (getDetailFragment() != null);
}
private CommentsListFragment getListFragment() {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(getString(R.string.fragment_tag_comment_list));
if (fragment == null)
return null;
return (CommentsListFragment) fragment;
}
private boolean hasListFragment() {
return (getListFragment() != null);
}
/*
private ReaderPostDetailFragment getReaderFragment() {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(getString(R.string.fragment_tag_reader_post_detail));
if (fragment == null)
return null;
return (ReaderPostDetailFragment)fragment;
}
private boolean hasReaderFragment() {
return (getReaderFragment() != null);
}
void showReaderFragment(long remoteBlogId, long postId) {
FragmentManager fm = getSupportFragmentManager();
fm.executePendingTransactions();
Fragment fragment = ReaderPostDetailFragment.newInstance(remoteBlogId, postId);
FragmentTransaction ft = fm.beginTransaction();
String tagForFragment = getString(R.string.fragment_tag_reader_post_detail);
ft.add(R.id.layout_fragment_container, fragment, tagForFragment)
.addToBackStack(tagForFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (hasDetailFragment())
ft.hide(getDetailFragment());
ft.commit();
}
*/
/*
* called from comment list when user taps a comment
*/
@Override
public void onCommentSelected(Comment comment) {
if (comment == null)
return;
FragmentManager fm = getSupportFragmentManager();
fm.executePendingTransactions();
CommentDetailFragment detailFragment = getDetailFragment();
CommentsListFragment listFragment = getListFragment();
if (detailFragment == null) {
FragmentTransaction ft = fm.beginTransaction();
String tagForFragment = getString(R.string.fragment_tag_comment_detail);
detailFragment = CommentDetailFragment.newInstance(BioWiki.getCurrentLocalTableBlogId(), comment.commentID);
ft.add(R.id.layout_fragment_container, detailFragment, tagForFragment)
.addToBackStack(tagForFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (listFragment != null)
ft.hide(listFragment);
ft.commitAllowingStateLoss();
mMenuDrawer.setDrawerIndicatorEnabled(false);
} else {
// tablet mode with list/detail side-by-side - remove the reader fragment if it exists,
// then show this comment in the detail view and highlight it in the list view
if (/*hasReaderFragment()*/ false)
fm.popBackStackImmediate();
detailFragment.setComment(BioWiki.getCurrentLocalTableBlogId(), comment.commentID);
if (listFragment != null)
listFragment.setHighlightedCommentId(comment.commentID);
}
}
/*
* called from comment detail when user taps a link to a post - show the post in a
* reader detail fragment
*/
@Override
public void onPostClicked(Note note, int remoteBlogId, int postId) {
// showReaderFragment(remoteBlogId, postId);
}
/*
* reload the comment in the detail view if it's showing
*/
private void reloadCommentDetail() {
CommentDetailFragment detailFragment = getDetailFragment();
if (detailFragment != null)
detailFragment.reloadComment();
}
/*
* reload the comment list from existing data
*/
private void reloadCommentList() {
CommentsListFragment listFragment = getListFragment();
if (listFragment != null)
listFragment.loadComments();
}
/*
* tell the comment list to get recent comments from server
*/
void updateCommentList() {
CommentsListFragment listFragment = getListFragment();
if (listFragment != null) {
listFragment.updateComments(false);
listFragment.setRefreshing(true);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
// https://code.google.com/p/android/issues/detail?id=19917
if (outState.isEmpty()) {
outState.putBoolean("bug_19917_fix", true);
}
// retain the id of the highlighted comment
if (hasListFragment()) {
long commentId = getListFragment().getHighlightedCommentId();
if (commentId != 0)
outState.putLong(KEY_HIGHLIGHTED_COMMENT_ID, commentId);
}
super.onSaveInstanceState(outState);
}
@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = CommentDialogs.createCommentDialog(this, id);
if (dialog != null)
return dialog;
return super.onCreateDialog(id);
}
}