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.view.KeyEvent; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.app.SherlockActivity; 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.Comment; public class EditCommentActivity extends SherlockActivity { private int ID_DIALOG_SAVING = 0; private String xmlErrorMessage; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.edit_comment); setTitle(getString(R.string.edit_comment)); // Capitalize headers ((TextView) findViewById(R.id.l_section1)).setText(getResources() .getString(R.string.comment_content).toUpperCase()); ((TextView) findViewById(R.id.l_status)).setText(getResources() .getString(R.string.status).toUpperCase()); // Retrieve a reference to the current comment. Comment comment = WordPress.currentComment; if (comment == null) { Toast.makeText(this, getString(R.string.error_load_comment), Toast.LENGTH_SHORT).show(); finish(); return; } final EditText authorNameET = (EditText) this .findViewById(R.id.author_name); authorNameET.setText(comment.name); final EditText authorEmailET = (EditText) this .findViewById(R.id.author_email); authorEmailET.setText(comment.authorEmail); final EditText authorURLET = (EditText) this .findViewById(R.id.author_url); authorURLET.setText(comment.authorURL); final EditText commentContentET = (EditText) this .findViewById(R.id.comment_content); commentContentET.setText(comment.comment); String[] items = new String[] { getResources().getString(R.string.approved), getResources().getString(R.string.pending_review), getResources().getString(R.string.spam) }; Spinner spinner = (Spinner) findViewById(R.id.status); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); String status = comment.status; if (status.equals("approve")) { spinner.setSelection(0, true); } else if (status.equals("hold")) { spinner.setSelection(1, true); } else if (status.equals("spam")) { spinner.setSelection(2, true); } spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // do nothing } @Override public void onNothingSelected(AdapterView<?> arg0) { // do nothing } }); final Button saveButton = (Button) findViewById(R.id.post); saveButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { boolean result = saveComment(); if (result) { finish(); } } }); } @Override protected Dialog onCreateDialog(int id) { if (id == ID_DIALOG_SAVING) { ProgressDialog savingDialog = new ProgressDialog(this); savingDialog.setMessage(getResources().getText( R.string.saving_changes)); savingDialog.setIndeterminate(true); savingDialog.setCancelable(true); return savingDialog; } return super.onCreateDialog(id); } public boolean saveComment() { // grab the form data EditText authorNameET = (EditText) findViewById(R.id.author_name); String authorName = authorNameET.getText().toString(); EditText authorEmailET = (EditText) findViewById(R.id.author_email); String authorEmail = authorEmailET.getText().toString(); EditText authorURLET = (EditText) findViewById(R.id.author_url); String authorURL = authorURLET.getText().toString(); EditText contentET = (EditText) findViewById(R.id.comment_content); String content = contentET.getText().toString(); Spinner spinner = (Spinner) findViewById(R.id.status); int selectedStatus = spinner.getSelectedItemPosition(); String status = ""; switch (selectedStatus) { case 0: status = "approve"; break; case 1: status = "hold"; break; case 2: status = "spam"; break; } // Sanity check the edited fields before we save. CharSequence dialogMsg = ""; if (content.equals("")) { dialogMsg = getResources().getText(R.string.content_required); // } else if(authorName.equals("")) { // dialogMsg = getResources().getText(R.string.author_name_required); // } else if(authorEmail.equals("")) { // dialogMsg = getResources().getText(R.string.author_email_required); } if (!dialogMsg.equals("")) { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder( EditCommentActivity.this); dialogBuilder.setTitle(getResources().getText( R.string.required_field)); dialogBuilder.setMessage(dialogMsg); dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Just close the window } }); dialogBuilder.setCancelable(true); dialogBuilder.create().show(); // Short circuit and let the user address the issue. return false; } // If nothing has been changed, skip the rest and just return. Comment comment = WordPress.currentComment; if (authorName.equals(comment.name) && authorEmail.equals(comment.authorEmail) && authorURL.equals(comment.authorURL) && content.equals(comment.comment)) { return true; } final Map<String, String> postHash = new HashMap<String, String>(); postHash.put("status", status); postHash.put("content", content); postHash.put("author", authorName); postHash.put("author_url", authorURL); postHash.put("author_email", authorEmail); // show loading message, then do the work showDialog(ID_DIALOG_SAVING); new Thread() { public void run() { updateComment(postHash); } }.start(); return false; } public void updateComment(Map<String, String> postHash) { // Update the comment on the user's blog. XMLRPCClient client = new XMLRPCClient(WordPress.currentBlog.getUrl(), WordPress.currentBlog.getHttpuser(), WordPress.currentBlog.getHttppassword()); Object[] params = { WordPress.currentBlog.getBlogId(), WordPress.currentBlog.getUsername(), WordPress.currentBlog.getPassword(), WordPress.currentComment.commentID, postHash }; xmlErrorMessage = ""; Object result = null; try { result = (Object) client.call("wp.editComment", params); boolean bResult = Boolean.parseBoolean(result.toString()); if (bResult) { // Our database expects different values in the hash than the xmlrpc request. // Make the necessary adjustments, and clean up the old keys. postHash.put("url", postHash.get("author_url")); postHash.put("email", postHash.get("author_email")); postHash.put("comment", postHash.get("content")); postHash.remove("author_url"); postHash.remove("author_email"); postHash.remove("content"); // Save the updates WordPress.wpDB.updateComment(WordPress.currentBlog.getId(), WordPress.currentComment.commentID, postHash); // Everything was saved successfully, so now we can update the // current comment. WordPress.currentComment.authorEmail = postHash.get("email"); WordPress.currentComment.authorURL = postHash.get("url"); WordPress.currentComment.comment = postHash.get("comment"); WordPress.currentComment.status = postHash.get("status"); WordPress.currentComment.name = postHash.get("author"); } } catch (XMLRPCException e) { xmlErrorMessage = getResources().getText( R.string.error_edit_comment).toString(); } dismissDialog(ID_DIALOG_SAVING); if (xmlErrorMessage != "") { Thread dialogThread = new Thread() { public void run() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder( EditCommentActivity.this); dialogBuilder.setTitle(getResources().getText( R.string.error)); dialogBuilder.setMessage(xmlErrorMessage); dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Just close the window. } }); dialogBuilder.setCancelable(true); dialogBuilder.create().show(); } }; runOnUiThread(dialogThread); } else { finish(); } } @Override public boolean onKeyDown(int i, KeyEvent event) { // only intercept back button press if (i == KeyEvent.KEYCODE_BACK) { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder( EditCommentActivity.this); dialogBuilder .setTitle(getResources().getText(R.string.cancel_edit)); dialogBuilder.setMessage(getResources().getText( R.string.sure_to_cancel_edit_comment)); dialogBuilder.setPositiveButton(getResources() .getText(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Bundle bundle = new Bundle(); bundle.putString("returnStatus", "CANCEL"); Intent mIntent = new Intent(); mIntent.putExtras(bundle); setResult(RESULT_OK, mIntent); finish(); } }); dialogBuilder.setNegativeButton( getResources().getText(R.string.no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // just close the dialog window } }); dialogBuilder.setCancelable(true); dialogBuilder.create().show(); } return false; } }