package com.ustc.dystu.dandelion.fragment;
import java.util.ArrayList;
import java.util.Collections;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.ustc.dystu.dandelion.EditNoteTitleActivity;
import com.ustc.dystu.dandelion.NoteInfoActivity;
import com.ustc.dystu.dandelion.R;
import com.ustc.dystu.dandelion.bean.NoteInfo;
import com.ustc.dystu.dandelion.bean.UserInfo;
import com.ustc.dystu.dandelion.constant.Constants;
import com.ustc.dystu.dandelion.net.DandRequestListener;
import com.ustc.dystu.dandelion.net.DandelionAPI;
import com.ustc.dystu.dandelion.utils.CacheUtils;
import com.ustc.dystu.dandelion.utils.Logger;
import com.ustc.dystu.dandelion.utils.SharePrefUtils;
import com.ustc.dystu.dandelion.utils.image.ImageCache;
import com.ustc.dystu.dandelion.utils.image.ImageFetcher;
import com.ustc.dystu.dandelion.utils.image.Utils;
public class MeFragment extends BaseFragment {
public static final String TAG = "MeFragment";
public static final int REQUEST_USER_INFO = 0x1;
private static final int REQUEST_GET_TRAVEL_LIST = 0x2;
private static final int REQUEST_DELETE_NOTE = 0x3;
private ImageView ivAddNote;
private ImageFetcher mImageWorker;
private TextView tvTitle;
NoteAdapter mAdapter;
private ListView lvList;
ArrayList<NoteInfo> mList = new ArrayList<NoteInfo>();
private TextView mEmptyView;
private BroadcastReceiver receiver;
ProgressDialog pbProgress;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case REQUEST_GET_TRAVEL_LIST:
if (pbProgress != null) {
pbProgress.dismiss();
}
if (msg.obj != null) {
ArrayList<NoteInfo> list = (ArrayList<NoteInfo>) msg.obj;
mList.clear();
mList.addAll(list);
if (mList.isEmpty()) {
lvList.setEmptyView(mEmptyView);
}
mAdapter.notifyDataSetChanged();
}
break;
case REQUEST_USER_INFO:
if (msg.obj != null) {
UserInfo info = (UserInfo) msg.obj;
tvTitle.setText(info.screen_name);
}
break;
case REQUEST_DELETE_NOTE:
Toast.makeText(getActivity(), "删除成功!", Toast.LENGTH_SHORT)
.show();
int i = (Integer) msg.obj;
mList.remove(i);
if (mList.isEmpty()) {
lvList.setEmptyView(mEmptyView);
}
mAdapter.notifyDataSetChanged();
break;
case ERROR_RESPONSE:
if (pbProgress != null) {
pbProgress.dismiss();
}
if (msg.obj != null) {
Toast.makeText(getActivity(), (String) msg.obj,
Toast.LENGTH_SHORT).show();
}
if (mList.isEmpty()) {
lvList.setEmptyView(mEmptyView);
}
break;
default:
break;
}
};
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Logger.d(TAG, "onCreateView...");
View view = inflater.inflate(R.layout.fragment_me, null);
ivAddNote = (ImageView) view.findViewById(R.id.iv_make_travel_note);
ivAddNote.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getActivity(),
EditNoteTitleActivity.class));
}
});
tvTitle = (TextView) view.findViewById(R.id.tv_title);
lvList = (ListView) view.findViewById(R.id.lv_travel);
lvList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent();
intent.putExtra("note_info", mList.get(position));
intent.putExtra("isfromMe", true);
intent.setClass(getActivity(), NoteInfoActivity.class);
startActivity(intent);
}
});
lvList.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
showChooseDialog(position);
return true;
}
});
mAdapter = new NoteAdapter(getActivity());
lvList.setAdapter(mAdapter);
mEmptyView = new TextView(getActivity());
mEmptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mEmptyView.setGravity(Gravity.CENTER);
mEmptyView.setTextColor(getResources().getColor(R.color.black));
mEmptyView.setText("轻轻点击,取回你散落微博中的旅程");
mEmptyView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getActivity(),
EditNoteTitleActivity.class));
}
});
((ViewGroup) lvList.getParent()).addView(mEmptyView);
mEmptyView.setVisibility(View.GONE);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Logger.d(TAG, "reciever messge");
NoteInfo info = (NoteInfo) intent
.getSerializableExtra("note_info");
String action = intent.getAction();
if (action.equals(Constants.ACTION_CREATE_NOTE_SUCCESS)) {
if (info != null) {
mList.add(info);
mAdapter.notifyDataSetChanged();
}
} else if (action.equals(Constants.ACTION_EDIT_NOTE_SUCCESS)) {
if (info != null) {
mList.remove(info);
mList.add(info);
mAdapter.notifyDataSetChanged();
}
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Constants.ACTION_CREATE_NOTE_SUCCESS);
intentFilter.addAction(Constants.ACTION_EDIT_NOTE_SUCCESS);
getActivity().registerReceiver(receiver, intentFilter);
pbProgress = new ProgressDialog(getActivity());
pbProgress.setMessage("正在加载, 请稍候...");
pbProgress.setCanceledOnTouchOutside(false);
return view;
}
@Override
protected void afterActivityCreated() {
Logger.d(TAG, "after acitivty created...");
init();
}
private void showChooseDialog(final int position) {
final AlertDialog.Builder builder = new AlertDialog.Builder(
getActivity());
builder.setTitle("选择");
ArrayList<String> menus = new ArrayList<String>();
menus.add("删除");
builder.setItems(menus.toArray(new CharSequence[0]),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DandelionAPI.getInstance(getActivity()).deleteNote(
new DandRequestListener(mHandler) {
@Override
public void onComplete(String arg0) {
Logger.d(TAG, "delete response-->"
+ arg0);
Message msg = Message.obtain();
try {
JSONObject jo = new JSONObject(arg0);
String code = jo
.getString("error_code");
if (Integer.parseInt(code) == 0) {
msg.what = REQUEST_DELETE_NOTE;
msg.obj = position;
} else {
msg.what = ERROR_RESPONSE;
msg.obj = "网络异常";
}
} catch (Exception e) {
e.printStackTrace();
msg.what = ERROR_RESPONSE;
msg.obj = "数据解析异常";
}
mHandler.sendMessage(msg);
}
}, mList.get(position));
}
});
final AlertDialog alert = builder.create();
alert.setCanceledOnTouchOutside(true);
alert.getWindow().setGravity(Gravity.CENTER);
alert.show();
}
@Override
public void onDestroy() {
super.onDestroy();
getActivity().unregisterReceiver(receiver);
}
private void init() {
DandelionAPI.getInstance(getActivity()).getUserInfo(
new DandRequestListener(mHandler) {
@Override
public void onComplete(String response) {
handleUserInfoResult(response, false);
}
@Override
public void onCache(String result) {
handleUserInfoResult(result, true);
}
}, DandelionAPI.getInstance(getActivity()).getUid());
pbProgress.show();
DandelionAPI.getInstance(getActivity()).getTravelNotes(
new DandRequestListener(mHandler) {
@Override
public void onComplete(String arg0) {
Message msg = Message.obtain();
try {
JSONArray array = new JSONArray(arg0);
ArrayList<NoteInfo> data = NoteInfo.create(array);
msg.obj = data;
msg.what = REQUEST_GET_TRAVEL_LIST;
} catch (JSONException e) {
e.printStackTrace();
msg.what = BaseFragment.ERROR_RESPONSE;
msg.obj = "数据解析异常";
}
mHandler.sendMessage(msg);
}
}, SharePrefUtils.getUid(getActivity()));
}
private void handleUserInfoResult(String response, boolean useCache) {
Message msg = Message.obtain();
try {
if (TextUtils.isEmpty(response) || response.contains("error_code")) {
msg.what = ERROR_RESPONSE;
JSONObject obj = new JSONObject(response);
msg.obj = obj.getString("error");
} else {
UserInfo userInfo = UserInfo.create(new JSONObject(response));
msg.obj = userInfo;
msg.what = REQUEST_USER_INFO;
if (!useCache) {
CacheUtils.updateCache(MeFragment.this.getActivity(),
CacheUtils.getKey(
CacheUtils.CACHE_USER_INFO,
new String[] {
"uid",
DandelionAPI.getInstance(
getActivity()).getUid() }),
response);
}
}
mHandler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
msg.what = ERROR_RESPONSE;
msg.obj = "数据解析异常";
mHandler.sendMessage(msg);
}
}
class NoteAdapter extends BaseAdapter {
private LayoutInflater inflater;
private ImageFetcher mImageWorker;
public NoteAdapter(Context context) {
inflater = LayoutInflater.from(context);
int[] wh = Utils.getMidPicWidthAndHeight(context);
mImageWorker = new ImageFetcher(context, wh[0], wh[1]);
mImageWorker.setImageCache(new ImageCache(context,
Constants.THUMNAIL_CACHE_PATH));
mImageWorker.setLoadingImage(R.drawable.share_public_headview_bg);
mImageWorker.setImageFadeIn(false);
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_note, null);
holder = new ViewHolder();
holder.ivFolder = (ImageView) convertView
.findViewById(R.id.iv_icon);
holder.tvInfo = (TextView) convertView
.findViewById(R.id.tv_info);
holder.tvTime = (TextView) convertView
.findViewById(R.id.tv_time);
holder.tvTimeUsed = (TextView) convertView
.findViewById(R.id.tv_time_used);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
NoteInfo info = mList.get(position);
if (!TextUtils.isEmpty(info.note_folder_url)) {
mImageWorker.loadImage(info.note_folder_url, holder.ivFolder,
R.drawable.share_public_headview_bg, true);
} else {
holder.ivFolder
.setImageResource(R.drawable.share_public_headview_bg);
}
holder.tvInfo.setText(info.note_title);
holder.tvTime.setText(info.getFormatNoteFromTime());
holder.tvTimeUsed.setText(info.getTotalDays());
return convertView;
}
@Override
public void notifyDataSetChanged() {
Collections.sort(mList, NoteInfo.comparator);
super.notifyDataSetChanged();
}
}
private static class ViewHolder {
public ImageView ivFolder;
public TextView tvInfo;
public TextView tvTime;
public TextView tvTimeUsed;
}
}