diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java index c5ef05e76e..413886f3e8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java @@ -187,9 +187,11 @@ public class ConversationViewModel extends ViewModel { .observeOn(Schedulers.io()) .withLatestFrom(conversationMetadata, (messages, metadata) -> new MessageData(metadata, messages)); + Observable liveRecipient = recipientId.distinctUntilChanged().switchMap(id -> Recipient.live(id).asObservable()); + canShowAsBubble = threadId.observeOn(Schedulers.io()).map(conversationRepository::canShowAsBubble); - wallpaper = recipientCache.map(r -> Optional.ofNullable(r.getWallpaper())).distinctUntilChanged(); - chatColors = recipientCache.map(Recipient::getChatColors).distinctUntilChanged(); + wallpaper = liveRecipient.map(r -> Optional.ofNullable(r.getWallpaper())).distinctUntilChanged(); + chatColors = liveRecipient.map(Recipient::getChatColors).distinctUntilChanged(); threadAnimationStateStore.update(threadId, (id, state) -> { if (state.getThreadId() == id) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseObserver.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseObserver.java index d9786a9329..299e6d483b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseObserver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseObserver.java @@ -270,7 +270,7 @@ public class DatabaseObserver { } public void notifyRecipientChanged(@NonNull RecipientId recipientId) { - runPostSuccessfulTransaction(KEY_RECIPIENT + recipientId.serialize(), () -> { + SignalDatabase.runPostSuccessfulTransaction(KEY_RECIPIENT + recipientId.serialize(), () -> { Recipient.live(recipientId).refresh(); }); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipient.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipient.java index 4003ea455e..db6c6ae2db 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipient.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipient.java @@ -29,6 +29,8 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicReference; +import io.reactivex.rxjava3.core.Observable; + public final class LiveRecipient { private static final String TAG = Log.tag(LiveRecipient.class); @@ -95,6 +97,19 @@ public final class LiveRecipient { ThreadUtil.runOnMain(() -> observableLiveData.removeObservers(owner)); } + public Observable asObservable() { + return Observable.create(emitter -> { + Recipient current = recipient.get(); + if (current != null && current.getId() != RecipientId.UNKNOWN) { + emitter.onNext(current); + } + + RecipientForeverObserver foreverObserver = emitter::onNext; + observeForever(foreverObserver); + emitter.setCancellable(() -> removeForeverObserver(foreverObserver)); + }); + } + /** * Watch the recipient for changes. The callback could be invoked at any time. You MUST call * {@link #removeForeverObserver(RecipientForeverObserver)} when finished. You should use