diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index fd136d3d3c..dccf2ab5ac 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -371,6 +371,11 @@
android:launchMode="singleTop"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
+
+
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/FragmentWrapperActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/FragmentWrapperActivity.kt
index 44bc86425d..d1609bd1d2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/FragmentWrapperActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/FragmentWrapperActivity.kt
@@ -13,10 +13,11 @@ import org.thoughtcrime.securesms.util.DynamicTheme
abstract class FragmentWrapperActivity : PassphraseRequiredActivity() {
protected open val dynamicTheme: DynamicTheme = DynamicNoActionBarTheme()
+ protected open val contentViewId: Int = R.layout.fragment_container
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
super.onCreate(savedInstanceState, ready)
- setContentView(R.layout.fragment_container)
+ setContentView(contentViewId)
dynamicTheme.onCreate(this)
if (savedInstanceState == null) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt
new file mode 100644
index 0000000000..b49c1918de
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt
@@ -0,0 +1,66 @@
+package org.thoughtcrime.securesms.conversation.mutiselect.forward
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.ViewGroup
+import androidx.activity.result.contract.ActivityResultContract
+import androidx.core.content.ContextCompat
+import androidx.fragment.app.Fragment
+import org.thoughtcrime.securesms.R
+import org.thoughtcrime.securesms.components.FragmentWrapperActivity
+import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
+import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment.Companion.RESULT_SELECTION
+
+class MultiselectForwardActivity : FragmentWrapperActivity(), MultiselectForwardFragment.Callback {
+
+ companion object {
+ private const val ARGS = "args"
+ }
+
+ private val args: MultiselectForwardFragmentArgs get() = intent.getParcelableExtra(ARGS)!!
+
+ override val contentViewId: Int = R.layout.multiselect_forward_activity
+
+ override fun getFragment(): Fragment {
+ return MultiselectForwardFragment.create(args)
+ }
+
+ override fun onFinishForwardAction() = Unit
+
+ override fun exitFlow() {
+ onBackPressedDispatcher.onBackPressed()
+ }
+
+ override fun onSearchInputFocused() = Unit
+
+ override fun setResult(bundle: Bundle) {
+ setResult(RESULT_OK, Intent().putExtras(bundle))
+ }
+
+ @Suppress("WrongViewCast")
+ override fun getContainer(): ViewGroup {
+ return findViewById(R.id.fragment_container_wrapper)
+ }
+
+ override fun getDialogBackgroundColor(): Int {
+ return ContextCompat.getColor(this, R.color.signal_colorBackground)
+ }
+
+ class SelectionContract : ActivityResultContract>() {
+ override fun createIntent(context: Context, input: MultiselectForwardFragmentArgs): Intent {
+ return Intent(context, MultiselectForwardActivity::class.java).putExtra(ARGS, input)
+ }
+
+ override fun parseResult(resultCode: Int, intent: Intent?): List {
+ return if (resultCode != RESULT_OK) {
+ emptyList()
+ } else if (intent == null || !intent.hasExtra(RESULT_SELECTION)) {
+ throw IllegalStateException("Selection contract requires a selection.")
+ } else {
+ val selection: List = intent.getParcelableArrayListExtra(RESULT_SELECTION)!!
+ selection.map { it.asRecipientSearchKey() }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt
index b4bfb3ccb4..f87cfa3931 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt
@@ -16,6 +16,7 @@ import android.widget.Toast
import androidx.annotation.PluralsRes
import androidx.annotation.StringRes
import androidx.core.content.ContextCompat
+import androidx.core.os.bundleOf
import androidx.core.view.ViewCompat
import androidx.core.view.doOnNextLayout
import androidx.core.view.isVisible
@@ -41,7 +42,6 @@ import org.thoughtcrime.securesms.mediasend.v2.stories.ChooseGroupStoryBottomShe
import org.thoughtcrime.securesms.mediasend.v2.stories.ChooseStoryTypeBottomSheet
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.safety.SafetyNumberBottomSheet
-import org.thoughtcrime.securesms.sharing.MultiShareArgs
import org.thoughtcrime.securesms.sharing.ShareSelectionAdapter
import org.thoughtcrime.securesms.sharing.ShareSelectionMappingModel
import org.thoughtcrime.securesms.stories.Stories
@@ -93,19 +93,12 @@ class MultiselectForwardFragment :
private var handler: Handler? = null
private fun createViewModelFactory(): MultiselectForwardViewModel.Factory {
- return MultiselectForwardViewModel.Factory(getMultiShareArgs(), isSelectionOnly, MultiselectForwardRepository())
+ return MultiselectForwardViewModel.Factory(args.storySendRequirements, args.multiShareArgs, args.forceSelectionOnly, MultiselectForwardRepository())
}
- private fun getMultiShareArgs(): ArrayList = requireNotNull(requireArguments().getParcelableArrayList(ARG_MULTISHARE_ARGS))
-
- private val forceDisableAddMessage: Boolean
- get() = requireArguments().getBoolean(ARG_FORCE_DISABLE_ADD_MESSAGE, false)
-
- private val isSelectionOnly: Boolean
- get() = requireArguments().getBoolean(ARG_FORCE_SELECTION_ONLY, false)
-
- private val sendButtonTint: Int
- get() = requireArguments().getInt(ARG_SEND_BUTTON_TINT, -1)
+ private val args: MultiselectForwardFragmentArgs by lazy {
+ requireArguments().getParcelable(ARGS)!!
+ }
override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater {
return if (parentFragment != null) {
@@ -119,7 +112,7 @@ class MultiselectForwardFragment :
view.minimumHeight = resources.displayMetrics.heightPixels
contactSearchRecycler = view.findViewById(R.id.contact_selection_list)
- contactSearchMediator = ContactSearchMediator(this, contactSearchRecycler, FeatureFlags.shareSelectionLimit(), !isSingleRecipientSelection(), this::getConfiguration, this::filterContacts)
+ contactSearchMediator = ContactSearchMediator(this, contactSearchRecycler, FeatureFlags.shareSelectionLimit(), !args.selectSingleRecipient, this::getConfiguration, this::filterContacts)
callback = findListener()!!
disposables.bindTo(viewLifecycleOwner.lifecycle)
@@ -147,8 +140,8 @@ class MultiselectForwardFragment :
val sendButton: View = bottomBar.findViewById(R.id.share_confirm)
val backgroundHelper: View = bottomBar.findViewById(R.id.background_helper)
- if (sendButtonTint != -1) {
- ViewCompat.setBackgroundTintList(sendButton, ColorStateList.valueOf(sendButtonTint))
+ if (args.sendButtonTint != -1) {
+ ViewCompat.setBackgroundTintList(sendButton, ColorStateList.valueOf(args.sendButtonTint))
}
FullscreenHelper.configureBottomBarLayout(requireActivity(), bottomBarSpacer, bottomBar)
@@ -156,7 +149,7 @@ class MultiselectForwardFragment :
backgroundHelper.setBackgroundColor(callback.getDialogBackgroundColor())
bottomBarSpacer.setBackgroundColor(callback.getDialogBackgroundColor())
- title?.setText(requireArguments().getInt(ARG_TITLE))
+ title?.setText(args.title)
addMessage = bottomBar.findViewById(R.id.add_message)
@@ -174,7 +167,7 @@ class MultiselectForwardFragment :
onSend(it)
}
- sendButton.visible = !isSingleRecipientSelection()
+ sendButton.visible = !args.selectSingleRecipient
shareSelectionRecycler.adapter = shareSelectionAdapter
@@ -183,14 +176,14 @@ class MultiselectForwardFragment :
container.addView(bottomBarAndSpacer)
contactSearchMediator.getSelectionState().observe(viewLifecycleOwner) { contactSelection ->
- if (contactSelection.isNotEmpty() && isSingleRecipientSelection()) {
+ if (contactSelection.isNotEmpty() && args.selectSingleRecipient) {
onSend(sendButton)
return@observe
}
shareSelectionAdapter.submitList(contactSelection.mapIndexed { index, key -> ShareSelectionMappingModel(key.requireShareContact(), index == 0) })
- addMessage.visible = !forceDisableAddMessage && contactSelection.any { key -> key !is ContactSearchKey.RecipientSearchKey.Story } && getMultiShareArgs().isNotEmpty()
+ addMessage.visible = !args.forceDisableAddMessage && contactSelection.any { key -> key !is ContactSearchKey.RecipientSearchKey.Story } && args.multiShareArgs.isNotEmpty()
if (contactSelection.isNotEmpty() && !bottomBar.isVisible) {
bottomBar.animation = AnimationUtils.loadAnimation(requireContext(), R.anim.slide_fade_from_bottom)
@@ -240,7 +233,7 @@ class MultiselectForwardFragment :
super.onResume()
val now = System.currentTimeMillis()
- val expiringMessages = getMultiShareArgs().filter { it.expiresAt > 0L }
+ val expiringMessages = args.multiShareArgs.filter { it.expiresAt > 0L }
val firstToExpire = expiringMessages.minByOrNull { it.expiresAt }
val earliestExpiration = firstToExpire?.expiresAt ?: -1L
@@ -314,12 +307,12 @@ class MultiselectForwardFragment :
callback.exitFlow()
}
- private fun getMessageCount(): Int = getMultiShareArgs().size + if (addMessage.text.isNotEmpty()) 1 else 0
+ private fun getMessageCount(): Int = args.multiShareArgs.size + if (addMessage.text.isNotEmpty()) 1 else 0
private fun handleMessageExpired() {
callback.onFinishForwardAction()
dismissibleDialog?.dismiss()
- Toast.makeText(requireContext(), resources.getQuantityString(R.plurals.MultiselectForwardFragment__couldnt_forward_messages, getMultiShareArgs().size), Toast.LENGTH_LONG).show()
+ Toast.makeText(requireContext(), resources.getQuantityString(R.plurals.MultiselectForwardFragment__couldnt_forward_messages, args.multiShareArgs.size), Toast.LENGTH_LONG).show()
callback.exitFlow()
}
@@ -435,19 +428,15 @@ class MultiselectForwardFragment :
}
private fun includeSms(): Boolean {
- return Util.isDefaultSmsProvider(requireContext()) && requireArguments().getBoolean(ARG_CAN_SEND_TO_NON_PUSH)
- }
-
- private fun isSingleRecipientSelection(): Boolean {
- return requireArguments().getBoolean(ARG_SELECT_SINGLE_RECIPIENT, false)
+ return Util.isDefaultSmsProvider(requireContext()) && args.canSendToNonPush
}
private fun isSelectedMediaValidForStories(): Boolean {
- return getMultiShareArgs().all { it.isValidForStories }
+ return args.multiShareArgs.all { it.isValidForStories }
}
private fun isSelectedMediaValidForNonStories(): Boolean {
- return getMultiShareArgs().all { it.isValidForNonStories }
+ return args.multiShareArgs.all { it.isValidForNonStories }
}
override fun onGroupStoryClicked() {
@@ -478,13 +467,8 @@ class MultiselectForwardFragment :
}
companion object {
- const val ARG_MULTISHARE_ARGS = "multiselect.forward.fragment.arg.multishare.args"
- const val ARG_CAN_SEND_TO_NON_PUSH = "multiselect.forward.fragment.arg.can.send.to.non.push"
- const val ARG_TITLE = "multiselect.forward.fragment.title"
- const val ARG_FORCE_DISABLE_ADD_MESSAGE = "multiselect.forward.fragment.force.disable.add.message"
- const val ARG_FORCE_SELECTION_ONLY = "multiselect.forward.fragment.force.disable.add.message"
- const val ARG_SELECT_SINGLE_RECIPIENT = "multiselect.forward.framgent.select.single.recipient"
- const val ARG_SEND_BUTTON_TINT = "multiselect.forward.fragment.send.button.tint"
+ const val DIALOG_TITLE = "title"
+ const val ARGS = "args"
const val RESULT_KEY = "result_key"
const val RESULT_SELECTION = "result_selection_recipients"
const val RESULT_SENT = "result_sent"
@@ -506,26 +490,14 @@ class MultiselectForwardFragment :
@JvmStatic
fun create(multiselectForwardFragmentArgs: MultiselectForwardFragmentArgs): Fragment {
return MultiselectForwardFragment().apply {
- arguments = createArgumentsBundle(multiselectForwardFragmentArgs)
+ arguments = bundleOf(ARGS to multiselectForwardFragmentArgs)
}
}
private fun showDialogFragment(supportFragmentManager: FragmentManager, fragment: DialogFragment, multiselectForwardFragmentArgs: MultiselectForwardFragmentArgs) {
- fragment.arguments = createArgumentsBundle(multiselectForwardFragmentArgs)
+ fragment.arguments = bundleOf(ARGS to multiselectForwardFragmentArgs, DIALOG_TITLE to multiselectForwardFragmentArgs.title)
fragment.show(supportFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG)
}
-
- private fun createArgumentsBundle(multiselectForwardFragmentArgs: MultiselectForwardFragmentArgs): Bundle {
- return Bundle().apply {
- putParcelableArrayList(ARG_MULTISHARE_ARGS, ArrayList(multiselectForwardFragmentArgs.multiShareArgs))
- putBoolean(ARG_CAN_SEND_TO_NON_PUSH, multiselectForwardFragmentArgs.canSendToNonPush)
- putInt(ARG_TITLE, multiselectForwardFragmentArgs.title)
- putBoolean(ARG_FORCE_DISABLE_ADD_MESSAGE, multiselectForwardFragmentArgs.forceDisableAddMessage)
- putBoolean(ARG_FORCE_SELECTION_ONLY, multiselectForwardFragmentArgs.forceSelectionOnly)
- putBoolean(ARG_SELECT_SINGLE_RECIPIENT, multiselectForwardFragmentArgs.selectSingleRecipient)
- putInt(ARG_SEND_BUTTON_TINT, multiselectForwardFragmentArgs.sendButtonTint)
- }
- }
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt
index 4f1984d80c..8bdb27f296 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt
@@ -2,9 +2,11 @@ package org.thoughtcrime.securesms.conversation.mutiselect.forward
import android.content.Context
import android.net.Uri
+import android.os.Parcelable
import androidx.annotation.ColorInt
import androidx.annotation.StringRes
import androidx.annotation.WorkerThread
+import kotlinx.parcelize.Parcelize
import org.signal.core.util.StreamUtil
import org.signal.core.util.ThreadUtil
import org.signal.core.util.concurrent.SignalExecutors
@@ -17,6 +19,7 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord
import org.thoughtcrime.securesms.mediasend.Media
import org.thoughtcrime.securesms.mms.PartAuthority
import org.thoughtcrime.securesms.sharing.MultiShareArgs
+import org.thoughtcrime.securesms.stories.Stories
import org.thoughtcrime.securesms.util.MediaUtil
import java.util.Optional
import java.util.function.Consumer
@@ -31,6 +34,7 @@ import java.util.function.Consumer
* @param forceSelectionOnly Force the fragment to only select recipients, never actually performing the send.
* @param selectSingleRecipient Only allow the selection of a single recipient.
*/
+@Parcelize
data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
val canSendToNonPush: Boolean,
val multiShareArgs: List = listOf(),
@@ -38,8 +42,9 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
val forceDisableAddMessage: Boolean = false,
val forceSelectionOnly: Boolean = false,
val selectSingleRecipient: Boolean = false,
- @ColorInt val sendButtonTint: Int = -1
-) {
+ @ColorInt val sendButtonTint: Int = -1,
+ val storySendRequirements: Stories.MediaTransform.SendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND
+) : Parcelable {
fun withSendButtonTint(@ColorInt sendButtonTint: Int) = copy(sendButtonTint = sendButtonTint)
@@ -58,7 +63,8 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
consumer.accept(
MultiselectForwardFragmentArgs(
isMmsSupported,
- listOf(multiShareArgs)
+ listOf(multiShareArgs),
+ storySendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND
)
)
}
@@ -79,7 +85,15 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
val canSendToNonPush: Boolean = selectedParts.all { Multiselect.canSendToNonPush(context, it) }
val multiShareArgs: List = conversationMessages.map { buildMultiShareArgs(context, it, selectedParts) }
- ThreadUtil.runOnMain { consumer.accept(MultiselectForwardFragmentArgs(canSendToNonPush, multiShareArgs)) }
+ ThreadUtil.runOnMain {
+ consumer.accept(
+ MultiselectForwardFragmentArgs(
+ canSendToNonPush,
+ multiShareArgs,
+ storySendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND
+ )
+ )
+ }
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFullScreenDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFullScreenDialogFragment.kt
index d3643bf58b..54a7c95d54 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFullScreenDialogFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFullScreenDialogFragment.kt
@@ -7,11 +7,12 @@ import androidx.core.content.ContextCompat
import androidx.fragment.app.setFragmentResult
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.FullScreenDialogFragment
+import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment.Companion.DIALOG_TITLE
import org.thoughtcrime.securesms.stories.Stories
import org.thoughtcrime.securesms.util.fragments.findListener
class MultiselectForwardFullScreenDialogFragment : FullScreenDialogFragment(), MultiselectForwardFragment.Callback {
- override fun getTitle(): Int = requireArguments().getInt(MultiselectForwardFragment.ARG_TITLE)
+ override fun getTitle(): Int = requireArguments().getParcelable(DIALOG_TITLE)!!.title
override fun getDialogLayoutResource(): Int = R.layout.fragment_container
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardRepository.kt
index 1e8f2a17c4..684b611688 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardRepository.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardRepository.kt
@@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.sharing.MultiShareArgs
import org.thoughtcrime.securesms.sharing.MultiShareSender
import org.thoughtcrime.securesms.stories.Stories
+import org.whispersystems.signalservice.api.util.Preconditions
import java.util.Optional
class MultiselectForwardRepository {
@@ -21,7 +22,9 @@ class MultiselectForwardRepository {
)
fun checkAllSelectedMediaCanBeSentToStories(records: List): Single {
- if (!Stories.isFeatureEnabled() || records.isEmpty()) {
+ Preconditions.checkArgument(records.isNotEmpty())
+
+ if (!Stories.isFeatureEnabled()) {
return Single.just(Stories.MediaTransform.SendRequirements.CAN_NOT_SEND)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardViewModel.kt
index 92a6110faa..b3cfdd0133 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardViewModel.kt
@@ -9,15 +9,21 @@ import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.mediasend.v2.UntrustedRecords
import org.thoughtcrime.securesms.sharing.MultiShareArgs
+import org.thoughtcrime.securesms.stories.Stories
import org.thoughtcrime.securesms.util.livedata.Store
class MultiselectForwardViewModel(
+ private val storySendRequirements: Stories.MediaTransform.SendRequirements,
private val records: List,
private val isSelectionOnly: Boolean,
private val repository: MultiselectForwardRepository
) : ViewModel() {
- private val store = Store(MultiselectForwardState())
+ private val store = Store(
+ MultiselectForwardState(
+ storySendRequirements = storySendRequirements
+ )
+ )
val state: LiveData = store.stateLiveData
val snapshot: MultiselectForwardState get() = store.state
@@ -25,8 +31,10 @@ class MultiselectForwardViewModel(
private val disposables = CompositeDisposable()
init {
- disposables += repository.checkAllSelectedMediaCanBeSentToStories(records).subscribe { sendRequirements ->
- store.update { it.copy(storySendRequirements = sendRequirements) }
+ if (records.isNotEmpty()) {
+ disposables += repository.checkAllSelectedMediaCanBeSentToStories(records).subscribe { sendRequirements ->
+ store.update { it.copy(storySendRequirements = sendRequirements) }
+ }
}
}
@@ -88,12 +96,13 @@ class MultiselectForwardViewModel(
}
class Factory(
+ private val storySendRequirements: Stories.MediaTransform.SendRequirements,
private val records: List,
private val isSelectionOnly: Boolean,
private val repository: MultiselectForwardRepository,
) : ViewModelProvider.Factory {
override fun create(modelClass: Class): T {
- return requireNotNull(modelClass.cast(MultiselectForwardViewModel(records, isSelectionOnly, repository)))
+ return requireNotNull(modelClass.cast(MultiselectForwardViewModel(storySendRequirements, records, isSelectionOnly, repository)))
}
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt
index 989a29c730..d10c347d79 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt
@@ -29,7 +29,6 @@ import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
import org.thoughtcrime.securesms.contacts.paged.ContactSearchState
import org.thoughtcrime.securesms.conversation.MessageSendType
-import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFullScreenDialogFragment
import org.thoughtcrime.securesms.conversation.mutiselect.forward.SearchConfigurationProvider
import org.thoughtcrime.securesms.keyboard.emoji.EmojiKeyboardPageFragment
import org.thoughtcrime.securesms.keyboard.emoji.search.EmojiSearchFragment
@@ -52,8 +51,7 @@ class MediaSelectionActivity :
EmojiKeyboardPageFragment.Callback,
EmojiEventListener,
EmojiSearchFragment.Callback,
- SearchConfigurationProvider,
- MultiselectForwardFullScreenDialogFragment.Callback {
+ SearchConfigurationProvider {
private var animateInShadowLayerValueAnimator: ValueAnimator? = null
private var animateInTextColorValueAnimator: ValueAnimator? = null
@@ -334,10 +332,6 @@ class MediaSelectionActivity :
}
}
- override fun getStorySendRequirements(): Stories.MediaTransform.SendRequirements {
- return viewModel.getStorySendRequirements()
- }
-
private inner class OnBackPressed : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
val navController = Navigation.findNavController(this@MediaSelectionActivity, R.id.fragment_container)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
index 42e6252b42..f473466302 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
@@ -17,7 +17,6 @@ import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.ViewCompat
import androidx.fragment.app.Fragment
-import androidx.fragment.app.setFragmentResultListener
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.ItemTouchHelper
@@ -28,7 +27,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
import org.thoughtcrime.securesms.conversation.MessageSendType
-import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment
+import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardActivity
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs
import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult
import org.thoughtcrime.securesms.mediasend.v2.HudCommand
@@ -138,16 +137,20 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment) {
sharedViewModel.sendCommand(HudCommand.SaveMedia)
}
- setFragmentResultListener(MultiselectForwardFragment.RESULT_KEY) { _, bundle ->
- val parcelizedKeys: List = bundle.getParcelableArrayList(MultiselectForwardFragment.RESULT_SELECTION)!!
- val contactSearchKeys = parcelizedKeys.map { it.asRecipientSearchKey() }
- performSend(contactSearchKeys)
+ val recipientSelectionLauncher = registerForActivityResult(MultiselectForwardActivity.SelectionContract()) { keys ->
+ if (keys.isNotEmpty()) {
+ performSend(keys)
+ }
}
sendButton.setOnClickListener {
if (sharedViewModel.isContactSelectionRequired) {
- val args = MultiselectForwardFragmentArgs(false, title = R.string.MediaReviewFragment__send_to)
- MultiselectForwardFragment.showFullScreen(parentFragmentManager, args)
+ val args = MultiselectForwardFragmentArgs(
+ false,
+ title = R.string.MediaReviewFragment__send_to,
+ storySendRequirements = sharedViewModel.getStorySendRequirements()
+ )
+ recipientSelectionLauncher.launch(args)
} else {
performSend()
}
diff --git a/app/src/main/res/layout/multiselect_forward_activity.xml b/app/src/main/res/layout/multiselect_forward_activity.xml
new file mode 100644
index 0000000000..ce3a1f152b
--- /dev/null
+++ b/app/src/main/res/layout/multiselect_forward_activity.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file