package com.suan.weclient.fragment; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.suan.weclient.R; import com.suan.weclient.activity.MainActivity; import com.suan.weclient.adapter.MessageListAdapter; import com.suan.weclient.util.GlobalContext; import com.suan.weclient.util.SharedPreferenceManager; import com.suan.weclient.util.data.DataManager; import com.suan.weclient.util.data.DataManager.UserGroupListener; import com.suan.weclient.util.data.holder.UserGoupPushHelper; import com.suan.weclient.util.data.holder.resultHolder.MessageResultHolder; import com.suan.weclient.util.net.WechatManager; import com.suan.weclient.util.net.WechatManager.OnActionFinishListener; import com.suan.weclient.view.ptr.PTRListview; public class MessageFragment extends BaseFragment implements PTRListview.OnRefreshListener, PTRListview.OnLoadListener { View view; private DataManager mDataManager; private PTRListview ptrListview; private MessageListAdapter messageListAdapter; private MessageHandler mHandler; private static final int PAGE_MESSAGE_AMOUNT = 20; /* about adapter list change */ public static final int MESSAGE_NOTIFY_TYPE_ONLY_REFRESH = 2; public static final int MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA = 3; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.message_fragment, null); /* init data */ MainActivity mainActivity = (MainActivity) getActivity(); mDataManager = ((GlobalContext) mainActivity.getApplicationContext()).getDataManager(); mHandler = new MessageHandler(); initWidgets(); initListener(); initData(); return view; } private void initWidgets() { ptrListview = (PTRListview) view.findViewById(R.id.reply_list); } private void initData() { if (mDataManager.getCurrentMessageHolder() != null) { messageListAdapter = new MessageListAdapter(getActivity(), mDataManager); ptrListview.setAdapter(messageListAdapter); ptrListview.setOnScrollListener(messageListAdapter); ptrListview.setonRefreshListener(MessageFragment.this); ptrListview.setOnLoadListener(MessageFragment.this); } } public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } private void initListener() { mDataManager.addUserGroupListener(new UserGroupListener() { @Override public void onGroupChangeEnd() { // TODO Auto-generated method stub if (mDataManager.getUserGroup().size() == 0) { Message message = new Message(); message.arg1 = MESSAGE_NOTIFY_TYPE_ONLY_REFRESH; mHandler.sendMessage(message); } } @Override public void onAddUser() { // TODO Auto-generated method stub } @Override public void deleteUser(int index) { // TODO Auto-generated method stub } }); mDataManager.addMessageChangeListener(new DataManager.MessageGetListener() { @Override public void onMessageGet(MessageResultHolder messageResultHolder) { // TODO Auto-generated method stub Message notifyMessage = new Message(); notifyMessage.arg1 = MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA; notifyMessage.obj = messageResultHolder; mHandler.sendMessage(notifyMessage); } }); mDataManager.setListLoadingListener(new DataManager.ListLoadingListener() { @Override public void onLoadStart() { ptrListview.onRefreshStart(); } @Override public void onLoadFinish() { ptrListview.onRefreshComplete(); } }); } private void refreshPushData() { if (getActivity() != null) { UserGoupPushHelper userGoupPushHelper = new UserGoupPushHelper(SharedPreferenceManager.getPushUserGroup(getActivity())); userGoupPushHelper.updateUserGroup(mDataManager); mDataManager.saveUserGroup(getActivity()); userGoupPushHelper.getUserHolders().get(mDataManager.getCurrentPosition()).setLastNewMessageCount(0); userGoupPushHelper.getUserHolders().get(mDataManager.getCurrentPosition()).setLastMsgId(mDataManager.getCurrentUser().getLastMsgId()); SharedPreferenceManager.putPushUserGroup(getActivity(), userGoupPushHelper.getString()); } } @Override public void onRefresh() { new GetDataTask(ptrListview, PTRListview.PTR_MODE_REFRESH).execute(); } @Override public void onLoad() { new GetDataTask(ptrListview, PTRListview.PTR_MODE_LOAD).execute(); } public class MessageHandler extends Handler { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.arg1) { case MESSAGE_NOTIFY_TYPE_ONLY_REFRESH: break; case MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA: MessageResultHolder messageResultHolder = (MessageResultHolder) msg.obj; mDataManager.getCurrentMessageHolder().mergeMessageResult(messageResultHolder); if (messageResultHolder != null) { mDataManager.getCurrentUser().setLastMsgId(messageResultHolder.getLastMsgId()); switch (messageResultHolder.getResultMode()) { case MessageResultHolder.RESULT_MODE_ADD: ptrListview.onLoadComplete(); break; case MessageResultHolder.RESULT_MODE_REFRESH: messageListAdapter.updateCache(); ptrListview.onRefreshComplete(); ptrListview.setSelection(1); break; } } break; } int size = mDataManager.getCurrentMessageHolder().getMessageCount(); ptrListview.setLoadEnable(size % PAGE_MESSAGE_AMOUNT == 0); ptrListview.requestLayout(); messageListAdapter.notifyDataSetChanged(); refreshPushData(); } } private class GetDataTask extends AsyncTask<Void, Void, Void> { private PTRListview mRefreshedView; private boolean end = false; private int mode; public GetDataTask(PTRListview refreshedView, int mode) { mRefreshedView = refreshedView; this.mode = mode; end = false; if (mDataManager.getCurrentMessageHolder() == null) { end = true; mRefreshedView.onLoadComplete(); return; } try { if (mode == PTRListview.PTR_MODE_LOAD) { int size = mDataManager.getCurrentMessageHolder() .getMessageCount(); // must be fuul amount of page if (size % PAGE_MESSAGE_AMOUNT == 0) { int page = size / PAGE_MESSAGE_AMOUNT + ((size / PAGE_MESSAGE_AMOUNT == 0) ? size % PAGE_MESSAGE_AMOUNT / (PAGE_MESSAGE_AMOUNT / 2) : 0) + 1; mDataManager.getWechatManager().getNextMessageList( page, mDataManager.getCurrentPosition(), new OnActionFinishListener() { @Override public void onFinish(int code, Object object) { // TODO Auto-generated method stub switch (code) { case WechatManager.ACTION_SUCCESS: mDataManager.doMessageGet((MessageResultHolder) object); break; case WechatManager.ACTION_TIME_OUT: break; case WechatManager.ACTION_OTHER: break; case WechatManager.ACTION_SPECIFICED_ERROR: mDataManager.doPopEnsureDialog(true, true, "登录超时", "登录超时", new DataManager.DialogSureClickListener() { @Override public void onClick(View v) { mDataManager.doAutoLogin(); } }); break; } ptrListview.onLoadComplete(); end = true; } }); } else { ptrListview.onLoadComplete(); end = true; } } else if (mode == PTRListview.PTR_MODE_REFRESH) { mDataManager.getWechatManager().getNewMessageList(WechatManager.DIALOG_POP_NO, mDataManager.getCurrentPosition(), new OnActionFinishListener() { @Override public void onFinish(int code, Object object) { // TODO Auto-generated method stub switch (code) { case WechatManager.ACTION_SUCCESS: mDataManager.doMessageGet((MessageResultHolder) object); break; case WechatManager.ACTION_SPECIFICED_ERROR: mDataManager.doPopEnsureDialog(true, true, "登录超时", "登录超时", new DataManager.DialogSureClickListener() { @Override public void onClick(View v) { mDataManager.doAutoLogin(); } }); break; } ptrListview.onRefreshComplete(); end = true; mDataManager .getWechatManager() .getUserProfile( WechatManager.DIALOG_POP_NO, mDataManager .getCurrentPosition(), new OnActionFinishListener() { @Override public void onFinish( int code, Object object) { // TODO // Auto-generated // method stub } }); } }); } } catch (Exception e) { } } @Override protected Void doInBackground(Void... params) { // Simulates a background job. try { while (!end) { Thread.sleep(50); } } catch (Exception exception) { } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); switch (mode) { case PTRListview.PTR_MODE_LOAD: mRefreshedView.onLoadComplete(); break; case PTRListview.PTR_MODE_REFRESH: mRefreshedView.onRefreshComplete(); break; } } } }