From c64420f4f2d9af9ac083a6d4112df8e5d68e2231 Mon Sep 17 00:00:00 2001 From: Stas Safyanov Date: Thu, 2 Nov 2017 10:39:14 +0200 Subject: [PATCH 1/4] fixed chat messages --- .../mvp/presenters/ChatPresenter.java | 22 +++++++++++++++---- .../communicator/mvp/view/ChatView.java | 2 ++ .../communicator/ui/base/BaseAdapter.java | 10 +++++++-- .../ui/fragments/chats/ChatFragment.java | 7 +++++- 4 files changed, 34 insertions(+), 7 deletions(-) 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 19ce1a011f..ace2b11aac 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 @@ -1,7 +1,6 @@ package com.nynja.mobile.communicator.mvp.presenters; import android.location.Location; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.arellomobile.mvp.InjectViewState; @@ -25,9 +24,6 @@ import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.function.Consumer; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -187,6 +183,24 @@ public class ChatPresenter extends BaseErrorPresenter { })); } + public void subscribeOnOldMsgs1() { + addDisposable(mDataManager.getMsgsByChatId(mRoom.id) + .flatMap(messages -> { + Collections.sort(messages, (o1, o2) -> o1.id.compareTo(o2.id)); + return Observable.fromIterable(messages) + .filter(message -> mFirstMsgId != null && message.id < mFirstMsgId) + .doOnNext(ChatPresenter.this::downloadRecord) + .toList() + .toObservable(); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(messages -> { + mFirstMsgId = messages.get(messages.size() - 1).id; + getViewState().addOldMsgs(messages); + })); + } + public void subscribeOnOldMsgs() { addDisposable(mDataManager.getMsgsByChatId(mRoom.id) // .doOnNext(messages -> { diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java index 9e74ead3f0..adfbc3daf6 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java @@ -67,4 +67,6 @@ public interface ChatView extends ErrorMvpView { void refreshAdapter(Message message); void addOldMsgs(Message message); + + void addOldMsgs(List message); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/base/BaseAdapter.java b/app/src/main/java/com/nynja/mobile/communicator/ui/base/BaseAdapter.java index a8011c214b..3479544c3e 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/base/BaseAdapter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/base/BaseAdapter.java @@ -17,8 +17,8 @@ import java.util.List; */ /** - * @param - Inner class (class of cell) - * @param - ViewHolder extends BaseVH + * @param - Inner class (class of cell) + * @param - ViewHolder extends BaseVH */ public abstract class BaseAdapter> extends RecyclerView.Adapter { @@ -73,6 +73,12 @@ public abstract class BaseAdapter> extends RecyclerVie notifyItemInserted(mList.size() - list.size()); } + public void addItems(int startPosition, @NonNull List list) { + checkList(); + mList.addAll(startPosition, list); + notifyItemRangeInserted(startPosition, list.size()); + } + public void removeItem(@NonNull In item) { final int indexOf = mList.indexOf(item); if (indexOf > -1) { diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index e63bb92956..b2f2099cb9 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -235,7 +235,7 @@ public class ChatFragment extends BaseFragment implements ChatView, mMessageText.setText(null); } - @OnClick(R.id.f_chat_header) public void clickOnHeader(){ + @OnClick(R.id.f_chat_header) public void clickOnHeader() { mPresenter.onHeaderClick(); } @@ -703,4 +703,9 @@ public class ChatFragment extends BaseFragment implements ChatView, // mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount() - 1); // } } + + @Override public void addOldMsgs(List message) { + mAdapter.addItems(0, message); + + } } \ No newline at end of file -- GitLab From b17615eff227868b364b113b273c5daa4e98dabf Mon Sep 17 00:00:00 2001 From: Stas Safyanov Date: Thu, 2 Nov 2017 13:29:02 +0200 Subject: [PATCH 2/4] fixed get old messages, fixed DB queries --- .../mobile/communicator/data/DataManager.java | 2 +- .../mobile/communicator/data/db/DbHelper.java | 285 ++++++++---------- .../mvp/presenters/ChatPresenter.java | 74 ++--- 3 files changed, 157 insertions(+), 204 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 0dad3652f1..54075dce6f 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 @@ -879,7 +879,7 @@ public class DataManager { } public Long getSizeOfChatMsg(String fromId) { - return mDbHelper.getFirstMsgID(fromId, mProfile.getRoster().getRosterId()); + return mDbHelper.getFirstPrivateMsgID(fromId, mProfile.getRoster().getRosterId()); } public Observable> getContactsByLimit(int limit) { 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 520cc68d28..1b9b773b80 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 @@ -85,8 +85,6 @@ public class DbHelper { } finally { transaction.end(); } - - } public PushNotificationCounter getPush(@NonNull String type) { @@ -219,7 +217,6 @@ public class DbHelper { try { updateInsert(ProfileTable.TABLE_NAME, ProfileTable.toContentValues(profile), ProfileTable.Column.PHONE + " = '" + profile.phone + "'"); -// mDb.insert(ProfileTable.TABLE_NAME, ProfileTable.toContentValues(profile), SQLiteDatabase.CONFLICT_REPLACE); saveRosters(profile); saveServices(profile); saveProfileFeatures(profile); @@ -236,7 +233,6 @@ public class DbHelper { for (Service service : profile.mServices) { updateInsert(ServiceTable.TABLE_NAME, ServiceTable.toContentValues(service), ServiceTable.Column._ID + " = '" + service.id + "'"); -// mDb.insert(ServiceTable.TABLE_NAME, ServiceTable.toContentValues(service), SQLiteDatabase.CONFLICT_REPLACE); } } } @@ -254,8 +250,7 @@ public class DbHelper { BriteDatabase.Transaction transaction = mDb.newTransaction(); try { updateInsert(RosterTable.TABLE_NAME, RosterTable.toContentValues(roster, profile), - RosterTable.Column._ID + "= " + roster.id); -// mDb.insert(RosterTable.TABLE_NAME, RosterTable.toContentValues(roster, profile), SQLiteDatabase.CONFLICT_REPLACE); + RosterTable.Column._ID + " = " + roster.id); saveContacts(roster); saveRooms(roster); saveStars(roster); @@ -288,15 +283,7 @@ public class DbHelper { BriteDatabase.Transaction transaction = mDb.newTransaction(); try { updateInsert(RoomTable.TABLE_NAME, RoomTable.toContentValues(room, roster), - RoomTable.Column._ID + "='" + room.id + "'"); - -// Cursor cursor = mDb.query("SELECT * FROM " + RoomTable.TABLE_NAME + " WHERE " + RoomTable.Column._ID + "='" + room.id + "'"); -// if (cursor != null) { -// if (cursor.getCount() > 0) { -// mDb.update(RoomTable.TABLE_NAME, RoomTable.toContentValues(room, roster), -// RoomTable.Column._ID + "='" + room.id + "'"); -// } else { -// mDb.insert(RoomTable.TABLE_NAME, RoomTable.toContentValues(room, roster), SQLiteDatabase.CONFLICT_REPLACE); + RoomTable.Column._ID + " = '" + room.id + "'"); saveRoomMembers(room, room.members, false); saveRoomMembers(room, room.admins, true); saveDesc(room); @@ -318,7 +305,6 @@ public class DbHelper { DescTable.Column.TARGET_ID + " = '" + room.id + "' AND " + DescTable.Column.PAYLOAD + " = '" + desc.payload + "' AND " + DescTable.Column.MIME + " = '" + desc.mime + "'"); -// mDb.insert(DescTable.TABLE_NAME, DescTable.toContentValues(desc, room), SQLiteDatabase.CONFLICT_REPLACE); } } @@ -329,7 +315,6 @@ public class DbHelper { for (Feature feature : room.settings) { updateInsert(FeatureTable.TABLE_NAME, FeatureTable.toContentValues(feature, room), FeatureTable.Column._ID + " = " + feature.id + "'"); -// mDb.insert(FeatureTable.TABLE_NAME, FeatureTable.toContentValues(feature, room), SQLiteDatabase.CONFLICT_REPLACE); } } } @@ -346,14 +331,10 @@ public class DbHelper { if (members != null && !members.isEmpty()) { for (Member member : members) { saveMember(member); - // updateInsert(MemberTable.TABLE_NAME, MemberTable.toContentValues(member), -// MemberTable.Column._ID + " = " + member.id); -// mDb.insert(MemberTable.TABLE_NAME, MemberTable.toContentValues(member), SQLiteDatabase.CONFLICT_REPLACE); updateInsert(RoomMembersTable.TABLE_NAME, RoomMembersTable.toContentValues(room, member, isAdmin), RoomMembersTable.Column.MEMBER_ID + " = " + member.id + " AND " + RoomMembersTable.Column.ROOM_ID + " = '" + room.id + "' AND " + RoomMembersTable.Column.IS_ADMIN + " = " + (isAdmin ? 1 : 0)); -// mDb.insert(RoomMembersTable.TABLE_NAME, RoomMembersTable.toContentValues(room, member, isAdmin), SQLiteDatabase.CONFLICT_REPLACE); } } } @@ -363,7 +344,6 @@ public class DbHelper { for (Star star : roster.favorite) { updateInsert(StarTable.TABLE_NAME, StarTable.toContentValues(star), StarTable.Column.MESSAGE_ID + " = " + star.message.id); -// mDb.insert(StarTable.TABLE_NAME, StarTable.toContentValues(star), SQLiteDatabase.CONFLICT_REPLACE); } } } @@ -373,7 +353,6 @@ public class DbHelper { for (Tag tag : roster.mTags) { updateInsert(TagTable.TABLE_NAME, TagTable.toContentValues(tag), TagTable.Column.NAME + " = '" + tag.name + "'"); -// mDb.insert(TagTable.TABLE_NAME, TagTable.toContentValues(tag), SQLiteDatabase.CONFLICT_REPLACE); } } } @@ -383,12 +362,10 @@ public class DbHelper { if (roster.userlist.isEmpty()) { Contact contact = roster.rosterToContact(); saveContact(contact, roster); -// mDb.insert(ContactsTable.TABLE_NAME, ContactsTable.toContentValues(contact, roster), SQLiteDatabase.CONFLICT_REPLACE); saveMessage(contact); } else { for (Contact contact : roster.userlist) { saveContact(contact, roster); -// mDb.insert(ContactsTable.TABLE_NAME, ContactsTable.toContentValues(contact, roster), SQLiteDatabase.CONFLICT_REPLACE); saveMessage(contact); } } @@ -481,7 +458,6 @@ public class DbHelper { } } - private void saveFeedByType(Member member) { if (member.feed_id != null) { if (member.feed_id instanceof P2p) { @@ -527,7 +503,6 @@ public class DbHelper { updateInsert(DescTable.TABLE_NAME, DescTable.toContentValues(desc, message), DescTable.Column.TARGET_TYPE + " = " + DescTable.TYPE_MESSAGE + " AND " + DescTable.Column.TARGET_ID + " = '" + message.id + "'"); -// mDb.insert(DescTable.TABLE_NAME, DescTable.toContentValues(desc, message), SQLiteDatabase.CONFLICT_REPLACE); } } } @@ -621,9 +596,10 @@ public class DbHelper { } public Observable> getGroupChatMsgs(String chatId) { - return mDb.createQuery(MessagesTable.TABLE_NAME, "SELECT * FROM " + MessagesTable.TABLE_NAME + - " WHERE " + MessagesTable.Column.FEED_ID + " = (SELECT " + - MessagesTable.Column._ID + " FROM " + MucTable.TABLE_NAME + " WHERE " + MucTable.Column.NAME + " = '" + chatId + "')") + return mDb.createQuery(MessagesTable.TABLE_NAME, + "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.FEED_TYPE + " = " + MucTable.feedType + " AND " + + MessagesTable.Column.TO + " = '" + chatId + "'") .mapToList(cursor -> { Message message = MessagesTable.parseCursor(cursor); message.feed_id = getMessageFeedByType(cursor); @@ -632,10 +608,54 @@ public class DbHelper { }); } + public Single> getGroupChatHistory(String chatId) { + return Single.fromCallable(() -> { + Cursor cursor = mDb.query( + "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.FEED_TYPE + " = " + MucTable.feedType + " AND " + + MessagesTable.Column.TO + " = '" + chatId + "'"); + List list = new ArrayList<>(); + if (cursor != null) { + while (cursor.moveToNext()) { + Message message = MessagesTable.parseCursor(cursor); + message.feed_id = getMessageFeedByType(cursor); + message.files.addAll(getDescByMessageId(message)); + list.add(message); + } + cursor.close(); + } + return list; + }); + } + + public Single> getPrivateChatHistory(String chatId, String rosterId) { + return Single.fromCallable(() -> { + Cursor cursor = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.FEED_TYPE + " = " + P2pTable.feedType + " AND ( " + + MessagesTable.Column.FROM + " = '" + chatId + "' AND " + MessagesTable.Column.TO + " = '" + rosterId + "')" + + " OR (" + + MessagesTable.Column.FROM + " = '" + rosterId + "' AND " + MessagesTable.Column.TO + " = '" + chatId + "')" + + " ORDER BY " + MessagesTable.Column._ID + " ASC"); + List list = new ArrayList<>(); + if (cursor != null) { + while (cursor.moveToNext()) { + Message message = MessagesTable.parseCursor(cursor); + message.feed_id = getMessageFeedByType(cursor); + message.files.addAll(getDescByMessageId(message)); + list.add(message); + } + cursor.close(); + } + return list; + }); + } + public Observable> getPrivateChatMsgs(String chatId, String rosterId) { - return mDb.createQuery(MessagesTable.TABLE_NAME, "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE (" + + return mDb.createQuery(MessagesTable.TABLE_NAME, "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.FEED_TYPE + " = " + P2pTable.feedType + " AND (" + MessagesTable.Column.FROM + " = '" + chatId + "' AND " + MessagesTable.Column.TO + " = '" + rosterId + "')" - + " OR (" + MessagesTable.Column.FROM + " = '" + rosterId + "' AND " + MessagesTable.Column.TO + " = '" + chatId + "')" + + " OR (" + + MessagesTable.Column.FROM + " = '" + rosterId + "' AND " + MessagesTable.Column.TO + " = '" + chatId + "')" + " ORDER BY " + MessagesTable.Column._ID + " ASC") .mapToList(cursor -> { Message message = MessagesTable.parseCursor(cursor); @@ -669,7 +689,7 @@ public class DbHelper { " WHERE " + RoomTable.TABLE_NAME + "." + RoomTable.Column._ID + " IN (SELECT " + RoomTable.TABLE_NAME + "." + RoomTable.Column._ID + " FROM " + RoomTable.TABLE_NAME + ", " + MessagesTable.TABLE_NAME + - " WHERE " + MessagesTable.Column.FEED_TYPE + " = 2 " + + " WHERE " + MessagesTable.Column.FEED_TYPE + " = " + MucTable.feedType + " AND " + MessagesTable.Column.TO + " = " + RoomTable.TABLE_NAME + "." + RoomTable.Column._ID + " AND " + RoomTable.Column.UNREAD + " > 0" + " GROUP BY " + RoomTable.TABLE_NAME + "." + RoomTable.Column._ID + @@ -687,35 +707,15 @@ public class DbHelper { return room; } - public Single> getPrivateChatHistory(String chatId, String rosterId) { - return Single.fromCallable(() -> { - Cursor cursor = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE (" + - MessagesTable.Column.FROM + " = '" + chatId - + "' AND " + MessagesTable.Column.TO + " = '" + rosterId + "')" - + " OR (" + MessagesTable.Column.FROM + " = '" + rosterId - + "' AND " + MessagesTable.Column.TO + " = '" + chatId + "')" - + " ORDER BY " + MessagesTable.Column._ID + " ASC"); - - List list = new ArrayList<>(); - if (cursor != null) { - while (cursor.moveToNext()) { - Message message = MessagesTable.parseCursor(cursor); - message.feed_id = getMessageFeedByType(cursor); - message.files.addAll(getDescByMessageId(message)); - list.add(message); - } - cursor.close(); - } - return list; - }); - } - private Message getMessageByContactId(String fromId, String myId) { Message message = null; - final Cursor cursor = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE (" + + final Cursor cursor = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.FEED_TYPE + " = " + P2pTable.feedType + " AND (" + MessagesTable.Column.FROM + " = '" + fromId + "' AND " + MessagesTable.Column.TO + " = '" + myId + "')" - + " OR (" + MessagesTable.Column.FROM + " = '" + myId + "' AND " + MessagesTable.Column.TO + " = '" + fromId + "')" - + " ORDER BY " + MessagesTable.Column._ID + " DESC limit 1"); + + " OR (" + + MessagesTable.Column.FROM + " = '" + myId + "' AND " + MessagesTable.Column.TO + " = '" + fromId + "')" + + " ORDER BY " + MessagesTable.Column._ID + + " DESC limit 1"); if (cursor != null) { if (cursor.getCount() > 0) { cursor.moveToFirst(); @@ -798,17 +798,6 @@ public class DbHelper { updateInsert(ContactsTable.TABLE_NAME, ContactsTable.toContentValues(contact, roster), ContactsTable.Column.PHONE_ID + " = '" + contact.phoneId + "'"); -// Cursor cursor = mDb.query("SELECT * FROM " + ContactsTable.TABLE_NAME + " WHERE " + ContactsTable.Column.PHONE_ID + "='" + contact.phoneId + "'"); -// if (cursor != null) { -// if (cursor.getCount() > 0) { -// mDb.update(ContactsTable.TABLE_NAME, -// ContactsTable.toContentValues(contact, roster), -// ContactsTable.Column.PHONE_ID + "='" + contact.phoneId + "'"); -// } else if (!Contact.Statuses.INTERNAL.equals(contact.status)) { -// mDb.insert(ContactsTable.TABLE_NAME, ContactsTable.toContentValues(contact, roster), SQLiteDatabase.CONFLICT_REPLACE); -// } -// cursor.close(); -// } transaction.markSuccessful(); } catch (Exception e) { Timber.e(e); @@ -818,8 +807,9 @@ public class DbHelper { } public Observable> getObservableChatList(String myId) { - return mDb.createQuery(ContactsTable.TABLE_NAME, "SELECT * FROM " + ContactsTable.TABLE_NAME - + " WHERE " + ContactsTable.Column.STATUS + "='" + BaseMQQT.Statuses.FRIEND.toString() + "'") + return mDb.createQuery(ContactsTable.TABLE_NAME, + "SELECT * FROM " + ContactsTable.TABLE_NAME + " WHERE " + + ContactsTable.Column.STATUS + " = '" + BaseMQQT.Statuses.FRIEND.toString() + "'") .mapToList(cursor -> { Contact contact = ContactsTable.parseCursor(cursor); contact.message = getMessageByContactId(contact.phoneId, myId); @@ -828,8 +818,9 @@ public class DbHelper { } public Observable getObservableRoom(String roomId) { - return mDb.createQuery(RoomTable.TABLE_NAME, "SELECT * FROM " + RoomTable.TABLE_NAME - + " WHERE " + RoomTable.Column._ID + "='" + roomId + "' limit 1") + return mDb.createQuery(RoomTable.TABLE_NAME, + "SELECT * FROM " + RoomTable.TABLE_NAME + " WHERE " + + RoomTable.Column._ID + " = '" + roomId + "' limit 1") .mapToOne(this::getRoom); } @@ -844,36 +835,41 @@ public class DbHelper { if (i != members.size() - 1) builder.append(","); } return mDb.createQuery(ContactsTable.TABLE_NAME, - "SELECT * FROM " + ContactsTable.TABLE_NAME + " WHERE " + ContactsTable.Column.PHONE_ID - + " IN (" + builder.toString() + ")") + "SELECT * FROM " + ContactsTable.TABLE_NAME + " WHERE " + + ContactsTable.Column.PHONE_ID + " IN (" + builder.toString() + ")") .mapToList(ContactsTable::parseCursor); } public Observable> getObservableMembers(Room room) { return mDb.createQuery(MemberTable.TABLE_NAME, - "SELECT * FROM " + MemberTable.TABLE_NAME + ", " + RoomMembersTable.TABLE_NAME + - " WHERE " + MemberTable.TABLE_NAME + "." + MemberTable.Column._ID + " = " + RoomMembersTable.Column.MEMBER_ID + - " AND " + RoomMembersTable.Column.ROOM_ID + " = '" + room.id + "' " + - " AND " + RoomMembersTable.Column.IS_ADMIN + " = 0") + "SELECT * FROM " + MemberTable.TABLE_NAME + ", " + + RoomMembersTable.TABLE_NAME + " WHERE " + + MemberTable.TABLE_NAME + "." + MemberTable.Column._ID + " = " + + RoomMembersTable.Column.MEMBER_ID + " AND " + + RoomMembersTable.Column.ROOM_ID + " = '" + room.id + "' " + " AND " + + RoomMembersTable.Column.IS_ADMIN + " = 0") .mapToList(MemberTable::parseCursor); } public Observable> getObservableContacts() { - return mDb.createQuery(ContactsTable.TABLE_NAME, "SELECT * FROM " + ContactsTable.TABLE_NAME + - " ORDER BY " + ContactsTable.Column.UPDATE + " DESC") + return mDb.createQuery(ContactsTable.TABLE_NAME, + "SELECT * FROM " + ContactsTable.TABLE_NAME + + " ORDER BY " + ContactsTable.Column.UPDATE + " DESC") .mapToList(ContactsTable::parseCursor); } public Observable> getObservableFriends() { - return mDb.createQuery(ContactsTable.TABLE_NAME, "SELECT * FROM " + ContactsTable.TABLE_NAME + - " WHERE " + ContactsTable.Column.STATUS + " ='" + Contact.Statuses.FRIEND.toString() + "'" + - " ORDER BY " + ContactsTable.Column.NAMES + " , " + ContactsTable.Column.SURNAMES) + return mDb.createQuery(ContactsTable.TABLE_NAME, + "SELECT * FROM " + ContactsTable.TABLE_NAME + " WHERE " + + ContactsTable.Column.STATUS + " = '" + Contact.Statuses.FRIEND.toString() + "'" + + " ORDER BY " + ContactsTable.Column.NAMES + " , " + ContactsTable.Column.SURNAMES) .mapToList(ContactsTable::parseCursor); } public Observable> getObservableAllRosters(Profile profile) { - return mDb.createQuery(RosterTable.TABLE_NAME, "SELECT * FROM " + RosterTable.TABLE_NAME + - " WHERE " + RosterTable.Column.PROFILE_ID + " ='" + profile.phone + "'") + return mDb.createQuery(RosterTable.TABLE_NAME, + "SELECT * FROM " + RosterTable.TABLE_NAME + " WHERE " + + RosterTable.Column.PROFILE_ID + " ='" + profile.phone + "'") .mapToList(cursor -> { Roster roster = RosterTable.parseCursor(cursor); calcAdditionalRosterInfo(roster); @@ -890,8 +886,9 @@ public class DbHelper { private List getTagsByRoster(Roster roster) { ArrayList stars = new ArrayList<>(); - final Cursor cursor = mDb.query("SELECT * FROM " + TagTable.TABLE_NAME + " WHERE " + - TagTable.Column.ROSTER_ID + " = '" + roster.id + "'"); + final Cursor cursor = mDb.query( + "SELECT * FROM " + TagTable.TABLE_NAME + " WHERE " + + TagTable.Column.ROSTER_ID + " = '" + roster.id + "'"); if (cursor != null) { while (cursor.moveToNext()) { final Tag tag = TagTable.parseCursor(cursor); @@ -904,8 +901,9 @@ public class DbHelper { private List getStarsByRoster(Roster roster) { ArrayList stars = new ArrayList<>(); - final Cursor cursor = mDb.query("SELECT * FROM " + StarTable.TABLE_NAME + " WHERE " + - StarTable.Column.ROSTER_ID + " = '" + roster.id + "'"); + final Cursor cursor = mDb.query( + "SELECT * FROM " + StarTable.TABLE_NAME + " WHERE " + + StarTable.Column.ROSTER_ID + " = '" + roster.id + "'"); if (cursor != null) { while (cursor.moveToNext()) { final Star star = StarTable.parseCursor(cursor); @@ -921,8 +919,9 @@ public class DbHelper { private Message getMessageById(long mesId) { Message message = null; - final Cursor cursor = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + - MessagesTable.Column._ID + " = '" + mesId + " limit 1"); + final Cursor cursor = mDb.query( + "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column._ID + " = '" + mesId + " limit 1"); if (cursor != null) { if (cursor.getCount() > 0) { cursor.moveToFirst(); @@ -937,8 +936,9 @@ public class DbHelper { private ArrayList getRoomsByRoster(Roster roster) { ArrayList rooms = new ArrayList<>(); - final Cursor cursor = mDb.query("SELECT * FROM " + RoomTable.TABLE_NAME + " WHERE " + - RoomTable.Column.ROSTER_ID + " = '" + roster.id + "'"); + final Cursor cursor = mDb.query( + "SELECT * FROM " + RoomTable.TABLE_NAME + " WHERE " + + RoomTable.Column.ROSTER_ID + " = '" + roster.id + "'"); if (cursor != null) { while (cursor.moveToNext()) { rooms.add(getRoom(cursor)); @@ -951,11 +951,12 @@ public class DbHelper { private List getMembersByRoom(Room room, boolean isAdmin) { int isAdminType = isAdmin ? 1 : 0; ArrayList members = new ArrayList<>(); - final Cursor cursor = mDb.query("SELECT * FROM " + MemberTable.TABLE_NAME + ", " + RoomMembersTable.TABLE_NAME + - " WHERE " + MemberTable.Column._ID + " = " + RoomMembersTable.Column.MEMBER_ID + " AND " + - RoomMembersTable.Column.ROOM_ID + " = '" + room.id + "' AND " + - RoomMembersTable.Column.IS_ADMIN + " = " + isAdminType + - " ORDER BY " + MemberTable.Column.UPDATE + " DESC"); + final Cursor cursor = mDb.query( + "SELECT * FROM " + MemberTable.TABLE_NAME + ", " + RoomMembersTable.TABLE_NAME + + " WHERE " + MemberTable.Column._ID + " = " + RoomMembersTable.Column.MEMBER_ID + " AND " + + RoomMembersTable.Column.ROOM_ID + " = '" + room.id + "' AND " + + RoomMembersTable.Column.IS_ADMIN + " = " + isAdminType + + " ORDER BY " + MemberTable.Column.UPDATE + " DESC"); if (cursor != null) { while (cursor.moveToNext()) { final Member member = MemberTable.parseCursor(cursor); @@ -990,17 +991,6 @@ public class DbHelper { return baseParcelMQQT; } -/* public Observable> getMembersByRoom(Room room, boolean isAdmin) { - int isAdminType = isAdmin ? 1 : 0; - return mDb.createQuery(Arrays.asList(MemberTable.TABLE_NAME, RoomMembersTable.TABLE_NAME), - "SELECT " + MemberTable.TABLE_NAME + ".* FROM " + MemberTable.TABLE_NAME + ", " + RoomMembersTable.TABLE_NAME + - " WHERE " + MemberTable.Column._ID + " = " + RoomMembersTable.Column.MEMBER_ID + " AND " + - RoomMembersTable.Column.ROOM_ID + " = " + room.id + " AND " + - RoomMembersTable.Column.IS_ADMIN + " = " + isAdminType + - " ORDER BY " + MemberTable.Column.UPDATE + " DESC") - .mapToList(MemberTable::parseCursor); - }*/ - public Observable getObservableProfile() { return mDb.createQuery(ProfileTable.TABLE_NAME, "SELECT * FROM " + ProfileTable.TABLE_NAME) .mapToOne(cursor -> { @@ -1011,10 +1001,11 @@ public class DbHelper { } public Observable> getAllFriends(String myId) { - return mDb.createQuery(ContactsTable.TABLE_NAME, "SELECT * FROM " + ContactsTable.TABLE_NAME + - " WHERE " + ContactsTable.Column.PHONE_ID + " != '" + myId + - "' AND " + ContactsTable.Column.STATUS + " == 'friend'" - + " ORDER BY " + ContactsTable.Column.NAMES + " ASC") + return mDb.createQuery(ContactsTable.TABLE_NAME, + "SELECT * FROM " + ContactsTable.TABLE_NAME + " WHERE " + + ContactsTable.Column.PHONE_ID + " != '" + myId + "' AND " + + ContactsTable.Column.STATUS + " = '" + Contact.Statuses.FRIEND.toString() + "'" + + " ORDER BY " + ContactsTable.Column.NAMES + " ASC") .mapToList(ContactsTable::parseCursor); } @@ -1024,10 +1015,11 @@ public class DbHelper { public Observable> getObservableContactsExceptMeWithLimit(String myId, int limit) { String stringLimit = limit < 1 ? "" : " LIMIT " + limit; - return mDb.createQuery(ContactsTable.TABLE_NAME, "SELECT * FROM " + ContactsTable.TABLE_NAME + - " WHERE " + ContactsTable.Column.PHONE_ID + " NOT LIKE '" + myId + - "%' ORDER BY " + ContactsTable.Column.UPDATE - + " DESC" + stringLimit) + return mDb.createQuery(ContactsTable.TABLE_NAME, + "SELECT * FROM " + ContactsTable.TABLE_NAME + " WHERE " + + ContactsTable.Column.PHONE_ID + " NOT LIKE '" + myId + + "%' ORDER BY " + ContactsTable.Column.UPDATE + + " DESC" + stringLimit) .mapToList(cursor -> { Contact contact = ContactsTable.parseCursor(cursor); contact.message = getMessageByContactId(contact.phoneId, myId); @@ -1035,12 +1027,12 @@ public class DbHelper { }); } - @Nullable public Long getFirstMsgID(String fromId, String myId) { - final Cursor query = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + - " WHERE (" + MessagesTable.Column.FROM + " = '" + fromId + "' AND " + - MessagesTable.Column.TO + " = '" + myId + "')" + - " OR (" + MessagesTable.Column.FROM + " = '" + myId + "' AND " + - MessagesTable.Column.TO + " = '" + fromId + "')" + + @Nullable public Long getFirstPrivateMsgID(String fromId, String myId) { + final Cursor query = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.FEED_TYPE + " = " + P2pTable.feedType + " AND ( " + + MessagesTable.Column.FROM + " = '" + fromId + "' AND " + MessagesTable.Column.TO + " = '" + myId + "')" + + " OR (" + + MessagesTable.Column.FROM + " = '" + myId + "' AND " + MessagesTable.Column.TO + " = '" + fromId + "')" + " ORDER BY " + MessagesTable.Column._ID + " ASC LIMIT 1"); if (query == null) return null; @@ -1056,9 +1048,9 @@ public class DbHelper { @Nullable public Observable getLastGroupMsgID(String chatId) { QueryObservable query = mDb.createQuery(MessagesTable.TABLE_NAME, - "SELECT * FROM " + MessagesTable.TABLE_NAME + - " WHERE " + MessagesTable.Column.FEED_ID + " = (SELECT " + - MessagesTable.Column._ID + " FROM " + MucTable.TABLE_NAME + " WHERE " + MucTable.Column.NAME + " = '" + chatId + "')" + + "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.FEED_TYPE + " = " + MucTable.feedType + " AND " + + MessagesTable.Column.TO + " = '" + chatId + "'" + " ORDER BY " + MessagesTable.Column._ID + " DESC LIMIT 1"); return query.mapToOne(cursor -> { @@ -1071,11 +1063,11 @@ public class DbHelper { @Nullable public Observable getLastPrivateMsgID(String fromId, String myId) { QueryObservable query = mDb.createQuery(MessagesTable.TABLE_NAME, - "SELECT * FROM " + MessagesTable.TABLE_NAME + - " WHERE (" + MessagesTable.Column.FROM + " = '" + fromId + "' AND " + - MessagesTable.Column.TO + " = '" + myId + "')" + - " OR (" + MessagesTable.Column.FROM + " = '" + myId + "' AND " + - MessagesTable.Column.TO + " = '" + fromId + "')" + + "SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.FEED_TYPE + " = " + P2pTable.feedType + " AND (" + + MessagesTable.Column.FROM + " = '" + fromId + "' AND " + MessagesTable.Column.TO + " = '" + myId + "')" + + " OR (" + + MessagesTable.Column.FROM + " = '" + myId + "' AND " + MessagesTable.Column.TO + " = '" + fromId + "')" + " ORDER BY " + MessagesTable.Column._ID + " DESC LIMIT 1"); return query.mapToOne(cursor -> { @@ -1099,9 +1091,10 @@ public class DbHelper { } private Message getLastMessage(Room room) { - Cursor query = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + - " WHERE " + MessagesTable.Column.TO + " = '" + room.id + - "' ORDER BY " + MessagesTable.Column.CREATED + " desc limit 1"); + Cursor query = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + " WHERE " + + MessagesTable.Column.TO + " = '" + room.id + + "' ORDER BY " + MessagesTable.Column.CREATED + + " DESC LIMIT 1"); if (query == null) return null; if (query.getCount() == 0) { query.close(); @@ -1116,7 +1109,7 @@ public class DbHelper { } public void saveMember(Member member) { - String whereArgs = MemberTable.Column._ID + "= " + member.id; + String whereArgs = MemberTable.Column._ID + " = " + member.id; if (member.status != null) { if (Contact.Statuses.INTERNAL.equals(member.status)) { whereArgs = MemberTable.Column.PHONE_ID + " = '" + member.phone_id + "'"; @@ -1157,22 +1150,4 @@ public class DbHelper { } } - public Single> getGroupChatHistory(String chatId) { - return Single.fromCallable(() -> { - Cursor cursor = mDb.query("SELECT * FROM " + MessagesTable.TABLE_NAME + - " WHERE " + MessagesTable.Column.FEED_ID + " = (SELECT " + - MessagesTable.Column._ID + " FROM " + MucTable.TABLE_NAME + " WHERE " + MucTable.Column.NAME + " = '" + chatId + "')"); - List list = new ArrayList<>(); - if (cursor != null) { - while (cursor.moveToNext()) { - Message message = MessagesTable.parseCursor(cursor); - message.feed_id = getMessageFeedByType(cursor); - message.files.addAll(getDescByMessageId(message)); - list.add(message); - } - cursor.close(); - } - return list; - }); - } } 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 a40f694d71..8d946ba92b 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 @@ -237,65 +237,43 @@ public class ChatPresenter extends BaseErrorPresenter { } } - public void subscribeOnOldMsgs1() { - addDisposable(mDataManager.getMsgsByGroupChatId(mRoom.id) - .flatMap(messages -> { - Collections.sort(messages, (o1, o2) -> o1.id.compareTo(o2.id)); - return Observable.fromIterable(messages) - .filter(message -> mFirstMsgId != null && message.id < mFirstMsgId) - .doOnNext(ChatPresenter.this::downloadRecord) - .toList() - .toObservable(); - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(messages -> { - mFirstMsgId = messages.get(messages.size() - 1).id; - getViewState().addOldMsgs(messages); - })); - } - public void subscribeOnOldMsgs() { if (mRoom.isGroupChat()) { addDisposable(mDataManager.getMsgsByGroupChatId(mRoom.id) - .flatMap(list -> { - Collections.sort(list, (o1, o2) -> o1.id.compareTo(o2.id)); - Collections.reverse(list); - return Observable.fromIterable(list); + .flatMap(messages -> { + Collections.sort(messages, (o1, o2) -> o1.id.compareTo(o2.id)); + return Observable.fromIterable(messages) + .filter(message -> !isEmptyMsg(message)) + .filter(message -> mFirstMsgId != null && message.id < mFirstMsgId) + .doOnNext(ChatPresenter.this::downloadRecord) + .toList() + .toObservable(); }) - .distinct() - .filter(message -> !isEmptyMsg(message)) - .filter(message -> mFirstMsgId != null && message.id < mFirstMsgId) - .doOnNext(ChatPresenter.this::downloadRecord) + .filter(messages -> !messages.isEmpty()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(message -> { - mFirstMsgId = message.id; - getViewState().addOldMsgs(message); - })); + .subscribe(messages -> { + mFirstMsgId = messages.get(messages.size() - 1).id; + getViewState().addOldMsgs(messages); + }, Timber::e)); } else { addDisposable(mDataManager.getMsgsByPrivateChatId(mRoom.id) -// .doOnNext(messages -> { -// for (int i = 0; i < messages.size(); i++) { -// Message message = messages.get(i); -// ChatPresenter.this.downloadRecord(message); -// } -// }) - .flatMap(list -> { - Collections.sort(list, (o1, o2) -> o1.id.compareTo(o2.id)); - Collections.reverse(list); - return Observable.fromIterable(list); + .flatMap(messages -> { + Collections.sort(messages, (o1, o2) -> o1.id.compareTo(o2.id)); + return Observable.fromIterable(messages) + .filter(message -> !isEmptyMsg(message)) + .filter(message -> mFirstMsgId != null && message.id < mFirstMsgId) + .doOnNext(ChatPresenter.this::downloadRecord) + .toList() + .toObservable(); }) - .distinct() - .filter(message -> !isEmptyMsg(message)) - .filter(message -> mFirstMsgId != null && message.id < mFirstMsgId) - .doOnNext(ChatPresenter.this::downloadRecord) + .filter(messages -> !messages.isEmpty()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(message -> { - mFirstMsgId = message.id; - getViewState().addOldMsgs(message); - })); + .subscribe(messages -> { + mFirstMsgId = messages.get(messages.size() - 1).id; + getViewState().addOldMsgs(messages); + }, Timber::e)); } } -- GitLab From 3fcd8a81785c85a7fccae78b2f16735da759f132 Mon Sep 17 00:00:00 2001 From: Stas Safyanov Date: Thu, 2 Nov 2017 16:49:38 +0200 Subject: [PATCH 3/4] added local unique key for messagestable --- .../mobile/communicator/data/db/tables/MessagesTable.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 e0f60f0ae0..032b9c1c1e 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 @@ -32,8 +32,7 @@ public class MessagesTable extends Table { + Column.FEED_TYPE + INTEGER + COMMA + Column.PREV + INTEGER + COMMA + Column.NEXT + INTEGER + COMMA - + Column.MESSAGE_ID + VARCHAR(40) + COMMA -// + Column.MESSAGE_ID + INTEGER + NOT_NULL + PRIMARY_KEY + AUTOINCREMENT + COMMA + + Column.MESSAGE_ID + INTEGER + PRIMARY_KEY + AUTOINCREMENT + COMMA + Column.FROM + VARCHAR(40) + COMMA + Column.TO + VARCHAR(40) + COMMA + Column.CREATED + INTEGER + COMMA @@ -90,7 +89,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.msg_id = cursor.getString(cursor.getColumnIndexOrThrow(Column.MESSAGE_ID)); + message.msg_id = String.valueOf(cursor.getLong(cursor.getColumnIndexOrThrow(Column.MESSAGE_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)); -- GitLab From d379218a4708b42f82cfd4234d903e92a01e2a06 Mon Sep 17 00:00:00 2001 From: Stas Safyanov Date: Thu, 2 Nov 2017 18:00:17 +0200 Subject: [PATCH 4/4] added gradient --- ...nt_small.xml => gradient_bottom_small.xml} | 0 .../main/res/drawable/gradient_top_small.xml | 8 +++++ .../main/res/layout/activity_image_viewer.xml | 2 +- .../main/res/layout/fragment_choose_user.xml | 6 +--- .../main/res/layout/fragment_my_profile.xml | 17 ++++++++--- .../main/res/layout/fragment_room_list.xml | 29 ++++++++++++------- .../main/res/layout/partial_chat_header.xml | 10 ++++--- app/src/main/res/layout/v_bottom_gradient.xml | 8 +++++ app/src/main/res/layout/v_top_gradient.xml | 8 +++++ 9 files changed, 63 insertions(+), 25 deletions(-) rename app/src/main/res/drawable/{gradient_small.xml => gradient_bottom_small.xml} (100%) create mode 100644 app/src/main/res/drawable/gradient_top_small.xml create mode 100644 app/src/main/res/layout/v_bottom_gradient.xml create mode 100644 app/src/main/res/layout/v_top_gradient.xml diff --git a/app/src/main/res/drawable/gradient_small.xml b/app/src/main/res/drawable/gradient_bottom_small.xml similarity index 100% rename from app/src/main/res/drawable/gradient_small.xml rename to app/src/main/res/drawable/gradient_bottom_small.xml diff --git a/app/src/main/res/drawable/gradient_top_small.xml b/app/src/main/res/drawable/gradient_top_small.xml new file mode 100644 index 0000000000..1f1e07ae9b --- /dev/null +++ b/app/src/main/res/drawable/gradient_top_small.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_image_viewer.xml b/app/src/main/res/layout/activity_image_viewer.xml index 80106fcd4e..9d80f32e0b 100644 --- a/app/src/main/res/layout/activity_image_viewer.xml +++ b/app/src/main/res/layout/activity_image_viewer.xml @@ -16,7 +16,7 @@ android:layout_width="match_parent" android:layout_height="100dp" android:layout_gravity="bottom" - android:background="@drawable/gradient_small" /> + android:background="@drawable/gradient_bottom_small" /> - + - + android:layout_height="match_parent"> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_room_list.xml b/app/src/main/res/layout/fragment_room_list.xml index a5b5532898..9ca16bf846 100644 --- a/app/src/main/res/layout/fragment_room_list.xml +++ b/app/src/main/res/layout/fragment_room_list.xml @@ -1,21 +1,28 @@ - - + android:layout_height="wrap_content" + android:layout_margin="16dp" + android:src="@drawable/logo"/> - + android:layout_height="match_parent"> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/partial_chat_header.xml b/app/src/main/res/layout/partial_chat_header.xml index 8637faf303..e9f3631e8c 100644 --- a/app/src/main/res/layout/partial_chat_header.xml +++ b/app/src/main/res/layout/partial_chat_header.xml @@ -1,8 +1,10 @@ - + tools:src="@drawable/contact_placeholder"/> + tools:text="Rose willis"/> + tools:text="online"/> diff --git a/app/src/main/res/layout/v_bottom_gradient.xml b/app/src/main/res/layout/v_bottom_gradient.xml new file mode 100644 index 0000000000..bd355dc704 --- /dev/null +++ b/app/src/main/res/layout/v_bottom_gradient.xml @@ -0,0 +1,8 @@ + + + diff --git a/app/src/main/res/layout/v_top_gradient.xml b/app/src/main/res/layout/v_top_gradient.xml new file mode 100644 index 0000000000..36873995ef --- /dev/null +++ b/app/src/main/res/layout/v_top_gradient.xml @@ -0,0 +1,8 @@ + + + -- GitLab