diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java
index ca14153ed3..e5bb1b85ba 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java
@@ -89,6 +89,7 @@ import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate;
import org.session.libsession.messaging.messages.visible.VisibleMessage;
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
import org.session.libsession.messaging.threads.DistributionTypes;
+import org.session.libsession.messaging.utilities.UpdateMessageBuilder;
import org.session.libsession.utilities.GroupUtil;
import org.session.libsession.utilities.MediaTypes;
import org.session.libsignal.libsignal.InvalidMessageException;
@@ -808,7 +809,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
DatabaseFactory.getRecipientDatabase(ConversationActivity.this).setExpireMessages(recipient, expirationTime);
ExpirationTimerUpdate message = new ExpirationTimerUpdate(expirationTime);
message.setSentTimestamp(System.currentTimeMillis());
- OutgoingExpirationUpdateMessage outgoingMessage = OutgoingExpirationUpdateMessage.from(message, recipient);
+ String displayedMessage = UpdateMessageBuilder.INSTANCE.buildExpirationTimerMessage(getApplicationContext(), expirationTime, null, false);
+ OutgoingExpirationUpdateMessage outgoingMessage = OutgoingExpirationUpdateMessage.from(message, recipient, displayedMessage);
try {
message.setId(DatabaseFactory.getMmsDatabase(ConversationActivity.this).insertMessageOutbox(outgoingMessage, getAllocatedThreadId(ConversationActivity.this), false, null));
MessageSender.send(message, recipient.getAddress());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java
index 6b76c0572a..7efd5ca4e2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java
@@ -175,7 +175,7 @@ public class ConversationUpdateItem extends LinearLayout
icon.setImageResource(R.drawable.ic_group_grey600_24dp);
icon.clearColorFilter();
- GroupDescription.Companion.getDescription(getContext(), messageRecord.getBody()).addListener(this);
+ GroupDescription.Companion.getDescription(getContext(), messageRecord.getBody()).addListener(this); //TODO Brice: could be removed if GroupDescription is removed
body.setText(messageRecord.getDisplayBody(getContext()));
title.setVisibility(GONE);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java
index 300a5c55f8..28dbbbe420 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java
@@ -390,7 +390,7 @@ public class SmsDatabase extends MessagingDatabase {
values.put(REPLY_PATH_PRESENT, message.isReplyPathPresent());
values.put(SERVICE_CENTER, message.getServiceCenterAddress());
- values.put(BODY, message.getMessageBody());
+ values.put(BODY, message.getMessageBody()); //TODO Brice: is that encoded?
values.put(TYPE, type);
values.put(THREAD_ID, threadId);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/GroupDescription.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/GroupDescription.kt
index 62d48aa524..dd642beb59 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/GroupDescription.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/GroupDescription.kt
@@ -13,6 +13,7 @@ import network.loki.messenger.R
import org.session.libsignal.utilities.logging.Log
import java.io.IOException
+//TODO Brice: that class should be deprecated
class GroupDescription(context: Context, groupContext: SignalServiceProtos.GroupContext?) {
private val context: Context
private val groupContext: SignalServiceProtos.GroupContext?
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java
index 77eee247cd..5a60e291c4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java
@@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.session.libsession.messaging.threads.Address;
import org.session.libsession.messaging.threads.recipients.Recipient;
+import org.session.libsession.messaging.utilities.UpdateMessageBuilder;
import org.session.libsession.utilities.SSKEnvironment;
import org.session.libsignal.libsignal.util.guava.Optional;
import org.session.libsignal.service.api.messages.SignalServiceGroup;
@@ -78,10 +79,11 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM
GroupContext groupContext = content.getDataMessage().getGroup();
groupInfo = Optional.of(new SignalServiceGroup(groupContext.getId().toByteArray(), SignalServiceGroup.GroupType.SIGNAL));
}
+ String updateMessage = UpdateMessageBuilder.INSTANCE.buildExpirationTimerMessage(context, duration, senderPublicKey, false);
IncomingMediaMessage mediaMessage = new IncomingMediaMessage(address, content.getDataMessage().getTimestamp(), -1,
duration * 1000L, true,
false,
- Optional.absent(),
+ Optional.of(updateMessage),
groupInfo,
Optional.absent(),
Optional.absent(),
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3c707cd5c7..ac5121c1d7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -501,6 +501,7 @@
%1$s added %2$s to the group.
You removed %1$s from the group.
%1$s removed %2$s from the group.
+ You were removed from the group.
You called
Contact called
Missed call
diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingExpirationUpdateMessage.java b/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingExpirationUpdateMessage.java
index 77996ba11e..3fac6292f2 100644
--- a/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingExpirationUpdateMessage.java
+++ b/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingExpirationUpdateMessage.java
@@ -10,15 +10,15 @@ import java.util.LinkedList;
public class OutgoingExpirationUpdateMessage extends OutgoingSecureMediaMessage {
- public OutgoingExpirationUpdateMessage(Recipient recipient, long sentTimeMillis, long expiresIn) {
- super(recipient, "", new LinkedList(), sentTimeMillis,
+ public OutgoingExpirationUpdateMessage(Recipient recipient, String body, long sentTimeMillis, long expiresIn) {
+ super(recipient, body, new LinkedList(), sentTimeMillis,
DistributionTypes.CONVERSATION, expiresIn, null, Collections.emptyList(),
Collections.emptyList());
}
public static OutgoingExpirationUpdateMessage from(ExpirationTimerUpdate message,
- Recipient recipient) {
- return new OutgoingExpirationUpdateMessage(recipient, message.getSentTimestamp(), message.getDuration() * 1000);
+ Recipient recipient, String body) {
+ return new OutgoingExpirationUpdateMessage(recipient, body, message.getSentTimestamp(), message.getDuration() * 1000);
}
@Override
diff --git a/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageBuilder.kt b/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageBuilder.kt
index bcc0d4761b..367e549c02 100644
--- a/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageBuilder.kt
+++ b/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageBuilder.kt
@@ -1,19 +1,23 @@
package org.session.libsession.messaging.utilities
import android.content.Context
+import android.text.SpannableString
import org.session.libsession.R
import org.session.libsession.messaging.MessagingConfiguration
+import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate
+import org.session.libsession.utilities.ExpirationUtil
import org.session.libsignal.service.api.messages.SignalServiceGroup
-import org.session.libsignal.service.internal.push.SignalServiceProtos
object UpdateMessageBuilder {
- fun buildGroupUpdateMessage(context: Context, groupInfo: SignalServiceGroup, sender: String, isOutgoing: Boolean = false): String {
+ fun buildGroupUpdateMessage(context: Context, groupInfo: SignalServiceGroup, sender: String? = null, isOutgoing: Boolean = false): String {
val updateType = groupInfo.type
- val senderName: String = if (!isOutgoing) {
- MessagingConfiguration.shared.storage.getDisplayNameForRecipient(sender) ?: sender
- } else { sender }
var message: String = ""
+ if (!isOutgoing && sender == null) return message
+ val senderName: String? = if (!isOutgoing) {
+ MessagingConfiguration.shared.storage.getDisplayNameForRecipient(sender!!) ?: sender
+ } else { sender }
+
when (updateType) {
SignalServiceGroup.Type.NEW_GROUP -> {
message = if (isOutgoing) {
@@ -40,13 +44,25 @@ object UpdateMessageBuilder {
}
}
SignalServiceGroup.Type.MEMBER_REMOVED -> {
- val members = groupInfo.members.get().joinToString(", ") {
- MessagingConfiguration.shared.storage.getDisplayNameForRecipient(it) ?: it
- }
- message = if (isOutgoing) {
- context.getString(R.string.MessageRecord_you_removed_s_from_the_group, members)
+ val storage = MessagingConfiguration.shared.storage
+ val userPublicKey = storage.getUserPublicKey()!!
+ // 1st case: you are part of the removed members
+ message = if (userPublicKey in groupInfo.members.get()) {
+ if (isOutgoing) {
+ 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_s_removed_s_from_the_group, senderName, members)
+ // 2nd case: you are not part of the removed members
+ val members = groupInfo.members.get().joinToString(", ") {
+ storage.getDisplayNameForRecipient(it) ?: it
+ }
+ if (isOutgoing) {
+ 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)
+ }
}
}
SignalServiceGroup.Type.QUIT -> {
@@ -63,8 +79,20 @@ object UpdateMessageBuilder {
return message
}
- fun buildExpirationTimerMessage(): String {
- return ""
+ fun buildExpirationTimerMessage(context: Context, duration: Int, sender: String? = null, isOutgoing: Boolean = false): String {
+ val seconds = (duration!! / 1000)
+ if (!isOutgoing && sender == null) return ""
+ val senderName: String? = if (!isOutgoing) {
+ MessagingConfiguration.shared.storage.getDisplayNameForRecipient(sender!!) ?: sender
+ } else { sender }
+ return if (seconds <= 0) {
+ if (isOutgoing) context.getString(R.string.MessageRecord_you_disabled_disappearing_messages)
+ else context.getString(R.string.MessageRecord_s_disabled_disappearing_messages, senderName)
+ } else {
+ val time = ExpirationUtil.getExpirationDisplayValue(context, seconds)
+ if (isOutgoing)context.getString(R.string.MessageRecord_you_set_disappearing_message_time_to_s, time)
+ else context.getString(R.string.MessageRecord_s_set_disappearing_message_time_to_s, senderName, time)
+ }
}
fun buildDataExtractionMessage(): String {
diff --git a/libsession/src/main/res/values/strings.xml b/libsession/src/main/res/values/strings.xml
index ea6a33b70b..90cbb92869 100644
--- a/libsession/src/main/res/values/strings.xml
+++ b/libsession/src/main/res/values/strings.xml
@@ -495,6 +495,7 @@
%1$s added %2$s to the group.
You removed %1$s from the group.
%1$s removed %2$s from the group.
+ You were removed from the group.
You called
Contact called
Missed call