diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 4d3658595..6a5c9cbb8 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -45,6 +45,8 @@
+
+
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java
index 8d82216d8..09f209cc3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java
@@ -639,14 +639,13 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
values.put(TYPE, type);
values.put(THREAD_ID, threadId);
- long messageId = getWritableDatabase().insert(TABLE_NAME, null, values);
- boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && Recipient.resolved(recipientId).isMuted();
+ long messageId = getWritableDatabase().insert(TABLE_NAME, null, values);
if (unread) {
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+ SignalDatabase.threads().update(threadId, true);
notifyConversationListeners(threadId);
TrimThreadJob.enqueueAsync(threadId);
@@ -661,15 +660,14 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
values.put(READ, unread ? 0 : 1);
getWritableDatabase().update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(messageId));
- long threadId = getThreadIdForMessage(messageId);
- Recipient recipient = SignalDatabase.threads().getRecipientForThreadId(threadId);
- boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && recipient != null && recipient.isMuted();
+ long threadId = getThreadIdForMessage(messageId);
+ Recipient recipient = SignalDatabase.threads().getRecipientForThreadId(threadId);
if (unread) {
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+ SignalDatabase.threads().update(threadId, true);
notifyConversationListeners(threadId);
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId));
@@ -719,8 +717,8 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}
- boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && recipient.isMuted();
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+
+ SignalDatabase.threads().update(threadId, true);
db.setTransactionSuccessful();
} finally {
@@ -796,8 +794,7 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}
- final boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && recipient.isMuted();
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+ SignalDatabase.threads().update(threadId, true);
db.setTransactionSuccessful();
} finally {
@@ -948,8 +945,7 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
}
if (!silent) {
- final boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && (recipient.isMuted() || (groupRecipient != null && groupRecipient.isMuted()));
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+ SignalDatabase.threads().update(threadId, true);
}
if (message.getSubscriptionId() != -1) {
@@ -2503,8 +2499,6 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
if (threadRecipientId == null) {
threadRecipientId = retrieved.getFrom();
}
- boolean keepThreadArchived = threadRecipientId != null && SignalStore.settings().shouldKeepMutedChatsArchived() && Recipient.resolved(threadRecipientId).isMuted();
-
long messageId = insertMediaMessage(threadId,
retrieved.getBody(),
retrieved.getAttachments(),
@@ -2516,13 +2510,14 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
contentValues,
null,
updateThread,
- !keepThreadArchived);
+ true);
boolean isNotStoryGroupReply = retrieved.getParentStoryId() == null || !retrieved.getParentStoryId().isGroupReply();
+
if (!MessageTypes.isPaymentsActivated(mailbox) && !MessageTypes.isPaymentsRequestToActivate(mailbox) && !MessageTypes.isExpirationTimerUpdate(mailbox) && !retrieved.getStoryType().isStory() && isNotStoryGroupReply) {
boolean incrementUnreadMentions = !retrieved.getMentions().isEmpty() && retrieved.getMentions().stream().anyMatch(m -> m.getRecipientId().equals(Recipient.self().getId()));
SignalDatabase.threads().incrementUnread(threadId, 1, incrementUnreadMentions ? 1 : 0);
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+ SignalDatabase.threads().update(threadId, true);
}
notifyConversationListeners(threadId);
@@ -2671,8 +2666,7 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
long messageId = db.insert(TABLE_NAME, null, values);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
- boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && Recipient.resolved(recipientId).isMuted();
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+ SignalDatabase.threads().update(threadId, true);
notifyConversationListeners(threadId);
@@ -2695,8 +2689,7 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
- boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && Recipient.resolved(recipientId).isMuted();
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+ SignalDatabase.threads().update(threadId, true);
notifyConversationListeners(threadId);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt
index fb9882020..c2149501c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt
@@ -23,6 +23,7 @@ import org.signal.core.util.optionalLong
import org.signal.core.util.optionalString
import org.signal.core.util.or
import org.signal.core.util.readToSet
+import org.signal.core.util.readToSingleBoolean
import org.signal.core.util.requireBlob
import org.signal.core.util.requireBoolean
import org.signal.core.util.requireInt
@@ -3064,6 +3065,16 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
return results
}
+ /** True if the recipient exists and is muted, otherwise false. */
+ fun isMuted(id: RecipientId): Boolean {
+ return readableDatabase
+ .select(MUTE_UNTIL)
+ .from(TABLE_NAME)
+ .where("$ID = ?", id)
+ .run()
+ .readToSingleBoolean()
+ }
+
fun getRegisteredE164s(): Set {
return readableDatabase
.select(PHONE)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt
index 07d044334..d4b03ecb1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt
@@ -243,7 +243,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa
.where("$ID = ?", threadId)
.run()
- if (unarchive) {
+ if (unarchive && allowedToUnarchive(threadId)) {
val archiveValues = contentValuesOf(ARCHIVED to 0)
val query = SqlUtil.buildTrueUpdateQuery(ID_WHERE, SqlUtil.buildArgs(threadId), archiveValues)
if (writableDatabase.update(TABLE_NAME, archiveValues, query.where, query.whereArgs) > 0) {
@@ -252,6 +252,16 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa
}
}
+ private fun allowedToUnarchive(threadId: Long): Boolean {
+ if (!SignalStore.settings().shouldKeepMutedChatsArchived()) {
+ return true
+ }
+
+ val threadRecipientId: RecipientId? = getRecipientIdForThreadId(threadId)
+
+ return threadRecipientId == null || !recipients.isMuted(threadRecipientId)
+ }
+
fun updateSnippetUriSilently(threadId: Long, attachment: Uri?) {
writableDatabase
.update(TABLE_NAME)
@@ -272,7 +282,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa
SNIPPET_URI to attachment?.toString()
)
- if (unarchive) {
+ if (unarchive && allowedToUnarchive(threadId)) {
contentValues.put(ARCHIVED, 0)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java
index 40b0004b4..99815398d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java
@@ -126,8 +126,7 @@ public final class IdentityUtil {
} catch (MmsException e) {
throw new AssertionError();
}
- boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && recipient.isMuted();
- SignalDatabase.threads().update(threadId, !keepThreadArchived);
+ SignalDatabase.threads().update(threadId, true);
}
}
diff --git a/core-util/src/main/java/org/signal/core/util/CursorExtensions.kt b/core-util/src/main/java/org/signal/core/util/CursorExtensions.kt
index 0a5b290c7..f00b91f00 100644
--- a/core-util/src/main/java/org/signal/core/util/CursorExtensions.kt
+++ b/core-util/src/main/java/org/signal/core/util/CursorExtensions.kt
@@ -113,6 +113,16 @@ fun Cursor.readToSingleInt(defaultValue: Int = 0): Int {
}
}
+fun Cursor.readToSingleBoolean(defaultValue: Boolean = false): Boolean {
+ return use {
+ if (it.moveToFirst()) {
+ it.getInt(0) != 0
+ } else {
+ defaultValue
+ }
+ }
+}
+
@JvmOverloads
inline fun Cursor.readToList(predicate: (T) -> Boolean = { true }, mapper: (Cursor) -> T): List {
val list = mutableListOf()