Keep muted chats archived option.

main
Nicholas 2022-11-02 14:31:25 -04:00 zatwierdzone przez Cody Henthorne
rodzic c674d5b674
commit 5e25e8d0a2
9 zmienionych plików z 77 dodań i 27 usunięć

Wyświetl plik

@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.exporter.flow.SmsExportActivity
import org.thoughtcrime.securesms.exporter.flow.SmsExportDialogs
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.FeatureFlags
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
import org.thoughtcrime.securesms.util.navigation.safeNavigate
@ -103,6 +104,17 @@ class ChatsSettingsFragment : DSLSettingsFragment(R.string.preferences_chats__ch
}
)
if (FeatureFlags.keepMutedChatsArchived() || FeatureFlags.internalUser()) {
switchPref(
title = DSLSettingsText.from(R.string.preferences__pref_keep_muted_chats_archived),
summary = DSLSettingsText.from(R.string.preferences__muted_chats_that_are_archived_will_remain_archived),
isChecked = state.keepMutedChatsArchived,
onClick = {
viewModel.setKeepMutedChatsArchived(!state.keepMutedChatsArchived)
}
)
}
dividerPref()
sectionHeaderPref(R.string.ChatsSettingsFragment__keyboard)

Wyświetl plik

@ -39,4 +39,11 @@ class ChatsSettingsRepository {
StorageSyncHelper.scheduleSyncForDataChange()
}
}
fun syncKeepMutedChatsArchivedState() {
SignalExecutors.BOUNDED.execute {
SignalDatabase.recipients.markNeedsSync(Recipient.self().id)
StorageSyncHelper.scheduleSyncForDataChange()
}
}
}

Wyświetl plik

@ -5,6 +5,7 @@ import org.thoughtcrime.securesms.components.settings.app.chats.sms.SmsExportSta
data class ChatsSettingsState(
val generateLinkPreviews: Boolean,
val useAddressBook: Boolean,
val keepMutedChatsArchived: Boolean,
val useSystemEmoji: Boolean,
val enterKeySends: Boolean,
val chatBackupsEnabled: Boolean,

Wyświetl plik

@ -25,6 +25,7 @@ class ChatsSettingsViewModel @JvmOverloads constructor(
ChatsSettingsState(
generateLinkPreviews = SignalStore.settings().isLinkPreviewsEnabled,
useAddressBook = SignalStore.settings().isPreferSystemContactPhotos,
keepMutedChatsArchived = SignalStore.settings().shouldKeepMutedChatsArchived(),
useSystemEmoji = SignalStore.settings().isPreferSystemEmoji,
enterKeySends = SignalStore.settings().isEnterKeySends,
chatBackupsEnabled = SignalStore.settings().isBackupEnabled && BackupUtil.canUserAccessBackupDirectory(ApplicationDependencies.getApplication()),
@ -57,6 +58,12 @@ class ChatsSettingsViewModel @JvmOverloads constructor(
repository.syncPreferSystemContactPhotos()
}
fun setKeepMutedChatsArchived(enabled: Boolean) {
store.update { it.copy(keepMutedChatsArchived = enabled) }
SignalStore.settings().setKeepMutedChatsArchived(enabled)
repository.syncKeepMutedChatsArchivedState()
}
fun setUseSystemEmoji(enabled: Boolean) {
store.update { it.copy(useSystemEmoji = enabled) }
SignalStore.settings().isPreferSystemEmoji = enabled

Wyświetl plik

@ -1979,24 +1979,26 @@ public class MmsDatabase extends MessageDatabase {
return Optional.empty();
}
boolean updateThread = retrieved.getStoryType() == StoryType.NONE;
long messageId = insertMediaMessage(threadId,
retrieved.getBody(),
retrieved.getAttachments(),
quoteAttachments,
retrieved.getSharedContacts(),
retrieved.getLinkPreviews(),
retrieved.getMentions(),
retrieved.getMessageRanges(),
contentValues,
null,
updateThread);
boolean updateThread = retrieved.getStoryType() == StoryType.NONE;
boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && Recipient.resolved(retrieved.getFrom()).isMuted();
long messageId = insertMediaMessage(threadId,
retrieved.getBody(),
retrieved.getAttachments(),
quoteAttachments,
retrieved.getSharedContacts(),
retrieved.getLinkPreviews(),
retrieved.getMentions(),
retrieved.getMessageRanges(),
contentValues,
null,
updateThread,
!keepThreadArchived);
boolean isNotStoryGroupReply = retrieved.getParentStoryId() == null || !retrieved.getParentStoryId().isGroupReply();
if (!Types.isPaymentsActivated(mailbox) && !Types.isRequestToActivatePayments(mailbox) && !Types.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, true);
SignalDatabase.threads().update(threadId, !keepThreadArchived);
}
notifyConversationListeners(threadId);
@ -2297,7 +2299,7 @@ public class MmsDatabase extends MessageDatabase {
MentionUtil.UpdatedBodyAndMentions updatedBodyAndMentions = MentionUtil.updateBodyAndMentionsWithPlaceholders(message.getBody(), message.getMentions());
long messageId = insertMediaMessage(threadId, updatedBodyAndMentions.getBodyAsString(), message.getAttachments(), quoteAttachments, message.getSharedContacts(), message.getLinkPreviews(), updatedBodyAndMentions.getMentions(), null, contentValues, insertListener, false);
long messageId = insertMediaMessage(threadId, updatedBodyAndMentions.getBodyAsString(), message.getAttachments(), quoteAttachments, message.getSharedContacts(), message.getLinkPreviews(), updatedBodyAndMentions.getMentions(), null, contentValues, insertListener, false, false);
if (message.getRecipient().isGroup()) {
OutgoingGroupUpdateMessage outgoingGroupUpdateMessage = (message instanceof OutgoingGroupUpdateMessage) ? (OutgoingGroupUpdateMessage) message : null;
@ -2371,7 +2373,8 @@ public class MmsDatabase extends MessageDatabase {
@Nullable BodyRangeList messageRanges,
@NonNull ContentValues contentValues,
@Nullable InsertListener insertListener,
boolean updateThread)
boolean updateThread,
boolean unarchive)
throws MmsException
{
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
@ -2443,7 +2446,7 @@ public class MmsDatabase extends MessageDatabase {
if (updateThread) {
SignalDatabase.threads().setLastScrolled(contentValuesThreadId, 0);
SignalDatabase.threads().update(threadId, true);
SignalDatabase.threads().update(threadId, unarchive);
}
}
}

Wyświetl plik

@ -742,8 +742,8 @@ public class SmsDatabase extends MessageDatabase {
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}
SignalDatabase.threads().update(threadId, true);
boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && recipient.isMuted();
SignalDatabase.threads().update(threadId, !keepThreadArchived);
db.setTransactionSuccessful();
} finally {
@ -820,7 +820,8 @@ public class SmsDatabase extends MessageDatabase {
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}
SignalDatabase.threads().update(threadId, true);
final boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && recipient.isMuted();
SignalDatabase.threads().update(threadId, !keepThreadArchived);
db.setTransactionSuccessful();
} finally {
@ -891,8 +892,8 @@ public class SmsDatabase extends MessageDatabase {
if (unread) {
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}
SignalDatabase.threads().update(threadId, true);
boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && Recipient.resolved(recipientId).isMuted();
SignalDatabase.threads().update(threadId, !keepThreadArchived);
notifyConversationListeners(threadId);
TrimThreadJob.enqueueAsync(threadId);
@ -1281,7 +1282,8 @@ public class SmsDatabase extends MessageDatabase {
}
if (!silent) {
SignalDatabase.threads().update(threadId, true);
final boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && recipient.isMuted();
SignalDatabase.threads().update(threadId, !keepThreadArchived);
}
if (message.getSubscriptionId() != -1) {
@ -1324,7 +1326,8 @@ public class SmsDatabase extends MessageDatabase {
long messageId = db.insert(TABLE_NAME, null, values);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
SignalDatabase.threads().update(threadId, true);
boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && Recipient.resolved(recipientId).isMuted();
SignalDatabase.threads().update(threadId, !keepThreadArchived);
notifyConversationListeners(threadId);
@ -1348,7 +1351,8 @@ public class SmsDatabase extends MessageDatabase {
databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
SignalDatabase.threads().update(threadId, true);
boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && Recipient.resolved(recipientId).isMuted();
SignalDatabase.threads().update(threadId, !keepThreadArchived);
notifyConversationListeners(threadId);

Wyświetl plik

@ -105,6 +105,7 @@ public final class FeatureFlags {
private static final String SMS_EXPORT_MEGAPHONE_DELAY_DAYS = "android.smsExport.megaphoneDelayDays.2";
public static final String CREDIT_CARD_PAYMENTS = "android.credit.card.payments";
private static final String PAYMENTS_REQUEST_ACTIVATE_FLOW = "android.payments.requestActivateFlow";
private static final String KEEP_MUTED_CHATS_ARCHIVED = "android.keepMutedChatsArchived";
/**
* We will only store remote values for flags in this set. If you want a flag to be controllable
@ -161,7 +162,8 @@ public final class FeatureFlags {
HIDE_CONTACTS,
SMS_EXPORT_MEGAPHONE_DELAY_DAYS,
CREDIT_CARD_PAYMENTS,
PAYMENTS_REQUEST_ACTIVATE_FLOW
PAYMENTS_REQUEST_ACTIVATE_FLOW,
KEEP_MUTED_CHATS_ARCHIVED
);
@VisibleForTesting
@ -225,7 +227,8 @@ public final class FeatureFlags {
STORIES,
SMS_EXPORT_MEGAPHONE_DELAY_DAYS,
CREDIT_CARD_PAYMENTS,
PAYMENTS_REQUEST_ACTIVATE_FLOW
PAYMENTS_REQUEST_ACTIVATE_FLOW,
KEEP_MUTED_CHATS_ARCHIVED
);
/**
@ -578,6 +581,13 @@ public final class FeatureFlags {
return getBoolean(PAYMENTS_REQUEST_ACTIVATE_FLOW, false);
}
/**
* Whether users can enable keeping conversations with incoming messages archived if the conversation is muted.
*/
public static boolean keepMutedChatsArchived() {
return getBoolean(KEEP_MUTED_CHATS_ARCHIVED, false);
}
/** Only for rendering debug info. */
public static synchronized @NonNull Map<String, Object> getMemoryValues() {
return new TreeMap<>(REMOTE_VALUES);

Wyświetl plik

@ -22,6 +22,7 @@ import org.thoughtcrime.securesms.database.MessageDatabase.InsertResult;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.IdentityRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.notifications.v2.ConversationId;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
@ -112,7 +113,8 @@ public final class IdentityUtil {
Log.i(TAG, "Inserting verified outbox...");
SignalDatabase.sms().insertMessageOutbox(threadId, outgoing, false, time, null);
SignalDatabase.threads().update(threadId, true);
boolean keepThreadArchived = SignalStore.settings().shouldKeepMutedChatsArchived() && recipient.isMuted();
SignalDatabase.threads().update(threadId, !keepThreadArchived);
}
}

Wyświetl plik

@ -2664,6 +2664,10 @@
<string name="preferences__pressing_the_enter_key_will_send_text_messages">Pressing the Enter key will send text messages</string>
<string name="preferences__pref_use_address_book_photos">Use address book photos</string>
<string name="preferences__display_contact_photos_from_your_address_book_if_available">Display contact photos from your address book if available</string>
<!-- Preference menu item title for a toggle switch for preserving the archived state of muted chats. -->
<string name="preferences__pref_keep_muted_chats_archived">Keep Muted Chats Archived</string>
<!-- Preference menu item description for a toggle switch for preserving the archived state of muted chats. -->
<string name="preferences__muted_chats_that_are_archived_will_remain_archived">Muted chats that are archived will remain archived when a new message arrives.</string>
<string name="preferences__generate_link_previews">Generate link previews</string>
<string name="preferences__retrieve_link_previews_from_websites_for_messages">Retrieve link previews directly from websites for messages you send.</string>
<string name="preferences__choose_identity">Choose identity</string>