mirror of
https://github.com/oxen-io/session-android.git
synced 2025-01-11 21:53:43 +00:00
Merge pull request #1465 from bemusementpark/ses-1733
[SES-1733] Fix group expiration update messages
This commit is contained in:
commit
afa9af1803
@ -31,6 +31,7 @@ import org.session.libsession.messaging.utilities.UpdateMessageData;
|
|||||||
import org.session.libsession.utilities.IdentityKeyMismatch;
|
import org.session.libsession.utilities.IdentityKeyMismatch;
|
||||||
import org.session.libsession.utilities.NetworkFailure;
|
import org.session.libsession.utilities.NetworkFailure;
|
||||||
import org.session.libsession.utilities.recipients.Recipient;
|
import org.session.libsession.utilities.recipients.Recipient;
|
||||||
|
import org.thoughtcrime.securesms.dependencies.DatabaseComponent;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -120,7 +121,8 @@ public abstract class MessageRecord extends DisplayRecord {
|
|||||||
return new SpannableString(UpdateMessageBuilder.INSTANCE.buildGroupUpdateMessage(context, updateMessageData, getIndividualRecipient().getAddress().serialize(), isOutgoing()));
|
return new SpannableString(UpdateMessageBuilder.INSTANCE.buildGroupUpdateMessage(context, updateMessageData, getIndividualRecipient().getAddress().serialize(), isOutgoing()));
|
||||||
} else if (isExpirationTimerUpdate()) {
|
} else if (isExpirationTimerUpdate()) {
|
||||||
int seconds = (int) (getExpiresIn() / 1000);
|
int seconds = (int) (getExpiresIn() / 1000);
|
||||||
return new SpannableString(UpdateMessageBuilder.INSTANCE.buildExpirationTimerMessage(context, seconds, getRecipient(), getIndividualRecipient().getAddress().serialize(), isOutgoing(), getTimestamp(), expireStarted));
|
boolean isGroup = DatabaseComponent.get(context).threadDatabase().getRecipientForThreadId(getThreadId()).isGroupRecipient();
|
||||||
|
return new SpannableString(UpdateMessageBuilder.INSTANCE.buildExpirationTimerMessage(context, seconds, isGroup, getIndividualRecipient().getAddress().serialize(), isOutgoing(), getTimestamp(), expireStarted));
|
||||||
} else if (isDataExtractionNotification()) {
|
} else if (isDataExtractionNotification()) {
|
||||||
if (isScreenshotNotification()) return new SpannableString((UpdateMessageBuilder.INSTANCE.buildDataExtractionMessage(context, DataExtractionNotificationInfoMessage.Kind.SCREENSHOT, getIndividualRecipient().getAddress().serialize())));
|
if (isScreenshotNotification()) return new SpannableString((UpdateMessageBuilder.INSTANCE.buildDataExtractionMessage(context, DataExtractionNotificationInfoMessage.Kind.SCREENSHOT, getIndividualRecipient().getAddress().serialize())));
|
||||||
else if (isMediaSavedNotification()) return new SpannableString((UpdateMessageBuilder.INSTANCE.buildDataExtractionMessage(context, DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED, getIndividualRecipient().getAddress().serialize())));
|
else if (isMediaSavedNotification()) return new SpannableString((UpdateMessageBuilder.INSTANCE.buildDataExtractionMessage(context, DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED, getIndividualRecipient().getAddress().serialize())));
|
||||||
|
@ -61,11 +61,15 @@ class MarkReadReceiver : BroadcastReceiver() {
|
|||||||
|
|
||||||
val mmsSmsDatabase = DatabaseComponent.get(context).mmsSmsDatabase()
|
val mmsSmsDatabase = DatabaseComponent.get(context).mmsSmsDatabase()
|
||||||
|
|
||||||
|
val threadDb = DatabaseComponent.get(context).threadDatabase()
|
||||||
|
|
||||||
// start disappear after read messages except TimerUpdates in groups.
|
// start disappear after read messages except TimerUpdates in groups.
|
||||||
markedReadMessages
|
markedReadMessages
|
||||||
.filter { it.expiryType == ExpiryType.AFTER_READ }
|
.filter { it.expiryType == ExpiryType.AFTER_READ }
|
||||||
.map { it.syncMessageId }
|
.map { it.syncMessageId }
|
||||||
.filter { mmsSmsDatabase.getMessageForTimestamp(it.timetamp)?.run { isExpirationTimerUpdate && recipient.isClosedGroupRecipient } == false }
|
.filter { mmsSmsDatabase.getMessageForTimestamp(it.timetamp)?.run {
|
||||||
|
isExpirationTimerUpdate && threadDb.getRecipientForThreadId(threadId)?.isGroupRecipient == true } == false
|
||||||
|
}
|
||||||
.forEach { messageExpirationManager.startDisappearAfterRead(it.timetamp, it.address.serialize()) }
|
.forEach { messageExpirationManager.startDisappearAfterRead(it.timetamp, it.address.serialize()) }
|
||||||
|
|
||||||
hashToDisappearAfterReadMessage(context, markedReadMessages)?.let {
|
hashToDisappearAfterReadMessage(context, markedReadMessages)?.let {
|
||||||
|
@ -151,8 +151,8 @@ class ExpiringMessageManager(context: Context) : MessageExpirationManagerProtoco
|
|||||||
|
|
||||||
val userPublicKey = getLocalNumber(context)
|
val userPublicKey = getLocalNumber(context)
|
||||||
val senderPublicKey = message.sender
|
val senderPublicKey = message.sender
|
||||||
val sentTimestamp = if (message.sentTimestamp == null) 0 else message.sentTimestamp!!
|
val sentTimestamp = message.sentTimestamp ?: 0
|
||||||
val expireStartedAt = if (expiryMode is AfterSend || message.isSenderSelf) sentTimestamp else 0
|
val expireStartedAt = if ((expiryMode is AfterSend || message.isSenderSelf) && !message.isGroup) sentTimestamp else 0
|
||||||
|
|
||||||
// Notify the user
|
// Notify the user
|
||||||
if (senderPublicKey == null || userPublicKey == senderPublicKey) {
|
if (senderPublicKey == null || userPublicKey == senderPublicKey) {
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
android:textColor="?android:textColorPrimary"
|
android:textColor="?android:textColorPrimary"
|
||||||
android:textSize="@dimen/very_small_font_size"
|
android:textSize="@dimen/very_small_font_size"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
tools:text="@string/MessageRecord_you_disabled_disappearing_messages" />
|
tools:text="You disabled disappearing messages" />
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/call_view"
|
android:id="@+id/call_view"
|
||||||
|
@ -10,11 +10,11 @@ import org.session.libsession.messaging.calls.CallMessageType.CALL_INCOMING
|
|||||||
import org.session.libsession.messaging.calls.CallMessageType.CALL_MISSED
|
import org.session.libsession.messaging.calls.CallMessageType.CALL_MISSED
|
||||||
import org.session.libsession.messaging.calls.CallMessageType.CALL_OUTGOING
|
import org.session.libsession.messaging.calls.CallMessageType.CALL_OUTGOING
|
||||||
import org.session.libsession.messaging.contacts.Contact
|
import org.session.libsession.messaging.contacts.Contact
|
||||||
import org.session.libsession.messaging.messages.ExpirationConfiguration.Companion.isNewConfigEnabled
|
|
||||||
import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage
|
import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage
|
||||||
|
import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED
|
||||||
|
import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage.Kind.SCREENSHOT
|
||||||
import org.session.libsession.utilities.ExpirationUtil
|
import org.session.libsession.utilities.ExpirationUtil
|
||||||
import org.session.libsession.utilities.getExpirationTypeDisplayValue
|
import org.session.libsession.utilities.getExpirationTypeDisplayValue
|
||||||
import org.session.libsession.utilities.recipients.Recipient
|
|
||||||
import org.session.libsession.utilities.truncateIdForDisplay
|
import org.session.libsession.utilities.truncateIdForDisplay
|
||||||
|
|
||||||
object UpdateMessageBuilder {
|
object UpdateMessageBuilder {
|
||||||
@ -31,47 +31,35 @@ object UpdateMessageBuilder {
|
|||||||
else getSenderName(senderId!!)
|
else getSenderName(senderId!!)
|
||||||
|
|
||||||
return when (updateData) {
|
return when (updateData) {
|
||||||
is UpdateMessageData.Kind.GroupCreation -> if (isOutgoing) {
|
is UpdateMessageData.Kind.GroupCreation -> {
|
||||||
context.getString(R.string.MessageRecord_you_created_a_new_group)
|
if (isOutgoing) context.getString(R.string.MessageRecord_you_created_a_new_group)
|
||||||
} else {
|
else context.getString(R.string.MessageRecord_s_added_you_to_the_group, senderName)
|
||||||
context.getString(R.string.MessageRecord_s_added_you_to_the_group, senderName)
|
|
||||||
}
|
}
|
||||||
is UpdateMessageData.Kind.GroupNameChange -> if (isOutgoing) {
|
is UpdateMessageData.Kind.GroupNameChange -> {
|
||||||
context.getString(R.string.MessageRecord_you_renamed_the_group_to_s, updateData.name)
|
if (isOutgoing) context.getString(R.string.MessageRecord_you_renamed_the_group_to_s, updateData.name)
|
||||||
} else {
|
else context.getString(R.string.MessageRecord_s_renamed_the_group_to_s, senderName, updateData.name)
|
||||||
context.getString(R.string.MessageRecord_s_renamed_the_group_to_s, senderName, updateData.name)
|
|
||||||
}
|
}
|
||||||
is UpdateMessageData.Kind.GroupMemberAdded -> {
|
is UpdateMessageData.Kind.GroupMemberAdded -> {
|
||||||
val members = updateData.updatedMembers.joinToString(", ", transform = ::getSenderName)
|
val members = updateData.updatedMembers.joinToString(", ", transform = ::getSenderName)
|
||||||
if (isOutgoing) {
|
if (isOutgoing) context.getString(R.string.MessageRecord_you_added_s_to_the_group, members)
|
||||||
context.getString(R.string.MessageRecord_you_added_s_to_the_group, members)
|
else context.getString(R.string.MessageRecord_s_added_s_to_the_group, senderName, members)
|
||||||
} else {
|
|
||||||
context.getString(R.string.MessageRecord_s_added_s_to_the_group, senderName, members)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
is UpdateMessageData.Kind.GroupMemberRemoved -> {
|
is UpdateMessageData.Kind.GroupMemberRemoved -> {
|
||||||
val userPublicKey = storage.getUserPublicKey()!!
|
val userPublicKey = storage.getUserPublicKey()!!
|
||||||
// 1st case: you are part of the removed members
|
// 1st case: you are part of the removed members
|
||||||
return if (userPublicKey in updateData.updatedMembers) {
|
return if (userPublicKey in updateData.updatedMembers) {
|
||||||
if (isOutgoing) {
|
if (isOutgoing) context.getString(R.string.MessageRecord_left_group)
|
||||||
context.getString(R.string.MessageRecord_left_group)
|
else context.getString(R.string.MessageRecord_you_were_removed_from_the_group)
|
||||||
} else {
|
|
||||||
context.getString(R.string.MessageRecord_you_were_removed_from_the_group)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// 2nd case: you are not part of the removed members
|
// 2nd case: you are not part of the removed members
|
||||||
val members = updateData.updatedMembers.joinToString(", ", transform = ::getSenderName)
|
val members = updateData.updatedMembers.joinToString(", ", transform = ::getSenderName)
|
||||||
if (isOutgoing) {
|
if (isOutgoing) context.getString(R.string.MessageRecord_you_removed_s_from_the_group, members)
|
||||||
context.getString(R.string.MessageRecord_you_removed_s_from_the_group, members)
|
else context.getString(R.string.MessageRecord_s_removed_s_from_the_group, senderName, members)
|
||||||
} else {
|
|
||||||
context.getString(R.string.MessageRecord_s_removed_s_from_the_group, senderName, members)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is UpdateMessageData.Kind.GroupMemberLeft -> if (isOutgoing) {
|
is UpdateMessageData.Kind.GroupMemberLeft -> {
|
||||||
context.getString(R.string.MessageRecord_left_group)
|
if (isOutgoing) context.getString(R.string.MessageRecord_left_group)
|
||||||
} else {
|
else context.getString(R.string.ConversationItem_group_action_left, senderName)
|
||||||
context.getString(R.string.ConversationItem_group_action_left, senderName)
|
|
||||||
}
|
}
|
||||||
else -> return ""
|
else -> return ""
|
||||||
}
|
}
|
||||||
@ -80,7 +68,7 @@ object UpdateMessageBuilder {
|
|||||||
fun buildExpirationTimerMessage(
|
fun buildExpirationTimerMessage(
|
||||||
context: Context,
|
context: Context,
|
||||||
duration: Long,
|
duration: Long,
|
||||||
recipient: Recipient,
|
isGroup: Boolean,
|
||||||
senderId: String? = null,
|
senderId: String? = null,
|
||||||
isOutgoing: Boolean = false,
|
isOutgoing: Boolean = false,
|
||||||
timestamp: Long,
|
timestamp: Long,
|
||||||
@ -89,44 +77,28 @@ object UpdateMessageBuilder {
|
|||||||
if (!isOutgoing && senderId == null) return ""
|
if (!isOutgoing && senderId == null) return ""
|
||||||
val senderName = if (isOutgoing) context.getString(R.string.MessageRecord_you) else getSenderName(senderId!!)
|
val senderName = if (isOutgoing) context.getString(R.string.MessageRecord_you) else getSenderName(senderId!!)
|
||||||
return if (duration <= 0) {
|
return if (duration <= 0) {
|
||||||
if (isOutgoing) {
|
if (isOutgoing) context.getString(if (isGroup) R.string.MessageRecord_you_turned_off_disappearing_messages else R.string.MessageRecord_you_turned_off_disappearing_messages_1_on_1)
|
||||||
if (!isNewConfigEnabled) context.getString(R.string.MessageRecord_you_disabled_disappearing_messages)
|
else context.getString(if (isGroup) R.string.MessageRecord_s_turned_off_disappearing_messages else R.string.MessageRecord_s_turned_off_disappearing_messages_1_on_1, senderName)
|
||||||
else context.getString(if (recipient.is1on1) R.string.MessageRecord_you_turned_off_disappearing_messages_1_on_1 else R.string.MessageRecord_you_turned_off_disappearing_messages)
|
|
||||||
} else {
|
|
||||||
if (!isNewConfigEnabled) context.getString(R.string.MessageRecord_s_disabled_disappearing_messages, senderName)
|
|
||||||
else context.getString(if (recipient.is1on1) R.string.MessageRecord_s_turned_off_disappearing_messages_1_on_1 else R.string.MessageRecord_s_turned_off_disappearing_messages, senderName)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
val time = ExpirationUtil.getExpirationDisplayValue(context, duration.toInt())
|
val time = ExpirationUtil.getExpirationDisplayValue(context, duration.toInt())
|
||||||
val action = context.getExpirationTypeDisplayValue(timestamp == expireStarted)
|
val action = context.getExpirationTypeDisplayValue(timestamp >= expireStarted)
|
||||||
if (isOutgoing) {
|
if (isOutgoing) context.getString(
|
||||||
if (!isNewConfigEnabled) context.getString(R.string.MessageRecord_you_set_disappearing_message_time_to_s, time)
|
if (isGroup) R.string.MessageRecord_you_set_messages_to_disappear_s_after_s else R.string.MessageRecord_you_set_messages_to_disappear_s_after_s_1_on_1,
|
||||||
else context.getString(
|
time,
|
||||||
if (recipient.is1on1) R.string.MessageRecord_you_set_messages_to_disappear_s_after_s_1_on_1 else R.string.MessageRecord_you_set_messages_to_disappear_s_after_s,
|
action
|
||||||
time,
|
) else context.getString(
|
||||||
action
|
if (isGroup) R.string.MessageRecord_s_set_messages_to_disappear_s_after_s else R.string.MessageRecord_s_set_messages_to_disappear_s_after_s_1_on_1,
|
||||||
)
|
senderName,
|
||||||
} else {
|
time,
|
||||||
if (!isNewConfigEnabled) context.getString(R.string.MessageRecord_s_set_disappearing_message_time_to_s, senderName, time)
|
action
|
||||||
else context.getString(
|
)
|
||||||
if (recipient.is1on1) R.string.MessageRecord_s_set_messages_to_disappear_s_after_s_1_on_1 else R.string.MessageRecord_s_set_messages_to_disappear_s_after_s,
|
|
||||||
senderName,
|
|
||||||
time,
|
|
||||||
action
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun buildDataExtractionMessage(context: Context, kind: DataExtractionNotificationInfoMessage.Kind, senderId: String? = null): String {
|
fun buildDataExtractionMessage(context: Context, kind: DataExtractionNotificationInfoMessage.Kind, senderId: String? = null) = when (kind) {
|
||||||
val senderName = getSenderName(senderId!!)
|
SCREENSHOT -> R.string.MessageRecord_s_took_a_screenshot
|
||||||
return when (kind) {
|
MEDIA_SAVED -> R.string.MessageRecord_media_saved_by_s
|
||||||
DataExtractionNotificationInfoMessage.Kind.SCREENSHOT ->
|
}.let { context.getString(it, getSenderName(senderId!!)) }
|
||||||
context.getString(R.string.MessageRecord_s_took_a_screenshot, senderName)
|
|
||||||
DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED ->
|
|
||||||
context.getString(R.string.MessageRecord_media_saved_by_s, senderName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildCallMessage(context: Context, type: CallMessageType, sender: String): String =
|
fun buildCallMessage(context: Context, type: CallMessageType, sender: String): String =
|
||||||
when (type) {
|
when (type) {
|
||||||
|
@ -15,10 +15,6 @@
|
|||||||
<string name="MessageRecord_s_called_you">%s vous a appelé·e</string>
|
<string name="MessageRecord_s_called_you">%s vous a appelé·e</string>
|
||||||
<string name="MessageRecord_called_s">Vous avez appelé %s</string>
|
<string name="MessageRecord_called_s">Vous avez appelé %s</string>
|
||||||
<string name="MessageRecord_missed_call_from">Appel manqué de %s</string>
|
<string name="MessageRecord_missed_call_from">Appel manqué de %s</string>
|
||||||
<string name="MessageRecord_you_disabled_disappearing_messages">Vous avez désactivé les messages éphémères.</string>
|
|
||||||
<string name="MessageRecord_s_disabled_disappearing_messages">%1$s a désactivé les messages éphémères.</string>
|
|
||||||
<string name="MessageRecord_you_set_disappearing_message_time_to_s">Vous avez défini l’expiration des messages éphémères à %1$s</string>
|
|
||||||
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s a défini l’expiration des messages éphémères à %2$s</string>
|
|
||||||
<string name="MessageRecord_s_took_a_screenshot">%1$s a pris une capture d\'écran.</string>
|
<string name="MessageRecord_s_took_a_screenshot">%1$s a pris une capture d\'écran.</string>
|
||||||
<string name="MessageRecord_media_saved_by_s">%1$s a enregistré le média.</string>
|
<string name="MessageRecord_media_saved_by_s">%1$s a enregistré le média.</string>
|
||||||
<!-- expiration -->
|
<!-- expiration -->
|
||||||
|
@ -15,10 +15,6 @@
|
|||||||
<string name="MessageRecord_s_called_you">%s vous a appelé·e</string>
|
<string name="MessageRecord_s_called_you">%s vous a appelé·e</string>
|
||||||
<string name="MessageRecord_called_s">Vous avez appelé %s</string>
|
<string name="MessageRecord_called_s">Vous avez appelé %s</string>
|
||||||
<string name="MessageRecord_missed_call_from">Appel manqué de %s</string>
|
<string name="MessageRecord_missed_call_from">Appel manqué de %s</string>
|
||||||
<string name="MessageRecord_you_disabled_disappearing_messages">Vous avez désactivé les messages éphémères.</string>
|
|
||||||
<string name="MessageRecord_s_disabled_disappearing_messages">%1$s a désactivé les messages éphémères.</string>
|
|
||||||
<string name="MessageRecord_you_set_disappearing_message_time_to_s">Vous avez défini l’expiration des messages éphémères à %1$s</string>
|
|
||||||
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s a défini l’expiration des messages éphémères à %2$s</string>
|
|
||||||
<string name="MessageRecord_s_took_a_screenshot">%1$s a pris une capture d\'écran.</string>
|
<string name="MessageRecord_s_took_a_screenshot">%1$s a pris une capture d\'écran.</string>
|
||||||
<string name="MessageRecord_media_saved_by_s">%1$s a enregistré le média.</string>
|
<string name="MessageRecord_media_saved_by_s">%1$s a enregistré le média.</string>
|
||||||
<!-- expiration -->
|
<!-- expiration -->
|
||||||
|
@ -17,17 +17,13 @@
|
|||||||
<string name="MessageRecord_missed_call_from">Missed call from %s</string>
|
<string name="MessageRecord_missed_call_from">Missed call from %s</string>
|
||||||
<string name="MessageRecord_follow_setting">Follow Setting</string>
|
<string name="MessageRecord_follow_setting">Follow Setting</string>
|
||||||
<string name="AccessibilityId_follow_setting">Follow setting</string>
|
<string name="AccessibilityId_follow_setting">Follow setting</string>
|
||||||
<string name="MessageRecord_you_disabled_disappearing_messages">You disabled disappearing messages.</string>
|
|
||||||
<string name="MessageRecord_you_turned_off_disappearing_messages">You have turned off disappearing messages.</string>
|
<string name="MessageRecord_you_turned_off_disappearing_messages">You have turned off disappearing messages.</string>
|
||||||
<string name="MessageRecord_you_turned_off_disappearing_messages_1_on_1">You turned off disappearing messages. Messages you send will no longer disappear.</string>
|
<string name="MessageRecord_you_turned_off_disappearing_messages_1_on_1">You turned off disappearing messages. Messages you send will no longer disappear.</string>
|
||||||
<string name="MessageRecord_s_disabled_disappearing_messages">%1$s disabled disappearing messages.</string>
|
|
||||||
<string name="MessageRecord_s_turned_off_disappearing_messages">%1$s turned off disappearing messages.</string>
|
<string name="MessageRecord_s_turned_off_disappearing_messages">%1$s turned off disappearing messages.</string>
|
||||||
<string name="MessageRecord_s_turned_off_disappearing_messages_1_on_1">%1$s has turned off disappearing messages. Messages they send will no longer disappear.</string>
|
<string name="MessageRecord_s_turned_off_disappearing_messages_1_on_1">%1$s has turned off disappearing messages. Messages they send will no longer disappear.</string>
|
||||||
<string name="MessageRecord_you_set_disappearing_message_time_to_s">You set the disappearing message timer to %1$s</string>
|
|
||||||
<string name="MessageRecord_you_set_messages_to_disappear_s_after_s">You have set messages to disappear %1$s after they have been %2$s</string>
|
<string name="MessageRecord_you_set_messages_to_disappear_s_after_s">You have set messages to disappear %1$s after they have been %2$s</string>
|
||||||
<string name="MessageRecord_you_set_messages_to_disappear_s_after_s_1_on_1">You set your messages to disappear %1$s after they have been %2$s.</string>
|
<string name="MessageRecord_you_set_messages_to_disappear_s_after_s_1_on_1">You set your messages to disappear %1$s after they have been %2$s.</string>
|
||||||
<string name="MessageRecord_you_changed_messages_to_disappear_s_after_s">You have changed messages to disappear %1$s after they have been %2$s</string>
|
<string name="MessageRecord_you_changed_messages_to_disappear_s_after_s">You have changed messages to disappear %1$s after they have been %2$s</string>
|
||||||
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s set the disappearing message timer to %2$s</string>
|
|
||||||
<string name="MessageRecord_s_set_messages_to_disappear_s_after_s">%1$s has set messages to disappear %2$s after they have been %3$s</string>
|
<string name="MessageRecord_s_set_messages_to_disappear_s_after_s">%1$s has set messages to disappear %2$s after they have been %3$s</string>
|
||||||
<string name="MessageRecord_s_set_messages_to_disappear_s_after_s_1_on_1">%1$s has set their messages to disappear %2$s after they have been %3$s.</string>
|
<string name="MessageRecord_s_set_messages_to_disappear_s_after_s_1_on_1">%1$s has set their messages to disappear %2$s after they have been %3$s.</string>
|
||||||
<string name="MessageRecord_s_changed_messages_to_disappear_s_after_s">%1$s has changed messages to disappear %2$s after they have been %3$s</string>
|
<string name="MessageRecord_s_changed_messages_to_disappear_s_after_s">%1$s has changed messages to disappear %2$s after they have been %3$s</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user