package org.wordpress.android.ui.comments; import java.util.HashMap; import java.util.Map; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Looper; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.KeyEvent; import android.widget.Toast; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.justsystems.hpb.pad.R; import org.xmlrpc.android.XMLRPCClient; import org.xmlrpc.android.XMLRPCException; import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; import org.wordpress.android.models.Comment; import org.wordpress.android.ui.WPActionBarActivity; import org.wordpress.android.ui.comments.CommentFragment.OnCommentStatusChangeListener; import org.wordpress.android.ui.comments.CommentsListFragment.OnAnimateRefreshButtonListener; import org.wordpress.android.ui.comments.CommentsListFragment.OnCommentSelectedListener; import org.wordpress.android.ui.comments.CommentsListFragment.OnContextCommentStatusChangeListener; public class CommentsActivity extends WPActionBarActivity implements OnCommentSelectedListener, OnCommentStatusChangeListener, OnAnimateRefreshButtonListener, OnContextCommentStatusChangeListener { protected int id; public int ID_DIALOG_MODERATING = 1; public int ID_DIALOG_REPLYING = 2; public int ID_DIALOG_DELETING = 3; private XMLRPCClient client; public ProgressDialog pd; private CommentsListFragment commentList; private boolean fromNotification = false; private MenuItem refreshMenuItem; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); createMenuDrawer(R.layout.comments); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(true); setTitle(getString(R.string.tab_comments)); Bundle extras = getIntent().getExtras(); if (extras != null) { fromNotification = extras.getBoolean("fromNotification"); if (fromNotification) { try { WordPress.currentBlog = new Blog(extras.getInt("id")); } catch (Exception e) { Toast.makeText(this, getResources().getText(R.string.blog_not_found), Toast.LENGTH_SHORT).show(); finish(); } } } FragmentManager fm = getSupportFragmentManager(); fm.addOnBackStackChangedListener(mOnBackStackChangedListener); commentList = (CommentsListFragment) fm .findFragmentById(R.id.commentList); WordPress.currentComment = null; attemptToSelectComment(); if (fromNotification) commentList.refreshComments(false, false, false); if (savedInstanceState != null) popCommentDetail(); } @Override public void onBlogChanged() { super.onBlogChanged(); commentList.refreshComments(false, false, false); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.basic_menu, menu); refreshMenuItem = menu.findItem(R.id.menu_refresh); if (shouldAnimateRefreshButton) { shouldAnimateRefreshButton = false; startAnimatingRefreshButton(refreshMenuItem); } return true; } @Override public boolean onOptionsItemSelected(final MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.menu_refresh) { popCommentDetail(); attemptToSelectComment(); commentList.refreshComments(false, false, false); return true; } else if (itemId == android.R.id.home) { FragmentManager fm = getSupportFragmentManager(); if (fm.getBackStackEntryCount() > 0) { popCommentDetail(); return true; } } return super.onOptionsItemSelected(item); } private FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() { public void onBackStackChanged() { if (getSupportFragmentManager().getBackStackEntryCount() == 0) mMenuDrawer.setDrawerIndicatorEnabled(true); } }; protected void popCommentDetail() { FragmentManager fm = getSupportFragmentManager(); CommentFragment f = (CommentFragment) fm .findFragmentById(R.id.commentDetail); if (f == null) { fm.popBackStack(); } } @Override protected void onPostResume() { super.onPostResume(); if (WordPress.currentBlog != null) { boolean commentsLoaded = commentList.loadComments(false, false); if (!commentsLoaded) commentList.refreshComments(false, false, false); } } @Override protected void onStop() { super.onStop(); if (commentList.getCommentsTask != null) commentList.getCommentsTask.cancel(true); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Bundle extras = intent.getExtras(); if (extras != null) { boolean fromNotification = false; fromNotification = extras.getBoolean("fromNotification"); if (fromNotification) { try { WordPress.currentBlog = new Blog(extras.getInt("id")); } catch (Exception e) { Toast.makeText(this, getResources().getText(R.string.blog_not_found), Toast.LENGTH_SHORT).show(); finish(); } //titleBar.refreshBlog(); } } } @Override public void onCommentSelected(Comment comment) { FragmentManager fm = getSupportFragmentManager(); CommentFragment f = (CommentFragment) fm .findFragmentById(R.id.commentDetail); if (comment != null) { if (f == null || !f.isInLayout()) { WordPress.currentComment = comment; FragmentTransaction ft = fm.beginTransaction(); ft.hide(commentList); f = new CommentFragment(); ft.add(R.id.commentDetailFragmentContainer, f); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.addToBackStack(null); ft.commitAllowingStateLoss(); mMenuDrawer.setDrawerIndicatorEnabled(false); } else { f.loadComment(comment); } } } @Override public void onCommentStatusChanged(final String status) { if (WordPress.currentComment != null) { final int commentID = WordPress.currentComment.commentID; if (status.equals("approve") || status.equals("hold") || status.equals("spam")) { showDialog(ID_DIALOG_MODERATING); new Thread() { public void run() { Looper.prepare(); changeCommentStatus(status, commentID); } }.start(); } else if (status.equals("delete")) { Thread action3 = new Thread() { public void run() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder( CommentsActivity.this); dialogBuilder.setTitle(getResources().getText( R.string.confirm_delete)); dialogBuilder.setMessage(getResources().getText( R.string.confirm_delete_data)); dialogBuilder.setPositiveButton( getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { showDialog(ID_DIALOG_DELETING); // pop out of the detail view if on a smaller screen FragmentManager fm = getSupportFragmentManager(); CommentFragment f = (CommentFragment) fm .findFragmentById(R.id.commentDetail); if (f == null) { fm.popBackStack(); } new Thread() { public void run() { deleteComment(commentID); } }.start(); } }); dialogBuilder.setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //Don't delete Comment } }); dialogBuilder.setCancelable(true); if (!isFinishing()) { dialogBuilder.create().show(); } } }; runOnUiThread(action3); } else if (status.equals("reply")) { Intent i = new Intent(CommentsActivity.this, AddCommentActivity.class); i.putExtra("commentID", commentID); i.putExtra("postID", WordPress.currentComment.postID); startActivityForResult(i, 0); } else if (status.equals("clear")) { FragmentManager fm = getSupportFragmentManager(); CommentFragment f = (CommentFragment) fm .findFragmentById(R.id.commentDetail); if (f != null) { f.clearContent(); } } } } @SuppressWarnings("unchecked") private void changeCommentStatus(final String newStatus, final int selCommentID) { // for individual comment moderation client = new XMLRPCClient(WordPress.currentBlog.getUrl(), WordPress.currentBlog.getHttpuser(), WordPress.currentBlog.getHttppassword()); Map<String, String> contentHash, postHash = new HashMap<String, String>(); contentHash = (Map<String, String>) commentList.allComments .get(selCommentID); postHash.put("status", newStatus); postHash.put("content", contentHash.get("comment")); postHash.put("author", contentHash.get("author")); postHash.put("author_url", contentHash.get("url")); postHash.put("author_email", contentHash.get("email")); Object[] params = { WordPress.currentBlog.getBlogId(), WordPress.currentBlog.getUsername(), WordPress.currentBlog.getPassword(), selCommentID, postHash }; Object result = null; try { result = (Object) client.call("wp.editComment", params); boolean bResult = Boolean.parseBoolean(result.toString()); if (bResult) { WordPress.currentComment.status = newStatus; commentList.model.set(WordPress.currentComment.position, WordPress.currentComment); WordPress.wpDB.updateCommentStatus(id, WordPress.currentComment.commentID, newStatus); contentHash.put("status", newStatus); } dismissDialog(ID_DIALOG_MODERATING); Thread action = new Thread() { public void run() { Toast.makeText(CommentsActivity.this, getResources().getText(R.string.comment_moderated), Toast.LENGTH_SHORT).show(); //Update the UI of the details view FragmentManager fm = getSupportFragmentManager(); CommentFragment f = (CommentFragment) fm .findFragmentById(R.id.commentDetail); if (f != null) { //tablets if (f.isInLayout()) f.processCommentStatus(); } else {//phone f = (CommentFragment) fm .findFragmentById(R.id.commentDetailFragmentContainer); if (f != null) f.processCommentStatus(); } } }; runOnUiThread(action); Thread action2 = new Thread() { public void run() { commentList.getListView().invalidateViews(); } }; runOnUiThread(action2); } catch (final XMLRPCException e) { dismissDialog(ID_DIALOG_MODERATING); Thread action3 = new Thread() { public void run() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder( CommentsActivity.this); dialogBuilder.setTitle(getResources().getText( R.string.connection_error)); dialogBuilder.setMessage(getResources().getText( R.string.error_moderate_comment)); dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Just close the window. } }); dialogBuilder.setCancelable(true); if (!isFinishing()) { dialogBuilder.create().show(); } } }; runOnUiThread(action3); } } private void deleteComment(int selCommentID) { // delete individual comment client = new XMLRPCClient(WordPress.currentBlog.getUrl(), WordPress.currentBlog.getHttpuser(), WordPress.currentBlog.getHttppassword()); Object[] params = { WordPress.currentBlog.getBlogId(), WordPress.currentBlog.getUsername(), WordPress.currentBlog.getPassword(), selCommentID }; try { client.call("wp.deleteComment", params); dismissDialog(ID_DIALOG_DELETING); attemptToSelectComment(); Thread action = new Thread() { public void run() { Toast.makeText(CommentsActivity.this, getResources().getText(R.string.comment_moderated), Toast.LENGTH_SHORT).show(); } }; runOnUiThread(action); Thread action2 = new Thread() { public void run() { pd = new ProgressDialog(CommentsActivity.this); commentList.refreshComments(false, true, false); } }; runOnUiThread(action2); } catch (final XMLRPCException e) { dismissDialog(ID_DIALOG_DELETING); Thread action3 = new Thread() { public void run() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder( CommentsActivity.this); dialogBuilder.setTitle(getResources().getText( R.string.connection_error)); dialogBuilder.setMessage(getResources().getText( R.string.error_moderate_comment)); dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Just close the window. } }); dialogBuilder.setCancelable(true); if (!isFinishing()) { dialogBuilder.create().show(); } } }; runOnUiThread(action3); } } private void replyToComment(final String postID, final int commentID, final String comment) { // reply to individual comment client = new XMLRPCClient(WordPress.currentBlog.getUrl(), WordPress.currentBlog.getHttpuser(), WordPress.currentBlog.getHttppassword()); Map<String, Object> replyHash = new HashMap<String, Object>(); replyHash.put("comment_parent", commentID); replyHash.put("content", comment); replyHash.put("author", ""); replyHash.put("author_url", ""); replyHash.put("author_email", ""); Object[] params = { WordPress.currentBlog.getBlogId(), WordPress.currentBlog.getUsername(), WordPress.currentBlog.getPassword(), Integer.valueOf(postID), replyHash }; try { int newCommentID = (Integer) client.call("wp.newComment", params); if (newCommentID >= 0) { WordPress.wpDB.updateLatestCommentID( WordPress.currentBlog.getId(), newCommentID); } dismissDialog(ID_DIALOG_REPLYING); Thread action = new Thread() { public void run() { Toast.makeText(CommentsActivity.this, getResources().getText(R.string.reply_added), Toast.LENGTH_SHORT).show(); } }; runOnUiThread(action); Thread action2 = new Thread() { public void run() { pd = new ProgressDialog(CommentsActivity.this); // to avoid // crash commentList.refreshComments(false, true, false); } }; runOnUiThread(action2); } catch (final XMLRPCException e) { dismissDialog(ID_DIALOG_REPLYING); Thread action3 = new Thread() { public void run() { Toast.makeText(CommentsActivity.this, getResources().getText(R.string.connection_error), Toast.LENGTH_SHORT).show(); Intent i = new Intent(CommentsActivity.this, AddCommentActivity.class); i.putExtra("commentID", commentID); i.putExtra("postID", WordPress.currentComment.postID); i.putExtra("comment", comment); startActivityForResult(i, 0); } }; runOnUiThread(action3); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (data != null) { Bundle extras = data.getExtras(); switch (requestCode) { case 0: final String returnText = extras.getString("commentText"); if (!returnText.equals("CANCEL")) { final String postID = extras.getString("postID"); final int commentID = extras.getInt("commentID"); showDialog(ID_DIALOG_REPLYING); new Thread(new Runnable() { public void run() { Looper.prepare(); pd = new ProgressDialog(CommentsActivity.this); replyToComment(postID, commentID, returnText); } }).start(); } break; } } } @Override protected Dialog onCreateDialog(int id) { if (id == ID_DIALOG_MODERATING) { ProgressDialog loadingDialog = new ProgressDialog( CommentsActivity.this); if (commentList.checkedCommentTotal <= 1) { loadingDialog.setMessage(getResources().getText( R.string.moderating_comment)); } else { loadingDialog.setMessage(getResources().getText( R.string.moderating_comments)); } loadingDialog.setIndeterminate(true); loadingDialog.setCancelable(false); return loadingDialog; } else if (id == ID_DIALOG_REPLYING) { ProgressDialog loadingDialog = new ProgressDialog( CommentsActivity.this); loadingDialog.setMessage(getResources().getText( R.string.replying_comment)); loadingDialog.setIndeterminate(true); loadingDialog.setCancelable(false); return loadingDialog; } else if (id == ID_DIALOG_DELETING) { ProgressDialog loadingDialog = new ProgressDialog( CommentsActivity.this); if (commentList.checkedCommentTotal <= 1) { loadingDialog.setMessage(getResources().getText( R.string.deleting_comment)); } else { loadingDialog.setMessage(getResources().getText( R.string.deleting_comments)); } loadingDialog.setIndeterminate(true); loadingDialog.setCancelable(false); return loadingDialog; } return super.onCreateDialog(id); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { /*if (keyCode == KeyEvent.KEYCODE_BACK && titleBar.isShowingDashboard) { titleBar.hideDashboardOverlay(); return false; }*/ return super.onKeyDown(keyCode, event); } @Override public void onAnimateRefreshButton(boolean start) { if (start) { shouldAnimateRefreshButton = true; this.startAnimatingRefreshButton(refreshMenuItem); } else { this.stopAnimatingRefreshButton(refreshMenuItem); } } private void attemptToSelectComment() { FragmentManager fm = getSupportFragmentManager(); CommentFragment f = (CommentFragment) fm .findFragmentById(R.id.commentDetail); if (f != null && f.isInLayout()) { commentList.shouldSelectAfterLoad = true; } } @Override public void onSaveInstanceState(Bundle outState) { if (outState.isEmpty()) { outState.putBoolean("bug_19917_fix", true); } super.onSaveInstanceState(outState); } }