package org.wordpress.android.ui.comments;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewSwitcher;
import com.android.volley.toolbox.NetworkImageView;
import com.justsystems.hpb.pad.R;
import org.xmlrpc.android.ApiHelper;
import org.xmlrpc.android.XMLRPCClient;
import org.xmlrpc.android.XMLRPCException;
import org.xmlrpc.android.XMLRPCFault;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Comment;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.WPAlertDialogFragment;
public class CommentsListFragment extends ListFragment {
public ArrayList<Comment> model = null;
private XMLRPCClient client;
private String accountName = "", moderateErrorMsg = "";
public int[] changedStatuses;
public Map<Integer, Map<?, ?>> allComments = new HashMap<Integer, Map<?, ?>>();
public int ID_DIALOG_MODERATING = 1;
public int ID_DIALOG_REPLYING = 2;
public int ID_DIALOG_DELETING = 3;
public boolean initializing = true, shouldSelectAfterLoad = false;
public int selectedID = 0, rowID = 0, numRecords = 0, totalComments = 0,
commentsToLoad = 30, checkedCommentTotal = 0, selectedPosition,
scrollPosition = 0, scrollPositionTop = 0;
public ProgressDialog pd;
private ViewSwitcher switcher;
boolean loadMore = false, doInBackground = false, refreshOnly = false;
private List<String> checkedComments;
Object[] commentParams;
boolean dualView;
private OnCommentSelectedListener onCommentSelectedListener;
private OnAnimateRefreshButtonListener onAnimateRefreshButton;
private OnContextCommentStatusChangeListener onCommentStatusChangeListener;
public getRecentCommentsTask getCommentsTask;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
}
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
// check that the containing activity implements our callback
onCommentSelectedListener = (OnCommentSelectedListener) activity;
onAnimateRefreshButton = (OnAnimateRefreshButtonListener) activity;
onCommentStatusChangeListener = (OnContextCommentStatusChangeListener) activity;
} catch (ClassCastException e) {
activity.finish();
throw new ClassCastException(activity.toString()
+ " must implement Callback");
}
}
@Override
public void onResume() {
super.onResume();
hideModerationBar(); //The app doesn't remember the selection state on resume, so don't show the bar.
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.view_comments_fragment, container,
false);
// create the ViewSwitcher in the current context
switcher = new ViewSwitcher(getActivity().getApplicationContext());
Button footer = (Button) View.inflate(getActivity()
.getApplicationContext(), R.layout.list_footer_btn, null);
footer.setText(getResources().getText(R.string.load_more) + " "
+ getResources().getText(R.string.tab_comments));
footer.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
switcher.showNext();
refreshComments(true, false, false);
}
});
View progress = View.inflate(getActivity().getApplicationContext(),
R.layout.list_footer_progress, null);
switcher.addView(footer);
switcher.addView(progress);
getActivity().setTitle(accountName + " - Moderate Comments");
Button deleteComments = (Button) v.findViewById(R.id.bulkDeleteComment);
deleteComments.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
getActivity().showDialog(ID_DIALOG_DELETING);
new Thread() {
public void run() {
Looper.prepare();
deleteComments();
}
}.start();
}
});
Button approveComments = (Button) v
.findViewById(R.id.bulkApproveComment);
approveComments.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
getActivity().showDialog(ID_DIALOG_MODERATING);
new Thread() {
public void run() {
Looper.prepare();
moderateComments("approve");
}
}.start();
}
});
Button unapproveComments = (Button) v
.findViewById(R.id.bulkUnapproveComment);
unapproveComments.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
getActivity().showDialog(ID_DIALOG_MODERATING);
new Thread() {
public void run() {
Looper.prepare();
moderateComments("hold");
}
}.start();
}
});
Button spamComments = (Button) v.findViewById(R.id.bulkMarkSpam);
spamComments.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
getActivity().showDialog(ID_DIALOG_MODERATING);
new Thread() {
public void run() {
Looper.prepare();
moderateComments("spam");
}
}.start();
}
});
return v;
}
@SuppressWarnings("unchecked")
protected void moderateComments(String newStatus) {
// handles bulk moderation
for (int i = 0; i < checkedComments.size(); i++) {
if (checkedComments.get(i).toString().equals("true")) {
client = new XMLRPCClient(WordPress.currentBlog.getUrl(),
WordPress.currentBlog.getHttpuser(),
WordPress.currentBlog.getHttppassword());
Comment listRow = (Comment) getListView().getItemAtPosition(i);
int curCommentID = listRow.commentID;
Map<String, String> contentHash, postHash = new HashMap<String, String>();
contentHash = (Map<String, String>) allComments
.get(curCommentID);
if (contentHash.get("status").equals(newStatus)) {
checkedComments.set(i, "false");
continue;
}
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(), curCommentID,
postHash };
Object result = null;
try {
result = (Object) client.call("wp.editComment", params);
boolean bResult = Boolean.parseBoolean(result.toString());
if (bResult) {
checkedComments.set(i, "false");
listRow.status = newStatus;
contentHash.put("status", newStatus);
model.set(i, listRow);
WordPress.wpDB.updateCommentStatus(
WordPress.currentBlog.getId(),
listRow.commentID, newStatus);
}
} catch (XMLRPCException e) {
moderateErrorMsg = getResources().getText(
R.string.error_moderate_comment).toString();
}
}
}
getActivity().dismissDialog(ID_DIALOG_MODERATING);
Thread action = new Thread() {
public void run() {
if (moderateErrorMsg == "") {
String msg = getResources().getText(
R.string.comment_moderated).toString();
if (checkedCommentTotal > 1)
msg = getResources().getText(
R.string.comments_moderated).toString();
Toast.makeText(getActivity().getApplicationContext(), msg,
Toast.LENGTH_SHORT).show();
checkedCommentTotal = 0;
hideModerationBar();
getListView().invalidateViews();
} else {
// there was an xmlrpc error
if (!getActivity().isFinishing()) {
checkedCommentTotal = 0;
hideModerationBar();
getListView().invalidateViews();
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
WPAlertDialogFragment alert = WPAlertDialogFragment
.newInstance(moderateErrorMsg);
alert.show(ft, "alert");
}
moderateErrorMsg = "";
}
}
};
getActivity().runOnUiThread(action);
pd = new ProgressDialog(getActivity().getApplicationContext());
}
protected void deleteComments() {
// bulk delete comments
for (int i = 0; i < checkedComments.size(); i++) {
if (checkedComments.get(i).toString().equals("true")) {
client = new XMLRPCClient(WordPress.currentBlog.getUrl(),
WordPress.currentBlog.getHttpuser(),
WordPress.currentBlog.getHttppassword());
Comment listRow = (Comment) getListView().getItemAtPosition(i);
int curCommentID = listRow.commentID;
Object[] params = { WordPress.currentBlog.getBlogId(),
WordPress.currentBlog.getUsername(),
WordPress.currentBlog.getPassword(), curCommentID };
try {
client.call("wp.deleteComment", params);
} catch (final XMLRPCException e) {
moderateErrorMsg = getResources().getText(
R.string.error_moderate_comment).toString();
}
}
}
getActivity().dismissDialog(ID_DIALOG_DELETING);
Thread action = new Thread() {
public void run() {
if (moderateErrorMsg == "") {
String msg = getResources().getText(
R.string.comment_moderated).toString();
if (checkedCommentTotal > 1)
msg = getResources().getText(
R.string.comments_moderated).toString();
Toast.makeText(getActivity().getApplicationContext(), msg,
Toast.LENGTH_SHORT).show();
checkedCommentTotal = 0;
hideModerationBar();
refreshComments(false, false, false);
} else {
// error occurred during delete request
if (!getActivity().isFinishing()) {
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
WPAlertDialogFragment alert = WPAlertDialogFragment
.newInstance(moderateErrorMsg);
try {
alert.show(ft, "alert");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
};
getActivity().runOnUiThread(action);
pd = new ProgressDialog(getActivity().getApplicationContext());
}
public boolean loadComments(boolean refresh, boolean loadMore) {
refreshOnly = refresh;
String author, postID, comment, dateCreatedFormatted, status, authorEmail, authorURL, postTitle;
int commentID;
List<Map<String, Object>> loadedComments = WordPress.wpDB
.loadComments(WordPress.currentBlog.getId());
if (loadedComments != null) {
numRecords = loadedComments.size();
if (refreshOnly) {
if (model != null) {
model.clear();
}
} else {
model = new ArrayList<Comment>();
}
checkedComments = new Vector<String>();
for (int i = 0; i < loadedComments.size(); i++) {
checkedComments.add(i, "false");
Map<String, Object> contentHash = loadedComments.get(i);
allComments.put((Integer) contentHash.get("commentID"),
contentHash);
author = StringUtils.unescapeHTML(contentHash.get("author")
.toString());
commentID = (Integer) contentHash.get("commentID");
postID = contentHash.get("postID").toString();
comment = StringUtils.unescapeHTML(contentHash.get("comment")
.toString());
dateCreatedFormatted = contentHash.get("commentDateFormatted")
.toString();
status = contentHash.get("status").toString();
authorEmail = StringUtils.unescapeHTML(contentHash.get("email")
.toString());
authorURL = StringUtils.unescapeHTML(contentHash.get("url")
.toString());
postTitle = StringUtils.unescapeHTML(contentHash.get(
"postTitle").toString());
if (model == null) {
model = new ArrayList<Comment>();
}
// add to model
model.add(new Comment(postID, commentID, i, author,
dateCreatedFormatted, comment, status, postTitle,
authorURL, authorEmail, URI
.create("http://gravatar.com/avatar/"
+ StringUtils.getMd5Hash(authorEmail
.trim()) + "?s=140&d=404")));
}
if (!refreshOnly) {
ListView listView = this.getListView();
listView.removeFooterView(switcher);
if (loadedComments.size() % 30 == 0) {
listView.addFooterView(switcher);
}
setListAdapter(new CommentAdapter());
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View view,
int position, long id) {
selectedPosition = position;
Comment comment = model.get((int) id);
onCommentSelectedListener.onCommentSelected(comment);
getListView().invalidateViews();
}
});
// listView.setOnItemLongClickListener(new OnItemLongClickListener() {
//
// @Override
// public boolean onItemLongClick(AdapterView<?> arg0,
// View view, int position, long id) {
//
// selectedPosition = position;
// Comment comment = model.get((int) id);
// onCommentSelectedListener.onCommentSelected(comment);
//
// Intent i = new Intent(
// getActivity().getApplicationContext(),
// EditComment.class);
// startActivityForResult(i, 0);
//
// return false;
// }
//
// });
listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info;
try {
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
// Log.e(TAG, "bad menuInfo", e);
return;
}
WordPress.currentComment = model.get(info.position);
menu.setHeaderTitle(getResources().getText(
R.string.comment_actions));
menu.add(0, 0, 0,
getResources().getText(R.string.mark_approved));
menu.add(0, 1, 0,
getResources()
.getText(R.string.mark_unapproved));
menu.add(0, 2, 0,
getResources().getText(R.string.mark_spam));
menu.add(0, 3, 0, getResources()
.getText(R.string.reply));
menu.add(0, 4, 0,
getResources().getText(R.string.delete));
menu.add(0, 5, 0, getResources().getText(R.string.edit));
}
});
} else {
getListView().invalidateViews();
}
if (this.shouldSelectAfterLoad) {
if (model != null) {
if (model.size() > 0) {
selectedPosition = 0;
Comment aComment = model.get((int) 0);
onCommentSelectedListener.onCommentSelected(aComment);
getListView().setItemChecked(0, true);
}
}
shouldSelectAfterLoad = false;
}
if (loadMore && scrollPosition > 0) {
ListView listView = this.getListView();
try {
listView.setSelectionFromTop(scrollPosition,
scrollPositionTop);
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
} else {
return false;
}
}
public void refreshComments(final boolean more, final boolean refresh,
final boolean background) {
loadMore = more;
refreshOnly = refresh;
doInBackground = background;
if (!loadMore && !doInBackground) {
onAnimateRefreshButton.onAnimateRefreshButton(true);
}
client = new XMLRPCClient(WordPress.currentBlog.getUrl(),
WordPress.currentBlog.getHttpuser(),
WordPress.currentBlog.getHttppassword());
Map<String, Object> hPost = new HashMap<String, Object>();
if (loadMore) {
ListView listView = this.getListView();
scrollPosition = listView.getFirstVisiblePosition();
View firstVisibleView = listView.getChildAt(0);
scrollPositionTop = (firstVisibleView == null) ? 0
: firstVisibleView.getTop();
hPost.put("number", numRecords + 30);
} else {
hPost.put("number", 30);
}
Object[] params = { WordPress.currentBlog.getBlogId(),
WordPress.currentBlog.getUsername(),
WordPress.currentBlog.getPassword(), hPost };
commentParams = params;
getCommentsTask = new getRecentCommentsTask();
getCommentsTask.execute();
}
@Override
public void onDestroy() {
super.onDestroy();
}
class CommentAdapter extends ArrayAdapter<Comment> {
int sdk_version = 7;
boolean detailViewVisible = false;
CommentAdapter() {
super(getActivity().getApplicationContext(), R.layout.comment_row,
model);
sdk_version = android.os.Build.VERSION.SDK_INT;
FragmentManager fm = getActivity().getSupportFragmentManager();
CommentFragment f = (CommentFragment) fm
.findFragmentById(R.id.commentDetail);
if (f != null && f.isInLayout())
detailViewVisible = true;
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
CommentEntryWrapper wrapper = null;
if (row == null) {
LayoutInflater inflater = getActivity().getLayoutInflater();
row = inflater.inflate(R.layout.comment_row, null);
NetworkImageView avatar = (NetworkImageView) row
.findViewById(R.id.avatar);
avatar.setDefaultImageResId(R.drawable.placeholder);
wrapper = new CommentEntryWrapper(row);
row.setTag(wrapper);
} else {
wrapper = (CommentEntryWrapper) row.getTag();
}
Comment commentEntry = getItem(position);
wrapper.populateFrom(commentEntry, position);
return (row);
}
}
class CommentEntryWrapper {
private TextView name = null;
private TextView emailURL = null;
private TextView comment = null;
private TextView status = null;
private TextView postTitle = null;
private NetworkImageView avatar = null;
private View row = null;
private CheckBox bulkCheck = null;
private RelativeLayout bulkEditGroup = null;
CommentEntryWrapper(View row) {
this.row = row;
}
void populateFrom(Comment s, final int position) {
String authorName = s.name;
if (authorName.length() > 0)
getName().setText(authorName);
else
getName().setText(getResources().getText(R.string.anonymous));
String fEmailURL = s.authorURL;
// use the email address if the commenter didn't add a url
if (fEmailURL == "")
fEmailURL = s.emailURL;
getEmailURL().setText(fEmailURL);
getComment().setText(s.comment);
getPostTitle().setText(
getResources().getText(R.string.on) + " " + s.postTitle);
row.setId(Integer.valueOf(s.commentID));
String prettyComment, textColor = "";
if (s.status.equals("spam")) {
prettyComment = getResources().getText(R.string.spam)
.toString();
textColor = "#FF0000";
} else if (s.status.equals("hold")) {
prettyComment = getResources().getText(R.string.unapproved)
.toString();
textColor = "#D54E21";
} else {
prettyComment = getResources().getText(R.string.approved)
.toString();
textColor = "#006505";
}
getBulkEditGroup().setVisibility(View.VISIBLE);
getStatus().setText(prettyComment);
getStatus().setTextColor(Color.parseColor(textColor));
getBulkCheck().setChecked(
Boolean.parseBoolean(checkedComments.get(position)
.toString()));
getBulkCheck().setTag(position);
getBulkCheck().setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
checkedComments.set(position,
String.valueOf(getBulkCheck().isChecked()));
showOrHideModerationBar();
}
});
getAvatar().setImageUrl(s.profileImageUrl.toString(),
WordPress.imageLoader);
}
TextView getName() {
if (name == null) {
name = (TextView) row.findViewById(R.id.name);
}
return (name);
}
TextView getEmailURL() {
if (emailURL == null) {
emailURL = (TextView) row.findViewById(R.id.email_url);
}
return (emailURL);
}
TextView getComment() {
if (comment == null) {
comment = (TextView) row.findViewById(R.id.comment);
}
return (comment);
}
TextView getStatus() {
if (status == null) {
status = (TextView) row.findViewById(R.id.status);
}
status.setTextSize(12);
return (status);
}
TextView getPostTitle() {
if (postTitle == null) {
postTitle = (TextView) row.findViewById(R.id.postTitle);
}
return (postTitle);
}
NetworkImageView getAvatar() {
if (avatar == null) {
avatar = (NetworkImageView) row.findViewById(R.id.avatar);
}
return (avatar);
}
CheckBox getBulkCheck() {
if (bulkCheck == null) {
bulkCheck = (CheckBox) row.findViewById(R.id.bulkCheck);
}
return (bulkCheck);
}
RelativeLayout getBulkEditGroup() {
if (bulkEditGroup == null) {
bulkEditGroup = (RelativeLayout) row
.findViewById(R.id.bulkEditGroup);
}
return (bulkEditGroup);
}
}
protected void hideModerationBar() {
RelativeLayout moderationBar = (RelativeLayout) getActivity()
.findViewById(R.id.moderationBar);
if (moderationBar.getVisibility() == View.INVISIBLE)
return;
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(1.0f, 0.0f);
animation.setDuration(500);
set.addAnimation(animation);
animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
0.0f, Animation.RELATIVE_TO_SELF, 1.0f);
animation.setDuration(500);
set.addAnimation(animation);
moderationBar.clearAnimation();
moderationBar.startAnimation(set);
moderationBar.setVisibility(View.INVISIBLE);
}
protected void showOrHideModerationBar() {
if (checkedComments == null)
return;
boolean shouldShowModerationBar = false;
for (int i = 0; i < checkedComments.size(); i++) {
if (checkedComments.get(i).equals("true")) {
shouldShowModerationBar = true;
break;
}
}
if (shouldShowModerationBar)
showModerationBar();
else
hideModerationBar();
}
protected void showModerationBar() {
RelativeLayout moderationBar = (RelativeLayout) getActivity()
.findViewById(R.id.moderationBar);
if (moderationBar.getVisibility() == View.VISIBLE)
return;
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(500);
set.addAnimation(animation);
animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
animation.setDuration(500);
set.addAnimation(animation);
moderationBar.setVisibility(View.VISIBLE);
moderationBar.startAnimation(set);
}
interface XMLRPCMethodCallback {
void callFinished(Object[] result);
}
class XMLRPCMethod extends Thread {
private String method;
private Object[] params;
private Handler handler;
private XMLRPCMethodCallback callBack;
public XMLRPCMethod(String method, XMLRPCMethodCallback callBack) {
this.method = method;
this.callBack = callBack;
handler = new Handler();
}
public void call() {
call(null);
}
public void call(Object[] params) {
this.params = params;
start();
}
@SuppressWarnings("unchecked")
@Override
public void run() {
try {
// get the total comments
Map<Object, Object> countResult = new HashMap<Object, Object>();
Object[] countParams = { WordPress.currentBlog.getBlogId(),
WordPress.currentBlog.getUsername(),
WordPress.currentBlog.getPassword(), 0 };
try {
countResult = (Map<Object, Object>) client.call(
"wp.getCommentCount", countParams);
totalComments = Integer.valueOf(countResult.get(
"awaiting_moderation").toString())
+ Integer.valueOf(countResult.get("approved")
.toString());
} catch (XMLRPCException e) {
e.printStackTrace();
}
final Object[] result = (Object[]) client.call(method, params);
handler.post(new Runnable() {
public void run() {
callBack.callFinished(result);
}
});
} catch (final XMLRPCFault e) {
handler.post(new Runnable() {
public void run() {
if (pd.isShowing()) {
pd.dismiss();
}
if (!getActivity().isFinishing()) {
onAnimateRefreshButton
.onAnimateRefreshButton(false);
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
WPAlertDialogFragment alert = WPAlertDialogFragment
.newInstance(e.getLocalizedMessage());
alert.show(ft, "alert");
}
}
});
} catch (final XMLRPCException e) {
handler.post(new Runnable() {
public void run() {
if (pd.isShowing()) {
pd.dismiss();
}
if (!getActivity().isFinishing()) {
onAnimateRefreshButton
.onAnimateRefreshButton(false);
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
WPAlertDialogFragment alert = WPAlertDialogFragment
.newInstance(e.getLocalizedMessage());
alert.show(ft, "alert");
}
}
});
}
}
}
interface XMLRPCMethodCallbackEditComment {
void callFinished(Object result);
}
class XMLRPCMethodEditComment extends Thread {
private String method;
private Object[] params;
private Handler handler;
private XMLRPCMethodCallbackEditComment callBack;
public XMLRPCMethodEditComment(String method,
XMLRPCMethodCallbackEditComment callBack) {
this.method = method;
this.callBack = callBack;
handler = new Handler();
}
public void call() {
call(null);
}
public void call(Object[] params) {
this.params = params;
start();
}
@Override
public void run() {
try {
final Object result = (Object) client.call(method, params);
handler.post(new Runnable() {
public void run() {
callBack.callFinished(result);
}
});
} catch (final XMLRPCFault e) {
handler.post(new Runnable() {
public void run() {
if (!getActivity().isFinishing()) {
getActivity().dismissDialog(ID_DIALOG_MODERATING);
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
WPAlertDialogFragment alert = WPAlertDialogFragment
.newInstance(e.getFaultString());
alert.show(ft, "alert");
}
}
});
} catch (final XMLRPCException e) {
handler.post(new Runnable() {
public void run() {
if (!getActivity().isFinishing()) {
getActivity().dismissDialog(ID_DIALOG_MODERATING);
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
WPAlertDialogFragment alert = WPAlertDialogFragment
.newInstance(e.getLocalizedMessage());
alert.show(ft, "alert");
}
}
});
}
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
/* Switch on the ID of the item, to get what the user selected. */
switch (item.getItemId()) {
case 0:
onCommentStatusChangeListener.onCommentStatusChanged("approve");
return true;
case 1:
onCommentStatusChangeListener.onCommentStatusChanged("hold");
return true;
case 2:
onCommentStatusChangeListener.onCommentStatusChanged("spam");
return true;
case 3:
onCommentStatusChangeListener.onCommentStatusChanged("reply");
return true;
case 4:
onCommentStatusChangeListener.onCommentStatusChanged("delete");
return true;
case 5:
// selectedPosition = position;
// Comment comment = model.get((int) id);
// onCommentSelectedListener.onCommentSelected(comment);
Intent i = new Intent(getActivity().getApplicationContext(),
EditCommentActivity.class);
startActivityForResult(i, 0);
return true;
}
return false;
}
class getRecentCommentsTask extends
AsyncTask<Void, Void, Map<Integer, Map<?, ?>>> {
protected void onPostExecute(Map<Integer, Map<?, ?>> commentsResult) {
if (isCancelled())
return;
if (commentsResult == null) {
if (model != null && model.size() == 1) {
WordPress.wpDB.clearComments(WordPress.currentBlog.getId());
model.clear();
allComments.clear();
getListView().invalidateViews();
onCommentStatusChangeListener
.onCommentStatusChanged("clear");
WordPress.currentComment = null;
loadComments(false, false);
}
onAnimateRefreshButton.onAnimateRefreshButton(false);
if (!moderateErrorMsg.equals("")
&& !getActivity().isFinishing()) {
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
WPAlertDialogFragment alert = WPAlertDialogFragment
.newInstance(String.format(
getResources().getString(
R.string.error_refresh),
getResources().getText(
R.string.tab_comments)),
moderateErrorMsg);
alert.show(ft, "alert");
moderateErrorMsg = "";
}
return;
}
if (commentsResult.size() == 0) {
// no comments found
if (pd.isShowing()) {
pd.dismiss();
}
} else {
allComments.putAll(commentsResult);
if (!doInBackground) {
loadComments(refreshOnly, loadMore);
}
}
onAnimateRefreshButton.onAnimateRefreshButton(false);
if (loadMore) {
switcher.showPrevious();
}
if (!doInBackground) {
showOrHideModerationBar();
}
}
@Override
protected Map<Integer, Map<?, ?>> doInBackground(Void... args) {
Map<Integer, Map<?, ?>> commentsResult;
try {
commentsResult = ApiHelper.refreshComments(getActivity()
.getApplicationContext(), commentParams);
} catch (XMLRPCException e) {
if (!getActivity().isFinishing())
moderateErrorMsg = e.getLocalizedMessage();
return null;
}
return commentsResult;
}
}
public interface OnCommentSelectedListener {
public void onCommentSelected(Comment comment);
}
public interface OnAnimateRefreshButtonListener {
public void onAnimateRefreshButton(boolean start);
}
public interface OnContextCommentStatusChangeListener {
public void onCommentStatusChanged(String status);
}
@Override
public void onSaveInstanceState(Bundle outState) {
if (outState.isEmpty()) {
outState.putBoolean("bug_19917_fix", true);
}
super.onSaveInstanceState(outState);
}
}