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 55b605ec32..6443bb0083 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 @@ -18,6 +18,8 @@ import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.ContactSelectionListFragment import org.thoughtcrime.securesms.R @@ -33,6 +35,7 @@ import org.thoughtcrime.securesms.sharing.MultiShareArgs import org.thoughtcrime.securesms.sharing.ShareSelectionAdapter import org.thoughtcrime.securesms.util.BottomSheetUtil import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.LifecycleDisposable import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.views.SimpleProgressDialog @@ -53,6 +56,7 @@ class MultiselectForwardFragment : override val peekHeightPercentage: Float = 0.67f private val viewModel: MultiselectForwardViewModel by viewModels(factoryProducer = this::createViewModelFactory) + private val disposables = LifecycleDisposable() private lateinit var selectionFragment: ContactSelectionListFragment private lateinit var contactFilterView: ContactFilterView @@ -93,6 +97,7 @@ class MultiselectForwardFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { callback = requireNotNull(findListener()) + disposables.bindTo(viewLifecycleOwner.lifecycle) selectionFragment = childFragmentManager.findFragmentById(R.id.contact_selection_list_fragment) as ContactSelectionListFragment @@ -249,9 +254,18 @@ class MultiselectForwardFragment : override fun onBeforeContactSelected(recipientId: Optional, number: String?, callback: Consumer) { if (recipientId.isPresent) { - viewModel.addSelectedContact(recipientId, null) - callback.accept(true) - contactFilterView.clear() + disposables.add( + viewModel.addSelectedContact(recipientId, null) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { success -> + if (!success) { + Toast.makeText(requireContext(), R.string.ShareActivity_you_do_not_have_permission_to_send_to_this_group, Toast.LENGTH_SHORT).show() + } + callback.accept(success) + contactFilterView.clear() + } + ) } else { Log.w(TAG, "Rejecting non-present recipient. Can't forward to an unknown contact.") callback.accept(false) 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 79c4475ad9..9872614b69 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 @@ -2,16 +2,19 @@ package org.thoughtcrime.securesms.conversation.mutiselect.forward import android.content.Context import androidx.core.util.Consumer +import io.reactivex.rxjava3.core.Single import org.signal.core.util.concurrent.SignalExecutors import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.IdentityDatabase import org.thoughtcrime.securesms.database.ThreadDatabase import org.thoughtcrime.securesms.database.identity.IdentityRecordList import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.sharing.MultiShareArgs import org.thoughtcrime.securesms.sharing.MultiShareSender import org.thoughtcrime.securesms.sharing.ShareContact import org.thoughtcrime.securesms.sharing.ShareContactAndThread +import org.whispersystems.libsignal.util.guava.Optional class MultiselectForwardRepository(context: Context) { @@ -33,6 +36,22 @@ class MultiselectForwardRepository(context: Context) { } } + fun canSelectRecipient(recipientId: Optional): Single { + if (!recipientId.isPresent) { + return Single.just(true) + } + + return Single.fromCallable { + val recipient = Recipient.resolved(recipientId.get()) + if (recipient.isPushV2Group) { + val record = DatabaseFactory.getGroupDatabase(context).getGroup(recipient.requireGroupId()) + !(record.isPresent && record.get().isAnnouncementGroup && !record.get().isAdmin(Recipient.self())) + } else { + true + } + } + } + fun send( additionalMessage: String, multiShareArgs: List, 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 4ece2ef01e..854ba7f489 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 @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import io.reactivex.rxjava3.core.Single import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.sharing.MultiShareArgs @@ -23,8 +24,14 @@ class MultiselectForwardViewModel( val shareContactMappingModels: LiveData> = Transformations.map(state) { s -> s.selectedContacts.mapIndexed { i, c -> ShareSelectionMappingModel(c, i == 0) } } - fun addSelectedContact(recipientId: Optional, number: String?) { - store.update { it.copy(selectedContacts = it.selectedContacts + ShareContact(recipientId, number)) } + fun addSelectedContact(recipientId: Optional, number: String?): Single { + return repository + .canSelectRecipient(recipientId) + .doOnSuccess { allowed -> + if (allowed) { + store.update { it.copy(selectedContacts = it.selectedContacts + ShareContact(recipientId, number)) } + } + } } fun removeSelectedContact(recipientId: Optional, number: String?) {