package com.wuxiaolong.wochat.ui.chat;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import com.avos.avoscloud.AVQuery;
import com.avos.avoscloud.im.v2.AVIMClient;
import com.avos.avoscloud.im.v2.AVIMConversation;
import com.avos.avoscloud.im.v2.AVIMConversationQuery;
import com.avos.avoscloud.im.v2.AVIMException;
import com.avos.avoscloud.im.v2.callback.AVIMClientCallback;
import com.avos.avoscloud.im.v2.callback.AVIMConversationCallback;
import com.avos.avoscloud.im.v2.callback.AVIMConversationCreatedCallback;
import com.avos.avoscloud.im.v2.callback.AVIMConversationQueryCallback;
import com.avoscloud.leanchatlib.controller.AVImClientManager;
import com.avoscloud.leanchatlib.controller.LeanchatUser;
import com.wuxiaolong.wochat.R;
import com.wuxiaolong.wochat.ui.BaseActivity;
import com.wuxiaolong.wochat.ui.SetActivity;
import com.wuxiaolong.wochat.util.AppConstant;
import com.wuxiaolong.wochat.util.AppUtil;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class ChatRoomActivity extends BaseActivity {
protected ChatFragment chatFragment;
protected AVIMConversation mAVIMConversation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_room);
chatFragment = new ChatFragment();
getSupportFragmentManager().beginTransaction().add(R.id.fragment_chat, chatFragment).commit();
String conversationId = getIntent().getStringExtra(AppConstant.CONVERSATION_ID);
String title = getIntent().getStringExtra(AppConstant.ACTIVITY_TITLE);
initToolbar(title);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(false);
}
getSquare(conversationId);
queryInSquare(conversationId);
}
/**
* 根据 conversationId 查取本地缓存中的 conversation,如若没有缓存,则返回一个新建的 conversaiton
*/
private void getSquare(String conversationId) {
if (TextUtils.isEmpty(conversationId)) {
throw new IllegalArgumentException("conversationId can not be null");
}
AVIMClient client = AVImClientManager.getInstance().getClient();
mAVIMConversation = client.getConversation(conversationId);
}
/**
* 先查询自己是否已经在该 conversation,如果存在则直接给 chatFragment 赋值,否则先加入,再赋值
*/
private void queryInSquare(String conversationId) {
final AVIMClient client = AVImClientManager.getInstance().getClient();
AVIMConversationQuery conversationQuery = client.getQuery();
conversationQuery.whereEqualTo("objectId", conversationId);
conversationQuery.setQueryPolicy(AVQuery.CachePolicy.CACHE_ELSE_NETWORK);
conversationQuery.containsMembers(Arrays.asList(AVImClientManager.getInstance().getClientId()));
conversationQuery.findInBackground(new AVIMConversationQueryCallback() {
@Override
public void done(List<AVIMConversation> list, AVIMException e) {
if (filterException(e)) {
if (null != list && list.size() > 0) {
chatFragment.setConversation(list.get(0));
} else {
joinSquare();
}
} else {
Log.e("wxl", "queryInSquare e=" + e.getMessage());
}
}
});
}
/**
* 加入 conversation
*/
private void joinSquare() {
mAVIMConversation.join(new AVIMConversationCallback() {
@Override
public void done(AVIMException e) {
if (filterException(e)) {
chatFragment.setConversation(mAVIMConversation);
} else {
Log.e("wxl", "joinSquare AVIMException=" + e.getMessage());
}
}
});
}
/**
* 连接聊天室服务器
*/
static ProgressDialog mProgressDialog;
public static void openConversation(final Activity fromActivity, final String roomName) {
mProgressDialog = AppUtil.showProgressDialog(fromActivity);
final String userName = LeanchatUser.getCurrentUser().getUsername();
Log.e("wxl", "openConversation userName=" + userName);
AVImClientManager.getInstance().open(userName, new AVIMClientCallback() {
@Override
public void done(AVIMClient avimClient, AVIMException e) {
if (filterException(e)) {
findConversation(avimClient, userName, roomName, fromActivity);
} else {
Log.e("wxl", "open AVIMException=" + e.getMessage());
mProgressDialog.dismiss();
}
}
});
}
/**
* 通过条件查询聊天室
*/
public static void findConversation(final AVIMClient avimClient, final String userName, final String roomName, final Activity fromActivity) {
AVIMConversationQuery conversationQuery = avimClient.getQuery();
conversationQuery.whereEqualTo(AppConstant.ROOM_NAME, roomName);
conversationQuery.findInBackground(
new AVIMConversationQueryCallback() {
@Override
public void done(List<AVIMConversation> list, AVIMException e) {
if (filterException(e)) {
if (list.size() == 0) {
createConversation(avimClient, userName, roomName, fromActivity);
} else {
gotoChatRoomActivity(fromActivity, list.get(0), roomName);
}
} else {
mProgressDialog.dismiss();
Log.e("wxl", "findConversation AVIMException=" + e.getMessage());
}
}
});
}
public static void createConversation(AVIMClient avimClient, String userName, final String roomName, final Activity fromActivity) {
HashMap<String, Object> attributes = new HashMap<>();
attributes.put(AppConstant.ROOM_NAME, roomName);
//第2个参数是聊天室名字
avimClient.createConversation(Arrays.asList(userName), roomName, null, true,
new AVIMConversationCreatedCallback() {
@Override
public void done(AVIMConversation avimConversation, AVIMException e) {
if (filterException(e)) {
gotoChatRoomActivity(fromActivity, avimConversation, roomName);
} else {
mProgressDialog.dismiss();
Log.e("wxl", "createConversation AVIMException=" + e.getMessage());
}
}
});
}
public static void gotoChatRoomActivity(final Activity fromActivity, AVIMConversation avimConversation, final String roomName) {
Intent intent = new Intent(fromActivity, ChatRoomActivity.class);
intent.putExtra(AppConstant.CONVERSATION_ID, avimConversation.getConversationId());
intent.putExtra(AppConstant.ACTIVITY_TITLE, roomName);
fromActivity.startActivity(intent);
fromActivity.finish();
mProgressDialog.dismiss();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.chat_room, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
startActivity(new Intent(ChatRoomActivity.this, SetActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}