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 e5017d354..48ffc0879 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 @@ -127,6 +127,9 @@ class StoriesLandingFragment : onRowClick = { if (it.data.storyRecipient.isMyStory) { startActivity(Intent(requireContext(), MyStoriesActivity::class.java)) + } else if (it.data.primaryStory.messageRecord.isOutgoing && it.data.primaryStory.messageRecord.isFailed) { + lifecycleDisposable += viewModel.resend(it.data.primaryStory.messageRecord).subscribe() + Toast.makeText(requireContext(), R.string.message_recipients_list_item__resend, Toast.LENGTH_SHORT).show() } else { startActivity(StoryViewerActivity.createIntent(requireContext(), it.data.storyRecipient.id)) } 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 14b2bdbd5..e21351621 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 @@ -14,11 +14,18 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientForeverObserver import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.sms.MessageSender class StoriesLandingRepository(context: Context) { private val context = context.applicationContext + fun resend(story: MessageRecord): Completable { + return Completable.fromAction { + MessageSender.resend(context, story) + }.subscribeOn(Schedulers.io()) + } + fun getStories(): Observable> { return Observable.create>> { emitter -> val myStoriesId = SignalDatabase.recipients.getOrInsertFromDistributionListId(DistributionListId.MY_STORY) 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 2a11501f4..302d9b31f 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 @@ -6,6 +6,7 @@ import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.core.Completable 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.util.livedata.Store @@ -31,6 +32,10 @@ class StoriesLandingViewModel(private val storiesLandingRepository: StoriesLandi disposables.clear() } + fun resend(story: MessageRecord): Completable { + return storiesLandingRepository.resend(story) + } + fun setHideStory(sender: Recipient, hide: Boolean): Completable { return storiesLandingRepository.setHideStory(sender.id, hide) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesFragment.kt index 62acefc1f..18e918e1c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesFragment.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.stories.my +import android.widget.Toast import androidx.fragment.app.viewModels import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.DSLConfiguration @@ -56,8 +57,13 @@ class MyStoriesFragment : DSLSettingsFragment( MyStoriesItem.Model( distributionStory = conversationMessage, onClick = { - // TODO [stories] pass in something more specific to start with the correct progress - startActivity(StoryViewerActivity.createIntent(requireContext(), Recipient.self().id)) + if (it.distributionStory.messageRecord.isOutgoing && it.distributionStory.messageRecord.isFailed) { + lifecycleDisposable += viewModel.resend(it.distributionStory.messageRecord).subscribe() + Toast.makeText(requireContext(), R.string.message_recipients_list_item__resend, Toast.LENGTH_SHORT).show() + } else { + // TODO [stories] pass in something more specific to start with the correct progress + startActivity(StoryViewerActivity.createIntent(requireContext(), Recipient.self().id)) + } }, onSaveClick = { StoryContextMenu.save(requireContext(), it.distributionStory.messageRecord) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesRepository.kt index 5e5cd5641..c285079d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesRepository.kt @@ -1,18 +1,27 @@ package org.thoughtcrime.securesms.stories.my import android.content.Context +import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.schedulers.Schedulers import org.thoughtcrime.securesms.conversation.ConversationMessage import org.thoughtcrime.securesms.database.DatabaseObserver import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.sms.MessageSender class MyStoriesRepository(context: Context) { private val context = context.applicationContext + fun resend(story: MessageRecord): Completable { + return Completable.fromAction { + MessageSender.resend(context, story) + }.subscribeOn(Schedulers.io()) + } + fun getMyStories(): Observable> { return Observable.create { emitter -> fun refresh() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesViewModel.kt index 24fdb7964..5438cb07e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesViewModel.kt @@ -3,8 +3,10 @@ package org.thoughtcrime.securesms.stories.my import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign +import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.util.livedata.Store class MyStoriesViewModel(private val repository: MyStoriesRepository) : ViewModel() { @@ -24,6 +26,10 @@ class MyStoriesViewModel(private val repository: MyStoriesRepository) : ViewMode disposables.clear() } + fun resend(story: MessageRecord): Completable { + return repository.resend(story) + } + class Factory(private val repository: MyStoriesRepository) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return modelClass.cast(MyStoriesViewModel(repository)) as T