Commit 9a127eb37547592c327191bab906c1599f04751b
1 parent
a37e8345
区分旧版和3.0版本demo
Showing
17 changed files
with
3000 additions
and
1096 deletions
app/src/main/AndroidManifest.xml
| ... | ... | @@ -48,6 +48,14 @@ |
| 48 | 48 | <activity android:name=".ui.PrivateActivity" |
| 49 | 49 | android:screenOrientation="portrait"/> |
| 50 | 50 | |
| 51 | + <activity | |
| 52 | + android:name=".ui.ChatRoom3Activity" | |
| 53 | + android:theme="@style/Theme.AppCompat.Light.NoActionBar" | |
| 54 | + android:windowSoftInputMode="adjustResize" /> | |
| 55 | + | |
| 56 | + <activity android:name=".ui.Private3Activity" | |
| 57 | + android:screenOrientation="portrait"/> | |
| 58 | + | |
| 51 | 59 | <activity android:name=".ui.VideoActivity" |
| 52 | 60 | android:screenOrientation="portrait" |
| 53 | 61 | android:launchMode="singleTop"/> |
| ... | ... | @@ -91,7 +99,6 @@ |
| 91 | 99 | <action android:name="android.intent.action.TIMEZONE_CHANGED" /> |
| 92 | 100 | </intent-filter> |
| 93 | 101 | |
| 94 | - <!-- ImSDK 3.0.2 后添加 --> | |
| 95 | 102 | <intent-filter> |
| 96 | 103 | <action android:name="com.tencent.qalsdk.service.TASK_REMOVED" /> |
| 97 | 104 | </intent-filter> | ... | ... |
app/src/main/java/com/cnlive/im/adapter/ChatRoom3Adpter.java
0 → 100644
| 1 | +package com.cnlive.im.adapter; | |
| 2 | + | |
| 3 | +import android.content.Context; | |
| 4 | +import android.graphics.Color; | |
| 5 | +import android.graphics.drawable.AnimationDrawable; | |
| 6 | +import android.support.v7.widget.RecyclerView; | |
| 7 | +import android.view.LayoutInflater; | |
| 8 | +import android.view.View; | |
| 9 | +import android.view.ViewGroup; | |
| 10 | +import android.widget.ImageView; | |
| 11 | +import android.widget.TextView; | |
| 12 | + | |
| 13 | +import com.bumptech.glide.Glide; | |
| 14 | +import com.cnlive.im.R; | |
| 15 | +import com.cnlive.im.adapter.base.BaseRecyclerAdapter; | |
| 16 | +import com.cnlive.im.adapter.base.ItemClickListener; | |
| 17 | +import com.cnlive.im.mode.ImagMessage; | |
| 18 | +import com.cnlive.im.mode.StringMessage; | |
| 19 | +import com.cnlive.im.mode.UgcVideoMessage; | |
| 20 | +import com.cnlive.im.mode.VideoMessage; | |
| 21 | +import com.cnlive.im.mode.VoiceMessage; | |
| 22 | +import com.cnlive.im.util.FileUtil; | |
| 23 | +import com.cnlive.libs.util.chat.base.IChat; | |
| 24 | + | |
| 25 | +import org.json.JSONException; | |
| 26 | +import org.json.JSONObject; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * Created by gujun on 2017/12/19. | |
| 30 | + */ | |
| 31 | +public class ChatRoom3Adpter extends BaseRecyclerAdapter { | |
| 32 | + | |
| 33 | + private int stringUser = 1; | |
| 34 | + private int stringOppsite = 2; | |
| 35 | + private int imaUser = 3; | |
| 36 | + private int imaOppsite = 4; | |
| 37 | + private int voiceUser = 5; | |
| 38 | + private int voiceOppsite = 6; | |
| 39 | + private int videoUser = 7; | |
| 40 | + private int videoOppsite = 8; | |
| 41 | + private int ugcVideoUser = 9; | |
| 42 | + private int ugcVideoOppsite = 10; | |
| 43 | + private Context mContext; | |
| 44 | + private ItemClickListener mItemClickListener; | |
| 45 | + | |
| 46 | + private boolean isPrivate; | |
| 47 | + | |
| 48 | + public ChatRoom3Adpter(Context context, boolean isPrivate) { | |
| 49 | + super(context); | |
| 50 | + this.mContext = context; | |
| 51 | + this.isPrivate = isPrivate; | |
| 52 | + } | |
| 53 | + | |
| 54 | + | |
| 55 | + public void setonVoiceItemClickListener(ItemClickListener itemClickListener) { | |
| 56 | + this.mItemClickListener = itemClickListener; | |
| 57 | + } | |
| 58 | + | |
| 59 | + @Override | |
| 60 | + public int getItemViewType(int position) { | |
| 61 | + Object o = mItems.get(position); | |
| 62 | + if (o instanceof StringMessage) { | |
| 63 | + StringMessage o1 = (StringMessage) o; | |
| 64 | + boolean userSend = o1.isUserSend(); | |
| 65 | + if (userSend) return stringUser; | |
| 66 | + else return stringOppsite; | |
| 67 | + } else if (o instanceof ImagMessage) { | |
| 68 | + ImagMessage o1 = (ImagMessage) o; | |
| 69 | + if (o1.isUserSend()) return imaUser; | |
| 70 | + else return imaOppsite; | |
| 71 | + } else if (o instanceof VoiceMessage) { | |
| 72 | + VoiceMessage o1 = (VoiceMessage) o; | |
| 73 | + if (o1.isUserSend()) | |
| 74 | + return voiceUser; | |
| 75 | + else return voiceOppsite; | |
| 76 | + | |
| 77 | + } else if (o instanceof VideoMessage) { | |
| 78 | + VideoMessage o1 = (VideoMessage) o; | |
| 79 | + if (o1.isUserSend()) | |
| 80 | + return videoUser; | |
| 81 | + else return videoOppsite; | |
| 82 | + | |
| 83 | + } else if (o instanceof UgcVideoMessage) { | |
| 84 | + UgcVideoMessage o1 = (UgcVideoMessage) o; | |
| 85 | + if (o1.isUserSend()) | |
| 86 | + return ugcVideoUser; | |
| 87 | + else return ugcVideoOppsite; | |
| 88 | + | |
| 89 | + } | |
| 90 | + return 0; | |
| 91 | + } | |
| 92 | + | |
| 93 | + @Override | |
| 94 | + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | |
| 95 | + if (viewType == imaUser) { | |
| 96 | + return new ImaMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.imag_layout_item_user, null)); | |
| 97 | + } else if (viewType == imaOppsite) { | |
| 98 | + return new ImaMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.imag_layout_item_oppsite, null)); | |
| 99 | + } else if (viewType == stringUser) { | |
| 100 | + return new StringMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.string_layout_item_user, null)); | |
| 101 | + } else if (viewType == stringOppsite) { | |
| 102 | + return new StringMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.string_layout_item_oppsite, null)); | |
| 103 | + } else if (viewType == voiceUser) { | |
| 104 | + return new VoiceMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.voice_layout_item_user, null)); | |
| 105 | + } else if (viewType == voiceOppsite) { | |
| 106 | + return new VoiceMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.voice_layout_item_oppsite, null)); | |
| 107 | + } else if (viewType == videoUser) { | |
| 108 | + return new VideoMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.video_layout_item_user, null)); | |
| 109 | + } else if (viewType == videoOppsite) { | |
| 110 | + return new VideoMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.video_layout_item_oppsite, null)); | |
| 111 | + } else if (viewType == ugcVideoUser) { | |
| 112 | + return new VideoMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.video_layout_item_user, null)); | |
| 113 | + } else if (viewType == ugcVideoOppsite) { | |
| 114 | + return new VideoMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.video_layout_item_oppsite, null)); | |
| 115 | + } | |
| 116 | + return null; | |
| 117 | + } | |
| 118 | + | |
| 119 | + @Override | |
| 120 | + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { | |
| 121 | + if (holder instanceof StringMessageHolder) { | |
| 122 | + StringMessageHolder holder1 = (StringMessageHolder) holder; | |
| 123 | + Object o = mItems.get(position); | |
| 124 | + StringMessage o1 = (StringMessage) o; | |
| 125 | + holder1.showMessage(o1); | |
| 126 | + } else if (holder instanceof ImaMessageHolder) { | |
| 127 | + ImaMessageHolder holder1 = (ImaMessageHolder) holder; | |
| 128 | + Object o = mItems.get(position); | |
| 129 | + ImagMessage o1 = (ImagMessage) o; | |
| 130 | + holder1.showMessage(o1); | |
| 131 | + } else if (holder instanceof VoiceMessageHolder) { | |
| 132 | + final VoiceMessageHolder holder1 = (VoiceMessageHolder) holder; | |
| 133 | + final Object o = mItems.get(position); | |
| 134 | + final VoiceMessage o1 = (VoiceMessage) o; | |
| 135 | + holder1.showMessage(o1); | |
| 136 | + } else if (holder instanceof VideoMessageHolder) { | |
| 137 | + final VideoMessageHolder holder1 = (VideoMessageHolder) holder; | |
| 138 | + final Object o = mItems.get(position); | |
| 139 | + final VideoMessage o1 = (VideoMessage) o; | |
| 140 | + holder1.showMessage(o1); | |
| 141 | + } else if (holder instanceof UgcVideoMessageHolder) { | |
| 142 | + final UgcVideoMessageHolder holder1 = (UgcVideoMessageHolder) holder; | |
| 143 | + final Object o = mItems.get(position); | |
| 144 | + final UgcVideoMessage o1 = (UgcVideoMessage) o; | |
| 145 | + holder1.showMessage(o1); | |
| 146 | + } | |
| 147 | + | |
| 148 | + } | |
| 149 | + | |
| 150 | + public class StringMessageHolder extends RecyclerView.ViewHolder { | |
| 151 | + private TextView user_name; | |
| 152 | + private TextView msg_text; | |
| 153 | + private TextView status; | |
| 154 | + | |
| 155 | + public StringMessageHolder(View itemView) { | |
| 156 | + super(itemView); | |
| 157 | + user_name = (TextView) itemView.findViewById(R.id.user_name); | |
| 158 | + msg_text = (TextView) itemView.findViewById(R.id.msg_text); | |
| 159 | + status = (TextView) itemView.findViewById(R.id.status); | |
| 160 | + } | |
| 161 | + | |
| 162 | + public void showMessage(StringMessage item) { | |
| 163 | + user_name.setText(item.getCnMessage().getUserInfo().getUserName()); | |
| 164 | + | |
| 165 | + switch (item.getCnMessage().getStatus()) { | |
| 166 | + case IChat.CN_MSG_STATUS_SENDING: | |
| 167 | + if (status != null) | |
| 168 | + status.setText("发送中"); | |
| 169 | + sendMsg(item); | |
| 170 | + break; | |
| 171 | + case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 172 | + if (status != null) | |
| 173 | + status.setText("发送失败"); | |
| 174 | + sendMsg(item); | |
| 175 | + break; | |
| 176 | + case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 177 | + if (status != null) | |
| 178 | + status.setText("发送成功"); | |
| 179 | + sendMsg(item); | |
| 180 | + break; | |
| 181 | + } | |
| 182 | + } | |
| 183 | + | |
| 184 | + private void sendMsg(StringMessage item) { | |
| 185 | + if (isPrivate) { | |
| 186 | + try { | |
| 187 | + msg_text.setText((String) (new JSONObject(item.getCnMessage().getContent()).get("message"))); | |
| 188 | + } catch (JSONException e) { | |
| 189 | + e.printStackTrace(); | |
| 190 | + } | |
| 191 | + } else { | |
| 192 | + msg_text.setText(item.getCnMessage().getContent()); | |
| 193 | + } | |
| 194 | + msg_text.setTextColor(Color.BLACK); | |
| 195 | + } | |
| 196 | + } | |
| 197 | + | |
| 198 | + public class ImaMessageHolder extends RecyclerView.ViewHolder { | |
| 199 | + | |
| 200 | + private TextView ima_user_name; | |
| 201 | + private ImageView img_content; | |
| 202 | + private TextView status; | |
| 203 | + private TextView uploadProgress; | |
| 204 | + | |
| 205 | + public ImaMessageHolder(View itemView) { | |
| 206 | + super(itemView); | |
| 207 | + ima_user_name = (TextView) itemView.findViewById(R.id.img_user_name); | |
| 208 | + img_content = (ImageView) itemView.findViewById(R.id.img_content); | |
| 209 | + status = (TextView) itemView.findViewById(R.id.status); | |
| 210 | + uploadProgress = (TextView) itemView.findViewById(R.id.uploadProgress); | |
| 211 | + } | |
| 212 | + | |
| 213 | + public void showMessage(final ImagMessage imagMessage) { | |
| 214 | + ima_user_name.setText(imagMessage.getCnImgMessage().getUserInfo().getUserName()); | |
| 215 | + img_content.getLayoutParams().height = 200; | |
| 216 | + img_content.getLayoutParams().width = 200; | |
| 217 | + img_content.setLayoutParams(img_content.getLayoutParams()); | |
| 218 | + switch (imagMessage.getCnImgMessage().getStatus()) { | |
| 219 | + case IChat.CN_MSG_STATUS_SENDING: | |
| 220 | + if (status != null) | |
| 221 | + status.setText("发送中"); | |
| 222 | + if (uploadProgress != null) { | |
| 223 | + uploadProgress.setVisibility(View.VISIBLE); | |
| 224 | + uploadProgress.setText("上传进度:" + imagMessage.getProgress() + "%"); | |
| 225 | + } | |
| 226 | + Glide.with(mContext).load(imagMessage.getCnImgMessage().getImagePath()).into(img_content); | |
| 227 | + break; | |
| 228 | + case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 229 | + if (status != null) | |
| 230 | + status.setText("发送失败"); | |
| 231 | + if (uploadProgress != null) | |
| 232 | + uploadProgress.setVisibility(View.GONE); | |
| 233 | + Glide.with(mContext).load(imagMessage.getCnImgMessage().getImagePath()).into(img_content); | |
| 234 | + break; | |
| 235 | + case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 236 | + if (status != null) | |
| 237 | + status.setText("发送成功"); | |
| 238 | + if (uploadProgress != null) | |
| 239 | + uploadProgress.setVisibility(View.GONE); | |
| 240 | + sendSuccess(imagMessage); | |
| 241 | + break; | |
| 242 | + } | |
| 243 | + } | |
| 244 | + | |
| 245 | + private void sendSuccess(final ImagMessage imagMessage) { | |
| 246 | + if (imagMessage.getCnImgMessage().isSelf()) { | |
| 247 | + Glide.with(mContext).load(imagMessage.getCnImgMessage().getImagePath()).into(img_content); | |
| 248 | + } else { | |
| 249 | + String thumbUuid = imagMessage.getCnImgMessage().getThumbUuid(); | |
| 250 | + final String imagePath = FileUtil.getCacheFilePath(thumbUuid); | |
| 251 | + if (FileUtil.isCacheFileExist(thumbUuid)) { | |
| 252 | + if (img_content != null && mContext != null) | |
| 253 | + Glide.with(mContext).load(imagePath).into(img_content); | |
| 254 | + } else { | |
| 255 | + if (!imagMessage.isDownloading()) { | |
| 256 | + imagMessage.setDownloading(true); | |
| 257 | + imagMessage.getCnImgMessage().getThumbImage(imagePath, new IChat.OnDownloadListener() { | |
| 258 | + @Override | |
| 259 | + public void onSuccess() { | |
| 260 | + imagMessage.setDownloading(false); | |
| 261 | + if (img_content != null && mContext != null) | |
| 262 | + Glide.with(mContext).load(imagePath).into(img_content); | |
| 263 | + } | |
| 264 | + | |
| 265 | + @Override | |
| 266 | + public void onError(int i, String s) { | |
| 267 | + imagMessage.setDownloading(false); | |
| 268 | + } | |
| 269 | + }); | |
| 270 | + } | |
| 271 | + } | |
| 272 | + } | |
| 273 | + img_content.setOnClickListener(new View.OnClickListener() { | |
| 274 | + @Override | |
| 275 | + public void onClick(View v) { | |
| 276 | + if (mItemClickListener != null) | |
| 277 | + mItemClickListener.onImageClick(imagMessage); | |
| 278 | + } | |
| 279 | + }); | |
| 280 | + } | |
| 281 | + } | |
| 282 | + | |
| 283 | + public class VoiceMessageHolder extends RecyclerView.ViewHolder { | |
| 284 | + | |
| 285 | + | |
| 286 | + private TextView voice_user_name; | |
| 287 | + private ImageView voiceAnim; | |
| 288 | + private TextView voice_duration; | |
| 289 | + private View voice_none_read; | |
| 290 | + private TextView status; | |
| 291 | + private TextView uploadProgress; | |
| 292 | + | |
| 293 | + public VoiceMessageHolder(View itemView) { | |
| 294 | + super(itemView); | |
| 295 | + voice_user_name = (TextView) itemView.findViewById(R.id.voice_user_name); | |
| 296 | + voiceAnim = (ImageView) itemView.findViewById(R.id.voiceAnim); | |
| 297 | + voice_duration = (TextView) itemView.findViewById(R.id.voice_duration); | |
| 298 | + voice_none_read = itemView.findViewById(R.id.noneRead); | |
| 299 | + status = (TextView) itemView.findViewById(R.id.status); | |
| 300 | + uploadProgress = (TextView) itemView.findViewById(R.id.uploadProgress); | |
| 301 | + } | |
| 302 | + | |
| 303 | + public void showMessage(final VoiceMessage voiceMessage) { | |
| 304 | + voice_user_name.setText(voiceMessage.getCnVoiceMessage().getUserInfo().getUserName()); | |
| 305 | + int duration = voiceMessage.getCnVoiceMessage().getVoiceTime(); | |
| 306 | + voice_duration.setText(String.valueOf(duration).concat("\"")); | |
| 307 | + switch (voiceMessage.getCnVoiceMessage().getStatus()) { | |
| 308 | + case IChat.CN_MSG_STATUS_SENDING: | |
| 309 | + if (status != null) | |
| 310 | + status.setText("发送中"); | |
| 311 | + if (uploadProgress != null) { | |
| 312 | + uploadProgress.setVisibility(View.VISIBLE); | |
| 313 | + uploadProgress.setText("上传进度:" + voiceMessage.getProgress() + "%"); | |
| 314 | + } | |
| 315 | + break; | |
| 316 | + case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 317 | + if (status != null) | |
| 318 | + status.setText("发送失败"); | |
| 319 | + if (uploadProgress != null) | |
| 320 | + uploadProgress.setVisibility(View.GONE); | |
| 321 | + break; | |
| 322 | + case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 323 | + if (status != null) | |
| 324 | + status.setText("发送成功"); | |
| 325 | + if (uploadProgress != null) | |
| 326 | + uploadProgress.setVisibility(View.GONE); | |
| 327 | + sendSuccess(voiceMessage); | |
| 328 | + break; | |
| 329 | + } | |
| 330 | + } | |
| 331 | + | |
| 332 | + private void sendSuccess(final VoiceMessage voiceMessage) { | |
| 333 | + if (voice_none_read != null) | |
| 334 | + voice_none_read.setVisibility(voiceMessage.getCnVoiceMessage().isRead() ? View.GONE : View.VISIBLE); | |
| 335 | + itemView.setOnClickListener(new View.OnClickListener() { | |
| 336 | + @Override | |
| 337 | + public void onClick(View v) { | |
| 338 | + if (mItemClickListener != null) | |
| 339 | + mItemClickListener.onItemClick(voiceMessage, (AnimationDrawable) voiceAnim.getBackground()); | |
| 340 | + if (voice_none_read != null) | |
| 341 | + voice_none_read.setVisibility(View.GONE); | |
| 342 | + } | |
| 343 | + }); | |
| 344 | + } | |
| 345 | + } | |
| 346 | + | |
| 347 | + public class VideoMessageHolder extends RecyclerView.ViewHolder { | |
| 348 | + | |
| 349 | + private TextView video_user_name; | |
| 350 | + private ImageView video_snapshot; | |
| 351 | + private View videoLayout; | |
| 352 | + private TextView status; | |
| 353 | + private TextView uploadProgress; | |
| 354 | + | |
| 355 | + public VideoMessageHolder(View itemView) { | |
| 356 | + super(itemView); | |
| 357 | + video_user_name = (TextView) itemView.findViewById(R.id.user_name); | |
| 358 | + video_snapshot = (ImageView) itemView.findViewById(R.id.img_content); | |
| 359 | + videoLayout = itemView.findViewById(R.id.videoLayout); | |
| 360 | + status = (TextView) itemView.findViewById(R.id.status); | |
| 361 | + uploadProgress = (TextView) itemView.findViewById(R.id.uploadProgress); | |
| 362 | + } | |
| 363 | + | |
| 364 | + public void showMessage(final VideoMessage videoMessage) { | |
| 365 | + video_user_name.setText(videoMessage.getCnVideoMessage().getUserInfo().getUserName()); | |
| 366 | + switch (videoMessage.getCnVideoMessage().getStatus()) { | |
| 367 | + case IChat.CN_MSG_STATUS_SENDING: | |
| 368 | + if (status != null) | |
| 369 | + status.setText("发送中"); | |
| 370 | + if (uploadProgress != null) { | |
| 371 | + uploadProgress.setVisibility(View.VISIBLE); | |
| 372 | + uploadProgress.setText("上传进度:" + videoMessage.getProgress() + "%"); | |
| 373 | + } | |
| 374 | + Glide.with(mContext).load(videoMessage.getCnVideoMessage().getSnapshotPath()).into(video_snapshot); | |
| 375 | + break; | |
| 376 | + case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 377 | + if (status != null) | |
| 378 | + status.setText("发送失败"); | |
| 379 | + if (uploadProgress != null) | |
| 380 | + uploadProgress.setVisibility(View.GONE); | |
| 381 | + Glide.with(mContext).load(videoMessage.getCnVideoMessage().getSnapshotPath()).into(video_snapshot); | |
| 382 | + break; | |
| 383 | + case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 384 | + if (status != null) | |
| 385 | + status.setText("发送成功"); | |
| 386 | + if (uploadProgress != null) | |
| 387 | + uploadProgress.setVisibility(View.GONE); | |
| 388 | + sendSuccess(videoMessage); | |
| 389 | + break; | |
| 390 | + } | |
| 391 | + } | |
| 392 | + | |
| 393 | + private void sendSuccess(final VideoMessage videoMessage) { | |
| 394 | + videoLayout.setOnClickListener(new View.OnClickListener() { | |
| 395 | + @Override | |
| 396 | + public void onClick(View v) { | |
| 397 | + if (mItemClickListener != null) | |
| 398 | + mItemClickListener.onVideoClick(videoMessage); | |
| 399 | + } | |
| 400 | + }); | |
| 401 | + if (videoMessage.getCnVideoMessage().isSelf()) { | |
| 402 | + Glide.with(mContext).load(videoMessage.getCnVideoMessage().getSnapshotPath()).into(video_snapshot); | |
| 403 | + } else { | |
| 404 | + String snapshotUuid = videoMessage.getCnVideoMessage().getSnapshot().getUuid(); | |
| 405 | + final String imagePath = FileUtil.getCacheFilePath(snapshotUuid); | |
| 406 | + if (FileUtil.isCacheFileExist(snapshotUuid)) { | |
| 407 | + if (video_snapshot != null && mContext != null) | |
| 408 | + Glide.with(mContext).load(imagePath).into(video_snapshot); | |
| 409 | + } else { | |
| 410 | + if (!videoMessage.isDownloading()) { | |
| 411 | + videoMessage.setDownloading(true); | |
| 412 | + videoMessage.getCnVideoMessage().getSnapshot().getImage(imagePath, new IChat.OnDownloadListener() { | |
| 413 | + @Override | |
| 414 | + public void onSuccess() { | |
| 415 | + videoMessage.setDownloading(false); | |
| 416 | + if (video_snapshot != null && mContext != null) | |
| 417 | + Glide.with(mContext).load(imagePath).into(video_snapshot); | |
| 418 | + } | |
| 419 | + | |
| 420 | + @Override | |
| 421 | + public void onError(int i, String s) { | |
| 422 | + videoMessage.setDownloading(false); | |
| 423 | + } | |
| 424 | + }); | |
| 425 | + } | |
| 426 | + } | |
| 427 | + } | |
| 428 | + } | |
| 429 | + } | |
| 430 | + | |
| 431 | + public class UgcVideoMessageHolder extends RecyclerView.ViewHolder { | |
| 432 | + | |
| 433 | + private TextView video_user_name; | |
| 434 | + private ImageView video_cover; | |
| 435 | + private View videoLayout; | |
| 436 | + private TextView status; | |
| 437 | + private TextView uploadProgress; | |
| 438 | + | |
| 439 | + public UgcVideoMessageHolder(View itemView) { | |
| 440 | + super(itemView); | |
| 441 | + video_user_name = (TextView) itemView.findViewById(R.id.user_name); | |
| 442 | + video_cover = (ImageView) itemView.findViewById(R.id.img_content); | |
| 443 | + videoLayout = itemView.findViewById(R.id.videoLayout); | |
| 444 | + status = (TextView) itemView.findViewById(R.id.status); | |
| 445 | + uploadProgress = (TextView) itemView.findViewById(R.id.uploadProgress); | |
| 446 | + } | |
| 447 | + | |
| 448 | + public void showMessage(final UgcVideoMessage videoMessage) { | |
| 449 | + video_user_name.setText(videoMessage.getCnUgcMessage().getUserInfo().getUserName()); | |
| 450 | + switch (videoMessage.getCnUgcMessage().getStatus()) { | |
| 451 | + case IChat.CN_MSG_STATUS_SENDING: | |
| 452 | + if (status != null) | |
| 453 | + status.setText("发送中"); | |
| 454 | + if (uploadProgress != null) { | |
| 455 | + uploadProgress.setVisibility(View.VISIBLE); | |
| 456 | + uploadProgress.setText("上传进度:" + videoMessage.getProgress() + "%"); | |
| 457 | + } | |
| 458 | + Glide.with(mContext).load(videoMessage.getCnUgcMessage().getCoverPath()).into(video_cover); | |
| 459 | + break; | |
| 460 | + case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 461 | + if (status != null) | |
| 462 | + status.setText("发送失败"); | |
| 463 | + if (uploadProgress != null) | |
| 464 | + uploadProgress.setVisibility(View.GONE); | |
| 465 | + Glide.with(mContext).load(videoMessage.getCnUgcMessage().getCoverPath()).into(video_cover); | |
| 466 | + break; | |
| 467 | + case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 468 | + if (status != null) | |
| 469 | + status.setText("发送成功"); | |
| 470 | + if (uploadProgress != null) | |
| 471 | + uploadProgress.setVisibility(View.GONE); | |
| 472 | + sendSuccess(videoMessage); | |
| 473 | + break; | |
| 474 | + } | |
| 475 | + } | |
| 476 | + | |
| 477 | + private void sendSuccess(final UgcVideoMessage videoMessage) { | |
| 478 | + videoLayout.setOnClickListener(new View.OnClickListener() { | |
| 479 | + @Override | |
| 480 | + public void onClick(View v) { | |
| 481 | + if (mItemClickListener != null) | |
| 482 | + mItemClickListener.onUgcVideoClick(videoMessage); | |
| 483 | + } | |
| 484 | + }); | |
| 485 | + if (videoMessage.getCnUgcMessage().isSelf()) { | |
| 486 | + Glide.with(mContext).load(videoMessage.getCnUgcMessage().getCoverPath()).into(video_cover); | |
| 487 | + } else { | |
| 488 | + String coverUuid = videoMessage.getCnUgcMessage().getFileId() + "_image"; | |
| 489 | + final String imagePath = FileUtil.getCacheFilePath(coverUuid); | |
| 490 | + if (FileUtil.isCacheFileExist(coverUuid)) { | |
| 491 | + if (video_cover != null && mContext != null) | |
| 492 | + Glide.with(mContext).load(imagePath).into(video_cover); | |
| 493 | + } else { | |
| 494 | + if (!videoMessage.isDownloading()) { | |
| 495 | + videoMessage.setDownloading(true); | |
| 496 | + videoMessage.getCnUgcMessage().getCover().getImage(imagePath, new IChat.OnDownloadListener() { | |
| 497 | + @Override | |
| 498 | + public void onSuccess() { | |
| 499 | + videoMessage.setDownloading(false); | |
| 500 | + if (video_cover != null && mContext != null) | |
| 501 | + Glide.with(mContext).load(imagePath).into(video_cover); | |
| 502 | + } | |
| 503 | + | |
| 504 | + @Override | |
| 505 | + public void onError(int i, String s) { | |
| 506 | + videoMessage.setDownloading(false); | |
| 507 | + } | |
| 508 | + }); | |
| 509 | + } | |
| 510 | + } | |
| 511 | + } | |
| 512 | + } | |
| 513 | + } | |
| 514 | + | |
| 515 | +} | ... | ... |
app/src/main/java/com/cnlive/im/adapter/ChatRoomAdpter.java
| 1 | 1 | package com.cnlive.im.adapter; |
| 2 | 2 | |
| 3 | 3 | import android.content.Context; |
| 4 | +import android.database.Cursor; | |
| 4 | 5 | import android.graphics.Color; |
| 5 | -import android.graphics.drawable.AnimationDrawable; | |
| 6 | +import android.net.Uri; | |
| 7 | +import android.provider.ContactsContract; | |
| 8 | +import android.provider.MediaStore; | |
| 6 | 9 | import android.support.v7.widget.RecyclerView; |
| 10 | +import android.util.Log; | |
| 7 | 11 | import android.view.LayoutInflater; |
| 8 | 12 | import android.view.View; |
| 9 | 13 | import android.view.ViewGroup; |
| 14 | +import android.view.WindowManager; | |
| 10 | 15 | import android.widget.ImageView; |
| 16 | +import android.widget.LinearLayout; | |
| 11 | 17 | import android.widget.TextView; |
| 12 | 18 | |
| 13 | 19 | import com.bumptech.glide.Glide; |
| 14 | 20 | import com.cnlive.im.R; |
| 15 | 21 | import com.cnlive.im.adapter.base.BaseRecyclerAdapter; |
| 16 | -import com.cnlive.im.adapter.base.ItemClickListener; | |
| 22 | +import com.cnlive.im.adapter.base.VoiceItemClickListener; | |
| 17 | 23 | import com.cnlive.im.mode.ImagMessage; |
| 18 | 24 | import com.cnlive.im.mode.StringMessage; |
| 19 | -import com.cnlive.im.mode.UgcVideoMessage; | |
| 20 | -import com.cnlive.im.mode.VideoMessage; | |
| 21 | 25 | import com.cnlive.im.mode.VoiceMessage; |
| 22 | -import com.cnlive.im.util.FileUtil; | |
| 23 | -import com.cnlive.libs.util.chat.base.IChat; | |
| 24 | 26 | |
| 25 | 27 | import org.json.JSONException; |
| 26 | 28 | import org.json.JSONObject; |
| 27 | 29 | |
| 30 | +import java.text.SimpleDateFormat; | |
| 31 | +import java.util.Calendar; | |
| 32 | +import java.util.Date; | |
| 33 | +import java.util.HashMap; | |
| 34 | +import java.util.Locale; | |
| 35 | + | |
| 28 | 36 | /** |
| 29 | 37 | * @author 陈硕 |
| 30 | 38 | * @time 2017/7/14 14:35 |
| ... | ... | @@ -38,12 +46,8 @@ public class ChatRoomAdpter extends BaseRecyclerAdapter { |
| 38 | 46 | private int imaOppsite = 4; |
| 39 | 47 | private int voiceUser = 5; |
| 40 | 48 | private int voiceOppsite = 6; |
| 41 | - private int videoUser = 7; | |
| 42 | - private int videoOppsite = 8; | |
| 43 | - private int ugcVideoUser = 9; | |
| 44 | - private int ugcVideoOppsite = 10; | |
| 45 | 49 | private Context mContext; |
| 46 | - private ItemClickListener mItemClickListener; | |
| 50 | + private VoiceItemClickListener mVoiceItemClickListener; | |
| 47 | 51 | |
| 48 | 52 | private boolean isPrivate; |
| 49 | 53 | |
| ... | ... | @@ -54,8 +58,8 @@ public class ChatRoomAdpter extends BaseRecyclerAdapter { |
| 54 | 58 | } |
| 55 | 59 | |
| 56 | 60 | |
| 57 | - public void setonVoiceItemClickListener(ItemClickListener itemClickListener) { | |
| 58 | - this.mItemClickListener = itemClickListener; | |
| 61 | + public void setonVoiceItemClickListener(VoiceItemClickListener voiveItemClickListener) { | |
| 62 | + this.mVoiceItemClickListener = voiveItemClickListener; | |
| 59 | 63 | } |
| 60 | 64 | |
| 61 | 65 | @Override |
| ... | ... | @@ -76,18 +80,6 @@ public class ChatRoomAdpter extends BaseRecyclerAdapter { |
| 76 | 80 | return voiceUser; |
| 77 | 81 | else return voiceOppsite; |
| 78 | 82 | |
| 79 | - } else if (o instanceof VideoMessage) { | |
| 80 | - VideoMessage o1 = (VideoMessage) o; | |
| 81 | - if (o1.isUserSend()) | |
| 82 | - return videoUser; | |
| 83 | - else return videoOppsite; | |
| 84 | - | |
| 85 | - } else if (o instanceof UgcVideoMessage) { | |
| 86 | - UgcVideoMessage o1 = (UgcVideoMessage) o; | |
| 87 | - if (o1.isUserSend()) | |
| 88 | - return ugcVideoUser; | |
| 89 | - else return ugcVideoOppsite; | |
| 90 | - | |
| 91 | 83 | } |
| 92 | 84 | return 0; |
| 93 | 85 | } |
| ... | ... | @@ -106,14 +98,6 @@ public class ChatRoomAdpter extends BaseRecyclerAdapter { |
| 106 | 98 | return new VoiceMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.voice_layout_item_user, null)); |
| 107 | 99 | } else if (viewType == voiceOppsite) { |
| 108 | 100 | return new VoiceMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.voice_layout_item_oppsite, null)); |
| 109 | - } else if (viewType == videoUser) { | |
| 110 | - return new VideoMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.video_layout_item_user, null)); | |
| 111 | - } else if (viewType == videoOppsite) { | |
| 112 | - return new VideoMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.video_layout_item_oppsite, null)); | |
| 113 | - } else if (viewType == ugcVideoUser) { | |
| 114 | - return new VideoMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.video_layout_item_user, null)); | |
| 115 | - } else if (viewType == ugcVideoOppsite) { | |
| 116 | - return new VideoMessageHolder(LayoutInflater.from(mContext).inflate(R.layout.video_layout_item_oppsite, null)); | |
| 117 | 101 | } |
| 118 | 102 | return null; |
| 119 | 103 | } |
| ... | ... | @@ -124,27 +108,42 @@ public class ChatRoomAdpter extends BaseRecyclerAdapter { |
| 124 | 108 | StringMessageHolder holder1 = (StringMessageHolder) holder; |
| 125 | 109 | Object o = mItems.get(position); |
| 126 | 110 | StringMessage o1 = (StringMessage) o; |
| 127 | - holder1.showMessage(o1); | |
| 111 | + if (isPrivate) { | |
| 112 | + try { | |
| 113 | + holder1.msg_text.setText((String) (new JSONObject(o1.getCnMessage().getContent()).get("message"))); | |
| 114 | + } catch (JSONException e) { | |
| 115 | + e.printStackTrace(); | |
| 116 | + } | |
| 117 | + } else { | |
| 118 | + holder1.msg_text.setText(o1.getCnMessage().getContent()); | |
| 119 | + } | |
| 120 | + holder1.user_name.setText(o1.getCnMessage().getUserInfo().getUserName()); | |
| 121 | + holder1.user_name.setTextColor(Color.parseColor("#d61d0c")); | |
| 122 | + holder1.msg_text.setTextColor(Color.BLACK); | |
| 128 | 123 | } else if (holder instanceof ImaMessageHolder) { |
| 129 | 124 | ImaMessageHolder holder1 = (ImaMessageHolder) holder; |
| 130 | 125 | Object o = mItems.get(position); |
| 131 | 126 | ImagMessage o1 = (ImagMessage) o; |
| 132 | - holder1.showMessage(o1); | |
| 127 | + holder1.ima_user_name.setTextColor(Color.parseColor("#d61d0c")); | |
| 128 | + holder1.img_content.getLayoutParams().height = 200; | |
| 129 | + holder1.img_content.getLayoutParams().width = 200; | |
| 130 | + holder1.img_content.setLayoutParams(holder1.img_content.getLayoutParams()); | |
| 131 | + Glide.with(mContext).load(o1.getCnImgMessage().getRemoteUri()).into(holder1.img_content); | |
| 132 | + holder1.ima_user_name.setText(o1.getCnImgMessage().getUserInfo().getUserName()); | |
| 133 | 133 | } else if (holder instanceof VoiceMessageHolder) { |
| 134 | - final VoiceMessageHolder holder1 = (VoiceMessageHolder) holder; | |
| 135 | - final Object o = mItems.get(position); | |
| 134 | + VoiceMessageHolder holder1 = (VoiceMessageHolder) holder; | |
| 135 | + Object o = mItems.get(position); | |
| 136 | 136 | final VoiceMessage o1 = (VoiceMessage) o; |
| 137 | - holder1.showMessage(o1); | |
| 138 | - } else if (holder instanceof VideoMessageHolder) { | |
| 139 | - final VideoMessageHolder holder1 = (VideoMessageHolder) holder; | |
| 140 | - final Object o = mItems.get(position); | |
| 141 | - final VideoMessage o1 = (VideoMessage) o; | |
| 142 | - holder1.showMessage(o1); | |
| 143 | - } else if (holder instanceof UgcVideoMessageHolder) { | |
| 144 | - final UgcVideoMessageHolder holder1 = (UgcVideoMessageHolder) holder; | |
| 145 | - final Object o = mItems.get(position); | |
| 146 | - final UgcVideoMessage o1 = (UgcVideoMessage) o; | |
| 147 | - holder1.showMessage(o1); | |
| 137 | + holder1.voice_user_name.setText(o1.getCnVoiceMessage().getUserInfo().getUserName()); | |
| 138 | + final Uri voiceUri = o1.getCnVoiceMessage().getVoiceUri(); | |
| 139 | + int duration = o1.getCnVoiceMessage().getVoiceTime(); | |
| 140 | + holder1.voice_duration.setText(String.valueOf(duration).concat("\"")); | |
| 141 | + holder1.itemView.setOnClickListener(new View.OnClickListener() { | |
| 142 | + @Override | |
| 143 | + public void onClick(View v) { | |
| 144 | + mVoiceItemClickListener.onItemClick(o1); | |
| 145 | + } | |
| 146 | + }); | |
| 148 | 147 | } |
| 149 | 148 | |
| 150 | 149 | } |
| ... | ... | @@ -152,48 +151,12 @@ public class ChatRoomAdpter extends BaseRecyclerAdapter { |
| 152 | 151 | public class StringMessageHolder extends RecyclerView.ViewHolder { |
| 153 | 152 | private TextView user_name; |
| 154 | 153 | private TextView msg_text; |
| 155 | - private TextView status; | |
| 156 | 154 | |
| 157 | 155 | public StringMessageHolder(View itemView) { |
| 158 | 156 | super(itemView); |
| 159 | 157 | user_name = (TextView) itemView.findViewById(R.id.user_name); |
| 160 | 158 | msg_text = (TextView) itemView.findViewById(R.id.msg_text); |
| 161 | - status = (TextView) itemView.findViewById(R.id.status); | |
| 162 | - } | |
| 163 | 159 | |
| 164 | - public void showMessage(StringMessage item) { | |
| 165 | - user_name.setText(item.getCnMessage().getUserInfo().getUserName()); | |
| 166 | - | |
| 167 | - switch (item.getCnMessage().getStatus()) { | |
| 168 | - case IChat.CN_MSG_STATUS_SENDING: | |
| 169 | - if (status != null) | |
| 170 | - status.setText("发送中"); | |
| 171 | - sendMsg(item); | |
| 172 | - break; | |
| 173 | - case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 174 | - if (status != null) | |
| 175 | - status.setText("发送失败"); | |
| 176 | - sendMsg(item); | |
| 177 | - break; | |
| 178 | - case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 179 | - if (status != null) | |
| 180 | - status.setText("发送成功"); | |
| 181 | - sendMsg(item); | |
| 182 | - break; | |
| 183 | - } | |
| 184 | - } | |
| 185 | - | |
| 186 | - private void sendMsg(StringMessage item) { | |
| 187 | - if (isPrivate) { | |
| 188 | - try { | |
| 189 | - msg_text.setText((String) (new JSONObject(item.getCnMessage().getContent()).get("message"))); | |
| 190 | - } catch (JSONException e) { | |
| 191 | - e.printStackTrace(); | |
| 192 | - } | |
| 193 | - } else { | |
| 194 | - msg_text.setText(item.getCnMessage().getContent()); | |
| 195 | - } | |
| 196 | - msg_text.setTextColor(Color.BLACK); | |
| 197 | 160 | } |
| 198 | 161 | } |
| 199 | 162 | |
| ... | ... | @@ -201,84 +164,11 @@ public class ChatRoomAdpter extends BaseRecyclerAdapter { |
| 201 | 164 | |
| 202 | 165 | private TextView ima_user_name; |
| 203 | 166 | private ImageView img_content; |
| 204 | - private TextView status; | |
| 205 | - private TextView uploadProgress; | |
| 206 | 167 | |
| 207 | 168 | public ImaMessageHolder(View itemView) { |
| 208 | 169 | super(itemView); |
| 209 | 170 | ima_user_name = (TextView) itemView.findViewById(R.id.img_user_name); |
| 210 | 171 | img_content = (ImageView) itemView.findViewById(R.id.img_content); |
| 211 | - status = (TextView) itemView.findViewById(R.id.status); | |
| 212 | - uploadProgress = (TextView) itemView.findViewById(R.id.uploadProgress); | |
| 213 | - } | |
| 214 | - | |
| 215 | - public void showMessage(final ImagMessage imagMessage) { | |
| 216 | - ima_user_name.setText(imagMessage.getCnImgMessage().getUserInfo().getUserName()); | |
| 217 | - img_content.getLayoutParams().height = 200; | |
| 218 | - img_content.getLayoutParams().width = 200; | |
| 219 | - img_content.setLayoutParams(img_content.getLayoutParams()); | |
| 220 | - switch (imagMessage.getCnImgMessage().getStatus()) { | |
| 221 | - case IChat.CN_MSG_STATUS_SENDING: | |
| 222 | - if (status != null) | |
| 223 | - status.setText("发送中"); | |
| 224 | - if (uploadProgress != null) { | |
| 225 | - uploadProgress.setVisibility(View.VISIBLE); | |
| 226 | - uploadProgress.setText("上传进度:" + imagMessage.getProgress() + "%"); | |
| 227 | - } | |
| 228 | - Glide.with(mContext).load(imagMessage.getCnImgMessage().getImagePath()).into(img_content); | |
| 229 | - break; | |
| 230 | - case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 231 | - if (status != null) | |
| 232 | - status.setText("发送失败"); | |
| 233 | - if (uploadProgress != null) | |
| 234 | - uploadProgress.setVisibility(View.GONE); | |
| 235 | - Glide.with(mContext).load(imagMessage.getCnImgMessage().getImagePath()).into(img_content); | |
| 236 | - break; | |
| 237 | - case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 238 | - if (status != null) | |
| 239 | - status.setText("发送成功"); | |
| 240 | - if (uploadProgress != null) | |
| 241 | - uploadProgress.setVisibility(View.GONE); | |
| 242 | - sendSuccess(imagMessage); | |
| 243 | - break; | |
| 244 | - } | |
| 245 | - } | |
| 246 | - | |
| 247 | - private void sendSuccess(final ImagMessage imagMessage) { | |
| 248 | - if (imagMessage.getCnImgMessage().isSelf()) { | |
| 249 | - Glide.with(mContext).load(imagMessage.getCnImgMessage().getImagePath()).into(img_content); | |
| 250 | - } else { | |
| 251 | - String thumbUuid = imagMessage.getCnImgMessage().getThumbUuid(); | |
| 252 | - final String imagePath = FileUtil.getCacheFilePath(thumbUuid); | |
| 253 | - if (FileUtil.isCacheFileExist(thumbUuid)) { | |
| 254 | - if (img_content != null && mContext != null) | |
| 255 | - Glide.with(mContext).load(imagePath).into(img_content); | |
| 256 | - } else { | |
| 257 | - if (!imagMessage.isDownloading()) { | |
| 258 | - imagMessage.setDownloading(true); | |
| 259 | - imagMessage.getCnImgMessage().getThumbImage(imagePath, new IChat.OnDownloadListener() { | |
| 260 | - @Override | |
| 261 | - public void onSuccess() { | |
| 262 | - imagMessage.setDownloading(false); | |
| 263 | - if (img_content != null && mContext != null) | |
| 264 | - Glide.with(mContext).load(imagePath).into(img_content); | |
| 265 | - } | |
| 266 | - | |
| 267 | - @Override | |
| 268 | - public void onError(int i, String s) { | |
| 269 | - imagMessage.setDownloading(false); | |
| 270 | - } | |
| 271 | - }); | |
| 272 | - } | |
| 273 | - } | |
| 274 | - } | |
| 275 | - img_content.setOnClickListener(new View.OnClickListener() { | |
| 276 | - @Override | |
| 277 | - public void onClick(View v) { | |
| 278 | - if (mItemClickListener != null) | |
| 279 | - mItemClickListener.onImageClick(imagMessage); | |
| 280 | - } | |
| 281 | - }); | |
| 282 | 172 | } |
| 283 | 173 | } |
| 284 | 174 | |
| ... | ... | @@ -286,231 +176,12 @@ public class ChatRoomAdpter extends BaseRecyclerAdapter { |
| 286 | 176 | |
| 287 | 177 | |
| 288 | 178 | private TextView voice_user_name; |
| 289 | - private ImageView voiceAnim; | |
| 290 | 179 | private TextView voice_duration; |
| 291 | - private View voice_none_read; | |
| 292 | - private TextView status; | |
| 293 | - private TextView uploadProgress; | |
| 294 | 180 | |
| 295 | 181 | public VoiceMessageHolder(View itemView) { |
| 296 | 182 | super(itemView); |
| 297 | 183 | voice_user_name = (TextView) itemView.findViewById(R.id.voice_user_name); |
| 298 | - voiceAnim = (ImageView) itemView.findViewById(R.id.voiceAnim); | |
| 299 | 184 | voice_duration = (TextView) itemView.findViewById(R.id.voice_duration); |
| 300 | - voice_none_read = itemView.findViewById(R.id.noneRead); | |
| 301 | - status = (TextView) itemView.findViewById(R.id.status); | |
| 302 | - uploadProgress = (TextView) itemView.findViewById(R.id.uploadProgress); | |
| 303 | - } | |
| 304 | - | |
| 305 | - public void showMessage(final VoiceMessage voiceMessage) { | |
| 306 | - voice_user_name.setText(voiceMessage.getCnVoiceMessage().getUserInfo().getUserName()); | |
| 307 | - int duration = voiceMessage.getCnVoiceMessage().getVoiceTime(); | |
| 308 | - voice_duration.setText(String.valueOf(duration).concat("\"")); | |
| 309 | - switch (voiceMessage.getCnVoiceMessage().getStatus()) { | |
| 310 | - case IChat.CN_MSG_STATUS_SENDING: | |
| 311 | - if (status != null) | |
| 312 | - status.setText("发送中"); | |
| 313 | - if (uploadProgress != null) { | |
| 314 | - uploadProgress.setVisibility(View.VISIBLE); | |
| 315 | - uploadProgress.setText("上传进度:" + voiceMessage.getProgress() + "%"); | |
| 316 | - } | |
| 317 | - break; | |
| 318 | - case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 319 | - if (status != null) | |
| 320 | - status.setText("发送失败"); | |
| 321 | - if (uploadProgress != null) | |
| 322 | - uploadProgress.setVisibility(View.GONE); | |
| 323 | - break; | |
| 324 | - case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 325 | - if (status != null) | |
| 326 | - status.setText("发送成功"); | |
| 327 | - if (uploadProgress != null) | |
| 328 | - uploadProgress.setVisibility(View.GONE); | |
| 329 | - sendSuccess(voiceMessage); | |
| 330 | - break; | |
| 331 | - } | |
| 332 | - } | |
| 333 | - | |
| 334 | - private void sendSuccess(final VoiceMessage voiceMessage) { | |
| 335 | - if (voice_none_read != null) | |
| 336 | - voice_none_read.setVisibility(voiceMessage.getCnVoiceMessage().isRead() ? View.GONE : View.VISIBLE); | |
| 337 | - itemView.setOnClickListener(new View.OnClickListener() { | |
| 338 | - @Override | |
| 339 | - public void onClick(View v) { | |
| 340 | - if (mItemClickListener != null) | |
| 341 | - mItemClickListener.onItemClick(voiceMessage, (AnimationDrawable) voiceAnim.getBackground()); | |
| 342 | - if (voice_none_read != null) | |
| 343 | - voice_none_read.setVisibility(View.GONE); | |
| 344 | - } | |
| 345 | - }); | |
| 346 | - } | |
| 347 | - } | |
| 348 | - | |
| 349 | - public class VideoMessageHolder extends RecyclerView.ViewHolder { | |
| 350 | - | |
| 351 | - private TextView video_user_name; | |
| 352 | - private ImageView video_snapshot; | |
| 353 | - private View videoLayout; | |
| 354 | - private TextView status; | |
| 355 | - private TextView uploadProgress; | |
| 356 | - | |
| 357 | - public VideoMessageHolder(View itemView) { | |
| 358 | - super(itemView); | |
| 359 | - video_user_name = (TextView) itemView.findViewById(R.id.user_name); | |
| 360 | - video_snapshot = (ImageView) itemView.findViewById(R.id.img_content); | |
| 361 | - videoLayout = itemView.findViewById(R.id.videoLayout); | |
| 362 | - status = (TextView) itemView.findViewById(R.id.status); | |
| 363 | - uploadProgress = (TextView) itemView.findViewById(R.id.uploadProgress); | |
| 364 | - } | |
| 365 | - | |
| 366 | - public void showMessage(final VideoMessage videoMessage) { | |
| 367 | - video_user_name.setText(videoMessage.getCnVideoMessage().getUserInfo().getUserName()); | |
| 368 | - switch (videoMessage.getCnVideoMessage().getStatus()) { | |
| 369 | - case IChat.CN_MSG_STATUS_SENDING: | |
| 370 | - if (status != null) | |
| 371 | - status.setText("发送中"); | |
| 372 | - if (uploadProgress != null) { | |
| 373 | - uploadProgress.setVisibility(View.VISIBLE); | |
| 374 | - uploadProgress.setText("上传进度:" + videoMessage.getProgress() + "%"); | |
| 375 | - } | |
| 376 | - Glide.with(mContext).load(videoMessage.getCnVideoMessage().getSnapshotPath()).into(video_snapshot); | |
| 377 | - break; | |
| 378 | - case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 379 | - if (status != null) | |
| 380 | - status.setText("发送失败"); | |
| 381 | - if (uploadProgress != null) | |
| 382 | - uploadProgress.setVisibility(View.GONE); | |
| 383 | - Glide.with(mContext).load(videoMessage.getCnVideoMessage().getSnapshotPath()).into(video_snapshot); | |
| 384 | - break; | |
| 385 | - case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 386 | - if (status != null) | |
| 387 | - status.setText("发送成功"); | |
| 388 | - if (uploadProgress != null) | |
| 389 | - uploadProgress.setVisibility(View.GONE); | |
| 390 | - sendSuccess(videoMessage); | |
| 391 | - break; | |
| 392 | - } | |
| 393 | - } | |
| 394 | - | |
| 395 | - private void sendSuccess(final VideoMessage videoMessage) { | |
| 396 | - videoLayout.setOnClickListener(new View.OnClickListener() { | |
| 397 | - @Override | |
| 398 | - public void onClick(View v) { | |
| 399 | - if (mItemClickListener != null) | |
| 400 | - mItemClickListener.onVideoClick(videoMessage); | |
| 401 | - } | |
| 402 | - }); | |
| 403 | - if (videoMessage.getCnVideoMessage().isSelf()) { | |
| 404 | - Glide.with(mContext).load(videoMessage.getCnVideoMessage().getSnapshotPath()).into(video_snapshot); | |
| 405 | - } else { | |
| 406 | - String snapshotUuid = videoMessage.getCnVideoMessage().getSnapshot().getUuid(); | |
| 407 | - final String imagePath = FileUtil.getCacheFilePath(snapshotUuid); | |
| 408 | - if (FileUtil.isCacheFileExist(snapshotUuid)) { | |
| 409 | - if (video_snapshot != null && mContext != null) | |
| 410 | - Glide.with(mContext).load(imagePath).into(video_snapshot); | |
| 411 | - } else { | |
| 412 | - if (!videoMessage.isDownloading()) { | |
| 413 | - videoMessage.setDownloading(true); | |
| 414 | - videoMessage.getCnVideoMessage().getSnapshot().getImage(imagePath, new IChat.OnDownloadListener() { | |
| 415 | - @Override | |
| 416 | - public void onSuccess() { | |
| 417 | - videoMessage.setDownloading(false); | |
| 418 | - if (video_snapshot != null && mContext != null) | |
| 419 | - Glide.with(mContext).load(imagePath).into(video_snapshot); | |
| 420 | - } | |
| 421 | - | |
| 422 | - @Override | |
| 423 | - public void onError(int i, String s) { | |
| 424 | - videoMessage.setDownloading(false); | |
| 425 | - } | |
| 426 | - }); | |
| 427 | - } | |
| 428 | - } | |
| 429 | - } | |
| 430 | - } | |
| 431 | - } | |
| 432 | - | |
| 433 | - public class UgcVideoMessageHolder extends RecyclerView.ViewHolder { | |
| 434 | - | |
| 435 | - private TextView video_user_name; | |
| 436 | - private ImageView video_cover; | |
| 437 | - private View videoLayout; | |
| 438 | - private TextView status; | |
| 439 | - private TextView uploadProgress; | |
| 440 | - | |
| 441 | - public UgcVideoMessageHolder(View itemView) { | |
| 442 | - super(itemView); | |
| 443 | - video_user_name = (TextView) itemView.findViewById(R.id.user_name); | |
| 444 | - video_cover = (ImageView) itemView.findViewById(R.id.img_content); | |
| 445 | - videoLayout = itemView.findViewById(R.id.videoLayout); | |
| 446 | - status = (TextView) itemView.findViewById(R.id.status); | |
| 447 | - uploadProgress = (TextView) itemView.findViewById(R.id.uploadProgress); | |
| 448 | - } | |
| 449 | - | |
| 450 | - public void showMessage(final UgcVideoMessage videoMessage) { | |
| 451 | - video_user_name.setText(videoMessage.getCnUgcMessage().getUserInfo().getUserName()); | |
| 452 | - switch (videoMessage.getCnUgcMessage().getStatus()) { | |
| 453 | - case IChat.CN_MSG_STATUS_SENDING: | |
| 454 | - if (status != null) | |
| 455 | - status.setText("发送中"); | |
| 456 | - if (uploadProgress != null) { | |
| 457 | - uploadProgress.setVisibility(View.VISIBLE); | |
| 458 | - uploadProgress.setText("上传进度:" + videoMessage.getProgress() + "%"); | |
| 459 | - } | |
| 460 | - Glide.with(mContext).load(videoMessage.getCnUgcMessage().getCoverPath()).into(video_cover); | |
| 461 | - break; | |
| 462 | - case IChat.CN_MSG_STATUS_SEND_FAIL: | |
| 463 | - if (status != null) | |
| 464 | - status.setText("发送失败"); | |
| 465 | - if (uploadProgress != null) | |
| 466 | - uploadProgress.setVisibility(View.GONE); | |
| 467 | - Glide.with(mContext).load(videoMessage.getCnUgcMessage().getCoverPath()).into(video_cover); | |
| 468 | - break; | |
| 469 | - case IChat.CN_MSG_STATUS_SEND_SUCCESS: | |
| 470 | - if (status != null) | |
| 471 | - status.setText("发送成功"); | |
| 472 | - if (uploadProgress != null) | |
| 473 | - uploadProgress.setVisibility(View.GONE); | |
| 474 | - sendSuccess(videoMessage); | |
| 475 | - break; | |
| 476 | - } | |
| 477 | - } | |
| 478 | - | |
| 479 | - private void sendSuccess(final UgcVideoMessage videoMessage) { | |
| 480 | - videoLayout.setOnClickListener(new View.OnClickListener() { | |
| 481 | - @Override | |
| 482 | - public void onClick(View v) { | |
| 483 | - if (mItemClickListener != null) | |
| 484 | - mItemClickListener.onUgcVideoClick(videoMessage); | |
| 485 | - } | |
| 486 | - }); | |
| 487 | - if (videoMessage.getCnUgcMessage().isSelf()) { | |
| 488 | - Glide.with(mContext).load(videoMessage.getCnUgcMessage().getCoverPath()).into(video_cover); | |
| 489 | - } else { | |
| 490 | - String coverUuid = videoMessage.getCnUgcMessage().getFileId() + "_image"; | |
| 491 | - final String imagePath = FileUtil.getCacheFilePath(coverUuid); | |
| 492 | - if (FileUtil.isCacheFileExist(coverUuid)) { | |
| 493 | - if (video_cover != null && mContext != null) | |
| 494 | - Glide.with(mContext).load(imagePath).into(video_cover); | |
| 495 | - } else { | |
| 496 | - if (!videoMessage.isDownloading()) { | |
| 497 | - videoMessage.setDownloading(true); | |
| 498 | - videoMessage.getCnUgcMessage().getCover().getImage(imagePath, new IChat.OnDownloadListener() { | |
| 499 | - @Override | |
| 500 | - public void onSuccess() { | |
| 501 | - videoMessage.setDownloading(false); | |
| 502 | - if (video_cover != null && mContext != null) | |
| 503 | - Glide.with(mContext).load(imagePath).into(video_cover); | |
| 504 | - } | |
| 505 | - | |
| 506 | - @Override | |
| 507 | - public void onError(int i, String s) { | |
| 508 | - videoMessage.setDownloading(false); | |
| 509 | - } | |
| 510 | - }); | |
| 511 | - } | |
| 512 | - } | |
| 513 | - } | |
| 514 | 185 | } |
| 515 | 186 | } |
| 516 | 187 | ... | ... |
app/src/main/java/com/cnlive/im/adapter/base/ItemClickListener.java
| ... | ... | @@ -8,9 +8,7 @@ import com.cnlive.im.mode.VideoMessage; |
| 8 | 8 | import com.cnlive.im.mode.VoiceMessage; |
| 9 | 9 | |
| 10 | 10 | /** |
| 11 | - * @author 陈硕 | |
| 12 | - * @time 2017/7/14 17:50 | |
| 13 | - * @desc ${TODD} | |
| 11 | + * Created by gujun on 2017/12/19. | |
| 14 | 12 | */ |
| 15 | 13 | public interface ItemClickListener { |
| 16 | 14 | void onItemClick(VoiceMessage voiceMessage, AnimationDrawable animationDrawable); | ... | ... |
app/src/main/java/com/cnlive/im/adapter/base/VoiceItemClickListener.java
0 → 100644
| 1 | +package com.cnlive.im.adapter.base; | |
| 2 | + | |
| 3 | +import android.net.Uri; | |
| 4 | + | |
| 5 | +import com.cnlive.im.mode.VoiceMessage; | |
| 6 | + | |
| 7 | +/** | |
| 8 | + * @author 陈硕 | |
| 9 | + * @time 2017/7/14 17:50 | |
| 10 | + * @desc ${TODD} | |
| 11 | + */ | |
| 12 | +public interface VoiceItemClickListener { | |
| 13 | + void onItemClick(VoiceMessage voiceMessage); | |
| 14 | +} | ... | ... |
app/src/main/java/com/cnlive/im/ui/ChatRoom3Activity.java
0 → 100644
| 1 | +package com.cnlive.im.ui; | |
| 2 | + | |
| 3 | +import android.Manifest; | |
| 4 | +import android.app.Activity; | |
| 5 | +import android.content.Context; | |
| 6 | +import android.content.Intent; | |
| 7 | +import android.content.pm.PackageManager; | |
| 8 | +import android.graphics.Bitmap; | |
| 9 | +import android.graphics.drawable.AnimationDrawable; | |
| 10 | +import android.media.ThumbnailUtils; | |
| 11 | +import android.net.Uri; | |
| 12 | +import android.os.Build; | |
| 13 | +import android.os.Bundle; | |
| 14 | +import android.os.Handler; | |
| 15 | +import android.provider.MediaStore; | |
| 16 | +import android.support.annotation.NonNull; | |
| 17 | +import android.support.v4.app.ActivityCompat; | |
| 18 | +import android.support.v4.content.ContextCompat; | |
| 19 | +import android.support.v7.app.AppCompatActivity; | |
| 20 | +import android.support.v7.widget.LinearLayoutManager; | |
| 21 | +import android.support.v7.widget.RecyclerView; | |
| 22 | +import android.text.Editable; | |
| 23 | +import android.text.TextUtils; | |
| 24 | +import android.text.TextWatcher; | |
| 25 | +import android.util.Log; | |
| 26 | +import android.view.Gravity; | |
| 27 | +import android.view.MotionEvent; | |
| 28 | +import android.view.View; | |
| 29 | +import android.view.inputmethod.InputMethodManager; | |
| 30 | +import android.widget.Button; | |
| 31 | +import android.widget.EditText; | |
| 32 | +import android.widget.ImageView; | |
| 33 | +import android.widget.LinearLayout; | |
| 34 | +import android.widget.RelativeLayout; | |
| 35 | +import android.widget.TextView; | |
| 36 | +import android.widget.Toast; | |
| 37 | + | |
| 38 | +import com.cnlive.im.R; | |
| 39 | +import com.cnlive.im.adapter.ChatRoom3Adpter; | |
| 40 | +import com.cnlive.im.adapter.ChatRoomAdpter; | |
| 41 | +import com.cnlive.im.adapter.base.ItemClickListener; | |
| 42 | +import com.cnlive.im.mode.ImagMessage; | |
| 43 | +import com.cnlive.im.mode.StringMessage; | |
| 44 | +import com.cnlive.im.mode.UgcVideoMessage; | |
| 45 | +import com.cnlive.im.mode.VideoMessage; | |
| 46 | +import com.cnlive.im.mode.VoiceMessage; | |
| 47 | +import com.cnlive.im.util.AudioRecordUtil; | |
| 48 | +import com.cnlive.im.util.FileUtil; | |
| 49 | +import com.cnlive.im.util.MediaUtil; | |
| 50 | +import com.cnlive.im.util.MessageType; | |
| 51 | +import com.cnlive.im.util.TimeUtils; | |
| 52 | +import com.cnlive.im.util.UploadImageUtils; | |
| 53 | +import com.cnlive.libs.util.chat.ChatUtil; | |
| 54 | +import com.cnlive.libs.util.chat.base.IChat; | |
| 55 | +import com.cnlive.libs.util.chat.model.CNBaseMessage; | |
| 56 | +import com.cnlive.libs.util.chat.model.CNImgMessage; | |
| 57 | +import com.cnlive.libs.util.chat.model.CNMessage; | |
| 58 | +import com.cnlive.libs.util.chat.model.CNUgcMessage; | |
| 59 | +import com.cnlive.libs.util.chat.model.CNUserInfo; | |
| 60 | +import com.cnlive.libs.util.chat.model.CNVideoMessage; | |
| 61 | +import com.cnlive.libs.util.chat.model.CNVoiceMessage; | |
| 62 | + | |
| 63 | +import java.io.File; | |
| 64 | +import java.io.FileInputStream; | |
| 65 | +import java.util.ArrayList; | |
| 66 | + | |
| 67 | + | |
| 68 | +/** | |
| 69 | + * Created by gujun on 2017/12/19. | |
| 70 | + */ | |
| 71 | +public class ChatRoom3Activity extends AppCompatActivity implements View.OnClickListener, ItemClickListener { | |
| 72 | + private static final String TAG = "ChatRoomActivity"; | |
| 73 | + | |
| 74 | + private final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 0x2001; | |
| 75 | + | |
| 76 | + private ArrayList<String> msgIds = new ArrayList<>(); | |
| 77 | + private String roomIdOne = "ChatRoom10"; | |
| 78 | + private EditText editText; | |
| 79 | + private Button send_messageOneBtn; | |
| 80 | + private RecyclerView listViewOne; | |
| 81 | + private ChatRoom3Adpter chatListAdapterOne; | |
| 82 | + private Button foundChatBtn; | |
| 83 | + private Handler mHandler; | |
| 84 | + private RelativeLayout re_chat; | |
| 85 | + private Button exit_chat1; | |
| 86 | + public static String user_name_string; | |
| 87 | + private ImageView ima_send; | |
| 88 | + private Button sendVoice; | |
| 89 | + | |
| 90 | + private Context context; | |
| 91 | + private AudioRecordUtil mAudioRecordUtil; | |
| 92 | + private PopupWindowFactory mPop; | |
| 93 | + private ImageView mImageView; | |
| 94 | + private TextView mTextView; | |
| 95 | + private ImageView keybordBtn; | |
| 96 | + | |
| 97 | + private LinearLayout sendMsgLayout; | |
| 98 | + private LinearLayout cancelSendLayout; | |
| 99 | + | |
| 100 | + private boolean isVoiceBtnVisible = false; | |
| 101 | + | |
| 102 | + | |
| 103 | + public static final int IMG_FROM_PICTURE = 0x1001; | |
| 104 | + public static final int PICTURE_REQUEST_CODE = 0x1003; | |
| 105 | + public static final int VOICE_REQUEST_CODE = 0x1004; | |
| 106 | + int duration; | |
| 107 | + | |
| 108 | + private String mFilePath; | |
| 109 | + | |
| 110 | + // 所需的全部权限 | |
| 111 | + static final String[] PERMISSIONS = new String[]{ | |
| 112 | + Manifest.permission.RECORD_AUDIO, | |
| 113 | + Manifest.permission.WRITE_EXTERNAL_STORAGE | |
| 114 | + }; | |
| 115 | + | |
| 116 | + @Override | |
| 117 | + protected void onCreate(Bundle savedInstanceState) { | |
| 118 | + super.onCreate(savedInstanceState); | |
| 119 | + //取消状态栏 | |
| 120 | + setContentView(R.layout.activity_groupchat_3); | |
| 121 | + context = this; | |
| 122 | + initUI(); | |
| 123 | + mAudioRecordUtil = new AudioRecordUtil(); | |
| 124 | + mAudioRecordUtil.setOnAudioStatusUpdateListener(onAudioStatusUpdateListener); | |
| 125 | + //设置监听 | |
| 126 | + mHandler = new Handler(); | |
| 127 | + ChatUtil.setOnConnectStatusListener(connectStatusListener); | |
| 128 | + ChatUtil.setOnChatRoomActionListener(chatRoomActionListener); | |
| 129 | + ChatUtil.setOnReceiveChatroomMessageListener(receiveMessageListener); | |
| 130 | + ChatUtil.setUploadProgressListener(uploadProgressListener); | |
| 131 | + ChatUtil.setKickedOfflineListener(onKickedOfflineListener); | |
| 132 | + Intent intent = getIntent(); | |
| 133 | + user_name_string = intent.getStringExtra("user_name_string"); | |
| 134 | + String user_id_string = intent.getStringExtra("user_id_string"); | |
| 135 | + if (user_name_string != null) | |
| 136 | + ChatUtil.login(new CNUserInfo(user_id_string, user_name_string, ""), connectListener); | |
| 137 | + else ChatUtil.logOut(connectListener); | |
| 138 | + requestPermission(); | |
| 139 | + | |
| 140 | + } | |
| 141 | + | |
| 142 | + | |
| 143 | + private void initUI() { | |
| 144 | + | |
| 145 | + final View view = View.inflate(this, R.layout.layout_microphone, null); | |
| 146 | + mPop = new PopupWindowFactory(this, view); | |
| 147 | + mImageView = (ImageView) view.findViewById(R.id.iv_recording_icon); | |
| 148 | + mTextView = (TextView) view.findViewById(R.id.tv_recording_time); | |
| 149 | + sendMsgLayout = (LinearLayout) view.findViewById(R.id.send_layout); | |
| 150 | + cancelSendLayout = (LinearLayout) view.findViewById(R.id.cancel_send_layout); | |
| 151 | + ima_send = (ImageView) findViewById(R.id.ima_send); | |
| 152 | + exit_chat1 = (Button) findViewById(R.id.exit_chat1); | |
| 153 | +// user_id = (EditText) findViewById(R.id.user_ID); | |
| 154 | +// user_name = (EditText) findViewById(R.id.user_name); | |
| 155 | +// lin_user = (LinearLayout) findViewById(R.id.lin_user); | |
| 156 | + re_chat = (RelativeLayout) findViewById(R.id.re_chat); | |
| 157 | + foundChatBtn = (Button) findViewById(R.id.creatChat); | |
| 158 | + listViewOne = (RecyclerView) findViewById(R.id.chat_list_viewOne); | |
| 159 | + editText = (EditText) findViewById(R.id.message_content); | |
| 160 | + editText.addTextChangedListener(textWatcher); | |
| 161 | + send_messageOneBtn = (Button) findViewById(R.id.send_messageOne); | |
| 162 | + ima_send.setOnClickListener(this); | |
| 163 | + exit_chat1.setOnClickListener(this); | |
| 164 | + foundChatBtn.setOnClickListener(this); | |
| 165 | + send_messageOneBtn.setOnClickListener(this); | |
| 166 | + chatListAdapterOne = new ChatRoom3Adpter(ChatRoom3Activity.this, false); | |
| 167 | + chatListAdapterOne.setonVoiceItemClickListener(this); | |
| 168 | + listViewOne.setLayoutManager(new LinearLayoutManager(ChatRoom3Activity.this)); | |
| 169 | + listViewOne.setAdapter(chatListAdapterOne); | |
| 170 | + | |
| 171 | + sendVoice = (Button) findViewById(R.id.send_voice); | |
| 172 | + re_chat = (RelativeLayout) findViewById(R.id.activity_chat_room); | |
| 173 | + keybordBtn = (ImageView) findViewById(R.id.keybord); | |
| 174 | + keybordBtn.setOnClickListener(this); | |
| 175 | + | |
| 176 | + findViewById(R.id.videoBtn).setOnClickListener(this); | |
| 177 | + findViewById(R.id.ugcVideoBtn).setOnClickListener(this); | |
| 178 | + | |
| 179 | + | |
| 180 | + StartListener(); | |
| 181 | + | |
| 182 | + | |
| 183 | + } | |
| 184 | + | |
| 185 | + | |
| 186 | + /** | |
| 187 | + * 发送消息监听 | |
| 188 | + */ | |
| 189 | + private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() { | |
| 190 | + @Override | |
| 191 | + public void onAttached(CNBaseMessage o) { | |
| 192 | + showMessage(o); | |
| 193 | + } | |
| 194 | + | |
| 195 | + @Override | |
| 196 | + public void onSuccess(final CNBaseMessage o) { | |
| 197 | + updateItem(o, -1); | |
| 198 | + } | |
| 199 | + | |
| 200 | + @Override | |
| 201 | + public void onError(CNBaseMessage o, int i, String s) { | |
| 202 | + updateItem(o, -1); | |
| 203 | + } | |
| 204 | + }; | |
| 205 | + | |
| 206 | + //连接状态监听 | |
| 207 | + private IChat.OnConnectStatusListener connectStatusListener = new IChat.OnConnectStatusListener() { | |
| 208 | + @Override | |
| 209 | + public void onConnectStatus(int i, String s) { | |
| 210 | + Log.i(TAG, "连接状态监听" + i + " " + s); | |
| 211 | + } | |
| 212 | + }; | |
| 213 | + | |
| 214 | + | |
| 215 | + private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() { | |
| 216 | + @Override | |
| 217 | + public void processMessage(final CNBaseMessage o) { | |
| 218 | + if (!o.getTargetId().equals(roomIdOne)) return; | |
| 219 | + showMessage(o); | |
| 220 | + } | |
| 221 | + }; | |
| 222 | + | |
| 223 | + private IChat.OnUploadProgressListener uploadProgressListener = new IChat.OnUploadProgressListener() { | |
| 224 | + @Override | |
| 225 | + public void onMessagesUpdate(CNBaseMessage message, int elemIdx, int taskId, int progress) { | |
| 226 | + if (!message.getTargetId().equals(roomIdOne)) return; | |
| 227 | + updateItem(message, progress); | |
| 228 | + } | |
| 229 | + }; | |
| 230 | + | |
| 231 | + | |
| 232 | + /** | |
| 233 | + * 更新消息 | |
| 234 | + */ | |
| 235 | + public void updateItem(CNBaseMessage o, int progress) { | |
| 236 | + int updateIndex = msgIds.indexOf(o.getMessageId()); | |
| 237 | + if (updateIndex < 0 || chatListAdapterOne.getItemCount() <= 0 || updateIndex > chatListAdapterOne.getItemCount() - 1) | |
| 238 | + return; | |
| 239 | + if (o.getMsgType() == IChat.CN_MSG_TYPE_TEXT) { | |
| 240 | + CNMessage o1 = (CNMessage) o; | |
| 241 | + chatListAdapterOne.updateItem(new StringMessage(MessageType.stringMessage, o1, o1.isSelf()), updateIndex); | |
| 242 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_IMAGE) { | |
| 243 | + CNImgMessage o1 = (CNImgMessage) o; | |
| 244 | + chatListAdapterOne.updateItem(new ImagMessage(MessageType.imaMessage, o1, o1.isSelf(), progress < 0 ? 0 : progress), updateIndex); | |
| 245 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VOICE) { | |
| 246 | + CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 247 | + VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, o1.isSelf(), progress < 0 ? 0 : progress); | |
| 248 | + chatListAdapterOne.updateItem(voiceMessage, updateIndex); | |
| 249 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VIDEO) { | |
| 250 | + CNVideoMessage ol = (CNVideoMessage) o; | |
| 251 | + VideoMessage videoMessage = new VideoMessage(MessageType.videoMessage, ol, ol.isSelf(), progress < 0 ? 0 : progress); | |
| 252 | + chatListAdapterOne.updateItem(videoMessage, updateIndex); | |
| 253 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_UGC) { | |
| 254 | + CNUgcMessage ol = (CNUgcMessage) o; | |
| 255 | + UgcVideoMessage ugcVideoMessage = new UgcVideoMessage(MessageType.ugcVideoMessage, ol, ol.isSelf(), progress < 0 ? 0 : progress); | |
| 256 | + chatListAdapterOne.updateItem(ugcVideoMessage, updateIndex); | |
| 257 | + } | |
| 258 | + } | |
| 259 | + | |
| 260 | + /** | |
| 261 | + * 展示消息 | |
| 262 | + * | |
| 263 | + * @param o | |
| 264 | + */ | |
| 265 | + private void showMessage(CNBaseMessage o) { | |
| 266 | + msgIds.add(o.getMessageId()); | |
| 267 | + if (o.getMsgType() == IChat.CN_MSG_TYPE_TEXT) { | |
| 268 | + CNMessage o1 = (CNMessage) o; | |
| 269 | + chatListAdapterOne.addItem(new StringMessage(MessageType.stringMessage, o1, o1.isSelf())); | |
| 270 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_IMAGE) { | |
| 271 | + CNImgMessage o1 = (CNImgMessage) o; | |
| 272 | + chatListAdapterOne.addItem(new ImagMessage(MessageType.imaMessage, o1, o1.isSelf())); | |
| 273 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VOICE) { | |
| 274 | + CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 275 | + VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, o1.isSelf()); | |
| 276 | + chatListAdapterOne.addItem(voiceMessage); | |
| 277 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VIDEO) { | |
| 278 | + CNVideoMessage o1 = (CNVideoMessage) o; | |
| 279 | + VideoMessage videoMessage = new VideoMessage(MessageType.videoMessage, o1, o1.isSelf()); | |
| 280 | + chatListAdapterOne.addItem(videoMessage); | |
| 281 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_UGC) { | |
| 282 | + CNUgcMessage o1 = (CNUgcMessage) o; | |
| 283 | + UgcVideoMessage ugcVideoMessage = new UgcVideoMessage(MessageType.ugcVideoMessage, o1, o1.isSelf()); | |
| 284 | + chatListAdapterOne.addItem(ugcVideoMessage); | |
| 285 | + } | |
| 286 | + if (chatListAdapterOne.getItemCount() > 0) | |
| 287 | + listViewOne.smoothScrollToPosition(chatListAdapterOne.getItemCount() - 1); | |
| 288 | + } | |
| 289 | + | |
| 290 | + | |
| 291 | + //聊天室操作 | |
| 292 | + private IChat.OnChatRoomActionListener chatRoomActionListener = new IChat.OnChatRoomActionListener() { | |
| 293 | + @Override | |
| 294 | + public void onJoining(String s) { | |
| 295 | + Log.i(TAG, "chatRoomActionListener" + " onJoining" + s); | |
| 296 | + } | |
| 297 | + | |
| 298 | + @Override | |
| 299 | + public void onJoined(String s) { | |
| 300 | + Log.i(TAG, "chatRoomActionListener " + "onJoined" + s); | |
| 301 | + } | |
| 302 | + | |
| 303 | + @Override | |
| 304 | + public void onQuited(String s) { | |
| 305 | + Log.i(TAG, "chatRoomActionListener " + "onQuited" + s); | |
| 306 | + } | |
| 307 | + | |
| 308 | + @Override | |
| 309 | + public void onError(String s, int i, String s1) { | |
| 310 | + Log.i(TAG, "chatRoomActionListener " + "onError" + s); | |
| 311 | + | |
| 312 | + } | |
| 313 | + }; | |
| 314 | + | |
| 315 | + //被踢下线状态 | |
| 316 | + private IChat.OnKickedOfflineListener onKickedOfflineListener = new IChat.OnKickedOfflineListener() { | |
| 317 | + @Override | |
| 318 | + public void disconnected(int what, final String extra) { | |
| 319 | + Log.e(TAG, what + " : " + extra); | |
| 320 | + mHandler.post(new Runnable() { | |
| 321 | + @Override | |
| 322 | + public void run() { | |
| 323 | + Toast.makeText(ChatRoom3Activity.this, extra, Toast.LENGTH_SHORT).show(); | |
| 324 | + } | |
| 325 | + }); | |
| 326 | + } | |
| 327 | + | |
| 328 | + @Override | |
| 329 | + public void conByDevId(final int what, final String extra) { | |
| 330 | + Log.e(TAG, what + " : " + extra); | |
| 331 | + mHandler.post(new Runnable() { | |
| 332 | + @Override | |
| 333 | + public void run() { | |
| 334 | + Toast.makeText(ChatRoom3Activity.this, extra, Toast.LENGTH_SHORT).show(); | |
| 335 | + | |
| 336 | + } | |
| 337 | + }); | |
| 338 | + } | |
| 339 | + }; | |
| 340 | + | |
| 341 | + | |
| 342 | + // 加入聊天室监听 | |
| 343 | + private IChat.OnOperationListener onOperationListener = new IChat.OnOperationListener() { | |
| 344 | + @Override | |
| 345 | + public void onSuccess(int what, final String extra) { | |
| 346 | + Log.v(TAG, +what + extra); | |
| 347 | + | |
| 348 | + | |
| 349 | + } | |
| 350 | + | |
| 351 | + @Override | |
| 352 | + public void onError(int what, String extra) { | |
| 353 | + Log.v(TAG, "加入聊天室" + what + extra); | |
| 354 | + | |
| 355 | + } | |
| 356 | + }; | |
| 357 | + | |
| 358 | + @Override | |
| 359 | + public void onClick(View view) { | |
| 360 | + switch (view.getId()) { | |
| 361 | + //向聊天室1发送消息 | |
| 362 | + case R.id.send_messageOne: | |
| 363 | + //发送聊天室消息 | |
| 364 | + if (editText.getText().toString().isEmpty()) { | |
| 365 | + Toast.makeText(this, "不能发送空消息呦~", Toast.LENGTH_SHORT).show(); | |
| 366 | + } else { | |
| 367 | + ChatUtil.sendMessage(IChat.CHATROOM, roomIdOne, editText.getText().toString(), sendMessageListener); | |
| 368 | + editText.setText(""); | |
| 369 | + } | |
| 370 | + break; | |
| 371 | + case R.id.creatChat: | |
| 372 | + ChatUtil.joinChatRoom(roomIdOne, -1, onOperationListener); | |
| 373 | + break; | |
| 374 | + case R.id.exit_chat1: | |
| 375 | + ChatUtil.quitChatRoom(roomIdOne, onOperationListener); | |
| 376 | + break; | |
| 377 | + case R.id.ima_send: | |
| 378 | + fromPicture(); | |
| 379 | + break; | |
| 380 | + case R.id.keybord: | |
| 381 | + if (!isVoiceBtnVisible) { | |
| 382 | + editText.setVisibility(View.GONE); | |
| 383 | + sendVoice.setVisibility(View.VISIBLE); | |
| 384 | + keybordBtn.setImageResource(R.drawable.keybord); | |
| 385 | + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); | |
| 386 | + imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); | |
| 387 | + isVoiceBtnVisible = true; | |
| 388 | + } else { | |
| 389 | + sendVoice.setVisibility(View.GONE); | |
| 390 | + editText.setVisibility(View.VISIBLE); | |
| 391 | + keybordBtn.setImageResource(R.drawable.voice); | |
| 392 | + isVoiceBtnVisible = false; | |
| 393 | + } | |
| 394 | + break; | |
| 395 | + case R.id.videoBtn: | |
| 396 | + openSystemRecorder(); | |
| 397 | + break; | |
| 398 | + case R.id.ugcVideoBtn: | |
| 399 | + openSystemRecorder(); | |
| 400 | + break; | |
| 401 | + } | |
| 402 | + } | |
| 403 | + | |
| 404 | + private void openSystemRecorder() { | |
| 405 | + // 创建拍照Intent并将控制权返回给调用的程序 | |
| 406 | + Intent intent = new Intent(); | |
| 407 | + intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE); | |
| 408 | + intent.addCategory(Intent.CATEGORY_DEFAULT); | |
| 409 | + | |
| 410 | + // 保存录像到指定的路径 | |
| 411 | + File file = new File("/sdcard/video.mp4"); | |
| 412 | + Uri uri = Uri.fromFile(file); | |
| 413 | + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); | |
| 414 | + | |
| 415 | + // 启动图像捕获Intent | |
| 416 | + startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE); | |
| 417 | + } | |
| 418 | + | |
| 419 | + | |
| 420 | + public void fromPicture() { | |
| 421 | + if (Build.VERSION.SDK_INT >= 23) { | |
| 422 | + int checkCallPhonePermission = ContextCompat.checkSelfPermission(ChatRoom3Activity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE); | |
| 423 | + if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) { | |
| 424 | + requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PICTURE_REQUEST_CODE); | |
| 425 | + return; | |
| 426 | + } else { | |
| 427 | + toIntentPicture(); | |
| 428 | + } | |
| 429 | + } else { | |
| 430 | + toIntentPicture(); | |
| 431 | + } | |
| 432 | + } | |
| 433 | + | |
| 434 | + | |
| 435 | + private void toIntentPicture() { | |
| 436 | + Intent intent = new Intent(); | |
| 437 | + intent.setType("image/*"); | |
| 438 | + intent.setAction(Intent.ACTION_PICK); | |
| 439 | + startActivityForResult(Intent.createChooser(intent, "Complete action using"), IMG_FROM_PICTURE); | |
| 440 | + } | |
| 441 | + | |
| 442 | + | |
| 443 | + @Override | |
| 444 | + public void onActivityResult(int requestCode, int resultCode, Intent data) { | |
| 445 | + super.onActivityResult(requestCode, resultCode, data); | |
| 446 | + if (resultCode == Activity.RESULT_OK) { | |
| 447 | + switch (requestCode) { | |
| 448 | + case IMG_FROM_PICTURE: | |
| 449 | + Uri selectedImage = data.getData(); | |
| 450 | + String picturePath = UploadImageUtils.getPath(this, selectedImage); | |
| 451 | + Uri uri = Uri.parse("file://" + picturePath); | |
| 452 | + ChatUtil.sendImaMessage(IChat.CHATROOM, roomIdOne, uri, uri, sendMessageListener); | |
| 453 | + break; | |
| 454 | + case CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE: | |
| 455 | + String videoPath = data.getData().getPath(); | |
| 456 | + Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.FULL_SCREEN_KIND); | |
| 457 | + String imgPath = FileUtil.createFile(bitmap, System.currentTimeMillis() + ""); | |
| 458 | + ChatUtil.sendVideoMessage(IChat.CHATROOM, roomIdOne, videoPath, imgPath, MediaUtil.getInstance().getDuration(videoPath), sendMessageListener); | |
| 459 | + break; | |
| 460 | + default: | |
| 461 | + break; | |
| 462 | + } | |
| 463 | + } | |
| 464 | + } | |
| 465 | + | |
| 466 | + | |
| 467 | + private IChat.OnConnectListener connectListener = new IChat.OnConnectListener() { | |
| 468 | + | |
| 469 | + | |
| 470 | + @Override | |
| 471 | + public void onTokenIncorrect(String s) { | |
| 472 | + Log.e(TAG, "ConnectListener TokenIncorrect"); | |
| 473 | + | |
| 474 | + } | |
| 475 | + | |
| 476 | + @Override | |
| 477 | + public void onSuccess(final String s) { | |
| 478 | + Log.e(TAG, "ConnectListener 连接监听" + s); | |
| 479 | + | |
| 480 | + } | |
| 481 | + | |
| 482 | + @Override | |
| 483 | + public void onError(int i, final String s) { | |
| 484 | + Log.e(TAG, "ConnectListener errorCode : " + i + " : errorMessage : " + s); | |
| 485 | + | |
| 486 | + | |
| 487 | + } | |
| 488 | + }; | |
| 489 | + | |
| 490 | + /** | |
| 491 | + * 播放语音文件 | |
| 492 | + * | |
| 493 | + * @param voicePath | |
| 494 | + * @param animationDrawable | |
| 495 | + */ | |
| 496 | + private void startVoice(String voicePath, final AnimationDrawable animationDrawable) { | |
| 497 | + try { | |
| 498 | + FileInputStream fis = new FileInputStream(voicePath); | |
| 499 | + MediaUtil.getInstance().play(fis); | |
| 500 | + animationDrawable.start(); | |
| 501 | + MediaUtil.getInstance().setEventListener(new MediaUtil.EventListener() { | |
| 502 | + @Override | |
| 503 | + public void onStop() { | |
| 504 | + animationDrawable.stop(); | |
| 505 | + animationDrawable.selectDrawable(0); | |
| 506 | + } | |
| 507 | + }); | |
| 508 | + } catch (Exception e) { | |
| 509 | + } | |
| 510 | + } | |
| 511 | + | |
| 512 | + @Override | |
| 513 | + public void onItemClick(final VoiceMessage voiceMessage, final AnimationDrawable animationDrawable) { | |
| 514 | + if (voiceMessage == null) { | |
| 515 | + Toast.makeText(this, "数据异常", Toast.LENGTH_LONG).show(); | |
| 516 | + return; | |
| 517 | + } | |
| 518 | + if (voiceMessage.getCnVoiceMessage().isSelf()) { | |
| 519 | + startVoice(voiceMessage.getCnVoiceMessage().getVoiceUri().getPath(), animationDrawable); | |
| 520 | + } else { | |
| 521 | + //设置本地已读 | |
| 522 | + voiceMessage.getCnVoiceMessage().setRead(true); | |
| 523 | + String voiceUuid = voiceMessage.getCnVoiceMessage().getUuid(); | |
| 524 | + final String voicePath = FileUtil.getCacheFilePath(voiceUuid); | |
| 525 | + if (FileUtil.isCacheFileExist(voiceUuid)) { | |
| 526 | + File file = new File(voicePath); | |
| 527 | + if (file.length() < voiceMessage.getCnVoiceMessage().getDataSize()) { | |
| 528 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 529 | + return; | |
| 530 | + } | |
| 531 | + startVoice(voicePath, animationDrawable); | |
| 532 | + } else { | |
| 533 | + if (voiceMessage.isDownloading()) { | |
| 534 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 535 | + } else { | |
| 536 | + voiceMessage.setDownloading(true); | |
| 537 | + voiceMessage.getCnVoiceMessage().getVoice(voicePath, new IChat.OnDownloadListener() { | |
| 538 | + @Override | |
| 539 | + public void onSuccess() { | |
| 540 | + voiceMessage.setDownloading(false); | |
| 541 | + startVoice(voicePath, animationDrawable); | |
| 542 | + } | |
| 543 | + | |
| 544 | + @Override | |
| 545 | + public void onError(int i, String s) { | |
| 546 | + voiceMessage.setDownloading(false); | |
| 547 | + } | |
| 548 | + }); | |
| 549 | + } | |
| 550 | + } | |
| 551 | + } | |
| 552 | + } | |
| 553 | + | |
| 554 | + @Override | |
| 555 | + public void onVideoClick(final VideoMessage videoMessage) { | |
| 556 | + if (videoMessage.getCnVideoMessage().isSelf()) { | |
| 557 | + Intent intent = new Intent(ChatRoom3Activity.this, VideoActivity.class); | |
| 558 | + intent.putExtra("videoPath", videoMessage.getCnVideoMessage().getVideoPath()); | |
| 559 | + startActivity(intent); | |
| 560 | + } else { | |
| 561 | + String videoUuid = videoMessage.getCnVideoMessage().getVideo().getUuid(); | |
| 562 | + final String videoPath = FileUtil.getCacheFilePath(videoUuid); | |
| 563 | + if (FileUtil.isCacheFileExist(videoUuid)) { | |
| 564 | + File file = new File(videoPath); | |
| 565 | + if (file.length() < videoMessage.getCnVideoMessage().getVideo().getSize()) { | |
| 566 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 567 | + return; | |
| 568 | + } | |
| 569 | + Intent intent = new Intent(ChatRoom3Activity.this, VideoActivity.class); | |
| 570 | + intent.putExtra("videoPath", videoPath); | |
| 571 | + startActivity(intent); | |
| 572 | + } else { | |
| 573 | + if (videoMessage.isDownloading()) { | |
| 574 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 575 | + } else { | |
| 576 | + videoMessage.setDownloading(true); | |
| 577 | + videoMessage.getCnVideoMessage().getVideo().getVideo(videoPath, new IChat.OnDownloadListener() { | |
| 578 | + @Override | |
| 579 | + public void onSuccess() { | |
| 580 | + videoMessage.setDownloading(false); | |
| 581 | + Intent intent = new Intent(ChatRoom3Activity.this, VideoActivity.class); | |
| 582 | + intent.putExtra("videoPath", videoPath); | |
| 583 | + startActivity(intent); | |
| 584 | + } | |
| 585 | + | |
| 586 | + @Override | |
| 587 | + public void onError(int i, String s) { | |
| 588 | + videoMessage.setDownloading(false); | |
| 589 | + } | |
| 590 | + }); | |
| 591 | + } | |
| 592 | + } | |
| 593 | + } | |
| 594 | + | |
| 595 | + } | |
| 596 | + | |
| 597 | + @Override | |
| 598 | + public void onUgcVideoClick(final UgcVideoMessage ugcVideoMessage) { | |
| 599 | + if (ugcVideoMessage.getCnUgcMessage().isSelf()) { | |
| 600 | + Intent intent = new Intent(ChatRoom3Activity.this, VideoActivity.class); | |
| 601 | + intent.putExtra("videoPath", ugcVideoMessage.getCnUgcMessage().getVideoPath()); | |
| 602 | + startActivity(intent); | |
| 603 | + } else { | |
| 604 | + String videoUuid = ugcVideoMessage.getCnUgcMessage().getFileId() + "_video"; | |
| 605 | + final String videoPath = FileUtil.getCacheFilePath(videoUuid); | |
| 606 | + if (FileUtil.isCacheFileExist(videoUuid)) { | |
| 607 | + File file = new File(videoPath); | |
| 608 | + if (file.length() < ugcVideoMessage.getCnUgcMessage().getVideo().getSize()) { | |
| 609 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 610 | + return; | |
| 611 | + } | |
| 612 | + Intent intent = new Intent(ChatRoom3Activity.this, VideoActivity.class); | |
| 613 | + intent.putExtra("videoPath", videoPath); | |
| 614 | + startActivity(intent); | |
| 615 | + } else { | |
| 616 | + if (ugcVideoMessage.isDownloading()) { | |
| 617 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 618 | + } else { | |
| 619 | + ugcVideoMessage.setDownloading(true); | |
| 620 | + ugcVideoMessage.getCnUgcMessage().getVideo().getVideo(videoPath, new IChat.OnDownloadListener() { | |
| 621 | + @Override | |
| 622 | + public void onSuccess() { | |
| 623 | + ugcVideoMessage.setDownloading(false); | |
| 624 | + Intent intent = new Intent(ChatRoom3Activity.this, VideoActivity.class); | |
| 625 | + intent.putExtra("videoPath", videoPath); | |
| 626 | + startActivity(intent); | |
| 627 | + } | |
| 628 | + | |
| 629 | + @Override | |
| 630 | + public void onError(int i, String s) { | |
| 631 | + ugcVideoMessage.setDownloading(false); | |
| 632 | + } | |
| 633 | + }); | |
| 634 | + } | |
| 635 | + } | |
| 636 | + } | |
| 637 | + } | |
| 638 | + | |
| 639 | + @Override | |
| 640 | + public void onImageClick(final ImagMessage imagMessage) { | |
| 641 | + if (imagMessage.getCnImgMessage().isSelf()) { | |
| 642 | + Intent intent = new Intent(ChatRoom3Activity.this, ImageViewActivity.class); | |
| 643 | + intent.putExtra("path", imagMessage.getCnImgMessage().getImagePath()); | |
| 644 | + startActivity(intent); | |
| 645 | + } else { | |
| 646 | + String remoteUuid = imagMessage.getCnImgMessage().getRemoteUuid(); | |
| 647 | + final String imagePath = FileUtil.getCacheFilePath(remoteUuid); | |
| 648 | + if (FileUtil.isCacheFileExist(remoteUuid)) { | |
| 649 | + File file = new File(imagePath); | |
| 650 | + if (file.length() < imagMessage.getCnImgMessage().getRemoteSize()) { | |
| 651 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 652 | + return; | |
| 653 | + } | |
| 654 | + Intent intent = new Intent(ChatRoom3Activity.this, ImageViewActivity.class); | |
| 655 | + intent.putExtra("path", imagePath); | |
| 656 | + startActivity(intent); | |
| 657 | + } else { | |
| 658 | + if (imagMessage.isDownloading()) { | |
| 659 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 660 | + } else { | |
| 661 | + imagMessage.setDownloading(true); | |
| 662 | + imagMessage.getCnImgMessage().getRemoteImage(imagePath, new IChat.OnDownloadListener() { | |
| 663 | + @Override | |
| 664 | + public void onSuccess() { | |
| 665 | + imagMessage.setDownloading(false); | |
| 666 | + Intent intent = new Intent(ChatRoom3Activity.this, ImageViewActivity.class); | |
| 667 | + intent.putExtra("path", imagePath); | |
| 668 | + startActivity(intent); | |
| 669 | + } | |
| 670 | + | |
| 671 | + @Override | |
| 672 | + public void onError(int i, String s) { | |
| 673 | + imagMessage.setDownloading(false); | |
| 674 | + Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show(); | |
| 675 | + } | |
| 676 | + }); | |
| 677 | + } | |
| 678 | + } | |
| 679 | + } | |
| 680 | + } | |
| 681 | + | |
| 682 | + | |
| 683 | + /**************************************************************************/ | |
| 684 | + | |
| 685 | + /** | |
| 686 | + * 开启扫描之前判断权限是否打开 | |
| 687 | + */ | |
| 688 | + private void requestPermission() { | |
| 689 | + //判断是否开启摄像头权限 | |
| 690 | + if ((ContextCompat.checkSelfPermission(context, | |
| 691 | + Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) && | |
| 692 | + (ContextCompat.checkSelfPermission(context, | |
| 693 | + Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) | |
| 694 | + && (ContextCompat.checkSelfPermission(context, | |
| 695 | + Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) { | |
| 696 | + StartListener(); | |
| 697 | + | |
| 698 | + //判断是否开启语音权限 | |
| 699 | + } else { | |
| 700 | + //请求获取摄像头权限 | |
| 701 | + ActivityCompat.requestPermissions((Activity) context, | |
| 702 | + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA}, VOICE_REQUEST_CODE); | |
| 703 | + } | |
| 704 | + } | |
| 705 | + | |
| 706 | + @Override | |
| 707 | + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |
| 708 | + super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |
| 709 | + if (requestCode == VOICE_REQUEST_CODE) { | |
| 710 | + if ((grantResults[0] == PackageManager.PERMISSION_GRANTED) && (grantResults[1] == PackageManager.PERMISSION_GRANTED)) { | |
| 711 | + StartListener(); | |
| 712 | + } else { | |
| 713 | + Toast.makeText(context, "已拒绝权限!", Toast.LENGTH_SHORT).show(); | |
| 714 | + } | |
| 715 | + } | |
| 716 | + } | |
| 717 | + | |
| 718 | + float downX; | |
| 719 | + float downY; | |
| 720 | + | |
| 721 | + public void StartListener() { | |
| 722 | + | |
| 723 | + //Button的touch监听 | |
| 724 | + sendVoice.setOnTouchListener(new View.OnTouchListener() { | |
| 725 | + @Override | |
| 726 | + public boolean onTouch(View v, MotionEvent event) { | |
| 727 | + if (lacksPermissions(PERMISSIONS)) { | |
| 728 | + if (lacksPermission(PERMISSIONS[0])) { | |
| 729 | + Toast.makeText(ChatRoom3Activity.this, "没有麦克风权限,请前往“设置 - 应用 - 权限”中开启权限", Toast.LENGTH_SHORT).show(); | |
| 730 | + | |
| 731 | + } else if (lacksPermission(PERMISSIONS[1])) { | |
| 732 | + Toast.makeText(ChatRoom3Activity.this, "没有文件读写权限,请前往“设置 - 应用 - 权限”中开启权限", Toast.LENGTH_SHORT).show(); | |
| 733 | + | |
| 734 | + } | |
| 735 | + } else { | |
| 736 | + | |
| 737 | + switch (event.getAction()) { | |
| 738 | + | |
| 739 | + case MotionEvent.ACTION_DOWN: | |
| 740 | + mPop.showAtLocation(re_chat, Gravity.CENTER, 0, 0); | |
| 741 | + | |
| 742 | + sendVoice.setText("松开发送"); | |
| 743 | + mAudioRecordUtil.startRecord(); | |
| 744 | + downX = event.getX(); | |
| 745 | + downY = event.getY(); | |
| 746 | + | |
| 747 | + break; | |
| 748 | + | |
| 749 | + case MotionEvent.ACTION_UP: | |
| 750 | + | |
| 751 | + if (cancelSendLayout.getVisibility() == View.VISIBLE) { | |
| 752 | + cancelSendLayout.setVisibility(View.GONE); | |
| 753 | + sendMsgLayout.setVisibility(View.VISIBLE); | |
| 754 | + } | |
| 755 | + float moveX = Math.abs(event.getX() - downX); | |
| 756 | + float moveY = Math.abs(event.getY() - downY); | |
| 757 | + if (moveY > 100) { | |
| 758 | +// Toast.makeText(ChatRoomActivity.this, "cancel", Toast.LENGTH_SHORT).show(); | |
| 759 | + mAudioRecordUtil.cancelRecord(); | |
| 760 | + } else { | |
| 761 | + mAudioRecordUtil.stopRecord(); //结束录音(保存录音文件) | |
| 762 | + } | |
| 763 | + mPop.dismiss(); | |
| 764 | + mTextView.setText("00:00"); | |
| 765 | + sendVoice.setText("按住说话"); | |
| 766 | + break; | |
| 767 | + case MotionEvent.ACTION_MOVE: | |
| 768 | + float moveXm = Math.abs(event.getX() - downX); | |
| 769 | + float moveYm = Math.abs(event.getY() - downY); | |
| 770 | + if (moveYm > 100) { | |
| 771 | +// Toast.makeText(ChatRoomActivity.this, "cancel", Toast.LENGTH_SHORT).show(); | |
| 772 | + if (sendMsgLayout.getVisibility() == View.VISIBLE) { | |
| 773 | + sendMsgLayout.setVisibility(View.GONE); | |
| 774 | + cancelSendLayout.setVisibility(View.VISIBLE); | |
| 775 | + } | |
| 776 | + } else { | |
| 777 | + if (cancelSendLayout.getVisibility() == View.VISIBLE) { | |
| 778 | + cancelSendLayout.setVisibility(View.GONE); | |
| 779 | + sendMsgLayout.setVisibility(View.VISIBLE); | |
| 780 | + } | |
| 781 | + } | |
| 782 | + break; | |
| 783 | + } | |
| 784 | + } | |
| 785 | + return true; | |
| 786 | + } | |
| 787 | + }); | |
| 788 | + | |
| 789 | + } | |
| 790 | + | |
| 791 | + // 判断权限集合 | |
| 792 | + public boolean lacksPermissions(String... permissions) { | |
| 793 | + for (String permission : permissions) { | |
| 794 | + if (lacksPermission(permission)) { | |
| 795 | + return true; | |
| 796 | + } | |
| 797 | + } | |
| 798 | + return false; | |
| 799 | + } | |
| 800 | + | |
| 801 | + // 判断是否缺少权限 | |
| 802 | + private boolean lacksPermission(String permission) { | |
| 803 | + return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED; | |
| 804 | + } | |
| 805 | + | |
| 806 | + private AudioRecordUtil.OnAudioStatusUpdateListener onAudioStatusUpdateListener = new AudioRecordUtil.OnAudioStatusUpdateListener() { | |
| 807 | + @Override | |
| 808 | + public void onUpdate(double db, long time) { | |
| 809 | + mImageView.getDrawable().setLevel((int) (3000 + 6000 * db / 100)); | |
| 810 | + mTextView.setText(TimeUtils.long2String(time)); | |
| 811 | + } | |
| 812 | + | |
| 813 | + @Override | |
| 814 | + public void onStop(String filePath) { | |
| 815 | + duration = (int) mAudioRecordUtil.getDuration(); | |
| 816 | + mFilePath = filePath; | |
| 817 | + ChatUtil.sendVoiceMessage(IChat.CHATROOM, roomIdOne, Uri.parse(mFilePath), duration, sendMessageListener); | |
| 818 | + } | |
| 819 | + }; | |
| 820 | + | |
| 821 | + private TextWatcher textWatcher = new TextWatcher() { | |
| 822 | + @Override | |
| 823 | + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { | |
| 824 | + } | |
| 825 | + | |
| 826 | + @Override | |
| 827 | + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { | |
| 828 | + | |
| 829 | + } | |
| 830 | + | |
| 831 | + @Override | |
| 832 | + public void afterTextChanged(Editable editable) { | |
| 833 | + if (!TextUtils.isEmpty(editable)) { | |
| 834 | + ima_send.setVisibility(View.GONE); | |
| 835 | + send_messageOneBtn.setVisibility(View.VISIBLE); | |
| 836 | + } else { | |
| 837 | + send_messageOneBtn.setVisibility(View.GONE); | |
| 838 | + ima_send.setVisibility(View.VISIBLE); | |
| 839 | + } | |
| 840 | + } | |
| 841 | + }; | |
| 842 | + | |
| 843 | + @Override | |
| 844 | + protected void onPause() { | |
| 845 | + super.onPause(); | |
| 846 | + MediaUtil.getInstance().stop(); | |
| 847 | + } | |
| 848 | + | |
| 849 | + @Override | |
| 850 | + protected void onDestroy() { | |
| 851 | + super.onDestroy(); | |
| 852 | + ChatUtil.removeUploadProgressListener(uploadProgressListener); | |
| 853 | + ChatUtil.removeReceiveMessageListener(receiveMessageListener); | |
| 854 | + ChatUtil.removeConnectListener(connectListener); | |
| 855 | + ChatUtil.removeConnectStatusListener(connectStatusListener); | |
| 856 | + } | |
| 857 | + | |
| 858 | +} | ... | ... |
app/src/main/java/com/cnlive/im/ui/ChatRoomActivity.java
| ... | ... | @@ -5,14 +5,10 @@ import android.app.Activity; |
| 5 | 5 | import android.content.Context; |
| 6 | 6 | import android.content.Intent; |
| 7 | 7 | import android.content.pm.PackageManager; |
| 8 | -import android.graphics.Bitmap; | |
| 9 | -import android.graphics.drawable.AnimationDrawable; | |
| 10 | -import android.media.ThumbnailUtils; | |
| 11 | 8 | import android.net.Uri; |
| 12 | 9 | import android.os.Build; |
| 13 | 10 | import android.os.Bundle; |
| 14 | 11 | import android.os.Handler; |
| 15 | -import android.provider.MediaStore; | |
| 16 | 12 | import android.support.annotation.NonNull; |
| 17 | 13 | import android.support.v4.app.ActivityCompat; |
| 18 | 14 | import android.support.v4.content.ContextCompat; |
| ... | ... | @@ -37,16 +33,14 @@ import android.widget.Toast; |
| 37 | 33 | |
| 38 | 34 | import com.cnlive.im.R; |
| 39 | 35 | import com.cnlive.im.adapter.ChatRoomAdpter; |
| 40 | -import com.cnlive.im.adapter.base.ItemClickListener; | |
| 36 | +import com.cnlive.im.adapter.base.VoiceItemClickListener; | |
| 41 | 37 | import com.cnlive.im.mode.ImagMessage; |
| 42 | 38 | import com.cnlive.im.mode.StringMessage; |
| 43 | -import com.cnlive.im.mode.UgcVideoMessage; | |
| 44 | -import com.cnlive.im.mode.VideoMessage; | |
| 45 | 39 | import com.cnlive.im.mode.VoiceMessage; |
| 46 | 40 | import com.cnlive.im.util.AudioRecordUtil; |
| 47 | 41 | import com.cnlive.im.util.FileUtil; |
| 48 | -import com.cnlive.im.util.MediaUtil; | |
| 49 | 42 | import com.cnlive.im.util.MessageType; |
| 43 | +import com.cnlive.im.util.PlayerUtil; | |
| 50 | 44 | import com.cnlive.im.util.TimeUtils; |
| 51 | 45 | import com.cnlive.im.util.UploadImageUtils; |
| 52 | 46 | import com.cnlive.libs.util.chat.ChatUtil; |
| ... | ... | @@ -54,13 +48,9 @@ import com.cnlive.libs.util.chat.base.IChat; |
| 54 | 48 | import com.cnlive.libs.util.chat.model.CNBaseMessage; |
| 55 | 49 | import com.cnlive.libs.util.chat.model.CNImgMessage; |
| 56 | 50 | import com.cnlive.libs.util.chat.model.CNMessage; |
| 57 | -import com.cnlive.libs.util.chat.model.CNUgcMessage; | |
| 58 | 51 | import com.cnlive.libs.util.chat.model.CNUserInfo; |
| 59 | -import com.cnlive.libs.util.chat.model.CNVideoMessage; | |
| 60 | 52 | import com.cnlive.libs.util.chat.model.CNVoiceMessage; |
| 61 | 53 | |
| 62 | -import java.io.File; | |
| 63 | -import java.io.FileInputStream; | |
| 64 | 54 | import java.util.ArrayList; |
| 65 | 55 | |
| 66 | 56 | |
| ... | ... | @@ -69,13 +59,10 @@ import java.util.ArrayList; |
| 69 | 59 | * @time 2017/3/7 14:36 |
| 70 | 60 | * @desc ${TODD} |
| 71 | 61 | */ |
| 72 | -public class ChatRoomActivity extends AppCompatActivity implements View.OnClickListener, ItemClickListener { | |
| 62 | +public class ChatRoomActivity extends AppCompatActivity implements View.OnClickListener, VoiceItemClickListener { | |
| 73 | 63 | private static final String TAG = "ChatRoomActivity"; |
| 74 | - | |
| 75 | - private final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 0x2001; | |
| 76 | - | |
| 77 | - private ArrayList<String> msgIds = new ArrayList<>(); | |
| 78 | - private String roomIdOne = "ChatRoom10"; | |
| 64 | + private ArrayList<Object> groupChatOneListMy; | |
| 65 | + private String roomIdOne = "ChatRoom05"; | |
| 79 | 66 | private EditText editText; |
| 80 | 67 | private Button send_messageOneBtn; |
| 81 | 68 | private RecyclerView listViewOne; |
| ... | ... | @@ -113,6 +100,8 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 113 | 100 | |
| 114 | 101 | private String mFilePath; |
| 115 | 102 | |
| 103 | + private PlayerUtil playerUtil; | |
| 104 | + | |
| 116 | 105 | // 所需的全部权限 |
| 117 | 106 | static final String[] PERMISSIONS = new String[]{ |
| 118 | 107 | Manifest.permission.RECORD_AUDIO, |
| ... | ... | @@ -132,8 +121,7 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 132 | 121 | mHandler = new Handler(); |
| 133 | 122 | ChatUtil.setOnConnectStatusListener(connectStatusListener); |
| 134 | 123 | ChatUtil.setOnChatRoomActionListener(chatRoomActionListener); |
| 135 | - ChatUtil.setOnReceiveChatroomMessageListener(receiveMessageListener); | |
| 136 | - ChatUtil.setUploadProgressListener(uploadProgressListener); | |
| 124 | + ChatUtil.setOnReceiveMessageListener(receiveMessageListener); | |
| 137 | 125 | ChatUtil.setKickedOfflineListener(onKickedOfflineListener); |
| 138 | 126 | Intent intent = getIntent(); |
| 139 | 127 | user_name_string = intent.getStringExtra("user_name_string"); |
| ... | ... | @@ -142,6 +130,7 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 142 | 130 | ChatUtil.login(new CNUserInfo(user_id_string, user_name_string, ""), connectListener); |
| 143 | 131 | else ChatUtil.logOut(connectListener); |
| 144 | 132 | requestPermission(); |
| 133 | + playerUtil = new PlayerUtil(this); | |
| 145 | 134 | |
| 146 | 135 | } |
| 147 | 136 | |
| ... | ... | @@ -169,6 +158,7 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 169 | 158 | exit_chat1.setOnClickListener(this); |
| 170 | 159 | foundChatBtn.setOnClickListener(this); |
| 171 | 160 | send_messageOneBtn.setOnClickListener(this); |
| 161 | + groupChatOneListMy = new ArrayList<>(); | |
| 172 | 162 | chatListAdapterOne = new ChatRoomAdpter(ChatRoomActivity.this, false); |
| 173 | 163 | chatListAdapterOne.setonVoiceItemClickListener(this); |
| 174 | 164 | listViewOne.setLayoutManager(new LinearLayoutManager(ChatRoomActivity.this)); |
| ... | ... | @@ -179,9 +169,6 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 179 | 169 | keybordBtn = (ImageView) findViewById(R.id.keybord); |
| 180 | 170 | keybordBtn.setOnClickListener(this); |
| 181 | 171 | |
| 182 | - findViewById(R.id.videoBtn).setOnClickListener(this); | |
| 183 | - findViewById(R.id.ugcVideoBtn).setOnClickListener(this); | |
| 184 | - | |
| 185 | 172 | |
| 186 | 173 | StartListener(); |
| 187 | 174 | |
| ... | ... | @@ -195,20 +182,42 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 195 | 182 | private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() { |
| 196 | 183 | @Override |
| 197 | 184 | public void onAttached(CNBaseMessage o) { |
| 198 | - showMessage(o); | |
| 185 | + | |
| 199 | 186 | } |
| 200 | 187 | |
| 201 | 188 | @Override |
| 202 | 189 | public void onSuccess(final CNBaseMessage o) { |
| 203 | - updateItem(o, -1); | |
| 190 | + mHandler.post(new Runnable() { | |
| 191 | + @Override | |
| 192 | + public void run() { | |
| 193 | + if (o instanceof CNMessage) { | |
| 194 | + CNMessage o1 = (CNMessage) o; | |
| 195 | + chatListAdapterOne.addItem(new StringMessage(MessageType.stringMessage, o1, true)); | |
| 196 | + } else if (o instanceof CNImgMessage) { | |
| 197 | + CNImgMessage o1 = (CNImgMessage) o; | |
| 198 | + chatListAdapterOne.addItem(new ImagMessage(MessageType.imaMessage, o1, true)); | |
| 199 | + } else if (o instanceof CNVoiceMessage) { | |
| 200 | + CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 201 | + VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, true); | |
| 202 | + chatListAdapterOne.addItem(voiceMessage); | |
| 203 | + //发送成功后删除保存在本地的录制文件 | |
| 204 | + mAudioRecordUtil.deleteRecordFile(mFilePath); | |
| 205 | + | |
| 206 | + } | |
| 207 | + listViewOne.smoothScrollToPosition(chatListAdapterOne.getItemCount() - 1); | |
| 208 | + } | |
| 209 | + }); | |
| 204 | 210 | } |
| 205 | 211 | |
| 206 | 212 | @Override |
| 207 | 213 | public void onError(CNBaseMessage o, int i, String s) { |
| 208 | - updateItem(o, -1); | |
| 214 | + if (o instanceof CNImgMessage) { | |
| 215 | + | |
| 216 | + } | |
| 209 | 217 | } |
| 210 | 218 | }; |
| 211 | 219 | |
| 220 | + | |
| 212 | 221 | //连接状态监听 |
| 213 | 222 | private IChat.OnConnectStatusListener connectStatusListener = new IChat.OnConnectStatusListener() { |
| 214 | 223 | @Override |
| ... | ... | @@ -221,79 +230,28 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 221 | 230 | private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() { |
| 222 | 231 | @Override |
| 223 | 232 | public void processMessage(final CNBaseMessage o) { |
| 224 | - if (!o.getTargetId().equals(roomIdOne)) return; | |
| 225 | - showMessage(o); | |
| 226 | - } | |
| 227 | - }; | |
| 233 | + mHandler.post(new Runnable() { | |
| 234 | + @Override | |
| 235 | + public void run() { | |
| 236 | + if (o instanceof CNMessage) { | |
| 237 | + CNMessage o1 = (CNMessage) o; | |
| 238 | + chatListAdapterOne.addItem(new StringMessage(MessageType.stringMessage, o1, false)); | |
| 239 | + } else if (o instanceof CNImgMessage) { | |
| 240 | + CNImgMessage o1 = (CNImgMessage) o; | |
| 241 | + chatListAdapterOne.addItem(new ImagMessage(MessageType.imaMessage, o1, false)); | |
| 242 | + } else if (o instanceof CNVoiceMessage) { | |
| 243 | + CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 244 | + VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, false); | |
| 245 | + chatListAdapterOne.addItem(voiceMessage); | |
| 246 | + } | |
| 247 | + listViewOne.smoothScrollToPosition(chatListAdapterOne.getItemCount() - 1); | |
| 248 | + } | |
| 249 | + }); | |
| 228 | 250 | |
| 229 | - private IChat.OnUploadProgressListener uploadProgressListener = new IChat.OnUploadProgressListener() { | |
| 230 | - @Override | |
| 231 | - public void onMessagesUpdate(CNBaseMessage message, int elemIdx, int taskId, int progress) { | |
| 232 | - if (!message.getTargetId().equals(roomIdOne)) return; | |
| 233 | - updateItem(message, progress); | |
| 234 | 251 | } |
| 235 | 252 | }; |
| 236 | 253 | |
| 237 | 254 | |
| 238 | - /** | |
| 239 | - * 更新消息 | |
| 240 | - */ | |
| 241 | - public void updateItem(CNBaseMessage o, int progress) { | |
| 242 | - int updateIndex = msgIds.indexOf(o.getMessageId()); | |
| 243 | - if (updateIndex < 0 || chatListAdapterOne.getItemCount() <= 0 || updateIndex > chatListAdapterOne.getItemCount() - 1) | |
| 244 | - return; | |
| 245 | - if (o.getMsgType() == IChat.CN_MSG_TYPE_TEXT) { | |
| 246 | - CNMessage o1 = (CNMessage) o; | |
| 247 | - chatListAdapterOne.updateItem(new StringMessage(MessageType.stringMessage, o1, o1.isSelf()), updateIndex); | |
| 248 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_IMAGE) { | |
| 249 | - CNImgMessage o1 = (CNImgMessage) o; | |
| 250 | - chatListAdapterOne.updateItem(new ImagMessage(MessageType.imaMessage, o1, o1.isSelf(), progress < 0 ? 0 : progress), updateIndex); | |
| 251 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VOICE) { | |
| 252 | - CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 253 | - VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, o1.isSelf(), progress < 0 ? 0 : progress); | |
| 254 | - chatListAdapterOne.updateItem(voiceMessage, updateIndex); | |
| 255 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VIDEO) { | |
| 256 | - CNVideoMessage ol = (CNVideoMessage) o; | |
| 257 | - VideoMessage videoMessage = new VideoMessage(MessageType.videoMessage, ol, ol.isSelf(), progress < 0 ? 0 : progress); | |
| 258 | - chatListAdapterOne.updateItem(videoMessage, updateIndex); | |
| 259 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_UGC) { | |
| 260 | - CNUgcMessage ol = (CNUgcMessage) o; | |
| 261 | - UgcVideoMessage ugcVideoMessage = new UgcVideoMessage(MessageType.ugcVideoMessage, ol, ol.isSelf(), progress < 0 ? 0 : progress); | |
| 262 | - chatListAdapterOne.updateItem(ugcVideoMessage, updateIndex); | |
| 263 | - } | |
| 264 | - } | |
| 265 | - | |
| 266 | - /** | |
| 267 | - * 展示消息 | |
| 268 | - * | |
| 269 | - * @param o | |
| 270 | - */ | |
| 271 | - private void showMessage(CNBaseMessage o) { | |
| 272 | - msgIds.add(o.getMessageId()); | |
| 273 | - if (o.getMsgType() == IChat.CN_MSG_TYPE_TEXT) { | |
| 274 | - CNMessage o1 = (CNMessage) o; | |
| 275 | - chatListAdapterOne.addItem(new StringMessage(MessageType.stringMessage, o1, o1.isSelf())); | |
| 276 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_IMAGE) { | |
| 277 | - CNImgMessage o1 = (CNImgMessage) o; | |
| 278 | - chatListAdapterOne.addItem(new ImagMessage(MessageType.imaMessage, o1, o1.isSelf())); | |
| 279 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VOICE) { | |
| 280 | - CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 281 | - VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, o1.isSelf()); | |
| 282 | - chatListAdapterOne.addItem(voiceMessage); | |
| 283 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VIDEO) { | |
| 284 | - CNVideoMessage o1 = (CNVideoMessage) o; | |
| 285 | - VideoMessage videoMessage = new VideoMessage(MessageType.videoMessage, o1, o1.isSelf()); | |
| 286 | - chatListAdapterOne.addItem(videoMessage); | |
| 287 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_UGC) { | |
| 288 | - CNUgcMessage o1 = (CNUgcMessage) o; | |
| 289 | - UgcVideoMessage ugcVideoMessage = new UgcVideoMessage(MessageType.ugcVideoMessage, o1, o1.isSelf()); | |
| 290 | - chatListAdapterOne.addItem(ugcVideoMessage); | |
| 291 | - } | |
| 292 | - if (chatListAdapterOne.getItemCount() > 0) | |
| 293 | - listViewOne.smoothScrollToPosition(chatListAdapterOne.getItemCount() - 1); | |
| 294 | - } | |
| 295 | - | |
| 296 | - | |
| 297 | 255 | //聊天室操作 |
| 298 | 256 | private IChat.OnChatRoomActionListener chatRoomActionListener = new IChat.OnChatRoomActionListener() { |
| 299 | 257 | @Override |
| ... | ... | @@ -398,30 +356,9 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 398 | 356 | isVoiceBtnVisible = false; |
| 399 | 357 | } |
| 400 | 358 | break; |
| 401 | - case R.id.videoBtn: | |
| 402 | - openSystemRecorder(); | |
| 403 | - break; | |
| 404 | - case R.id.ugcVideoBtn: | |
| 405 | - openSystemRecorder(); | |
| 406 | - break; | |
| 407 | 359 | } |
| 408 | 360 | } |
| 409 | 361 | |
| 410 | - private void openSystemRecorder() { | |
| 411 | - // 创建拍照Intent并将控制权返回给调用的程序 | |
| 412 | - Intent intent = new Intent(); | |
| 413 | - intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE); | |
| 414 | - intent.addCategory(Intent.CATEGORY_DEFAULT); | |
| 415 | - | |
| 416 | - // 保存录像到指定的路径 | |
| 417 | - File file = new File("/sdcard/video.mp4"); | |
| 418 | - Uri uri = Uri.fromFile(file); | |
| 419 | - intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); | |
| 420 | - | |
| 421 | - // 启动图像捕获Intent | |
| 422 | - startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE); | |
| 423 | - } | |
| 424 | - | |
| 425 | 362 | |
| 426 | 363 | public void fromPicture() { |
| 427 | 364 | if (Build.VERSION.SDK_INT >= 23) { |
| ... | ... | @@ -457,12 +394,7 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 457 | 394 | Uri uri = Uri.parse("file://" + picturePath); |
| 458 | 395 | ChatUtil.sendImaMessage(IChat.CHATROOM, roomIdOne, uri, uri, sendMessageListener); |
| 459 | 396 | break; |
| 460 | - case CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE: | |
| 461 | - String videoPath = data.getData().getPath(); | |
| 462 | - Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.FULL_SCREEN_KIND); | |
| 463 | - String imgPath = FileUtil.createFile(bitmap, System.currentTimeMillis() + ""); | |
| 464 | - ChatUtil.sendVideoMessage(IChat.CHATROOM, roomIdOne, videoPath, imgPath, MediaUtil.getInstance().getDuration(videoPath), sendMessageListener); | |
| 465 | - break; | |
| 397 | + | |
| 466 | 398 | default: |
| 467 | 399 | break; |
| 468 | 400 | } |
| ... | ... | @@ -493,195 +425,25 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 493 | 425 | } |
| 494 | 426 | }; |
| 495 | 427 | |
| 496 | - /** | |
| 497 | - * 播放语音文件 | |
| 498 | - * | |
| 499 | - * @param voicePath | |
| 500 | - * @param animationDrawable | |
| 501 | - */ | |
| 502 | - private void startVoice(String voicePath, final AnimationDrawable animationDrawable) { | |
| 503 | - try { | |
| 504 | - FileInputStream fis = new FileInputStream(voicePath); | |
| 505 | - MediaUtil.getInstance().play(fis); | |
| 506 | - animationDrawable.start(); | |
| 507 | - MediaUtil.getInstance().setEventListener(new MediaUtil.EventListener() { | |
| 508 | - @Override | |
| 509 | - public void onStop() { | |
| 510 | - animationDrawable.stop(); | |
| 511 | - animationDrawable.selectDrawable(0); | |
| 512 | - } | |
| 513 | - }); | |
| 514 | - } catch (Exception e) { | |
| 515 | - } | |
| 516 | - } | |
| 517 | 428 | |
| 518 | 429 | @Override |
| 519 | - public void onItemClick(final VoiceMessage voiceMessage, final AnimationDrawable animationDrawable) { | |
| 520 | - if (voiceMessage == null) { | |
| 521 | - Toast.makeText(this, "数据异常", Toast.LENGTH_LONG).show(); | |
| 522 | - return; | |
| 523 | - } | |
| 524 | - if (voiceMessage.getCnVoiceMessage().isSelf()) { | |
| 525 | - startVoice(voiceMessage.getCnVoiceMessage().getVoiceUri().getPath(), animationDrawable); | |
| 430 | + public void onItemClick(VoiceMessage voiceMessage) { | |
| 431 | + if (voiceMessage.isUserSend()) { | |
| 432 | + playerUtil.start(voiceMessage.getCnVoiceMessage().getVoiceUri()); | |
| 526 | 433 | } else { |
| 527 | - //设置本地已读 | |
| 528 | - voiceMessage.getCnVoiceMessage().setRead(true); | |
| 529 | - String voiceUuid = voiceMessage.getCnVoiceMessage().getUuid(); | |
| 530 | - final String voicePath = FileUtil.getCacheFilePath(voiceUuid); | |
| 531 | - if (FileUtil.isCacheFileExist(voiceUuid)) { | |
| 532 | - File file = new File(voicePath); | |
| 533 | - if (file.length() < voiceMessage.getCnVoiceMessage().getDataSize()) { | |
| 534 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 535 | - return; | |
| 536 | - } | |
| 537 | - startVoice(voicePath, animationDrawable); | |
| 538 | - } else { | |
| 539 | - if (voiceMessage.isDownloading()) { | |
| 540 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 541 | - } else { | |
| 542 | - voiceMessage.setDownloading(true); | |
| 543 | - voiceMessage.getCnVoiceMessage().getVoice(voicePath, new IChat.OnDownloadListener() { | |
| 544 | - @Override | |
| 545 | - public void onSuccess() { | |
| 546 | - voiceMessage.setDownloading(false); | |
| 547 | - startVoice(voicePath, animationDrawable); | |
| 548 | - } | |
| 549 | - | |
| 550 | - @Override | |
| 551 | - public void onError(int i, String s) { | |
| 552 | - voiceMessage.setDownloading(false); | |
| 553 | - } | |
| 554 | - }); | |
| 555 | - } | |
| 556 | - } | |
| 557 | - } | |
| 558 | - } | |
| 559 | - | |
| 560 | - @Override | |
| 561 | - public void onVideoClick(final VideoMessage videoMessage) { | |
| 562 | - if (videoMessage.getCnVideoMessage().isSelf()) { | |
| 563 | - Intent intent = new Intent(ChatRoomActivity.this, VideoActivity.class); | |
| 564 | - intent.putExtra("videoPath", videoMessage.getCnVideoMessage().getVideoPath()); | |
| 565 | - startActivity(intent); | |
| 566 | - } else { | |
| 567 | - String videoUuid = videoMessage.getCnVideoMessage().getVideo().getUuid(); | |
| 568 | - final String videoPath = FileUtil.getCacheFilePath(videoUuid); | |
| 569 | - if (FileUtil.isCacheFileExist(videoUuid)) { | |
| 570 | - File file = new File(videoPath); | |
| 571 | - if (file.length() < videoMessage.getCnVideoMessage().getVideo().getSize()) { | |
| 572 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 573 | - return; | |
| 574 | - } | |
| 575 | - Intent intent = new Intent(ChatRoomActivity.this, VideoActivity.class); | |
| 576 | - intent.putExtra("videoPath", videoPath); | |
| 577 | - startActivity(intent); | |
| 578 | - } else { | |
| 579 | - if (videoMessage.isDownloading()) { | |
| 580 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 581 | - } else { | |
| 582 | - videoMessage.setDownloading(true); | |
| 583 | - videoMessage.getCnVideoMessage().getVideo().getVideo(videoPath, new IChat.OnDownloadListener() { | |
| 584 | - @Override | |
| 585 | - public void onSuccess() { | |
| 586 | - videoMessage.setDownloading(false); | |
| 587 | - Intent intent = new Intent(ChatRoomActivity.this, VideoActivity.class); | |
| 588 | - intent.putExtra("videoPath", videoPath); | |
| 589 | - startActivity(intent); | |
| 590 | - } | |
| 591 | - | |
| 592 | - @Override | |
| 593 | - public void onError(int i, String s) { | |
| 594 | - videoMessage.setDownloading(false); | |
| 595 | - } | |
| 596 | - }); | |
| 434 | + final String voicePath = FileUtil.getTempFile(FileUtil.FileType.AUDIO).getAbsolutePath(); | |
| 435 | + voiceMessage.getCnVoiceMessage().getVoice(voicePath, new IChat.OnDownloadListener() { | |
| 436 | + @Override | |
| 437 | + public void onSuccess() { | |
| 438 | + if (playerUtil != null) | |
| 439 | + playerUtil.start(Uri.parse(voicePath)); | |
| 597 | 440 | } |
| 598 | - } | |
| 599 | - } | |
| 600 | - | |
| 601 | - } | |
| 602 | 441 | |
| 603 | - @Override | |
| 604 | - public void onUgcVideoClick(final UgcVideoMessage ugcVideoMessage) { | |
| 605 | - if (ugcVideoMessage.getCnUgcMessage().isSelf()) { | |
| 606 | - Intent intent = new Intent(ChatRoomActivity.this, VideoActivity.class); | |
| 607 | - intent.putExtra("videoPath", ugcVideoMessage.getCnUgcMessage().getVideoPath()); | |
| 608 | - startActivity(intent); | |
| 609 | - } else { | |
| 610 | - String videoUuid = ugcVideoMessage.getCnUgcMessage().getFileId() + "_video"; | |
| 611 | - final String videoPath = FileUtil.getCacheFilePath(videoUuid); | |
| 612 | - if (FileUtil.isCacheFileExist(videoUuid)) { | |
| 613 | - File file = new File(videoPath); | |
| 614 | - if (file.length() < ugcVideoMessage.getCnUgcMessage().getVideo().getSize()) { | |
| 615 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 616 | - return; | |
| 617 | - } | |
| 618 | - Intent intent = new Intent(ChatRoomActivity.this, VideoActivity.class); | |
| 619 | - intent.putExtra("videoPath", videoPath); | |
| 620 | - startActivity(intent); | |
| 621 | - } else { | |
| 622 | - if (ugcVideoMessage.isDownloading()) { | |
| 623 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 624 | - } else { | |
| 625 | - ugcVideoMessage.setDownloading(true); | |
| 626 | - ugcVideoMessage.getCnUgcMessage().getVideo().getVideo(videoPath, new IChat.OnDownloadListener() { | |
| 627 | - @Override | |
| 628 | - public void onSuccess() { | |
| 629 | - ugcVideoMessage.setDownloading(false); | |
| 630 | - Intent intent = new Intent(ChatRoomActivity.this, VideoActivity.class); | |
| 631 | - intent.putExtra("videoPath", videoPath); | |
| 632 | - startActivity(intent); | |
| 633 | - } | |
| 634 | - | |
| 635 | - @Override | |
| 636 | - public void onError(int i, String s) { | |
| 637 | - ugcVideoMessage.setDownloading(false); | |
| 638 | - } | |
| 639 | - }); | |
| 640 | - } | |
| 641 | - } | |
| 642 | - } | |
| 643 | - } | |
| 442 | + @Override | |
| 443 | + public void onError(int i, String s) { | |
| 644 | 444 | |
| 645 | - @Override | |
| 646 | - public void onImageClick(final ImagMessage imagMessage) { | |
| 647 | - if (imagMessage.getCnImgMessage().isSelf()) { | |
| 648 | - Intent intent = new Intent(ChatRoomActivity.this, ImageViewActivity.class); | |
| 649 | - intent.putExtra("path", imagMessage.getCnImgMessage().getImagePath()); | |
| 650 | - startActivity(intent); | |
| 651 | - } else { | |
| 652 | - String remoteUuid = imagMessage.getCnImgMessage().getRemoteUuid(); | |
| 653 | - final String imagePath = FileUtil.getCacheFilePath(remoteUuid); | |
| 654 | - if (FileUtil.isCacheFileExist(remoteUuid)) { | |
| 655 | - File file = new File(imagePath); | |
| 656 | - if (file.length() < imagMessage.getCnImgMessage().getRemoteSize()) { | |
| 657 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 658 | - return; | |
| 659 | 445 | } |
| 660 | - Intent intent = new Intent(ChatRoomActivity.this, ImageViewActivity.class); | |
| 661 | - intent.putExtra("path", imagePath); | |
| 662 | - startActivity(intent); | |
| 663 | - } else { | |
| 664 | - if (imagMessage.isDownloading()) { | |
| 665 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 666 | - } else { | |
| 667 | - imagMessage.setDownloading(true); | |
| 668 | - imagMessage.getCnImgMessage().getRemoteImage(imagePath, new IChat.OnDownloadListener() { | |
| 669 | - @Override | |
| 670 | - public void onSuccess() { | |
| 671 | - imagMessage.setDownloading(false); | |
| 672 | - Intent intent = new Intent(ChatRoomActivity.this, ImageViewActivity.class); | |
| 673 | - intent.putExtra("path", imagePath); | |
| 674 | - startActivity(intent); | |
| 675 | - } | |
| 676 | - | |
| 677 | - @Override | |
| 678 | - public void onError(int i, String s) { | |
| 679 | - imagMessage.setDownloading(false); | |
| 680 | - Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show(); | |
| 681 | - } | |
| 682 | - }); | |
| 683 | - } | |
| 684 | - } | |
| 446 | + }); | |
| 685 | 447 | } |
| 686 | 448 | } |
| 687 | 449 | |
| ... | ... | @@ -697,15 +459,14 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 697 | 459 | Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) && |
| 698 | 460 | (ContextCompat.checkSelfPermission(context, |
| 699 | 461 | Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) |
| 700 | - && (ContextCompat.checkSelfPermission(context, | |
| 701 | - Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) { | |
| 462 | + ) { | |
| 702 | 463 | StartListener(); |
| 703 | 464 | |
| 704 | 465 | //判断是否开启语音权限 |
| 705 | 466 | } else { |
| 706 | 467 | //请求获取摄像头权限 |
| 707 | 468 | ActivityCompat.requestPermissions((Activity) context, |
| 708 | - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA}, VOICE_REQUEST_CODE); | |
| 469 | + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, VOICE_REQUEST_CODE); | |
| 709 | 470 | } |
| 710 | 471 | } |
| 711 | 472 | |
| ... | ... | @@ -846,19 +607,4 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL |
| 846 | 607 | } |
| 847 | 608 | }; |
| 848 | 609 | |
| 849 | - @Override | |
| 850 | - protected void onPause() { | |
| 851 | - super.onPause(); | |
| 852 | - MediaUtil.getInstance().stop(); | |
| 853 | - } | |
| 854 | - | |
| 855 | - @Override | |
| 856 | - protected void onDestroy() { | |
| 857 | - super.onDestroy(); | |
| 858 | - ChatUtil.removeUploadProgressListener(uploadProgressListener); | |
| 859 | - ChatUtil.removeReceiveMessageListener(receiveMessageListener); | |
| 860 | - ChatUtil.removeConnectListener(connectListener); | |
| 861 | - ChatUtil.removeConnectStatusListener(connectStatusListener); | |
| 862 | - } | |
| 863 | - | |
| 864 | 610 | } | ... | ... |
app/src/main/java/com/cnlive/im/ui/Private3Activity.java
0 → 100644
| 1 | +package com.cnlive.im.ui; | |
| 2 | + | |
| 3 | +import android.Manifest; | |
| 4 | +import android.app.Activity; | |
| 5 | +import android.content.Context; | |
| 6 | +import android.content.Intent; | |
| 7 | +import android.content.pm.PackageManager; | |
| 8 | +import android.database.Cursor; | |
| 9 | +import android.graphics.Bitmap; | |
| 10 | +import android.graphics.drawable.AnimationDrawable; | |
| 11 | +import android.media.ThumbnailUtils; | |
| 12 | +import android.net.Uri; | |
| 13 | +import android.os.Build; | |
| 14 | +import android.os.Bundle; | |
| 15 | +import android.os.Handler; | |
| 16 | +import android.provider.MediaStore; | |
| 17 | +import android.support.annotation.NonNull; | |
| 18 | +import android.support.v4.app.ActivityCompat; | |
| 19 | +import android.support.v4.content.ContextCompat; | |
| 20 | +import android.support.v7.app.AppCompatActivity; | |
| 21 | +import android.support.v7.widget.LinearLayoutManager; | |
| 22 | +import android.support.v7.widget.RecyclerView; | |
| 23 | +import android.text.Editable; | |
| 24 | +import android.text.TextUtils; | |
| 25 | +import android.text.TextWatcher; | |
| 26 | +import android.util.Log; | |
| 27 | +import android.view.Gravity; | |
| 28 | +import android.view.MotionEvent; | |
| 29 | +import android.view.View; | |
| 30 | +import android.view.inputmethod.InputMethodManager; | |
| 31 | +import android.widget.Button; | |
| 32 | +import android.widget.EditText; | |
| 33 | +import android.widget.ImageView; | |
| 34 | +import android.widget.LinearLayout; | |
| 35 | +import android.widget.RelativeLayout; | |
| 36 | +import android.widget.TextView; | |
| 37 | +import android.widget.Toast; | |
| 38 | + | |
| 39 | +import com.cnlive.im.R; | |
| 40 | +import com.cnlive.im.adapter.ChatRoom3Adpter; | |
| 41 | +import com.cnlive.im.adapter.ChatRoomAdpter; | |
| 42 | +import com.cnlive.im.adapter.base.ItemClickListener; | |
| 43 | +import com.cnlive.im.mode.CNMessageModole; | |
| 44 | +import com.cnlive.im.mode.ImagMessage; | |
| 45 | +import com.cnlive.im.mode.StringMessage; | |
| 46 | +import com.cnlive.im.mode.UgcVideoMessage; | |
| 47 | +import com.cnlive.im.mode.VideoMessage; | |
| 48 | +import com.cnlive.im.mode.VoiceMessage; | |
| 49 | +import com.cnlive.im.util.AudioRecordUtil; | |
| 50 | +import com.cnlive.im.util.FileUtil; | |
| 51 | +import com.cnlive.im.util.MediaUtil; | |
| 52 | +import com.cnlive.im.util.MessageType; | |
| 53 | +import com.cnlive.im.util.TimeUtils; | |
| 54 | +import com.cnlive.im.util.ToStringUtils; | |
| 55 | +import com.cnlive.libs.util.chat.ChatUtil; | |
| 56 | +import com.cnlive.libs.util.chat.base.IChat; | |
| 57 | +import com.cnlive.libs.util.chat.model.CNBaseMessage; | |
| 58 | +import com.cnlive.libs.util.chat.model.CNImgMessage; | |
| 59 | +import com.cnlive.libs.util.chat.model.CNMessage; | |
| 60 | +import com.cnlive.libs.util.chat.model.CNUgcMessage; | |
| 61 | +import com.cnlive.libs.util.chat.model.CNUserInfo; | |
| 62 | +import com.cnlive.libs.util.chat.model.CNVideoMessage; | |
| 63 | +import com.cnlive.libs.util.chat.model.CNVoiceMessage; | |
| 64 | + | |
| 65 | +import org.json.JSONException; | |
| 66 | +import org.json.JSONObject; | |
| 67 | + | |
| 68 | +import java.io.File; | |
| 69 | +import java.io.FileInputStream; | |
| 70 | +import java.util.ArrayList; | |
| 71 | + | |
| 72 | +import static com.cnlive.im.R.id.opposite_id_edit; | |
| 73 | + | |
| 74 | +/** | |
| 75 | + * Created by gujun on 2017/12/19. | |
| 76 | + */ | |
| 77 | + | |
| 78 | +public class Private3Activity extends AppCompatActivity implements View.OnClickListener, ItemClickListener { | |
| 79 | + | |
| 80 | + private static final String TAG = "PrivateChatActivity"; | |
| 81 | + | |
| 82 | + private final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 0x2001; | |
| 83 | + | |
| 84 | + // 所需的全部权限 | |
| 85 | + static final String[] PERMISSIONS = new String[]{ | |
| 86 | + Manifest.permission.RECORD_AUDIO, | |
| 87 | + Manifest.permission.WRITE_EXTERNAL_STORAGE | |
| 88 | + }; | |
| 89 | + | |
| 90 | + public static final int IMG_FROM_PICTURE = 0x1001; | |
| 91 | + public static final int VOICE = 0x1002; | |
| 92 | + public static final int PICTURE_REQUEST_CODE = 0x1003; | |
| 93 | + public static final int VOICE_REQUEST_CODE = 0x1004; | |
| 94 | + | |
| 95 | + public static final String IMAGE_MESSAGE = "image_message"; | |
| 96 | + public static final String STRING_MESSAGE = "string_message"; | |
| 97 | + public static final String VOICE_MESSAGE = "voice_message"; | |
| 98 | + | |
| 99 | + private RecyclerView chatListView; | |
| 100 | + private EditText messageContent; | |
| 101 | + private Button sendMessageBtn; | |
| 102 | + private ChatRoom3Adpter chatListAdapter; | |
| 103 | + private ArrayList<String> msgIds = new ArrayList<>(); | |
| 104 | + // private CNMessage cnMessage; | |
| 105 | + private LinearLayout linearLayoutUseID; | |
| 106 | + private EditText user_id_edit; | |
| 107 | + private Button userId_btn_top; | |
| 108 | + private String oppositeID; | |
| 109 | + private LinearLayout edit_layout; | |
| 110 | + private Handler mHandler; | |
| 111 | + private EditText opposite_name_edit; | |
| 112 | + private String user_name_string; | |
| 113 | + private String user_id_string; | |
| 114 | + private int sendInfo = 3; | |
| 115 | + private Button agree_btn; | |
| 116 | + private Button reject_btn; | |
| 117 | + private LinearLayout agree_reject_lin; | |
| 118 | + boolean isCanSendMeaasge = false; | |
| 119 | + private Button vistor_btn; | |
| 120 | + | |
| 121 | + private ImageView keybordBtn; | |
| 122 | + private Button sendVoice; | |
| 123 | + private AudioRecordUtil mAudioRecordUtil; | |
| 124 | + private String mFilePath; | |
| 125 | + private PopupWindowFactory mPop; | |
| 126 | + private RelativeLayout privateLayout; | |
| 127 | + private LinearLayout sendMsgLayout; | |
| 128 | + private LinearLayout cancelSendLayout; | |
| 129 | + private TextView mTextView; | |
| 130 | + private ImageView mImageView; | |
| 131 | + private ImageView ima_send; | |
| 132 | + | |
| 133 | + private boolean isVoiceBtnVisible = false; | |
| 134 | + private int duration; | |
| 135 | + private Context context; | |
| 136 | + | |
| 137 | + @Override | |
| 138 | + protected void onCreate(Bundle savedInstanceState) { | |
| 139 | + super.onCreate(savedInstanceState); | |
| 140 | + setContentView(R.layout.activity_private_chat_3); | |
| 141 | + context = this; | |
| 142 | + initView(); | |
| 143 | + mAudioRecordUtil = new AudioRecordUtil(); | |
| 144 | + mAudioRecordUtil.setOnAudioStatusUpdateListener(onAudioStatusUpdateListener); | |
| 145 | + mHandler = new Handler(); | |
| 146 | + ChatUtil.setOnConnectStatusListener(connectStatusListener); | |
| 147 | + ChatUtil.setOnReceivePrivateMessageListener(receiveMessageListener); | |
| 148 | + ChatUtil.setUploadProgressListener(uploadProgressListener); | |
| 149 | + requestPermission(); | |
| 150 | + } | |
| 151 | + | |
| 152 | + private void initView() { | |
| 153 | + | |
| 154 | + final View view = View.inflate(this, R.layout.layout_microphone, null); | |
| 155 | + mPop = new PopupWindowFactory(this, view); | |
| 156 | + sendMsgLayout = (LinearLayout) view.findViewById(R.id.send_layout); | |
| 157 | + cancelSendLayout = (LinearLayout) view.findViewById(R.id.cancel_send_layout); | |
| 158 | + mTextView = (TextView) view.findViewById(R.id.tv_recording_time); | |
| 159 | + mImageView = (ImageView) view.findViewById(R.id.iv_recording_icon); | |
| 160 | + | |
| 161 | + opposite_name_edit = (EditText) findViewById(R.id.opposite_name_edit); | |
| 162 | + chatListView = (RecyclerView) findViewById(R.id.private_list_view); | |
| 163 | + | |
| 164 | + privateLayout = (RelativeLayout) findViewById(R.id.activity_private_chat); | |
| 165 | + | |
| 166 | + messageContent = (EditText) findViewById(R.id.message_content); | |
| 167 | + messageContent.addTextChangedListener(textWatcher); | |
| 168 | + sendMessageBtn = (Button) findViewById(R.id.send_message); | |
| 169 | + sendMessageBtn.setOnClickListener(this); | |
| 170 | + linearLayoutUseID = (LinearLayout) findViewById(R.id.opposite_liner_useID); | |
| 171 | + userId_btn_top = (Button) findViewById(R.id.userId_btn_top); | |
| 172 | + userId_btn_top.setOnClickListener(this); | |
| 173 | + edit_layout = (LinearLayout) findViewById(R.id.edit_layout); | |
| 174 | + user_id_edit = (EditText) findViewById(opposite_id_edit); | |
| 175 | + Intent intent = getIntent(); | |
| 176 | + user_name_string = intent.getStringExtra("user_name_string"); | |
| 177 | + user_id_string = intent.getStringExtra("user_id_string"); | |
| 178 | + agree_btn = (Button) findViewById(R.id.agree_btn); | |
| 179 | + reject_btn = (Button) findViewById(R.id.reject_btn); | |
| 180 | + agree_btn.setOnClickListener(this); | |
| 181 | + reject_btn.setOnClickListener(this); | |
| 182 | + agree_reject_lin = (LinearLayout) findViewById(R.id.agree_reject_lin); | |
| 183 | + vistor_btn = (Button) findViewById(R.id.vistor_Btn); | |
| 184 | + vistor_btn.setOnClickListener(this); | |
| 185 | + | |
| 186 | + keybordBtn = (ImageView) findViewById(R.id.keybord); | |
| 187 | + keybordBtn.setOnClickListener(this); | |
| 188 | + | |
| 189 | + ima_send = (ImageView) findViewById(R.id.ima_send); | |
| 190 | + ima_send.setOnClickListener(this); | |
| 191 | + | |
| 192 | + sendVoice = (Button) findViewById(R.id.send_voice); | |
| 193 | + | |
| 194 | + chatListAdapter = new ChatRoom3Adpter(this, true); | |
| 195 | + chatListAdapter.setonVoiceItemClickListener(this); | |
| 196 | + chatListView.setLayoutManager(new LinearLayoutManager(Private3Activity.this)); | |
| 197 | + chatListView.setAdapter(chatListAdapter); | |
| 198 | + | |
| 199 | + findViewById(R.id.videoBtn).setOnClickListener(this); | |
| 200 | + findViewById(R.id.ugcVideoBtn).setOnClickListener(this); | |
| 201 | + | |
| 202 | + StartListener(); | |
| 203 | + } | |
| 204 | + | |
| 205 | + @Override | |
| 206 | + public void onClick(View v) { | |
| 207 | + | |
| 208 | + switch (v.getId()) { | |
| 209 | + case R.id.send_message: | |
| 210 | + sendMessage(STRING_MESSAGE); | |
| 211 | + | |
| 212 | + break; | |
| 213 | + | |
| 214 | + case R.id.userId_btn_top: | |
| 215 | + //发送私聊消息,需要传入目标ID与发送的消息内容 | |
| 216 | + if (user_id_edit.getText().toString().isEmpty()) { | |
| 217 | + Toast.makeText(this, "对方ID不能为空", Toast.LENGTH_SHORT).show(); | |
| 218 | + } else if (opposite_name_edit.getText().toString().isEmpty()) { | |
| 219 | + Toast.makeText(this, "对方name不能为空", Toast.LENGTH_SHORT).show(); | |
| 220 | + } else { | |
| 221 | + | |
| 222 | + oppositeID = user_id_edit.getText().toString(); | |
| 223 | + linearLayoutUseID.setVisibility(View.INVISIBLE); | |
| 224 | + edit_layout.setVisibility(View.VISIBLE); | |
| 225 | + chatListView.setVisibility(View.VISIBLE); | |
| 226 | + CNUserInfo cnName = new CNUserInfo(user_id_string, user_name_string, ""); | |
| 227 | + ChatUtil.login(cnName, connectListener); | |
| 228 | + | |
| 229 | + } | |
| 230 | + | |
| 231 | + break; | |
| 232 | + | |
| 233 | + case R.id.agree_btn: | |
| 234 | + String objToJsonString = ToStringUtils.objToJsonString(new CNMessageModole("同意", "3")); | |
| 235 | + ChatUtil.sendMessage(IChat.PRIVATE, oppositeID, objToJsonString, sendMessageListener); | |
| 236 | + agree_reject_lin.setVisibility(View.GONE); | |
| 237 | + break; | |
| 238 | + | |
| 239 | + case R.id.reject_btn: | |
| 240 | + String objToJsonStringDis = ToStringUtils.objToJsonString(new CNMessageModole("拒绝", "3"));//私聊 | |
| 241 | + | |
| 242 | + ChatUtil.sendMessage(IChat.PRIVATE, oppositeID, objToJsonStringDis, sendMessageListener); | |
| 243 | + agree_reject_lin.setVisibility(View.GONE); | |
| 244 | + break; | |
| 245 | + case R.id.vistor_Btn: | |
| 246 | + String objToJsonStringInvt = ToStringUtils.objToJsonString(new CNMessageModole("你好我们可以进行私聊吗", "3"));//私聊 | |
| 247 | + ChatUtil.sendMessage(IChat.PRIVATE, oppositeID, objToJsonStringInvt, sendMessageListener); | |
| 248 | + | |
| 249 | + break; | |
| 250 | + | |
| 251 | + case R.id.keybord: | |
| 252 | + if (!isVoiceBtnVisible) { | |
| 253 | + messageContent.setVisibility(View.GONE); | |
| 254 | + sendVoice.setVisibility(View.VISIBLE); | |
| 255 | + keybordBtn.setImageResource(R.drawable.keybord); | |
| 256 | + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); | |
| 257 | + imm.hideSoftInputFromWindow(messageContent.getWindowToken(), 0); | |
| 258 | + isVoiceBtnVisible = true; | |
| 259 | + } else { | |
| 260 | + sendVoice.setVisibility(View.GONE); | |
| 261 | + messageContent.setVisibility(View.VISIBLE); | |
| 262 | + keybordBtn.setImageResource(R.drawable.voice); | |
| 263 | + isVoiceBtnVisible = false; | |
| 264 | + } | |
| 265 | + break; | |
| 266 | + case R.id.ima_send: | |
| 267 | + sendMessage(IMAGE_MESSAGE); | |
| 268 | + break; | |
| 269 | + case R.id.videoBtn: | |
| 270 | + openSystemRecorder(); | |
| 271 | + break; | |
| 272 | + case R.id.ugcVideoBtn: | |
| 273 | + openSystemRecorder(); | |
| 274 | + break; | |
| 275 | + } | |
| 276 | + } | |
| 277 | + | |
| 278 | + private void openSystemRecorder() { | |
| 279 | + // 创建拍照Intent并将控制权返回给调用的程序 | |
| 280 | + Intent intent = new Intent(); | |
| 281 | + intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE); | |
| 282 | + intent.addCategory(Intent.CATEGORY_DEFAULT); | |
| 283 | + | |
| 284 | + // 保存录像到指定的路径 | |
| 285 | + File file = new File("/sdcard/video.mp4"); | |
| 286 | + Uri uri = Uri.fromFile(file); | |
| 287 | + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); | |
| 288 | + | |
| 289 | + // 启动图像捕获Intent | |
| 290 | + startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE); | |
| 291 | + } | |
| 292 | + | |
| 293 | + | |
| 294 | + private void sendMessage(String type) { | |
| 295 | + if (sendInfo == 2) { | |
| 296 | + Toast.makeText(this, "等待对方接受邀请", Toast.LENGTH_SHORT).show(); | |
| 297 | + | |
| 298 | + } else if (sendInfo == 4) { | |
| 299 | + Toast.makeText(this, "对方已经拒绝不能发送", Toast.LENGTH_SHORT).show(); | |
| 300 | + | |
| 301 | + } else if (sendInfo == 3) { | |
| 302 | + Toast.makeText(this, "还没有邀请对方呦~", Toast.LENGTH_SHORT).show(); | |
| 303 | + } else if (sendInfo == 5) { | |
| 304 | + Toast.makeText(this, "你已经拒绝对方不能发送消息", Toast.LENGTH_SHORT).show(); | |
| 305 | + } else { | |
| 306 | + if (type.equals(STRING_MESSAGE)) { | |
| 307 | + if (messageContent.getText().toString().isEmpty()) { | |
| 308 | + Toast.makeText(this, "不能发送空消息呦~", Toast.LENGTH_SHORT).show(); | |
| 309 | + } else { | |
| 310 | + String objToJsonString = ToStringUtils.objToJsonString(new CNMessageModole(messageContent.getText().toString(), "4"));//私聊消息 | |
| 311 | + ChatUtil.sendMessage(IChat.PRIVATE, oppositeID, objToJsonString, sendMessageListener); | |
| 312 | + messageContent.setText(""); | |
| 313 | + } | |
| 314 | + } else if (type.equals(IMAGE_MESSAGE)) { | |
| 315 | + fromPicture(); | |
| 316 | + } else if (type.equals(VOICE_MESSAGE)) { | |
| 317 | + mPop.showAtLocation(privateLayout, Gravity.CENTER, 0, 0); | |
| 318 | + | |
| 319 | + sendVoice.setText("松开发送"); | |
| 320 | + mAudioRecordUtil.startRecord(); | |
| 321 | + } | |
| 322 | + } | |
| 323 | + } | |
| 324 | + | |
| 325 | + public void fromPicture() { | |
| 326 | + if (Build.VERSION.SDK_INT >= 23) { | |
| 327 | + int checkCallPhonePermission = ContextCompat.checkSelfPermission(Private3Activity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE); | |
| 328 | + if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) { | |
| 329 | + requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PICTURE_REQUEST_CODE); | |
| 330 | + return; | |
| 331 | + } else { | |
| 332 | + toIntentPicture(); | |
| 333 | + } | |
| 334 | + } else { | |
| 335 | + toIntentPicture(); | |
| 336 | + } | |
| 337 | + } | |
| 338 | + | |
| 339 | + | |
| 340 | + private void toIntentPicture() { | |
| 341 | + Intent intent = new Intent(); | |
| 342 | + intent.setType("image/*"); | |
| 343 | + intent.setAction(Intent.ACTION_PICK); | |
| 344 | + startActivityForResult(Intent.createChooser(intent, "Complete action using"), IMG_FROM_PICTURE); | |
| 345 | + } | |
| 346 | + | |
| 347 | + | |
| 348 | + @Override | |
| 349 | + public void onActivityResult(int requestCode, int resultCode, Intent data) { | |
| 350 | + super.onActivityResult(requestCode, resultCode, data); | |
| 351 | + if (resultCode == Activity.RESULT_OK) { | |
| 352 | + switch (requestCode) { | |
| 353 | + case IMG_FROM_PICTURE: | |
| 354 | +// String localImagePath = "/sdcard/test.png"; | |
| 355 | +// Uri selectedImage = Uri.parse("file://" + localImagePath); | |
| 356 | + Uri selectedImage = data.getData(); | |
| 357 | + String[] filePathColumn = {MediaStore.Images.Media.DATA}; | |
| 358 | + | |
| 359 | + Cursor cursor = getContentResolver().query(selectedImage, | |
| 360 | + filePathColumn, null, null, null); | |
| 361 | + cursor.moveToFirst(); | |
| 362 | + | |
| 363 | + int columnIndex = cursor.getColumnIndex(filePathColumn[0]); | |
| 364 | + final String picturePath = cursor.getString(columnIndex); | |
| 365 | + | |
| 366 | + Uri uri = Uri.parse("file://" + picturePath); | |
| 367 | + ChatUtil.sendImaMessage(IChat.PRIVATE, oppositeID, uri, uri, sendMessageListener); | |
| 368 | + break; | |
| 369 | + case CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE: | |
| 370 | + String videoPath = data.getData().getPath(); | |
| 371 | + Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.FULL_SCREEN_KIND); | |
| 372 | + String imgPath = FileUtil.createFile(bitmap, System.currentTimeMillis() + ""); | |
| 373 | + ChatUtil.sendVideoMessage(IChat.PRIVATE, oppositeID, videoPath, imgPath, MediaUtil.getInstance().getDuration(videoPath), sendMessageListener); | |
| 374 | + break; | |
| 375 | + | |
| 376 | + default: | |
| 377 | + break; | |
| 378 | + } | |
| 379 | + } | |
| 380 | + } | |
| 381 | + | |
| 382 | + //连接监听 | |
| 383 | + private IChat.OnConnectListener connectListener = new IChat.OnConnectListener() { | |
| 384 | + | |
| 385 | + | |
| 386 | + @Override | |
| 387 | + public void onTokenIncorrect(String s) { | |
| 388 | + Log.e(TAG, "ConnectListener TokenIncorrect"); | |
| 389 | + Toast.makeText(Private3Activity.this, "TokenIncorrect", Toast.LENGTH_SHORT).show(); | |
| 390 | + } | |
| 391 | + | |
| 392 | + @Override | |
| 393 | + public void onSuccess(String s) { | |
| 394 | + Log.e(TAG, "ConnectListener 连接监听" + s); | |
| 395 | + Toast.makeText(Private3Activity.this, s, Toast.LENGTH_SHORT).show(); | |
| 396 | + | |
| 397 | + } | |
| 398 | + | |
| 399 | + @Override | |
| 400 | + public void onError(int i, String s) { | |
| 401 | + Log.e(TAG, "ConnectListener errorCode : " + i + " : errorMessage : " + s); | |
| 402 | + Toast.makeText(Private3Activity.this, s, Toast.LENGTH_SHORT).show(); | |
| 403 | + | |
| 404 | + } | |
| 405 | + }; | |
| 406 | + | |
| 407 | + | |
| 408 | + /** | |
| 409 | + * 发送消息监听 | |
| 410 | + */ | |
| 411 | + private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() { | |
| 412 | + @Override | |
| 413 | + public void onAttached(CNBaseMessage o) { | |
| 414 | + showMessage(o, false); | |
| 415 | + } | |
| 416 | + | |
| 417 | + @Override | |
| 418 | + public void onSuccess(final CNBaseMessage o) { | |
| 419 | + updateItem(o, -1); | |
| 420 | + } | |
| 421 | + | |
| 422 | + @Override | |
| 423 | + public void onError(CNBaseMessage o, int i, String s) { | |
| 424 | + updateItem(o, -1); | |
| 425 | + } | |
| 426 | + }; | |
| 427 | + | |
| 428 | + //连接状态监听 | |
| 429 | + private IChat.OnConnectStatusListener connectStatusListener = new IChat.OnConnectStatusListener() { | |
| 430 | + @Override | |
| 431 | + public void onConnectStatus(int i, String s) { | |
| 432 | + Log.i(TAG, "连接状态监听" + i + " " + s); | |
| 433 | + } | |
| 434 | + }; | |
| 435 | + | |
| 436 | + | |
| 437 | + //接收消息监听 | |
| 438 | + private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() { | |
| 439 | + @Override | |
| 440 | + public void processMessage(final CNBaseMessage o) { | |
| 441 | + if (!o.getTargetId().equals(oppositeID)) return; | |
| 442 | + showMessage(o, true); | |
| 443 | + } | |
| 444 | + }; | |
| 445 | + | |
| 446 | + private IChat.OnUploadProgressListener uploadProgressListener = new IChat.OnUploadProgressListener() { | |
| 447 | + @Override | |
| 448 | + public void onMessagesUpdate(CNBaseMessage message, int elemIdx, int taskId, int progress) { | |
| 449 | + if (!message.getTargetId().equals(oppositeID)) return; | |
| 450 | + updateItem(message, progress); | |
| 451 | + } | |
| 452 | + }; | |
| 453 | + | |
| 454 | + /** | |
| 455 | + * 更新消息 | |
| 456 | + */ | |
| 457 | + public void updateItem(CNBaseMessage o, int progress) { | |
| 458 | + int updateIndex = msgIds.indexOf(o.getMessageId()); | |
| 459 | + if (updateIndex < 0 || chatListAdapter.getItemCount() <= 0 || updateIndex > chatListAdapter.getItemCount() - 1) | |
| 460 | + return; | |
| 461 | + if (o.getMsgType() == IChat.CN_MSG_TYPE_TEXT) { | |
| 462 | + CNMessage o1 = (CNMessage) o; | |
| 463 | + chatListAdapter.updateItem(new StringMessage(MessageType.stringMessage, o1, o1.isSelf()), updateIndex); | |
| 464 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_IMAGE) { | |
| 465 | + CNImgMessage o1 = (CNImgMessage) o; | |
| 466 | + chatListAdapter.updateItem(new ImagMessage(MessageType.imaMessage, o1, o1.isSelf(), progress < 0 ? 0 : progress), updateIndex); | |
| 467 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VOICE) { | |
| 468 | + CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 469 | + VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, o1.isSelf(), progress < 0 ? 0 : progress); | |
| 470 | + chatListAdapter.updateItem(voiceMessage, updateIndex); | |
| 471 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VIDEO) { | |
| 472 | + CNVideoMessage ol = (CNVideoMessage) o; | |
| 473 | + VideoMessage videoMessage = new VideoMessage(MessageType.videoMessage, ol, ol.isSelf(), progress < 0 ? 0 : progress); | |
| 474 | + chatListAdapter.updateItem(videoMessage, updateIndex); | |
| 475 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_UGC) { | |
| 476 | + CNUgcMessage ol = (CNUgcMessage) o; | |
| 477 | + UgcVideoMessage ugcVideoMessage = new UgcVideoMessage(MessageType.ugcVideoMessage, ol, ol.isSelf(), progress < 0 ? 0 : progress); | |
| 478 | + chatListAdapter.updateItem(ugcVideoMessage, updateIndex); | |
| 479 | + } | |
| 480 | + } | |
| 481 | + | |
| 482 | + /** | |
| 483 | + * 展示消息 | |
| 484 | + * | |
| 485 | + * @param o | |
| 486 | + */ | |
| 487 | + private void showMessage(CNBaseMessage o, boolean isReceivedMsg) { | |
| 488 | + if (o.getMsgType() == IChat.CN_MSG_TYPE_TEXT) { | |
| 489 | + if (isReceivedMsg) { | |
| 490 | + CNMessage o1 = (CNMessage) o; | |
| 491 | + JSONObject jsonObject = null; | |
| 492 | + try { | |
| 493 | + jsonObject = new JSONObject(o1.getContent().toString()); | |
| 494 | + String type = (String) jsonObject.get("type"); | |
| 495 | + if ("3".equals(type) && "你好我们可以进行私聊吗".equals(jsonObject.get("message"))) { | |
| 496 | + vistor_btn.setVisibility(View.GONE); | |
| 497 | + agree_reject_lin.setVisibility(View.VISIBLE); | |
| 498 | + } else if ("3".equals(type) && "同意".equals(jsonObject.get("message"))) { | |
| 499 | + sendInfo = 1; | |
| 500 | + } else if ("3".equals(type) && "拒绝".equals(jsonObject.get("message"))) { | |
| 501 | + sendInfo = 4; | |
| 502 | + } else if ("4".equals(type)) { | |
| 503 | + Log.v(TAG, o1.getContent().toString()); | |
| 504 | + msgIds.add(o.getMessageId()); | |
| 505 | + chatListAdapter.addItem(new StringMessage(MessageType.stringMessage, o1, false)); | |
| 506 | + } | |
| 507 | + } catch (JSONException e) { | |
| 508 | + e.printStackTrace(); | |
| 509 | + } | |
| 510 | + } else { | |
| 511 | + CNMessage o1 = (CNMessage) o; | |
| 512 | + JSONObject jsonObject = null; | |
| 513 | + try { | |
| 514 | + jsonObject = new JSONObject(o1.getContent().toString()); | |
| 515 | + String type = (String) jsonObject.get("type"); | |
| 516 | + String message = (String) jsonObject.get("message"); | |
| 517 | + Toast.makeText(Private3Activity.this, "发送消息成功", Toast.LENGTH_SHORT).show(); | |
| 518 | + if ("3".equals(type) && message.equals("你好我们可以进行私聊吗")) { | |
| 519 | + sendInfo = 2; | |
| 520 | + Toast.makeText(Private3Activity.this, "申请已发送等待对方验证", Toast.LENGTH_SHORT).show(); | |
| 521 | + } else if ("3".equals(type) && message.equals("拒绝")) { | |
| 522 | + sendInfo = 5; | |
| 523 | + } else if ("3".equals(type) && message.equals("同意")) { | |
| 524 | + sendInfo = 1; | |
| 525 | + } else if ("4".equals(type)) { | |
| 526 | + msgIds.add(o.getMessageId()); | |
| 527 | + chatListAdapter.addItem(new StringMessage(MessageType.stringMessage, o1, true)); | |
| 528 | + } | |
| 529 | + } catch (JSONException e) { | |
| 530 | + } | |
| 531 | + } | |
| 532 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_IMAGE) { | |
| 533 | + msgIds.add(o.getMessageId()); | |
| 534 | + CNImgMessage o1 = (CNImgMessage) o; | |
| 535 | + chatListAdapter.addItem(new ImagMessage(MessageType.imaMessage, o1, o1.isSelf())); | |
| 536 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VOICE) { | |
| 537 | + msgIds.add(o.getMessageId()); | |
| 538 | + CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 539 | + VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, o1.isSelf()); | |
| 540 | + chatListAdapter.addItem(voiceMessage); | |
| 541 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VIDEO) { | |
| 542 | + msgIds.add(o.getMessageId()); | |
| 543 | + CNVideoMessage ol = (CNVideoMessage) o; | |
| 544 | + VideoMessage videoMessage = new VideoMessage(MessageType.videoMessage, ol, ol.isSelf()); | |
| 545 | + chatListAdapter.addItem(videoMessage); | |
| 546 | + } else if (o.getMsgType() == IChat.CN_MSG_TYPE_UGC) { | |
| 547 | + msgIds.add(o.getMessageId()); | |
| 548 | + CNUgcMessage ol = (CNUgcMessage) o; | |
| 549 | + UgcVideoMessage ugcVideoMessage = new UgcVideoMessage(MessageType.ugcVideoMessage, ol, ol.isSelf()); | |
| 550 | + chatListAdapter.addItem(ugcVideoMessage); | |
| 551 | + } | |
| 552 | + if (chatListAdapter.getItemCount() > 0) | |
| 553 | + chatListView.smoothScrollToPosition(chatListAdapter.getItemCount() - 1); | |
| 554 | + } | |
| 555 | + | |
| 556 | + /** | |
| 557 | + * 开启扫描之前判断权限是否打开 | |
| 558 | + */ | |
| 559 | + private void requestPermission() { | |
| 560 | + //判断是否开启摄像头权限 | |
| 561 | + if ((ContextCompat.checkSelfPermission(context, | |
| 562 | + Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) && | |
| 563 | + (ContextCompat.checkSelfPermission(context, | |
| 564 | + Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) | |
| 565 | + && (ContextCompat.checkSelfPermission(context, | |
| 566 | + Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) { | |
| 567 | + StartListener(); | |
| 568 | + | |
| 569 | + //判断是否开启语音权限 | |
| 570 | + } else { | |
| 571 | + //请求获取摄像头权限 | |
| 572 | + ActivityCompat.requestPermissions((Activity) context, | |
| 573 | + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA}, VOICE_REQUEST_CODE); | |
| 574 | + } | |
| 575 | + } | |
| 576 | + | |
| 577 | + @Override | |
| 578 | + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |
| 579 | + super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |
| 580 | + if (requestCode == VOICE_REQUEST_CODE) { | |
| 581 | + if ((grantResults[0] == PackageManager.PERMISSION_GRANTED) && (grantResults[1] == PackageManager.PERMISSION_GRANTED)) { | |
| 582 | + StartListener(); | |
| 583 | + } else { | |
| 584 | + Toast.makeText(context, "已拒绝权限!", Toast.LENGTH_SHORT).show(); | |
| 585 | + } | |
| 586 | + } | |
| 587 | + } | |
| 588 | + | |
| 589 | + float downX; | |
| 590 | + float downY; | |
| 591 | + | |
| 592 | + public void StartListener() { | |
| 593 | + | |
| 594 | + //Button的touch监听 | |
| 595 | + sendVoice.setOnTouchListener(new View.OnTouchListener() { | |
| 596 | + @Override | |
| 597 | + public boolean onTouch(View v, MotionEvent event) { | |
| 598 | + if (lacksPermissions(PERMISSIONS)) { | |
| 599 | + if (lacksPermission(PERMISSIONS[0])) { | |
| 600 | + Toast.makeText(Private3Activity.this, "没有麦克风权限,请前往“设置 - 应用 - 权限”中开启权限", Toast.LENGTH_SHORT).show(); | |
| 601 | + | |
| 602 | + } else if (lacksPermission(PERMISSIONS[1])) { | |
| 603 | + Toast.makeText(Private3Activity.this, "没有文件读写权限,请前往“设置 - 应用 - 权限”中开启权限", Toast.LENGTH_SHORT).show(); | |
| 604 | + | |
| 605 | + } | |
| 606 | + } else { | |
| 607 | + | |
| 608 | + switch (event.getAction()) { | |
| 609 | + | |
| 610 | + case MotionEvent.ACTION_DOWN: | |
| 611 | + sendMessage(VOICE_MESSAGE); | |
| 612 | +// mPop.showAtLocation(privateLayout, Gravity.CENTER, 0, 0); | |
| 613 | +// | |
| 614 | +// sendVoice.setText("松开发送"); | |
| 615 | +// mAudioRecordUtil.startRecord(); | |
| 616 | + downX = event.getX(); | |
| 617 | + downY = event.getY(); | |
| 618 | + | |
| 619 | + break; | |
| 620 | + | |
| 621 | + case MotionEvent.ACTION_UP: | |
| 622 | + | |
| 623 | + if (cancelSendLayout.getVisibility() == View.VISIBLE) { | |
| 624 | + cancelSendLayout.setVisibility(View.GONE); | |
| 625 | + sendMsgLayout.setVisibility(View.VISIBLE); | |
| 626 | + } | |
| 627 | + float moveX = Math.abs(event.getX() - downX); | |
| 628 | + float moveY = Math.abs(event.getY() - downY); | |
| 629 | + if (moveY > 100) { | |
| 630 | +// Toast.makeText(PrivateActivity.this, "cancel", Toast.LENGTH_SHORT).show(); | |
| 631 | + mAudioRecordUtil.cancelRecord(); | |
| 632 | + } else { | |
| 633 | + mAudioRecordUtil.stopRecord(); //结束录音(保存录音文件) | |
| 634 | + } | |
| 635 | + mPop.dismiss(); | |
| 636 | + mTextView.setText("00:00"); | |
| 637 | + sendVoice.setText("按住说话"); | |
| 638 | + break; | |
| 639 | + case MotionEvent.ACTION_MOVE: | |
| 640 | + float moveXm = Math.abs(event.getX() - downX); | |
| 641 | + float moveYm = Math.abs(event.getY() - downY); | |
| 642 | + if (moveYm > 100) { | |
| 643 | +// Toast.makeText(PrivateActivity.this, "cancel", Toast.LENGTH_SHORT).show(); | |
| 644 | + if (sendMsgLayout.getVisibility() == View.VISIBLE) { | |
| 645 | + sendMsgLayout.setVisibility(View.GONE); | |
| 646 | + cancelSendLayout.setVisibility(View.VISIBLE); | |
| 647 | + } | |
| 648 | + } else { | |
| 649 | + if (cancelSendLayout.getVisibility() == View.VISIBLE) { | |
| 650 | + cancelSendLayout.setVisibility(View.GONE); | |
| 651 | + sendMsgLayout.setVisibility(View.VISIBLE); | |
| 652 | + } | |
| 653 | + } | |
| 654 | + break; | |
| 655 | + } | |
| 656 | + } | |
| 657 | + return true; | |
| 658 | + } | |
| 659 | + }); | |
| 660 | + | |
| 661 | + } | |
| 662 | + | |
| 663 | + // 判断权限集合 | |
| 664 | + public boolean lacksPermissions(String... permissions) { | |
| 665 | + for (String permission : permissions) { | |
| 666 | + if (lacksPermission(permission)) { | |
| 667 | + return true; | |
| 668 | + } | |
| 669 | + } | |
| 670 | + return false; | |
| 671 | + } | |
| 672 | + | |
| 673 | + // 判断是否缺少权限 | |
| 674 | + private boolean lacksPermission(String permission) { | |
| 675 | + return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED; | |
| 676 | + } | |
| 677 | + | |
| 678 | + private AudioRecordUtil.OnAudioStatusUpdateListener onAudioStatusUpdateListener = new AudioRecordUtil.OnAudioStatusUpdateListener() { | |
| 679 | + @Override | |
| 680 | + public void onUpdate(double db, long time) { | |
| 681 | + mImageView.getDrawable().setLevel((int) (3000 + 6000 * db / 100)); | |
| 682 | + mTextView.setText(TimeUtils.long2String(time)); | |
| 683 | + } | |
| 684 | + | |
| 685 | + @Override | |
| 686 | + public void onStop(String filePath) { | |
| 687 | + duration = (int) mAudioRecordUtil.getDuration(); | |
| 688 | + mFilePath = filePath; | |
| 689 | + ChatUtil.sendVoiceMessage(IChat.PRIVATE, oppositeID, Uri.parse(mFilePath), duration, sendMessageListener); | |
| 690 | + } | |
| 691 | + }; | |
| 692 | + | |
| 693 | + private TextWatcher textWatcher = new TextWatcher() { | |
| 694 | + @Override | |
| 695 | + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { | |
| 696 | + } | |
| 697 | + | |
| 698 | + @Override | |
| 699 | + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { | |
| 700 | + | |
| 701 | + } | |
| 702 | + | |
| 703 | + @Override | |
| 704 | + public void afterTextChanged(Editable editable) { | |
| 705 | + if (!TextUtils.isEmpty(editable)) { | |
| 706 | + ima_send.setVisibility(View.GONE); | |
| 707 | + sendMessageBtn.setVisibility(View.VISIBLE); | |
| 708 | + } else { | |
| 709 | + sendMessageBtn.setVisibility(View.GONE); | |
| 710 | + ima_send.setVisibility(View.VISIBLE); | |
| 711 | + } | |
| 712 | + } | |
| 713 | + }; | |
| 714 | + | |
| 715 | + /** | |
| 716 | + * 播放语音文件 | |
| 717 | + * | |
| 718 | + * @param voicePath | |
| 719 | + * @param animationDrawable | |
| 720 | + */ | |
| 721 | + private void startVoice(String voicePath, final AnimationDrawable animationDrawable) { | |
| 722 | + try { | |
| 723 | + FileInputStream fis = new FileInputStream(voicePath); | |
| 724 | + MediaUtil.getInstance().play(fis); | |
| 725 | + animationDrawable.start(); | |
| 726 | + MediaUtil.getInstance().setEventListener(new MediaUtil.EventListener() { | |
| 727 | + @Override | |
| 728 | + public void onStop() { | |
| 729 | + animationDrawable.stop(); | |
| 730 | + animationDrawable.selectDrawable(0); | |
| 731 | + } | |
| 732 | + }); | |
| 733 | + } catch (Exception e) { | |
| 734 | + } | |
| 735 | + } | |
| 736 | + | |
| 737 | + @Override | |
| 738 | + public void onItemClick(final VoiceMessage voiceMessage, final AnimationDrawable animationDrawable) { | |
| 739 | + if (voiceMessage == null) { | |
| 740 | + Toast.makeText(this, "数据异常", Toast.LENGTH_LONG).show(); | |
| 741 | + return; | |
| 742 | + } | |
| 743 | + if (voiceMessage.getCnVoiceMessage().isSelf()) { | |
| 744 | + startVoice(voiceMessage.getCnVoiceMessage().getVoiceUri().getPath(), animationDrawable); | |
| 745 | + } else { | |
| 746 | + //设置本地已读 | |
| 747 | + voiceMessage.getCnVoiceMessage().setRead(true); | |
| 748 | + String voiceUuid = voiceMessage.getCnVoiceMessage().getUuid(); | |
| 749 | + final String voicePath = FileUtil.getCacheFilePath(voiceUuid); | |
| 750 | + if (FileUtil.isCacheFileExist(voiceUuid)) { | |
| 751 | + File file = new File(voicePath); | |
| 752 | + if (file.length() < voiceMessage.getCnVoiceMessage().getDataSize()) { | |
| 753 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 754 | + return; | |
| 755 | + } | |
| 756 | + startVoice(voicePath, animationDrawable); | |
| 757 | + } else { | |
| 758 | + if (voiceMessage.isDownloading()) { | |
| 759 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 760 | + } else { | |
| 761 | + voiceMessage.setDownloading(true); | |
| 762 | + voiceMessage.getCnVoiceMessage().getVoice(voicePath, new IChat.OnDownloadListener() { | |
| 763 | + @Override | |
| 764 | + public void onSuccess() { | |
| 765 | + voiceMessage.setDownloading(false); | |
| 766 | + startVoice(voicePath, animationDrawable); | |
| 767 | + } | |
| 768 | + | |
| 769 | + @Override | |
| 770 | + public void onError(int i, String s) { | |
| 771 | + voiceMessage.setDownloading(false); | |
| 772 | + } | |
| 773 | + }); | |
| 774 | + } | |
| 775 | + } | |
| 776 | + } | |
| 777 | + } | |
| 778 | + | |
| 779 | + @Override | |
| 780 | + public void onVideoClick(final VideoMessage videoMessage) { | |
| 781 | + if (videoMessage.getCnVideoMessage().isSelf()) { | |
| 782 | + Intent intent = new Intent(Private3Activity.this, VideoActivity.class); | |
| 783 | + intent.putExtra("videoPath", videoMessage.getCnVideoMessage().getVideoPath()); | |
| 784 | + startActivity(intent); | |
| 785 | + } else { | |
| 786 | + String videoUuid = videoMessage.getCnVideoMessage().getVideo().getUuid(); | |
| 787 | + final String videoPath = FileUtil.getCacheFilePath(videoUuid); | |
| 788 | + if (FileUtil.isCacheFileExist(videoUuid)) { | |
| 789 | + File file = new File(videoPath); | |
| 790 | + if (file.length() < videoMessage.getCnVideoMessage().getVideo().getSize()) { | |
| 791 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 792 | + return; | |
| 793 | + } | |
| 794 | + Intent intent = new Intent(Private3Activity.this, VideoActivity.class); | |
| 795 | + intent.putExtra("videoPath", videoPath); | |
| 796 | + startActivity(intent); | |
| 797 | + } else { | |
| 798 | + if (videoMessage.isDownloading()) { | |
| 799 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 800 | + } else { | |
| 801 | + videoMessage.setDownloading(true); | |
| 802 | + videoMessage.getCnVideoMessage().getVideo().getVideo(videoPath, new IChat.OnDownloadListener() { | |
| 803 | + @Override | |
| 804 | + public void onSuccess() { | |
| 805 | + videoMessage.setDownloading(false); | |
| 806 | + Intent intent = new Intent(Private3Activity.this, VideoActivity.class); | |
| 807 | + intent.putExtra("videoPath", videoPath); | |
| 808 | + startActivity(intent); | |
| 809 | + } | |
| 810 | + | |
| 811 | + @Override | |
| 812 | + public void onError(int i, String s) { | |
| 813 | + videoMessage.setDownloading(false); | |
| 814 | + } | |
| 815 | + }); | |
| 816 | + } | |
| 817 | + } | |
| 818 | + } | |
| 819 | + | |
| 820 | + } | |
| 821 | + | |
| 822 | + @Override | |
| 823 | + public void onUgcVideoClick(final UgcVideoMessage ugcVideoMessage) { | |
| 824 | + if (ugcVideoMessage.getCnUgcMessage().isSelf()) { | |
| 825 | + Intent intent = new Intent(Private3Activity.this, VideoActivity.class); | |
| 826 | + intent.putExtra("videoPath", ugcVideoMessage.getCnUgcMessage().getVideoPath()); | |
| 827 | + startActivity(intent); | |
| 828 | + } else { | |
| 829 | + String videoUuid = ugcVideoMessage.getCnUgcMessage().getFileId() + "_video"; | |
| 830 | + final String videoPath = FileUtil.getCacheFilePath(videoUuid); | |
| 831 | + if (FileUtil.isCacheFileExist(videoUuid)) { | |
| 832 | + File file = new File(videoPath); | |
| 833 | + if (file.length() < ugcVideoMessage.getCnUgcMessage().getVideo().getSize()) { | |
| 834 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 835 | + return; | |
| 836 | + } | |
| 837 | + Intent intent = new Intent(Private3Activity.this, VideoActivity.class); | |
| 838 | + intent.putExtra("videoPath", videoPath); | |
| 839 | + startActivity(intent); | |
| 840 | + } else { | |
| 841 | + if (ugcVideoMessage.isDownloading()) { | |
| 842 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 843 | + } else { | |
| 844 | + ugcVideoMessage.setDownloading(true); | |
| 845 | + ugcVideoMessage.getCnUgcMessage().getVideo().getVideo(videoPath, new IChat.OnDownloadListener() { | |
| 846 | + @Override | |
| 847 | + public void onSuccess() { | |
| 848 | + ugcVideoMessage.setDownloading(false); | |
| 849 | + Intent intent = new Intent(Private3Activity.this, VideoActivity.class); | |
| 850 | + intent.putExtra("videoPath", videoPath); | |
| 851 | + startActivity(intent); | |
| 852 | + } | |
| 853 | + | |
| 854 | + @Override | |
| 855 | + public void onError(int i, String s) { | |
| 856 | + ugcVideoMessage.setDownloading(false); | |
| 857 | + } | |
| 858 | + }); | |
| 859 | + } | |
| 860 | + } | |
| 861 | + } | |
| 862 | + } | |
| 863 | + | |
| 864 | + @Override | |
| 865 | + public void onImageClick(final ImagMessage imagMessage) { | |
| 866 | + if (imagMessage.getCnImgMessage().isSelf()) { | |
| 867 | + Intent intent = new Intent(Private3Activity.this, ImageViewActivity.class); | |
| 868 | + intent.putExtra("path", imagMessage.getCnImgMessage().getImagePath()); | |
| 869 | + startActivity(intent); | |
| 870 | + } else { | |
| 871 | + String remoteUuid = imagMessage.getCnImgMessage().getRemoteUuid(); | |
| 872 | + final String imagePath = FileUtil.getCacheFilePath(remoteUuid); | |
| 873 | + if (FileUtil.isCacheFileExist(remoteUuid)) { | |
| 874 | + File file = new File(imagePath); | |
| 875 | + if (file.length() < imagMessage.getCnImgMessage().getRemoteSize()) { | |
| 876 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 877 | + return; | |
| 878 | + } | |
| 879 | + Intent intent = new Intent(Private3Activity.this, ImageViewActivity.class); | |
| 880 | + intent.putExtra("path", imagePath); | |
| 881 | + startActivity(intent); | |
| 882 | + } else { | |
| 883 | + if (imagMessage.isDownloading()) { | |
| 884 | + Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 885 | + } else { | |
| 886 | + imagMessage.setDownloading(true); | |
| 887 | + imagMessage.getCnImgMessage().getRemoteImage(imagePath, new IChat.OnDownloadListener() { | |
| 888 | + @Override | |
| 889 | + public void onSuccess() { | |
| 890 | + imagMessage.setDownloading(false); | |
| 891 | + Intent intent = new Intent(Private3Activity.this, ImageViewActivity.class); | |
| 892 | + intent.putExtra("path", imagePath); | |
| 893 | + startActivity(intent); | |
| 894 | + } | |
| 895 | + | |
| 896 | + @Override | |
| 897 | + public void onError(int i, String s) { | |
| 898 | + imagMessage.setDownloading(false); | |
| 899 | + Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show(); | |
| 900 | + } | |
| 901 | + }); | |
| 902 | + } | |
| 903 | + } | |
| 904 | + } | |
| 905 | + } | |
| 906 | + | |
| 907 | + @Override | |
| 908 | + protected void onPause() { | |
| 909 | + super.onPause(); | |
| 910 | + MediaUtil.getInstance().stop(); | |
| 911 | + } | |
| 912 | + | |
| 913 | + @Override | |
| 914 | + protected void onDestroy() { | |
| 915 | + super.onDestroy(); | |
| 916 | + ChatUtil.removeUploadProgressListener(uploadProgressListener); | |
| 917 | + ChatUtil.removeReceiveMessageListener(receiveMessageListener); | |
| 918 | + ChatUtil.removeConnectListener(connectListener); | |
| 919 | + ChatUtil.removeConnectStatusListener(connectStatusListener); | |
| 920 | + } | |
| 921 | +} | ... | ... |
app/src/main/java/com/cnlive/im/ui/PrivateActivity.java
| ... | ... | @@ -6,9 +6,6 @@ import android.content.Context; |
| 6 | 6 | import android.content.Intent; |
| 7 | 7 | import android.content.pm.PackageManager; |
| 8 | 8 | import android.database.Cursor; |
| 9 | -import android.graphics.Bitmap; | |
| 10 | -import android.graphics.drawable.AnimationDrawable; | |
| 11 | -import android.media.ThumbnailUtils; | |
| 12 | 9 | import android.net.Uri; |
| 13 | 10 | import android.os.Build; |
| 14 | 11 | import android.os.Bundle; |
| ... | ... | @@ -38,17 +35,15 @@ import android.widget.Toast; |
| 38 | 35 | |
| 39 | 36 | import com.cnlive.im.R; |
| 40 | 37 | import com.cnlive.im.adapter.ChatRoomAdpter; |
| 41 | -import com.cnlive.im.adapter.base.ItemClickListener; | |
| 38 | +import com.cnlive.im.adapter.base.VoiceItemClickListener; | |
| 42 | 39 | import com.cnlive.im.mode.CNMessageModole; |
| 43 | 40 | import com.cnlive.im.mode.ImagMessage; |
| 44 | 41 | import com.cnlive.im.mode.StringMessage; |
| 45 | -import com.cnlive.im.mode.UgcVideoMessage; | |
| 46 | -import com.cnlive.im.mode.VideoMessage; | |
| 47 | 42 | import com.cnlive.im.mode.VoiceMessage; |
| 48 | 43 | import com.cnlive.im.util.AudioRecordUtil; |
| 49 | 44 | import com.cnlive.im.util.FileUtil; |
| 50 | -import com.cnlive.im.util.MediaUtil; | |
| 51 | 45 | import com.cnlive.im.util.MessageType; |
| 46 | +import com.cnlive.im.util.PlayerUtil; | |
| 52 | 47 | import com.cnlive.im.util.TimeUtils; |
| 53 | 48 | import com.cnlive.im.util.ToStringUtils; |
| 54 | 49 | import com.cnlive.libs.util.chat.ChatUtil; |
| ... | ... | @@ -56,16 +51,12 @@ import com.cnlive.libs.util.chat.base.IChat; |
| 56 | 51 | import com.cnlive.libs.util.chat.model.CNBaseMessage; |
| 57 | 52 | import com.cnlive.libs.util.chat.model.CNImgMessage; |
| 58 | 53 | import com.cnlive.libs.util.chat.model.CNMessage; |
| 59 | -import com.cnlive.libs.util.chat.model.CNUgcMessage; | |
| 60 | 54 | import com.cnlive.libs.util.chat.model.CNUserInfo; |
| 61 | -import com.cnlive.libs.util.chat.model.CNVideoMessage; | |
| 62 | 55 | import com.cnlive.libs.util.chat.model.CNVoiceMessage; |
| 63 | 56 | |
| 64 | 57 | import org.json.JSONException; |
| 65 | 58 | import org.json.JSONObject; |
| 66 | 59 | |
| 67 | -import java.io.File; | |
| 68 | -import java.io.FileInputStream; | |
| 69 | 60 | import java.util.ArrayList; |
| 70 | 61 | |
| 71 | 62 | import static com.cnlive.im.R.id.opposite_id_edit; |
| ... | ... | @@ -74,12 +65,10 @@ import static com.cnlive.im.R.id.opposite_id_edit; |
| 74 | 65 | * Created by Lynn on 2017/7/24. |
| 75 | 66 | */ |
| 76 | 67 | |
| 77 | -public class PrivateActivity extends AppCompatActivity implements View.OnClickListener, ItemClickListener { | |
| 68 | +public class PrivateActivity extends AppCompatActivity implements View.OnClickListener, VoiceItemClickListener { | |
| 78 | 69 | |
| 79 | 70 | private static final String TAG = "PrivateChatActivity"; |
| 80 | 71 | |
| 81 | - private final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 0x2001; | |
| 82 | - | |
| 83 | 72 | // 所需的全部权限 |
| 84 | 73 | static final String[] PERMISSIONS = new String[]{ |
| 85 | 74 | Manifest.permission.RECORD_AUDIO, |
| ... | ... | @@ -99,7 +88,7 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 99 | 88 | private EditText messageContent; |
| 100 | 89 | private Button sendMessageBtn; |
| 101 | 90 | private ChatRoomAdpter chatListAdapter; |
| 102 | - private ArrayList<String> msgIds = new ArrayList<>(); | |
| 91 | + private ArrayList<Object> messageList = new ArrayList<>(); | |
| 103 | 92 | // private CNMessage cnMessage; |
| 104 | 93 | private LinearLayout linearLayoutUseID; |
| 105 | 94 | private EditText user_id_edit; |
| ... | ... | @@ -120,6 +109,7 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 120 | 109 | private ImageView keybordBtn; |
| 121 | 110 | private Button sendVoice; |
| 122 | 111 | private AudioRecordUtil mAudioRecordUtil; |
| 112 | + private PlayerUtil playerUtil; | |
| 123 | 113 | private String mFilePath; |
| 124 | 114 | private PopupWindowFactory mPop; |
| 125 | 115 | private RelativeLayout privateLayout; |
| ... | ... | @@ -144,8 +134,8 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 144 | 134 | mHandler = new Handler(); |
| 145 | 135 | ChatUtil.setOnConnectStatusListener(connectStatusListener); |
| 146 | 136 | ChatUtil.setOnReceivePrivateMessageListener(receiveMessageListener); |
| 147 | - ChatUtil.setUploadProgressListener(uploadProgressListener); | |
| 148 | 137 | requestPermission(); |
| 138 | + playerUtil = new PlayerUtil(this); | |
| 149 | 139 | } |
| 150 | 140 | |
| 151 | 141 | private void initView() { |
| ... | ... | @@ -195,9 +185,6 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 195 | 185 | chatListView.setLayoutManager(new LinearLayoutManager(PrivateActivity.this)); |
| 196 | 186 | chatListView.setAdapter(chatListAdapter); |
| 197 | 187 | |
| 198 | - findViewById(R.id.videoBtn).setOnClickListener(this); | |
| 199 | - findViewById(R.id.ugcVideoBtn).setOnClickListener(this); | |
| 200 | - | |
| 201 | 188 | StartListener(); |
| 202 | 189 | } |
| 203 | 190 | |
| ... | ... | @@ -265,31 +252,9 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 265 | 252 | case R.id.ima_send: |
| 266 | 253 | sendMessage(IMAGE_MESSAGE); |
| 267 | 254 | break; |
| 268 | - case R.id.videoBtn: | |
| 269 | - openSystemRecorder(); | |
| 270 | - break; | |
| 271 | - case R.id.ugcVideoBtn: | |
| 272 | - openSystemRecorder(); | |
| 273 | - break; | |
| 274 | 255 | } |
| 275 | 256 | } |
| 276 | 257 | |
| 277 | - private void openSystemRecorder() { | |
| 278 | - // 创建拍照Intent并将控制权返回给调用的程序 | |
| 279 | - Intent intent = new Intent(); | |
| 280 | - intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE); | |
| 281 | - intent.addCategory(Intent.CATEGORY_DEFAULT); | |
| 282 | - | |
| 283 | - // 保存录像到指定的路径 | |
| 284 | - File file = new File("/sdcard/video.mp4"); | |
| 285 | - Uri uri = Uri.fromFile(file); | |
| 286 | - intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); | |
| 287 | - | |
| 288 | - // 启动图像捕获Intent | |
| 289 | - startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE); | |
| 290 | - } | |
| 291 | - | |
| 292 | - | |
| 293 | 258 | private void sendMessage(String type) { |
| 294 | 259 | if (sendInfo == 2) { |
| 295 | 260 | Toast.makeText(this, "等待对方接受邀请", Toast.LENGTH_SHORT).show(); |
| ... | ... | @@ -365,12 +330,6 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 365 | 330 | Uri uri = Uri.parse("file://" + picturePath); |
| 366 | 331 | ChatUtil.sendImaMessage(IChat.PRIVATE, oppositeID, uri, uri, sendMessageListener); |
| 367 | 332 | break; |
| 368 | - case CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE: | |
| 369 | - String videoPath = data.getData().getPath(); | |
| 370 | - Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.FULL_SCREEN_KIND); | |
| 371 | - String imgPath = FileUtil.createFile(bitmap, System.currentTimeMillis() + ""); | |
| 372 | - ChatUtil.sendVideoMessage(IChat.PRIVATE, oppositeID, videoPath, imgPath, MediaUtil.getInstance().getDuration(videoPath), sendMessageListener); | |
| 373 | - break; | |
| 374 | 333 | |
| 375 | 334 | default: |
| 376 | 335 | break; |
| ... | ... | @@ -407,150 +366,120 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 407 | 366 | /** |
| 408 | 367 | * 发送消息监听 |
| 409 | 368 | */ |
| 369 | + | |
| 410 | 370 | private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() { |
| 411 | 371 | @Override |
| 412 | 372 | public void onAttached(CNBaseMessage o) { |
| 413 | - showMessage(o, false); | |
| 414 | 373 | } |
| 415 | 374 | |
| 416 | 375 | @Override |
| 417 | 376 | public void onSuccess(final CNBaseMessage o) { |
| 418 | - updateItem(o, -1); | |
| 377 | + if (View.VISIBLE == vistor_btn.getVisibility()) { | |
| 378 | + vistor_btn.setVisibility(View.GONE); | |
| 379 | + } | |
| 380 | + | |
| 381 | + mHandler.post(new Runnable() { | |
| 382 | + @Override | |
| 383 | + public void run() { | |
| 384 | + if (o instanceof CNMessage) { | |
| 385 | + CNMessage o1 = (CNMessage) o; | |
| 386 | + JSONObject jsonObject = null; | |
| 387 | + try { | |
| 388 | + jsonObject = new JSONObject(o1.getContent().toString()); | |
| 389 | + String type = (String) jsonObject.get("type"); | |
| 390 | + String message = (String) jsonObject.get("message"); | |
| 391 | + Toast.makeText(PrivateActivity.this, "发送消息成功", Toast.LENGTH_SHORT).show(); | |
| 392 | + if ("3".equals(type) && message.equals("你好我们可以进行私聊吗")) { | |
| 393 | + sendInfo = 2; | |
| 394 | + Toast.makeText(PrivateActivity.this, "申请已发送等待对方验证", Toast.LENGTH_SHORT).show(); | |
| 395 | + } else if ("3".equals(type) && message.equals("拒绝")) { | |
| 396 | + sendInfo = 5; | |
| 397 | + } else if ("3".equals(type) && message.equals("同意")) { | |
| 398 | + sendInfo = 1; | |
| 399 | + } else if ("4".equals(type)) { | |
| 400 | + chatListAdapter.addItem(new StringMessage(MessageType.stringMessage, o1, true)); | |
| 401 | + chatListView.smoothScrollToPosition(chatListAdapter.getItemCount() - 1); | |
| 402 | + | |
| 403 | + } | |
| 404 | + } catch (JSONException e) { | |
| 405 | + | |
| 406 | + | |
| 407 | + } | |
| 408 | + } else if (o instanceof CNImgMessage) { | |
| 409 | + CNImgMessage o1 = (CNImgMessage) o; | |
| 410 | + chatListAdapter.addItem(new ImagMessage(MessageType.imaMessage, o1, true)); | |
| 411 | + chatListView.smoothScrollToPosition(chatListAdapter.getItemCount() - 1); | |
| 412 | + } else if (o instanceof CNVoiceMessage) { | |
| 413 | + CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 414 | + VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, true); | |
| 415 | + chatListAdapter.addItem(voiceMessage); | |
| 416 | + //发送成功后删除保存在本地的录制文件 | |
| 417 | + mAudioRecordUtil.deleteRecordFile(mFilePath); | |
| 418 | + chatListView.smoothScrollToPosition(chatListAdapter.getItemCount() - 1); | |
| 419 | + } | |
| 420 | + } | |
| 421 | + }); | |
| 419 | 422 | } |
| 420 | 423 | |
| 421 | 424 | @Override |
| 422 | 425 | public void onError(CNBaseMessage o, int i, String s) { |
| 423 | - updateItem(o, -1); | |
| 424 | 426 | } |
| 425 | 427 | }; |
| 426 | 428 | |
| 429 | + | |
| 427 | 430 | //连接状态监听 |
| 428 | 431 | private IChat.OnConnectStatusListener connectStatusListener = new IChat.OnConnectStatusListener() { |
| 429 | 432 | @Override |
| 430 | 433 | public void onConnectStatus(int i, String s) { |
| 431 | - Log.i(TAG, "连接状态监听" + i + " " + s); | |
| 432 | - } | |
| 433 | - }; | |
| 434 | + Log.i(TAG, "私聊连接状态监听私聊" + i + " " + s); | |
| 434 | 435 | |
| 435 | 436 | |
| 437 | + } | |
| 438 | + }; | |
| 436 | 439 | //接收消息监听 |
| 437 | 440 | private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() { |
| 438 | 441 | @Override |
| 439 | 442 | public void processMessage(final CNBaseMessage o) { |
| 440 | - if (!o.getTargetId().equals(oppositeID)) return; | |
| 441 | - showMessage(o, true); | |
| 442 | - } | |
| 443 | - }; | |
| 444 | - | |
| 445 | - private IChat.OnUploadProgressListener uploadProgressListener = new IChat.OnUploadProgressListener() { | |
| 446 | - @Override | |
| 447 | - public void onMessagesUpdate(CNBaseMessage message, int elemIdx, int taskId, int progress) { | |
| 448 | - if (!message.getTargetId().equals(oppositeID)) return; | |
| 449 | - updateItem(message, progress); | |
| 450 | - } | |
| 451 | - }; | |
| 452 | - | |
| 453 | - /** | |
| 454 | - * 更新消息 | |
| 455 | - */ | |
| 456 | - public void updateItem(CNBaseMessage o, int progress) { | |
| 457 | - int updateIndex = msgIds.indexOf(o.getMessageId()); | |
| 458 | - if (updateIndex < 0 || chatListAdapter.getItemCount() <= 0 || updateIndex > chatListAdapter.getItemCount() - 1) | |
| 459 | - return; | |
| 460 | - if (o.getMsgType() == IChat.CN_MSG_TYPE_TEXT) { | |
| 461 | - CNMessage o1 = (CNMessage) o; | |
| 462 | - chatListAdapter.updateItem(new StringMessage(MessageType.stringMessage, o1, o1.isSelf()), updateIndex); | |
| 463 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_IMAGE) { | |
| 464 | - CNImgMessage o1 = (CNImgMessage) o; | |
| 465 | - chatListAdapter.updateItem(new ImagMessage(MessageType.imaMessage, o1, o1.isSelf(), progress < 0 ? 0 : progress), updateIndex); | |
| 466 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VOICE) { | |
| 467 | - CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 468 | - VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, o1.isSelf(), progress < 0 ? 0 : progress); | |
| 469 | - chatListAdapter.updateItem(voiceMessage, updateIndex); | |
| 470 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VIDEO) { | |
| 471 | - CNVideoMessage ol = (CNVideoMessage) o; | |
| 472 | - VideoMessage videoMessage = new VideoMessage(MessageType.videoMessage, ol, ol.isSelf(), progress < 0 ? 0 : progress); | |
| 473 | - chatListAdapter.updateItem(videoMessage, updateIndex); | |
| 474 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_UGC) { | |
| 475 | - CNUgcMessage ol = (CNUgcMessage) o; | |
| 476 | - UgcVideoMessage ugcVideoMessage = new UgcVideoMessage(MessageType.ugcVideoMessage, ol, ol.isSelf(), progress < 0 ? 0 : progress); | |
| 477 | - chatListAdapter.updateItem(ugcVideoMessage, updateIndex); | |
| 478 | - } | |
| 479 | - } | |
| 443 | + mHandler.post(new Runnable() { | |
| 444 | + @Override | |
| 445 | + public void run() { | |
| 446 | + if (o instanceof CNMessage) { | |
| 447 | + CNMessage o1 = (CNMessage) o; | |
| 448 | + JSONObject jsonObject = null; | |
| 449 | + try { | |
| 450 | + jsonObject = new JSONObject(o1.getContent().toString()); | |
| 451 | + String type = (String) jsonObject.get("type"); | |
| 452 | + if ("3".equals(type) && "你好我们可以进行私聊吗".equals(jsonObject.get("message"))) { | |
| 453 | + vistor_btn.setVisibility(View.GONE); | |
| 454 | + agree_reject_lin.setVisibility(View.VISIBLE); | |
| 455 | + } else if ("3".equals(type) && "同意".equals(jsonObject.get("message"))) { | |
| 456 | + sendInfo = 1; | |
| 457 | + } else if ("3".equals(type) && "拒绝".equals(jsonObject.get("message"))) { | |
| 458 | + sendInfo = 4; | |
| 459 | + } else if ("4".equals(type)) { | |
| 460 | + Log.v(TAG, o1.getContent().toString()); | |
| 461 | + chatListAdapter.addItem(new StringMessage(MessageType.stringMessage, o1, false)); | |
| 462 | + chatListView.smoothScrollToPosition(chatListAdapter.getItemCount() - 1); | |
| 463 | + } | |
| 480 | 464 | |
| 481 | - /** | |
| 482 | - * 展示消息 | |
| 483 | - * | |
| 484 | - * @param o | |
| 485 | - */ | |
| 486 | - private void showMessage(CNBaseMessage o, boolean isReceivedMsg) { | |
| 487 | - if (o.getMsgType() == IChat.CN_MSG_TYPE_TEXT) { | |
| 488 | - if (isReceivedMsg) { | |
| 489 | - CNMessage o1 = (CNMessage) o; | |
| 490 | - JSONObject jsonObject = null; | |
| 491 | - try { | |
| 492 | - jsonObject = new JSONObject(o1.getContent().toString()); | |
| 493 | - String type = (String) jsonObject.get("type"); | |
| 494 | - if ("3".equals(type) && "你好我们可以进行私聊吗".equals(jsonObject.get("message"))) { | |
| 495 | - vistor_btn.setVisibility(View.GONE); | |
| 496 | - agree_reject_lin.setVisibility(View.VISIBLE); | |
| 497 | - } else if ("3".equals(type) && "同意".equals(jsonObject.get("message"))) { | |
| 498 | - sendInfo = 1; | |
| 499 | - } else if ("3".equals(type) && "拒绝".equals(jsonObject.get("message"))) { | |
| 500 | - sendInfo = 4; | |
| 501 | - } else if ("4".equals(type)) { | |
| 502 | - Log.v(TAG, o1.getContent().toString()); | |
| 503 | - msgIds.add(o.getMessageId()); | |
| 504 | - chatListAdapter.addItem(new StringMessage(MessageType.stringMessage, o1, false)); | |
| 505 | - } | |
| 506 | - } catch (JSONException e) { | |
| 507 | - e.printStackTrace(); | |
| 508 | - } | |
| 509 | - } else { | |
| 510 | - CNMessage o1 = (CNMessage) o; | |
| 511 | - JSONObject jsonObject = null; | |
| 512 | - try { | |
| 513 | - jsonObject = new JSONObject(o1.getContent().toString()); | |
| 514 | - String type = (String) jsonObject.get("type"); | |
| 515 | - String message = (String) jsonObject.get("message"); | |
| 516 | - Toast.makeText(PrivateActivity.this, "发送消息成功", Toast.LENGTH_SHORT).show(); | |
| 517 | - if ("3".equals(type) && message.equals("你好我们可以进行私聊吗")) { | |
| 518 | - sendInfo = 2; | |
| 519 | - Toast.makeText(PrivateActivity.this, "申请已发送等待对方验证", Toast.LENGTH_SHORT).show(); | |
| 520 | - } else if ("3".equals(type) && message.equals("拒绝")) { | |
| 521 | - sendInfo = 5; | |
| 522 | - } else if ("3".equals(type) && message.equals("同意")) { | |
| 523 | - sendInfo = 1; | |
| 524 | - } else if ("4".equals(type)) { | |
| 525 | - msgIds.add(o.getMessageId()); | |
| 526 | - chatListAdapter.addItem(new StringMessage(MessageType.stringMessage, o1, true)); | |
| 465 | + } catch (JSONException e) { | |
| 466 | + e.printStackTrace(); | |
| 467 | + } | |
| 468 | + } else if (o instanceof CNImgMessage) { | |
| 469 | + CNImgMessage o1 = (CNImgMessage) o; | |
| 470 | + chatListAdapter.addItem(new ImagMessage(MessageType.imaMessage, o1, false)); | |
| 471 | + chatListView.smoothScrollToPosition(chatListAdapter.getItemCount() - 1); | |
| 472 | + } else if (o instanceof CNVoiceMessage) { | |
| 473 | + CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 474 | + VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, false); | |
| 475 | + chatListAdapter.addItem(voiceMessage); | |
| 476 | + chatListView.smoothScrollToPosition(chatListAdapter.getItemCount() - 1); | |
| 527 | 477 | } |
| 528 | - } catch (JSONException e) { | |
| 529 | 478 | } |
| 530 | - } | |
| 531 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_IMAGE) { | |
| 532 | - msgIds.add(o.getMessageId()); | |
| 533 | - CNImgMessage o1 = (CNImgMessage) o; | |
| 534 | - chatListAdapter.addItem(new ImagMessage(MessageType.imaMessage, o1, o1.isSelf())); | |
| 535 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VOICE) { | |
| 536 | - msgIds.add(o.getMessageId()); | |
| 537 | - CNVoiceMessage o1 = (CNVoiceMessage) o; | |
| 538 | - VoiceMessage voiceMessage = new VoiceMessage(MessageType.voiceMessage, o1, o1.isSelf()); | |
| 539 | - chatListAdapter.addItem(voiceMessage); | |
| 540 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_VIDEO) { | |
| 541 | - msgIds.add(o.getMessageId()); | |
| 542 | - CNVideoMessage ol = (CNVideoMessage) o; | |
| 543 | - VideoMessage videoMessage = new VideoMessage(MessageType.videoMessage, ol, ol.isSelf()); | |
| 544 | - chatListAdapter.addItem(videoMessage); | |
| 545 | - } else if (o.getMsgType() == IChat.CN_MSG_TYPE_UGC) { | |
| 546 | - msgIds.add(o.getMessageId()); | |
| 547 | - CNUgcMessage ol = (CNUgcMessage) o; | |
| 548 | - UgcVideoMessage ugcVideoMessage = new UgcVideoMessage(MessageType.ugcVideoMessage, ol, ol.isSelf()); | |
| 549 | - chatListAdapter.addItem(ugcVideoMessage); | |
| 479 | + }); | |
| 480 | + | |
| 550 | 481 | } |
| 551 | - if (chatListAdapter.getItemCount() > 0) | |
| 552 | - chatListView.smoothScrollToPosition(chatListAdapter.getItemCount() - 1); | |
| 553 | - } | |
| 482 | + }; | |
| 554 | 483 | |
| 555 | 484 | /** |
| 556 | 485 | * 开启扫描之前判断权限是否打开 |
| ... | ... | @@ -561,15 +490,14 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 561 | 490 | Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) && |
| 562 | 491 | (ContextCompat.checkSelfPermission(context, |
| 563 | 492 | Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) |
| 564 | - && (ContextCompat.checkSelfPermission(context, | |
| 565 | - Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) { | |
| 493 | + ) { | |
| 566 | 494 | StartListener(); |
| 567 | 495 | |
| 568 | 496 | //判断是否开启语音权限 |
| 569 | 497 | } else { |
| 570 | 498 | //请求获取摄像头权限 |
| 571 | 499 | ActivityCompat.requestPermissions((Activity) context, |
| 572 | - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA}, VOICE_REQUEST_CODE); | |
| 500 | + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, VOICE_REQUEST_CODE); | |
| 573 | 501 | } |
| 574 | 502 | } |
| 575 | 503 | |
| ... | ... | @@ -626,7 +554,7 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 626 | 554 | float moveX = Math.abs(event.getX() - downX); |
| 627 | 555 | float moveY = Math.abs(event.getY() - downY); |
| 628 | 556 | if (moveY > 100) { |
| 629 | -// Toast.makeText(PrivateActivity.this, "cancel", Toast.LENGTH_SHORT).show(); | |
| 557 | +// Toast.makeText(ChatRoomActivity.this, "cancel", Toast.LENGTH_SHORT).show(); | |
| 630 | 558 | mAudioRecordUtil.cancelRecord(); |
| 631 | 559 | } else { |
| 632 | 560 | mAudioRecordUtil.stopRecord(); //结束录音(保存录音文件) |
| ... | ... | @@ -639,7 +567,7 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 639 | 567 | float moveXm = Math.abs(event.getX() - downX); |
| 640 | 568 | float moveYm = Math.abs(event.getY() - downY); |
| 641 | 569 | if (moveYm > 100) { |
| 642 | -// Toast.makeText(PrivateActivity.this, "cancel", Toast.LENGTH_SHORT).show(); | |
| 570 | +// Toast.makeText(ChatRoomActivity.this, "cancel", Toast.LENGTH_SHORT).show(); | |
| 643 | 571 | if (sendMsgLayout.getVisibility() == View.VISIBLE) { |
| 644 | 572 | sendMsgLayout.setVisibility(View.GONE); |
| 645 | 573 | cancelSendLayout.setVisibility(View.VISIBLE); |
| ... | ... | @@ -711,210 +639,24 @@ public class PrivateActivity extends AppCompatActivity implements View.OnClickLi |
| 711 | 639 | } |
| 712 | 640 | }; |
| 713 | 641 | |
| 714 | - /** | |
| 715 | - * 播放语音文件 | |
| 716 | - * | |
| 717 | - * @param voicePath | |
| 718 | - * @param animationDrawable | |
| 719 | - */ | |
| 720 | - private void startVoice(String voicePath, final AnimationDrawable animationDrawable) { | |
| 721 | - try { | |
| 722 | - FileInputStream fis = new FileInputStream(voicePath); | |
| 723 | - MediaUtil.getInstance().play(fis); | |
| 724 | - animationDrawable.start(); | |
| 725 | - MediaUtil.getInstance().setEventListener(new MediaUtil.EventListener() { | |
| 726 | - @Override | |
| 727 | - public void onStop() { | |
| 728 | - animationDrawable.stop(); | |
| 729 | - animationDrawable.selectDrawable(0); | |
| 730 | - } | |
| 731 | - }); | |
| 732 | - } catch (Exception e) { | |
| 733 | - } | |
| 734 | - } | |
| 735 | - | |
| 736 | 642 | @Override |
| 737 | - public void onItemClick(final VoiceMessage voiceMessage, final AnimationDrawable animationDrawable) { | |
| 738 | - if (voiceMessage == null) { | |
| 739 | - Toast.makeText(this, "数据异常", Toast.LENGTH_LONG).show(); | |
| 740 | - return; | |
| 741 | - } | |
| 742 | - if (voiceMessage.getCnVoiceMessage().isSelf()) { | |
| 743 | - startVoice(voiceMessage.getCnVoiceMessage().getVoiceUri().getPath(), animationDrawable); | |
| 643 | + public void onItemClick(VoiceMessage voiceMessage) { | |
| 644 | + if (voiceMessage.isUserSend()) { | |
| 645 | + playerUtil.start(voiceMessage.getCnVoiceMessage().getVoiceUri()); | |
| 744 | 646 | } else { |
| 745 | - //设置本地已读 | |
| 746 | - voiceMessage.getCnVoiceMessage().setRead(true); | |
| 747 | - String voiceUuid = voiceMessage.getCnVoiceMessage().getUuid(); | |
| 748 | - final String voicePath = FileUtil.getCacheFilePath(voiceUuid); | |
| 749 | - if (FileUtil.isCacheFileExist(voiceUuid)) { | |
| 750 | - File file = new File(voicePath); | |
| 751 | - if (file.length() < voiceMessage.getCnVoiceMessage().getDataSize()) { | |
| 752 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 753 | - return; | |
| 754 | - } | |
| 755 | - startVoice(voicePath, animationDrawable); | |
| 756 | - } else { | |
| 757 | - if (voiceMessage.isDownloading()) { | |
| 758 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 759 | - } else { | |
| 760 | - voiceMessage.setDownloading(true); | |
| 761 | - voiceMessage.getCnVoiceMessage().getVoice(voicePath, new IChat.OnDownloadListener() { | |
| 762 | - @Override | |
| 763 | - public void onSuccess() { | |
| 764 | - voiceMessage.setDownloading(false); | |
| 765 | - startVoice(voicePath, animationDrawable); | |
| 766 | - } | |
| 767 | - | |
| 768 | - @Override | |
| 769 | - public void onError(int i, String s) { | |
| 770 | - voiceMessage.setDownloading(false); | |
| 771 | - } | |
| 772 | - }); | |
| 773 | - } | |
| 774 | - } | |
| 775 | - } | |
| 776 | - } | |
| 777 | - | |
| 778 | - @Override | |
| 779 | - public void onVideoClick(final VideoMessage videoMessage) { | |
| 780 | - if (videoMessage.getCnVideoMessage().isSelf()) { | |
| 781 | - Intent intent = new Intent(PrivateActivity.this, VideoActivity.class); | |
| 782 | - intent.putExtra("videoPath", videoMessage.getCnVideoMessage().getVideoPath()); | |
| 783 | - startActivity(intent); | |
| 784 | - } else { | |
| 785 | - String videoUuid = videoMessage.getCnVideoMessage().getVideo().getUuid(); | |
| 786 | - final String videoPath = FileUtil.getCacheFilePath(videoUuid); | |
| 787 | - if (FileUtil.isCacheFileExist(videoUuid)) { | |
| 788 | - File file = new File(videoPath); | |
| 789 | - if (file.length() < videoMessage.getCnVideoMessage().getVideo().getSize()) { | |
| 790 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 791 | - return; | |
| 792 | - } | |
| 793 | - Intent intent = new Intent(PrivateActivity.this, VideoActivity.class); | |
| 794 | - intent.putExtra("videoPath", videoPath); | |
| 795 | - startActivity(intent); | |
| 796 | - } else { | |
| 797 | - if (videoMessage.isDownloading()) { | |
| 798 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 799 | - } else { | |
| 800 | - videoMessage.setDownloading(true); | |
| 801 | - videoMessage.getCnVideoMessage().getVideo().getVideo(videoPath, new IChat.OnDownloadListener() { | |
| 802 | - @Override | |
| 803 | - public void onSuccess() { | |
| 804 | - videoMessage.setDownloading(false); | |
| 805 | - Intent intent = new Intent(PrivateActivity.this, VideoActivity.class); | |
| 806 | - intent.putExtra("videoPath", videoPath); | |
| 807 | - startActivity(intent); | |
| 808 | - } | |
| 809 | - | |
| 810 | - @Override | |
| 811 | - public void onError(int i, String s) { | |
| 812 | - videoMessage.setDownloading(false); | |
| 813 | - } | |
| 814 | - }); | |
| 815 | - } | |
| 816 | - } | |
| 817 | - } | |
| 818 | - | |
| 819 | - } | |
| 820 | - | |
| 821 | - @Override | |
| 822 | - public void onUgcVideoClick(final UgcVideoMessage ugcVideoMessage) { | |
| 823 | - if (ugcVideoMessage.getCnUgcMessage().isSelf()) { | |
| 824 | - Intent intent = new Intent(PrivateActivity.this, VideoActivity.class); | |
| 825 | - intent.putExtra("videoPath", ugcVideoMessage.getCnUgcMessage().getVideoPath()); | |
| 826 | - startActivity(intent); | |
| 827 | - } else { | |
| 828 | - String videoUuid = ugcVideoMessage.getCnUgcMessage().getFileId() + "_video"; | |
| 829 | - final String videoPath = FileUtil.getCacheFilePath(videoUuid); | |
| 830 | - if (FileUtil.isCacheFileExist(videoUuid)) { | |
| 831 | - File file = new File(videoPath); | |
| 832 | - if (file.length() < ugcVideoMessage.getCnUgcMessage().getVideo().getSize()) { | |
| 833 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 834 | - return; | |
| 835 | - } | |
| 836 | - Intent intent = new Intent(PrivateActivity.this, VideoActivity.class); | |
| 837 | - intent.putExtra("videoPath", videoPath); | |
| 838 | - startActivity(intent); | |
| 839 | - } else { | |
| 840 | - if (ugcVideoMessage.isDownloading()) { | |
| 841 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 842 | - } else { | |
| 843 | - ugcVideoMessage.setDownloading(true); | |
| 844 | - ugcVideoMessage.getCnUgcMessage().getVideo().getVideo(videoPath, new IChat.OnDownloadListener() { | |
| 845 | - @Override | |
| 846 | - public void onSuccess() { | |
| 847 | - ugcVideoMessage.setDownloading(false); | |
| 848 | - Intent intent = new Intent(PrivateActivity.this, VideoActivity.class); | |
| 849 | - intent.putExtra("videoPath", videoPath); | |
| 850 | - startActivity(intent); | |
| 851 | - } | |
| 852 | - | |
| 853 | - @Override | |
| 854 | - public void onError(int i, String s) { | |
| 855 | - ugcVideoMessage.setDownloading(false); | |
| 856 | - } | |
| 857 | - }); | |
| 647 | + final String voicePath = FileUtil.getTempFile(FileUtil.FileType.AUDIO).getAbsolutePath(); | |
| 648 | + voiceMessage.getCnVoiceMessage().getVoice(voicePath, new IChat.OnDownloadListener() { | |
| 649 | + @Override | |
| 650 | + public void onSuccess() { | |
| 651 | + if (playerUtil != null) | |
| 652 | + playerUtil.start(Uri.parse(voicePath)); | |
| 858 | 653 | } |
| 859 | - } | |
| 860 | - } | |
| 861 | - } | |
| 862 | 654 | |
| 863 | - @Override | |
| 864 | - public void onImageClick(final ImagMessage imagMessage) { | |
| 865 | - if (imagMessage.getCnImgMessage().isSelf()) { | |
| 866 | - Intent intent = new Intent(PrivateActivity.this, ImageViewActivity.class); | |
| 867 | - intent.putExtra("path", imagMessage.getCnImgMessage().getImagePath()); | |
| 868 | - startActivity(intent); | |
| 869 | - } else { | |
| 870 | - String remoteUuid = imagMessage.getCnImgMessage().getRemoteUuid(); | |
| 871 | - final String imagePath = FileUtil.getCacheFilePath(remoteUuid); | |
| 872 | - if (FileUtil.isCacheFileExist(remoteUuid)) { | |
| 873 | - File file = new File(imagePath); | |
| 874 | - if (file.length() < imagMessage.getCnImgMessage().getRemoteSize()) { | |
| 875 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 876 | - return; | |
| 877 | - } | |
| 878 | - Intent intent = new Intent(PrivateActivity.this, ImageViewActivity.class); | |
| 879 | - intent.putExtra("path", imagePath); | |
| 880 | - startActivity(intent); | |
| 881 | - } else { | |
| 882 | - if (imagMessage.isDownloading()) { | |
| 883 | - Toast.makeText(context, "请稍等,正在下载...", Toast.LENGTH_SHORT).show(); | |
| 884 | - } else { | |
| 885 | - imagMessage.setDownloading(true); | |
| 886 | - imagMessage.getCnImgMessage().getRemoteImage(imagePath, new IChat.OnDownloadListener() { | |
| 887 | - @Override | |
| 888 | - public void onSuccess() { | |
| 889 | - imagMessage.setDownloading(false); | |
| 890 | - Intent intent = new Intent(PrivateActivity.this, ImageViewActivity.class); | |
| 891 | - intent.putExtra("path", imagePath); | |
| 892 | - startActivity(intent); | |
| 893 | - } | |
| 655 | + @Override | |
| 656 | + public void onError(int i, String s) { | |
| 894 | 657 | |
| 895 | - @Override | |
| 896 | - public void onError(int i, String s) { | |
| 897 | - imagMessage.setDownloading(false); | |
| 898 | - Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show(); | |
| 899 | - } | |
| 900 | - }); | |
| 901 | 658 | } |
| 902 | - } | |
| 659 | + }); | |
| 903 | 660 | } |
| 904 | 661 | } |
| 905 | - | |
| 906 | - @Override | |
| 907 | - protected void onPause() { | |
| 908 | - super.onPause(); | |
| 909 | - MediaUtil.getInstance().stop(); | |
| 910 | - } | |
| 911 | - | |
| 912 | - @Override | |
| 913 | - protected void onDestroy() { | |
| 914 | - super.onDestroy(); | |
| 915 | - ChatUtil.removeUploadProgressListener(uploadProgressListener); | |
| 916 | - ChatUtil.removeReceiveMessageListener(receiveMessageListener); | |
| 917 | - ChatUtil.removeConnectListener(connectListener); | |
| 918 | - ChatUtil.removeConnectStatusListener(connectStatusListener); | |
| 919 | - } | |
| 920 | 662 | } | ... | ... |
app/src/main/java/com/cnlive/im/ui/UserLoginActivity.java
| ... | ... | @@ -22,6 +22,7 @@ public class UserLoginActivity extends AppCompatActivity implements View.OnClick |
| 22 | 22 | private EditText user_name; |
| 23 | 23 | private EditText user_id; |
| 24 | 24 | private Button group_chatBtn, private_chatBtn; |
| 25 | + private Button group_3_chatBtn, private_3_chatBtn; | |
| 25 | 26 | private String user_name_string; |
| 26 | 27 | private String user_id_string; |
| 27 | 28 | |
| ... | ... | @@ -40,6 +41,10 @@ public class UserLoginActivity extends AppCompatActivity implements View.OnClick |
| 40 | 41 | group_chatBtn.setOnClickListener(this); |
| 41 | 42 | private_chatBtn = (Button) findViewById(R.id.private_chat); |
| 42 | 43 | private_chatBtn.setOnClickListener(this); |
| 44 | + group_3_chatBtn = (Button) findViewById(R.id.group_chat_3); | |
| 45 | + group_3_chatBtn.setOnClickListener(this); | |
| 46 | + private_3_chatBtn = (Button) findViewById(R.id.private_chat_3); | |
| 47 | + private_3_chatBtn.setOnClickListener(this); | |
| 43 | 48 | } |
| 44 | 49 | |
| 45 | 50 | |
| ... | ... | @@ -51,7 +56,12 @@ public class UserLoginActivity extends AppCompatActivity implements View.OnClick |
| 51 | 56 | break; |
| 52 | 57 | case R.id.private_chat: |
| 53 | 58 | doIntentChatRoom(PrivateActivity.class); |
| 54 | - | |
| 59 | + break; | |
| 60 | + case R.id.group_chat_3: | |
| 61 | + doIntentChatRoom(ChatRoom3Activity.class); | |
| 62 | + break; | |
| 63 | + case R.id.private_chat_3: | |
| 64 | + doIntentChatRoom(Private3Activity.class); | |
| 55 | 65 | break; |
| 56 | 66 | } |
| 57 | 67 | ... | ... |
app/src/main/java/com/cnlive/im/util/PlayerUtil.java
0 → 100644
| 1 | +package com.cnlive.im.util; | |
| 2 | + | |
| 3 | +import android.content.Context; | |
| 4 | +import android.media.MediaPlayer; | |
| 5 | +import android.net.Uri; | |
| 6 | + | |
| 7 | +/** | |
| 8 | + * Created by Lynn on 2017/7/21. | |
| 9 | + */ | |
| 10 | + | |
| 11 | +public class PlayerUtil implements IVoiceManager{ | |
| 12 | + private final String TAG = "PlayerUtil"; | |
| 13 | + private String path; | |
| 14 | + private Context mContext; | |
| 15 | + | |
| 16 | + private MediaPlayer mediaPlayer; | |
| 17 | + | |
| 18 | + public PlayerUtil(Context context){ | |
| 19 | + this.mContext = context; | |
| 20 | +// mediaPlayer = new MediaPlayer(); | |
| 21 | +// mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { | |
| 22 | +// @Override | |
| 23 | +// public void onCompletion(MediaPlayer mediaPlayer) { | |
| 24 | +//// mediaPlayer.stop(); | |
| 25 | +// stop(); | |
| 26 | +// } | |
| 27 | +// }); | |
| 28 | + } | |
| 29 | + | |
| 30 | + @Override | |
| 31 | + public boolean start(Uri uri) { | |
| 32 | + try { | |
| 33 | + mediaPlayer = new MediaPlayer(); | |
| 34 | + mediaPlayer.setOnCompletionListener(onCompletionListener); | |
| 35 | + mediaPlayer.setOnPreparedListener(onPreparedListener); | |
| 36 | + mediaPlayer.setDataSource(mContext, uri); | |
| 37 | + mediaPlayer.prepare(); | |
| 38 | +// mediaPlayer.start(); | |
| 39 | + }catch (Exception e){ | |
| 40 | + e.printStackTrace(); | |
| 41 | + } | |
| 42 | + return false; | |
| 43 | + } | |
| 44 | + | |
| 45 | + @Override | |
| 46 | + public boolean stop() { | |
| 47 | + mediaPlayer.stop(); | |
| 48 | + mediaPlayer.release(); | |
| 49 | + mediaPlayer = null; | |
| 50 | + return false; | |
| 51 | + } | |
| 52 | + | |
| 53 | + @Override | |
| 54 | + public void onDestory() { | |
| 55 | + mediaPlayer.release(); | |
| 56 | + mediaPlayer = null; | |
| 57 | + } | |
| 58 | + | |
| 59 | + private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() { | |
| 60 | + @Override | |
| 61 | + public void onCompletion(MediaPlayer mediaPlayer) { | |
| 62 | + stop(); | |
| 63 | + } | |
| 64 | + }; | |
| 65 | + | |
| 66 | + private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() { | |
| 67 | + @Override | |
| 68 | + public void onPrepared(MediaPlayer mediaPlayer) { | |
| 69 | + mediaPlayer.start(); | |
| 70 | + } | |
| 71 | + }; | |
| 72 | +} | ... | ... |
app/src/main/res/layout/activity_groupchat.xml
| ... | ... | @@ -117,18 +117,6 @@ |
| 117 | 117 | android:layout_height="wrap_content" |
| 118 | 118 | android:text="退出" /> |
| 119 | 119 | |
| 120 | - <Button | |
| 121 | - android:id="@+id/videoBtn" | |
| 122 | - android:layout_width="wrap_content" | |
| 123 | - android:layout_height="wrap_content" | |
| 124 | - android:text="视频文件"/> | |
| 125 | - | |
| 126 | - <Button | |
| 127 | - android:id="@+id/ugcVideoBtn" | |
| 128 | - android:layout_width="wrap_content" | |
| 129 | - android:layout_height="wrap_content" | |
| 130 | - android:text="短视频"/> | |
| 131 | - | |
| 132 | 120 | </LinearLayout> |
| 133 | 121 | |
| 134 | 122 | </LinearLayout> | ... | ... |
app/src/main/res/layout/activity_groupchat_3.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:id="@+id/activity_chat_room" | |
| 4 | + android:layout_width="match_parent" | |
| 5 | + android:layout_height="match_parent"> | |
| 6 | + | |
| 7 | + <RelativeLayout | |
| 8 | + android:id="@+id/re_chat" | |
| 9 | + android:layout_width="match_parent" | |
| 10 | + android:layout_height="match_parent" | |
| 11 | + android:layout_alignParentLeft="true" | |
| 12 | + android:layout_alignParentStart="true" | |
| 13 | + android:layout_alignParentTop="true" | |
| 14 | + android:clickable="true" | |
| 15 | + android:visibility="visible"> | |
| 16 | + | |
| 17 | + <LinearLayout | |
| 18 | + android:id="@+id/listVIewTop" | |
| 19 | + android:layout_width="match_parent" | |
| 20 | + android:layout_height="match_parent" | |
| 21 | + android:layout_above="@+id/buttons" | |
| 22 | + android:layout_alignParentLeft="true" | |
| 23 | + android:layout_alignParentStart="true" | |
| 24 | + android:layout_alignParentTop="true" | |
| 25 | + android:orientation="horizontal"> | |
| 26 | + | |
| 27 | + | |
| 28 | + <android.support.v7.widget.RecyclerView | |
| 29 | + android:id="@+id/chat_list_viewOne" | |
| 30 | + android:layout_width="match_parent" | |
| 31 | + android:layout_height="match_parent" | |
| 32 | + android:layout_above="@+id/edit_layout" | |
| 33 | + android:divider="@null" | |
| 34 | + android:fastScrollEnabled="true" | |
| 35 | + android:scrollbars="none" /> | |
| 36 | + </LinearLayout> | |
| 37 | + | |
| 38 | + <LinearLayout | |
| 39 | + android:id="@+id/edit_layout" | |
| 40 | + android:layout_width="match_parent" | |
| 41 | + android:layout_height="wrap_content" | |
| 42 | + android:layout_alignParentBottom="true" | |
| 43 | + android:orientation="horizontal"> | |
| 44 | + | |
| 45 | + <ImageView | |
| 46 | + android:id="@+id/keybord" | |
| 47 | + android:layout_width="0dp" | |
| 48 | + android:layout_height="wrap_content" | |
| 49 | + android:layout_gravity="center_vertical" | |
| 50 | + android:layout_weight="0.1" | |
| 51 | + android:src="@drawable/voice" /> | |
| 52 | + | |
| 53 | + <EditText | |
| 54 | + android:id="@+id/message_content" | |
| 55 | + android:layout_width="0dp" | |
| 56 | + android:layout_height="wrap_content" | |
| 57 | + android:layout_gravity="center" | |
| 58 | + android:layout_weight="0.6" /> | |
| 59 | + | |
| 60 | + <Button | |
| 61 | + android:id="@+id/send_voice" | |
| 62 | + android:layout_width="0dp" | |
| 63 | + android:layout_height="40dp" | |
| 64 | + android:layout_margin="10dp" | |
| 65 | + android:layout_weight="0.6" | |
| 66 | + android:background="@drawable/voice_bg" | |
| 67 | + android:text="按住说话" | |
| 68 | + android:visibility="gone" /> | |
| 69 | + | |
| 70 | + <ImageView | |
| 71 | + android:id="@+id/ima_send" | |
| 72 | + android:layout_width="0dp" | |
| 73 | + android:layout_height="wrap_content" | |
| 74 | + android:layout_gravity="center_vertical" | |
| 75 | + android:layout_weight="0.1" | |
| 76 | + android:src="@drawable/pic" | |
| 77 | + android:visibility="visible" /> | |
| 78 | + | |
| 79 | + <Button | |
| 80 | + android:id="@+id/send_messageOne" | |
| 81 | + android:layout_width="0dp" | |
| 82 | + android:layout_height="wrap_content" | |
| 83 | + android:layout_gravity="center" | |
| 84 | + android:layout_weight="0.2" | |
| 85 | + android:text="发送" | |
| 86 | + android:visibility="gone" /> | |
| 87 | + | |
| 88 | + </LinearLayout> | |
| 89 | + | |
| 90 | + <LinearLayout | |
| 91 | + android:id="@+id/buttons" | |
| 92 | + android:layout_width="match_parent" | |
| 93 | + android:layout_height="wrap_content" | |
| 94 | + android:layout_above="@id/edit_layout" | |
| 95 | + android:orientation="vertical"> | |
| 96 | + | |
| 97 | + <LinearLayout | |
| 98 | + android:layout_width="match_parent" | |
| 99 | + android:layout_height="wrap_content" | |
| 100 | + android:orientation="horizontal"> | |
| 101 | + | |
| 102 | + <Button | |
| 103 | + android:id="@+id/creatChat" | |
| 104 | + android:layout_width="wrap_content" | |
| 105 | + android:layout_height="wrap_content" | |
| 106 | + android:text="加入聊天室" /> | |
| 107 | + | |
| 108 | + <!--<Button--> | |
| 109 | + <!--android:id="@+id/ima_send"--> | |
| 110 | + <!--android:layout_width="wrap_content"--> | |
| 111 | + <!--android:layout_height="wrap_content"--> | |
| 112 | + <!--android:text="图片" />--> | |
| 113 | + | |
| 114 | + <Button | |
| 115 | + android:id="@+id/exit_chat1" | |
| 116 | + android:layout_width="wrap_content" | |
| 117 | + android:layout_height="wrap_content" | |
| 118 | + android:text="退出" /> | |
| 119 | + | |
| 120 | + <Button | |
| 121 | + android:id="@+id/videoBtn" | |
| 122 | + android:layout_width="wrap_content" | |
| 123 | + android:layout_height="wrap_content" | |
| 124 | + android:text="视频文件"/> | |
| 125 | + | |
| 126 | + <Button | |
| 127 | + android:id="@+id/ugcVideoBtn" | |
| 128 | + android:layout_width="wrap_content" | |
| 129 | + android:layout_height="wrap_content" | |
| 130 | + android:text="短视频"/> | |
| 131 | + | |
| 132 | + </LinearLayout> | |
| 133 | + | |
| 134 | + </LinearLayout> | |
| 135 | + </RelativeLayout> | |
| 136 | + | |
| 137 | +</RelativeLayout> | ... | ... |
app/src/main/res/layout/activity_private_chat.xml
| ... | ... | @@ -7,14 +7,15 @@ |
| 7 | 7 | |
| 8 | 8 | <LinearLayout |
| 9 | 9 | android:layout_width="match_parent" |
| 10 | - android:layout_height="wrap_content" | |
| 11 | - android:orientation="vertical"> | |
| 10 | + android:layout_height="match_parent" | |
| 11 | + android:orientation="vertical" | |
| 12 | + android:layout_above="@+id/edit_layout"> | |
| 12 | 13 | |
| 13 | 14 | |
| 14 | 15 | <android.support.v7.widget.RecyclerView |
| 15 | 16 | android:id="@+id/private_list_view" |
| 16 | 17 | android:layout_width="match_parent" |
| 17 | - android:layout_height="300dp" | |
| 18 | + android:layout_height="match_parent" | |
| 18 | 19 | android:divider="@null" |
| 19 | 20 | android:scrollbars="none" |
| 20 | 21 | android:transcriptMode="alwaysScroll" |
| ... | ... | @@ -36,18 +37,6 @@ |
| 36 | 37 | android:layout_height="wrap_content" |
| 37 | 38 | android:text="邀请对方聊天" /> |
| 38 | 39 | |
| 39 | - <Button | |
| 40 | - android:id="@+id/videoBtn" | |
| 41 | - android:layout_width="wrap_content" | |
| 42 | - android:layout_height="wrap_content" | |
| 43 | - android:text="视频文件"/> | |
| 44 | - | |
| 45 | - <Button | |
| 46 | - android:id="@+id/ugcVideoBtn" | |
| 47 | - android:layout_width="wrap_content" | |
| 48 | - android:layout_height="wrap_content" | |
| 49 | - android:text="短视频"/> | |
| 50 | - | |
| 51 | 40 | |
| 52 | 41 | <LinearLayout |
| 53 | 42 | android:id="@+id/edit_layout_se" | ... | ... |
app/src/main/res/layout/activity_private_chat_3.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:id="@+id/activity_private_chat" | |
| 4 | + android:layout_width="match_parent" | |
| 5 | + android:layout_height="match_parent" | |
| 6 | + android:clickable="true"> | |
| 7 | + | |
| 8 | + <LinearLayout | |
| 9 | + android:layout_width="match_parent" | |
| 10 | + android:layout_height="match_parent" | |
| 11 | + android:orientation="vertical" | |
| 12 | + android:layout_above="@+id/edit_layout"> | |
| 13 | + | |
| 14 | + | |
| 15 | + <android.support.v7.widget.RecyclerView | |
| 16 | + android:id="@+id/private_list_view" | |
| 17 | + android:layout_width="match_parent" | |
| 18 | + android:layout_height="match_parent" | |
| 19 | + android:divider="@null" | |
| 20 | + android:scrollbars="none" | |
| 21 | + android:transcriptMode="alwaysScroll" | |
| 22 | + android:visibility="invisible" /> | |
| 23 | + </LinearLayout> | |
| 24 | + | |
| 25 | + <LinearLayout | |
| 26 | + android:id="@+id/edit_layout" | |
| 27 | + android:layout_width="match_parent" | |
| 28 | + android:layout_height="wrap_content" | |
| 29 | + android:layout_alignParentBottom="true" | |
| 30 | + android:orientation="vertical" | |
| 31 | + android:visibility="invisible"> | |
| 32 | + | |
| 33 | + | |
| 34 | + <Button | |
| 35 | + android:id="@+id/vistor_Btn" | |
| 36 | + android:layout_width="wrap_content" | |
| 37 | + android:layout_height="wrap_content" | |
| 38 | + android:text="邀请对方聊天" /> | |
| 39 | + | |
| 40 | + <Button | |
| 41 | + android:id="@+id/videoBtn" | |
| 42 | + android:layout_width="wrap_content" | |
| 43 | + android:layout_height="wrap_content" | |
| 44 | + android:text="视频文件"/> | |
| 45 | + | |
| 46 | + <Button | |
| 47 | + android:id="@+id/ugcVideoBtn" | |
| 48 | + android:layout_width="wrap_content" | |
| 49 | + android:layout_height="wrap_content" | |
| 50 | + android:text="短视频"/> | |
| 51 | + | |
| 52 | + | |
| 53 | + <LinearLayout | |
| 54 | + android:id="@+id/edit_layout_se" | |
| 55 | + android:layout_width="match_parent" | |
| 56 | + android:layout_height="wrap_content" | |
| 57 | + android:layout_alignParentBottom="true" | |
| 58 | + android:orientation="horizontal"> | |
| 59 | + | |
| 60 | + <ImageView | |
| 61 | + android:id="@+id/keybord" | |
| 62 | + android:layout_width="0dp" | |
| 63 | + android:layout_height="wrap_content" | |
| 64 | + android:layout_gravity="center_vertical" | |
| 65 | + android:layout_weight="0.1" | |
| 66 | + android:src="@drawable/voice" /> | |
| 67 | + | |
| 68 | + <EditText | |
| 69 | + android:id="@+id/message_content" | |
| 70 | + android:layout_width="0dp" | |
| 71 | + android:layout_height="wrap_content" | |
| 72 | + android:layout_gravity="center" | |
| 73 | + android:layout_weight="0.6" /> | |
| 74 | + | |
| 75 | + <Button | |
| 76 | + android:id="@+id/send_voice" | |
| 77 | + android:layout_width="0dp" | |
| 78 | + android:layout_height="40dp" | |
| 79 | + android:layout_margin="10dp" | |
| 80 | + android:layout_weight="0.6" | |
| 81 | + android:background="@drawable/voice_bg" | |
| 82 | + android:text="按住说话" | |
| 83 | + android:visibility="gone" /> | |
| 84 | + | |
| 85 | + <ImageView | |
| 86 | + android:id="@+id/ima_send" | |
| 87 | + android:layout_width="0dp" | |
| 88 | + android:layout_height="wrap_content" | |
| 89 | + android:layout_gravity="center_vertical" | |
| 90 | + android:layout_weight="0.1" | |
| 91 | + android:src="@drawable/pic" | |
| 92 | + android:visibility="visible" /> | |
| 93 | + | |
| 94 | + <Button | |
| 95 | + android:id="@+id/send_message" | |
| 96 | + android:layout_width="0dp" | |
| 97 | + android:layout_height="wrap_content" | |
| 98 | + android:layout_gravity="center" | |
| 99 | + android:layout_weight="0.2" | |
| 100 | + android:text="发送" | |
| 101 | + android:visibility="gone" /> | |
| 102 | + | |
| 103 | + </LinearLayout> | |
| 104 | + </LinearLayout> | |
| 105 | + | |
| 106 | + | |
| 107 | + <LinearLayout | |
| 108 | + android:id="@+id/opposite_liner_useID" | |
| 109 | + android:layout_width="match_parent" | |
| 110 | + android:layout_height="wrap_content" | |
| 111 | + android:layout_alignParentLeft="true" | |
| 112 | + android:layout_alignParentStart="true" | |
| 113 | + android:layout_centerVertical="true" | |
| 114 | + android:orientation="vertical"> | |
| 115 | + | |
| 116 | + <LinearLayout | |
| 117 | + android:layout_width="match_parent" | |
| 118 | + android:layout_height="wrap_content" | |
| 119 | + android:orientation="horizontal"> | |
| 120 | + | |
| 121 | + | |
| 122 | + <TextView | |
| 123 | + android:layout_width="wrap_content" | |
| 124 | + android:layout_height="wrap_content" | |
| 125 | + android:layout_gravity="center" | |
| 126 | + android:gravity="center" | |
| 127 | + android:text="对方id :" | |
| 128 | + android:textSize="22dp" | |
| 129 | + android:textStyle="bold" /> | |
| 130 | + | |
| 131 | + <EditText | |
| 132 | + android:id="@+id/opposite_id_edit" | |
| 133 | + android:layout_width="0dp" | |
| 134 | + android:layout_height="wrap_content" | |
| 135 | + android:layout_gravity="center" | |
| 136 | + android:layout_weight="1" /> | |
| 137 | + </LinearLayout> | |
| 138 | + | |
| 139 | + <LinearLayout | |
| 140 | + android:layout_width="match_parent" | |
| 141 | + android:layout_height="wrap_content"> | |
| 142 | + | |
| 143 | + <TextView | |
| 144 | + android:layout_width="wrap_content" | |
| 145 | + android:layout_height="wrap_content" | |
| 146 | + android:layout_gravity="center" | |
| 147 | + android:gravity="center" | |
| 148 | + android:text="name:" | |
| 149 | + android:textSize="22dp" | |
| 150 | + android:textStyle="bold" /> | |
| 151 | + | |
| 152 | + <EditText | |
| 153 | + android:id="@+id/opposite_name_edit" | |
| 154 | + android:layout_width="0dp" | |
| 155 | + android:layout_height="wrap_content" | |
| 156 | + android:layout_gravity="center" | |
| 157 | + android:layout_weight="1" /> | |
| 158 | + | |
| 159 | + </LinearLayout> | |
| 160 | + | |
| 161 | + | |
| 162 | + <Button | |
| 163 | + android:id="@+id/userId_btn_top" | |
| 164 | + android:layout_width="match_parent" | |
| 165 | + android:layout_height="wrap_content" | |
| 166 | + android:layout_gravity="center" | |
| 167 | + android:text="确定" /> | |
| 168 | + </LinearLayout> | |
| 169 | + | |
| 170 | + <LinearLayout | |
| 171 | + android:id="@+id/agree_reject_lin" | |
| 172 | + android:layout_width="wrap_content" | |
| 173 | + android:layout_height="wrap_content" | |
| 174 | + android:layout_centerInParent="true" | |
| 175 | + android:background="@drawable/slel_back" | |
| 176 | + android:orientation="vertical" | |
| 177 | + android:visibility="invisible"> | |
| 178 | + | |
| 179 | + <TextView | |
| 180 | + android:layout_width="match_parent" | |
| 181 | + android:layout_height="wrap_content" | |
| 182 | + android:gravity="center" | |
| 183 | + android:text="有人请求和您进行私聊" /> | |
| 184 | + | |
| 185 | + <LinearLayout | |
| 186 | + android:layout_width="wrap_content" | |
| 187 | + android:layout_height="wrap_content"> | |
| 188 | + | |
| 189 | + <Button | |
| 190 | + android:id="@+id/agree_btn" | |
| 191 | + android:layout_width="wrap_content" | |
| 192 | + android:layout_height="wrap_content" | |
| 193 | + android:background="#00000000" | |
| 194 | + android:text="同意" /> | |
| 195 | + | |
| 196 | + <Button | |
| 197 | + android:id="@+id/reject_btn" | |
| 198 | + android:layout_width="wrap_content" | |
| 199 | + android:layout_height="wrap_content" | |
| 200 | + android:background="#00000000" | |
| 201 | + android:text="拒绝" /> | |
| 202 | + </LinearLayout> | |
| 203 | + | |
| 204 | + </LinearLayout> | |
| 205 | + | |
| 206 | +</RelativeLayout> | ... | ... |
app/src/main/res/layout/activity_user.xml
| ... | ... | @@ -78,6 +78,35 @@ |
| 78 | 78 | |
| 79 | 79 | </RelativeLayout> |
| 80 | 80 | |
| 81 | + <RelativeLayout | |
| 82 | + android:layout_width="wrap_content" | |
| 83 | + android:layout_height="wrap_content" | |
| 84 | + android:orientation="horizontal"> | |
| 85 | + | |
| 86 | + <Button | |
| 87 | + android:id="@+id/group_chat_3" | |
| 88 | + android:layout_width="wrap_content" | |
| 89 | + android:layout_height="wrap_content" | |
| 90 | + android:text="群聊3.0" | |
| 91 | + android:layout_alignParentTop="true" | |
| 92 | + android:layout_alignParentLeft="true" | |
| 93 | + android:layout_alignParentStart="true" | |
| 94 | + android:layout_marginLeft="60dp" | |
| 95 | + android:layout_marginStart="60dp" /> | |
| 96 | + | |
| 97 | + <Button | |
| 98 | + android:id="@+id/private_chat_3" | |
| 99 | + android:layout_width="wrap_content" | |
| 100 | + android:layout_height="wrap_content" | |
| 101 | + android:text="私聊3.0" | |
| 102 | + android:layout_marginRight="65dp" | |
| 103 | + android:layout_marginEnd="65dp" | |
| 104 | + android:layout_alignParentTop="true" | |
| 105 | + android:layout_alignParentRight="true" | |
| 106 | + android:layout_alignParentEnd="true" /> | |
| 107 | + | |
| 108 | + </RelativeLayout> | |
| 109 | + | |
| 81 | 110 | |
| 82 | 111 | </LinearLayout> |
| 83 | 112 | ... | ... |
app/src/main/res/layout/voice_layout_item_oppsite.xml
| ... | ... | @@ -51,7 +51,8 @@ |
| 51 | 51 | android:layout_centerVertical="true" |
| 52 | 52 | android:layout_marginLeft="2dp" |
| 53 | 53 | android:layout_toRightOf="@+id/voice_duration" |
| 54 | - android:background="@drawable/voice_none_read" /> | |
| 54 | + android:background="@drawable/voice_none_read" | |
| 55 | + android:visibility="gone" /> | |
| 55 | 56 | |
| 56 | 57 | |
| 57 | 58 | </RelativeLayout> | ... | ... |