diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationArgs.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationArgs.kt index e3c2c988a5..bffa34aaa1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationArgs.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationArgs.kt @@ -13,9 +13,12 @@ import org.signal.core.models.UriSerializer import org.signal.core.models.media.Media import org.thoughtcrime.securesms.badges.models.Badge import org.thoughtcrime.securesms.conversation.ConversationIntents.ConversationScreenType +import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.mms.SlideFactory +import org.thoughtcrime.securesms.recipients.Recipient.Companion.resolved import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.stickers.StickerLocator +import org.thoughtcrime.securesms.wallpaper.ChatWallpaper @Serializable @Parcelize @@ -40,6 +43,14 @@ data class ConversationArgs( @IgnoredOnParcel val draftMediaType: SlideFactory.MediaType? = SlideFactory.MediaType.from(draftContentType) + @IgnoredOnParcel + val wallpaper: ChatWallpaper? + get() = resolved(recipientId).wallpaper + + @IgnoredOnParcel + val chatColors: ChatColors + get() = resolved(recipientId).chatColors + fun canInitializeFromDatabase(): Boolean { return draftText == null && (draftMedia == null || ConversationIntents.isBubbleIntentUri(draftMedia) || ConversationIntents.isNotificationIntentUri(draftMedia)) && draftMediaType == null } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index ee1f40af3d..735183df37 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -480,7 +480,8 @@ class ConversationFragment : repository = ConversationRepository(localContext = requireContext(), isInBubble = args.conversationScreenType == ConversationScreenType.BUBBLE), recipientRepository = conversationRecipientRepository, messageRequestRepository = messageRequestRepository, - scheduledMessagesRepository = ScheduledMessagesRepository() + scheduledMessagesRepository = ScheduledMessagesRepository(), + initialChatColors = args.chatColors ) } @@ -686,6 +687,8 @@ class ConversationFragment : incognito = args.isIncognito ) conversationToolbarOnScrollHelper.attach(binding.conversationItemRecycler) + presentWallpaper(args.wallpaper) + presentChatColors(args.chatColors) presentConversationTitle(viewModel.recipientSnapshot) presentGroupConversationSubtitle(createGroupSubtitleString(viewModel.titleViewParticipantsSnapshot)) presentActionBarMenu() @@ -1680,11 +1683,6 @@ class ConversationFragment : presentChatColors(recipient.chatColors) invalidateOptionsMenu() updateMessageRequestAcceptedState(!viewModel.hasMessageRequestState) - - recyclerViewColorizer.setChatColors(recipient.chatColors) - if (adapter.onHasWallpaperChanged(hasWallpaper = recipient.wallpaper != null)) { - conversationItemDecorations.hasWallpaper = recipient.wallpaper != null - } } @MainThread @@ -2151,7 +2149,7 @@ class ConversationFragment : lifecycleOwner = viewLifecycleOwner, requestManager = Glide.with(this), clickListener = ConversationItemClickListener(), - hasWallpaper = viewModel.wallpaperSnapshot != null, + hasWallpaper = args.wallpaper != null, colorizer = colorizer, startExpirationTimeout = viewModel::startExpirationTimeout, chatColorsDataProvider = viewModel::chatColorsSnapshot, @@ -2168,7 +2166,7 @@ class ConversationFragment : adapter.setPagingController(viewModel.pagingController) recyclerViewColorizer = RecyclerViewColorizer(binding.conversationItemRecycler) - viewModel.recipientSnapshot?.chatColors?.let { recyclerViewColorizer.setChatColors(it) } + recyclerViewColorizer.setChatColors(args.chatColors) binding.conversationItemRecycler.adapter = ConcatAdapter(typingIndicatorAdapter, adapter) multiselectItemDecoration = MultiselectItemDecoration( @@ -2205,7 +2203,7 @@ class ConversationFragment : threadHeaderMarginDecoration.toolbarMargin = statusBarInset + resources.getDimensionPixelSize(R.dimen.signal_m3_toolbar_height) + 16.dp binding.conversationItemRecycler.addItemDecoration(threadHeaderMarginDecoration) - conversationItemDecorations = ConversationItemDecorations(hasWallpaper = viewModel.wallpaperSnapshot != null) + conversationItemDecorations = ConversationItemDecorations(hasWallpaper = args.wallpaper != null) binding.conversationItemRecycler.addItemDecoration(conversationItemDecorations, 0) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index 790cbc9a90..c3d17e2b9e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -59,6 +59,7 @@ import org.thoughtcrime.securesms.banner.banners.UnauthorizedBanner import org.thoughtcrime.securesms.contactshare.Contact import org.thoughtcrime.securesms.conversation.ConversationMessage import org.thoughtcrime.securesms.conversation.ScheduledMessagesRepository +import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart import org.thoughtcrime.securesms.conversation.plaintext.PlaintextExportRepository import org.thoughtcrime.securesms.conversation.v2.data.ConversationElementKey @@ -111,6 +112,7 @@ import kotlin.time.Duration class ConversationViewModel( val threadId: Long, requestedStartingPosition: Int, + initialChatColors: ChatColors, private val repository: ConversationRepository, recipientRepository: ConversationRecipientRepository, messageRequestRepository: MessageRequestRepository, @@ -158,7 +160,7 @@ class ConversationViewModel( .observeOn(AndroidSchedulers.mainThread()) private val chatBounds: BehaviorSubject = BehaviorSubject.create() - private val chatColors: RxStore = RxStore(ChatColorsDrawable.ChatColorsData(null, null)) + private val chatColors: RxStore = RxStore(ChatColorsDrawable.ChatColorsData(initialChatColors, null)) val chatColorsSnapshot: ChatColorsDrawable.ChatColorsData get() = chatColors.state @Volatile