Skip to content

Commit b86c6b7

Browse files
[SES-3575] - Refactor sent status querying (#1122)
1 parent aee29f0 commit b86c6b7

29 files changed

+102
-302
lines changed

app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ import org.thoughtcrime.securesms.AppContext.configureKovenant
7171
import org.thoughtcrime.securesms.components.TypingStatusSender
7272
import org.thoughtcrime.securesms.configs.ConfigUploader
7373
import org.thoughtcrime.securesms.database.EmojiSearchDatabase
74-
import org.thoughtcrime.securesms.database.LastSentTimestampCache
7574
import org.thoughtcrime.securesms.database.LokiAPIDatabase
7675
import org.thoughtcrime.securesms.database.Storage
7776
import org.thoughtcrime.securesms.database.model.EmojiSearchData
@@ -151,7 +150,6 @@ class ApplicationContext : Application(), DefaultLifecycleObserver,
151150
@Inject lateinit var messageDataProvider: MessageDataProvider
152151
@Inject lateinit var textSecurePreferences: TextSecurePreferences
153152
@Inject lateinit var configFactory: ConfigFactory
154-
@Inject lateinit var lastSentTimestampCache: LastSentTimestampCache
155153
@Inject lateinit var versionDataFetcher: VersionDataFetcher
156154
@Inject lateinit var pushRegistrationHandler: PushRegistrationHandler
157155
@Inject lateinit var tokenFetcher: TokenFetcher
@@ -279,7 +277,6 @@ class ApplicationContext : Application(), DefaultLifecycleObserver,
279277
device,
280278
messageDataProvider,
281279
configFactory,
282-
lastSentTimestampCache,
283280
this,
284281
tokenFetcher,
285282
groupManagerV2,

app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ class DatabaseAttachmentProvider(context: Context, helper: Provider<SQLCipherOpe
211211

212212
threadId ?: return
213213
timestamp ?: return
214-
MessagingModuleConfiguration.shared.lastSentTimestampCache.delete(threadId, timestamp)
215214
}
216215

217216
override fun deleteMessages(messageIDs: List<Long>, threadId: Long, isSms: Boolean) {
@@ -226,9 +225,6 @@ class DatabaseAttachmentProvider(context: Context, helper: Provider<SQLCipherOpe
226225
// Perform online delete
227226
DatabaseComponent.get(context).lokiMessageDatabase().deleteMessages(messageIDs)
228227
DatabaseComponent.get(context).lokiMessageDatabase().deleteMessageServerHashes(messageIDs, mms = !isSms)
229-
230-
val threadId = messages.firstOrNull()?.threadId
231-
threadId?.let{ MessagingModuleConfiguration.shared.lastSentTimestampCache.delete(it, messages.map { it.timestamp }) }
232228
}
233229

234230
override fun markMessageAsDeleted(timestamp: Long, author: String, displayedMessage: String) {

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,12 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate,
742742
adapter.isAdmin = it
743743
}
744744
}
745+
746+
lifecycleScope.launch {
747+
viewModel
748+
.lastSeenMessageId
749+
.collectLatest { adapter.lastSentMessageId = it }
750+
}
745751
}
746752

