Add learned profile name event.
This commit is contained in:
parent
f702338129
commit
184c1b67cc
5 changed files with 78 additions and 14 deletions
|
@ -996,8 +996,10 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
|
||||||
fun insertProfileNameChangeMessages(recipient: Recipient, newProfileName: String, previousProfileName: String) {
|
fun insertProfileNameChangeMessages(recipient: Recipient, newProfileName: String, previousProfileName: String) {
|
||||||
writableDatabase.withinTransaction { db ->
|
writableDatabase.withinTransaction { db ->
|
||||||
val groupRecords = groups.getGroupsContainingMember(recipient.id, false)
|
val groupRecords = groups.getGroupsContainingMember(recipient.id, false)
|
||||||
val profileChangeDetails = ProfileChangeDetails(profileNameChange = ProfileChangeDetails.StringChange(previous = previousProfileName, newValue = newProfileName))
|
|
||||||
.encode()
|
val extras = MessageExtras(
|
||||||
|
profileChangeDetails = ProfileChangeDetails(profileNameChange = ProfileChangeDetails.StringChange(previous = previousProfileName, newValue = newProfileName))
|
||||||
|
)
|
||||||
|
|
||||||
val threadIdsToUpdate = mutableListOf<Long?>().apply {
|
val threadIdsToUpdate = mutableListOf<Long?>().apply {
|
||||||
add(threads.getThreadIdFor(recipient.id))
|
add(threads.getThreadIdFor(recipient.id))
|
||||||
|
@ -1020,7 +1022,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
|
||||||
READ to 1,
|
READ to 1,
|
||||||
TYPE to MessageTypes.PROFILE_CHANGE_TYPE,
|
TYPE to MessageTypes.PROFILE_CHANGE_TYPE,
|
||||||
THREAD_ID to threadId,
|
THREAD_ID to threadId,
|
||||||
BODY to Base64.encodeWithPadding(profileChangeDetails)
|
MESSAGE_EXTRAS to extras.encode()
|
||||||
)
|
)
|
||||||
db.insert(TABLE_NAME, null, values)
|
db.insert(TABLE_NAME, null, values)
|
||||||
notifyConversationListeners(threadId)
|
notifyConversationListeners(threadId)
|
||||||
|
@ -1029,6 +1031,33 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun insertLearnedProfileNameChangeMessage(recipient: Recipient, previousDisplayName: String) {
|
||||||
|
val threadId: Long? = SignalDatabase.threads.getThreadIdFor(recipient.id)
|
||||||
|
|
||||||
|
if (threadId != null) {
|
||||||
|
val extras = MessageExtras(
|
||||||
|
profileChangeDetails = ProfileChangeDetails(learnedProfileName = ProfileChangeDetails.StringChange(previous = previousDisplayName))
|
||||||
|
)
|
||||||
|
|
||||||
|
writableDatabase
|
||||||
|
.insertInto(TABLE_NAME)
|
||||||
|
.values(
|
||||||
|
FROM_RECIPIENT_ID to recipient.id.serialize(),
|
||||||
|
FROM_DEVICE_ID to 1,
|
||||||
|
TO_RECIPIENT_ID to Recipient.self().id.serialize(),
|
||||||
|
DATE_RECEIVED to System.currentTimeMillis(),
|
||||||
|
DATE_SENT to System.currentTimeMillis(),
|
||||||
|
READ to 1,
|
||||||
|
TYPE to MessageTypes.PROFILE_CHANGE_TYPE,
|
||||||
|
THREAD_ID to threadId,
|
||||||
|
MESSAGE_EXTRAS to extras.encode()
|
||||||
|
)
|
||||||
|
.run()
|
||||||
|
|
||||||
|
notifyConversationListeners(threadId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun insertGroupV1MigrationEvents(recipientId: RecipientId, threadId: Long, membershipChange: GroupMigrationMembershipChange) {
|
fun insertGroupV1MigrationEvents(recipientId: RecipientId, threadId: Long, membershipChange: GroupMigrationMembershipChange) {
|
||||||
insertGroupV1MigrationNotification(recipientId, threadId)
|
insertGroupV1MigrationNotification(recipientId, threadId)
|
||||||
if (!membershipChange.isEmpty) {
|
if (!membershipChange.isEmpty) {
|
||||||
|
|
|
@ -227,7 +227,7 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||||
if (isOutgoing()) return fromRecipient(getToRecipient(), r -> context.getString(R.string.MessageRecord_you_marked_your_safety_number_with_s_unverified, r.getDisplayName(context)), R.drawable.ic_update_info_16);
|
if (isOutgoing()) return fromRecipient(getToRecipient(), r -> context.getString(R.string.MessageRecord_you_marked_your_safety_number_with_s_unverified, r.getDisplayName(context)), R.drawable.ic_update_info_16);
|
||||||
else return fromRecipient(getFromRecipient(), r -> context.getString(R.string.MessageRecord_you_marked_your_safety_number_with_s_unverified_from_another_device, r.getDisplayName(context)), R.drawable.ic_update_info_16);
|
else return fromRecipient(getFromRecipient(), r -> context.getString(R.string.MessageRecord_you_marked_your_safety_number_with_s_unverified_from_another_device, r.getDisplayName(context)), R.drawable.ic_update_info_16);
|
||||||
} else if (isProfileChange()) {
|
} else if (isProfileChange()) {
|
||||||
return staticUpdateDescription(getProfileChangeDescription(context), R.drawable.ic_update_profile_16);
|
return getProfileChangeDescription(context);
|
||||||
} else if (isChangeNumber()) {
|
} else if (isChangeNumber()) {
|
||||||
return fromRecipient(getFromRecipient(), r -> context.getString(R.string.MessageRecord_s_changed_their_phone_number, r.getDisplayName(context)), R.drawable.ic_phone_16);
|
return fromRecipient(getFromRecipient(), r -> context.getString(R.string.MessageRecord_s_changed_their_phone_number, r.getDisplayName(context)), R.drawable.ic_phone_16);
|
||||||
} else if (isBoostRequest()) {
|
} else if (isBoostRequest()) {
|
||||||
|
@ -299,7 +299,7 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||||
return selfCreatedGroup(change);
|
return selfCreatedGroup(change);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable public MessageExtras getMessageExtras() {
|
public @Nullable MessageExtras getMessageExtras() {
|
||||||
return messageExtras;
|
return messageExtras;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,27 +432,41 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||||
return UpdateDescription.staticDescription(string, iconResource, lightTint, darkTint);
|
return UpdateDescription.staticDescription(string, iconResource, lightTint, darkTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
private @NonNull String getProfileChangeDescription(@NonNull Context context) {
|
private @NonNull UpdateDescription getProfileChangeDescription(@NonNull Context context) {
|
||||||
|
ProfileChangeDetails profileChangeDetails = null;
|
||||||
|
|
||||||
|
MessageExtras extras = getMessageExtras();
|
||||||
|
if (extras != null) {
|
||||||
|
profileChangeDetails = extras.profileChangeDetails;
|
||||||
|
} else {
|
||||||
try {
|
try {
|
||||||
byte[] decoded = Base64.decode(getBody());
|
byte[] decoded = Base64.decode(getBody());
|
||||||
ProfileChangeDetails profileChangeDetails = ProfileChangeDetails.ADAPTER.decode(decoded);
|
profileChangeDetails = ProfileChangeDetails.ADAPTER.decode(decoded);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.w(TAG, "Profile name change details could not be read", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (profileChangeDetails != null) {
|
||||||
if (profileChangeDetails.profileNameChange != null) {
|
if (profileChangeDetails.profileNameChange != null) {
|
||||||
String displayName = getFromRecipient().getDisplayName(context);
|
String displayName = getFromRecipient().getDisplayName(context);
|
||||||
String newName = StringUtil.isolateBidi(ProfileName.fromSerialized(profileChangeDetails.profileNameChange.newValue).toString());
|
String newName = StringUtil.isolateBidi(ProfileName.fromSerialized(profileChangeDetails.profileNameChange.newValue).toString());
|
||||||
String previousName = StringUtil.isolateBidi(ProfileName.fromSerialized(profileChangeDetails.profileNameChange.previous).toString());
|
String previousName = StringUtil.isolateBidi(ProfileName.fromSerialized(profileChangeDetails.profileNameChange.previous).toString());
|
||||||
|
|
||||||
|
String updateMessage;
|
||||||
if (getFromRecipient().isSystemContact()) {
|
if (getFromRecipient().isSystemContact()) {
|
||||||
return context.getString(R.string.MessageRecord_changed_their_profile_name_from_to, displayName, previousName, newName);
|
updateMessage = context.getString(R.string.MessageRecord_changed_their_profile_name_from_to, displayName, previousName, newName);
|
||||||
} else {
|
} else {
|
||||||
return context.getString(R.string.MessageRecord_changed_their_profile_name_to, previousName, newName);
|
updateMessage = context.getString(R.string.MessageRecord_changed_their_profile_name_to, previousName, newName);
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.w(TAG, "Profile name change details could not be read", e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.getString(R.string.MessageRecord_changed_their_profile, getFromRecipient().getDisplayName(context));
|
return staticUpdateDescription(updateMessage, R.drawable.ic_update_profile_16);
|
||||||
|
} else if (profileChangeDetails.learnedProfileName != null) {
|
||||||
|
return staticUpdateDescription(context.getString(R.string.MessageRecord_started_this_chat, profileChangeDetails.learnedProfileName.previous), R.drawable.symbol_thread_16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return staticUpdateDescription(context.getString(R.string.MessageRecord_changed_their_profile, getFromRecipient().getDisplayName(context)), R.drawable.ic_update_profile_16);
|
||||||
}
|
}
|
||||||
|
|
||||||
private UpdateDescription getGroupMigrationEventDescription(@NonNull Context context) {
|
private UpdateDescription getGroupMigrationEventDescription(@NonNull Context context) {
|
||||||
|
|
|
@ -54,6 +54,12 @@ class RetrieveProfileJob private constructor(parameters: Parameters, private val
|
||||||
constructor(recipientIds: Set<RecipientId>) : this(
|
constructor(recipientIds: Set<RecipientId>) : this(
|
||||||
Parameters.Builder()
|
Parameters.Builder()
|
||||||
.addConstraint(NetworkConstraint.KEY)
|
.addConstraint(NetworkConstraint.KEY)
|
||||||
|
.apply {
|
||||||
|
if (recipientIds.size < 5) {
|
||||||
|
setQueue(recipientIds.map { it.toLong() }.sorted().joinToString(separator = "_", prefix = QUEUE_PREFIX))
|
||||||
|
setMaxInstancesForQueue(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
.setMaxAttempts(3)
|
.setMaxAttempts(3)
|
||||||
.build(),
|
.build(),
|
||||||
recipientIds.toMutableSet()
|
recipientIds.toMutableSet()
|
||||||
|
@ -364,6 +370,16 @@ class RetrieveProfileJob private constructor(parameters: Parameters, private val
|
||||||
val remoteProfileName = ProfileName.fromSerialized(plaintextProfileName)
|
val remoteProfileName = ProfileName.fromSerialized(plaintextProfileName)
|
||||||
val localProfileName = recipient.profileName
|
val localProfileName = recipient.profileName
|
||||||
|
|
||||||
|
if (localProfileName.isEmpty &&
|
||||||
|
!recipient.isSystemContact &&
|
||||||
|
recipient.isProfileSharing &&
|
||||||
|
!recipient.isGroup &&
|
||||||
|
!recipient.isSelf
|
||||||
|
) {
|
||||||
|
Log.i(TAG, "Learned profile name for first time, insert event")
|
||||||
|
SignalDatabase.messages.insertLearnedProfileNameChangeMessage(recipient, recipient.getDisplayName(context))
|
||||||
|
}
|
||||||
|
|
||||||
if (remoteProfileName != localProfileName) {
|
if (remoteProfileName != localProfileName) {
|
||||||
Log.i(TAG, "Profile name updated. Writing new value.")
|
Log.i(TAG, "Profile name updated. Writing new value.")
|
||||||
SignalDatabase.recipients.setProfileName(recipient.id, remoteProfileName)
|
SignalDatabase.recipients.setProfileName(recipient.id, remoteProfileName)
|
||||||
|
@ -490,6 +506,7 @@ class RetrieveProfileJob private constructor(parameters: Parameters, private val
|
||||||
private val TAG = Log.tag(RetrieveProfileJob::class.java)
|
private val TAG = Log.tag(RetrieveProfileJob::class.java)
|
||||||
private const val KEY_RECIPIENTS = "recipients"
|
private const val KEY_RECIPIENTS = "recipients"
|
||||||
private const val DEDUPE_KEY_RETRIEVE_AVATAR = KEY + "_RETRIEVE_PROFILE_AVATAR"
|
private const val DEDUPE_KEY_RETRIEVE_AVATAR = KEY + "_RETRIEVE_PROFILE_AVATAR"
|
||||||
|
private const val QUEUE_PREFIX = "RetrieveProfileJob_"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Submits the necessary job to refresh the profile of the requested recipient. Works for any
|
* Submits the necessary job to refresh the profile of the requested recipient. Works for any
|
||||||
|
|
|
@ -73,6 +73,7 @@ message ProfileChangeDetails {
|
||||||
}
|
}
|
||||||
|
|
||||||
StringChange profileNameChange = 1;
|
StringChange profileNameChange = 1;
|
||||||
|
StringChange learnedProfileName = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message BodyRangeList {
|
message BodyRangeList {
|
||||||
|
@ -379,6 +380,7 @@ message MessageExtras {
|
||||||
oneof extra {
|
oneof extra {
|
||||||
GV2UpdateDescription gv2UpdateDescription = 1;
|
GV2UpdateDescription gv2UpdateDescription = 1;
|
||||||
signalservice.GroupContext gv1Context = 2;
|
signalservice.GroupContext gv1Context = 2;
|
||||||
|
ProfileChangeDetails profileChangeDetails = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1386,6 +1386,8 @@
|
||||||
<string name="MessageRecord_changed_their_profile_name_to">%1$s changed their profile name to %2$s.</string>
|
<string name="MessageRecord_changed_their_profile_name_to">%1$s changed their profile name to %2$s.</string>
|
||||||
<string name="MessageRecord_changed_their_profile_name_from_to">%1$s changed their profile name from %2$s to %3$s.</string>
|
<string name="MessageRecord_changed_their_profile_name_from_to">%1$s changed their profile name from %2$s to %3$s.</string>
|
||||||
<string name="MessageRecord_changed_their_profile">%1$s changed their profile.</string>
|
<string name="MessageRecord_changed_their_profile">%1$s changed their profile.</string>
|
||||||
|
<!-- Conversation update event message shown when you've started a conversation by phone number or username and then learn their profile name. placeholder is username or phone number -->
|
||||||
|
<string name="MessageRecord_started_this_chat">You started this chat with %1$s.</string>
|
||||||
|
|
||||||
<!-- GV2 specific -->
|
<!-- GV2 specific -->
|
||||||
<string name="MessageRecord_you_created_the_group">You created the group.</string>
|
<string name="MessageRecord_you_created_the_group">You created the group.</string>
|
||||||
|
|
Loading…
Add table
Reference in a new issue