Stories: Pass recipients through via constructor.

This commit is contained in:
Alex Hart
2022-04-20 14:33:43 -03:00
parent dfcadde076
commit 8b1552952c
9 changed files with 86 additions and 17 deletions

View File

@@ -1616,7 +1616,8 @@ public class ConversationFragment extends LoggingFragment implements Multiselect
Recipient.resolved(messageRecord.getQuote().getAuthor()).shouldHideStory(),
null,
null,
null
null,
Collections.emptyList()
));
return;

View File

@@ -1244,7 +1244,7 @@ public class ConversationParentFragment extends Fragment
}
private void handleStoryRingClick() {
startActivity(StoryViewerActivity.createIntent(requireContext(), recipient.getId(), -1L, recipient.get().shouldHideStory(), null, null, null));
startActivity(StoryViewerActivity.createIntent(requireContext(), recipient.getId(), -1L, recipient.get().shouldHideStory(), null, null, null, Collections.emptyList()));
}
private void handleConversationSettings() {

View File

@@ -37,6 +37,7 @@ import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.thoughtcrime.securesms.verify.VerifyIdentityActivity;
import java.util.Collections;
import java.util.Objects;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
@@ -140,7 +141,7 @@ final class RecipientDialogViewModel extends ViewModel {
if (storyViewState.getValue() == null || storyViewState.getValue() == StoryViewState.NONE) {
onMessageClicked(activity);
} else {
activity.startActivity(StoryViewerActivity.createIntent(activity, recipientDialogRepository.getRecipientId(), -1L, recipient.getValue().shouldHideStory(), null, null, null));
activity.startActivity(StoryViewerActivity.createIntent(activity, recipientDialogRepository.getRecipientId(), -1L, recipient.getValue().shouldHideStory(), null, null, null, Collections.emptyList()));
}
}
@@ -176,7 +177,7 @@ final class RecipientDialogViewModel extends ViewModel {
if (storyViewState.getValue() == null || storyViewState.getValue() == StoryViewState.NONE) {
activity.startActivity(ConversationSettingsActivity.forRecipient(activity, recipientDialogRepository.getRecipientId()));
} else {
activity.startActivity(StoryViewerActivity.createIntent(activity, recipientDialogRepository.getRecipientId(), -1L, recipient.getValue().shouldHideStory(), null, null, null));
activity.startActivity(StoryViewerActivity.createIntent(activity, recipientDialogRepository.getRecipientId(), -1L, recipient.getValue().shouldHideStory(), null, null, null, Collections.emptyList()));
}
}

View File

@@ -206,7 +206,19 @@ class StoriesLandingFragment : DSLSettingsFragment(layoutId = R.layout.stories_l
null to record.slideDeck.thumbnailSlide?.uri
}
startActivityIfAble(StoryViewerActivity.createIntent(requireContext(), model.data.storyRecipient.id, -1L, model.data.isHidden, text, image, blur), options.toBundle())
startActivityIfAble(
StoryViewerActivity.createIntent(
context = requireContext(),
recipientId = model.data.storyRecipient.id,
storyId = -1L,
onlyIncludeHiddenStories = model.data.isHidden,
storyThumbTextModel = text,
storyThumbUri = image,
storyThumbBlur = blur,
recipientIds = viewModel.getRecipientIds(model.data.isHidden)
),
options.toBundle()
)
}
},
onForwardStory = {

View File

@@ -8,6 +8,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.util.livedata.Store
class StoriesLandingViewModel(private val storiesLandingRepository: StoriesLandingRepository) : ViewModel() {
@@ -45,6 +46,10 @@ class StoriesLandingViewModel(private val storiesLandingRepository: StoriesLandi
store.update { it.copy(isHiddenContentVisible = isExpanded) }
}
fun getRecipientIds(hidden: Boolean): List<RecipientId> {
return store.state.storiesLandingItems.filter { it.isHidden == hidden }.map { it.storyRecipient.id }
}
class Factory(private val storiesLandingRepository: StoriesLandingRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return modelClass.cast(StoriesLandingViewModel(storiesLandingRepository)) as T

View File

@@ -41,7 +41,8 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
intent.getBooleanExtra(ARG_HIDDEN_STORIES, false),
intent.getParcelableExtra(ARG_CROSSFADE_TEXT_MODEL),
intent.getParcelableExtra(ARG_CROSSFADE_IMAGE_URI),
intent.getStringExtra(ARG_CROSSFADE_IMAGE_BLUR)
intent.getStringExtra(ARG_CROSSFADE_IMAGE_BLUR),
intent.getParcelableArrayListExtra(ARG_RECIPIENT_IDS)!!
)
)
.commit()
@@ -61,6 +62,7 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
private const val ARG_CROSSFADE_TEXT_MODEL = "crossfade.text.model"
private const val ARG_CROSSFADE_IMAGE_URI = "crossfade.image.uri"
private const val ARG_CROSSFADE_IMAGE_BLUR = "crossfade.image.blur"
private const val ARG_RECIPIENT_IDS = "recipient_ids"
@JvmStatic
fun createIntent(
@@ -70,7 +72,8 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
onlyIncludeHiddenStories: Boolean = false,
storyThumbTextModel: StoryTextPostModel? = null,
storyThumbUri: Uri? = null,
storyThumbBlur: BlurHash? = null
storyThumbBlur: BlurHash? = null,
recipientIds: List<RecipientId> = emptyList()
): Intent {
return Intent(context, StoryViewerActivity::class.java)
.putExtra(ARG_START_RECIPIENT_ID, recipientId)
@@ -79,6 +82,7 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
.putExtra(ARG_CROSSFADE_TEXT_MODEL, storyThumbTextModel)
.putExtra(ARG_CROSSFADE_IMAGE_URI, storyThumbUri)
.putExtra(ARG_CROSSFADE_IMAGE_BLUR, storyThumbBlur?.hash)
.putParcelableArrayListExtra(ARG_RECIPIENT_IDS, ArrayList(recipientIds))
}
}
}

