Commit 595c32ad authored by jianglx's avatar jianglx

Im的优化

parent 38ed8b04
......@@ -98,7 +98,7 @@ import cn.jpush.android.api.BasicPushNotificationBuilder;
import cn.jpush.android.api.JPushInterface;
public class MainActivity extends BaseActivity<CommonPresenter> implements DownListenerManager.DownListener, ChatMessageListener,ImInitListenter {
public class MainActivity extends BaseActivity<CommonPresenter> implements DownListenerManager.DownListener, ChatMessageListener, ImInitListenter {
private boolean hasGetVersionInfo = false; // 判断是否已经获取过版本信息
......@@ -144,7 +144,7 @@ public class MainActivity extends BaseActivity<CommonPresenter> implements DownL
private boolean hasBindService = false; //是否已经绑定了服务
private ImService mService;
// private ImService mService;
private String imToken;
......@@ -631,7 +631,7 @@ public class MainActivity extends BaseActivity<CommonPresenter> implements DownL
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = ((ImService.ImServiceBinder) service).getService();
// mService = ((ImService.ImServiceBinder) service).getService();
imServiceConnection = this;
}
......@@ -639,7 +639,7 @@ public class MainActivity extends BaseActivity<CommonPresenter> implements DownL
public void onServiceDisconnected(ComponentName name) {
LogUtil.e("MainActivity", "onServiceDisconnected() called with: name = [" + name + "]");
imServiceConnection = null;
mService = null;
// mService = null;
}
};
......@@ -647,11 +647,11 @@ public class MainActivity extends BaseActivity<CommonPresenter> implements DownL
public void logout(MessageEventLogout bean) {
hasBindService = false;
ImSetting.logout();
if (mService != null) {
mService.logout();
// if (mService != null) {
// mService.logout();
unbindService(imServiceConnection);
mService = null;
}
// mService = null;
// }
}
@Subscribe(threadMode = ThreadMode.MAIN)
......
......@@ -14,6 +14,8 @@ public class AppCookie {
public final static String KEY_PRERENT_DAYS = "key_prerent_days" ; // 提前租车天数的key
public static final String OFFLINE_TIME = "offline_time";
private static SharedPreferences preferences;
private static WeakReference<Context> weakReference = null;
......
......@@ -7,7 +7,8 @@ import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
......@@ -33,6 +34,8 @@ import com.ruiwenliu.wrapper.base.BaseStatusActivity;
import com.ruiwenliu.wrapper.base.presenter.CommonPresenter;
import com.ruiwenliu.wrapper.util.permission.RxPermission;
import com.ruiwenliu.wrapper.weight.TitleView;
import com.ruiwenliu.wrapper.weight.refresh.SimpleRefreshLayout;
import com.ruiwenliu.wrapper.weight.refresh.SimpleRefreshView;
import com.rv.component.utils.CacheEnum;
import com.rv.component.utils.RvCache;
import com.rv.im.adapter.ChatContentAdapter;
......@@ -42,7 +45,6 @@ import com.rv.im.audio_x.VoicePlayer;
import com.rv.im.bean.User;
import com.rv.im.db.service.ChatMessageServiceImp;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.db.table.Customer;
import com.rv.im.enums.MessageStatusEnum;
import com.rv.im.enums.MessageTypeEnum;
import com.rv.im.mucfile.RvDownManager;
......@@ -68,7 +70,7 @@ import java.util.Timer;
import pub.devrel.easypermissions.AppSettingsDialog;
public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements IChatView, ChatMessageListener, View.OnClickListener, RecordListener {
public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements IChatView, ChatMessageListener, View.OnClickListener, RecordListener, SimpleRefreshLayout.OnSimpleRefreshListener {
private ImageButton voiceImgBtn;
private ImageButton ibKeyword;
......@@ -78,6 +80,7 @@ public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements
private ImageButton ibPhoto;
private Button sendBtn;
private RecyclerView recycleContent;
private SimpleRefreshLayout refreshLayout;
private ViewStub mChatFaceViewStub;
private String mLoginUserId;
......@@ -95,9 +98,6 @@ public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements
private Timer timer;
private RvImTimerTask timerTask;
private int startPosition;
private int endPosition;
private ChatContentAdapter.OnClickItemListener clickItemListener = new ChatContentAdapter.OnClickItemListener() {
@Override
public void onClick(int resId, ChatMessage message) {
......@@ -271,7 +271,6 @@ public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements
@Override
protected void loadData(Bundle savedInstanceState, Intent intent) {
super.loadData(savedInstanceState, intent);
startPosition = ((ChatPresenterImp) presenter).getDbService().getPages(targetUserId);
getData();
}
......@@ -288,6 +287,7 @@ public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements
}
private void initWidget() {
refreshLayout = findViewById(R.id.refresh);
voiceImgBtn = findViewById(R.id.voice_img_btn);
ibKeyword = findViewById(R.id.ib_keyword);
chatEdit = findViewById(R.id.chat_edit);
......@@ -295,24 +295,14 @@ public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements
emotionBtn = findViewById(R.id.emotion_btn);
ibPhoto = findViewById(R.id.ib_photo);
sendBtn = findViewById(R.id.send_btn);
// chatToolsViewStub = findViewById(R.id.chat_tools_view_stub);
mChatFaceViewStub = findViewById(R.id.chat_face_view_stub);
recycleContent = findViewById(R.id.recycle_content);
recycleContent = findViewById(R.id.recyclerView);
recycleContent.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
recycleContent.setItemAnimator(new DefaultItemAnimator());
adapter = new ChatContentAdapter(getApplicationContext(), mLoginUserId, messages, clickItemListener);
recycleContent.setAdapter(adapter);
recycleContent.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
// super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
// super.onScrolled(recyclerView, dx, dy);
}
});
refreshLayout.setHeaderView(new SimpleRefreshView(this));
refreshLayout.setOnSimpleRefreshListener(this);
}
private void initListener() {
......@@ -550,24 +540,29 @@ public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements
timerTask.cancel();
}
private long pullTime = 0L;
private void getData() {
List<ChatMessage> lists;
if (pullTime == 0L) { // 加载前20条
lists = ((ChatPresenterImp) presenter).getDbService().getFirstPageMessage(targetUserId);
} else {
lists = ((ChatPresenterImp) presenter).getDbService().loadMoreMessage(targetUserId, pullTime);
}
if (lists == null || lists.size() == 0) {
refreshLayout.setPullDownEnable(false);
return;
}
// if (startPosition < 20) {
// endPosition = 1;
// } else {
// endPosition = startPosition - startPosition % 10 - 10;
// }
// if (totalPages > 0) {
List<ChatMessage> lists = ((ChatPresenterImp) presenter).getDbService().getAllMessage(targetUserId);
if (lists != null) {
messages.clear();
messages.addAll(lists);
adapter.notifyDataSetChanged();
if (messages.size() > 0) {
recycleContent.smoothScrollToPosition(messages.size() - 1);
if (lists.size() < 20) {
refreshLayout.setPullDownEnable(false);
}
messages.addAll(0, lists);
adapter.notifyDataSetChanged();
if (messages.size() > 0 && pullTime == 0L) {
recycleContent.smoothScrollToPosition(lists.size() - 1);
}
// }
pullTime = lists.get(0).getTimeSend();
}
private TextWatcher watcher = new TextWatcher() {
......@@ -755,4 +750,20 @@ public class ChatActivity extends BaseStatusActivity<CommonPresenter> implements
params.put("userId", targetUserId);
mPresenter.getData(1, url, User.class, params, false);
}
@Override
public void onRefresh() {
handler.sendEmptyMessageDelayed(0, 1000);
}
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
if (!isFinishing()) {
refreshLayout.onRefreshComplete();
getData();
}
}
};
}
......@@ -8,7 +8,15 @@ import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import com.google.gson.Gson;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
import com.lzy.okgo.utils.HttpUtils;
import com.ruiwenliu.wrapper.MessageEventRemoteLogin;
import com.rv.component.utils.AppCookie;
import com.rv.component.utils.CacheEnum;
import com.rv.component.utils.RvCache;
import com.rv.im.bean.LastChatHistoryListBean;
import com.rv.im.broadcast.MessageReceiver;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.enums.CallTypeEnum;
......@@ -22,12 +30,17 @@ import com.rv.im.xmpp.XChatManager;
import com.rv.im.xmpp.XmppConnectionManager;
import com.rv.im.xmpp.listener.AuthStateListener;
import com.rv.im.xmpp.listener.ChatMessageListener;
import com.yuyife.okgo.OkGoUtil;
import org.greenrobot.eventbus.EventBus;
import org.jivesoftware.smack.XMPPConnection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class ImService extends Service {
private static final String TAG = ImService.class.getSimpleName();
......@@ -75,13 +88,14 @@ public class ImService extends Service {
LogUtil.e(TAG, "xmpp:notifyAuthenticated");
onAuthenticated();
ListenerManager.getInstance().notifyAuthStateChange(AuthStateListener.AUTH_STATE_SUCCESS);// 通知登陆成功
getLastChatHistory();
getChatHistory();
}
@Override
public void notifyConnectionClosedOnError(Exception e) {
AppCookie.save(AppCookie.OFFLINE_TIME + mLoginUserId, System.currentTimeMillis());
ListenerManager.getInstance().notifyAuthStateChange(AuthStateListener.AUTH_STATE_NOT);
release();
LogUtil.e(TAG, "xmpp:notifyConnectionClosedOnError");
Log.e(TAG, "连接异常==" + e.getMessage());
if (e.getMessage().contains("conflict")) {
......@@ -95,6 +109,8 @@ public class ImService extends Service {
@Override
public void notifyConnectionClosed() {
LogUtil.e(TAG, "xmpp:notifyConnectionClosed");
AppCookie.save(AppCookie.OFFLINE_TIME + mLoginUserId, System.currentTimeMillis());
release();
ListenerManager.getInstance().notifyAuthStateChange(AuthStateListener.AUTH_STATE_NOT);
}
};
......@@ -133,14 +149,14 @@ public class ImService extends Service {
}
/* 消息回执管理 */
if (mReceiptManager == null) {
if (mReceiptManager == null && mConnectionManager != null) {
mReceiptManager = new ReceiptManager(this, mConnectionManager.getConnection());
} else {
mReceiptManager.reset();
}
// 初始化消息处理
if (mXChatManager == null) {
if (mXChatManager == null && mConnectionManager != null) {
mXChatManager = new XChatManager(this, mConnectionManager.getConnection());
} else {
mXChatManager.reset();
......@@ -167,8 +183,39 @@ public class ImService extends Service {
}
}
public void getChatHistory() {
Map<String, String> params = new HashMap();
params.put("access_token", ImSetting.getImToken());
params.put("receiver", mLoginUserId);
public void getLastChatHistory() {
long syncTimeLen = AppCookie.getLongValue(AppCookie.OFFLINE_TIME + mLoginUserId, 0l);
params.put("startTime", String.valueOf(syncTimeLen));
params.put("endTime", String.valueOf(System.currentTimeMillis()));
params.put("pageSize", String.valueOf(100));// 尽量传一个大的值 一次性拉下来
AppConfig appConfig = (AppConfig) RvCache.getInstance().get(CacheEnum.IM_CONFIG);
OkGoUtil.getMap(appConfig.GET_CHAT_MSG, params, new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
if (response == null) return;
int code = response.code();
String body = response.body();
if (code == 200 && !TextUtils.isEmpty(body)) {
Log.e("im_onSuccess", body);
// LastChatHistoryListBean bean = new Gson().fromJson(body, LastChatHistoryListBean.class);
// if (bean != null && bean.getResultCode() == 1) {
// if (bean.getCurrentTime() != 0l) {
// AppCookie.save(AppCookie.OFFLINE_TIME + mLoginUserId, bean.getCurrentTime());
// }
// List<LastChatHistoryListBean.ChatHistoryItem> historyItems = bean.getData();
// if (historyItems != null && historyItems.size() > 0) {
// for (LastChatHistoryListBean.ChatHistoryItem item : historyItems) {
// ListenerManager.getInstance().notifyNewMesssage(ChatMessage.historyToChatMessage(item));
// }
// }
// }
}
}
});
}
......@@ -243,14 +290,6 @@ public class ImService extends Service {
}
}
public void logout() {
isInit = false;
if (mConnectionManager != null) {
mConnectionManager.logout();
}
stopSelf();
}
/**
* 发送聊天消息
*/
......
package com.rv.im.bean;
import com.ruiwenliu.wrapper.base.BaseBean;
import java.util.List;
public class LastChatHistoryListBean extends BaseBean {
public class LastChatHistoryListBean{
private long currentTime;
private List<ChatHistoryItem> data;
private int resultCode ;
public long getCurrentTime() {
return currentTime;
......@@ -25,6 +24,14 @@ public class LastChatHistoryListBean extends BaseBean {
this.data = data;
}
public int getResultCode() {
return resultCode;
}
public void setResultCode(int resultCode) {
this.resultCode = resultCode;
}
public class ChatHistoryItem {
private String _id ;
private String jid;
......
......@@ -9,6 +9,7 @@ import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.stmt.QueryBuilder;
import com.rv.im.ImSetting;
import com.rv.im.db.SQLiteHelper;
import com.rv.im.db.table.ChatMessage;
......@@ -16,6 +17,9 @@ import com.rv.im.enums.MessageStatusEnum;
import com.rv.im.log.LogUtil;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MessageDao {
......@@ -163,6 +167,9 @@ public class MessageDao {
.or()
.eq("toUserId", targetId)
.query();
if (chatMessages != null) {
Collections.sort(chatMessages, (o1, o2) -> (int) (o1.getTimeSend() - o2.getTimeSend()));
}
} catch (SQLException e) {
e.printStackTrace();
}
......@@ -361,4 +368,63 @@ public class MessageDao {
e.printStackTrace();
}
}
public List<ChatMessage> loadMoreMessage(String userId, long time) {
if (dao == null) {
LogUtil.e(TAG, "dao is null");
return null;
}
if (TextUtils.isEmpty(userId)) {
LogUtil.e(TAG, "userId is null");
return null;
}
QueryBuilder<ChatMessage, Integer> builder = dao.queryBuilder();
List<ChatMessage> chatMessages = null;
try {
// builder.where().gt("_id", mMinId);
builder.where().eq("fromUserId", userId)
.or()
.eq("toUserId", userId);
builder.where().lt("timeSend", time);
builder.orderBy("timeSend", false);
builder.limit(20L);
builder.offset(0L);
chatMessages = dao.query(builder.prepare());
if (chatMessages != null) {
Collections.sort(chatMessages, (o1, o2) -> (int) (o1.getTimeSend() - o2.getTimeSend()));
}
} catch (SQLException e) {
e.printStackTrace();
}
return chatMessages;
}
public List<ChatMessage> getFirstPageMessage(String userId) {
if (dao == null) {
LogUtil.e(TAG, "dao is null");
return null;
}
if (TextUtils.isEmpty(userId)) {
LogUtil.e(TAG, "message is null");
return null;
}
List<ChatMessage> chatMessages = null;
try {
chatMessages = dao.queryBuilder().orderBy("timeSend", false)
.limit(20L)
.where()
.eq("fromUserId", userId)
.or()
.eq("toUserId", userId)
.query();
if (chatMessages != null) {
Collections.sort(chatMessages, (o1, o2) -> (int) (o1.getTimeSend() - o2.getTimeSend()));
}
} catch (SQLException e) {
e.printStackTrace();
}
return chatMessages;
}
}
......@@ -105,6 +105,16 @@ public class ChatMessageServiceImp implements IChatMessageService {
dao.deleteMessage(message);
}
@Override
public List<ChatMessage> loadMoreMessage(String userId, long time) {
return dao.loadMoreMessage(userId, time);
}
@Override
public List<ChatMessage> getFirstPageMessage(String userId) {
return dao.getFirstPageMessage(userId);
}
public void release() {
instance = null;
}
......
......@@ -34,4 +34,8 @@ public interface IChatMessageService {
void deleteMessage(ChatMessage message) ;
List<ChatMessage> loadMoreMessage(String userId,long time) ;
List<ChatMessage> getFirstPageMessage(String userId);
}
......@@ -6,6 +6,7 @@ import com.google.gson.annotations.SerializedName;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import com.rv.im.bean.LastChatHistoryListBean;
import com.rv.im.enums.CallTypeEnum;
import com.rv.im.enums.MessageStatusEnum;
import com.rv.im.enums.MessageTypeEnum;
......@@ -321,4 +322,32 @@ public class ChatMessage implements Serializable {
return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(this);
}
/******
* TEXT(1, "文本"),
* FILE(9, "文件"),
* PIC(2, "图片"),
* VOICE(3, "语音"),
* VOLTE_CALL(5, "语音通话"),
* VIDEO_CALL(6, "视频通话"),
* @param item
* @return
*/
public static ChatMessage historyToChatMessage(LastChatHistoryListBean.ChatHistoryItem item) {
if (item != null && (item.getType() == MessageTypeEnum.TEXT.getType() || item.getType() == MessageTypeEnum.PIC.getType()
|| item.getType() == MessageTypeEnum.VOICE.getType())) {
ChatMessage chatMessage = new ChatMessage();
chatMessage.setMessageType(item.getType());
chatMessage.setContent(item.getContent());
chatMessage.setFromUserId(item.getFrom());
chatMessage.setFromUserName(item.getFromUserName());
chatMessage.setToUserId(item.getTo());
chatMessage.setToUserName(item.getToUserName());
chatMessage.setIsEncrypt(item.getIsEncrypt());
chatMessage.setPackId(item.getMessageId());
chatMessage.setTimeSend(item.getTimeSend());
return chatMessage;
}
return null;
}
}
......@@ -102,6 +102,7 @@ public class ListenerManager {
* 新消息来临
*/
public void notifyNewMesssage(final ChatMessage message) {
if (message == null) return;
NotificationMananger.showNewsNotification(ImSetting.getContext(), message.getFromId());
bell();
mHandler.post(() -> {
......
......@@ -69,8 +69,8 @@
android:inputType="textMultiLine"
android:maxLines="3"
android:paddingLeft="@dimen/dp_10"
android:paddingRight="@dimen/dp_10"
android:paddingTop="6dp"
android:paddingRight="@dimen/dp_10"
android:paddingBottom="6dp"
android:textSize="@dimen/one_level_title" />
......@@ -159,12 +159,14 @@
</FrameLayout>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_content"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/rl_chat_meun"
android:layout_alignParentTop="true" />
android:layout_alignParentTop="true">
<include layout="@layout/common_refresh" />
</RelativeLayout>
</RelativeLayout>
</com.rv.im.view.MyLinearLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment