diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationRepository.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationRepository.java index f2338e5875..f3ad76cc3f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationRepository.java @@ -105,7 +105,7 @@ class ConversationRepository { conversationRecipient.getExpiresInSeconds() == 0 && !conversationRecipient.isGroup() && conversationRecipient.isRegistered() && - (threadId == -1 || !SignalDatabase.messages().hasMeaningfulMessage(threadId))) + (threadId == -1 || SignalDatabase.messages().canSetUniversalTimer(threadId))) { showUniversalExpireTimerUpdate = true; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index 46c1df542f..6c11ffe9b3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -1688,6 +1688,23 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat .readToSingleInt() } + fun canSetUniversalTimer(threadId: Long): Boolean { + if (threadId == -1L) { + return true + } + + val meaningfulQuery = buildMeaningfulMessagesQuery(threadId) + val isNotJoinedType = SqlUtil.buildQuery("$TYPE & ${MessageTypes.BASE_TYPE_MASK} != ${MessageTypes.JOINED_TYPE}") + + val query = meaningfulQuery and isNotJoinedType + val hasMeaningfulMessages = readableDatabase + .exists(TABLE_NAME) + .where(query.where, query.whereArgs) + .run() + + return !hasMeaningfulMessages + } + fun hasMeaningfulMessage(threadId: Long): Boolean { if (threadId == -1L) { return false @@ -1716,19 +1733,19 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat private fun buildMeaningfulMessagesQuery(threadId: Long): SqlUtil.Query { val query = """ $THREAD_ID = ? AND - $STORY_TYPE = ? AND - $PARENT_STORY_ID <= ? AND + $STORY_TYPE = 0 AND + $PARENT_STORY_ID <= 0 AND ( - NOT $TYPE & ? AND - $TYPE != ? AND - $TYPE != ? AND - $TYPE != ? AND - $TYPE != ? AND + NOT $TYPE & ${MessageTypes.IGNORABLE_TYPESMASK_WHEN_COUNTING} AND + $TYPE != ${MessageTypes.PROFILE_CHANGE_TYPE} AND + $TYPE != ${MessageTypes.CHANGE_NUMBER_TYPE} AND + $TYPE != ${MessageTypes.SMS_EXPORT_TYPE} AND + $TYPE != ${MessageTypes.BOOST_REQUEST_TYPE} AND $TYPE & ${MessageTypes.GROUP_V2_LEAVE_BITS} != ${MessageTypes.GROUP_V2_LEAVE_BITS} ) """.toSingleLine() - return SqlUtil.buildQuery(query, threadId, 0, 0, MessageTypes.IGNORABLE_TYPESMASK_WHEN_COUNTING, MessageTypes.PROFILE_CHANGE_TYPE, MessageTypes.CHANGE_NUMBER_TYPE, MessageTypes.SMS_EXPORT_TYPE, MessageTypes.BOOST_REQUEST_TYPE) + return SqlUtil.buildQuery(query, threadId) } fun setNetworkFailures(messageId: Long, failures: Set?) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java index 3d4c9025c6..6b840c1c9e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java @@ -314,7 +314,7 @@ public class RecipientUtil { return false; } - if (threadId == -1 || !SignalDatabase.messages().hasMeaningfulMessage(threadId)) { + if (threadId == -1 || SignalDatabase.messages().canSetUniversalTimer(threadId)) { SignalDatabase.recipients().setExpireMessages(recipient.getId(), defaultTimer); OutgoingMessage outgoingMessage = OutgoingMessage.expirationUpdateMessage(recipient, System.currentTimeMillis(), defaultTimer * 1000L); MessageSender.send(context, outgoingMessage, SignalDatabase.threads().getOrCreateThreadIdFor(recipient), MessageSender.SendType.SIGNAL, null, null);