ChatContentView.java 75 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632
  1. package com.xzjmyk.pm.activity.view;
  2. import android.annotation.SuppressLint;
  3. import android.annotation.TargetApi;
  4. import android.app.Activity;
  5. import android.app.Service;
  6. import android.content.ClipboardManager;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.graphics.Bitmap;
  10. import android.media.MediaPlayer;
  11. import android.media.ThumbnailUtils;
  12. import android.net.Uri;
  13. import android.os.Build;
  14. import android.os.Bundle;
  15. import android.os.Environment;
  16. import android.os.Handler;
  17. import android.os.Vibrator;
  18. import android.provider.MediaStore.Video.Thumbnails;
  19. import android.text.TextUtils;
  20. import android.util.AttributeSet;
  21. import android.util.Log;
  22. import android.view.Gravity;
  23. import android.view.LayoutInflater;
  24. import android.view.MotionEvent;
  25. import android.view.View;
  26. import android.view.ViewGroup;
  27. import android.widget.BaseAdapter;
  28. import android.widget.CheckBox;
  29. import android.widget.CompoundButton;
  30. import android.widget.FrameLayout;
  31. import android.widget.ImageView;
  32. import android.widget.LinearLayout;
  33. import android.widget.ProgressBar;
  34. import android.widget.RelativeLayout;
  35. import android.widget.TextView;
  36. import android.widget.Toast;
  37. import com.android.volley.Response;
  38. import com.android.volley.VolleyError;
  39. import com.ipaulpro.afilechooser.FileOpenWays;
  40. import com.ipaulpro.afilechooser.FileReceiverActivity;
  41. import com.nostra13.universalimageloader.core.ImageLoader;
  42. import com.nostra13.universalimageloader.core.assist.FailReason;
  43. import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
  44. import com.xzjmyk.pm.activity.AppConfig;
  45. import com.xzjmyk.pm.activity.AppConstant;
  46. import com.xzjmyk.pm.activity.MyApplication;
  47. import com.xzjmyk.pm.activity.R;
  48. import com.xzjmyk.pm.activity.audio.VoicePlayer;
  49. import com.xzjmyk.pm.activity.audio.VoicePlayer.OnMediaStateChange;
  50. import com.xzjmyk.pm.activity.bean.Friend;
  51. import com.xzjmyk.pm.activity.bean.User;
  52. import com.xzjmyk.pm.activity.bean.message.ChatMessage;
  53. import com.xzjmyk.pm.activity.bean.message.XmppMessage;
  54. import com.xzjmyk.pm.activity.db.dao.ChatMessageDao;
  55. import com.xzjmyk.pm.activity.db.dao.FriendDao;
  56. import com.xzjmyk.pm.activity.downloader.DownloadListener;
  57. import com.xzjmyk.pm.activity.downloader.Downloader;
  58. import com.xzjmyk.pm.activity.helper.AvatarHelper;
  59. import com.xzjmyk.pm.activity.ui.circle.BaiduMapActivity;
  60. import com.xzjmyk.pm.activity.ui.circle.BasicInfoActivity;
  61. import com.xzjmyk.pm.activity.ui.circle.view.CardInfoActivity;
  62. import com.xzjmyk.pm.activity.ui.message.InstantMessageActivity;
  63. import com.xzjmyk.pm.activity.ui.message.SelectMessageWindow;
  64. import com.xzjmyk.pm.activity.ui.tool.SingleImagePreviewActivity;
  65. import com.xzjmyk.pm.activity.ui.tool.VideoPlayActivity;
  66. import com.xzjmyk.pm.activity.util.Constants;
  67. import com.xzjmyk.pm.activity.util.DisplayUtil;
  68. import com.xzjmyk.pm.activity.util.HtmlUtils;
  69. import com.xzjmyk.pm.activity.util.SmileyParser;
  70. import com.xzjmyk.pm.activity.util.StringUtils;
  71. import com.xzjmyk.pm.activity.util.TimeUtils;
  72. import com.xzjmyk.pm.activity.util.ToastUtil;
  73. import com.xzjmyk.pm.activity.util.downloadTask;
  74. import com.xzjmyk.pm.activity.volley.FastVolley;
  75. import com.xzjmyk.pm.activity.volley.ObjectResult;
  76. import com.xzjmyk.pm.activity.volley.Result;
  77. import com.xzjmyk.pm.activity.volley.StringJsonObjectRequest;
  78. import com.xzjmyk.pm.activity.xmpp.listener.ChatMessageListener;
  79. import java.io.File;
  80. import java.util.ArrayList;
  81. import java.util.HashMap;
  82. import java.util.List;
  83. import java.util.Map;
  84. import pl.droidsonroids.gif.GifImageView;
  85. @SuppressWarnings("unused")
  86. public class ChatContentView extends PullDownListView implements OnMediaStateChange {
  87. private static final String TAG = ChatContentView.class.getSimpleName();
  88. private static final String HASHCODE = "HASHCODE";
  89. private Context mContext;
  90. private ArrayList<Integer> ints;
  91. private ArrayList<Integer> deleInts;
  92. /* 根据mLoginUserId和mToUserId 唯一确定一张表 */
  93. private String mLoginUserId;
  94. private String mToUserId;
  95. private boolean isShowCB = false;
  96. private List<ChatMessage> mChatMessages;
  97. private MessageEventListener mMessageEventListener;
  98. private int mDelayTime = 0;
  99. private LayoutInflater mInflater;
  100. private Handler mHandler = new Handler();
  101. private ChatContentAdapter mChatContentAdapter;
  102. private int mMaxWidth = 100;
  103. private int mMaxHeight = 200;
  104. private long mPlayVoiceId = -1;// 当前正在播放的声音消息的id
  105. private VoiceViewHolder mPlayVoiceViewHolder;// 当前正在播放的VocieViewHolder
  106. private VoicePlayer mVoicePlayer;
  107. // 匹配图标时用到的文件类型
  108. String[] fileTypes = new String[]{"apk", "avi", "bat", "bin", "bmp", "chm", "css", "dat", "dll", "doc", "docx",
  109. "dos", "dvd", "gif", "html", "ifo", "inf", "iso", "java", "jpeg", "jpg", "log", "m4a", "mid", "mov",
  110. "movie", "mp2", "mp2v", "mp3", "mp4", "mpe", "mpeg", "mpg", "pdf", "php", "png", "ppt", "pptx", "psd",
  111. "rar", "tif", "ttf", "txt", "wav", "wma", "wmv", "xls", "xlsx", "xml", "xsl", "zip"};
  112. public ChatContentView(Context context) {
  113. super(context);
  114. init(context);
  115. }
  116. public boolean isShowCB() {
  117. return isShowCB;
  118. }
  119. public void setShowCB(boolean showCB) {
  120. isShowCB = showCB;
  121. }
  122. public ArrayList<Integer> getInts() {
  123. isShowCB = false;
  124. if (deleInts != null && deleInts.size() > 0) {
  125. Log.i("gongpengming", deleInts.toString());
  126. ints.removeAll(deleInts);
  127. }
  128. return ints;
  129. }
  130. public void setInts(ArrayList<Integer> ints) {
  131. this.ints = ints;
  132. }
  133. public ChatContentView(Context context, AttributeSet attrs) {
  134. super(context, attrs);
  135. init(context);
  136. }
  137. public void reset() {
  138. if (mVoicePlayer != null) {
  139. mVoicePlayer.stop();
  140. }
  141. }
  142. private String mLoginNickName;
  143. private String mRoomNickName;
  144. public void setRoomNickName(String roomNickName) {
  145. mRoomNickName = roomNickName;
  146. }
  147. @Override
  148. protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  149. super.onSizeChanged(w, h, oldw, oldh);
  150. if (oldw > h) {
  151. mHandler.removeCallbacks(runnable);
  152. mHandler.postDelayed(runnable, mDelayTime);
  153. }
  154. }
  155. private Runnable runnable = new Runnable() {
  156. @Override
  157. public void run() {
  158. scrollToBottom();
  159. }
  160. };
  161. private void init(Context context) {
  162. mContext = context;
  163. mInflater = LayoutInflater.from(mContext);
  164. mDelayTime = mContext.getResources().getInteger(android.R.integer.config_shortAnimTime);
  165. mVoicePlayer = new VoicePlayer();
  166. mVoicePlayer.setOnMediaStateChangeListener(this);
  167. setCacheColorHint(0x00000000);
  168. mLoginUserId = MyApplication.getInstance().mLoginUser.getUserId();
  169. mLoginNickName = MyApplication.getInstance().mLoginUser.getNickName();
  170. }
  171. @Override
  172. public boolean onTouchEvent(MotionEvent event) {
  173. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  174. if (mMessageEventListener != null) {
  175. mMessageEventListener.onEmptyTouch();
  176. }
  177. }
  178. return super.onTouchEvent(event);
  179. }
  180. @Override
  181. protected void onAttachedToWindow() {
  182. super.onAttachedToWindow();
  183. }
  184. @Override
  185. protected void onDetachedFromWindow() {
  186. super.onDetachedFromWindow();
  187. }
  188. public void setData(List<ChatMessage> chatMessages) {
  189. mChatMessages = chatMessages;
  190. mChatContentAdapter = new ChatContentAdapter();
  191. setAdapter(mChatContentAdapter);
  192. mChatContentAdapter.notifyDataSetInvalidated();
  193. }
  194. /**
  195. * 这个方法必须调用
  196. *
  197. * @param toUserId
  198. */
  199. public void setToUserId(String toUserId) {
  200. mToUserId = toUserId;
  201. }
  202. public void notifyDataSetInvalidated(boolean scrollToBottom) {
  203. if (mChatContentAdapter == null) {
  204. return;
  205. }
  206. mChatContentAdapter.notifyDataSetChanged();
  207. if (scrollToBottom)
  208. scrollToBottom();
  209. }
  210. public void notifyDataSetChanged() {
  211. if (mChatContentAdapter == null) {
  212. return;
  213. }
  214. mChatContentAdapter.notifyDataSetChanged();
  215. scrollToBottom();
  216. }
  217. /*
  218. * private String getLengthDesc(int seconds) { if (seconds < 60) { seconds =
  219. * 1000 * seconds; } int s = seconds / 1000; int m = (seconds % 1000) / 100;
  220. * return (s + "." + m + "''"); }
  221. */
  222. public void setImageMaxWidth(int maxWidth) {
  223. this.mMaxWidth = maxWidth;
  224. }
  225. public void setImageMaxHeight(int maxHeight) {
  226. this.mMaxHeight = maxHeight;
  227. }
  228. public void setMessageEventListener(MessageEventListener listener) {
  229. mMessageEventListener = listener;
  230. }
  231. public void scrollToBottom() {
  232. if (mChatMessages == null) {
  233. return;
  234. }
  235. setSelection(mChatMessages.size());
  236. }
  237. public static interface MessageEventListener {
  238. public void onEmptyTouch();// 点击空白处,让输入框归位
  239. public void onMyAvatarClick();
  240. public void onFriendAvatarClick(String friendUserId);
  241. void onFriendAvatarLongClick(String friendUserId);
  242. public void onMessageClick(ChatMessage chatMessage);
  243. public void onMessageLongClick(ChatMessage chatMessage);
  244. public void onSendAgain(ChatMessage chatMessage);
  245. }
  246. public class ChatContentAdapter extends BaseAdapter {
  247. private static final int VIEW_SYSTEM = 0;
  248. private static final int VIEW_FROM_ME_TEXT = 1;
  249. private static final int VIEW_FROM_ME_IMAGE = 2;
  250. private static final int VIEW_FROM_ME_VOICE = 3;
  251. private static final int VIEW_FROM_ME_LOCATION = 4;
  252. private static final int VIEW_FROM_ME_GIF = 5;
  253. private static final int VIEW_FROM_ME_VIDEO = 6;
  254. private static final int VIEW_FROM_ME_FILE = 13;
  255. private static final int VIEW_FROM_ME_CARD = 15;
  256. private static final int VIEW_TO_ME_TEXT = 7;
  257. private static final int VIEW_TO_ME_IMAGE = 8;
  258. private static final int VIEW_TO_ME_VOICE = 9;
  259. private static final int VIEW_TO_ME_LOCATION = 10;
  260. private static final int VIEW_TO_ME_GIF = 11;
  261. private static final int VIEW_TO_ME_VIDEO = 12;
  262. private static final int VIEW_TO_ME_FILE = 14;
  263. private static final int VIEW_TO_ME_CARD = 16;
  264. public int getCount() {
  265. return mChatMessages.size();
  266. }
  267. public Object getItem(int position) {
  268. return position;
  269. }
  270. public long getItemId(int position) {
  271. return position;
  272. }
  273. @Override
  274. public int getViewTypeCount() {
  275. return 17;
  276. }
  277. @Override
  278. public int getItemViewType(int position) {
  279. int messageType = mChatMessages.get(position).getType();
  280. if (messageType == XmppMessage.TYPE_TIP) {
  281. return VIEW_SYSTEM;// 消息提示
  282. }
  283. if (mChatMessages.get(position).getFromUserId().compareToIgnoreCase(mLoginUserId) == 0) {// 我的消息
  284. switch (messageType) {
  285. case XmppMessage.TYPE_TEXT:
  286. return VIEW_FROM_ME_TEXT;
  287. case XmppMessage.TYPE_IMAGE:
  288. return VIEW_FROM_ME_IMAGE;
  289. case XmppMessage.TYPE_VOICE:
  290. return VIEW_FROM_ME_VOICE;
  291. case XmppMessage.TYPE_LOCATION:
  292. return VIEW_FROM_ME_LOCATION;
  293. case XmppMessage.TYPE_GIF:
  294. return VIEW_FROM_ME_GIF;
  295. case XmppMessage.TYPE_VIDEO:
  296. return VIEW_FROM_ME_VIDEO;
  297. case XmppMessage.TYPE_FILE:
  298. return VIEW_FROM_ME_FILE;
  299. case XmppMessage.TYPE_CARD:
  300. return VIEW_FROM_ME_CARD;
  301. }
  302. } else {
  303. switch (messageType) {
  304. case XmppMessage.TYPE_TEXT:
  305. return VIEW_TO_ME_TEXT;
  306. case XmppMessage.TYPE_IMAGE:
  307. return VIEW_TO_ME_IMAGE;
  308. case XmppMessage.TYPE_VOICE:
  309. return VIEW_TO_ME_VOICE;
  310. case XmppMessage.TYPE_LOCATION:
  311. return VIEW_TO_ME_LOCATION;
  312. case XmppMessage.TYPE_GIF:
  313. return VIEW_TO_ME_GIF;
  314. case XmppMessage.TYPE_VIDEO:
  315. return VIEW_TO_ME_VIDEO;
  316. case XmppMessage.TYPE_FILE:
  317. return VIEW_TO_ME_FILE;
  318. case XmppMessage.TYPE_CARD:
  319. return VIEW_TO_ME_CARD;
  320. }
  321. }
  322. return VIEW_SYSTEM;// 消息提示
  323. }
  324. @SuppressLint("NewApi")
  325. public View getView(final int position, View convertView, ViewGroup parent) {
  326. final int viewType = getItemViewType(position);
  327. SystemViewHolder systemViewHolder = null;
  328. ContentViewHolder contentViewHolder = null;
  329. if (convertView == null || ((Integer) convertView.getTag(R.id.tag_key_list_item_type)) != viewType) {
  330. if (viewType == VIEW_SYSTEM) {
  331. convertView = mInflater.inflate(R.layout.chat_item_system, parent, false);
  332. systemViewHolder = new SystemViewHolder();
  333. systemViewHolder.chat_time_tv = (TextView) convertView.findViewById(R.id.chat_time_tv);
  334. systemViewHolder.chat_content_tv = (TextView) convertView.findViewById(R.id.chat_content_tv);
  335. } else if (viewType == VIEW_FROM_ME_TEXT) {
  336. convertView = mInflater.inflate(R.layout.chat_from_item_text, parent, false);
  337. TextViewHolder holder = new TextViewHolder();
  338. holder.chat_text = (TextView) convertView.findViewById(R.id.chat_from_text);
  339. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
  340. holder.failed_img_view = (ImageView) convertView.findViewById(R.id.failed_img_view);
  341. contentViewHolder = holder;
  342. } else if (viewType == VIEW_FROM_ME_IMAGE) {
  343. convertView = mInflater.inflate(R.layout.chat_from_item_image, parent, false);
  344. ImageViewHolder holder = new ImageViewHolder();
  345. holder.chat_warp_view = (FrameLayout) convertView.findViewById(R.id.chat_from_warp_view);
  346. holder.chat_image = (ImageView) convertView.findViewById(R.id.chat_from_image);
  347. holder.img_progress = (ProgressBar) convertView.findViewById(R.id.img_progress);
  348. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
  349. holder.failed_img_view = (ImageView) convertView.findViewById(R.id.failed_img_view);
  350. contentViewHolder = holder;
  351. } else if (viewType == VIEW_FROM_ME_VOICE) {
  352. convertView = mInflater.inflate(R.layout.chat_from_item_voice, parent, false);
  353. VoiceViewHolder holder = new VoiceViewHolder();
  354. holder.chat_warp_view = (LinearLayout) convertView.findViewById(R.id.chat_from_warp_view);
  355. holder.chat_voice = (LinearLayout) convertView.findViewById(R.id.chat_from_voice);
  356. holder.chat_voice_icon = (ImageView) convertView.findViewById(R.id.chat_from_voice_icon);
  357. holder.chat_voice_anim = (ImageView) convertView.findViewById(R.id.chat_from_voice_anim);
  358. holder.chat_voice_length = (TextView) convertView.findViewById(R.id.chat_from_voice_length);
  359. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
  360. holder.failed_img_view = (ImageView) convertView.findViewById(R.id.failed_img_view);
  361. contentViewHolder = holder;
  362. } else if (viewType == VIEW_FROM_ME_LOCATION) {
  363. convertView = mInflater.inflate(R.layout.chat_from_item_location, parent, false);
  364. LocationViewHolder holder = new LocationViewHolder();
  365. holder.chat_location = (RelativeLayout) convertView.findViewById(R.id.chat_from_location);
  366. holder.chat_address = (TextView) convertView.findViewById(R.id.chat_from_address);
  367. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
  368. holder.failed_img_view = (ImageView) convertView.findViewById(R.id.failed_img_view);
  369. contentViewHolder = holder;
  370. } else if (viewType == VIEW_FROM_ME_GIF) {
  371. convertView = mInflater.inflate(R.layout.chat_from_item_gif, parent, false);
  372. GifViewHolder holder = new GifViewHolder();
  373. holder.chat_gif_view = (GifImageView) convertView.findViewById(R.id.chat_from_gif_view);
  374. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
  375. holder.failed_img_view = (ImageView) convertView.findViewById(R.id.failed_img_view);
  376. contentViewHolder = holder;
  377. } else if (viewType == VIEW_FROM_ME_VIDEO) {
  378. convertView = mInflater.inflate(R.layout.chat_from_item_video, parent, false);
  379. VideoViewHolder holder = new VideoViewHolder();
  380. holder.chat_warp_view = (FrameLayout) convertView.findViewById(R.id.chat_from_warp_view);
  381. holder.chat_thumb = (ImageView) convertView.findViewById(R.id.chat_from_thumb);
  382. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
  383. holder.failed_img_view = (ImageView) convertView.findViewById(R.id.failed_img_view);
  384. contentViewHolder = holder;
  385. } else if (viewType == VIEW_FROM_ME_FILE) {
  386. convertView = mInflater.inflate(R.layout.chat_from_item_file, parent, false);
  387. FileViewHolder holder = new FileViewHolder();
  388. holder.chat_warp_file = (ImageView) convertView.findViewById(R.id.chat_from_file);
  389. holder.chat_file_name = (TextView) convertView.findViewById(R.id.file_name);
  390. holder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.chat_from_warp_view);
  391. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
  392. holder.failed_img_view = (ImageView) convertView.findViewById(R.id.failed_img_view);
  393. contentViewHolder = holder;
  394. } else if (viewType == VIEW_FROM_ME_CARD) {
  395. convertView = mInflater.inflate(R.layout.chat_from_item_card, parent, false);
  396. CardViewHolder holder = new CardViewHolder();
  397. holder.chat_warp_head = (ImageView) convertView.findViewById(R.id.chat_from_head);
  398. holder.chat_person_name = (TextView) convertView.findViewById(R.id.person_name);
  399. holder.chat_person_sex = (TextView) convertView.findViewById(R.id.person_sex);
  400. holder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.chat_from_warp_view);
  401. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
  402. holder.failed_img_view = (ImageView) convertView.findViewById(R.id.failed_img_view);
  403. contentViewHolder = holder;
  404. } else if (viewType == VIEW_TO_ME_TEXT) {
  405. convertView = mInflater.inflate(R.layout.chat_to_item_text, parent, false);
  406. TextViewHolder holder = new TextViewHolder();
  407. holder.chat_text = (TextView) convertView.findViewById(R.id.chat_to_text);
  408. contentViewHolder = holder;
  409. } else if (viewType == VIEW_TO_ME_IMAGE) {
  410. convertView = mInflater.inflate(R.layout.chat_to_item_image, parent, false);
  411. ImageViewHolder holder = new ImageViewHolder();
  412. holder.chat_warp_view = (FrameLayout) convertView.findViewById(R.id.chat_to_warp_view);
  413. holder.chat_image = (ImageView) convertView.findViewById(R.id.chat_to_image);
  414. holder.img_progress = (ProgressBar) convertView.findViewById(R.id.img_progress);
  415. contentViewHolder = holder;
  416. } else if (viewType == VIEW_TO_ME_VOICE) {
  417. convertView = mInflater.inflate(R.layout.chat_to_item_voice, parent, false);
  418. VoiceViewHolder holder = new VoiceViewHolder();
  419. holder.chat_warp_view = (LinearLayout) convertView.findViewById(R.id.chat_to_warp_view);
  420. holder.chat_voice = (LinearLayout) convertView.findViewById(R.id.chat_to_voice);
  421. holder.chat_voice_icon = (ImageView) convertView.findViewById(R.id.chat_to_voice_icon);
  422. holder.chat_voice_anim = (ImageView) convertView.findViewById(R.id.chat_to_voice_anim);
  423. holder.chat_voice_length = (TextView) convertView.findViewById(R.id.chat_to_voice_length);
  424. holder.voice_progress = (ProgressBar) convertView.findViewById(R.id.voice_progress);
  425. holder.unread_img_view = (ImageView) convertView.findViewById(R.id.unread_img_view);
  426. contentViewHolder = holder;
  427. } else if (viewType == VIEW_TO_ME_LOCATION) {
  428. convertView = mInflater.inflate(R.layout.chat_to_item_location, parent, false);
  429. LocationViewHolder holder = new LocationViewHolder();
  430. holder.chat_location = (RelativeLayout) convertView.findViewById(R.id.chat_to_location);
  431. holder.chat_address = (TextView) convertView.findViewById(R.id.chat_to_address);
  432. contentViewHolder = holder;
  433. } else if (viewType == VIEW_TO_ME_GIF) {
  434. convertView = mInflater.inflate(R.layout.chat_to_item_gif, parent, false);
  435. GifViewHolder holder = new GifViewHolder();
  436. holder.chat_gif_view = (GifImageView) convertView.findViewById(R.id.chat_to_gif_view);
  437. contentViewHolder = holder;
  438. } else if (viewType == VIEW_TO_ME_VIDEO) {
  439. convertView = mInflater.inflate(R.layout.chat_to_item_video, parent, false);
  440. VideoViewHolder holder = new VideoViewHolder();
  441. holder.chat_warp_view = (FrameLayout) convertView.findViewById(R.id.chat_to_warp_view);
  442. holder.chat_thumb = (ImageView) convertView.findViewById(R.id.chat_to_thumb);
  443. holder.video_progress = (ProgressBar) convertView.findViewById(R.id.video_progress);
  444. holder.unread_img_view = (ImageView) convertView.findViewById(R.id.unread_img_view);
  445. contentViewHolder = holder;
  446. } else if (viewType == VIEW_TO_ME_FILE) {
  447. convertView = mInflater.inflate(R.layout.chat_to_item_file, parent, false);
  448. FileViewHolder holder = new FileViewHolder();
  449. holder.chat_warp_file = (ImageView) convertView.findViewById(R.id.chat_to_file);
  450. holder.chat_file_name = (TextView) convertView.findViewById(R.id.file_name);
  451. holder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.chat_to_warp_view);
  452. holder.file_progress = (ProgressBar) convertView.findViewById(R.id.file_progress);
  453. holder.unread_img_view = (ImageView) convertView.findViewById(R.id.unread_img_view);
  454. contentViewHolder = holder;
  455. } else if (viewType == VIEW_TO_ME_CARD) {
  456. convertView = mInflater.inflate(R.layout.chat_to_item_card, parent, false);
  457. CardViewHolder holder = new CardViewHolder();
  458. holder.chat_warp_head = (ImageView) convertView.findViewById(R.id.chat_to_head);
  459. holder.chat_person_name = (TextView) convertView.findViewById(R.id.person_name);
  460. holder.chat_person_sex = (TextView) convertView.findViewById(R.id.person_sex);
  461. holder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.chat_to_warp_view);
  462. holder.card_progress = (ProgressBar) convertView.findViewById(R.id.card_progress);
  463. holder.unread_img_view = (ImageView) convertView.findViewById(R.id.unread_img_view);
  464. contentViewHolder = holder;
  465. }
  466. convertView.setTag(R.id.tag_key_list_item_type, viewType);
  467. if (systemViewHolder != null) {
  468. convertView.setTag(R.id.tag_key_list_item_view, systemViewHolder);
  469. } else if (contentViewHolder != null) {
  470. contentViewHolder.cb_choose = (CheckBox) convertView.findViewById(R.id.cb_remove);
  471. contentViewHolder.time_tv = (TextView) convertView.findViewById(R.id.time_tv);
  472. contentViewHolder.chat_head_iv = (ImageView) convertView.findViewById(R.id.chat_head_iv);
  473. contentViewHolder.nick_name = (TextView) convertView.findViewById(R.id.nick_name);
  474. convertView.setTag(R.id.tag_key_list_item_view, contentViewHolder);
  475. }
  476. } else {
  477. if (viewType == VIEW_SYSTEM) {
  478. systemViewHolder = (SystemViewHolder) convertView.getTag(R.id.tag_key_list_item_view);
  479. } else {
  480. contentViewHolder = (ContentViewHolder) convertView.getTag(R.id.tag_key_list_item_view);
  481. }
  482. }
  483. /* 设置数据 */
  484. final ChatMessage message = mChatMessages.get(position);
  485. if (viewType == VIEW_SYSTEM) {
  486. systemViewHolder.chat_time_tv.setText(TimeUtils.sk_time_s_long_2_str(message.getTimeSend()));
  487. systemViewHolder.chat_content_tv.setText(message.getContent());
  488. return convertView;
  489. }
  490. if (isShowCB) { //点击更多时候
  491. contentViewHolder.cb_choose.setVisibility(VISIBLE);
  492. contentViewHolder.cb_choose.setChecked(false);
  493. contentViewHolder.cb_choose.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  494. @Override
  495. public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
  496. if (b) {
  497. ints.add(position);
  498. } else {
  499. deleInts.add(position);
  500. }
  501. }
  502. });
  503. } else {
  504. contentViewHolder.cb_choose.setVisibility(GONE);
  505. }
  506. /* 是否显示日期 */
  507. boolean showTime = true;
  508. if (position >= 1) {
  509. ChatMessage prevMessage = mChatMessages.get(position - 1);
  510. int prevTime = prevMessage.getTimeSend();
  511. int nowTime = message.getTimeSend();
  512. if (nowTime - prevTime < 15 * 60) {// 小于15分钟,不显示
  513. showTime = false;
  514. }
  515. }
  516. if (showTime) {
  517. contentViewHolder.time_tv.setVisibility(VISIBLE);
  518. contentViewHolder.time_tv.setText(TimeUtils.sk_time_long_to_chat_time_str(message.getTimeSend()));
  519. } else {
  520. contentViewHolder.time_tv.setVisibility(GONE);
  521. }
  522. /* 处理From和To不一样的地方 */
  523. if (viewType >= VIEW_FROM_ME_TEXT && viewType <= VIEW_FROM_ME_VIDEO || viewType == VIEW_FROM_ME_FILE
  524. || viewType == VIEW_FROM_ME_CARD) {// MSG_FROM_ME
  525. if (mLoginUserId.equals(Friend.ID_SYSTEM_MESSAGE)) {// 我就是系统账号,那么显示系统头像
  526. contentViewHolder.chat_head_iv.setImageResource(R.drawable.im_notice);
  527. } else {// 其他
  528. AvatarHelper.getInstance().displayAvatar(mLoginUserId, contentViewHolder.chat_head_iv, true);
  529. }
  530. if (viewType == VIEW_FROM_ME_CARD) {
  531. CardViewHolder imageViewHolder = (CardViewHolder) contentViewHolder;
  532. AvatarHelper.getInstance().displayAvatar(message.getCardId(), imageViewHolder.chat_warp_head, true);
  533. }
  534. contentViewHolder.chat_head_iv.setOnClickListener(new OnClickListener() {
  535. @Override
  536. public void onClick(View v) {
  537. mMessageEventListener.onMyAvatarClick();
  538. }
  539. });
  540. // 如果消息是从我发出的,就会有个发送的状态
  541. switch (message.getMessageState()) {
  542. case ChatMessageListener.MESSAGE_SEND_ING:
  543. // Log.d("roamer","contentview..MESSAGE_SEND_ING");
  544. contentViewHolder.progress.setVisibility(VISIBLE);
  545. contentViewHolder.failed_img_view.setVisibility(GONE);
  546. break;
  547. case ChatMessageListener.MESSAGE_SEND_SUCCESS:
  548. // Log.d("roamer","contentview..MESSAGE_SEND_SUCCESS");
  549. contentViewHolder.progress.setVisibility(GONE);
  550. contentViewHolder.failed_img_view.setVisibility(GONE);
  551. break;
  552. case ChatMessageListener.MESSAGE_SEND_FAILED:
  553. // Log.d("roamer","contentview..MESSAGE_SEND_ING");
  554. contentViewHolder.progress.setVisibility(GONE);
  555. contentViewHolder.failed_img_view.setVisibility(VISIBLE);
  556. break;
  557. }
  558. contentViewHolder.failed_img_view.setOnClickListener(new OnClickListener() {
  559. @Override
  560. public void onClick(View v) {
  561. if (message.getMessageState() == ChatMessageListener.MESSAGE_SEND_FAILED)
  562. mMessageEventListener.onSendAgain(message);
  563. }
  564. });
  565. } else {
  566. final String fromUserId = message.getFromUserId();
  567. final String fromUserName = message.getFromUserName();
  568. if (fromUserId.equals(Friend.ID_SYSTEM_MESSAGE)) {// 好友是系统账号,那么显示系统头像
  569. contentViewHolder.chat_head_iv.setImageResource(R.drawable.im_notice);
  570. } else {// 其他
  571. AvatarHelper.getInstance().displayAvatar(fromUserId, contentViewHolder.chat_head_iv, true);
  572. }
  573. contentViewHolder.chat_head_iv.setOnClickListener(new OnClickListener() {
  574. @Override
  575. public void onClick(View v) {
  576. mMessageEventListener.onFriendAvatarClick(fromUserId);
  577. }
  578. });
  579. contentViewHolder.chat_head_iv.setOnLongClickListener(new OnLongClickListener() {
  580. @Override
  581. public boolean onLongClick(View view) {
  582. mMessageEventListener.onFriendAvatarLongClick(fromUserName);
  583. return true;
  584. }
  585. });
  586. }
  587. // 显示昵称
  588. if (message.getFromUserId().equals(mLoginUserId)) { //当消息的发送人是本儿时候不显示名字
  589. contentViewHolder.nick_name.setVisibility(GONE);
  590. contentViewHolder.nick_name.setText(mLoginNickName);
  591. } else { //非本人
  592. Friend friend = FriendDao.getInstance().getFriend(mLoginUserId, message.getFromUserId());
  593. if (TextUtils.isEmpty(mRoomNickName)) {
  594. contentViewHolder.nick_name.setVisibility(GONE);
  595. contentViewHolder.nick_name.setText(mLoginNickName);
  596. } else {
  597. contentViewHolder.nick_name.setVisibility(VISIBLE);
  598. // if (message.getType() == 8) {
  599. //
  600. // getUserByUserId(message.getFromUserId(), contentViewHolder);
  601. // } else {
  602. contentViewHolder.nick_name.setText(friend == null ? message.getFromUserName() :
  603. (friend.getRemarkName() != null ? friend.getRemarkName() :
  604. friend.getNickName()));
  605. // }
  606. }
  607. }
  608. View longView = null;
  609. /* 处理具体显示的消息内容 */
  610. switch (message.getType()) {
  611. case XmppMessage.TYPE_TEXT: {
  612. String s = StringUtils.replaceSpecialChar(message.getContent());
  613. CharSequence charSequence = HtmlUtils.transform200SpanString(s.replaceAll("\n", "\r\n"), true);
  614. ((TextViewHolder) contentViewHolder).chat_text.setText(charSequence);
  615. // ((TextViewHolder)
  616. // contentViewHolder).chat_text.setOnLongClickListener(this);
  617. longView = ((TextViewHolder) contentViewHolder).chat_text;
  618. }
  619. break;
  620. case XmppMessage.TYPE_IMAGE: {
  621. boolean imageFromDisk = false;
  622. File file = null;
  623. if (message.isMySend()) {
  624. String filePath = message.getFilePath();
  625. if (!TextUtils.isEmpty(filePath)) {
  626. file = new File(filePath);
  627. if (file.exists()) {
  628. imageFromDisk = true;
  629. }
  630. }
  631. }
  632. // DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.picture_isloading).build(); //加载图片时的图片
  633. // .showImageForEmptyUri(R.drawable.ic_empty) //没有图片资源时的默认图片
  634. // .showImageOnFail(R.drawable.ic_error) //加载失败时的图片
  635. if (imageFromDisk) {
  636. // Log.d("wang","imageFromDisk...");
  637. // ImageLoader.getInstance().displayImage(Uri.fromFile(file).toString(),
  638. // ((ImageViewHolder) contentViewHolder).chat_image, options,new ImageLoadingFromPathListener(
  639. // message.getContent(), ((ImageViewHolder) contentViewHolder).img_progress));
  640. ImageLoader.getInstance().displayImage(Uri.fromFile(file).toString(),
  641. ((ImageViewHolder) contentViewHolder).chat_image, new ImageLoadingFromPathListener(
  642. message.getContent(), ((ImageViewHolder) contentViewHolder).img_progress));
  643. } else if (message.getContent() != null) {
  644. // Log.d("wang","message.getContent()...");
  645. // ImageLoader.getInstance().displayImage(message.getContent(),
  646. // ((ImageViewHolder) contentViewHolder).chat_image,options,
  647. // new ImageLoadingFromUrlListener(((ImageViewHolder) contentViewHolder).img_progress));
  648. ImageLoader.getInstance().displayImage(message.getContent(),
  649. ((ImageViewHolder) contentViewHolder).chat_image,
  650. new ImageLoadingFromUrlListener(((ImageViewHolder) contentViewHolder).img_progress));
  651. }
  652. longView = ((ImageViewHolder) contentViewHolder).chat_warp_view;
  653. }
  654. break;
  655. case XmppMessage.TYPE_VOICE: {
  656. VoiceViewHolder voiceHolder = (VoiceViewHolder) contentViewHolder;
  657. LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) voiceHolder.chat_voice.getLayoutParams();
  658. params.width = DisplayUtil.getVoiceViewWidth(mContext, message.getTimeLen());
  659. voiceHolder.chat_voice.requestLayout();
  660. voiceHolder.chat_voice_length.setText(message.getTimeLen() + "s");
  661. if (mPlayVoiceId == -1 || mPlayVoiceId != message.get_id()) {
  662. voiceHolder.chat_voice_anim.setVisibility(GONE);
  663. voiceHolder.chat_voice_icon.setVisibility(VISIBLE);
  664. } else {
  665. voiceHolder.chat_voice_anim.setVisibility(VISIBLE);
  666. voiceHolder.chat_voice_icon.setVisibility(GONE);
  667. mPlayVoiceViewHolder = voiceHolder;
  668. }
  669. if (!message.isMySend()) {
  670. voiceHolder.voice_progress.setVisibility(GONE);
  671. if (!message.isRead()) {
  672. voiceHolder.unread_img_view.setVisibility(VISIBLE);
  673. } else {
  674. voiceHolder.unread_img_view.setVisibility(GONE);
  675. }
  676. }
  677. // 是否要去下载
  678. boolean voicefromDisk = false;
  679. File voicefile = null;
  680. String filePath = message.getFilePath();
  681. if (!TextUtils.isEmpty(filePath)) {
  682. voicefile = new File(filePath);
  683. if (voicefile.exists()) {
  684. voicefromDisk = true;
  685. }
  686. }
  687. if (!voicefromDisk) {
  688. Downloader.getInstance().addDownload(message.getContent(), voiceHolder.progress,
  689. new VoiceDownloadListener(message));
  690. }
  691. longView = voiceHolder.chat_warp_view;
  692. }
  693. break;
  694. case XmppMessage.TYPE_LOCATION: {
  695. Log.d("roamer", "....TYPE_LOCATION....");
  696. LocationViewHolder locationViewHolder = (LocationViewHolder) contentViewHolder;
  697. if (!TextUtils.isEmpty(message.getContent())) {
  698. locationViewHolder.chat_location.setVisibility(VISIBLE);
  699. locationViewHolder.chat_address.setText(message.getContent());
  700. locationViewHolder.chat_location.setOnClickListener(new OnClickListener() {
  701. @Override
  702. public void onClick(View v) {
  703. // TODO Auto-generated method stub
  704. Intent intent = new Intent(mContext, BaiduMapActivity.class);
  705. intent.putExtra("latitude", Double.valueOf(message.getLocation_x()));
  706. intent.putExtra("longitude", Double.valueOf(message.getLocation_y()));
  707. intent.putExtra("userName", message.getFromUserName());
  708. mContext.startActivity(intent);
  709. }
  710. });
  711. } else {
  712. String address = MyApplication.getInstance().getBdLocationHelper().getAddress();
  713. locationViewHolder.chat_location.setVisibility(VISIBLE);
  714. locationViewHolder.chat_address.setText(address);
  715. locationViewHolder.chat_location.setOnClickListener(new OnClickListener() {
  716. @Override
  717. public void onClick(View v) {
  718. // TODO Auto-generated method stub
  719. Intent intent = new Intent(mContext, BaiduMapActivity.class);
  720. intent.putExtra("latitude", Double.valueOf(message.getLocation_x()));
  721. intent.putExtra("longitude", Double.valueOf(message.getLocation_y()));
  722. intent.putExtra("userName", message.getFromUserName());
  723. mContext.startActivity(intent);
  724. }
  725. });
  726. }
  727. longView = locationViewHolder.chat_location;
  728. }
  729. break;
  730. case XmppMessage.TYPE_GIF: {
  731. Log.d("roamer", "....TYPE_GIF....");
  732. GifViewHolder gifViewHolder = (GifViewHolder) contentViewHolder;
  733. String gifName = message.getContent();
  734. int resId = SmileyParser.Gifs.textMapId(gifName);
  735. if (resId != -1) {
  736. int margin = DisplayUtil.dip2px(mContext, 20);
  737. RelativeLayout.LayoutParams paramsL = (RelativeLayout.LayoutParams) gifViewHolder.chat_gif_view
  738. .getLayoutParams();
  739. paramsL.setMargins(margin, 0, margin, 0);
  740. gifViewHolder.chat_gif_view.setImageResource(resId);
  741. } else {
  742. gifViewHolder.chat_gif_view.setImageBitmap(null);
  743. }
  744. longView = gifViewHolder.chat_gif_view;
  745. }
  746. break;
  747. case XmppMessage.TYPE_VIDEO: {
  748. VideoViewHolder videoViewHolder = (VideoViewHolder) contentViewHolder;
  749. if (!message.isMySend()) {
  750. videoViewHolder.video_progress.setVisibility(GONE);
  751. if (!message.isRead()) {
  752. videoViewHolder.unread_img_view.setVisibility(VISIBLE);
  753. } else {
  754. videoViewHolder.unread_img_view.setVisibility(GONE);
  755. }
  756. }
  757. // 是否要去下载
  758. boolean downLoad = true;
  759. File file = null;
  760. String filePath = message.getFilePath();
  761. if (!TextUtils.isEmpty(filePath)) {
  762. file = new File(filePath);
  763. if (file.exists()) {
  764. downLoad = false;
  765. }
  766. }
  767. videoViewHolder.chat_thumb.setImageResource(R.drawable.defaultpic);
  768. if (downLoad) {// 去下载
  769. videoViewHolder.chat_thumb.setTag(message.get_id());// 设置Tag,防止在下载完成设置图片的时候,Item被其他视图回收使用了,覆盖其他的视图了
  770. Downloader.getInstance().addDownload(message.getContent(), videoViewHolder.video_progress,
  771. new VideoDownloadListener(message, videoViewHolder.chat_thumb));
  772. } else {// 不需要加载,直接拿本地的
  773. Bitmap bitmap = ImageLoader.getInstance().getMemoryCache().get(filePath);
  774. if (bitmap == null || bitmap.isRecycled()) {
  775. bitmap = ThumbnailUtils.createVideoThumbnail(filePath, Thumbnails.MINI_KIND);
  776. if (filePath == null || bitmap == null){
  777. }else{
  778. ImageLoader.getInstance().getMemoryCache().put(filePath, bitmap);
  779. }
  780. }
  781. if (bitmap != null && !bitmap.isRecycled()) {
  782. videoViewHolder.chat_thumb.setImageBitmap(bitmap);
  783. } else {
  784. videoViewHolder.chat_thumb.setImageBitmap(null);
  785. }
  786. }
  787. longView = videoViewHolder.chat_warp_view;
  788. }
  789. break;
  790. case XmppMessage.TYPE_CARD:
  791. //TODO 标记
  792. CardViewHolder cardViewHolder = (CardViewHolder) contentViewHolder;
  793. if (!TextUtils.isEmpty(message.getContent())) {
  794. cardViewHolder.chat_head_iv.setVisibility(VISIBLE);
  795. cardViewHolder.chat_person_name.setText("昵称:" + message.getContent());
  796. AvatarHelper.getInstance().displayAvatar(message.getObjectId(), cardViewHolder.chat_warp_head, true);
  797. if (!message.isMySend()) {
  798. cardViewHolder.card_progress.setVisibility(GONE);
  799. if (!message.isRead()) {
  800. cardViewHolder.unread_img_view.setVisibility(VISIBLE);
  801. } else {
  802. cardViewHolder.unread_img_view.setVisibility(GONE);
  803. }
  804. }
  805. } else {
  806. }
  807. longView = cardViewHolder.relativeLayout;
  808. break;
  809. case XmppMessage.TYPE_FILE:
  810. FileViewHolder fileViewHolder = (FileViewHolder) contentViewHolder;
  811. if (!message.isMySend()) {
  812. fileViewHolder.file_progress.setVisibility(GONE);
  813. if (!message.isRead()) {
  814. fileViewHolder.unread_img_view.setVisibility(VISIBLE);
  815. } else {
  816. fileViewHolder.unread_img_view.setVisibility(GONE);
  817. }
  818. }
  819. // 是否要去下载
  820. /*boolean downLoad = true;
  821. File file = null;
  822. String filePath = message.getFilePath();
  823. if (!TextUtils.isEmpty(filePath)) {
  824. file = new File(filePath);
  825. if (file.exists()) {
  826. downLoad = false;
  827. }
  828. } else {
  829. filePath = Environment.getExternalStorageDirectory().getAbsoluteFile() + "/shiku";
  830. }*/
  831. String filePath = message.getFilePath();
  832. String name = null;
  833. boolean downLoad = true;
  834. if (filePath != null) {
  835. int pointIndex = filePath.lastIndexOf(".");
  836. if (pointIndex != -1) {
  837. String type = filePath.substring(pointIndex + 1).toLowerCase();
  838. for (int i = 0; i < fileTypes.length; i++) {
  839. if (type.equals(fileTypes[i])) {
  840. try {
  841. int resId = getResources().getIdentifier(type, "drawable", mContext.getPackageName());
  842. fileViewHolder.chat_warp_file.setImageResource(resId);
  843. } catch (Exception e) {
  844. e.printStackTrace();
  845. }
  846. }
  847. }
  848. }
  849. int start = filePath.lastIndexOf("/");
  850. name = filePath.substring(start + 1).toLowerCase();
  851. Log.d("roamer", "filename::" + name);
  852. }
  853. File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/sk/" + name);
  854. if (file.exists()) {
  855. downLoad = false;
  856. }
  857. fileViewHolder.chat_file_name.setText(name);
  858. if (downLoad) {// 去下载
  859. DownloadFileToSD(message.getContent(), name);
  860. /*Downloader.getInstance().addDownload(message.getContent(), fileViewHolder.file_progress,
  861. new FileDownloadListener(message));*/
  862. }
  863. longView = fileViewHolder.relativeLayout;
  864. break;
  865. }
  866. if (longView != null) {// 设置长按弹出复制,转发窗口
  867. setLongClickInterface(message, longView, position);
  868. }
  869. /* 处理点击时间的监听 */
  870. if (viewType == VIEW_FROM_ME_VOICE || viewType == VIEW_TO_ME_VOICE) {
  871. final VoiceViewHolder voiceHolder = (VoiceViewHolder) contentViewHolder;
  872. voiceHolder.chat_warp_view.setOnClickListener(null);
  873. voiceHolder.chat_warp_view.setOnClickListener(new OnClickListener() {
  874. @Override
  875. public void onClick(View v) {
  876. boolean isDownload = false;
  877. String filePath = message.getFilePath();
  878. if (!TextUtils.isEmpty(filePath)) {
  879. File voicefile = new File(filePath);
  880. if (voicefile.exists()) {
  881. isDownload = true;
  882. }
  883. }
  884. if (isDownload) {
  885. if (!message.isMySend() && !message.isRead()) {
  886. message.setRead(true);
  887. ChatMessageDao.getInstance().updateMessageReadState(mLoginUserId, mToUserId,
  888. message.get_id(), true);
  889. if (voiceHolder.unread_img_view != null) {
  890. voiceHolder.unread_img_view.setVisibility(GONE);
  891. }
  892. }
  893. play(voiceHolder, message);
  894. }
  895. }
  896. });
  897. } else if (viewType == VIEW_FROM_ME_IMAGE || viewType == VIEW_TO_ME_IMAGE) {
  898. ImageViewHolder imageViewHolder = (ImageViewHolder) contentViewHolder;
  899. imageViewHolder.chat_warp_view.setOnClickListener(new OnClickListener() {
  900. @Override
  901. public void onClick(View v) {
  902. Intent intent = new Intent(mContext, SingleImagePreviewActivity.class);
  903. intent.putExtra(AppConstant.EXTRA_IMAGE_URI, message.getContent());
  904. mContext.startActivity(intent);
  905. ((Activity) mContext).overridePendingTransition(0, 0);
  906. }
  907. });
  908. } else if (viewType == VIEW_FROM_ME_VIDEO || viewType == VIEW_TO_ME_VIDEO) {
  909. final VideoViewHolder videoViewHolder = (VideoViewHolder) contentViewHolder;
  910. videoViewHolder.chat_warp_view.setOnClickListener(new OnClickListener() {
  911. @Override
  912. public void onClick(View v) {
  913. if (!message.isMySend() && !message.isRead()) {
  914. message.setRead(true);
  915. ChatMessageDao.getInstance().updateMessageReadState(mLoginUserId, mToUserId,
  916. message.get_id(), true);
  917. if (videoViewHolder.unread_img_view != null) {
  918. videoViewHolder.unread_img_view.setVisibility(GONE);
  919. }
  920. }
  921. Intent intent = new Intent(mContext, VideoPlayActivity.class);
  922. // 是否要去下载
  923. boolean downLoad = true;
  924. File file = null;
  925. String filePath = message.getFilePath();
  926. if (!TextUtils.isEmpty(filePath)) {
  927. file = new File(filePath);
  928. if (file.exists()) {
  929. downLoad = false;
  930. }
  931. }
  932. if (downLoad) {
  933. intent.putExtra(AppConstant.EXTRA_FILE_PATH, message.getContent());
  934. } else {
  935. intent.putExtra(AppConstant.EXTRA_FILE_PATH, filePath);
  936. }
  937. mContext.startActivity(intent);
  938. }
  939. });
  940. } else if (viewType == VIEW_FROM_ME_FILE || viewType == VIEW_TO_ME_FILE) {
  941. final FileViewHolder fileViewHolder = (FileViewHolder) contentViewHolder;
  942. fileViewHolder.relativeLayout.setOnClickListener(new OnClickListener() {
  943. @Override
  944. public void onClick(View v) {
  945. // Toast.makeText(mContext, "文件保存在:" + message.getFilePath(), 0).show();
  946. if (!message.isMySend() && !message.isRead()) {
  947. message.setRead(true);
  948. ChatMessageDao.getInstance().updateMessageReadState(mLoginUserId, mToUserId,
  949. message.get_id(), true);
  950. if (fileViewHolder.unread_img_view != null) {
  951. fileViewHolder.unread_img_view.setVisibility(GONE);
  952. }
  953. }
  954. if (!message.isMySend()) {//是接收到的文件才会去打开
  955. Intent intent = new Intent(mContext, FileReceiverActivity.class);
  956. Bundle bundle = new Bundle();
  957. bundle.putParcelable(Constants.INSTANT_MESSAGE, message);
  958. intent.putExtras(bundle);
  959. mContext.startActivity(intent);
  960. } else {//是自己的文件就会去选择打开方式
  961. FileOpenWays open = new FileOpenWays(mContext);
  962. open.openFiles(message.getFilePath());
  963. }
  964. }
  965. });
  966. } else if (viewType == VIEW_TO_ME_LOCATION && viewType == VIEW_FROM_ME_LOCATION) {// 此处没有用
  967. // ,上面已经设置了点击事件
  968. LocationViewHolder locationViewHolder = (LocationViewHolder) contentViewHolder;
  969. locationViewHolder.chat_location.setOnClickListener(new OnClickListener() {
  970. @Override
  971. public void onClick(View v) {
  972. // TODO Auto-generated method stub
  973. Intent intent = new Intent(mContext, BaiduMapActivity.class);
  974. intent.putExtra("latitude", message.getLocation_x());
  975. intent.putExtra("longitude", message.getLocation_y());
  976. intent.putExtra("userName", message.getFromUserName());
  977. mContext.startActivity(intent);
  978. }
  979. });
  980. } else if (viewType == VIEW_TO_ME_CARD || viewType == VIEW_FROM_ME_CARD) {
  981. final CardViewHolder cardViewHolder = (CardViewHolder) contentViewHolder;
  982. cardViewHolder.relativeLayout.setOnClickListener(new OnClickListener() {
  983. @Override
  984. public void onClick(View v) {
  985. String userId = message.getObjectId();
  986. if (!message.isMySend() && !message.isRead()) {
  987. message.setRead(true);
  988. ChatMessageDao.getInstance().updateMessageReadState(mLoginUserId, mToUserId,
  989. message.get_id(), true);
  990. if (cardViewHolder.unread_img_view != null) {
  991. cardViewHolder.unread_img_view.setVisibility(GONE);
  992. }
  993. }
  994. // if (viewType == VIEW_TO_ME_CARD) { //发给我的时候
  995. // //缺少cardid;只能根据名称来获取信息
  996. // Friend friend = FriendDao.getInstance().getFriendByKey("nickName", message.getFromUserName());
  997. // if (friend != null) {
  998. // userId = friend.getUserId();
  999. // } else {
  1000. // DBManager dbManager = new DBManager(mContext);
  1001. // String master = CommonUtil.getSharedPreferences(mContext, "erp_master");
  1002. // List<EmployeesEntity> employeeList = dbManager.select_getEmployee(new String[]{message.getFromUserName(), master}, "em_name=? and whichsys=?");
  1003. // if (!ListUtils.isEmpty(employeeList)) {
  1004. // userId = String.valueOf(employeeList.get(0).getEm_IMID());
  1005. // } else {
  1006. //// ViewUtil.ToastMessage(MyApplication.getInstance(), "企业架构数据没有初始化!");
  1007. // }
  1008. // }
  1009. // } else {
  1010. // userId = message.getCardId();
  1011. // }
  1012. if (userId == null) {
  1013. Intent intent = new Intent(mContext, CardInfoActivity.class);
  1014. intent.putExtra(AppConstant.EXTRA_NICK_NAME, message.getContent());
  1015. mContext.startActivity(intent);
  1016. } else {
  1017. Intent intent = new Intent(mContext, BasicInfoActivity.class);
  1018. intent.putExtra(AppConstant.EXTRA_USER_ID, userId);
  1019. mContext.startActivity(intent);
  1020. }
  1021. }
  1022. });
  1023. }
  1024. // contentViewHolder.chat_warp_view.setOnLongClickListener(new
  1025. // OnLongClickListener() {
  1026. //
  1027. // @Override
  1028. // public boolean onLongClick(View v) {
  1029. // Log.d("roamer",
  1030. // "contentViewHolder.chat_warp_view OnLongClickListener");
  1031. // return false;
  1032. // }
  1033. // });
  1034. // contentViewHolder.gif_bg.setOnLongClickListener(new
  1035. // OnLongClickListener() {
  1036. //
  1037. // @Override
  1038. // public boolean onLongClick(View v) {
  1039. // Log.d("roamer",
  1040. // "contentViewHolder.gif_bg OnLongClickListener");
  1041. // return false;
  1042. // }
  1043. // });
  1044. // contentViewHolder.chat_head_iv.setOnClickListener(new
  1045. // OnClickListener() {
  1046. // @Override
  1047. // public void onClick(View v) {
  1048. // // TODO
  1049. // // mMessageEventListener.onAvatarClick(friendEntity)
  1050. // }
  1051. // });
  1052. return convertView;
  1053. }
  1054. private AppConfig mConfig = MyApplication.getInstance().getConfig();
  1055. private FastVolley mFastVolley = MyApplication.getInstance().getFastVolley();
  1056. private void getUserByUserId(String fromUserId, final ContentViewHolder contentViewHolder) {
  1057. Map<String, String> params = new HashMap<String, String>();
  1058. params.put("access_token", MyApplication.getInstance().mAccessToken);
  1059. params.put("userId", fromUserId);
  1060. StringJsonObjectRequest<User> request = new StringJsonObjectRequest<User>(mConfig.USER_GET_URL,
  1061. new Response.ErrorListener() {
  1062. @Override
  1063. public void onErrorResponse(VolleyError arg0) {
  1064. ToastUtil.showErrorNet(mContext);
  1065. }
  1066. }, new StringJsonObjectRequest.Listener<User>() {
  1067. @Override
  1068. public void onResponse(ObjectResult<User> result) {
  1069. boolean success = Result.defaultParser(mContext, result, true);
  1070. if (success && result.getData() != null) {
  1071. User mUser = result.getData();
  1072. contentViewHolder.nick_name.setText(mUser.getNickName());
  1073. } else {
  1074. contentViewHolder.nick_name.setText("");
  1075. }
  1076. }
  1077. }, User.class, params);
  1078. mFastVolley.addDefaultRequest(HASHCODE, request);
  1079. }
  1080. private void setLongClickInterface(final ChatMessage message, View view, final int position) {
  1081. view.setOnLongClickListener(new OnLongClickListener() {
  1082. @Override
  1083. public boolean onLongClick(View v) {
  1084. Vibrator vib = (Vibrator) mContext.getSystemService(Service.VIBRATOR_SERVICE);
  1085. vib.vibrate(40);// 只震动一秒,一次
  1086. // Toast.makeText(mContext, "长按了", 0).show();
  1087. // Log.d("wang", "长按了文本内容");
  1088. // 实例化SelectMessageWindow
  1089. menuWindow = new SelectMessageWindow(mContext, new ClickListener(message, position),
  1090. message.getType());
  1091. // 显示窗口
  1092. menuWindow.showAtLocation(v, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
  1093. return false;
  1094. }
  1095. });
  1096. }
  1097. }
  1098. /**
  1099. * 下载文件到sd卡
  1100. *
  1101. * @param url
  1102. * @param name
  1103. */
  1104. public void DownloadFileToSD(String url, String name) {
  1105. // 获取SD卡目录
  1106. String dowloadDir = Environment.getExternalStorageDirectory()
  1107. + "/sk/";
  1108. File file = new File(dowloadDir);
  1109. //创建下载目录
  1110. if (!file.exists()) {
  1111. file.mkdirs();
  1112. }
  1113. //读取下载线程数,如果为空,则单线程下载
  1114. int downloadTN = 2;
  1115. /*//如果下载文件名为空则获取Url尾为文件名
  1116. int fileNameStart = url.lastIndexOf("/");
  1117. String fileName = url.substring(fileNameStart);*/
  1118. //启动文件下载线程
  1119. new downloadTask(url, Integer
  1120. .valueOf(downloadTN), dowloadDir + name).start();
  1121. }
  1122. public class ClickListener implements OnClickListener {
  1123. private ChatMessage message;
  1124. private int position;
  1125. public ClickListener(ChatMessage message, int position) {
  1126. this.message = message;
  1127. this.position = position;
  1128. }
  1129. @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  1130. @Override
  1131. public void onClick(View v) {
  1132. menuWindow.dismiss();
  1133. switch (v.getId()) {
  1134. case R.id.btn_copy:// copy文字
  1135. String s = StringUtils.replaceSpecialChar(message.getContent());
  1136. CharSequence charSequence = HtmlUtils.transform200SpanString(s.replaceAll("\n", "\r\n"), true);
  1137. // 获得剪切板管理者,复制文本内容
  1138. ClipboardManager cmb = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
  1139. cmb.setText(charSequence);
  1140. break;
  1141. case R.id.btn_instant:// 转发消息
  1142. Intent intent = new Intent(mContext, InstantMessageActivity.class);
  1143. Bundle bundle = new Bundle();
  1144. bundle.putParcelable(Constants.INSTANT_MESSAGE, message);
  1145. intent.putExtras(bundle);
  1146. mContext.startActivity(intent);
  1147. ((Activity) mContext).finish();
  1148. break;
  1149. case R.id.btn_delete:// 删除
  1150. Toast.makeText(mContext, "已成功删除", Toast.LENGTH_SHORT).show();
  1151. /* if(mChatMessages!=null){
  1152. mChatMessages.remove(position);
  1153. }*/
  1154. Intent broadcast = new Intent(Constants.CHAT_MESSAGE_DELETE_ACTION);//发送广播去界面更新
  1155. broadcast.putExtra(Constants.CHAT_REMOVE_MESSAGE_FALG, 1);
  1156. broadcast.putExtra(Constants.CHAT_REMOVE_MESSAGE_POSITION, position);
  1157. mContext.sendBroadcast(broadcast);
  1158. break;
  1159. case R.id.btn_cancle:// 取消
  1160. break;
  1161. case R.id.btn_more:// 更多
  1162. //TODO 点击更多时候显示选择按钮
  1163. if (ints == null) {
  1164. ints = new ArrayList<>();
  1165. }
  1166. if (deleInts == null) {
  1167. deleInts = new ArrayList<>();
  1168. }
  1169. deleInts.clear();
  1170. ints.clear();
  1171. if (mChatContentAdapter != null) {
  1172. isShowCB = true;
  1173. mChatContentAdapter.notifyDataSetChanged();
  1174. }
  1175. Intent broadcast1 = new Intent(Constants.CHAT_MESSAGE_DELETE_ACTION);//发送广播去界面更新
  1176. broadcast1.putExtra(Constants.CHAT_REMOVE_MESSAGE_FALG, 2);
  1177. mContext.sendBroadcast(broadcast1);
  1178. Log.i("gongpengming", "点击更多");
  1179. break;
  1180. default:
  1181. break;
  1182. }
  1183. }
  1184. }
  1185. SelectMessageWindow menuWindow;
  1186. class ImageLoadingFromUrlListener implements ImageLoadingListener {
  1187. private ProgressBar progressBar;
  1188. public ImageLoadingFromUrlListener(ProgressBar progressBar) {
  1189. this.progressBar = progressBar;
  1190. }
  1191. @Override
  1192. public void onLoadingCancelled(String arg0, View arg1) {
  1193. }
  1194. @Override
  1195. public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {
  1196. if (arg1 != null && arg2 != null && !arg2.isRecycled()) {
  1197. ((ImageView) arg1).setImageBitmap(arg2);
  1198. }
  1199. if (progressBar != null) {
  1200. progressBar.setVisibility(GONE);
  1201. }
  1202. }
  1203. @Override
  1204. public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
  1205. if (progressBar != null) {
  1206. progressBar.setVisibility(GONE);
  1207. }
  1208. if (arg1 != null) {
  1209. ((ImageView) arg1).setImageResource(R.drawable.image_download_fail_icon);
  1210. }
  1211. }
  1212. @Override
  1213. public void onLoadingStarted(String arg0, View arg1) {
  1214. if (progressBar != null) {
  1215. progressBar.setVisibility(VISIBLE);
  1216. }
  1217. }
  1218. }
  1219. class ImageLoadingFromPathListener implements ImageLoadingListener {
  1220. private String url;
  1221. private ProgressBar progressBar;
  1222. public ImageLoadingFromPathListener(String url, ProgressBar progressBar) {
  1223. this.url = url;
  1224. this.progressBar = progressBar;
  1225. }
  1226. @Override
  1227. public void onLoadingCancelled(String arg0, View arg1) {
  1228. }
  1229. @Override
  1230. public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {
  1231. if (arg1 != null && arg2 != null && !arg2.isRecycled()) {
  1232. ((ImageView) arg1).setImageBitmap(arg2);
  1233. }
  1234. }
  1235. @Override
  1236. public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
  1237. if (arg1 != null && !TextUtils.isEmpty(url)) {
  1238. ImageLoader.getInstance().displayImage(url, (ImageView) arg1,
  1239. new ImageLoadingFromUrlListener(progressBar));
  1240. }
  1241. }
  1242. @Override
  1243. public void onLoadingStarted(String arg0, View arg1) {
  1244. }
  1245. }
  1246. private class VoiceDownloadListener implements DownloadListener {
  1247. private ChatMessage message;
  1248. public VoiceDownloadListener(ChatMessage message) {
  1249. this.message = message;
  1250. }
  1251. @Override
  1252. public void onStarted(String uri, View view) {
  1253. if (view != null) {
  1254. view.setVisibility(VISIBLE);
  1255. }
  1256. }
  1257. @Override
  1258. public void onFailed(String uri, com.xzjmyk.pm.activity.downloader.FailReason failReason, View view) {
  1259. if (view != null) {
  1260. view.setVisibility(GONE);
  1261. }
  1262. }
  1263. @Override
  1264. public void onComplete(String uri, String filePath, View view) {
  1265. if (view != null) {
  1266. view.setVisibility(GONE);
  1267. }
  1268. message.setFilePath(filePath);
  1269. ChatMessageDao.getInstance().updateMessageDownloadState(mLoginUserId, mToUserId, message.get_id(), true,
  1270. filePath);
  1271. }
  1272. @Override
  1273. public void onCancelled(String uri, View view) {
  1274. }
  1275. }
  1276. private class FileDownloadListener implements DownloadListener {
  1277. private ChatMessage message;
  1278. public FileDownloadListener(ChatMessage message) {
  1279. this.message = message;
  1280. }
  1281. @Override
  1282. public void onStarted(String uri, View view) {
  1283. if (view != null) {
  1284. view.setVisibility(VISIBLE);
  1285. }
  1286. }
  1287. @Override
  1288. public void onFailed(String uri, com.xzjmyk.pm.activity.downloader.FailReason failReason, View view) {
  1289. if (view != null) {
  1290. view.setVisibility(GONE);
  1291. }
  1292. }
  1293. @Override
  1294. public void onComplete(String uri, String filePath, View view) {
  1295. if (view != null) {
  1296. view.setVisibility(GONE);
  1297. }
  1298. message.setFilePath(filePath);
  1299. ChatMessageDao.getInstance().updateMessageDownloadState(mLoginUserId, mToUserId, message.get_id(), true,
  1300. filePath);
  1301. }
  1302. @Override
  1303. public void onCancelled(String uri, View view) {
  1304. }
  1305. }
  1306. private class VideoDownloadListener implements DownloadListener {
  1307. private ChatMessage message;
  1308. private ImageView imageView;
  1309. public VideoDownloadListener(ChatMessage message, ImageView imageView) {
  1310. this.message = message;
  1311. this.imageView = imageView;
  1312. }
  1313. @Override
  1314. public void onStarted(String uri, View view) {
  1315. if (view != null) {
  1316. view.setVisibility(VISIBLE);
  1317. }
  1318. }
  1319. @Override
  1320. public void onFailed(String uri, com.xzjmyk.pm.activity.downloader.FailReason failReason, View view) {
  1321. if (view != null) {
  1322. view.setVisibility(GONE);
  1323. }
  1324. }
  1325. @SuppressLint("NewApi")
  1326. @Override
  1327. public void onComplete(String uri, String filePath, View view) {
  1328. if (view != null) {
  1329. view.setVisibility(GONE);
  1330. }
  1331. message.setFilePath(filePath);
  1332. ChatMessageDao.getInstance().updateMessageDownloadState(mLoginUserId, mToUserId, message.get_id(), true,
  1333. filePath);
  1334. if (imageView != null && ((Integer) imageView.getTag()) == message.get_id()) {
  1335. Bitmap bitmap = ImageLoader.getInstance().getMemoryCache().get(filePath);
  1336. if (bitmap == null || bitmap.isRecycled()) {
  1337. bitmap = ThumbnailUtils.createVideoThumbnail(filePath, Thumbnails.MINI_KIND);
  1338. ImageLoader.getInstance().getMemoryCache().put(filePath, bitmap);
  1339. }
  1340. if (bitmap != null && !bitmap.isRecycled()) {
  1341. imageView.setImageBitmap(bitmap);
  1342. } else {
  1343. imageView.setImageBitmap(null);
  1344. }
  1345. }
  1346. }
  1347. @Override
  1348. public void onCancelled(String uri, View view) {
  1349. }
  1350. }
  1351. /***************
  1352. * ViewHolder
  1353. *****************************/
  1354. class SystemViewHolder {
  1355. TextView chat_time_tv;
  1356. TextView chat_content_tv;
  1357. }
  1358. abstract class ContentViewHolder {
  1359. TextView time_tv;
  1360. ImageView chat_head_iv;
  1361. CheckBox cb_choose;
  1362. ProgressBar progress;// 只有From的item有
  1363. ImageView failed_img_view;// 只有From的item有
  1364. TextView nick_name;
  1365. }
  1366. class TextViewHolder extends ContentViewHolder {
  1367. TextView chat_text;
  1368. }
  1369. class ImageViewHolder extends ContentViewHolder {
  1370. FrameLayout chat_warp_view;
  1371. ImageView chat_image;
  1372. ProgressBar img_progress;
  1373. }
  1374. class VoiceViewHolder extends ContentViewHolder {
  1375. LinearLayout chat_warp_view;
  1376. LinearLayout chat_voice;
  1377. ImageView chat_voice_icon;
  1378. ImageView chat_voice_anim;
  1379. TextView chat_voice_length;
  1380. ProgressBar voice_progress;// 只有To_me才有
  1381. ImageView unread_img_view;// 只有To_me才有
  1382. }
  1383. class LocationViewHolder extends ContentViewHolder {
  1384. RelativeLayout chat_location;
  1385. TextView chat_address;
  1386. }
  1387. class GifViewHolder extends ContentViewHolder {
  1388. GifImageView chat_gif_view;
  1389. }
  1390. class VideoViewHolder extends ContentViewHolder {
  1391. FrameLayout chat_warp_view;
  1392. ImageView chat_thumb;
  1393. ProgressBar video_progress;// 只有To_me才有
  1394. ImageView unread_img_view;// 只有To_me才有
  1395. }
  1396. class FileViewHolder extends ContentViewHolder {
  1397. RelativeLayout relativeLayout;
  1398. ImageView chat_warp_file;
  1399. TextView chat_file_name;
  1400. ProgressBar file_progress;// 只有To_me才有
  1401. ImageView unread_img_view;// 只有To_me才有
  1402. }
  1403. class CardViewHolder extends ContentViewHolder {
  1404. RelativeLayout relativeLayout;
  1405. ImageView chat_warp_head;
  1406. TextView chat_person_name;
  1407. TextView chat_person_sex;
  1408. ProgressBar card_progress;// 只有To_me才有
  1409. ImageView unread_img_view;// 只有To_me才有
  1410. }
  1411. public void stopPlayVoice() {
  1412. if (mVoicePlayer != null) {
  1413. mVoicePlayer.stop();
  1414. }
  1415. }
  1416. /********************** 播放声音 ***********************************/
  1417. /**
  1418. * @param viewHolder
  1419. */
  1420. private void play(VoiceViewHolder viewHolder, ChatMessage message) {
  1421. if (mPlayVoiceId == -1) {// 没有在播放
  1422. String voicePath = message.getFilePath();
  1423. try {
  1424. mVoicePlayer.play(voicePath);
  1425. } catch (Exception e) {
  1426. e.printStackTrace();
  1427. }
  1428. mPlayVoiceId = message.get_id();
  1429. viewHolder.chat_voice_anim.setVisibility(VISIBLE);
  1430. viewHolder.chat_voice_icon.setVisibility(GONE);
  1431. mPlayVoiceViewHolder = viewHolder;
  1432. } else {
  1433. if (mPlayVoiceId == message.get_id()) {
  1434. mVoicePlayer.stop();
  1435. mPlayVoiceId = -1;
  1436. viewHolder.chat_voice_anim.setVisibility(GONE);
  1437. viewHolder.chat_voice_icon.setVisibility(VISIBLE);
  1438. mPlayVoiceViewHolder = null;
  1439. } else {// 正在播放别的, 在播放这个
  1440. mVoicePlayer.keepStop();
  1441. mPlayVoiceId = -1;
  1442. if (mPlayVoiceViewHolder != null) {
  1443. mPlayVoiceViewHolder.chat_voice_anim.setVisibility(GONE);
  1444. mPlayVoiceViewHolder.chat_voice_icon.setVisibility(VISIBLE);
  1445. }
  1446. String voicePath = message.getFilePath();
  1447. try {
  1448. mVoicePlayer.play(voicePath);
  1449. } catch (Exception e) {
  1450. e.printStackTrace();
  1451. }
  1452. mPlayVoiceId = message.get_id();
  1453. viewHolder.chat_voice_anim.setVisibility(VISIBLE);
  1454. viewHolder.chat_voice_icon.setVisibility(GONE);
  1455. mPlayVoiceViewHolder = viewHolder;
  1456. }
  1457. }
  1458. }
  1459. @Override
  1460. public void onFinishPlay(MediaPlayer player) {
  1461. mPlayVoiceId = -1;
  1462. if (mPlayVoiceViewHolder != null) {
  1463. mPlayVoiceViewHolder.chat_voice_anim.setVisibility(GONE);
  1464. mPlayVoiceViewHolder.chat_voice_icon.setVisibility(VISIBLE);
  1465. }
  1466. mPlayVoiceViewHolder = null;
  1467. }
  1468. @Override
  1469. public void onErrorPlay() {
  1470. mPlayVoiceId = -1;
  1471. if (mPlayVoiceViewHolder != null) {
  1472. mPlayVoiceViewHolder.chat_voice_anim.setVisibility(GONE);
  1473. mPlayVoiceViewHolder.chat_voice_icon.setVisibility(VISIBLE);
  1474. }
  1475. mPlayVoiceViewHolder = null;
  1476. }
  1477. @Override
  1478. public void onSecondsChange(int seconds) {
  1479. }
  1480. }