Improve thread update performance by removing need for message count.

fork-5.53.8
Cody Henthorne 2021-08-03 10:28:08 -04:00 zatwierdzone przez Alex Hart
rodzic c78e283084
commit 6eae2d39a8
10 zmienionych plików z 66 dodań i 117 usunięć

Wyświetl plik

@ -1,11 +1,8 @@
package org.thoughtcrime.securesms.conversationlist; package org.thoughtcrime.securesms.conversationlist;
import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -30,7 +27,6 @@ public class ConversationListItemAction extends FrameLayout implements BindableC
super(context, attrs); super(context, attrs);
} }
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public ConversationListItemAction(Context context, AttributeSet attrs, int defStyleAttr) { public ConversationListItemAction(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
} }
@ -49,7 +45,7 @@ public class ConversationListItemAction extends FrameLayout implements BindableC
@NonNull Set<Long> selectedThreads, @NonNull Set<Long> selectedThreads,
boolean batchMode) boolean batchMode)
{ {
this.description.setText(getContext().getString(R.string.ConversationListItemAction_archived_conversations_d, thread.getCount())); this.description.setText(getContext().getString(R.string.ConversationListItemAction_archived_conversations_d, thread.getUnreadCount()));
} }
@Override @Override

Wyświetl plik

@ -47,7 +47,7 @@ public class ConversationReader extends ThreadDatabase.StaticReader {
.setBody(type.toString()) .setBody(type.toString())
.setDate(100) .setDate(100)
.setRecipient(Recipient.UNKNOWN) .setRecipient(Recipient.UNKNOWN)
.setCount(count) .setUnreadCount(count)
.build(); .build();
} }
} }

Wyświetl plik

@ -80,7 +80,6 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract long getThreadIdForMessage(long id); public abstract long getThreadIdForMessage(long id);
public abstract int getMessageCountForThread(long threadId); public abstract int getMessageCountForThread(long threadId);
public abstract int getMessageCountForThread(long threadId, long beforeTime); public abstract int getMessageCountForThread(long threadId, long beforeTime);
abstract int getMessageCountForThreadSummary(long threadId);
public abstract boolean hasMeaningfulMessage(long threadId); public abstract boolean hasMeaningfulMessage(long threadId);
public abstract Optional<MmsNotificationInfo> getNotification(long messageId); public abstract Optional<MmsNotificationInfo> getNotification(long messageId);
@ -173,7 +172,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract boolean deleteMessage(long messageId); public abstract boolean deleteMessage(long messageId);
abstract void deleteThread(long threadId); abstract void deleteThread(long threadId);
abstract void deleteMessagesInThreadBeforeDate(long threadId, long date); abstract boolean deleteMessagesInThreadBeforeDate(long threadId, long date);
abstract void deleteThreads(@NonNull Set<Long> threadIds); abstract void deleteThreads(@NonNull Set<Long> threadIds);
abstract void deleteAllThreads(); abstract void deleteAllThreads();
abstract void deleteAbandonedMessages(); abstract void deleteAbandonedMessages();

Wyświetl plik

