From 2a7d515932d38fff239b85179fc9c689a1fb37ad Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 30 Mar 2022 14:57:40 -0300 Subject: [PATCH] Add handler to My Stories row to open my stories If there are sent group stories. --- .../securesms/stories/landing/MyStoriesItem.kt | 8 ++++++-- .../stories/landing/StoriesLandingFragment.kt | 8 ++++++++ .../stories/landing/StoriesLandingRepository.kt | 15 +++++++++++---- .../stories/landing/StoriesLandingState.kt | 1 + .../stories/landing/StoriesLandingViewModel.kt | 5 +++-- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/MyStoriesItem.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/MyStoriesItem.kt index 9c6aa4724..839682013 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/MyStoriesItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/MyStoriesItem.kt @@ -20,18 +20,22 @@ object MyStoriesItem { } class Model( - val onClick: () -> Unit + val hasOutgoingStories: Boolean, + val onClick: (Boolean) -> Unit, + val onClickThumbnail: () -> Unit ) : PreferenceModel() { override fun areItemsTheSame(newItem: Model): Boolean = true } private class ViewHolder(itemView: View) : MappingViewHolder(itemView) { + private val thumbnail: View = itemView.findViewById(R.id.story) private val avatarView: AvatarView = itemView.findViewById(R.id.avatar) private val badgeView: BadgeImageView = itemView.findViewById(R.id.badge) override fun bind(model: Model) { - itemView.setOnClickListener { model.onClick() } + itemView.setOnClickListener { model.onClick(model.hasOutgoingStories) } + thumbnail.setOnClickListener { model.onClickThumbnail() } avatarView.displayProfileAvatar(Recipient.self()) badgeView.setBadgeFromRecipient(Recipient.self()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt index a45365002..2ecb4e5fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt @@ -110,7 +110,15 @@ class StoriesLandingFragment : DSLSettingsFragment(layoutId = R.layout.stories_l if (state.displayMyStoryItem) { customPref( MyStoriesItem.Model( + state.hasOutgoingGroupStories, onClick = { + if (it) { + startActivity(Intent(requireContext(), MyStoriesActivity::class.java)) + } else { + cameraFab.performClick() + } + }, + onClickThumbnail = { cameraFab.performClick() } ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingRepository.kt index b12a0a84a..b9e2f3938 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingRepository.kt @@ -26,19 +26,21 @@ class StoriesLandingRepository(context: Context) { }.subscribeOn(Schedulers.io()) } - fun getStories(): Observable> { - return Observable.create>> { emitter -> + fun getStories(): Observable { + return Observable.create> { emitter -> val myStoriesId = SignalDatabase.recipients.getOrInsertFromDistributionListId(DistributionListId.MY_STORY) val myStories = Recipient.resolved(myStoriesId) fun refresh() { val storyMap = mutableMapOf>() + var hasOutgoingGroupStories = false SignalDatabase.mms.allStories.use { while (it.next != null) { val messageRecord = it.current val recipient = if (messageRecord.isOutgoing && !messageRecord.recipient.isGroup) { myStories } else if (messageRecord.isOutgoing && messageRecord.recipient.isGroup) { + hasOutgoingGroupStories = true messageRecord.recipient } else { SignalDatabase.threads.getRecipientForThreadId(messageRecord.threadId)!! @@ -50,9 +52,9 @@ class StoriesLandingRepository(context: Context) { val data: List> = storyMap.map { (sender, records) -> createStoriesLandingItemData(sender, records) } if (data.isEmpty()) { - emitter.onNext(Observable.just(emptyList())) + emitter.onNext(Observable.just(StoriesResult(emptyList(), false))) } else { - emitter.onNext(Observable.combineLatest(data) { it.toList() as List }) + emitter.onNext(Observable.combineLatest(data) { StoriesResult(it.toList() as List, hasOutgoingGroupStories) }) } } @@ -120,4 +122,9 @@ class StoriesLandingRepository(context: Context) { SignalDatabase.recipients.setHideStory(recipientId, hideStory) }.subscribeOn(Schedulers.io()) } + + data class StoriesResult( + val data: List, + val hasOutgoingGroupStories: Boolean + ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingState.kt index f82d9a1c7..509c66eb4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingState.kt @@ -4,6 +4,7 @@ data class StoriesLandingState( val storiesLandingItems: List = emptyList(), val displayMyStoryItem: Boolean = false, val isHiddenContentVisible: Boolean = false, + val hasOutgoingGroupStories: Boolean = false, val loadingState: LoadingState = LoadingState.INIT ) { enum class LoadingState { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingViewModel.kt index 302d9b31f..a7369e2ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingViewModel.kt @@ -17,12 +17,13 @@ class StoriesLandingViewModel(private val storiesLandingRepository: StoriesLandi val state: LiveData = store.stateLiveData init { - disposables += storiesLandingRepository.getStories().subscribe { stories -> + disposables += storiesLandingRepository.getStories().subscribe { (stories, hasOutgoingGroupStories) -> store.update { state -> state.copy( loadingState = StoriesLandingState.LoadingState.LOADED, storiesLandingItems = stories.sorted(), - displayMyStoryItem = stories.isEmpty() || stories.none { it.storyRecipient.isMyStory } + displayMyStoryItem = stories.isEmpty() || stories.none { it.storyRecipient.isMyStory }, + hasOutgoingGroupStories = hasOutgoingGroupStories ) } }