package com.athena.asm;
import java.util.ArrayList;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.text.ClipboardManager;
import android.text.Html;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockActivity;
import com.athena.asm.util.SmthSupport;
import com.athena.asm.util.StringUtility;
import com.athena.asm.util.task.LoadWritePostTask;
import com.athena.asm.viewmodel.WritePostViewModel;
@SuppressWarnings("deprecation")
public class WritePostActivity extends SherlockActivity implements OnClickListener, OnItemSelectedListener {
static final int ATTACH_REQUST = 0;
public static final int TYPE_POST = 0;
public static final int TYPE_MAIL = 1;
public static final int TYPE_POST_EDIT = 2;
private EditText m_titleEditText;
private EditText m_useridEditText;
private EditText m_contentEditText;
private Spinner m_sigSpinner;
private Button m_attachButton;
public SmthSupport m_smthSupport;
private Handler m_handler = new Handler();
private WritePostViewModel m_viewModel = null;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(aSMApplication.THEME);
super.onCreate(savedInstanceState);
setContentView(R.layout.post_reply);
m_smthSupport = SmthSupport.getInstance();
m_viewModel = (WritePostViewModel) getLastNonConfigurationInstance();
boolean isNewActivity = true;
if (m_viewModel == null) {
m_viewModel = new WritePostViewModel();
} else {
isNewActivity = false;
}
m_titleEditText = (EditText) findViewById(R.id.post_title);
m_useridEditText = (EditText) findViewById(R.id.post_userid);
m_contentEditText = (EditText) findViewById(R.id.post_content);
m_sigSpinner = (Spinner) findViewById(R.id.sig_spinner);
Button sendButton = (Button) findViewById(R.id.btn_send_post);
sendButton.setOnClickListener(this);
m_attachButton = (Button) findViewById(R.id.btn_attach);
m_attachButton.setOnClickListener(this);
m_viewModel.setToHandlerUrl(getIntent().getStringExtra(StringUtility.URL));
m_viewModel.setWriteType(getIntent().getIntExtra(StringUtility.WRITE_TYPE, TYPE_POST));
if (m_viewModel.getWriteType() == TYPE_POST) {
((LinearLayout) m_useridEditText.getParent()).setVisibility(View.GONE);
((LinearLayout) m_useridEditText.getParent()).removeView(sendButton);
LinearLayout layout = (LinearLayout) findViewById(R.id.post_second_layout);
layout.addView(sendButton);
setTitle("写帖子");
if (isNewActivity) {
new LoadWritePostTask(this, m_viewModel).execute();
} else {
restoreFromViewModel();
}
} else if (m_viewModel.getWriteType() == TYPE_MAIL) {
sendButton.setText("发信");
m_attachButton.setVisibility(View.GONE);
m_useridEditText.setText((getIntent().getStringExtra(StringUtility.USERID)));
setTitle("写 信");
if (isNewActivity) {
new LoadWritePostTask(this, m_viewModel).execute();
} else {
restoreFromViewModel();
}
} else if (m_viewModel.getWriteType() == TYPE_POST_EDIT) {
((LinearLayout) m_useridEditText.getParent()).setVisibility(View.GONE);
((LinearLayout) m_useridEditText.getParent()).removeView(sendButton);
LinearLayout layout = (LinearLayout) findViewById(R.id.post_second_layout);
layout.addView(sendButton);
setTitle("修改帖子");
sendButton.setText("修改");
m_viewModel.setPostTitile(getIntent().getStringExtra(StringUtility.TITLE));
m_titleEditText.setText(m_viewModel.getPostTitle());
m_sigSpinner.setEnabled(false);
m_attachButton.setEnabled(false);
if (isNewActivity) {
new LoadWritePostTask(this, m_viewModel).execute();
} else {
restoreFromViewModel();
}
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// do nothing to stop onCreated
super.onConfigurationChanged(newConfig);
}
@Override
public Object onRetainNonConfigurationInstance() {
updateViewModel();
return m_viewModel;
}
public void finishWork() {
createSigSpinner();
boolean isReply = getIntent().getBooleanExtra(StringUtility.IS_REPLY, false);
if (isReply) {
m_contentEditText.requestFocus();
m_contentEditText.setSelection(0);
}
}
private void createSigSpinner() {
ArrayList<String> list = new ArrayList<String>();
list.add("不使用签名档");
int sigNum = m_viewModel.getSigNumber();
for (int i = 1; i <= sigNum; i++) {
list.add("第" + i + "个");
}
if (sigNum > 0) {
list.add("随机签名档");
}
ArrayAdapter<String> sigSpinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
list);
sigSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
m_sigSpinner.setAdapter(sigSpinnerAdapter);
m_sigSpinner.setOnItemSelectedListener(this);
if (sigNum > 0) {
if (m_viewModel.getSelectedSigValue() != -1) {
m_sigSpinner.setSelection(m_viewModel.getSelectedSigValue());
} else {
m_sigSpinner.setSelection(sigNum + 1);
}
}
}
public void parsePostToHandleUrl(String contentString, boolean isReply) {
if (contentString == null)
return;
// function replyForm(board,reid,title,att,signum,sig,ano,outgo,lsave)
Pattern p = Pattern.compile("replyForm\\('[^']+',\\d+,'([^']+)',\\d+,(\\d+),([+-]?\\d+)");
Matcher m = p.matcher(contentString);
if (m.find()) {
String postTitle;
postTitle = m.group(1);
m_viewModel.setSigNumber(Integer.parseInt(m.group(2)));
m_viewModel.setSelectedSigValue(Integer.parseInt(m.group(3)));
if (!postTitle.contains("Re:") && isReply) {
postTitle = "Re: " + postTitle;
}
m_titleEditText.setText(postTitle.trim());
m_viewModel.setPostTitile(postTitle);
}
p = Pattern.compile("-->[\\s\\S]*</script>([\\s\\S]*)</textarea>");
m = p.matcher(contentString);
if (m.find()) {
String postContent;
postContent = m.group(1);
postContent = postContent.replace("\n", "\n<br/>");
if (aSMApplication.getCurrentApplication().isPromotionShow()) {
String promotion = "<br/>#发送自aSM";
if (aSMApplication.getCurrentApplication().getPromotionContent().length() > 0) {
promotion += "@" + aSMApplication.getCurrentApplication().getPromotionContent();
}
postContent += promotion + "\n<br/>";
}
m_contentEditText.setText(Html.fromHtml(postContent));
m_viewModel.setPostContent(postContent);
}
}
public void parsePostEditToHandleUrl(String contentString) {
if (contentString == null)
return;
// function replyForm(board,reid,title,att,signum,sig,ano,outgo,lsave)
Pattern pattern = Pattern.compile("<textarea[^<>]+>([^<>]+)</textarea>");
Matcher matcher = pattern.matcher(contentString);
if (matcher.find()) {
String postContent;
postContent = matcher.group(1);
postContent = postContent.replace("\n", "\n<br/>");
m_contentEditText.setText(Html.fromHtml(postContent));
m_viewModel.setPostContent(postContent);
}
}
public void parseMailToHandleUrl(String contentString) {
Map<String, String> paramsMap = StringUtility.getUrlParams(m_viewModel.getToHandlerUrl());
if (paramsMap.containsKey("title")) {
m_titleEditText.setText(m_viewModel.getPostTitle());
Button button = (Button) findViewById(R.id.btn_send_post);
((LinearLayout) m_useridEditText.getParent()).setVisibility(View.GONE);
((LinearLayout) m_useridEditText.getParent()).removeView(button);
LinearLayout layout = (LinearLayout) findViewById(R.id.post_first_layout);
layout.addView(button);
}
m_viewModel.setSigNumber(StringUtility.getOccur(contentString, "<option") - 2);
Pattern p = Pattern.compile("option value=\"([+-]?\\d+)\" selected");
Matcher m = p.matcher(contentString);
if (m.find()) {
m_viewModel.setSelectedSigValue(Integer.parseInt(m.group(1)));
}
Pattern pattern = Pattern.compile("<textarea[^<>]+>([^<>]+)</textarea>");
Matcher matcher = pattern.matcher(contentString);
if (matcher.find()) {
String postContent;
postContent = matcher.group(1);
postContent = postContent.replace("\n", "\n<br/>");
m_contentEditText.setText(Html.fromHtml(postContent));
m_viewModel.setPostContent(postContent);
}
if (paramsMap.containsKey("board")) {
pattern = Pattern.compile("<input class=\"sb1\" type=\"text\" name=\"title\"[^<>]+value=\"([^<>]+)\">");
matcher = pattern.matcher(contentString);
if (matcher.find()) {
String postTitle;
postTitle = matcher.group(1);
if (!postTitle.contains("Re:")) {
postTitle = "Re: " + postTitle;
}
m_titleEditText.setText(postTitle);
m_viewModel.setPostTitile(postTitle);
}
pattern = Pattern.compile("<input class=\"sb1\" type=\"text\" name=\"userid\" value=\"([^<>]+)\">");
matcher = pattern.matcher(contentString);
if (matcher.find()) {
m_useridEditText.setText(matcher.group(1));
}
}
}
public void showSuccessToast() {
m_handler.post(new Runnable() {
public void run() {
if (m_viewModel.getWriteType() == TYPE_POST) {
Toast.makeText(getApplicationContext(), "发表成功.", Toast.LENGTH_SHORT).show();
} else if (m_viewModel.getWriteType() == TYPE_MAIL) {
Toast.makeText(getApplicationContext(), "发信成功.", Toast.LENGTH_SHORT).show();
} else if (m_viewModel.getWriteType() == TYPE_POST_EDIT) {
Toast.makeText(getApplicationContext(), "修改成功.", Toast.LENGTH_SHORT).show();
}
}
});
if (m_viewModel.getWriteType() == TYPE_POST) {
Intent i = new Intent();
Bundle b = new Bundle();
b.putBoolean(StringUtility.REFRESH_BOARD, true);
i.putExtras(b);
this.setResult(RESULT_OK, i);
}
this.finish();
}
public void showFailedToast() {
ClipboardManager clip = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clip.setText(m_viewModel.getPostContent());
m_handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "发表失败.内容已保留到剪贴板", Toast.LENGTH_SHORT).show();
}
});
this.finish();
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ATTACH_REQUST) {
if (resultCode == RESULT_OK) {
m_attachButton.setEnabled(false);
}
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_attach) {
Intent intent = new Intent();
intent.setClassName("com.athena.asm", "com.athena.asm.AttachUploadActivity");
startActivityForResult(intent, ATTACH_REQUST);
} else if (view.getId() == R.id.btn_send_post) {
final ProgressDialog pdialog = new ProgressDialog(this);
pdialog.setMessage("发表中...");
pdialog.show();
updateViewModel();
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(
m_contentEditText.getWindowToken(), 0);
Thread th = new Thread() {
@Override
public void run() {
boolean result = m_viewModel.sendPost();
if (!result) {
showFailedToast();
} else {
showSuccessToast();
}
pdialog.cancel();
}
};
th.start();
}
}
private void updateViewModel() {
m_viewModel.setPostTitile(m_titleEditText.getText().toString());
if (m_viewModel.getMailUserId().length() < 1) {
m_viewModel.setMailUserId(m_useridEditText.getText().toString().trim());
}
m_viewModel.setPostContent(m_contentEditText.getText().toString());
int selectedSig = m_sigSpinner.getSelectedItemPosition();
if (selectedSig == m_viewModel.getSigNumber() + 1) {
selectedSig = -1;
}
m_viewModel.setSelectedSigValue(selectedSig);
}
private void restoreFromViewModel() {
m_titleEditText.setText(m_viewModel.getPostTitle());
m_useridEditText.setText(m_viewModel.getMailUserId());
m_contentEditText.setText(m_viewModel.getPostContent());
createSigSpinner();
int selectedSig = m_viewModel.getSelectedSigValue();
if (selectedSig == -1) {
selectedSig = m_viewModel.getSigNumber() + 1;
}
m_sigSpinner.setSelection(selectedSig);
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}