package com.example.slidingmenu.yujing.client.activity.letter;
import java.util.List;
import org.json.JSONException;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.AsyncTask.Status;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.slidingmenu.R;
import com.example.slidingmenu.yujing.client.activity.controller.BaseActivity;
import com.example.slidingmenu.yujing.client.application.ClientApplication;
import com.example.slidingmenu.yujing.client.contentprovider.DataProvider;
import com.example.slidingmenu.yujing.client.database.table.PrivateLetter;
import com.example.slidingmenu.yujing.client.network.Request;
import com.example.slidingmenu.yujing.client.network.mode.RequestParam;
import com.example.slidingmenu.yujing.client.network.mode.ResponseParam;
import com.example.slidingmenu.yujing.client.network.mode.letter.GetAllLetterResponseParam;
import com.example.slidingmenu.yujing.client.service.MsgRefresh;
import com.example.slidingmenu.yujing.client.service.MsgService;
public class LetterActivity extends BaseActivity implements MsgRefresh {
private ClientApplication clientApplication;
private ListView letterList;
private LetterAdapter letterAdapter;
private DeleteLetterTask mDeleteLetterTask;
private GetLetterTask mGetLetterTask;
private SendLetterTask mSendLetterTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.letter_layout);
init();
clientApplication = (ClientApplication) getApplication();
letterList = (ListView) findViewById(R.id.letter_list);
setListAdapter();
if(letterAdapter.getCount() == 0) {
getNewLetterFromNetWork();
}
registerForContextMenu(letterList);
}
public void onRefreshClick(View v) {
getNewLetterFromNetWork();
}
private void setListAdapter() {
Cursor cs = managedQuery(DataProvider.PrivateLetter_CONTENT_URI, null, null, null, PrivateLetter.time + " COLLATE LOCALIZED DESC");
letterList.setAdapter(letterAdapter = new LetterAdapter(this,
R.layout.letter_layout_item, cs, false));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == SEND_LETTER && resultCode == RESULT_OK) {
getNewLetterFromNetWork();
}
super.onActivityResult(requestCode, resultCode, data);
}
private void getNewLetterFromNetWork() {
mGetLetterTask = new GetLetterTask();
mGetLetterTask.execute(getRequestParam());
}
public void onAddLetterClick(View v) {
sendLetter();
}
private RequestParam getRequestParam() {
int count = PrivateLetter.getLetterCount(clientApplication.getDatabaseHelper());
SharedPreferences shared = clientApplication.getLoginUserInfo();
RequestParam sp = new RequestParam();
sp.setUserName(shared.getString(RequestParam.USER_NAME, ""));
sp.setPassword(shared.getString(RequestParam.PASSWORD, ""));
sp.setRandomKey("1234");
sp.setRequestType(count == 0 ? RequestParam.GET_ALL_PRIVATELETTER : RequestParam.GET_NEW_PRIVATELETTER);
sp.setParams(new String[] {""});
return sp;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean retValue = super.onCreateOptionsMenu(menu);
MenuItem item = menu.add(0,1,1,R.string.refresh);
item.setIcon(android.R.drawable.ic_menu_share);
return retValue;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == 1) {
getNewLetterFromNetWork();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(1, 0, 0, R.string.reply);
menu.add(1, 1, 1, R.string.delete);
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo;
menuInfo = ( AdapterView.AdapterContextMenuInfo ) item.getMenuInfo();
switch (item.getItemId()) {
case 0:
replyLetter(menuInfo.position);
break;
case 1:
deleteLetter(menuInfo.position);
break;
default:
break;
}
return super.onContextItemSelected(item);
}
private void deleteLetter(int position) {
SharedPreferences shared = clientApplication.getLoginUserInfo();
RequestParam sp = new RequestParam();
sp.setUserName(shared.getString(RequestParam.USER_NAME, ""));
sp.setPassword(shared.getString(RequestParam.PASSWORD, ""));
sp.setRandomKey("1234");
sp.setRequestType(RequestParam.DEL_LETTER);
sp.setParams(new String[]{letterAdapter.getItem(position).getAsString(PrivateLetter.PrivateLetterID)});
mDeleteLetterTask = new DeleteLetterTask();
mDeleteLetterTask.execute(sp, position);
}
public void replyLetter(int position) {
ContentValues values = letterAdapter.getItem(position);
final ReplyLetterDialog dialog = new ReplyLetterDialog(this);
dialog.setOwnerActivity(this);
dialog.setValues(values);
dialog.setOnReplyLetterListener(new ReplyLetterDialog.OnReplyLetterListener() {
@Override
public void onSendLetterSucc() {
getNewLetterFromNetWork();
}
@Override
public void onSendLetterFail() {
}
});
dialog.show();
}
@Override
protected void onDestroy() {
if(mGetLetterTask != null && mGetLetterTask.getStatus() == Status.RUNNING) {
mGetLetterTask.cancel(true);
mGetLetterTask = null;
}
if(mDeleteLetterTask != null && mDeleteLetterTask.getStatus() == Status.RUNNING) {
mDeleteLetterTask.cancel(true);
mDeleteLetterTask = null;
}
if(mSendLetterTask != null && mSendLetterTask.getStatus() == Status.RUNNING) {
mSendLetterTask.cancel(true);
mSendLetterTask = null;
}
super.onDestroy();
}
public class GetLetterTask extends AsyncTask<RequestParam, Integer, Integer> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(LetterActivity.this, "", getText(R.string.waiting));
super.onPreExecute();
}
@Override
protected Integer doInBackground(RequestParam... params) {
RequestParam requestParam = params[0];
String res = Request.request(requestParam.getJSON());
if ("".equals(res)) {
return ResponseParam.REQUEST_FAIL;
}
try {
ResponseParam response = new GetAllLetterResponseParam(res);
if (response.getResult() != ResponseParam.RESULT_SUCCESS) {
return ResponseParam.REQUEST_FAIL;
}
this.insertToDataBase((ClientApplication) LetterActivity.this.getApplication(),
((GetAllLetterResponseParam) response).getAllLetter());
} catch (JSONException e) {
e.printStackTrace();
}
return ResponseParam.RESULT_SUCCESS;
}
@Override
protected void onPostExecute(Integer result) {
dialog.dismiss();
if(result == ResponseParam.RESULT_SUCCESS) {
letterAdapter.refresh();
} else {
Toast.makeText(LetterActivity.this, getText(R.string.get_letter_fail), Toast.LENGTH_SHORT).show();
}
super.onPostExecute(result);
}
private void insertToDataBase(ClientApplication context, List<ContentValues> letters) {
for(ContentValues values : letters) {
PrivateLetter.insertPrivateLetter(context.getDatabaseHelper(), values);
}
}
}
public class DeleteLetterTask extends AsyncTask<Object, Integer, Integer> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(LetterActivity.this, "", getText(R.string.waiting));
super.onPreExecute();
}
@Override
protected Integer doInBackground(Object... params) {
RequestParam requestParam = (RequestParam) params[0];
int position = (Integer)params[1];
String res = Request.request(requestParam.getJSON());
if ("".equals(res)) {
return ResponseParam.REQUEST_FAIL;
}
try {
ResponseParam response = new ResponseParam(res);
if (response.getResult() != ResponseParam.RESULT_SUCCESS) {
return ResponseParam.REQUEST_FAIL;
}
PrivateLetter.deletePrivateLetter(clientApplication.getDatabaseHelper(),
letterAdapter.
getItem(position).
getAsInteger(PrivateLetter._id));
} catch (JSONException e) {
System.out.println("删除私信异常==="+ e.toString());
e.printStackTrace();
}
return ResponseParam.RESULT_SUCCESS;
}
@Override
protected void onPostExecute(Integer result) {
dialog.dismiss();
if(result == ResponseParam.RESULT_SUCCESS) {
letterAdapter.refresh();
Toast.makeText(LetterActivity.this, getText(R.string.delete_letter_succ), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LetterActivity.this, getText(R.string.delete_letter_fail), Toast.LENGTH_SHORT).show();
}
super.onPostExecute(result);
}
}
@Override
public void init() {
MsgService.acList.add(this);
}
@Override
public void refresh(int what, Object... objects) {
letterAdapter.refresh();
}
}