package com.sogouchat.ui; import android.R.integer; import android.content.Context; import android.database.DataSetObserver; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment; import android.text.format.Time; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.TextView; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import com.sogouchat.R; import com.sogouchat.SogouChatApp; import com.sogouchat.bean.ContactNode; import com.sogouchat.bean.DownNode; import com.sogouchat.bean.MsgNode; import com.sogouchat.bean.TelNode; import com.sogouchat.os.ChatAppConstant; public class ChatMsgViewAdapter extends BaseAdapter { static class ViewHolder { public TextView mSendTime; public TextView mTextContent; public ImageView mImageContent; } private static final String TAG = ChatMsgViewAdapter.class.getSimpleName(); public static interface IMsgViewType{ int MSG_COME = 0; int MSG_TO = 1; } public static interface IMsgContentType{ int MSG_TEXT = 0; int MSG_IMAGE = 1; int MSG_AUDIO = 2; } public List<ChatMsgEntity> mData = new ArrayList<ChatMsgEntity>(); public ChatListActivity mCtx; private LayoutInflater mInflater; private SogouChatApp mApp; private String mTel; public ChatMsgViewAdapter(ChatListActivity context, SogouChatApp app) { mCtx = context; mInflater = LayoutInflater.from(context); mApp = app; } public void setChatTel(String tel){ mTel = tel; extraList(); notifyDataSetChanged(); } private void extraList() { mData.clear(); mApp.mDownList.clear(); Iterator<TelNode> telIt = mApp.mTelList.iterator(); while (telIt.hasNext()) { TelNode telNode = telIt.next(); // Log.i(TAG, "tel="+telNode.mLastBody+telNode.mName); if (telNode.mTel.equals(mTel)) { if (telNode.mMsgCnt > 0) { Iterator<MsgNode> msgIt = telNode.mMsgList.iterator(); while (msgIt.hasNext()) { MsgNode msgNode = msgIt.next(); ChatMsgEntity msgEn = new ChatMsgEntity(this, msgNode, telNode.mName); mData.add(msgEn); if (msgEn.mLoad == false && msgEn.mType > IMsgContentType.MSG_TEXT) { DownNode downNode = new DownNode(); downNode.mType = msgEn.mType; downNode.mDate = msgEn.mDate; downNode.mShortUrl = msgEn.mShortUrl; mApp.mDownList.add(downNode); } } mApp.syncDownList(); } } } } public void updateNewMsgList(){ Iterator<MsgNode> msgIt = mApp.mMsgList.iterator(); while (msgIt.hasNext()) { MsgNode msgNode = msgIt.next(); ChatMsgEntity msgEn = new ChatMsgEntity(msgNode, mTel); mData.add(msgEn); } } public int getCount() { return mData.size(); } public Object getItem(int position) { return mData.get(position); } public long getItemId(int position) { return position; } /* type ALL = 0; INBOX = 1; SENT = 2; DRAFT = 3; OUTBOX = 4; FAILED = 5; QUEUED = 6; */ public int getItemViewType(int position) { // TODO Auto-generated method stub ChatMsgEntity entity = mData.get(position); return entity.mCome; } public int getViewTypeCount() { // TODO Auto-generated method stub return 2; } public View getView(int position, View convertView, ViewGroup parent) { ChatMsgEntity entity = mData.get(position); // Log.i(TAG, "getView"+entity.mContent+"pos ="+position); ViewHolder viewHolder = null; if (convertView == null) { if (entity.mCome == IMsgViewType.MSG_COME) { convertView = mInflater.inflate( R.layout.item_chat_text_right, null); } else if (entity.mCome == IMsgViewType.MSG_TO){ convertView = mInflater.inflate( R.layout.item_chat_text_left, null); } viewHolder = new ViewHolder(); viewHolder.mSendTime = (TextView) convertView.findViewById(R.id.tv_sendtime); viewHolder.mTextContent = (TextView) convertView.findViewById(R.id.tv_chatcontent); viewHolder.mImageContent = (ImageView) convertView.findViewById(R.id.img_chatcontent); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.mTextContent.setText(entity.mContent); viewHolder.mSendTime.setText(formatTimes(entity.mDate)); if (entity.mType == IMsgContentType.MSG_IMAGE) { viewHolder.mTextContent.setVisibility(View.INVISIBLE); viewHolder.mImageContent.setVisibility(View.VISIBLE); // if (!entity.mLoad) { String filePath = Environment.getExternalStorageDirectory() + ChatAppConstant.SAVE_PATH + entity.mDate+".png"; File file = new File(filePath); if (file.exists()){ // load imge Bitmap bitmap = getLoacalBitmap(file); viewHolder.mImageContent.setImageBitmap(bitmap); entity.mLoad = true; } else{ // Log.i(TAG, "set horse"+entity.mContent); viewHolder.mImageContent.setImageResource(R.drawable.horse1); entity.mLoad = false; } } } else if (entity.mType == IMsgContentType.MSG_AUDIO){ viewHolder.mTextContent.setVisibility(View.INVISIBLE); viewHolder.mImageContent.setVisibility(View.VISIBLE); if (entity.mCome == IMsgViewType.MSG_COME) { // Log.i(TAG, "set audio"+entity.mContent); viewHolder.mImageContent.setImageResource(R.drawable.chathistory_send_voice_spk_04); } else if (entity.mCome == IMsgViewType.MSG_TO){ // Log.i(TAG, "set audio"+entity.mContent); viewHolder.mImageContent.setImageResource(R.drawable.chathistory_receive_voice_spk_04); } if (!entity.mLoad){ String filePath = Environment.getExternalStorageDirectory() + ChatAppConstant.SAVE_PATH + entity.mDate+".mp3"; File file = new File(filePath); if (file.exists()){ entity.mLoad = true; } else{ viewHolder.mImageContent.setImageResource(R.drawable.msg_audio_down); } } } else { viewHolder.mTextContent.setVisibility(View.VISIBLE); viewHolder.mImageContent.setVisibility(View.INVISIBLE); } return convertView; } public static Bitmap getLoacalBitmap(File file) { try { FileInputStream fis = new FileInputStream(file); return BitmapFactory.decodeStream(fis); ///把流转化为Bitmap图片 } catch (FileNotFoundException e) { e.printStackTrace(); return null; } } private String formatTimes(long time) { String dateFormat = ""; if (isSameDay(time)){ dateFormat = "今天 h:mmaa"; } else { dateFormat = "MM/dd h:mmaa"; } SimpleDateFormat format1 = new SimpleDateFormat(dateFormat); Date currentTime = new Date(time); return format1.format(currentTime); } public static boolean isSameDay(long date) { Time time = new Time(); time.setToNow(); int dayNow = Time.getJulianDay(time.normalize(true), 0); int day = Time.getJulianDay(date, 0); return dayNow == day; } }