package com.d3.d3xmpp.adapter;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import android.annotation.SuppressLint;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.CountDownTimer;
import android.os.Vibrator;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.d3.d3xmpp.R;
import com.d3.d3xmpp.activites.FriendActivity;
import com.d3.d3xmpp.activites.MapActivity;
import com.d3.d3xmpp.activites.ShowPicActivitiy;
import com.d3.d3xmpp.activites.WebActivity;
import com.d3.d3xmpp.constant.Constants;
import com.d3.d3xmpp.constant.ImgConfig;
import com.d3.d3xmpp.constant.MyApplication;
import com.d3.d3xmpp.d3View.expression.ExpressionUtil;
import com.d3.d3xmpp.d3View.gifView.GifView;
import com.d3.d3xmpp.d3View.gifView.GifView.GifImageType;
import com.d3.d3xmpp.model.ChatItem;
import com.d3.d3xmpp.model.User;
import com.d3.d3xmpp.util.DateUtil;
import com.d3.d3xmpp.util.FileUtil;
import com.d3.d3xmpp.util.ImageUtil;
import com.d3.d3xmpp.util.ImgHandler;
import com.d3.d3xmpp.util.StringUtil;
import com.d3.d3xmpp.util.Tool;
import com.d3.d3xmpp.xmpp.XmppConnection;
public class ChatAdapter extends ArrayAdapter<ChatItem>{
private Context cxt;
private static int[] resTo = { R.drawable.voiceto0, R.drawable.voiceto1,
R.drawable.voiceto2, R.drawable.voiceto3 };
private static int[] resFrom = { R.drawable.voicefrom0, R.drawable.voicefrom1,
R.drawable.voicefrom2, R.drawable.voicefrom3 };
private String username = null;
private Bitmap bitmap;
public static interface MsgType {
int MSG_OUT = 0;
int MSG_IN = 1;
}
public ChatAdapter(Context context,String username) {
super(context, 0);
this.cxt = context;
this.username = username;
}
@Override
public int getItemViewType(int position) {
ChatItem nowMsg = (ChatItem)getItem(position);
if (nowMsg.inOrOut == 1) {
return MsgType.MSG_OUT;
} else {
return MsgType.MSG_IN;
}
}
@Override
public int getViewTypeCount() {
return 2;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ChatItem item = (ChatItem)getItem(position);
final ViewHolder viewHolder;
int msgType = getItemViewType(position);
if (convertView == null) {
if (msgType == MsgType.MSG_OUT) {
convertView = LayoutInflater.from(cxt).inflate(R.layout.row_chat_mine, null);
}
else {
convertView = LayoutInflater.from(cxt).inflate(R.layout.row_chat, null);
}
viewHolder = new ViewHolder();
viewHolder.timeView = (TextView) convertView.findViewById(R.id.timeView);
viewHolder.msgView = (TextView) convertView.findViewById(R.id.msgView);
viewHolder.head = (ImageView) convertView.findViewById(R.id.headImg);
viewHolder.img = (ImageView) convertView.findViewById(R.id.imgView);
viewHolder.gifImg = (ImageView) convertView.findViewById(R.id.gifImgView);
viewHolder.voice = (ImageView) convertView.findViewById(R.id.voiceView);
viewHolder.soundDuration = (TextView)convertView.findViewById(R.id.soundView);
viewHolder.gif = (GifView) convertView.findViewById(R.id.gifView);
viewHolder.nameView = (TextView) convertView.findViewById(R.id.nameView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.timeView.setVisibility(View.VISIBLE);
viewHolder.msgView.setVisibility(View.VISIBLE);
viewHolder.head.setVisibility(View.VISIBLE);
viewHolder.img.setVisibility(View.GONE);
viewHolder.gifImg.setVisibility(View.GONE);
viewHolder.voice.setVisibility(View.GONE);
viewHolder.soundDuration.setVisibility(View.GONE);
viewHolder.gif.setVisibility(View.GONE);
viewHolder.nameView.setVisibility(View.GONE);
}
//head
if (item.inOrOut == 0 ) { //����
if (item.chatType == ChatItem.CHAT) {
if (bitmap == null) {
User user = new User(XmppConnection.getInstance().getUserInfo(username));
bitmap = user.bitmap;
}
if (bitmap == null) {
viewHolder.head.setImageDrawable(ImgHandler.ToCircularBig(R.drawable.default_icon));
}
else {
viewHolder.head.setImageBitmap(bitmap);
}
}
else{
ImgConfig.showHeadImg(item.username, viewHolder.head);
}
viewHolder.head.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(cxt, FriendActivity.class);
intent.putExtra("username", item.username);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
cxt.startActivity(intent);
}
});
} else{
ImgConfig.showHeadImg(Constants.USER_NAME, viewHolder.head);
}
//ͬһ����������ʾ��ͬʱ����
ChatItem lastMsg = null;
if(position!=0)
lastMsg = (ChatItem)getItem(position-1);
if(lastMsg!=null && lastMsg.sendDate.equals(item.sendDate)){
viewHolder.timeView.setVisibility(View.GONE);
}
else{
viewHolder.timeView.setText(DateUtil.getRecentTimeMM_dd(item.sendDate));
}
//text
//����ͼƬ���������ļ�
if(item.msg!=null && item.msg.contains(Constants.PATH)){
String path = item.msg;
File file = new File(path);
if(file.exists() && file.length()!=0){ // isExist
viewHolder.msgView.setVisibility(View.GONE);
int type = FileUtil.getType(path);
if(type == FileUtil.IMG){ //isImg
showImg(viewHolder.img, path);
}else if(type == FileUtil.SOUND){ //isSound
playSound(path,viewHolder.soundDuration,viewHolder.voice,item.inOrOut==1);
}
}
else{
viewHolder.msgView.setText("������...");
}
}
else if (item.msg != null && item.msg.contains("[/g0")) { // isGif
playGif(viewHolder.gif, viewHolder.msgView, viewHolder.gifImg,item.msg, position);
}
else if(item.msg != null && item.msg.contains("[/f0")){ // �������
viewHolder.msgView.setText(ExpressionUtil.getText(cxt,StringUtil.Unicode2GBK(item.msg)));
}
else if(item.msg != null && item.msg.contains("[/a0")){ // �����ͼ
viewHolder.msgView.setVisibility(View.GONE);
showMap(viewHolder.img, item.msg);
}
else{
viewHolder.msgView.setText(item.msg);
}
if (item.chatType == ChatItem.GROUP_CHAT && item.inOrOut == 0) {
viewHolder.nameView.setVisibility(View.VISIBLE);
viewHolder.nameView.setText(item.username);
}
else {
viewHolder.nameView.setVisibility(View.GONE);
}
//���ݸ���
viewHolder.msgView.setOnLongClickListener(new OnLongClickListener() {
@SuppressLint("NewApi")
@Override
public boolean onLongClick(View v) {
TextView msgView = (TextView)v;
ClipboardManager cm =(ClipboardManager) cxt.getSystemService(Context.CLIPBOARD_SERVICE);
//���ı����ݸ��Ƶ�������
cm.setText(msgView.getText());
Vibrator vib = (Vibrator) cxt.getSystemService(Context.VIBRATOR_SERVICE); //������
vib.vibrate(100);
Tool.initToast(cxt,"���Ƴɹ�");
return false;
}
});
return convertView;
}
private void showImg(ImageView img , final String path){
img.setVisibility(View.VISIBLE);
img.setImageBitmap(ImageUtil.createImageThumbnail(path,200*200));
img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("picPath", path);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(cxt, ShowPicActivitiy.class);
cxt.startActivity(intent);
}
});
// //���ݸ���
img.setOnLongClickListener(new OnLongClickListener() {
@SuppressLint("NewApi")
@Override
public boolean onLongClick(View v) {
// FileUtil.changeFile(path, Constants.IMG_PATH+"/"+FileUtil.getFileName(path));
Tool.initToast(cxt,"ͼƬ�ѱ���������"+path);
MyApplication.getInstance().sendBroadcast(
new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.parse("file://"+path)));
return false;
}
});
}
private void showMap(ImageView img,String msg){
img.setVisibility(View.VISIBLE);
img.setImageResource(R.drawable.map);
String[] adrs = msg.split(",");
final double lat = Double.valueOf(adrs[1]);
final double lon = Double.valueOf(adrs[2]);
img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("lat", lat);
intent.putExtra("lon", lon);
intent.setClass(cxt, MapActivity.class);
cxt.startActivity(intent);
}
});
}
/**
* play gif
* @param gif
* @param msg
*/
private void playGif(GifView gif,TextView msgView,ImageView img,String msg,int position){
msgView.setVisibility(View.GONE);
try {
Field field = R.drawable.class.getDeclaredField(msg.substring(2,msg.indexOf("]")));
int resId = Integer.parseInt(field.get(null).toString());
if(getCount()-1 - position < 3 ){ //ֻ��ʾ������̬
gif.setVisibility(View.VISIBLE);
gif.setGifImageType(GifImageType.COVER);
gif.setGifImage(resId);
}else{
img.setVisibility(View.VISIBLE);
img.setBackgroundResource(resId);
}
}catch (NoSuchFieldException e) {
msgView.setVisibility(View.VISIBLE);
msgView.setText(ExpressionUtil.getText(cxt, StringUtil.Unicode2GBK(msg)));
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* play voice
* @param file
* @param soundDuration
* @param voice
* @param isOut
*/
public MediaPlayer mping = new MediaPlayer();
private void playSound(String file,TextView soundDuration,final ImageView voice,final boolean isOut) {
final MediaPlayer mp = new MediaPlayer();
voice.setVisibility(View.VISIBLE);
soundDuration.setVisibility(View.VISIBLE);
try {
mp.setDataSource(file);
mp.prepare();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
soundDuration.setText(""+mp.getDuration()/1000+"\"");
voice.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(mp.isPlaying())
mp.stop();
else{
mp.start();
mping = mp;
new CountDownTimer(mp.getDuration(), 500) {
int i =0;
@Override
public void onTick(long millisUntilFinished) {
if (i <= mp.getDuration()/1000) {
if(isOut)
voice.setImageResource(resTo[i]);
else
voice.setImageResource(resFrom[i]);
i++;
if (i > 3)
i = 0;
}
}
@Override
public void onFinish() {
if(isOut)
voice.setImageResource(resTo[0]);
else
voice.setImageResource(resFrom[0]);
}
}.start();
}
}
});
}
class ViewHolder {
TextView timeView ,msgView ,soundDuration,nameView;
ImageView head , img ,gifImg ,voice;
GifView gif;
}
}