Update group update messages faster.

This commit is contained in:
Greyson Parrelli
2022-03-17 14:24:17 -04:00
committed by Cody Henthorne
parent f91494f813
commit 945c308cf5
7 changed files with 50 additions and 55 deletions

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.database.model;
import android.content.Context;
import androidx.annotation.DrawableRes;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
@@ -763,11 +764,9 @@ final class GroupsV2UpdateMessageProducer {
interface DescribeMemberStrategy {
/**
* Map an ACI to a string that describes the group member.
* @param serviceId
* Map a ServiceId to a string that describes the group member.
*/
@NonNull
@WorkerThread
String describe(@NonNull ServiceId serviceId);
}

View File

@@ -12,8 +12,10 @@ import android.text.SpannableStringBuilder;
import androidx.annotation.AnyThread;
import androidx.annotation.ColorInt;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Transformations;
import com.annimon.stream.Stream;
@@ -34,11 +36,12 @@ public final class LiveUpdateMessage {
* Creates a live data that observes the recipients mentioned in the {@link UpdateDescription} and
* recreates the string asynchronously when they change.
*/
@AnyThread
@MainThread
public static LiveData<SpannableString> fromMessageDescription(@NonNull Context context,
@NonNull UpdateDescription updateDescription,
@ColorInt int defaultTint,
boolean adjustPosition) {
boolean adjustPosition)
{
if (updateDescription.isStringStatic()) {
return LiveDataUtil.just(toSpannable(context, updateDescription, updateDescription.getStaticString(), defaultTint, adjustPosition));
}
@@ -50,16 +53,17 @@ public final class LiveUpdateMessage {
LiveData<?> mentionedRecipientChangeStream = allMentionedRecipients.isEmpty() ? LiveDataUtil.just(new Object())
: LiveDataUtil.merge(allMentionedRecipients);
return LiveDataUtil.mapAsync(mentionedRecipientChangeStream, event -> toSpannable(context, updateDescription, updateDescription.getString(), defaultTint, adjustPosition));
return Transformations.map(mentionedRecipientChangeStream, event -> toSpannable(context, updateDescription, updateDescription.getString(), defaultTint, adjustPosition));
}
/**
* Observes a single recipient and recreates the string asynchronously when they change.
*/
@MainThread
public static LiveData<SpannableString> recipientToStringAsync(@NonNull RecipientId recipientId,
@NonNull Function<Recipient, SpannableString> createStringInBackground)
{
return LiveDataUtil.mapAsync(Recipient.live(recipientId).getLiveDataResolved(), createStringInBackground);
return Transformations.map(Recipient.live(recipientId).getLiveDataResolved(), createStringInBackground::apply);
}
private static @NonNull SpannableString toSpannable(@NonNull Context context, @NonNull UpdateDescription updateDescription, @NonNull String string, @ColorInt int defaultTint, boolean adjustPosition) {

View File

@@ -22,7 +22,6 @@ import java.util.Set;
public final class UpdateDescription {
public interface StringFactory {
@WorkerThread
String create();
}
@@ -109,14 +108,12 @@ public final class UpdateDescription {
return staticString;
}
ThreadUtil.assertNotMainThread();
//noinspection ConstantConditions
return stringFactory.create();
}
@AnyThread
public Collection<ServiceId> getMentioned() {
public @NonNull Collection<ServiceId> getMentioned() {
return mentioned;
}