package com.gnod.geekr.ui.activity;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.Spannable;
import android.text.TextWatcher;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.gnod.geekr.R;
import com.gnod.geekr.tool.ImageHelper;
import com.gnod.geekr.tool.StringUtils;
import com.gnod.geekr.tool.ToastHelper;
import com.gnod.geekr.tool.fetcher.BaseFetcher;
import com.gnod.geekr.tool.fetcher.BaseFetcher.FetchCompleteListener;
import com.gnod.geekr.tool.fetcher.StatusFetcher;
public class PostStatusActivity extends BaseActivity {
private static final int SEND_REPLY = 0;
private static final int SEND_RETWEET = 1;
private static final int SEND_COMMENT = 2;
private static final int SEND_NEW = 3;
private static final int TYPE_AT = 0;
private static final int TYPE_PICK_PIC = 1;
private static final int TYPE_TAKE_PIC = 2;
private View btnAtView;
private View btnTopicView;
private View btnEmotionView;
private CheckBox retweetCheckBox;
private EditText editor;
private TextView btnWordCount;
private String statusId;
private ProgressDialog progressDialog;
private int sendType;
private String commentId;
private View btnLocView;
private View btnPicView;
private View emotionLayout;
private GridView emotionGridView;
private View imageLayout;
private ImageView imageView;
private Uri takePicUri;
private String type;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
initView();
registerListener();
bindView();
}
private void initView() {
editor = (EditText) findViewById(R.id.view_post_edittext);
retweetCheckBox = (CheckBox) findViewById(R.id.checkbox_retweet);
btnEmotionView = findViewById(R.id.btn_post_emotion);
btnTopicView = findViewById(R.id.btn_post_topic);
btnAtView = findViewById(R.id.btn_post_at);
btnPicView = findViewById(R.id.btn_post_pic);
btnLocView = findViewById(R.id.btn_post_location);
btnWordCount = (TextView) findViewById(R.id.btn_post_words_count);
imageLayout = findViewById(R.id.layout_post_image);
imageView = (ImageView) findViewById(R.id.view_post_image);
emotionLayout = findViewById(R.id.layout_emotion);
emotionGridView = (GridView) findViewById(R.id.grid_emotion_thumb);
progressDialog = new ProgressDialog(PostStatusActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.menu_cmt, menu);
return true;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& emotionLayout.getVisibility() == View.VISIBLE) {
emotionLayout.setVisibility(View.GONE);
return true;
} else if(keyCode == KeyEvent.KEYCODE_BACK && editor.getText().length() > 0){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("确定放弃当前操作?");
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
return true;
}
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.menu_cmt_send:
if (editor.getText().length() > 140) {
ToastHelper.show("字数超过140");
} else if (editor.getText().length() == 0
&& !type.equalsIgnoreCase("retweet")) {
ToastHelper.show("内容为空");
} else {
send();
}
return true;
}
return super.onOptionsItemSelected(item);
}
private void registerListener() {
editor.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
int remainCount = 140 - s.length();
btnWordCount.setText(String.valueOf(remainCount));
}
});
editor.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (emotionLayout.getVisibility() == View.VISIBLE) {
emotionLayout.setVisibility(View.GONE);
return true;
}
return false;
}
});
btnWordCount.setOnClickListener(clickListener);
btnEmotionView.setOnClickListener(clickListener);
btnTopicView.setOnClickListener(clickListener);
btnAtView.setOnClickListener(clickListener);
retweetCheckBox.setOnClickListener(clickListener);
btnPicView.setOnClickListener(clickListener);
btnLocView.setOnClickListener(clickListener);
imageView.setOnClickListener(clickListener);
emotionGridView.setAdapter(new ImageAdapter(this));
emotionGridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
CharSequence emotionTag = (CharSequence) view.getTag();
int start = editor.getSelectionStart();
int end = editor.getSelectionEnd();
int startPos = Math.min(start, end);
int endPos = startPos + emotionTag.length();
editor.getText().replace(Math.min(start, end),
Math.max(start, end), emotionTag);
// convert emotion tag to thumb
InputStream input;
try {
input = getAssets().open(
"smileys" + File.separator
+ ImageHelper.emotionsMap.get(emotionTag));
Bitmap bitmap = BitmapFactory.decodeStream(input);
bitmap = Bitmap.createScaledBitmap(bitmap, 42, 42, true);
ImageSpan imageSpan = new ImageSpan(
PostStatusActivity.this, bitmap);
editor.getText().setSpan(imageSpan, startPos, endPos,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void togleSoftInput(boolean flag) {
InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (flag) {
manager.showSoftInput(editor, 0);
} else {
manager.hideSoftInputFromWindow(editor.getWindowToken(), 0);
}
}
private void bindView() {
Intent intent = getIntent();
String content = intent.getStringExtra("Content");
if (!StringUtils.isNullOrEmpty(content)) {
editor.setText(content);
editor.setSelection(0);
btnWordCount.setText(String.valueOf(140 - content.length()));
}
type = intent.getStringExtra("Type");
if (type.equalsIgnoreCase("comment")) {
sendType = SEND_COMMENT;
setTitle("评论");
retweetCheckBox.setText("同时转发");
retweetCheckBox.setVisibility(View.VISIBLE);
} else if (type.equalsIgnoreCase("retweet")) {
sendType = SEND_RETWEET;
setTitle("转发");
retweetCheckBox.setText("同时评论");
retweetCheckBox.setVisibility(View.VISIBLE);
} else if (type.equalsIgnoreCase("replyComment")) {
sendType = SEND_REPLY;
setTitle("回复评论");
retweetCheckBox.setText("同时转发");
retweetCheckBox.setVisibility(View.GONE);
} else if (type.equalsIgnoreCase("PostStatus")) {
sendType = SEND_NEW;
setTitle("发微博");
btnPicView.setVisibility(View.VISIBLE);
retweetCheckBox.setVisibility(View.GONE);
return;
}
commentId = intent.getStringExtra("CommentID");
statusId = intent.getStringExtra("StatusID");
if (StringUtils.isNullOrEmpty(statusId)) {
throw new NullPointerException(
"the invoke activity should include extra value 'StatusID'");
}
}
private View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v == btnWordCount) {
if (editor.getText().length() == 0)
return;
AlertDialog.Builder builder = new AlertDialog.Builder(
PostStatusActivity.this);
builder.setMessage("确认清除文字?");
builder.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
editor.setText("");
btnWordCount.setText("140");
dialog.dismiss();
}
});
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.dismiss();
}
});
builder.create().show();
} else if (v == btnEmotionView) {
if (emotionLayout.getVisibility() == View.VISIBLE)
emotionLayout.setVisibility(View.GONE);
else {
togleSoftInput(false);
emotionLayout.setVisibility(View.VISIBLE);
}
} else if (v == btnTopicView) {
int start = editor.getSelectionStart();
int end = editor.getSelectionEnd();
editor.getText().replace(Math.min(start, end),
Math.max(start, end), "##");
editor.setSelection(Math.min(start, end) + 1);
} else if (v == btnAtView) {
Intent intent = new Intent(PostStatusActivity.this,
AtUserActivity.class);
intent.putExtra("Type", "AtUser");
startActivityForResult(intent, TYPE_AT);
} else if (v == btnPicView) {
AlertDialog.Builder builder = new AlertDialog.Builder(
v.getContext());
String[] items = { "本地相册", "立即拍照" };
builder.setItems(items, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
Intent pickIntent = new Intent(Intent.ACTION_PICK);
pickIntent.setType("image/*");
startActivityForResult(pickIntent, TYPE_PICK_PIC);
break;
case 1:
Intent takeIntent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(File.separator + "sdcard"
+ File.separator + "geekr_"
+ System.currentTimeMillis() + ".jpg");
takePicUri = Uri.fromFile(file);
takeIntent.putExtra(MediaStore.EXTRA_OUTPUT,
takePicUri);
startActivityForResult(takeIntent, TYPE_TAKE_PIC);
break;
default:
break;
}
}
});
builder.show();
} else if (v == btnLocView) {
} else if (v == imageView) {
AlertDialog.Builder builder = new AlertDialog.Builder(
v.getContext());
builder.setMessage("是否移除当前图片");
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
imageView.setTag(null);
imageLayout.setVisibility(View.GONE);
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
}
}
};
private void send() {
StatusFetcher fetcher = new StatusFetcher();
String content = editor.getText().toString();
if (sendType == SEND_COMMENT) {
if (retweetCheckBox.isChecked()) {
// 评论同时转发 == 转发同时评论当前微博
fetcher.retweetStatus(statusId, content, true, fetchListener);
} else {
fetcher.commentStatus(statusId, content, false, fetchListener);
}
} else if (sendType == SEND_REPLY) {
fetcher.replyComment(commentId, statusId, content, fetchListener);
} else if (sendType == SEND_RETWEET) {
fetcher.retweetStatus(statusId, content, retweetCheckBox.isChecked(),
fetchListener);
} else if (sendType == SEND_NEW) {
String filePath = (String) imageView.getTag();
fetcher.sendStatus(content, filePath, "0.0", "0.0", fetchListener);
}
progressDialog.setMessage("正在发送...");
progressDialog.show();
}
private FetchCompleteListener fetchListener = new FetchCompleteListener() {
@Override
public void fetchComplete(int state, int errorCode, Object obj) {
if(state == BaseFetcher.FETCH_SUCCEED_NEWS) {
progressDialog.dismiss();
if (sendType == SEND_COMMENT)
ToastHelper.show("发送成功");
else if (sendType == SEND_RETWEET)
ToastHelper.show("转发成功");
finish();
} else {
progressDialog.dismiss();
ToastHelper.show("操作失败");
}
}
};
class ImageAdapter extends BaseAdapter {
private Context mContext;
private String[] thumbArray;
public ImageAdapter(Context context) {
mContext = context;
thumbArray = ImageHelper.emotionsMap.keySet().toArray(new String[] {});
}
@Override
public int getCount() {
return thumbArray.length;
}
@Override
public Object getItem(int position) {
return thumbArray[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(60, 60));
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
String source = ImageHelper.emotionsMap.get(thumbArray[position]);
InputStream input;
try {
input = mContext.getAssets().open(
"smileys" + File.separator + source);
Bitmap bitmap = BitmapFactory.decodeStream(input);
imageView.setImageBitmap(bitmap);
imageView.setTag(thumbArray[position]);
} catch (IOException e) {
e.printStackTrace();
}
return imageView;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case TYPE_AT:
if (resultCode == RESULT_OK) {
String atTag = "@" + data.getStringExtra("Name") + " ";
editor.append(atTag);
}
break;
case TYPE_PICK_PIC:
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
try {
InputStream input = getContentResolver().openInputStream(
uri);
Bitmap bitmap = BitmapFactory.decodeStream(input);
imageView.setImageBitmap(bitmap);
imageLayout.setVisibility(View.VISIBLE);
imageView.setTag(getRealPathFromURI(uri));
} catch (FileNotFoundException e) {
Log.e("error", e.getMessage());
}
}
break;
case TYPE_TAKE_PIC:
if (resultCode == RESULT_OK) {
if (takePicUri != null) {
try {
InputStream stream = getContentResolver()
.openInputStream(takePicUri);
Bitmap bitmap = BitmapFactory.decodeStream(stream);
imageView.setImageBitmap(bitmap);
imageLayout.setVisibility(View.VISIBLE);
imageView.setTag(takePicUri.getPath());
} catch (FileNotFoundException e) {
Log.e("error", e.getMessage());
}
}
}
default:
break;
}
}
private String getRealPathFromURI(Uri uri) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(index);
}
}