package hillfly.wifichat.activity; import hillfly.wifichat.R; import hillfly.wifichat.adapter.ChatAdapter; import hillfly.wifichat.common.ActivitiesManager; import hillfly.wifichat.common.BaseApplication; import hillfly.wifichat.common.BaseMessageActivity; import hillfly.wifichat.common.socket.tcp.TcpClient; import hillfly.wifichat.common.sql.SqlDBOperate; import hillfly.wifichat.common.view.EmoteInputView; import hillfly.wifichat.common.view.EmoticonsEditText; import hillfly.wifichat.common.view.MultiListView; import hillfly.wifichat.common.view.ScrollLayout; import hillfly.wifichat.consts.IPMSGConst; import hillfly.wifichat.model.Message; import hillfly.wifichat.model.Message.CONTENT_TYPE; import hillfly.wifichat.model.Users; import hillfly.wifichat.util.AudioRecorderUtils; import hillfly.wifichat.util.FileUtils; import hillfly.wifichat.util.ImageUtils; import hillfly.wifichat.util.Logger; import hillfly.wifichat.util.SessionUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import android.app.ActionBar; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.MediaStore; import android.text.Editable; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; public class ChatActivity extends BaseMessageActivity implements OnItemClickListener { private static final Logger logger = Logger.getLogger(ChatActivity.class); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivitiesManager.initChatActivity(this); init(); } @Override protected void onResume() { super.onResume(); } // 监听返回键 @Override public void onBackPressed() { if (mLayoutMessagePlusBar.isShown()) { hidePlusBar(); } else if (mInputView.isShown()) { mIbTextDitorKeyBoard.setVisibility(View.GONE); mIbTextDitorEmote.setVisibility(View.VISIBLE); mInputView.setVisibility(View.GONE); } else if (getWindow().getAttributes().softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) { mIbTextDitorKeyBoard.setVisibility(View.VISIBLE); mIbTextDitorEmote.setVisibility(View.GONE); hideKeyBoard(); } else if (mLayoutScroll.getCurScreen() == 1) { mLayoutScroll.snapToScreen(0); } else { finish(); } } @Override public void finish() { ActivitiesManager.removeChatActivity(); if (null != mDBOperate) {// 关闭数据库连接 mDBOperate.close(); mDBOperate = null; } mRecordThread = null; super.finish(); } @Override protected void initViews() { mClvList = (MultiListView) findViewById(R.id.chat_clv_list); mLayoutScroll = (ScrollLayout) findViewById(R.id.chat_slayout_scroll); mLayoutRounds = (LinearLayout) findViewById(R.id.chat_layout_rounds); mInputView = (EmoteInputView) findViewById(R.id.chat_eiv_inputview); mIbTextDitorPlus = (ImageButton) findViewById(R.id.chat_textditor_ib_plus); mIbTextDitorKeyBoard = (ImageButton) findViewById(R.id.chat_textditor_ib_keyboard); mIbTextDitorEmote = (ImageButton) findViewById(R.id.chat_textditor_ib_emote); mIvTextDitorAudio = (ImageView) findViewById(R.id.chat_textditor_iv_audio); mBtnTextDitorSend = (Button) findViewById(R.id.chat_textditor_btn_send); mEetTextDitorEditer = (EmoticonsEditText) findViewById(R.id.chat_textditor_eet_editer); mIbAudioDitorPlus = (ImageButton) findViewById(R.id.chat_audioditor_ib_plus); mIbAudioDitorKeyBoard = (ImageButton) findViewById(R.id.chat_audioditor_ib_keyboard); mIvAudioDitorAudioBtn = (ImageView) findViewById(R.id.chat_audioditor_iv_audiobtn); mLayoutFullScreenMask = (LinearLayout) findViewById(R.id.fullscreen_mask); mLayoutMessagePlusBar = (LinearLayout) findViewById(R.id.message_plus_layout_bar); mLayoutMessagePlusPicture = (LinearLayout) findViewById(R.id.message_plus_layout_picture); mLayoutMessagePlusCamera = (LinearLayout) findViewById(R.id.message_plus_layout_camera); mLayoutMessagePlusFile = (LinearLayout) findViewById(R.id.message_plus_layout_file); } @Override protected void initEvents() { ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); mClvList.setStackFromBottom(true); mClvList.setFastScrollEnabled(true); mLayoutScroll.setOnScrollToScreen(this); mIbTextDitorPlus.setOnClickListener(this); mIbTextDitorEmote.setOnClickListener(this); mIbTextDitorKeyBoard.setOnClickListener(this); mBtnTextDitorSend.setOnClickListener(this); mIvTextDitorAudio.setOnClickListener(this); mEetTextDitorEditer.addTextChangedListener(this); mEetTextDitorEditer.setOnTouchListener(this); mIbAudioDitorPlus.setOnClickListener(this); mIbAudioDitorKeyBoard.setOnClickListener(this); mIvAudioDitorAudioBtn.setOnTouchListener(this); mIvAudioDitorAudioBtn.setOnLongClickListener(this); mLayoutFullScreenMask.setOnTouchListener(this); mLayoutMessagePlusPicture.setOnClickListener(this); mLayoutMessagePlusCamera.setOnClickListener(this); mLayoutMessagePlusFile.setOnClickListener(this); } private void init() { mID = SessionUtils.getLocalUserID(); mNickName = SessionUtils.getNickname(); mIMEI = SessionUtils.getIMEI(); mChatUser = getIntent().getParcelableExtra(Users.ENTITY_PEOPLE); mDBOperate = new SqlDBOperate(this); mSenderID = mDBOperate.getIDByIMEI(mChatUser.getIMEI()); mMessagesList = new ArrayList<Message>(); mMessagesList = mDBOperate.getScrollMessageOfChattingInfo(0, 5, mSenderID, mID); mInputView.setEditText(mEetTextDitorEditer); setTitle(mChatUser.getNickname()); initRounds(); initfolder(); mAdapter = new ChatAdapter(ChatActivity.this, mMessagesList); mAdapter.setListView(mClvList); mAdapter.setChatUser(mChatUser); mClvList.setAdapter(mAdapter); mClvList.setOnItemClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_chat, menu); return true; } // actionBar的监听 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_userinfo: Intent intent = new Intent(ChatActivity.this, OtherProfileActivity.class); intent.putExtra(Users.ENTITY_PEOPLE, mChatUser); startActivity(intent); break; case android.R.id.home: finish(); break; default: break; } return true; } @Override public void doAction(int whichScreen) { switch (whichScreen) { case 0: ((ImageView) mLayoutRounds.getChildAt(0)).setImageBitmap(mRoundsSelected); ((ImageView) mLayoutRounds.getChildAt(1)).setImageBitmap(mRoundsNormal); break; case 1: ((ImageView) mLayoutRounds.getChildAt(1)).setImageBitmap(mRoundsSelected); ((ImageView) mLayoutRounds.getChildAt(0)).setImageBitmap(mRoundsNormal); mIbTextDitorKeyBoard.setVisibility(View.GONE); mIbTextDitorEmote.setVisibility(View.VISIBLE); if (mInputView.isShown()) { mInputView.setVisibility(View.GONE); } hideKeyBoard(); break; } } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (recordState == RECORD_OFF) { switch (v.getId()) { case R.id.chat_textditor_eet_editer: mIbTextDitorKeyBoard.setVisibility(View.GONE); mIbTextDitorEmote.setVisibility(View.VISIBLE); showKeyBoard(); break; case R.id.fullscreen_mask: hidePlusBar(); break; case R.id.chat_audioditor_iv_audiobtn: downY = event.getY(); break; } } break; case MotionEvent.ACTION_MOVE: if (recordState == RECORD_ON) { float moveY = event.getY(); if (moveY - downY < -50) { isMove = true; showVoiceDialog(1); } else if (moveY - downY < -20) { isMove = false; showVoiceDialog(0); } } break; case MotionEvent.ACTION_UP: if (recordState == RECORD_ON) { stopRecord(); if (mRecordDialog.isShowing()) { mRecordDialog.dismiss(); } if (!isMove) { if (recodeTime < MIN_RECORD_TIME) { showWarnToast(R.string.chat_toast_record_shorttime); } else { mVoicePath = mAudioRecorder.getVoicePath(); sendMessage(mVoicePath, CONTENT_TYPE.VOICE); refreshAdapter(); } } isMove = false; } if (mAudioRecorder != null) mAudioRecorder = null; mLayoutScroll.requestDisallowInterceptTouchEvent(false); // 恢复监测滚动事件 break; } return false; } @Override public boolean onLongClick(View v) { mLayoutScroll.requestDisallowInterceptTouchEvent(true); // 屏蔽滚动事件 startRecord(); return false; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.chat_textditor_ib_plus: if (!mLayoutMessagePlusBar.isShown()) { showPlusBar(); } break; case R.id.chat_textditor_ib_emote: mIbTextDitorKeyBoard.setVisibility(View.VISIBLE); mIbTextDitorEmote.setVisibility(View.GONE); mEetTextDitorEditer.requestFocus(); if (mInputView.isShown()) { hideKeyBoard(); } else { hideKeyBoard(); mInputView.setVisibility(View.VISIBLE); } break; case R.id.chat_textditor_ib_keyboard: mIbTextDitorKeyBoard.setVisibility(View.GONE); mIbTextDitorEmote.setVisibility(View.VISIBLE); showKeyBoard(); break; case R.id.chat_textditor_btn_send: String content = mEetTextDitorEditer.getText().toString().trim(); if (!TextUtils.isEmpty(content)) { mEetTextDitorEditer.setText(null); sendMessage(content, CONTENT_TYPE.TEXT); refreshAdapter(); } break; case R.id.chat_textditor_iv_audio: mLayoutScroll.snapToScreen(1); break; case R.id.chat_audioditor_ib_plus: if (!mLayoutMessagePlusBar.isShown()) { showPlusBar(); } break; case R.id.chat_audioditor_ib_keyboard: mLayoutScroll.snapToScreen(0); break; case R.id.message_plus_layout_picture: ImageUtils.selectPhoto(ChatActivity.this); hidePlusBar(); break; case R.id.message_plus_layout_camera: mCameraImagePath = ImageUtils.takePicture(ChatActivity.this); hidePlusBar(); break; case R.id.message_plus_layout_file: showFileChooser(); hidePlusBar(); break; } } @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (TextUtils.isEmpty(s)) { mIvTextDitorAudio.setVisibility(View.VISIBLE); mBtnTextDitorSend.setVisibility(View.GONE); } else { mIvTextDitorAudio.setVisibility(View.GONE); mBtnTextDitorSend.setVisibility(View.VISIBLE); } } @SuppressWarnings("deprecation") @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case ImageUtils.INTENT_REQUEST_CODE_ALBUM: if (data == null) { return; } if (resultCode == RESULT_OK) { if (data.getData() == null) { return; } if (!FileUtils.isSdcardExist()) { showShortToast(R.string.toast_sdcard_unavailable); return; } Uri uri = data.getData(); String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, proj, null, null, null); if (cursor != null) { int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.getCount() > 0 && cursor.moveToFirst()) { String path = cursor.getString(column_index); mCameraImagePath = path; Bitmap bitmap = ImageUtils.getBitmapFromPath(path); if (ImageUtils.bitmapIsLarge(bitmap)) { ImageUtils.cropPhoto(this, this, path); } else { if (path != null) { ImageUtils.createThumbnail(this, path, THUMBNAIL_PATH + File.separator); sendMessage(path, CONTENT_TYPE.IMAGE); refreshAdapter(); } } } } } break; case ImageUtils.INTENT_REQUEST_CODE_CAMERA: if (resultCode == RESULT_OK) { if (mCameraImagePath != null) { mCameraImagePath = ImageUtils.savePhotoToSDCard( ImageUtils.CompressionPhoto(mScreenWidth, mCameraImagePath, 2), BaseApplication.CAMERA_IMAGE_PATH, null); ImageUtils.fliterPhoto(this, this, mCameraImagePath); } } break; case ImageUtils.INTENT_REQUEST_CODE_CROP: if (resultCode == RESULT_OK) { String path = data.getStringExtra("path"); mCameraImagePath = path; if (path != null) { ImageUtils.createThumbnail(this, path, THUMBNAIL_PATH + File.separator); sendMessage(path, CONTENT_TYPE.IMAGE); refreshAdapter(); } } break; case ImageUtils.INTENT_REQUEST_CODE_FLITER: if (resultCode == RESULT_OK) { String path = data.getStringExtra("path"); if (path != null) { ImageUtils.createThumbnail(this, path, THUMBNAIL_PATH + File.separator); sendMessage(path, CONTENT_TYPE.IMAGE); refreshAdapter(); } } break; case FILE_SELECT_CODE: { if (resultCode == RESULT_OK) { Uri uri = data.getData(); String path = uri.getPath(); if (path != null) { sendFilePath = path; sendMessage(sendFilePath, CONTENT_TYPE.FILE); refreshAdapter(); } } } break; } } public boolean isThisActivityMsg(Message msg) { String senderIMEI = msg.getSenderIMEI(); if (mChatUser.getIMEI().equals(senderIMEI)) { mMessagesList.add(msg); return true; } return false; } public void processMessage(android.os.Message pMsg) { switch (pMsg.what) { case IPMSGConst.IPMSG_SENDMSG: if (isThisActivityMsg((Message) pMsg.obj)) { handler.sendEmptyMessage(1); } break; case IPMSGConst.IPMSG_CONFIRM_IMAGE_DATA: { // 图片开始发送 logger.d("接收方确认图片请求,发送的文件为" + mCameraImagePath); tcpClient = TcpClient.getInstance(ChatActivity.this); tcpClient.startSend(); tcpClient.sendFile(mCameraImagePath, mChatUser.getIpaddress(), Message.CONTENT_TYPE.IMAGE); } break; case IPMSGConst.IPMSG_CONFIRM_VOICE_DATA: { // 语音开始发送 logger.d("接收方确认语音请求,发送的文件为" + mVoicePath); tcpClient = TcpClient.getInstance(ChatActivity.this); tcpClient.startSend(); if (FileUtils.isFileExists(mVoicePath)) tcpClient.sendFile(mVoicePath, mChatUser.getIpaddress(), Message.CONTENT_TYPE.VOICE); } break; case IPMSGConst.IPMSG_CONFIRM_FILE_DATA: { // 文件开始发送 logger.d("接收方确认文件请求,发送的文件为" + sendFilePath); tcpClient = TcpClient.getInstance(ChatActivity.this); tcpClient.startSend(); if (FileUtils.isFileExists(sendFilePath)) tcpClient.sendFile(sendFilePath, mChatUser.getIpaddress(), Message.CONTENT_TYPE.FILE); } break; } // End of switch } private void startRecord() { recordState = RECORD_ON; RECORD_FILENAME = System.currentTimeMillis() + hillfly.wifichat.util.TextUtils.getRandomNumStr(3); mAudioRecorder = new AudioRecorderUtils(); mAudioRecorder.setVoicePath(VOICE_PATH, RECORD_FILENAME); mRecordThread = new Thread(recordThread); try { mAudioRecorder.start(); mRecordThread.start(); } catch (IOException e) { e.printStackTrace(); } showVoiceDialog(0); } private void stopRecord() { recordState = RECORD_OFF; try { mRecordThread.interrupt(); mRecordThread = null; mAudioRecorder.stop(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } voiceValue = 0.0; } // 录音线程 private Runnable recordThread = new Runnable() { @Override public void run() { recodeTime = 0.0f; while (recordState == RECORD_ON) { // 限制录音时长 // if (recodeTime >= MAX_RECORD_TIME && MAX_RECORD_TIME != 0) { // imgHandle.sendEmptyMessage(0); // } else { try { Thread.sleep(200); recodeTime += 0.2; // 获取音量,更新dialog if (!isMove) { voiceValue = mAudioRecorder.getAmplitude(); handler.sendEmptyMessage(0); } } catch (InterruptedException e) { e.printStackTrace(); } } } } }; public Handler handler = new Handler() { @Override public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0: // 更新录音音量 setDialogImage(); break; case 1: refreshAdapter(); // 更新消息显示 break; default: break; } } }; @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub Message msg = mMessagesList.get((int) id); switch (msg.getContentType()) { case IMAGE: Intent imgIntent = new Intent(mContext, ImageBrowserActivity.class); imgIntent .putExtra(ImageBrowserActivity.IMAGE_TYPE, ImageBrowserActivity.TYPE_PHOTO); imgIntent.putExtra(ImageBrowserActivity.PATH, msg.getMsgContent()); startActivity(imgIntent); overridePendingTransition(R.anim.zoom_enter, 0); break; case VOICE: // 播放录音 final ImageView imgView = (ImageView) view .findViewById(R.id.voice_message_iv_msgimage); if (!isPlay) { mMediaPlayer = new MediaPlayer(); String filePath = msg.getMsgContent(); try { mMediaPlayer.setDataSource(filePath); mMediaPlayer.prepare(); imgView.setImageResource(R.drawable.voicerecord_stop); isPlay = true; mMediaPlayer.start(); // 设置播放结束时监听 mMediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { if (isPlay) { imgView.setImageResource(R.drawable.voicerecord_right); isPlay = false; mMediaPlayer.stop(); mMediaPlayer.release(); } } }); } catch (IOException e) { e.printStackTrace(); } } else { if (mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); mMediaPlayer.release(); isPlay = false; } else { isPlay = false; mMediaPlayer.release(); } imgView.setImageResource(R.drawable.voicerecord_right); } break; case FILE: Intent fileIntent = new Intent(); fileIntent.setType("*/*"); fileIntent.setData(Uri.parse("file://" + FileUtils.getPathByFullPath(msg.getMsgContent()))); mContext.startActivity(fileIntent); break; default: break; } } }