View File

@@ -24,7 +24,7 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
private val viewModel: StoryViewerViewModel by viewModels(
factoryProducer = {
StoryViewerViewModel.Factory(storyRecipientId, onlyIncludeHiddenStories, storyThumbTextModel, storyThumbUri, storuThumbBlur, StoryViewerRepository())
StoryViewerViewModel.Factory(storyRecipientId, onlyIncludeHiddenStories, storyThumbTextModel, storyThumbUri, storuThumbBlur, recipientIds, StoryViewerRepository())
}
)
@@ -46,6 +46,9 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
private val storuThumbBlur: BlurHash?
get() = requireArguments().getString(ARG_CROSSFADE_IMAGE_BLUR)?.let { BlurHash.parseOrNull(it) }
private val recipientIds: List<RecipientId>
get() = requireArguments().getParcelableArrayList(ARG_RECIPIENT_IDS)!!
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
storyPager = view.findViewById(R.id.story_item_pager)
@@ -113,6 +116,7 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
private const val ARG_CROSSFADE_TEXT_MODEL = "crossfade.text.model"
private const val ARG_CROSSFADE_IMAGE_URI = "crossfade.image.uri"
private const val ARG_CROSSFADE_IMAGE_BLUR = "crossfade.image.blur"
private const val ARG_RECIPIENT_IDS = "start.recipient.ids"
fun create(
storyRecipientId: RecipientId,
@@ -120,7 +124,8 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
onlyIncludeHiddenStories: Boolean,
storyThumbTextModel: StoryTextPostModel? = null,
storyThumbUri: Uri? = null,
storyThumbBlur: String? = null
storyThumbBlur: String? = null,
recipientIds: List<RecipientId> = emptyList()
): Fragment {
return StoryViewerFragment().apply {
arguments = Bundle().apply {
@@ -130,6 +135,7 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
putParcelable(ARG_CROSSFADE_TEXT_MODEL, storyThumbTextModel)
putParcelable(ARG_CROSSFADE_IMAGE_URI, storyThumbUri)
putString(ARG_CROSSFADE_IMAGE_BLUR, storyThumbBlur)
putParcelableArrayList(ARG_RECIPIENT_IDS, ArrayList(recipientIds))
}
}
}

View File

@@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import org.thoughtcrime.securesms.blurhash.BlurHash
@@ -20,6 +21,7 @@ class StoryViewerViewModel(
storyThumbTextModel: StoryTextPostModel?,
storyThumbUri: Uri?,
storyThumbBlur: BlurHash?,
private val recipientIds: List<RecipientId>,
private val repository: StoryViewerRepository,
) : ViewModel() {
@@ -64,9 +66,17 @@ class StoryViewerViewModel(
scrollStatePublisher.value = isScrolling
}
private fun getStories(): Single<List<RecipientId>> {
return if (recipientIds.isNotEmpty()) {
Single.just(recipientIds)
} else {
repository.getStories(onlyIncludeHiddenStories)
}
}
private fun refresh() {
disposables.clear()
disposables += repository.getStories(onlyIncludeHiddenStories).subscribe { recipientIds ->
disposables += getStories().subscribe { recipientIds ->
store.update {
val page: Int = if (it.pages.isNotEmpty()) {
val oldPage = it.page
@@ -157,10 +167,21 @@ class StoryViewerViewModel(
private val storyThumbTextModel: StoryTextPostModel?,
private val storyThumbUri: Uri?,
private val storyThumbBlur: BlurHash?,
private val recipientIds: List<RecipientId>,
private val repository: StoryViewerRepository
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return modelClass.cast(StoryViewerViewModel(startRecipientId, onlyIncludeHiddenStories, storyThumbTextModel, storyThumbUri, storyThumbBlur, repository)) as T
return modelClass.cast(
StoryViewerViewModel(
startRecipientId,
onlyIncludeHiddenStories,
storyThumbTextModel,
storyThumbUri,
storyThumbBlur,
recipientIds,
repository
)
) as T
}
}
}