diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index 4a5d04c8d7..f6b0c11312 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -202,11 +202,11 @@ class ConversationSettingsFragment : DSLSettingsFragment( } } - adapter.submitList(getConfiguration(state).toMappingModelList()) - - if (state.isLoaded) { - (requireView().parent as? ViewGroup)?.doOnPreDraw { - callback.onContentWillRender() + adapter.submitList(getConfiguration(state).toMappingModelList()) { + if (state.isLoaded) { + (requireView().parent as? ViewGroup)?.doOnPreDraw { + callback.onContentWillRender() + } } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsRepository.kt index ffd6213bc9..44eb19b304 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsRepository.kt @@ -23,6 +23,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientUtil import org.thoughtcrime.securesms.util.FeatureFlags +import org.whispersystems.libsignal.util.guava.Optional import java.io.IOException private val TAG = Log.tag(ConversationSettingsRepository::class.java) @@ -32,8 +33,12 @@ class ConversationSettingsRepository( ) { @WorkerThread - fun getThreadMedia(threadId: Long): Cursor { - return DatabaseFactory.getMediaDatabase(context).getGalleryMediaForThread(threadId, MediaDatabase.Sorting.Newest) + fun getThreadMedia(threadId: Long): Optional { + return if (threadId <= 0) { + Optional.absent() + } else { + Optional.of(DatabaseFactory.getMediaDatabase(context).getGalleryMediaForThread(threadId, MediaDatabase.Sorting.Newest)) + } } fun getThreadId(recipientId: RecipientId, consumer: (Long) -> Unit) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsState.kt index 69e1e2ccb6..099d79b339 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsState.kt @@ -15,10 +15,11 @@ data class ConversationSettingsState( val disappearingMessagesLifespan: Int = 0, val canModifyBlockedState: Boolean = false, val sharedMedia: Cursor? = null, + private val sharedMediaLoaded: Boolean = false, private val specificSettingsState: SpecificSettingsState, ) { - val isLoaded: Boolean = recipient != Recipient.UNKNOWN && sharedMedia != null && specificSettingsState.isLoaded + val isLoaded: Boolean = recipient != Recipient.UNKNOWN && sharedMediaLoaded && specificSettingsState.isLoaded fun withRecipientSettingsState(consumer: (SpecificSettingsState.RecipientSettingsState) -> Unit) { if (specificSettingsState is SpecificSettingsState.RecipientSettingsState) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt index cfb2f56755..19139293e4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt @@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.SingleLiveEvent import org.thoughtcrime.securesms.util.livedata.LiveDataUtil import org.thoughtcrime.securesms.util.livedata.Store +import org.whispersystems.libsignal.util.guava.Optional sealed class ConversationSettingsViewModel( private val repository: ConversationSettingsRepository, @@ -47,16 +48,19 @@ sealed class ConversationSettingsViewModel( val threadId: LiveData = Transformations.distinctUntilChanged(Transformations.map(state) { it.threadId }) val updater: LiveData = LiveDataUtil.combineLatest(threadId, sharedMediaUpdateTrigger) { tId, _ -> tId } - val sharedMedia: LiveData = LiveDataUtil.mapAsync(SignalExecutors.BOUNDED, updater) { tId -> + val sharedMedia: LiveData> = LiveDataUtil.mapAsync(SignalExecutors.BOUNDED, updater) { tId -> repository.getThreadMedia(tId) } store.update(sharedMedia) { cursor, state -> if (!cleared) { - openedMediaCursors.add(cursor) - state.copy(sharedMedia = cursor) + if (cursor.isPresent) { + openedMediaCursors.add(cursor.get()) + } + + state.copy(sharedMedia = cursor.orNull(), sharedMediaLoaded = true) } else { - cursor.ensureClosed() + cursor.orNull().ensureClosed() state.copy(sharedMedia = null) } }