747753
private fun scrollToMostRecentMessageIfWeShould() {

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import org.thoughtcrime.securesms.conversation.v2.messages.ControlMessageView
2828
import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageView
2929
import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageViewDelegate
3030
import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter
31+
import org.thoughtcrime.securesms.database.model.MessageId
3132
import org.thoughtcrime.securesms.database.model.MessageRecord
3233
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
3334

@@ -58,6 +59,14 @@ class ConversationAdapter(
5859
private val contactLoadedCache = SparseBooleanArray(100)
5960
private val lastSeen = AtomicLong(originalLastSeen)
6061

62+
var lastSentMessageId: MessageId? = null
63+
set(value) {
64+
if (field != value) {
65+
field = value
66+
notifyDataSetChanged()
67+
}
68+
}
69+
6170
private val groupId = if(conversation?.isGroupV2Recipient == true)
6271
AccountId(conversation.address.toString())
6372
else null
@@ -133,19 +142,20 @@ class ConversationAdapter(
133142
val contact = contactCache[senderIdHash]
134143

135144
visibleMessageView.bind(
136-
message,
137-
messageBefore,
138-
getMessageAfter(position, cursor),
139-
glide,
140-
searchQuery,
141-
contact,
145+
message = message,
146+
previous = messageBefore,
147+
next = getMessageAfter(position, cursor),
148+
glide = glide,
149+
searchQuery = searchQuery,
150+
contact = contact,
142151
// we pass in the groupId for groupV2 to use for determining the name of the members
143-
groupId,
144-
senderId,
145-
lastSeen.get(),
146-
visibleMessageViewDelegate,
147-
downloadPendingAttachment,
148-
retryFailedAttachments
152+
groupId = groupId,
153+
senderAccountID = senderId,
154+
lastSeen = lastSeen.get(),
155+
lastSentMessageId = lastSentMessageId,
156+
delegate = visibleMessageViewDelegate,
157+
downloadPendingAttachment = downloadPendingAttachment,
158+
retryFailedAttachments = retryFailedAttachments
149159
)
150160

151161
if (!message.isDeleted) {

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationLoader.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.conversation.v2
22

33
import android.content.Context
44
import android.database.Cursor
5-
import org.session.libsession.messaging.MessagingModuleConfiguration
65
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
76
import org.thoughtcrime.securesms.util.AbstractCursorLoader
87

@@ -13,7 +12,6 @@ class ConversationLoader(
1312
) : AbstractCursorLoader(context) {
1413

1514
override fun getCursor(): Cursor {
16-
MessagingModuleConfiguration.shared.lastSentTimestampCache.refresh(threadID)
1715
return DatabaseComponent.get(context).mmsSmsDatabase().getConversation(threadID, reverse)
1816
}
1917
}

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ import java.util.UUID
7777
class ConversationViewModel(
7878
val threadId: Long,
7979
val edKeyPair: KeyPair?,
80-
private val context: Context,
8180
private val application: Application,
8281
private val repository: ConversationRepository,
8382
private val storage: StorageProtocol,
@@ -272,11 +271,14 @@ class ConversationViewModel(
272271
// a call is in progress if it isn't idle nor disconnected and the recipient is the person on the call
273272
if(it !is State.Idle && it !is State.Disconnected && callManager.recipient?.address == recipient?.address){
274273
// call is started, we need to differentiate between in progress vs incoming
275-
if(it is State.Connected) context.getString(R.string.callsInProgress)
276-
else context.getString(R.string.callsIncomingUnknown)
274+
if(it is State.Connected) application.getString(R.string.callsInProgress)
275+
else application.getString(R.string.callsIncomingUnknown)
277276
} else null // null when the call isn't in progress / incoming
278277
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
279278

279+
val lastSeenMessageId: Flow<MessageId?>
280+
get() = repository.getLastSentMessageID(threadId)
281+
280282
init {
281283
viewModelScope.launch(Dispatchers.Default) {
282284
combine(
@@ -1149,7 +1151,6 @@ class ConversationViewModel(
11491151

11501152
override fun <T : ViewModel> create(modelClass: Class<T>): T {
11511153
return ConversationViewModel(
1152-
context = context,
11531154
threadId = threadId,
11541155
edKeyPair = edKeyPair,
11551156
application = application,

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ import org.session.libsignal.utilities.AccountId
4949
import org.session.libsignal.utilities.IdPrefix
5050
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
5151
import org.thoughtcrime.securesms.database.GroupDatabase
52-
import org.thoughtcrime.securesms.database.LastSentTimestampCache
5352
import org.thoughtcrime.securesms.database.LokiAPIDatabase
5453
import org.thoughtcrime.securesms.database.LokiThreadDatabase
5554
import org.thoughtcrime.securesms.database.MmsDatabase
5655
import org.thoughtcrime.securesms.database.MmsSmsDatabase
5756
import org.thoughtcrime.securesms.database.SmsDatabase
5857
import org.thoughtcrime.securesms.database.ThreadDatabase
58+
import org.thoughtcrime.securesms.database.model.MessageId
5959
import org.thoughtcrime.securesms.database.model.MessageRecord
6060
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
6161
import org.thoughtcrime.securesms.groups.OpenGroupManager
@@ -84,7 +84,6 @@ class VisibleMessageView : FrameLayout {
8484
@Inject lateinit var mmsSmsDb: MmsSmsDatabase
8585
@Inject lateinit var smsDb: SmsDatabase
8686
@Inject lateinit var mmsDb: MmsDatabase
87-
@Inject lateinit var lastSentTimestampCache: LastSentTimestampCache
8887
@Inject lateinit var configFactory: ConfigFactoryProtocol
8988
@Inject lateinit var usernameUtils: UsernameUtils
9089

@@ -166,6 +165,7 @@ class VisibleMessageView : FrameLayout {
166165
groupId: AccountId? = null,
167166
senderAccountID: String,
168167
lastSeen: Long,
168+
lastSentMessageId: MessageId?,
169169
delegate: VisibleMessageViewDelegate? = null,
170170
downloadPendingAttachment: (DatabaseAttachment) -> Unit,
171171
retryFailedAttachments: (List<DatabaseAttachment>) -> Unit,
@@ -271,7 +271,7 @@ class VisibleMessageView : FrameLayout {
271271
binding.dateBreakTextView.isVisible = showDateBreak
272272

273273
// Update message status indicator
274-
showStatusMessage(message)
274+
showStatusMessage(message, lastSentMessageId)
275275

276276
// Emoji Reactions
277277
if (!message.isDeleted && message.reactions.isNotEmpty()) {
@@ -312,7 +312,7 @@ class VisibleMessageView : FrameLayout {
312312
// Note: Although most commonly used to display the delivery status of a message, we also use the
313313
// message status area to display the disappearing messages state - so in this latter case we'll
314314
// be displaying either "Sent" or "Read" and the animating clock icon.
315-
private fun showStatusMessage(message: MessageRecord) {
315+
private fun showStatusMessage(message: MessageRecord, lastSentMessageId: MessageId?) {
316316
// We'll start by hiding everything and then only make visible what we need
317317
binding.messageStatusTextView.isVisible = false
318318
binding.messageStatusImageView.isVisible = false
@@ -376,8 +376,7 @@ class VisibleMessageView : FrameLayout {
376376
} else {
377377
// ..but if the message HAS been successfully sent or read then only display the delivery status
378378
// text and image if this is the last sent message.
379-
val lastSentTimestamp = lastSentTimestampCache.getTimestamp(message.threadId)
380-
val isLastSent = lastSentTimestamp == message.timestamp
379+
val isLastSent = lastSentMessageId != null && lastSentMessageId.id == message.id && lastSentMessageId.mms == message.isMms
381380
binding.messageStatusTextView.isVisible = isLastSent
382381
binding.messageStatusImageView.isVisible = isLastSent
383382
if (isLastSent) { binding.messageStatusImageView.bringToFront() }

app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java

Lines changed: 2 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,13 @@
22

33
import android.content.ContentValues;
44
import android.content.Context;
5-
import android.database.Cursor;
6-
7-
import androidx.annotation.NonNull;
85

96
import net.zetetic.database.sqlcipher.SQLiteDatabase;
107

118
import org.apache.commons.lang3.StringUtils;
129
import org.session.libsession.utilities.Address;
1310
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
1411

15-
import java.util.LinkedList;
1612
import java.util.List;
1713

1814
import javax.inject.Provider;
@@ -26,6 +22,8 @@ public class GroupReceiptDatabase extends Database {
2622
private static final String ADDRESS = "address";
2723
private static final String STATUS = "status";
2824
private static final String TIMESTAMP = "timestamp";
25+
26+
@Deprecated(forRemoval = true)
2927
private static final String UNIDENTIFIED = "unidentified";
3028

3129
public static final int STATUS_UNKNOWN = -1;
@@ -68,32 +66,6 @@ public void update(Address address, long mmsId, int status, long timestamp) {
6866
new String[] {String.valueOf(mmsId), address.toString(), String.valueOf(status)});
6967
}
7068

71-
public void setUnidentified(Address address, long mmsId, boolean unidentified) {
72-
SQLiteDatabase db = getWritableDatabase();
73-
ContentValues values = new ContentValues(1);
74-
values.put(UNIDENTIFIED, unidentified ? 1 : 0);
75-
76-
db.update(TABLE_NAME, values, MMS_ID + " = ? AND " + ADDRESS + " = ?",
77-
new String[] {String.valueOf(mmsId), address.toString()});
78-
79-
}
80-
81-
public @NonNull List<GroupReceiptInfo> getGroupReceiptInfo(long mmsId) {
82-
SQLiteDatabase db = getReadableDatabase();
83-
List<GroupReceiptInfo> results = new LinkedList<>();
84-
85-
try (Cursor cursor = db.query(TABLE_NAME, null, MMS_ID + " = ?", new String[] {String.valueOf(mmsId)}, null, null, null)) {
86-
while (cursor != null && cursor.moveToNext()) {
87-
results.add(new GroupReceiptInfo(Address.fromSerialized(cursor.getString(cursor.getColumnIndexOrThrow(ADDRESS))),
88-
cursor.getInt(cursor.getColumnIndexOrThrow(STATUS)),
89-
cursor.getLong(cursor.getColumnIndexOrThrow(TIMESTAMP)),
90-
cursor.getInt(cursor.getColumnIndexOrThrow(UNIDENTIFIED)) == 1));
91-
}
92-
}
93-
94-
return results;
95-
}
96-
9769
void deleteRowsForMessages(String[] mmsIds) {
9870
StringBuilder queryBuilder = new StringBuilder();
9971
for (int i = 0; i < mmsIds.length; i++) {
@@ -116,39 +88,4 @@ void deleteRowsForMessages(long[] mmsIds) {
11688
SQLiteDatabase db = getWritableDatabase();
11789
db.delete(TABLE_NAME, MMS_ID + " IN (?)", new String[] {StringUtils.join(mmsIds, ',')});
11890
}
119-
120-
void deleteAllRows() {
121-
SQLiteDatabase db = getWritableDatabase();
122-
db.delete(TABLE_NAME, null, null);
123-
}
124-
125-
public static class GroupReceiptInfo {
126-
private final Address address;
127-
private final int status;
128-
private final long timestamp;
129-
private final boolean unidentified;
130-
131-
GroupReceiptInfo(Address address, int status, long timestamp, boolean unidentified) {
132-
this.address = address;
133-
this.status = status;
134-
this.timestamp = timestamp;
135-
this.unidentified = unidentified;
136-
}
137-
138-
public Address getAddress() {
139-
return address;
140-
}
141-
142-
public int getStatus() {
143-
return status;
144-
}
145-
146-
public long getTimestamp() {
147-
return timestamp;
148-
}
149-
150-
public boolean isUnidentified() {
151-
return unidentified;
152-
}
153-
}
15491
}

app/src/main/java/org/thoughtcrime/securesms/database/LastSentTimestampCache.kt

Lines changed: 0 additions & 38 deletions
This file was deleted.

app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public MessagingDatabase(Context context, Provider<SQLCipherOpenHelper> database
4545

4646
public abstract void markAsSyncFailed(long id);
4747

48-
public abstract void markUnidentified(long messageId, boolean unidentified);
4948

5049
public abstract void markAsDeleted(long messageId, boolean isOutgoing, String displayedMessage);
5150

0 commit comments

Comments
 (0)