@ -260,11 +260,6 @@ public class MmsDatabase extends MessageDatabase {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
int getMessageCountForThreadSummary(long threadId) {
return getMessageCountForThread(threadId);
}
@Override @Override
public Cursor getExpirationStartedMessages() { public Cursor getExpirationStartedMessages() {
String where = EXPIRE_STARTED + " > 0"; String where = EXPIRE_STARTED + " > 0";
@ -602,11 +597,7 @@ public class MmsDatabase extends MessageDatabase {
public boolean hasMeaningfulMessage(long threadId) { public boolean hasMeaningfulMessage(long threadId) {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String[] cols = new String[] { "1" }; try (Cursor cursor = db.query(TABLE_NAME, new String[] { "1" }, THREAD_ID_WHERE, SqlUtil.buildArgs(threadId), null, null, null, "1")) {
String query = THREAD_ID + " = ?";
String[] args = SqlUtil.buildArgs(threadId);
try (Cursor cursor = db.query(TABLE_NAME, cols, query, args, null, null, null, "1")) {
return cursor != null && cursor.moveToFirst(); return cursor != null && cursor.moveToFirst();
} }
} }
@ -1105,6 +1096,7 @@ public class MmsDatabase extends MessageDatabase {
try (Cursor cursor = database.query(ThreadDatabase.TABLE_NAME, new String[] { ThreadDatabase.ID }, ThreadDatabase.EXPIRES_IN + " > 0", null, null, null, null)) { try (Cursor cursor = database.query(ThreadDatabase.TABLE_NAME, new String[] { ThreadDatabase.ID }, ThreadDatabase.EXPIRES_IN + " > 0", null, null, null, null)) {
while (cursor != null && cursor.moveToNext()) { while (cursor != null && cursor.moveToNext()) {
DatabaseFactory.getThreadDatabase(context).setLastScrolled(cursor.getLong(0), 0);
DatabaseFactory.getThreadDatabase(context).update(cursor.getLong(0), false); DatabaseFactory.getThreadDatabase(context).update(cursor.getLong(0), false);
} }
} }
@ -1640,6 +1632,7 @@ public class MmsDatabase extends MessageDatabase {
} }
notifyConversationListeners(contentValues.getAsLong(THREAD_ID)); notifyConversationListeners(contentValues.getAsLong(THREAD_ID));
DatabaseFactory.getThreadDatabase(context).setLastScrolled(contentValues.getAsLong(THREAD_ID), 0);
DatabaseFactory.getThreadDatabase(context).update(contentValues.getAsLong(THREAD_ID), true); DatabaseFactory.getThreadDatabase(context).update(contentValues.getAsLong(THREAD_ID), true);
} }
} }
@ -1661,6 +1654,7 @@ public class MmsDatabase extends MessageDatabase {
SQLiteDatabase database = databaseHelper.getWritableDatabase(); SQLiteDatabase database = databaseHelper.getWritableDatabase();
database.delete(TABLE_NAME, ID_WHERE, new String[] {messageId+""}); database.delete(TABLE_NAME, ID_WHERE, new String[] {messageId+""});
DatabaseFactory.getThreadDatabase(context).setLastScrolled(threadId, 0);
boolean threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId, false); boolean threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId, false);
notifyConversationListeners(threadId); notifyConversationListeners(threadId);
notifyStickerListeners(); notifyStickerListeners();
@ -1788,11 +1782,11 @@ public class MmsDatabase extends MessageDatabase {
} }
@Override @Override
void deleteMessagesInThreadBeforeDate(long threadId, long date) { boolean deleteMessagesInThreadBeforeDate(long threadId, long date) {
SQLiteDatabase db = databaseHelper.getWritableDatabase(); SQLiteDatabase db = databaseHelper.getWritableDatabase();
String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < " + date; String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < " + date;
db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId)); return db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId)) > 0;
} }
@Override @Override

Wyświetl plik

@ -299,13 +299,6 @@ public class MmsSmsDatabase extends Database {
DatabaseFactory.getMmsDatabase(context).getMessageCountForThread(threadId, beforeTime); DatabaseFactory.getMmsDatabase(context).getMessageCountForThread(threadId, beforeTime);
} }
public int getConversationCountForThreadSummary(long threadId) {
int count = DatabaseFactory.getSmsDatabase(context).getMessageCountForThreadSummary(threadId);
count += DatabaseFactory.getMmsDatabase(context).getMessageCountForThreadSummary(threadId);
return count;
}
public int getInsecureSentCount(long threadId) { public int getInsecureSentCount(long threadId) {
int count = DatabaseFactory.getSmsDatabase(context).getInsecureMessagesSentForThread(threadId); int count = DatabaseFactory.getSmsDatabase(context).getInsecureMessagesSentForThread(threadId);
count += DatabaseFactory.getMmsDatabase(context).getInsecureMessagesSentForThread(threadId); count += DatabaseFactory.getMmsDatabase(context).getInsecureMessagesSentForThread(threadId);
@ -565,10 +558,11 @@ public class MmsSmsDatabase extends Database {
DatabaseFactory.getMmsDatabase(context).setNotifiedTimestamp(timestamp, mmsIds); DatabaseFactory.getMmsDatabase(context).setNotifiedTimestamp(timestamp, mmsIds);
} }
public void deleteMessagesInThreadBeforeDate(long threadId, long trimBeforeDate) { public boolean deleteMessagesInThreadBeforeDate(long threadId, long trimBeforeDate) {
Log.d(TAG, "deleteMessagesInThreadBeforeData(" + threadId + ", " + trimBeforeDate + ")"); Log.d(TAG, "deleteMessagesInThreadBeforeData(" + threadId + ", " + trimBeforeDate + ")");
DatabaseFactory.getSmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate); boolean deletedSms = DatabaseFactory.getSmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
DatabaseFactory.getMmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate); boolean deletedMms = DatabaseFactory.getMmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
return deletedSms || deletedMms;
} }
public void deleteAbandonedMessages() { public void deleteAbandonedMessages() {

Wyświetl plik

@ -2990,6 +2990,7 @@ public class RecipientDatabase extends Database {
db.update(MentionDatabase.TABLE_NAME, mentionThreadValues, MentionDatabase.THREAD_ID + " = ?", SqlUtil.buildArgs(threadMerge.previousThreadId)); db.update(MentionDatabase.TABLE_NAME, mentionThreadValues, MentionDatabase.THREAD_ID + " = ?", SqlUtil.buildArgs(threadMerge.previousThreadId));
} }
DatabaseFactory.getThreadDatabase(context).setLastScrolled(threadMerge.threadId, 0);
DatabaseFactory.getThreadDatabase(context).update(threadMerge.threadId, false, false); DatabaseFactory.getThreadDatabase(context).update(threadMerge.threadId, false, false);
return byUuid; return byUuid;

Wyświetl plik

@ -147,8 +147,7 @@ public class SmsDatabase extends MessageDatabase {
REMOTE_DELETED, NOTIFIED_TIMESTAMP REMOTE_DELETED, NOTIFIED_TIMESTAMP
}; };
private static final long IGNORABLE_TYPESMASK_WHEN_COUNTING = Types.END_SESSION_BIT | Types.KEY_EXCHANGE_IDENTITY_UPDATE_BIT | Types.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; private static final long IGNORABLE_TYPESMASK_WHEN_COUNTING = Types.END_SESSION_BIT | Types.KEY_EXCHANGE_IDENTITY_UPDATE_BIT | Types.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT;
private static final String[] THREAD_SUMMARY_COUNT_PROJECTION = new String[] { "SUM(1)", "SUM(CASE WHEN " + TYPE + " & " + IGNORABLE_TYPESMASK_WHEN_COUNTING + " OR " + TYPE + " = " + Types.PROFILE_CHANGE_TYPE + " THEN 1 ELSE 0 END)" };
private static final EarlyReceiptCache earlyDeliveryReceiptCache = new EarlyReceiptCache("SmsDelivery"); private static final EarlyReceiptCache earlyDeliveryReceiptCache = new EarlyReceiptCache("SmsDelivery");
@ -218,22 +217,6 @@ public class SmsDatabase extends MessageDatabase {
return -1; return -1;
} }
@Override
int getMessageCountForThreadSummary(long threadId) {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
try (Cursor cursor = db.query(TABLE_NAME, THREAD_SUMMARY_COUNT_PROJECTION, THREAD_ID_WHERE, SqlUtil.buildArgs(threadId), null, null, null)) {
if (cursor.moveToFirst()) {
int allMessagesCount = cursor.getInt(0);
int ignorableMessagesCount = cursor.getInt(1);
return allMessagesCount == ignorableMessagesCount ? 0 : allMessagesCount;
}
}
return 0;
}
@Override @Override
public int getMessageCountForThread(long threadId) { public int getMessageCountForThread(long threadId) {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
@ -1237,6 +1220,7 @@ public class SmsDatabase extends MessageDatabase {
} }
if (!message.isIdentityVerified() && !message.isIdentityDefault()) { if (!message.isIdentityVerified() && !message.isIdentityDefault()) {
DatabaseFactory.getThreadDatabase(context).setLastScrolled(threadId, 0);
DatabaseFactory.getThreadDatabase(context).updateSilently(threadId, true); DatabaseFactory.getThreadDatabase(context).updateSilently(threadId, true);
DatabaseFactory.getThreadDatabase(context).setLastSeenSilently(threadId); DatabaseFactory.getThreadDatabase(context).setLastSeenSilently(threadId);
} }
@ -1301,6 +1285,7 @@ public class SmsDatabase extends MessageDatabase {
db.delete(TABLE_NAME, ID_WHERE, new String[] { messageId + "" }); db.delete(TABLE_NAME, ID_WHERE, new String[] { messageId + "" });
DatabaseFactory.getThreadDatabase(context).setLastScrolled(threadId, 0);
threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId, false, true); threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId, false, true);
db.setTransactionSuccessful(); db.setTransactionSuccessful();
@ -1350,11 +1335,11 @@ public class SmsDatabase extends MessageDatabase {
} }
@Override @Override
void deleteMessagesInThreadBeforeDate(long threadId, long date) { boolean deleteMessagesInThreadBeforeDate(long threadId, long date) {
SQLiteDatabase db = databaseHelper.getWritableDatabase(); SQLiteDatabase db = databaseHelper.getWritableDatabase();
String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < " + date; String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < " + date;
db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId)); return db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId)) > 0;
} }
@Override @Override

Wyświetl plik

@ -195,6 +195,7 @@ public class SmsMigrator {
ourSmsDatabase.endTransaction(transaction); ourSmsDatabase.endTransaction(transaction);
DatabaseFactory.getThreadDatabase(context).update(ourThreadId, true); DatabaseFactory.getThreadDatabase(context).update(ourThreadId, true);
DatabaseFactory.getThreadDatabase(context).setLastScrolled(ourThreadId, 0);
DatabaseFactory.getThreadDatabase(context).notifyConversationListeners(ourThreadId); DatabaseFactory.getThreadDatabase(context).notifyConversationListeners(ourThreadId);
} finally { } finally {

Wyświetl plik

@ -88,7 +88,7 @@ public class ThreadDatabase extends Database {
public static final String TABLE_NAME = "thread"; public static final String TABLE_NAME = "thread";
public static final String ID = "_id"; public static final String ID = "_id";
public static final String DATE = "date"; public static final String DATE = "date";
public static final String MESSAGE_COUNT = "message_count"; public static final String MEANINGFUL_MESSAGES = "message_count";
public static final String RECIPIENT_ID = "thread_recipient_id"; public static final String RECIPIENT_ID = "thread_recipient_id";
public static final String SNIPPET = "snippet"; public static final String SNIPPET = "snippet";
private static final String SNIPPET_CHARSET = "snippet_charset"; private static final String SNIPPET_CHARSET = "snippet_charset";
@ -112,7 +112,7 @@ public class ThreadDatabase extends Database {
public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
DATE + " INTEGER DEFAULT 0, " + DATE + " INTEGER DEFAULT 0, " +
MESSAGE_COUNT + " INTEGER DEFAULT 0, " + MEANINGFUL_MESSAGES + " INTEGER DEFAULT 0, " +
RECIPIENT_ID + " INTEGER, " + RECIPIENT_ID + " INTEGER, " +
SNIPPET + " TEXT, " + SNIPPET + " TEXT, " +
SNIPPET_CHARSET + " INTEGER DEFAULT 0, " + SNIPPET_CHARSET + " INTEGER DEFAULT 0, " +
@ -136,12 +136,12 @@ public class ThreadDatabase extends Database {
public static final String[] CREATE_INDEXS = { public static final String[] CREATE_INDEXS = {
"CREATE INDEX IF NOT EXISTS thread_recipient_id_index ON " + TABLE_NAME + " (" + RECIPIENT_ID + ");", "CREATE INDEX IF NOT EXISTS thread_recipient_id_index ON " + TABLE_NAME + " (" + RECIPIENT_ID + ");",
"CREATE INDEX IF NOT EXISTS archived_count_index ON " + TABLE_NAME + " (" + ARCHIVED + ", " + MESSAGE_COUNT + ");", "CREATE INDEX IF NOT EXISTS archived_count_index ON " + TABLE_NAME + " (" + ARCHIVED + ", " + MEANINGFUL_MESSAGES + ");",
"CREATE INDEX IF NOT EXISTS thread_pinned_index ON " + TABLE_NAME + " (" + PINNED + ");", "CREATE INDEX IF NOT EXISTS thread_pinned_index ON " + TABLE_NAME + " (" + PINNED + ");",
}; };
private static final String[] THREAD_PROJECTION = { private static final String[] THREAD_PROJECTION = {
ID, DATE, MESSAGE_COUNT, RECIPIENT_ID, SNIPPET, SNIPPET_CHARSET, READ, UNREAD_COUNT, TYPE, ERROR, SNIPPET_TYPE, ID, DATE, MEANINGFUL_MESSAGES, RECIPIENT_ID, SNIPPET, SNIPPET_CHARSET, READ, UNREAD_COUNT, TYPE, ERROR, SNIPPET_TYPE,
SNIPPET_URI, SNIPPET_CONTENT_TYPE, SNIPPET_EXTRAS, ARCHIVED, STATUS, DELIVERY_RECEIPT_COUNT, EXPIRES_IN, LAST_SEEN, READ_RECEIPT_COUNT, LAST_SCROLLED, PINNED SNIPPET_URI, SNIPPET_CONTENT_TYPE, SNIPPET_EXTRAS, ARCHIVED, STATUS, DELIVERY_RECEIPT_COUNT, EXPIRES_IN, LAST_SEEN, READ_RECEIPT_COUNT, LAST_SCROLLED, PINNED
}; };
@ -174,7 +174,7 @@ public class ThreadDatabase extends Database {
if (group) if (group)
contentValues.put(TYPE, distributionType); contentValues.put(TYPE, distributionType);
contentValues.put(MESSAGE_COUNT, 0); contentValues.put(MEANINGFUL_MESSAGES, 0);
SQLiteDatabase db = databaseHelper.getWritableDatabase(); SQLiteDatabase db = databaseHelper.getWritableDatabase();
long result = db.insert(TABLE_NAME, null, contentValues); long result = db.insert(TABLE_NAME, null, contentValues);
@ -184,7 +184,7 @@ public class ThreadDatabase extends Database {
return result; return result;
} }
private void updateThread(long threadId, long count, String body, @Nullable Uri attachment, private void updateThread(long threadId, boolean meaningfulMessages, String body, @Nullable Uri attachment,
@Nullable String contentType, @Nullable Extra extra, @Nullable String contentType, @Nullable Extra extra,
long date, int status, int deliveryReceiptCount, long type, boolean unarchive, long date, int status, int deliveryReceiptCount, long type, boolean unarchive,
long expiresIn, int readReceiptCount) long expiresIn, int readReceiptCount)
@ -206,14 +206,13 @@ public class ThreadDatabase extends Database {
contentValues.put(SNIPPET_TYPE, type); contentValues.put(SNIPPET_TYPE, type);
contentValues.put(SNIPPET_CONTENT_TYPE, contentType); contentValues.put(SNIPPET_CONTENT_TYPE, contentType);
contentValues.put(SNIPPET_EXTRAS, extraSerialized); contentValues.put(SNIPPET_EXTRAS, extraSerialized);
contentValues.put(MESSAGE_COUNT, count); contentValues.put(MEANINGFUL_MESSAGES, meaningfulMessages ? 1 : 0);
contentValues.put(STATUS, status); contentValues.put(STATUS, status);
contentValues.put(DELIVERY_RECEIPT_COUNT, deliveryReceiptCount); contentValues.put(DELIVERY_RECEIPT_COUNT, deliveryReceiptCount);
contentValues.put(READ_RECEIPT_COUNT, readReceiptCount); contentValues.put(READ_RECEIPT_COUNT, readReceiptCount);
contentValues.put(EXPIRES_IN, expiresIn); contentValues.put(EXPIRES_IN, expiresIn);
SQLiteDatabase db = databaseHelper.getWritableDatabase(); SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("UPDATE " + TABLE_NAME + " SET " + LAST_SCROLLED + " = CASE WHEN " + MESSAGE_COUNT + " = ? THEN " + LAST_SCROLLED + " ELSE 0 END WHERE " + ID_WHERE, SqlUtil.buildArgs(count, threadId));
db.update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId)); db.update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId));
if (unarchive) { if (unarchive) {
@ -341,10 +340,13 @@ public class ThreadDatabase extends Database {
if (trimBeforeDate != NO_TRIM_BEFORE_DATE_SET) { if (trimBeforeDate != NO_TRIM_BEFORE_DATE_SET) {
Log.i(TAG, "Trimming thread: " + threadId + " before: " + trimBeforeDate); Log.i(TAG, "Trimming thread: " + threadId + " before: " + trimBeforeDate);
DatabaseFactory.getMmsSmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate); boolean deletedMessages = DatabaseFactory.getMmsSmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
update(threadId, false); if (deletedMessages) {
notifyConversationListeners(threadId); setLastScrolled(threadId, 0);
update(threadId, false);
notifyConversationListeners(threadId);
}
} }
} }
@ -478,10 +480,12 @@ public class ThreadDatabase extends Database {
public void incrementUnread(long threadId, int amount) { public void incrementUnread(long threadId, int amount) {
SQLiteDatabase db = databaseHelper.getWritableDatabase(); SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("UPDATE " + TABLE_NAME + " SET " + READ + " = " + ReadStatus.UNREAD.serialize() + ", " + db.execSQL("UPDATE " + TABLE_NAME + " SET " +
UNREAD_COUNT + " = " + UNREAD_COUNT + " + ? WHERE " + ID + " = ?", READ + " = " + ReadStatus.UNREAD.serialize() + ", " +
new String[] {String.valueOf(amount), UNREAD_COUNT + " = " + UNREAD_COUNT + " + ?, " +
String.valueOf(threadId)}); LAST_SCROLLED + " = ? " +
"WHERE " + ID + " = ?",
SqlUtil.buildArgs(amount, 0, threadId));
} }
public void setDistributionType(long threadId, int distributionType) { public void setDistributionType(long threadId, int distributionType) {
@ -543,8 +547,8 @@ public class ThreadDatabase extends Database {
public Cursor getRecentConversationList(int limit, boolean includeInactiveGroups, boolean groupsOnly, boolean hideV1Groups, boolean hideSms) { public Cursor getRecentConversationList(int limit, boolean includeInactiveGroups, boolean groupsOnly, boolean hideV1Groups, boolean hideSms) {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String query = !includeInactiveGroups ? MESSAGE_COUNT + " != 0 AND (" + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " IS NULL OR " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1)" String query = !includeInactiveGroups ? MEANINGFUL_MESSAGES + " != 0 AND (" + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " IS NULL OR " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1)"
: MESSAGE_COUNT + " != 0"; : MEANINGFUL_MESSAGES + " != 0";
if (groupsOnly) { if (groupsOnly) {
query += " AND " + RecipientDatabase.TABLE_NAME + "." + RecipientDatabase.GROUP_ID + " NOT NULL"; query += " AND " + RecipientDatabase.TABLE_NAME + "." + RecipientDatabase.GROUP_ID + " NOT NULL";
@ -568,7 +572,7 @@ public class ThreadDatabase extends Database {
public Cursor getRecentPushConversationList(int limit, boolean includeInactiveGroups) { public Cursor getRecentPushConversationList(int limit, boolean includeInactiveGroups) {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String activeGroupQuery = !includeInactiveGroups ? " AND " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1" : ""; String activeGroupQuery = !includeInactiveGroups ? " AND " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1" : "";
String where = MESSAGE_COUNT + " != 0 AND " + String where = MEANINGFUL_MESSAGES + " != 0 AND " +
"(" + "(" +
RecipientDatabase.REGISTERED + " = " + RecipientDatabase.RegisteredState.REGISTERED.getId() + " OR " + RecipientDatabase.REGISTERED + " = " + RecipientDatabase.RegisteredState.REGISTERED.getId() + " OR " +
"(" + "(" +
@ -584,7 +588,7 @@ public class ThreadDatabase extends Database {
public @NonNull List<ThreadRecord> getRecentV1Groups(int limit) { public @NonNull List<ThreadRecord> getRecentV1Groups(int limit) {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String where = MESSAGE_COUNT + " != 0 AND " + String where = MEANINGFUL_MESSAGES + " != 0 AND " +
"(" + "(" +
GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1 AND " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1 AND " +
GroupDatabase.TABLE_NAME + "." + GroupDatabase.V2_MASTER_KEY + " IS NULL AND " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.V2_MASTER_KEY + " IS NULL AND " +
@ -663,7 +667,7 @@ public class ThreadDatabase extends Database {
public @NonNull Map<RecipientId, Integer> getInboxPositions() { public @NonNull Map<RecipientId, Integer> getInboxPositions() {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String query = createQuery(MESSAGE_COUNT + " != ?", 0); String query = createQuery(MEANINGFUL_MESSAGES + " != ?", 0);
Map<RecipientId, Integer> positions = new HashMap<>(); Map<RecipientId, Integer> positions = new HashMap<>();
@ -690,7 +694,7 @@ public class ThreadDatabase extends Database {
public Cursor getUnarchivedConversationList(boolean pinned, long offset, long limit) { public Cursor getUnarchivedConversationList(boolean pinned, long offset, long limit) {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String pinnedWhere = PINNED + (pinned ? " != 0" : " = 0"); String pinnedWhere = PINNED + (pinned ? " != 0" : " = 0");
String where = ARCHIVED + " = 0 AND " + MESSAGE_COUNT + " != 0 AND " + pinnedWhere; String where = ARCHIVED + " = 0 AND " + MEANINGFUL_MESSAGES + " != 0 AND " + pinnedWhere;
final String query; final String query;
@ -707,7 +711,7 @@ public class ThreadDatabase extends Database {
private Cursor getConversationList(@NonNull String archived, long offset, long limit) { private Cursor getConversationList(@NonNull String archived, long offset, long limit) {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String query = createQuery(ARCHIVED + " = ? AND " + MESSAGE_COUNT + " != 0", offset, limit, false); String query = createQuery(ARCHIVED + " = ? AND " + MEANINGFUL_MESSAGES + " != 0", offset, limit, false);
Cursor cursor = db.rawQuery(query, new String[]{archived}); Cursor cursor = db.rawQuery(query, new String[]{archived});
return cursor; return cursor;
@ -716,7 +720,7 @@ public class ThreadDatabase extends Database {
public int getArchivedConversationListCount() { public int getArchivedConversationListCount() {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String[] columns = new String[] { "COUNT(*)" }; String[] columns = new String[] { "COUNT(*)" };
String query = ARCHIVED + " = ? AND " + MESSAGE_COUNT + " != 0"; String query = ARCHIVED + " = ? AND " + MEANINGFUL_MESSAGES + " != 0";
String[] args = new String[] {"1"}; String[] args = new String[] {"1"};
try (Cursor cursor = db.query(TABLE_NAME, columns, query, args, null, null, null)) { try (Cursor cursor = db.query(TABLE_NAME, columns, query, args, null, null, null)) {
@ -731,7 +735,7 @@ public class ThreadDatabase extends Database {
public int getPinnedConversationListCount() { public int getPinnedConversationListCount() {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String[] columns = new String[] { "COUNT(*)" }; String[] columns = new String[] { "COUNT(*)" };
String query = ARCHIVED + " = 0 AND " + PINNED + " != 0 AND " + MESSAGE_COUNT + " != 0"; String query = ARCHIVED + " = 0 AND " + PINNED + " != 0 AND " + MEANINGFUL_MESSAGES + " != 0";
try (Cursor cursor = db.query(TABLE_NAME, columns, query, null, null, null, null)) { try (Cursor cursor = db.query(TABLE_NAME, columns, query, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
@ -745,7 +749,7 @@ public class ThreadDatabase extends Database {
public int getUnarchivedConversationListCount() { public int getUnarchivedConversationListCount() {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteDatabase db = databaseHelper.getReadableDatabase();
String[] columns = new String[] { "COUNT(*)" }; String[] columns = new String[] { "COUNT(*)" };
String query = ARCHIVED + " = 0 AND " + MESSAGE_COUNT + " != 0"; String query = ARCHIVED + " = 0 AND " + MEANINGFUL_MESSAGES + " != 0";
try (Cursor cursor = db.query(TABLE_NAME, columns, query, null, null, null, null)) { try (Cursor cursor = db.query(TABLE_NAME, columns, query, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
@ -892,7 +896,7 @@ public class ThreadDatabase extends Database {
contentValues.put(LAST_SCROLLED, lastScrolledTimestamp); contentValues.put(LAST_SCROLLED, lastScrolledTimestamp);
db.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(threadId)}); db.update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId));
} }
public ConversationMetadata getConversationMetadata(long threadId) { public ConversationMetadata getConversationMetadata(long threadId) {
@ -909,17 +913,6 @@ public class ThreadDatabase extends Database {
} }
} }
public int getConversationMessageCount(long threadId) {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
try (Cursor cursor = db.query(TABLE_NAME, new String[]{MESSAGE_COUNT}, ID_WHERE, new String[]{String.valueOf(threadId)}, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
return CursorUtil.requireInt(cursor, MESSAGE_COUNT);
}
}
return 0;
}
public void deleteConversation(long threadId) { public void deleteConversation(long threadId) {
SQLiteDatabase db = databaseHelper.getWritableDatabase(); SQLiteDatabase db = databaseHelper.getWritableDatabase();
RecipientId recipientIdForThreadId = getRecipientIdForThreadId(threadId); RecipientId recipientIdForThreadId = getRecipientIdForThreadId(threadId);
@ -1234,24 +1227,21 @@ public class ThreadDatabase extends Database {
private boolean update(long threadId, boolean unarchive, boolean allowDeletion, boolean notifyListeners) { private boolean update(long threadId, boolean unarchive, boolean allowDeletion, boolean notifyListeners) {
MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context); MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context);
long count = mmsSmsDatabase.getConversationCountForThreadSummary(threadId); boolean meaningfulMessages = mmsSmsDatabase.hasMeaningfulMessage(threadId);
if (count == 0) { if (!meaningfulMessages) {
if (allowDeletion) { if (allowDeletion) {
deleteConversation(threadId); deleteConversation(threadId);
} }
return true; return true;
} }
MmsSmsDatabase.Reader reader = null; try (MmsSmsDatabase.Reader reader = MmsSmsDatabase.readerFor(mmsSmsDatabase.getConversationSnippet(threadId))) {
MessageRecord record = reader.getNext();
try { if (record != null) {
reader = mmsSmsDatabase.readerFor(mmsSmsDatabase.getConversationSnippet(threadId));
MessageRecord record;
if (reader != null && (record = reader.getNext()) != null) {
updateThread(threadId, updateThread(threadId,
count, meaningfulMessages,
ThreadBodyUtil.getFormattedBodyFor(context, record), ThreadBodyUtil.getFormattedBodyFor(context, record),
getAttachmentUriFor(record), getAttachmentUriFor(record),
getContentTypeFor(record), getContentTypeFor(record),
@ -1271,9 +1261,6 @@ public class ThreadDatabase extends Database {
deleteConversation(threadId); deleteConversation(threadId);
return true; return true;
} }
} finally {
if (reader != null)
reader.close();
} }
} }
@ -1587,7 +1574,7 @@ public class ThreadDatabase extends Database {
.setLastSeen(cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.LAST_SEEN))) .setLastSeen(cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.LAST_SEEN)))
.setSnippetUri(getSnippetUri(cursor)) .setSnippetUri(getSnippetUri(cursor))
.setContentType(cursor.getString(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_CONTENT_TYPE))) .setContentType(cursor.getString(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_CONTENT_TYPE)))
.setCount(cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.MESSAGE_COUNT))) .setMeaningfulMessages(cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.MEANINGFUL_MESSAGES)) > 0)
.setUnreadCount(cursor.getInt(cursor.getColumnIndexOrThrow(ThreadDatabase.UNREAD_COUNT))) .setUnreadCount(cursor.getInt(cursor.getColumnIndexOrThrow(ThreadDatabase.UNREAD_COUNT)))
.setForcedUnread(cursor.getInt(cursor.getColumnIndexOrThrow(ThreadDatabase.READ)) == ReadStatus.FORCED_UNREAD.serialize()) .setForcedUnread(cursor.getInt(cursor.getColumnIndexOrThrow(ThreadDatabase.READ)) == ReadStatus.FORCED_UNREAD.serialize())
.setPinned(CursorUtil.requireBoolean(cursor, ThreadDatabase.PINNED)) .setPinned(CursorUtil.requireBoolean(cursor, ThreadDatabase.PINNED))

Wyświetl plik

@ -40,7 +40,6 @@ public final class ThreadRecord {
private final long threadId; private final long threadId;
private final String body; private final String body;
private final Recipient recipient; private final Recipient recipient;
private final Recipient sender;
private final long type; private final long type;
private final long date; private final long date;
private final long deliveryStatus; private final long deliveryStatus;
@ -49,7 +48,7 @@ public final class ThreadRecord {
private final Uri snippetUri; private final Uri snippetUri;
private final String contentType; private final String contentType;
private final Extra extra; private final Extra extra;
private final long count; private final boolean meaningfulMessages;
private final int unreadCount; private final int unreadCount;
private final boolean forcedUnread; private final boolean forcedUnread;
private final int distributionType; private final int distributionType;
@ -62,7 +61,6 @@ public final class ThreadRecord {
this.threadId = builder.threadId; this.threadId = builder.threadId;
this.body = builder.body; this.body = builder.body;
this.recipient = builder.recipient; this.recipient = builder.recipient;
this.sender = builder.sender;
this.date = builder.date; this.date = builder.date;
this.type = builder.type; this.type = builder.type;
this.deliveryStatus = builder.deliveryStatus; this.deliveryStatus = builder.deliveryStatus;
@ -71,7 +69,7 @@ public final class ThreadRecord {
this.snippetUri = builder.snippetUri; this.snippetUri = builder.snippetUri;
this.contentType = builder.contentType; this.contentType = builder.contentType;
this.extra = builder.extra; this.extra = builder.extra;
this.count = builder.count; this.meaningfulMessages = builder.meaningfulMessages;
this.unreadCount = builder.unreadCount; this.unreadCount = builder.unreadCount;
this.forcedUnread = builder.forcedUnread; this.forcedUnread = builder.forcedUnread;
this.distributionType = builder.distributionType; this.distributionType = builder.distributionType;
@ -105,8 +103,8 @@ public final class ThreadRecord {
return contentType; return contentType;
} }
public long getCount() { public boolean hasMeaningfulMessages() {
return count; return meaningfulMessages;
} }
public int getUnreadCount() { public int getUnreadCount() {
@ -233,7 +231,7 @@ public final class ThreadRecord {
deliveryStatus == that.deliveryStatus && deliveryStatus == that.deliveryStatus &&
deliveryReceiptCount == that.deliveryReceiptCount && deliveryReceiptCount == that.deliveryReceiptCount &&
readReceiptCount == that.readReceiptCount && readReceiptCount == that.readReceiptCount &&
count == that.count && meaningfulMessages == that.meaningfulMessages &&
unreadCount == that.unreadCount && unreadCount == that.unreadCount &&
forcedUnread == that.forcedUnread && forcedUnread == that.forcedUnread &&
distributionType == that.distributionType && distributionType == that.distributionType &&
@ -261,7 +259,7 @@ public final class ThreadRecord {
snippetUri, snippetUri,
contentType, contentType,
extra, extra,
count, meaningfulMessages,
unreadCount, unreadCount,
forcedUnread, forcedUnread,
distributionType, distributionType,
@ -275,7 +273,6 @@ public final class ThreadRecord {
private long threadId; private long threadId;
private String body; private String body;
private Recipient recipient = Recipient.UNKNOWN; private Recipient recipient = Recipient.UNKNOWN;
private Recipient sender = Recipient.UNKNOWN;
private long type; private long type;
private long date; private long date;
private long deliveryStatus; private long deliveryStatus;
@ -284,7 +281,7 @@ public final class ThreadRecord {
private Uri snippetUri; private Uri snippetUri;
private String contentType; private String contentType;
private Extra extra; private Extra extra;
private long count; private boolean meaningfulMessages;
private int unreadCount; private int unreadCount;
private boolean forcedUnread; private boolean forcedUnread;
private int distributionType; private int distributionType;
@ -307,11 +304,6 @@ public final class ThreadRecord {
return this; return this;
} }
public Builder setSender(@NonNull Recipient sender) {
this.sender = sender;
return this;
}
public Builder setType(long type) { public Builder setType(long type) {
this.type = type; this.type = type;
return this; return this;
@ -357,8 +349,8 @@ public final class ThreadRecord {
return this; return this;
} }
public Builder setCount(long count) { public Builder setMeaningfulMessages(boolean meaningfulMessages) {
this.count = count; this.meaningfulMessages = meaningfulMessages;
return this; return this;
} }