From d4fbbdfe296a151b1b126df8c52a5902393790b9 Mon Sep 17 00:00:00 2001 From: Stas Safyanov Date: Tue, 21 Nov 2017 14:52:04 +0200 Subject: [PATCH] implemented new local and upload statuses and resend and reupload messages --- .../mobile/communicator/data/DataManager.java | 60 +++++++++++---- .../mobile/communicator/data/db/DbHelper.java | 53 ++++++++++++- .../communicator/data/db/DbOpenHelper.java | 47 +++++++----- .../data/db/tables/MessagesTable.java | 19 ++++- .../communicator/data/db/tables/Table.java | 9 ++- .../data/models/mqtt/Message.java | 17 ++++- .../communicator/data/server/PahoService.java | 4 +- .../data/upload/AmazonFileUpload.java | 7 +- .../mvp/presenters/ChatPresenter.java | 76 ++++++++++--------- 9 files changed, 206 insertions(+), 86 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java index f741713d5e..3c9123352f 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java @@ -3,7 +3,6 @@ package com.nynja.mobile.communicator.data; import android.content.Context; import android.graphics.Bitmap; import android.media.ThumbnailUtils; -import android.os.CountDownTimer; import android.provider.MediaStore; import android.provider.Settings; import android.support.annotation.NonNull; @@ -50,7 +49,6 @@ import com.nynja.mobile.communicator.data.server.bert.BertAtom; import com.nynja.mobile.communicator.data.telesign.TelesignModule; import com.nynja.mobile.communicator.data.upload.IFileUploadModule; import com.nynja.mobile.communicator.data.upload.UploadProgressInterface; -import com.nynja.mobile.communicator.data.upload.UploadProgressWrapper; import com.nynja.mobile.communicator.data.voximplant.VoxImplantModule; import com.nynja.mobile.communicator.injection.ApplicationContext; import com.nynja.mobile.communicator.utils.ContactsUtil; @@ -67,7 +65,6 @@ import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.concurrent.CompletableFuture; import javax.inject.Inject; import javax.inject.Singleton; @@ -225,7 +222,6 @@ public class DataManager { if (getProfile() == null) return; Roster roster = getProfile().getRoster(); if (roster == null) return; - message.localStatus = Message.MessageLocalStatuses.DELIVERED; mDbHelper.saveMessage(message); boolean isInChat = isInChat(message.from); if (message.feed_id instanceof P2p) { @@ -554,8 +550,9 @@ public class DataManager { } //Messaging - public void sendMessageInChat(@NonNull Room room, @Nullable File file, - UploadProgressInterface uploadProgressInterface, @NonNull Desc... desc) { + public void sendMessageInChat(@NonNull Room room, + UploadProgressInterface uploadProgressInterface, + @NonNull Desc... desc) { Message message = new Message(); BaseParcelMQQT feed; if (room.isGroupChat()) { @@ -581,27 +578,34 @@ public class DataManager { message.feed_id = feed; message.status = BaseMQQT.Statuses.CLIENT; message.localId = generateLocalMessageId(); - message.localStatus = Message.MessageLocalStatuses.SENT; + message.localStatus = Message.LocalStatuses.NEW; message.created = System.currentTimeMillis(); mDbHelper.saveMessage(message); - if (file != null) { - sendMessageToServer(message, uploadProgressInterface, desc); + uploadSendNewMessage(message, uploadProgressInterface); + } + + private void uploadSendNewMessage(Message message, + UploadProgressInterface uploadProgressInterface) { + if (message.files.size() == 1 && message.files.get(0).mime.equals(Desc.MimeTypes.Text)) { + mDbHelper.updateMessageUploadStatus(message, Message.UploadStatuses.UPLOADING_SERVER); } else { - mBus.postToServer(new SendMessage(EventTopics.SEND_MESSAGE, message)); + mDbHelper.updateMessageUploadStatus(message, Message.UploadStatuses.UPLOADING_AWS); } + sendMessageByUploadStatus(message, uploadProgressInterface); } - private void sendMessageToServer(Message message, - UploadProgressInterface uploadProgressInterface, @NonNull Desc... desc) { - int descLength = desc.length; + private void uploadMessageAndSendOnServer(Message message, UploadProgressInterface uploadProgressInterface) { + List descList = message.files; + int descLength = descList.size(); final Integer[] cnt = {0}; - for (Desc curDesc : desc) { + for (Desc curDesc : descList) { uploadFile(new File(curDesc.payload), new UploadProgressInterface() { @Override public void onComplete(String url) { curDesc.payload = url; cnt[0] = cnt[0] + 1; if (cnt[0].equals(descLength)) { - mBus.postToServer(new SendMessage(EventTopics.SEND_MESSAGE, message)); + mDbHelper.updateMessageUploadStatus(message, Message.UploadStatuses.UPLOADING_SERVER); + sendMessageByUploadStatus(message, uploadProgressInterface); } } @@ -614,6 +618,10 @@ public class DataManager { } } + private void sentMessageOnServer(Message message) { + mBus.postToServer(new SendMessage(EventTopics.SEND_MESSAGE, message)); + } + private String generateLocalMessageId() { return String.format(Locale.getDefault(), "%s_%d", @@ -860,7 +868,7 @@ public class DataManager { Desc descThumb = new Desc(); descThumb.mime = BaseMQQT.MimeTypes.Thumb; descThumb.payload = thumb.getAbsolutePath(); - sendMessageInChat(room, file, uploadProgressInterface, descThumb, descVideo); + sendMessageInChat(room, uploadProgressInterface, descThumb, descVideo); } //Local events @@ -1077,4 +1085,24 @@ public class DataManager { Member member = room.findMemberById(getProfile().getRoster().getRosterId()); return member.isNotificationEnabled(); } + + public void sendUndeliveredMessages() { + List messages = mDbHelper.getMessagesByLocalStatus(Message.LocalStatuses.NEW); + if (messages != null) { + for (Message msg : messages) { + sendMessageByUploadStatus(msg, null); + } + } + } + + private void sendMessageByUploadStatus(Message msg, UploadProgressInterface uploadProgressInterface) { + switch (msg.uploadStatus) { + case Message.UploadStatuses.UPLOADING_AWS: + uploadMessageAndSendOnServer(msg, uploadProgressInterface); + break; + case Message.UploadStatuses.UPLOADING_SERVER: + sentMessageOnServer(msg); + break; + } + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/db/DbHelper.java b/app/src/main/java/com/nynja/mobile/communicator/data/db/DbHelper.java index 4eb78c6e47..74f7bb92ff 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/db/DbHelper.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/db/DbHelper.java @@ -315,7 +315,6 @@ public class DbHelper { saveDesc(room); saveRoomFeatures(room); if (room.last_msg != null) { - room.last_msg.localStatus = Message.MessageLocalStatuses.DELIVERED; saveMessage(room.last_msg); } transaction.markSuccessful(); @@ -417,7 +416,6 @@ public class DbHelper { private void saveMessage(Contact contact) { if (contact.message != null) { - contact.message.localStatus = Message.MessageLocalStatuses.DELIVERED; saveMessage(contact.message); } } @@ -431,6 +429,10 @@ public class DbHelper { if (insertId != -1) { message.autoLocalId = insertId; } + if (message.serverId != null && message.serverId != 0) { ///from server + updateMessageUploadStatus(message, Message.UploadStatuses.UPLOADING_DONE); + updateMessageLocalStatus(message, insertId != -1 ? Message.LocalStatuses.INSERT : Message.LocalStatuses.UPDATE); + } saveDesc(message); saveFeedByType(message); transaction.markSuccessful(); @@ -446,12 +448,15 @@ public class DbHelper { try { String rosterId = getProfile().getRoster().getRosterId(); for (Message message : messages) { - message.localStatus = Message.MessageLocalStatuses.DELIVERED; long insertId = updateInsert(MessagesTable.TABLE_NAME, MessagesTable.toContentValues(message), MessagesTable.getArgsUpdateInsert(message, rosterId)); if (insertId != -1) { message.autoLocalId = insertId; } + if (message.serverId != null && message.serverId != 0) { ///from server + updateMessageUploadStatus(message, Message.UploadStatuses.UPLOADING_DONE); + updateMessageLocalStatus(message, insertId != -1 ? Message.LocalStatuses.INSERT : Message.LocalStatuses.UPDATE); + } saveDesc(message); saveFeedByType(message); } @@ -550,7 +555,6 @@ public class DbHelper { return Id; } - ///FIXME StasS fixed save DESC with DELETE private void saveDesc(Message message) { if (message.files != null) { for (Desc desc : message.files) { @@ -1375,4 +1379,45 @@ public class DbHelper { transaction.end(); } } + + public void updateMessageUploadStatus(Message message, String uploadStatus) { + message.uploadStatus = uploadStatus; + updateInsert(MessagesTable.TABLE_NAME, MessagesTable.toContentValuesUploadStatus(message), + MessagesTable.getArgsUpdateInsert(message, getProfile().getRoster().getRosterId())); + } + + public void updateMessageLocalStatus(Message message, String localStatus) { + message.localStatus = localStatus; + updateInsert(MessagesTable.TABLE_NAME, MessagesTable.toContentValuesLocalStatus(message), + MessagesTable.getArgsUpdateInsert(message, getProfile().getRoster().getRosterId())); + } + + public Observable> getObservableMessagesByLocalStatus(String status) { + return mDb.createQuery(MessagesTable.TABLE_NAME, + "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.LOCAL_STATUS + " = '" + status + "'" + + " ORDER BY " + MessagesTable.Column.CREATED + " ASC") + .mapToList(cursor -> { + Message message = MessagesTable.parseCursor(cursor); + message.files.addAll(getDescByMessageId(message)); + return message; + }); + } + + public List getMessagesByLocalStatus(String status) { + ArrayList services = new ArrayList<>(); + final Cursor cursor = mDb.query( + "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.LOCAL_STATUS + " = '" + status + "'" + + " ORDER BY " + MessagesTable.Column.CREATED + " ASC"); + if (cursor != null) { + while (cursor.moveToNext()) { + final Message message = MessagesTable.parseCursor(cursor); + message.files.addAll(getDescByMessageId(message)); + services.add(message); + } + cursor.close(); + } + return services; + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/db/DbOpenHelper.java b/app/src/main/java/com/nynja/mobile/communicator/data/db/DbOpenHelper.java index 56326c6b99..68c76bb1f7 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/db/DbOpenHelper.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/db/DbOpenHelper.java @@ -21,6 +21,7 @@ import com.nynja.mobile.communicator.data.db.tables.RoomTable; import com.nynja.mobile.communicator.data.db.tables.RosterTable; import com.nynja.mobile.communicator.data.db.tables.ServiceTable; import com.nynja.mobile.communicator.data.db.tables.StarTable; +import com.nynja.mobile.communicator.data.db.tables.Table; import com.nynja.mobile.communicator.data.db.tables.TagTable; import com.nynja.mobile.communicator.data.db.tables.VoxTable; @@ -32,7 +33,7 @@ import timber.log.Timber; public class DbOpenHelper extends SQLiteOpenHelper { - private static final int VERSION = 5; + private static final int VERSION = 6; private static final String DB_NAME = "nynja.db"; public DbOpenHelper(Context context) { @@ -73,26 +74,30 @@ public class DbOpenHelper extends SQLiteOpenHelper { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < newVersion) { - db.execSQL(AuthTable.DROP); - db.execSQL(ContactsTable.DROP); - db.execSQL(DescTable.DROP); - db.execSQL(LocalContactsTable.DROP); - db.execSQL(MemberTable.DROP); - db.execSQL(MessagesTable.DROP); - db.execSQL(MucTable.DROP); - db.execSQL(P2pTable.DROP); - db.execSQL(ProfileTable.DROP); - db.execSQL(PushTable.DROP); - db.execSQL(RoomMembersTable.DROP); - db.execSQL(RoomTable.DROP); - db.execSQL(RosterTable.DROP); - db.execSQL(ServiceTable.DROP); - db.execSQL(StarTable.DROP); - db.execSQL(TagTable.DROP); - db.execSQL(FeatureTable.DROP); - db.execSQL(CdrTable.DROP); - db.execSQL(VoxTable.DROP); - onCreate(db); + switch (oldVersion) { + case 1: + case 2: + case 3: + case 4: + case 5: + //upgrade logic from version 5 to 6 + migrateFrom5To6(db); + case 6: + //upgrade logic from version 6 to 7 + case 7: + //upgrade logic from version 7 to 8 + + + break; + default: + throw new IllegalStateException( + "onUpgrade() with unknown oldVersion" + oldVersion); + } } } + + private void migrateFrom5To6(SQLiteDatabase db) { + db.execSQL(Table.ALTER_TABLE + MessagesTable.TABLE_NAME + Table.ADD + + Table.COLUMN + MessagesTable.Column.UPLOAD_STATUS + Table.VARCHAR(40)); + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/MessagesTable.java b/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/MessagesTable.java index ea3d42f496..de3b25b0f4 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/MessagesTable.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/MessagesTable.java @@ -56,6 +56,7 @@ public class MessagesTable extends Table { + Column.TYPE_MSG + VARCHAR(40) + COMMA + Column.EDIT_MSG + INTEGER + COMMA + Column.LOCAL_STATUS + VARCHAR(40) + COMMA + + Column.UPLOAD_STATUS + VARCHAR(40) + COMMA + Column.STATUS + VARCHAR(40) + E_BKT + SEMICOLON; @@ -76,6 +77,7 @@ public class MessagesTable extends Table { String EDIT_MSG = "message_edit_msg"; String STATUS = "message_status"; String LOCAL_STATUS = "message_local_status"; + String UPLOAD_STATUS = "message_upload_status"; } @NonNull public static ContentValues toContentValues(Message message) { @@ -90,10 +92,24 @@ public class MessagesTable extends Table { values.put(Column.CREATED, message.created); values.put(Column.EDIT_MSG, message.edit_msg); values.put(Column.LOCAL_STATUS, message.localStatus); + values.put(Column.UPLOAD_STATUS, message.uploadStatus); if (message.status != null) values.put(Column.STATUS, message.status.atom); return values; } + + @NonNull public static ContentValues toContentValuesUploadStatus(Message message) { + ContentValues values = new ContentValues(); + values.put(Column.UPLOAD_STATUS, message.uploadStatus); + return values; + } + + @NonNull public static ContentValues toContentValuesLocalStatus(Message message) { + ContentValues values = new ContentValues(); + values.put(Column.LOCAL_STATUS, message.localStatus); + return values; + } + public static ContentValues updateFeedByMessageId(long feedId, long feedType) { ContentValues values = new ContentValues(); values.put(Column.FEED_ID, feedId); @@ -109,7 +125,7 @@ public class MessagesTable extends Table { message.container = container == null ? null : new BertAtom(container); message.prev = cursor.getLong(cursor.getColumnIndexOrThrow(Column.PREV)); message.next = cursor.getLong(cursor.getColumnIndexOrThrow(Column.NEXT)); - message.localId = String.valueOf(cursor.getLong(cursor.getColumnIndexOrThrow(Column.LOCAL_ID))); + message.localId = cursor.getString(cursor.getColumnIndexOrThrow(Column.LOCAL_ID)); message.from = cursor.getString(cursor.getColumnIndexOrThrow(Column.FROM)); message.to = cursor.getString(cursor.getColumnIndexOrThrow(Column.TO)); message.created = cursor.getLong(cursor.getColumnIndexOrThrow(Column.CREATED)); @@ -117,6 +133,7 @@ public class MessagesTable extends Table { final String status = cursor.getString(cursor.getColumnIndexOrThrow(Column.STATUS)); message.status = status == null ? null : new BertAtom(status); message.localStatus = cursor.getString(cursor.getColumnIndexOrThrow(Column.LOCAL_STATUS)); + message.uploadStatus = cursor.getString(cursor.getColumnIndexOrThrow(Column.UPLOAD_STATUS)); return message; } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/Table.java b/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/Table.java index 841c2040b9..85f5bc6a97 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/Table.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/Table.java @@ -20,7 +20,7 @@ public abstract class Table { protected static final String DEFAULT = " DEFAULT"; protected static final String REAL = " REAL"; protected static final String DOUBLE = " DOUBLE"; - protected static final String COMMA = ", "; + public static final String COMMA = ", "; protected static final String INTEGER = " INTEGER"; protected static final String PRIMARY_KEY = " PRIMARY KEY "; protected static final String AUTOINCREMENT = " AUTOINCREMENT"; @@ -32,9 +32,14 @@ public abstract class Table { protected static final String REFERENCES = " REFERENCES "; protected static final String CONSTRAINT = " CONSTRAINT "; + public static final String ALTER_TABLE = "ALTER TABLE "; + public static final String ADD = " ADD "; + public static final String COLUMN = " COLUMN "; + + public static final String DROP_TABLE_IF_EXISTS = "DROP TABLE IF EXISTS "; - protected static String VARCHAR(int var) { + public static String VARCHAR(int var) { return " VARCHAR(" + var + ")"; } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/models/mqtt/Message.java b/app/src/main/java/com/nynja/mobile/communicator/data/models/mqtt/Message.java index 0e4ec77ddb..3ca894d107 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/models/mqtt/Message.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/models/mqtt/Message.java @@ -27,6 +27,7 @@ public class Message extends BaseParcelMQQT { @Order(13) public BertAtom status; public Long autoLocalId; public String localStatus; + public String uploadStatus; public Message() { } @@ -119,9 +120,19 @@ public class Message extends BaseParcelMQQT { return created; } - public interface MessageLocalStatuses { - String SENT = "sent"; - String DELIVERED = "delivered"; + public interface LocalStatuses { + String NEW = "new"; + String DELETE = "delete"; + String UPDATE = "update"; + String INSERT = "insert"; + String DONE = "done"; + } + + public interface UploadStatuses { + String UPLOADING_AWS = "uploading_aws"; + String UPLOADING_SERVER = "uploading_server"; + String UPLOADING_DONE = "uploading_done"; + String READ = "read"; } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/server/PahoService.java b/app/src/main/java/com/nynja/mobile/communicator/data/server/PahoService.java index 8ac61fe17d..e20dea0a75 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/server/PahoService.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/server/PahoService.java @@ -190,8 +190,10 @@ public class PahoService extends Service { public void onSuccess(IMqttToken asyncActionToken) { Timber.d("Connect success"); new Thread(() -> { - if (StringUtils.isNotEmpty(mDataManager.getToken())) + if (StringUtils.isNotEmpty(mDataManager.getToken())) { mDataManager.updateTokenOnServer(); + mDataManager.sendUndeliveredMessages(); + } }).start(); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/upload/AmazonFileUpload.java b/app/src/main/java/com/nynja/mobile/communicator/data/upload/AmazonFileUpload.java index bc7753c685..aa5b2c58cb 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/upload/AmazonFileUpload.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/upload/AmazonFileUpload.java @@ -52,7 +52,8 @@ public class AmazonFileUpload implements IFileUploadModule { @Override public void onStateChanged(int id, TransferState state) { if (state.equals(TransferState.COMPLETED)) { for (UploadProgressInterface progressInterface : uploadProgressInterface) { - progressInterface.onComplete(OUR_BUCKET_ADDRESS + serverFileName); + if (progressInterface != null) + progressInterface.onComplete(OUR_BUCKET_ADDRESS + serverFileName); } } } @@ -61,13 +62,13 @@ public class AmazonFileUpload implements IFileUploadModule { public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { int percentage = (int) ((float) bytesCurrent / bytesTotal * 100); for (UploadProgressInterface progressInterface : uploadProgressInterface) { - progressInterface.onDataLoaded(percentage); + if (progressInterface != null) progressInterface.onDataLoaded(percentage); } } @Override public void onError(int id, Exception ex) { for (UploadProgressInterface progressInterface : uploadProgressInterface) { - progressInterface.onError(ex); + if (progressInterface != null) progressInterface.onError(ex); } } }); diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java index 139a5073bb..3854d239e8 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java @@ -85,7 +85,13 @@ public class ChatPresenter extends BaseErrorPresenter { final PushNotificationCounter pnc = mDataManager.getPush(mRoom.id); if (pnc != null) getViewState().clearNotificationManager((int) pnc.id); mDataManager.setActiveRoom(mRoom); - if (mRoom.isGroupChat()) mDataManager.getRoomById(mRoom.id); + if (mRoom.isGroupChat()) { + mDataManager.getRoomById(mRoom.id); + subscribeOnMember(); + } else { + subscribeOnContact(); + } + subscribeOnMsgs(); } } @@ -144,12 +150,12 @@ public class ChatPresenter extends BaseErrorPresenter { .observeOn(AndroidSchedulers.mainThread()) .subscribe(messages -> { final Message message = messages.get(messages.size() - 1); - if (mRoom.last_msg != null && message != null && mRoom.last_msg.serverId < message.serverId) { + if (mRoom.last_msg != null && message != null && mRoom.last_msg.getSortId() < message.getSortId()) { mRoom.last_msg = message; } getViewState().setMessages(messages); - subscribeOnMsgs(); - subscribeOnMember(); +// subscribeOnMsgs(); +// subscribeOnMember(); })); } else { addDisposable(mDataManager.getPrivateChatHistory(mRoom.id) @@ -164,12 +170,12 @@ public class ChatPresenter extends BaseErrorPresenter { .subscribe(messages -> { if (!messages.isEmpty()) { final Message message = messages.get(messages.size() - 1); - if (mRoom.last_msg != null && message != null && mRoom.last_msg.serverId < message.serverId) { + if (mRoom.last_msg != null && message != null && mRoom.last_msg.getSortId() < message.getSortId()) { mRoom.last_msg = message; } getViewState().setMessages(messages); - subscribeOnMsgs(); - subscribeOnContact(); +// subscribeOnMsgs(); +// subscribeOnContact(); } })); } @@ -221,11 +227,13 @@ public class ChatPresenter extends BaseErrorPresenter { .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(message -> { - mRoom.last_msg = message; - getViewState().newMessage(message); - if (mRoom.unread > 0) { - mRoom.unread++; - getViewState().setUnreadMsgCount(mRoom); + if (message.getSortId() > mRoom.last_msg.getSortId()) { + mRoom.last_msg = message; + getViewState().newMessage(message); + if (mRoom.unread > 0) { + mRoom.unread++; + getViewState().setUnreadMsgCount(mRoom); + } } })); } @@ -237,7 +245,7 @@ public class ChatPresenter extends BaseErrorPresenter { .flatMap(messages -> { Collections.sort(messages, (o1, o2) -> o1.getSortId().compareTo(o2.getSortId())); return Observable.fromIterable(messages) - .filter(message -> mFirstMsg != null && message.getSortId()< mFirstMsg.getSortId()) + .filter(message -> mFirstMsg != null && message.getSortId() < mFirstMsg.getSortId()) .doOnNext(ChatPresenter.this::downloadRecord) .toList() .toObservable(); @@ -275,7 +283,7 @@ public class ChatPresenter extends BaseErrorPresenter { Desc desc = new Desc(); desc.mime = BaseMQQT.MimeTypes.Text; desc.payload = text; - mDataManager.sendMessageInChat(mRoom, null, new UploadProgressInterface() { + mDataManager.sendMessageInChat(mRoom, new UploadProgressInterface() { @Override public void onComplete(String url) { } @@ -294,7 +302,7 @@ public class ChatPresenter extends BaseErrorPresenter { Desc desc = new Desc(); desc.mime = BaseMQQT.MimeTypes.Image; desc.payload = file.getAbsolutePath(); - mDataManager.sendMessageInChat(mRoom, file, new UploadProgressInterface() { + mDataManager.sendMessageInChat(mRoom, new UploadProgressInterface() { @Override public void onComplete(String url) { } @@ -434,20 +442,19 @@ public class ChatPresenter extends BaseErrorPresenter { desc.mime = BaseMQQT.MimeTypes.Audio; desc.payload = mAudioFilePath; desc.info = Arrays.toString(mData); - mDataManager.sendMessageInChat(mRoom, new File(mAudioFilePath), - new UploadProgressInterface() { - @Override public void onComplete(String url) { + mDataManager.sendMessageInChat(mRoom, new UploadProgressInterface() { + @Override public void onComplete(String url) { - } + } - @Override public void onDataLoaded(int percent) { + @Override public void onDataLoaded(int percent) { - } + } - @Override public void onError(Exception e) { + @Override public void onError(Exception e) { - } - }, desc); + } + }, desc); } public void sendCursor(Message message) { @@ -458,20 +465,19 @@ public class ChatPresenter extends BaseErrorPresenter { Desc desc = new Desc(); desc.mime = BaseMQQT.MimeTypes.Location; desc.payload = location.getLatitude() + "," + location.getLongitude(); - mDataManager.sendMessageInChat(mRoom, null, - new UploadProgressInterface() { - @Override public void onComplete(String url) { + mDataManager.sendMessageInChat(mRoom, new UploadProgressInterface() { + @Override public void onComplete(String url) { - } + } - @Override public void onDataLoaded(int percent) { + @Override public void onDataLoaded(int percent) { - } + } - @Override public void onError(Exception e) { + @Override public void onError(Exception e) { - } - }, desc); + } + }, desc); } public void sendFile(final File file) { @@ -482,7 +488,7 @@ public class ChatPresenter extends BaseErrorPresenter { desc.size = file.length(); mDataManager.uploadFile(file, new UploadProgressInterface() { @Override public void onComplete(String url) { - mDataManager.sendMessageInChat(mRoom, file, new UploadProgressInterface() { + mDataManager.sendMessageInChat(mRoom, new UploadProgressInterface() { @Override public void onComplete(String url) { file.delete(); } @@ -534,7 +540,7 @@ public class ChatPresenter extends BaseErrorPresenter { desc.mime = BaseMQQT.MimeTypes.Contact; desc.payload = EncodeFactory.encodeContacts(contacts); desc.size = (long) contacts.size(); - mDataManager.sendMessageInChat(mRoom, null, new UploadProgressInterface() { + mDataManager.sendMessageInChat(mRoom, new UploadProgressInterface() { @Override public void onComplete(String url) { } -- GitLab