package com.tencent.hq.qq.adapter; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.text.SpannableString; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import cn.bmob.im.BmobDownloadManager; import cn.bmob.im.BmobUserManager; import cn.bmob.im.bean.BmobMsg; import cn.bmob.im.config.BmobConfig; import cn.bmob.im.inteface.DownloadListener; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.tencent.hq.qq.R; import com.tencent.hq.qq.adapter.base.BaseListAdapter; import com.tencent.hq.qq.adapter.base.ViewHolder; import com.tencent.hq.qq.ui.ImageBrowserActivity; import com.tencent.hq.qq.ui.LocationActivity; import com.tencent.hq.qq.ui.SetMyInfoActivity; import com.tencent.hq.qq.util.FaceTextUtils; import com.tencent.hq.qq.util.ImageLoadOptions; import com.tencent.hq.qq.util.TimeUtil; /** ���������� * @ClassName: MessageChatAdapter * @Description: TODO * @author smile * @date 2014-5-28 ����5:34:07 */ @SuppressLint("InflateParams") public class MessageChatAdapter extends BaseListAdapter<BmobMsg> { private final int TYPE_RECEIVER_TXT = 0; private final int TYPE_SEND_TXT = 1; private final int TYPE_SEND_IMAGE = 2; private final int TYPE_RECEIVER_IMAGE = 3; private final int TYPE_SEND_LOCATION = 4; private final int TYPE_RECEIVER_LOCATION = 5; private final int TYPE_SEND_VOICE =6; private final int TYPE_RECEIVER_VOICE = 7; String currentObjectId = ""; DisplayImageOptions options; private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener(); public MessageChatAdapter(Context context,List<BmobMsg> msgList) { // TODO Auto-generated constructor stub super(context, msgList); currentObjectId = BmobUserManager.getInstance(context).getCurrentUserObjectId(); options = new DisplayImageOptions.Builder() .showImageForEmptyUri(R.drawable.ic_launcher) .showImageOnFail(R.drawable.ic_launcher) .resetViewBeforeLoading(true) .cacheOnDisc(true) .cacheInMemory(true) .imageScaleType(ImageScaleType.EXACTLY) .bitmapConfig(Bitmap.Config.RGB_565) .considerExifParams(true) .displayer(new FadeInBitmapDisplayer(300)) .build(); } @Override public int getItemViewType(int position) { BmobMsg msg = list.get(position); if(msg.getMsgType()==BmobConfig.TYPE_IMAGE){ return msg.getBelongId().equals(currentObjectId) ? TYPE_SEND_IMAGE: TYPE_RECEIVER_IMAGE; }else if(msg.getMsgType()==BmobConfig.TYPE_LOCATION){ return msg.getBelongId().equals(currentObjectId) ? TYPE_SEND_LOCATION: TYPE_RECEIVER_LOCATION; }else if(msg.getMsgType()==BmobConfig.TYPE_VOICE){ return msg.getBelongId().equals(currentObjectId) ? TYPE_SEND_VOICE: TYPE_RECEIVER_VOICE; }else{ return msg.getBelongId().equals(currentObjectId) ? TYPE_SEND_TXT: TYPE_RECEIVER_TXT; } } @Override public int getViewTypeCount() { return 8; } private View createViewByType(BmobMsg message, int position) { int type = message.getMsgType(); if(type==BmobConfig.TYPE_IMAGE){ return getItemViewType(position) == TYPE_RECEIVER_IMAGE ? mInflater.inflate(R.layout.item_chat_received_image, null) : mInflater.inflate(R.layout.item_chat_sent_image, null); }else if(type==BmobConfig.TYPE_LOCATION){ return getItemViewType(position) == TYPE_RECEIVER_LOCATION ? mInflater.inflate(R.layout.item_chat_received_location, null) : mInflater.inflate(R.layout.item_chat_sent_location, null); }else if(type==BmobConfig.TYPE_VOICE){ return getItemViewType(position) == TYPE_RECEIVER_VOICE ? mInflater.inflate(R.layout.item_chat_received_voice, null) : mInflater.inflate(R.layout.item_chat_sent_voice, null); }else{ return getItemViewType(position) == TYPE_RECEIVER_TXT ? mInflater.inflate(R.layout.item_chat_received_message, null) : mInflater.inflate(R.layout.item_chat_sent_message, null); } } @Override public View bindView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final BmobMsg item = list.get(position); if (convertView == null) { convertView = createViewByType(item, position); } ImageView iv_avatar = ViewHolder.get(convertView, R.id.iv_avatar); final ImageView iv_fail_resend = ViewHolder.get(convertView, R.id.iv_fail_resend); final TextView tv_send_status = ViewHolder.get(convertView, R.id.tv_send_status); TextView tv_time = ViewHolder.get(convertView, R.id.tv_time); TextView tv_message = ViewHolder.get(convertView, R.id.tv_message); ImageView iv_picture = ViewHolder.get(convertView, R.id.iv_picture); final ProgressBar progress_load = ViewHolder.get(convertView, R.id.progress_load); TextView tv_location = ViewHolder.get(convertView, R.id.tv_location); final ImageView iv_voice = ViewHolder.get(convertView, R.id.iv_voice); final TextView tv_voice_length = ViewHolder.get(convertView, R.id.tv_voice_length); String avatar = item.getBelongAvatar(); if(avatar!=null && !avatar.equals("")){ ImageLoader.getInstance().displayImage(avatar, iv_avatar, ImageLoadOptions.getOptions(),animateFirstListener); }else{ iv_avatar.setImageResource(R.drawable.head); } iv_avatar.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent =new Intent(mContext,SetMyInfoActivity.class); if(getItemViewType(position) == TYPE_RECEIVER_TXT ||getItemViewType(position) == TYPE_RECEIVER_IMAGE ||getItemViewType(position)==TYPE_RECEIVER_LOCATION ||getItemViewType(position)==TYPE_RECEIVER_VOICE){ intent.putExtra("from", "other"); intent.putExtra("username", item.getBelongUsername()); }else{ intent.putExtra("from", "me"); } mContext.startActivity(intent); } }); tv_time.setText(TimeUtil.getChatTime(Long.parseLong(item.getMsgTime()))); if(getItemViewType(position)==TYPE_SEND_TXT // ||getItemViewType(position)==TYPE_SEND_IMAGE// ||getItemViewType(position)==TYPE_SEND_LOCATION ||getItemViewType(position)==TYPE_SEND_VOICE){//ֻ if(item.getStatus()==BmobConfig.STATUS_SEND_SUCCESS){// progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); if(item.getMsgType()==BmobConfig.TYPE_VOICE){ tv_send_status.setVisibility(View.GONE); tv_voice_length.setVisibility(View.VISIBLE); }else{ tv_send_status.setVisibility(View.VISIBLE); tv_send_status.setText("已发送"); } }else if(item.getStatus()==BmobConfig.STATUS_SEND_FAIL){ progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.VISIBLE); tv_send_status.setVisibility(View.INVISIBLE); if(item.getMsgType()==BmobConfig.TYPE_VOICE){ tv_voice_length.setVisibility(View.GONE); } }else if(item.getStatus()==BmobConfig.STATUS_SEND_RECEIVERED){ progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); if(item.getMsgType()==BmobConfig.TYPE_VOICE){ tv_send_status.setVisibility(View.GONE); tv_voice_length.setVisibility(View.VISIBLE); }else{ tv_send_status.setVisibility(View.VISIBLE); tv_send_status.setText("已阅读"); } }else if(item.getStatus()==BmobConfig.STATUS_SEND_START){ progress_load.setVisibility(View.VISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); tv_send_status.setVisibility(View.INVISIBLE); if(item.getMsgType()==BmobConfig.TYPE_VOICE){ tv_voice_length.setVisibility(View.GONE); } } } final String text = item.getContent(); switch (item.getMsgType()) { case BmobConfig.TYPE_TEXT: try { SpannableString spannableString = FaceTextUtils .toSpannableString(mContext, text); tv_message.setText(spannableString); } catch (Exception e) { } break; case BmobConfig.TYPE_IMAGE: try { if (text != null && !text.equals("")) { dealWithImage(position, progress_load, iv_fail_resend, tv_send_status, iv_picture, item); } iv_picture.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent =new Intent(mContext,ImageBrowserActivity.class); ArrayList<String> photos = new ArrayList<String>(); photos.add(getImageUrl(item)); intent.putStringArrayListExtra("photos", photos); intent.putExtra("position", 0); mContext.startActivity(intent); } }); } catch (Exception e) { } break; case BmobConfig.TYPE_LOCATION: try { if (text != null && !text.equals("")) { String address = text.split("&")[0]; final String latitude = text.split("&")[1]; final String longtitude = text.split("&")[2]; tv_location.setText(address); tv_location.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(mContext, LocationActivity.class); intent.putExtra("type", "scan"); intent.putExtra("latitude", Double.parseDouble(latitude)); intent.putExtra("longtitude", Double.parseDouble(longtitude)); mContext.startActivity(intent); } }); } } catch (Exception e) { } break; case BmobConfig.TYPE_VOICE: try { if (text != null && !text.equals("")) { tv_voice_length.setVisibility(View.VISIBLE); String content = item.getContent(); if (item.getBelongId().equals(currentObjectId)) { if(item.getStatus()==BmobConfig.STATUS_SEND_RECEIVERED ||item.getStatus()==BmobConfig.STATUS_SEND_SUCCESS){ tv_voice_length.setVisibility(View.VISIBLE); String length = content.split("&")[2]; tv_voice_length.setText(length+"\''"); }else{ tv_voice_length.setVisibility(View.INVISIBLE); } } else { boolean isExists = BmobDownloadManager.checkTargetPathExist(currentObjectId,item); if(!isExists){ String netUrl = content.split("&")[0]; final String length = content.split("&")[1]; BmobDownloadManager downloadTask = new BmobDownloadManager(mContext,item,new DownloadListener() { @Override public void onStart() { progress_load.setVisibility(View.VISIBLE); tv_voice_length.setVisibility(View.GONE); iv_voice.setVisibility(View.INVISIBLE); } @Override public void onSuccess() { // TODO Auto-generated method stub progress_load.setVisibility(View.GONE); tv_voice_length.setVisibility(View.VISIBLE); tv_voice_length.setText(length+"\''"); iv_voice.setVisibility(View.VISIBLE); } @Override public void onError(String error) { // TODO Auto-generated method stub progress_load.setVisibility(View.GONE); tv_voice_length.setVisibility(View.GONE); iv_voice.setVisibility(View.INVISIBLE); } }); downloadTask.execute(netUrl); }else{ String length = content.split("&")[2]; tv_voice_length.setText(length+"\''"); } } } iv_voice.setOnClickListener(new NewRecordPlayClickListener(mContext,item,iv_voice)); } catch (Exception e) { } break; default: break; } return convertView; } /** * @Description: TODO * @param @param item * @param @return * @return String * @throws */ private String getImageUrl(BmobMsg item){ String showUrl = ""; String text = item.getContent(); if(item.getBelongId().equals(currentObjectId)){// if(text.contains("&")){ showUrl = text.split("&")[0]; }else{ showUrl = text; } }else{ showUrl = text; } return showUrl; } /** * @Description: TODO * @param @param position * @param @param progress_load * @param @param iv_fail_resend * @param @param tv_send_status * @param @param iv_picture * @param @param item * @return void * @throws */ private void dealWithImage(int position,final ProgressBar progress_load,ImageView iv_fail_resend,TextView tv_send_status,ImageView iv_picture,BmobMsg item){ String text = item.getContent(); if(getItemViewType(position)==TYPE_SEND_IMAGE){ Log.i("smile", position+",״状态"+item.getStatus()); if(item.getStatus()==BmobConfig.STATUS_SEND_START){ progress_load.setVisibility(View.VISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); tv_send_status.setVisibility(View.INVISIBLE); }else if(item.getStatus()==BmobConfig.STATUS_SEND_SUCCESS){ progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); tv_send_status.setVisibility(View.VISIBLE); tv_send_status.setText("已发送"); }else if(item.getStatus()==BmobConfig.STATUS_SEND_FAIL){ progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.VISIBLE); tv_send_status.setVisibility(View.INVISIBLE); }else if(item.getStatus()==BmobConfig.STATUS_SEND_RECEIVERED){ progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); tv_send_status.setVisibility(View.VISIBLE); tv_send_status.setText("已阅读"); } // String showUrl = ""; if(text.contains("&")){ showUrl = text.split("&")[0]; }else{ showUrl = text; } ImageLoader.getInstance().displayImage(showUrl, iv_picture); }else{ ImageLoader.getInstance().displayImage(text, iv_picture,options,new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { // TODO Auto-generated method stub progress_load.setVisibility(View.VISIBLE); } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { // TODO Auto-generated method stub progress_load.setVisibility(View.INVISIBLE); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { // TODO Auto-generated method stub progress_load.setVisibility(View.INVISIBLE); } @Override public void onLoadingCancelled(String imageUri, View view) { // TODO Auto-generated method stub progress_load.setVisibility(View.INVISIBLE); } }); } } private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener { static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>()); @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage != null) { ImageView imageView = (ImageView) view; boolean firstDisplay = !displayedImages.contains(imageUri); if (firstDisplay) { FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } }