mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-23 02:10:44 +01:00
Implement proper story viewer ordering.
This commit is contained in:
committed by
Cody Henthorne
parent
157198fd17
commit
469879c211
@@ -22,6 +22,7 @@ import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
||||
import org.thoughtcrime.securesms.database.model.MessageId;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.StoryResult;
|
||||
import org.thoughtcrime.securesms.database.model.StoryViewState;
|
||||
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
|
||||
import org.thoughtcrime.securesms.insights.InsightsConstants;
|
||||
@@ -185,8 +186,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||
public abstract boolean isStory(long messageId);
|
||||
public abstract @NonNull Reader getOutgoingStoriesTo(@NonNull RecipientId recipientId);
|
||||
public abstract @NonNull Reader getAllOutgoingStories(boolean reverse);
|
||||
public abstract @NonNull Reader getAllStories();
|
||||
public abstract @NonNull List<RecipientId> getAllStoriesRecipientsList();
|
||||
public abstract @NonNull List<StoryResult> getOrderedStoryRecipientsAndIds();
|
||||
public abstract @NonNull Reader getAllStoriesFor(@NonNull RecipientId recipientId);
|
||||
public abstract @NonNull MessageId getStoryId(@NonNull RecipientId authorId, long sentTimestamp) throws NoSuchMessageException;
|
||||
public abstract int getNumberOfStoryReplies(long parentStoryId);
|
||||
|
||||
@@ -57,6 +57,7 @@ import org.thoughtcrime.securesms.database.model.NotificationMmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.ParentStoryId;
|
||||
import org.thoughtcrime.securesms.database.model.Quote;
|
||||
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.StoryResult;
|
||||
import org.thoughtcrime.securesms.database.model.StoryType;
|
||||
import org.thoughtcrime.securesms.database.model.StoryViewState;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
|
||||
@@ -424,6 +425,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(VIEWED_RECEIPT_COUNT, 1);
|
||||
contentValues.put(RECEIPT_TIMESTAMP, System.currentTimeMillis());
|
||||
|
||||
database.update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(CursorUtil.requireLong(cursor, ID)));
|
||||
}
|
||||
@@ -577,11 +579,6 @@ public class MmsDatabase extends MessageDatabase {
|
||||
return new Reader(rawQuery(where, null, reverse, -1L));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllStories() {
|
||||
return new Reader(rawQuery(IS_STORY_CLAUSE, null, false, -1L));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllStoriesFor(@NonNull RecipientId recipientId) {
|
||||
long threadId = SignalDatabase.threads().getThreadIdIfExistsFor(recipientId);
|
||||
@@ -653,25 +650,39 @@ public class MmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull List<RecipientId> getAllStoriesRecipientsList() {
|
||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||
String query = "SELECT " +
|
||||
"DISTINCT " + ThreadDatabase.RECIPIENT_ID + " " +
|
||||
"FROM " + TABLE_NAME + " JOIN " + ThreadDatabase.TABLE_NAME + " " +
|
||||
"ON " + TABLE_NAME + "." + THREAD_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.ID + " " +
|
||||
"WHERE " + IS_STORY_CLAUSE + " " +
|
||||
"ORDER BY " + TABLE_NAME + "." + DATE_SENT + " DESC, " + TABLE_NAME + "." + VIEWED_RECEIPT_COUNT + " ASC";
|
||||
List<RecipientId> recipientIds;
|
||||
public @NonNull List<StoryResult> getOrderedStoryRecipientsAndIds() {
|
||||
SQLiteDatabase db = getReadableDatabase();
|
||||
String query = "SELECT\n"
|
||||
+ " mms.date AS sent_timestamp,\n"
|
||||
+ " mms._id AS mms_id,\n"
|
||||
+ " thread_recipient_id,\n"
|
||||
+ " (" + getOutgoingTypeClause() + ") AS is_outgoing,\n"
|
||||
+ " viewed_receipt_count,\n"
|
||||
+ " mms.date,\n"
|
||||
+ " receipt_timestamp,\n"
|
||||
+ " (" + getOutgoingTypeClause() + ") = 0 AND viewed_receipt_count = 0 AS is_unread\n"
|
||||
+ "FROM mms\n"
|
||||
+ "JOIN thread\n"
|
||||
+ "ON mms.thread_id = thread._id\n"
|
||||
+ "WHERE is_story > 0 AND remote_deleted = 0\n"
|
||||
+ "ORDER BY\n"
|
||||
+ "is_unread DESC,\n"
|
||||
+ "CASE WHEN is_outgoing = 0 AND viewed_receipt_count = 0 THEN mms.date END DESC,\n"
|
||||
+ "CASE WHEN is_outgoing = 0 AND viewed_receipt_count > 0 THEN receipt_timestamp END DESC,\n"
|
||||
+ "CASE WHEN is_outgoing = 1 THEN mms.date END DESC";
|
||||
|
||||
List<StoryResult> results;
|
||||
try (Cursor cursor = db.rawQuery(query, null)) {
|
||||
if (cursor != null) {
|
||||
recipientIds = new ArrayList<>(cursor.getCount());
|
||||
results = new ArrayList<>(cursor.getCount());
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
recipientIds.add(RecipientId.from(CursorUtil.requireLong(cursor, ThreadDatabase.RECIPIENT_ID)));
|
||||
results.add(new StoryResult(RecipientId.from(CursorUtil.requireLong(cursor, ThreadDatabase.RECIPIENT_ID)),
|
||||
CursorUtil.requireLong(cursor, "mms_id"),
|
||||
CursorUtil.requireLong(cursor, "sent_timestamp")));
|
||||
}
|
||||
|
||||
return recipientIds;
|
||||
return results;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ import org.thoughtcrime.securesms.database.model.GroupCallUpdateDetailsUtil;
|
||||
import org.thoughtcrime.securesms.database.model.MessageId;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.StoryResult;
|
||||
import org.thoughtcrime.securesms.database.model.StoryViewState;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.GroupCallUpdateDetails;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails;
|
||||
@@ -1405,12 +1406,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllStories() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull List<RecipientId> getAllStoriesRecipientsList() {
|
||||
public @NonNull List<StoryResult> getOrderedStoryRecipientsAndIds() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
|
||||
@@ -657,6 +657,15 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||
return notifiedTimestamp;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public long getIncomingStoryViewedAtTimestamp() {
|
||||
if (isOutgoing()) {
|
||||
return -1L;
|
||||
} else {
|
||||
return receiptTimestamp;
|
||||
}
|
||||
}
|
||||
|
||||
public long getReceiptTimestamp() {
|
||||
if (!isOutgoing()) {
|
||||
return getDateSent();
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package org.thoughtcrime.securesms.database.model
|
||||
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||
|
||||
class StoryResult(
|
||||
val recipientId: RecipientId,
|
||||
val messageId: Long,
|
||||
val messageSentTimestamp: Long
|
||||
)
|
||||
Reference in New Issue
Block a user