package chen.testchat.ui; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Handler; import android.os.Message; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.Selection; import android.text.Spannable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import org.pointstone.cugappplat.base.cusotomview.ToolBarOption; import org.pointstone.cugappplat.rxbus.RxBusManager; import org.pointstone.cugappplat.util.ToastUtils; import java.io.File; import java.util.ArrayList; import java.util.List; import chen.testchat.R; import chen.testchat.adapter.ChatMessageAdapter; import chen.testchat.base.CommonImageLoader; import chen.testchat.base.Constant; import chen.testchat.bean.BaseMessage; import chen.testchat.bean.ChatMessage; import chen.testchat.bean.FaceText; import chen.testchat.bean.GroupChatMessage; import chen.testchat.bean.GroupTableMessage; import chen.testchat.bean.ImageItem; import chen.testchat.bean.User; import chen.testchat.db.ChatDB; import chen.testchat.events.GroupInfoEvent; import chen.testchat.listener.AddFriendCallBackListener; import chen.testchat.listener.OnMessageReceiveListener; import chen.testchat.listener.OnSendMessageListener; import chen.testchat.listener.SendFileListener; import chen.testchat.manager.ChatNotificationManager; import chen.testchat.manager.MessageCacheManager; import chen.testchat.manager.MsgManager; import chen.testchat.manager.UserCacheManager; import chen.testchat.manager.UserManager; import chen.testchat.manager.VoiceRecordManager; import chen.testchat.receiver.PushMessageReceiver; import chen.testchat.util.CommonUtils; import chen.testchat.util.FaceTextUtil; import chen.testchat.util.LogUtil; import cn.bmob.v3.exception.BmobException; import rx.Subscription; import rx.functions.Action1; /** * 项目名称: HappyChat * 创建人: 陈锦军 * 创建时间: 2016/9/13 21:53 * QQ: 1981367757 */ public class ChatActivity extends SlideBaseActivity implements View.OnClickListener, TextWatcher, View.OnLongClickListener, View.OnTouchListener, ChatMessageAdapter.OnItemClickListener, OnMessageReceiveListener, SendFileListener { private SwipeRefreshLayout mSwipeRefreshLayout; private RecyclerView display; private Button add; private Button emotion; private EditText input; private Button speak; private Button voice; private Button send; private Button keyboard; private ViewPager mViewPager; private LinearLayout l1_more; private TextView location; private TextView picture; private TextView camera; private RelativeLayout r1_emotion; private LinearLayout l1_add; private RelativeLayout record_container; private ImageView record_display; private TextView record_tip; private LinearLayoutManager mLinearLayoutManager; private ChatMessageAdapter mAdapter; private String localImagePath; private List<FaceText> emotionFaceList; private GridViewAdapter gridViewAdapter; private GridViewAdapter mGridViewAdapter; private VoiceRecordManager mVoiceRecordManager; private String uid = ""; private int[] voiceImageId; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }; private User user; private String from; private String groupId; private GroupTableMessage mGroupTableMessage; private boolean exit=false; @Override public void initView() { initMiddleView(); initBottomView(); } private void initMiddleView() { record_container = (RelativeLayout) findViewById(R.id.r1_chat_middle_voice_container); record_display = (ImageView) findViewById(R.id.iv_chat_middle_voice_display); record_tip = (TextView) findViewById(R.id.tv_chat_middle_voice_tip); mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swl_chat_refresh); display = (RecyclerView) findViewById(R.id.rcy_chat_display); } private void initBottomView() { add = (Button) findViewById(R.id.btn_chat_bottom_add); emotion = (Button) findViewById(R.id.btn_chat_bottom_emotion); input = (EditText) findViewById(R.id.et_chat_bottom_input); speak = (Button) findViewById(R.id.btn_chat_bottom_speak); send = (Button) findViewById(R.id.btn_chat_bottom_send); voice = (Button) findViewById(R.id.btn_chat_bottom_voice); keyboard = (Button) findViewById(R.id.btn_chat_bottom_keyboard); l1_more = (LinearLayout) findViewById(R.id.l1_chat_bottom_more); mViewPager = (ViewPager) findViewById(R.id.vp_chat_bottom_emotion); r1_emotion = (RelativeLayout) findViewById(R.id.r1_chat_bottom_emotion); l1_add = (LinearLayout) findViewById(R.id.l1_chat_bottom_add); picture = (TextView) findViewById(R.id.tv_chat_bottom_picture); camera = (TextView) findViewById(R.id.tv_chat_bottom_camera); location = (TextView) findViewById(R.id.tv_chat_bottom_location); add.setOnClickListener(this); emotion.setOnClickListener(this); input.addTextChangedListener(this); input.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { LogUtil.e("聚焦"); scrollToBottom(); if (l1_more.getVisibility() == View.VISIBLE) { l1_more.setVisibility(View.GONE); } } } }); voice.setOnClickListener(this); send.setOnClickListener(this); keyboard.setOnClickListener(this); location.setOnClickListener(this); picture.setOnClickListener(this); camera.setOnClickListener(this); speak.setOnTouchListener(this); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { mSwipeRefreshLayout.setRefreshing(true); BaseMessage message = mAdapter.getData(0); LoadMessage(message); } }); } @Override public void initData() { from = getIntent().getStringExtra("from"); if (from.equals("person")) { user = (User) getIntent().getSerializableExtra("user"); uid = user.getObjectId(); } else if (from.equals("group")) { groupId = getIntent().getStringExtra("groupId"); mGroupTableMessage = MessageCacheManager.getInstance().getGroupTableMessage(groupId); } initActionBar(); // 声音音量变化图片资源 voiceImageId = new int[]{R.mipmap.chat_icon_voice1, R.mipmap.chat_icon_voice2, R.mipmap.chat_icon_voice3, R.mipmap.chat_icon_voice4, R.mipmap.chat_icon_voice5, R.mipmap.chat_icon_voice6}; initRecordManager(); initEmotionInfo(); mLinearLayoutManager = new LinearLayoutManager(this); display.setLayoutManager(mLinearLayoutManager); // display.setHasFixedSize(true); display.setItemAnimator(new DefaultItemAnimator()); // mAdapter = new ChatAdapter(this, null); mAdapter = new ChatMessageAdapter(); mAdapter.setOnItemClickListener(this); display.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { hideSoftInpuutView(); } } }); display.setAdapter(mAdapter); IntentFilter intentFilter = new IntentFilter(Constant.NEW_MESSAGE_ACTION); intentFilter.setPriority(20); registerReceiver(mReceiver, intentFilter); refreshData(); scrollToBottom(); registerRxBus(); } private void registerRxBus() { Subscription mSubscription = RxBusManager.getInstance().registerEvent(GroupInfoEvent.class, new Action1<GroupInfoEvent>() { @Override public void call(GroupInfoEvent groupInfoEvent) { // 刷新过来的,更新下群结构消息 mGroupTableMessage = MessageCacheManager.getInstance().getGroupTableMessage(groupId); if (mGroupTableMessage != null) { LogUtil.e(mGroupTableMessage); } int type = groupInfoEvent.getType(); String content = groupInfoEvent.getContent(); switch (type) { case GroupInfoEvent.TYPE_GROUP_NICK: List<BaseMessage> messageList = mAdapter.getAllData(); if (messageList.size() > 0) { for (BaseMessage message : messageList) { if (message.getBelongId().equals(UserManager.getInstance().getCurrentUserObjectId())) { message.setBelongNick(mGroupTableMessage.getGroupNick()); } } } mAdapter.notifyDataSetChanged(); break; case GroupInfoEvent.TYPE_GROUP_NAME: String title = mGroupTableMessage.getGroupName() + "(" + mGroupTableMessage.getGroupNumber().size() + ")"; getCustomTitle().setText(title); break; case GroupInfoEvent.TYPE_GROUP_NOTIFICATION: LogUtil.e("这里要做群通知的界面展示" + content); break; case GroupInfoEvent.TYPE_GROUP_DESCRIPTION: LogUtil.e("这里要做群描述的界面展示" + content); break; case GroupInfoEvent.TYPE_GROUP_AVATRA: LogUtil.e("这里要做群头像的界面展示" + content); break; case GroupInfoEvent.TYPE_GROUP_NUMBER: if (groupId != null) { LogUtil.e("这里通知成员的变化" + content); if (content.equals(groupId)) { exit=true; Toast.makeText(ChatActivity.this, "你已经被提出该群", Toast.LENGTH_SHORT).show(); } } break; default: break; } } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { LogUtil.e("rxbus传递出现异常"); if (throwable != null) { LogUtil.e(throwable.getMessage()); } } }); RxBusManager.getInstance().addSubscription(this, mSubscription); } private void initActionBar() { String title; String avatar; if (from.equals("person")) { title = user.getNick(); avatar = null; } else { title = mGroupTableMessage.getGroupName() + "(" + mGroupTableMessage.getGroupNumber().size() + ")"; avatar = mGroupTableMessage.getGroupAvatar(); } ToolBarOption toolBarOption = new ToolBarOption(); toolBarOption.setNeedNavigation(true); toolBarOption.setAvatar(avatar); toolBarOption.setTitle(title); if (from.equals("group")) { toolBarOption.setRightText("信息"); toolBarOption.setRightListener(new View.OnClickListener() { @Override public void onClick(View v) { GroupInfoActivity.start(ChatActivity.this, groupId, Constant.REQUEST_CODE_EDIT_GROUP_INFO); } }); } setToolBar(toolBarOption); } private void refreshData() { LogUtil.e("refreshData12356"); if (from.equals("person")) { if (ChatDB.create().updateReceivedChatMessageReaded(user, true) > 0) { LogUtil.e("更新该用户所发来的消息为已读状态成功"); } else { LogUtil.e("更新该用户所发来的消息为已读状态失败"); } mAdapter.clearData(); mAdapter.getAllData().addAll(ChatDB.create().queryChatMessagesFromDB(uid, 1, 0)); } else { if (ChatDB.create().updateReceivedGroupChatMessageReaded(groupId, true)) { LogUtil.e("更新该群所发来的消息为已读状态成功"); } else { LogUtil.e("更新该群所发来的消息为已读状态失败"); } LogUtil.e("刷新群消息"); mAdapter.clearData(); mAdapter.getAllData().addAll(ChatDB.create().queryGroupChatMessageFromDB(groupId, 1, 0)); // mAdapter.getData().clear(); // mAdapter.getData().addAll(ChatDB.create().queryGroupChatMessageFromDB(groupId, 1, 0)); mAdapter.notifyDataSetChanged(); } PushMessageReceiver.registerListener(this); } private ChatMessageReceiver mReceiver = new ChatMessageReceiver(); private class ChatMessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Constant.NEW_MESSAGE_ACTION)) { if (intent.getStringExtra("from").equals("person") && from.equals("person")) { List<ChatMessage> list = (List<ChatMessage>) intent.getSerializableExtra(Constant.NEW_MESSAGE); processNewMessage(list); } else if (intent.getStringExtra("from").equals("group")) { LogUtil.e("这里实时广播接收到实时群消息拉"); GroupChatMessage message = (GroupChatMessage) intent.getSerializableExtra(Constant.NEW_MESSAGE); if (from.equals("group") && message.getGroupId().equals(groupId)) { if (MsgManager.getInstance().saveRecentAndChatGroupMessage(message)) { boolean isRefresh=intent.getBooleanExtra("isRefresh",false); if (!isRefresh&&!hasFocus) { ChatNotificationManager.getInstance(ChatActivity.this).sendGroupMessageNotification(message, ChatActivity.this); } onNewGroupChatMessageCome(message); } } else { LogUtil.e("其他群消息交由主界面处理"); return; } } else if (intent.getStringExtra("from").equals("groupTable")) { LogUtil.e("这里聊天界面接收到群结构消息,直接返回,不取消广播,让主界面接受广播并解析"); return; } else if (intent.getStringExtra("from").equals("table")) { LogUtil.e("实时检测得到的群结构消息到啦,这是聊天界面"); GroupTableMessage message = (GroupTableMessage) intent.getSerializableExtra(Constant.NEW_MESSAGE); if (from.equals("group") && message.getGroupId().equals(groupId)) { // 自己的群界面 // 刷新群结构消息 mGroupTableMessage = MessageCacheManager.getInstance().getGroupTableMessage(groupId); LogUtil.e(mGroupTableMessage); if (message.getGroupAvatar() != null) { Glide.with(ChatActivity.this).load(message.getGroupAvatar()).into(getIcon()); } getCustomTitle().setText(message.getGroupName() + "(" + message.getGroupNumber().size() + ")"); } else { LogUtil.e("其他群结构表交由主界面处理"); return; } } } abortBroadcast(); } } private void processNewMessage(List<ChatMessage> list) { for (final ChatMessage message : list ) { if (!message.getBelongId().equals(uid)) { // 如果不是该用户的消息,不接受 return; } message.setSendStatus(Constant.SEND_STATUS_SUCCESS); message.setReadStatus(Constant.RECEIVE_UNREAD); switch (message.getTag()) { // 邀请消息应该不会出现在这里 case Constant.TAG_AGREE: UserManager.getInstance().addNewFriend(message.getBelongId(), UserManager.getInstance().getCurrentUserObjectId(), new AddFriendCallBackListener() { @Override public void onSuccess(User user) { LogUtil.e("在服务器上成功检测到未读的同意消息并保存到数据库中成功"); UserCacheManager.getInstance().addContact(user); MsgManager.getInstance().saveAndUploadReceiverMessage(true, message); onAgreeMessageCome(message); } @Override public void onFailed(BmobException e) { LogUtil.e("保存从服务器上检测得来的同意消息失败"); } }); break; case Constant.TAG_ADD_FRIEND: // 不处理 break; case Constant.TAG_ASK_READ: LogUtil.e("接收到的回执已读标签消息"); LogUtil.e(message); LogUtil.e("这里更新已读消息为已读"); MsgManager.getInstance().updateReadTagMsgReaded(message.getConversationId(), message.getCreateTime()); if (ChatDB.create().hasFriend(message.getBelongId()) && ChatDB.create().isBlackUser(message.getBelongId())) { LogUtil.e("由于是黑名单,直接更新服务器上的已读回执消息为已读状态"); MsgManager.getInstance().updateMsgReaded(false, message.getConversationId(), message.getCreateTime()); } else { if (MsgManager.getInstance().uploadAndUpdateChatMessageReadStatus(message, true) > 0) { LogUtil.e("在服务器上成功检测到未读的已读回执消息"); onAskReadMessageCome(message); } else { LogUtil.e("保存从服务器上检测得来的回执已读消息失败"); } } break; default: // 默认则是聊天消息 if (ChatDB.create().hasFriend(message.getBelongId()) && ChatDB.create().isBlackUser(message.getBelongId())) { // 黑名单用户 LogUtil.e("黑名单用户,不接受消息"); MsgManager.getInstance().updateMsgReaded(false, message.getConversationId(), message.getCreateTime()); LogUtil.e("更新服务器上黑名单发来的消息为已读"); } else { if (MsgManager.getInstance().saveAndUploadReceiverMessage(true, message)) { LogUtil.e("在服务器上成功检测到未读的聊天消息"); onNewChatMessageCome(message); } else { LogUtil.e("在服务器上检测未读的聊天消息失败"); } } break; } } } private void initEmotionInfo() { List<View> list = new ArrayList<>(); emotionFaceList = FaceTextUtil.getFaceTextList(); for (int i = 0; i < 2; i++) { list.add(getGridView(i)); } mViewPager.setAdapter(new MyViewPagerAdapter(list)); } private View getGridView(int i) { View emotionView = LayoutInflater.from(this).inflate(R.layout.emotion1, null); GridView gridView = (GridView) emotionView.findViewById(R.id.gv_display); if (i == 0) { gridView.setAdapter(gridViewAdapter = new GridViewAdapter(this, emotionFaceList.subList(0, 21))); gridView.setTag(gridViewAdapter); } else { gridView.setAdapter(mGridViewAdapter = new GridViewAdapter(this, emotionFaceList.subList(21, emotionFaceList.size()))); gridView.setTag(mGridViewAdapter); } gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { GridViewAdapter gridViewAdapter = (GridViewAdapter) parent.getTag(); FaceText faceText = (FaceText) gridViewAdapter.getItem(position); String content = faceText.getText(); if (input != null) { int startIndex = input.getSelectionStart(); CharSequence content1 = input.getText().insert(startIndex, content); input.setText(FaceTextUtil.toSpannableString(ChatActivity.this.getApplicationContext(), content1.toString())); // 重新定位光标位置 CharSequence info = input.getText(); if (info instanceof Spannable) { Spannable spannable = (Spannable) info; Selection.setSelection(spannable, startIndex + content.length()); } } } }); return emotionView; } private void initRecordManager() { mVoiceRecordManager = VoiceRecordManager.getInstance(); mVoiceRecordManager.setOnVoiceChangeListener(new VoiceRecordManager.OnVoiceChangerListener() { /** * 范围:0~5 * @param value 值 */ @Override public void onVoiceColumnChange(int value) { record_display.setImageResource(voiceImageId[value]); } @Override public void onRecordTimeChange(int time, String localVoicePath) { if (time > VoiceRecordManager.MAX_RECORD_TIME) { time = VoiceRecordManager.MAX_RECORD_TIME; // 这里做一个机制,防止错误重复发多次语音 speak.setPressed(false); speak.setClickable(false); sendVoiceMessage(localVoicePath, time); handler.postDelayed(new Runnable() { @Override public void run() { speak.setClickable(true); } }, 1000); } } }); } /** * 发送声音文件 * * @param localPath 声音文件的当地存储路径 * @param recordTime 录制的时间 */ private void sendVoiceMessage(String localPath, int recordTime) { if (exit) { Toast.makeText(this, "已经被提出该群,不能发送消息", Toast.LENGTH_SHORT).show(); return; } if (isBlack) { ToastUtils.showShortToast("对方为黑名单,不能发送消息"); return; } MsgManager manager = MsgManager.getInstance(); String id; final boolean result; if (from.equals("person")) { id = uid; result = true; } else { result = false; id = groupId; } manager.sendVoiceMessage(result, id, localPath, recordTime, new SendFileListener() { @Override public void onProgress(int progress) { } @Override public void onStart(BaseMessage message) { mAdapter.addData(message); // mAdapter.addMessages(message); LogUtil.e("语音文件"); if (result) { LogUtil.e(((ChatMessage) message)); } else { LogUtil.e(((GroupChatMessage) message)); } scrollToBottom(); } @Override public void onSuccess() { LogUtil.e("发送语音成功"); mAdapter.notifyDataSetChanged(); scrollToBottom(); } @Override public void onFailed(BmobException e) { LogUtil.e("发送语音失败" + e.getMessage() + e.getErrorCode()); mAdapter.notifyDataSetChanged(); scrollToBottom(); } }); } /** * 加载该消息之前的10调消息 * * @param message 聊天消息 */ private void LoadMessage(BaseMessage message) { List<BaseMessage> list = new ArrayList<>(); if (from.equals("person")) { if (message != null) { list.addAll(ChatDB.create().queryChatMessagesFromDB(uid, 1, Long.valueOf(message.getCreateTime()))); } else { list.addAll(ChatDB.create().queryChatMessagesFromDB(uid, 1, 0)); } } else { if (message != null) { list.addAll(ChatDB.create().queryGroupChatMessageFromDB(groupId, 1, Long.valueOf(message.getCreateTime()))); } else { list.addAll(ChatDB.create().queryGroupChatMessageFromDB(groupId, 1, 0)); } } int size = list.size(); LogUtil.e("向上拉取的消息大小为" + size); mAdapter.addData(0, list); // mAdapter.addMessages(list); mLinearLayoutManager.scrollToPositionWithOffset(size, 0); mSwipeRefreshLayout.setRefreshing(false); } private boolean isBlack=false; @Override protected void onResume() { super.onResume(); // if (groupId != null) { // mGroupTableMessage = MessageCacheManager.getInstance().getGroupTableMessage(groupId); // String title = mGroupTableMessage.getGroupName() + "(" + mGroupTableMessage.getGroupNumber().size() + ")"; // getCustomTitle().setText(title); // } if (uid != null) { isBlack=ChatDB.create().isBlackUser(uid); } PushMessageReceiver.registerListener(this); } @Override protected boolean isNeedHeadLayout() { return true; } @Override protected boolean isNeedEmptyLayout() { return false; } @Override protected int getContentLayout() { return R.layout.activity_chat; } @Override protected void onPause() { super.onPause(); PushMessageReceiver.unRegisterListener(this); } private void scrollToBottom() { mLinearLayoutManager.scrollToPositionWithOffset(mAdapter.getItemCount() - 1, 0); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_chat_bottom_add: if (l1_more.getVisibility() == View.GONE) { l1_more.setVisibility(View.VISIBLE); l1_add.setVisibility(View.VISIBLE); r1_emotion.setVisibility(View.GONE); hideSoftInpuutView(); } else if (l1_add.getVisibility() == View.VISIBLE) { l1_more.setVisibility(View.GONE); } else { r1_emotion.setVisibility(View.GONE); l1_add.setVisibility(View.VISIBLE); } break; case R.id.btn_chat_bottom_emotion: if (speak.getVisibility() == View.VISIBLE) { keyboard.setVisibility(View.GONE); speak.setVisibility(View.GONE); input.setVisibility(View.VISIBLE); send.setVisibility(View.VISIBLE); } if (l1_more.getVisibility() == View.GONE) { l1_more.setVisibility(View.VISIBLE); l1_add.setVisibility(View.GONE); r1_emotion.setVisibility(View.VISIBLE); hideSoftInpuutView(); } else if (r1_emotion.getVisibility() == View.VISIBLE) { l1_more.setVisibility(View.GONE); } else { l1_add.setVisibility(View.GONE); r1_emotion.setVisibility(View.VISIBLE); hideSoftInpuutView(); } break; case R.id.btn_chat_bottom_voice: if (l1_more.getVisibility() == View.VISIBLE) { l1_more.setVisibility(View.GONE); } keyboard.setVisibility(View.VISIBLE); speak.setVisibility(View.VISIBLE); input.setVisibility(View.GONE); voice.setVisibility(View.GONE); hideSoftInpuutView(); break; case R.id.btn_chat_bottom_keyboard: keyboard.setVisibility(View.GONE); voice.setVisibility(View.VISIBLE); speak.setVisibility(View.GONE); input.setVisibility(View.VISIBLE); break; case R.id.btn_chat_bottom_send: if (l1_more.getVisibility() == View.VISIBLE) { l1_more.setVisibility(View.GONE); } if (TextUtils.isEmpty(input.getText().toString().trim())) { ToastUtils.showShortToast(getString(R.string.chat_input_empty)); input.setText(""); return; } sendTextMessage(input.getText().toString().trim()); input.setText(""); break; case R.id.tv_chat_bottom_camera: // File imageFile = FileUtil.newFile(FileUtil.newDir(Constant.IMAGE_CACHE_DIR).getAbsolutePath() + System.currentTimeMillis() + ".jpg"); // localImagePath = imageFile.getAbsolutePath(); localImagePath = CommonImageLoader.getInstance().takePhoto(this, Constant.REQUEST_CODE_TAKE_PICTURE).getAbsolutePath(); break; case R.id.tv_chat_bottom_picture: CommonImageLoader.getInstance().pickPhoto(this, Constant.REQUEST_CODE_SELECT_FROM_LOCAL); break; case R.id.tv_chat_bottom_location: Intent locationIntent = new Intent(this, MapActivity.class); startActivityForResult(locationIntent, Constant.REQUEST_MAP); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case Constant.REQUEST_CODE_TAKE_PICTURE: LogUtil.e("拍照得到的图片路径" + localImagePath); LogUtil.e("图片是否存在" + new File(localImagePath).exists()); LogUtil.e("图片的大小为" + new File(localImagePath).length()); sendImageMessage(localImagePath); break; case Constant.REQUEST_CODE_SELECT_FROM_LOCAL: if (data != null) { Uri uri = data.getData(); Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { int index = cursor.getColumnIndex("_data"); String path = cursor.getString(index); if (path != null) { LogUtil.e("获取的到的图片路径" + path); sendImageMessage(path); } else { ToastUtils.showShortToast("找不到你要的图片"); } } if (cursor != null && !cursor.isClosed()) { cursor.close(); } } break; case Constant.REQUEST_CODE_LOCATION: break; case Constant.REQUEST_MAP: if (data != null) { String localPath = data.getStringExtra("localPath"); String longitude = data.getStringExtra("longitude"); String latitude = data.getStringExtra("latitude"); String address = data.getStringExtra("address"); LogUtil.e("localPath:" + localPath + " longitude:" + longitude + " latitude:" + latitude + " address:" + address); sendLocationChatMessage(localPath, latitude, longitude, address); } break; case Constant.REQUEST_CODE_EDIT_GROUP_INFO: // refreshData(); // String nick = data.getStringExtra("nick"); // List<BaseMessage> list = mAdapter.getAllData(); // for (BaseMessage message : // list) { // if (message.getBelongId().equals(UserCacheManager.getInstance().getUser().getObjectId())) { // message.setBelongNick(nick); // } // } // 通知数据刷新,因为群昵称改变 mAdapter.clearData(); mAdapter.getAllData().addAll(ChatDB.create().queryGroupChatMessageFromDB(groupId, 1, 0)); mAdapter.notifyDataSetChanged(); break; } } } /** * 发送地址消息 * * @param localPath 图片 * @param latitude 纬度 * @param longitude 经度 * @param address 地址 */ private void sendLocationChatMessage(String localPath, String latitude, String longitude, String address) { if (exit) { Toast.makeText(this, "已经被提出该群,不能发送消息", Toast.LENGTH_SHORT).show(); return; } if (isBlack) { ToastUtils.showShortToast("对方为黑名单,不能发送消息"); return; } if (l1_more.getVisibility() == View.VISIBLE) { l1_more.setVisibility(View.GONE); l1_add.setVisibility(View.GONE); r1_emotion.setVisibility(View.GONE); } String id; boolean result; if (from.equals("person")) { id = uid; result = true; } else { result = false; id = groupId; } MsgManager msgManager = MsgManager.getInstance(); String content = localPath + "," + latitude + "," + longitude + "," + address; msgManager.sendLocationMessage(result, id, content, new SendFileListener() { @Override public void onProgress(int progress) { } @Override public void onStart(BaseMessage message) { mAdapter.addData(message); scrollToBottom(); } @Override public void onSuccess() { mAdapter.notifyDataSetChanged(); } @Override public void onFailed(BmobException e) { mAdapter.notifyDataSetChanged(); } }); } /** * 发送图片消息 * * @param localImagePath 图片的本地地址 */ private void sendImageMessage(String localImagePath) { if (exit) { Toast.makeText(this, "已经被提出该群,不能发送消息", Toast.LENGTH_SHORT).show(); return; } if (isBlack) { ToastUtils.showShortToast("对方为黑名单,不能发送消息"); return; } if (l1_more.getVisibility() == View.VISIBLE) { l1_more.setVisibility(View.GONE); l1_add.setVisibility(View.GONE); r1_emotion.setVisibility(View.GONE); } String id; boolean result; if (from.equals("person")) { result = true; id = uid; } else { result = false; id = groupId; } final MsgManager msgManager = MsgManager.getInstance(); msgManager.sendImageMessage(result, id, localImagePath, new SendFileListener() { @Override public void onProgress(int progress) { // 这里可以做图片上传的操作 } @Override public void onStart(BaseMessage message) { LogUtil.e("onStart"); LogUtil.e("图片消息"); mAdapter.addData(message); scrollToBottom(); File file = new File(message.getContent()); while (file.exists() && file.length() == 0) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); LogUtil.e("异常"); } } } @Override public void onSuccess() { LogUtil.e("发送图片成功"); mAdapter.notifyDataSetChanged(); scrollToBottom(); } @Override public void onFailed(BmobException e) { mAdapter.notifyDataSetChanged(); scrollToBottom(); LogUtil.e("发送图片消息失败" + e.getMessage() + e.getErrorCode()); } }); } /** * 发送文本消息 * * @param content 内容 */ private void sendTextMessage(final String content) { if (exit) { Toast.makeText(this, "已经被提出该群,不能发送消息", Toast.LENGTH_SHORT).show(); return; } if (isBlack) { ToastUtils.showShortToast("对方为黑名单,不能发送消息"); return; } MsgManager manager = MsgManager.getInstance(); BaseMessage baseMessage; String id; if (from.equals("person")) { id = uid; baseMessage = manager.createChatMessage(content, id, Constant.TAG_MSG_TYPE_TEXT); } else { id = groupId; LogUtil.e("群ID为" + id); baseMessage = manager.createGroupChatMessage(content, id, Constant.TAG_MSG_TYPE_TEXT); } mAdapter.addData(baseMessage); scrollToBottom(); manager.sendTextMessage(false, baseMessage, new OnSendMessageListener() { @Override public void onSending() { mAdapter.notifyDataSetChanged(); scrollToBottom(); LogUtil.e("发送中......."); } @Override public void onSuccess() { //// 这里不需要通知数据的改变,因为在创建该消息的时候已经默认为发送成功状态 // finalBaseMessage.setSendStatus(Constant.SEND_STATUS_SUCCESS); LogUtil.e("发送成功"); mAdapter.notifyDataSetChanged(); scrollToBottom(); } @Override public void onFailed(BmobException e) { LogUtil.e("发送失败" + e.getMessage() + e.getErrorCode()); mAdapter.notifyDataSetChanged(); scrollToBottom(); } } ); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { scrollToBottom(); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (!TextUtils.isEmpty(s)) { voice.setVisibility(View.GONE); send.setVisibility(View.VISIBLE); } else { voice.setVisibility(View.VISIBLE); send.setVisibility(View.GONE); } } @Override public void afterTextChanged(Editable s) { } @Override public boolean onLongClick(View v) { return false; } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!CommonUtils.isSupportSdcard()) { ToastUtils.showShortToast("需要SD卡支持!"); return false; } speak.setPressed(true); record_container.setVisibility(View.VISIBLE); record_tip.setText(R.string.chat_middle_voice_tip); mVoiceRecordManager.startRecording(uid); return true; case MotionEvent.ACTION_MOVE: if (event.getY() < 0) { record_tip.setText(R.string.chat_middle_voice_tip1); record_tip.setTextColor(Color.RED); } else { record_tip.setText(R.string.chat_middle_voice_tip); record_tip.setTextColor(Color.WHITE); } return true; case MotionEvent.ACTION_UP: speak.setPressed(false); record_container.setVisibility(View.INVISIBLE); if (event.getY() < 0) { mVoiceRecordManager.cancelRecord(); } else { int recordTime = mVoiceRecordManager.stopRecord(); if (recordTime > 1) { sendVoiceMessage(mVoiceRecordManager.getVoiceFilePath(), recordTime); } else { ToastUtils.showShortToast("录制时间过短"); } } return true; } return false; } @Override public void onPictureClick(final View view, final String contentUrl, int position) { LogUtil.e("点击了图片"); List<BaseMessage> list = mAdapter.getAllData(); List<BaseMessage> imageList = new ArrayList<>(); for (BaseMessage baseMessage : list) { if (baseMessage.getMsgType().equals(Constant.TAG_MSG_TYPE_IMAGE)) { imageList.add(baseMessage); } } List<ImageItem> result = new ArrayList<>(); int picturePosition = 0; LogUtil.e("contentUrl" + contentUrl); for (int i = 0; i < imageList.size(); i++) { String content = imageList.get(i).getContent(); LogUtil.e("content" + content); if (content.contains("&")) { content = content.split("&")[0]; } if (content.equals(contentUrl)) { picturePosition = i; LogUtil.e("相等position" + i); } ImageItem imageItem = new ImageItem(); imageItem.setPath(content); result.add(imageItem); } LogUtil.e("position" + picturePosition); BasePreViewActivity.startBasePreview(this, result, picturePosition); // ImageDisplayActivity.start(ChatActivity.this, view, contentUrl); } @Override public void onAvatarClick(View view, int position, boolean isRight) { Intent intent = new Intent(this, UserInfoActivity.class); if (from.equals("person")) { intent.putExtra("uid", isRight ? UserManager.getInstance().getCurrentUserObjectId() : user.getObjectId()); } else { GroupChatMessage message = (GroupChatMessage) mAdapter.getData(position); User user = new User(); user.setObjectId(message.getBelongId()); user.setNick(message.getBelongNick()); user.setUsername(message.getBelongUserName()); user.setAvatar(message.getBelongAvatar()); user.setSex(false); if (!isRight) { intent.putExtra("uid", message.getBelongId()); intent.putExtra("user", user); } else { intent.putExtra("uid", UserManager.getInstance().getCurrentUserObjectId()); } } startActivity(intent); } @Override public void onMessageClick(View view, int position) { Toast.makeText(this, "1消息主体点击暂无操作", Toast.LENGTH_SHORT).show(); BaseMessage chatMessage = mAdapter.getData(position); if (chatMessage != null && chatMessage.getMsgType().equals(Constant.TAG_MSG_TYPE_LOCATION)) { // 这里点击了地址显示图片,进入MapActivity Intent intent = new Intent(this, MapActivity.class); String[] content = chatMessage.getContent().split(","); for (int i = 0; i < content.length; i++) { LogUtil.e("点击地图的内容:" + content[i]); } String latitude = null; String longitude = null; String address = null; if (content.length == 5) { latitude = content[2]; longitude = content[3]; address = content[4]; } else if (content.length == 4) { latitude = content[1]; longitude = content[2]; address = content[3]; } intent.putExtra("latitude", latitude); intent.putExtra("longitude", longitude); intent.putExtra("address", address); intent.putExtra("destination", "browse"); startActivity(intent); } } @Override public void onItemResendClick(View view, final BaseMessage baseMessage, int position) { // 重发消息 Integer msgType = baseMessage.getMsgType(); String id; final MsgManager msgManager = MsgManager.getInstance(); if (msgType.equals(Constant.TAG_MSG_TYPE_TEXT)) { msgManager.resendTextChatMessage(baseMessage, new OnSendMessageListener() { @Override public void onSending() { mAdapter.notifyDataSetChanged(); LogUtil.e("发送中........."); } @Override public void onSuccess() { baseMessage.setSendStatus(Constant.SEND_STATUS_SUCCESS); mAdapter.notifyDataSetChanged(); LogUtil.e("重发消息成功"); } @Override public void onFailed(BmobException e) { mAdapter.notifyDataSetChanged(); LogUtil.e("重发消息失败" + e.getMessage() + e.getErrorCode()); } }); } else if (msgType.equals(Constant.TAG_MSG_TYPE_IMAGE)) { msgManager.resendImageChatMessage(baseMessage, this); } else if (msgType.equals(Constant.TAG_MSG_TYPE_VOICE)) { msgManager.resendVoiceChatMessage(baseMessage, this); } else if (msgType.equals(Constant.TAG_MSG_TYPE_LOCATION)) { msgManager.resendLocationChatMessage(baseMessage, this); } else { // 未知类型 } } @Override protected void onDestroy() { if (mReceiver != null) { unregisterReceiver(mReceiver); mReceiver = null; } PushMessageReceiver.unRegisterListener(this); mVoiceRecordManager.setOnVoiceChangeListener(null); RxBusManager.getInstance().unSubscrible(this); super.onDestroy(); } @Override public void onNewChatMessageCome(ChatMessage message) { LogUtil.e("聊天界面"); // 在聊天界面接收到消息直接更新为已读状态 ChatDB.create().updateChatMessageReadStatus(message.getConversationId(), message.getCreateTime() , true); mAdapter.addData(message); scrollToBottom(); } @Override public void onNewGroupChatMessageCome(GroupChatMessage message) { ChatDB.create().updateReceivedGroupChatMessageReaded(groupId, true); mAdapter.addData(message); scrollToBottom(); } private volatile boolean hasFocus = true; @Override public void onWindowFocusChanged(boolean hasFocus) { this.hasFocus = hasFocus; } @Override public void onAskReadMessageCome(ChatMessage chatMessage) { LogUtil.e("请求读取的消息来了没有12"); if (from.equals("person")) { List<BaseMessage> list = mAdapter.getAllData(); for (BaseMessage message : list) { if (((ChatMessage) message).getConversationId().equals(chatMessage.getConversationId()) && message.getCreateTime().equals(chatMessage.getCreateTime())) { LogUtil.e("找到要求读取的消息拉"); message.setReadStatus(Constant.READ_STATUS_READED); break; } } } mAdapter.notifyDataSetChanged(); // scrollToBottom(); } @Override public void onNetWorkChanged(boolean isConnected) { if (!isConnected) { Toast.makeText(this, "网络连接失败", Toast.LENGTH_SHORT).show(); } } @Override public void onAddFriendMessageCome(ChatMessage chatMessage) { // 不处理 } @Override public void onAgreeMessageCome(ChatMessage chatMessage) { LogUtil.e("邀请消息到chatActivity"); mAdapter.addData(chatMessage); scrollToBottom(); } @Override public void onOffline() { Toast.makeText(this, "你的帐号已在其他地方登录,所以被迫下线", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(this, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); } @Override public void onGroupTableMessageCome(GroupTableMessage message) { } // 重新发的回调 @Override public void onProgress(int progress) { } // 重新发的回调 @Override public void onStart(BaseMessage message) { mAdapter.notifyDataSetChanged(); } // 重新发的回调 @Override public void onSuccess() { mAdapter.notifyDataSetChanged(); } // 重新发的回调 @Override public void onFailed(BmobException e) { mAdapter.notifyDataSetChanged(); } private class GridViewAdapter extends BaseAdapter { private List<FaceText> mFaceTextList = new ArrayList<>(); private Context mContext; GridViewAdapter(Context context, List<FaceText> faceTextList) { this.mContext = context; if (faceTextList != null && faceTextList.size() > 0) { mFaceTextList.clear(); mFaceTextList.addAll(faceTextList); } } @Override public int getCount() { return mFaceTextList.size(); } @Override public Object getItem(int position) { return mFaceTextList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, android.view.View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.emtion_item, parent, false); viewHolder.display = (ImageView) convertView.findViewById(R.id.iv_emotion_item_display); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } FaceText item = mFaceTextList.get(position); viewHolder.display.setImageDrawable(mContext.getResources().getDrawable(mContext.getResources().getIdentifier(item.getText().substring(1), "mipmap", mContext.getPackageName()))); return convertView; } } private class ViewHolder { ImageView display; } private class MyViewPagerAdapter extends PagerAdapter { private List<View> mViews = new ArrayList<>(); private MyViewPagerAdapter(List<View> list) { if (list != null && list.size() > 0) { mViews.clear(); mViews.addAll(list); } } @Override public int getCount() { return mViews.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(mViews.get(position)); return mViews.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mViews.get(position)); } } }