Update how we mark messages as read.

This commit is contained in:
Alex Hart
2020-08-04 14:13:59 -03:00
committed by Greyson Parrelli
parent fdf4ad9543
commit 393e54ce91
9 changed files with 142 additions and 34 deletions

View File

@@ -46,6 +46,7 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn
protected abstract String getTableName();
protected abstract String getTypeField();
protected abstract String getDateSentColumnName();
protected abstract String getDateReceivedColumnName();
public abstract void markExpireStarted(long messageId);
public abstract void markExpireStarted(long messageId, long startTime);
@@ -144,12 +145,16 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn
return String.format(Locale.ENGLISH, "(%s OR %s) AND %s", isSent, isReceived, isSecure);
}
public void setReactionsSeen(long threadId) {
public void setReactionsSeen(long threadId, long sinceTimestamp) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
String whereClause = THREAD_ID + " = ? AND " + REACTIONS_UNREAD + " = ?";
String[] whereArgs = new String[]{String.valueOf(threadId), "1"};
if (sinceTimestamp > -1) {
whereClause += " AND " + getDateReceivedColumnName() + " <= " + sinceTimestamp;
}
values.put(REACTIONS_UNREAD, 0);
values.put(REACTIONS_LAST_SEEN, System.currentTimeMillis());

View File

@@ -248,6 +248,11 @@ public class MmsDatabase extends MessagingDatabase {
return DATE_SENT;
}
@Override
protected String getDateReceivedColumnName() {
return DATE_RECEIVED;
}
@Override
protected String getTypeField() {
return MESSAGE_BOX;
@@ -632,12 +637,14 @@ public class MmsDatabase extends MessagingDatabase {
database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(id)});
}
public List<MarkedMessageInfo> setMessagesRead(long threadId) {
return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)});
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
if (sinceTimestamp == -1) {
return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)});
} else {
return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0 AND " + DATE_RECEIVED + " <= ?", new String[]{String.valueOf(threadId), String.valueOf(sinceTimestamp)});
}
}
public List<MarkedMessageInfo> setEntireThreadRead(long threadId) {
return setMessagesRead(THREAD_ID + " = ?", new String[] {String.valueOf(threadId)});
}

View File

@@ -150,6 +150,11 @@ public class SmsDatabase extends MessagingDatabase {
return DATE_SENT;
}
@Override
protected String getDateReceivedColumnName() {
return DATE_RECEIVED;
}
@Override
protected String getTypeField() {
return TYPE;
@@ -509,8 +514,12 @@ public class SmsDatabase extends MessagingDatabase {
return setMessagesRead(THREAD_ID + " = ?", new String[] {String.valueOf(threadId)});
}
public List<MarkedMessageInfo> setMessagesRead(long threadId) {
return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)});
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
if (sinceTimestamp == -1) {
return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)});
} else {
return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0 AND " + DATE_RECEIVED + " <= ?", new String[] {String.valueOf(threadId),String.valueOf(sinceTimestamp)});
}
}
public List<MarkedMessageInfo> setAllMessagesRead() {

View File

@@ -340,10 +340,18 @@ public class ThreadDatabase extends Database {
}
public List<MarkedMessageInfo> setRead(long threadId, boolean lastSeen) {
return setRead(Collections.singletonList(threadId), lastSeen);
return setReadInternal(Collections.singletonList(threadId), lastSeen, -1);
}
public List<MarkedMessageInfo> setReadSince(long threadId, boolean lastSeen, long sinceTimestamp) {
return setReadInternal(Collections.singletonList(threadId), lastSeen, sinceTimestamp);
}
public List<MarkedMessageInfo> setRead(Collection<Long> threadIds, boolean lastSeen) {
return setReadInternal(threadIds, lastSeen, -1);
}
private List<MarkedMessageInfo> setReadInternal(Collection<Long> threadIds, boolean lastSeen, long sinceTimestamp) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
List<MarkedMessageInfo> smsRecords = new LinkedList<>();
@@ -354,20 +362,23 @@ public class ThreadDatabase extends Database {
try {
ContentValues contentValues = new ContentValues(2);
contentValues.put(READ, ReadStatus.READ.serialize());
contentValues.put(UNREAD_COUNT, 0);
if (lastSeen) {
contentValues.put(LAST_SEEN, System.currentTimeMillis());
contentValues.put(LAST_SEEN, sinceTimestamp == -1 ? System.currentTimeMillis() : sinceTimestamp);
}
for (long threadId : threadIds) {
smsRecords.addAll(DatabaseFactory.getSmsDatabase(context).setMessagesReadSince(threadId, sinceTimestamp));
mmsRecords.addAll(DatabaseFactory.getMmsDatabase(context).setMessagesReadSince(threadId, sinceTimestamp));
DatabaseFactory.getSmsDatabase(context).setReactionsSeen(threadId, sinceTimestamp);
DatabaseFactory.getMmsDatabase(context).setReactionsSeen(threadId, sinceTimestamp);
int unreadCount = DatabaseFactory.getMmsSmsDatabase(context).getUnreadCount(threadId);
contentValues.put(UNREAD_COUNT, unreadCount);
db.update(TABLE_NAME, contentValues, ID_WHERE, new String[]{threadId + ""});
smsRecords.addAll(DatabaseFactory.getSmsDatabase(context).setMessagesRead(threadId));
mmsRecords.addAll(DatabaseFactory.getMmsDatabase(context).setMessagesRead(threadId));
DatabaseFactory.getSmsDatabase(context).setReactionsSeen(threadId);
DatabaseFactory.getMmsDatabase(context).setReactionsSeen(threadId);
}
db.setTransactionSuccessful();