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 0dad3652f1cfdcbfacf318e81a8eb5586c2804a4..54075dce6fc2f0823d3dda6253fa2509534ac08a 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 520cc68d28e2ce6975374d88537272157c245978..1b9b773b809e5221b00311a954a5dc89131417d5 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/data/db/tables/MessagesTable.java b/app/src/main/java/com/nynja/mobile/communicator/data/db/tables/MessagesTable.java index e0f60f0ae0a6d9aec57a08724bc592b97d82aae6..032b9c1c1e4fc3bb946259bee6ff7c98e6342dd5 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)); 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 9b17fe959a0147300e5d56b6e4c34da6391c6643..8d946ba92b1174d1c68aebf53cb71b1668d1d069 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 @@ -240,44 +240,40 @@ public class ChatPresenter extends BaseErrorPresenter { 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)); } } 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 9e74ead3f0b5b1af009ae9fecaff88d6e7ae18cc..adfbc3daf6623e951d705dfac9001b6b28498cd3 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 0c552ba1e72d4053c52ebfb77d6600f395963bf0..040b46db568ec7280035c4b4ee3b7166f7170550 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 e63bb92956bd48a59ef5d9e9ce403e749d41946c..b2f2099cb97e64510a529a45ecc29a23f6f40c38 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 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 0000000000000000000000000000000000000000..1f1e07ae9be468cd3a5784fa4768d18edb23e11b --- /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 80106fcd4e68f355370f686dca30fcd6922e8612..9d80f32e0bf402c7c2310b312281080ddff3ec86 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 a5b55328980c314ec99da5725a0d6e813cbb78a2..9ca16bf846fc6a5bfceddc5399b4dbadf091054f 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 8637faf30312ed4ad11dc0018f2d395da99fcdb2..e9f3631e8c2a2515747d0e803d7690bf18b6d6ba 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 0000000000000000000000000000000000000000..bd355dc70458d793be7b99c3c96326b5e24a39c3 --- /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 0000000000000000000000000000000000000000..36873995ef2bf9138ddf8058fcaf693b3a17e0bb --- /dev/null +++ b/app/src/main/res/layout/v_top_gradient.xml @@ -0,0 +1,8 @@ + + +