Prevent forwarding to announcement groups in new forward fragment.

This commit is contained in:
Greyson Parrelli 2021-08-25 12:38:14 -04:00 committed by GitHub
parent c1fb4f9421
commit 307f47fa33
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 5 deletions

View file

@ -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<RecipientId>, number: String?, callback: Consumer<Boolean>) {
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)

View file

@ -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<RecipientId>): Single<Boolean> {
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<MultiShareArgs>,

View file

@ -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<List<ShareSelectionMappingModel>> = Transformations.map(state) { s -> s.selectedContacts.mapIndexed { i, c -> ShareSelectionMappingModel(c, i == 0) } }
fun addSelectedContact(recipientId: Optional<RecipientId>, number: String?) {
store.update { it.copy(selectedContacts = it.selectedContacts + ShareContact(recipientId, number)) }
fun addSelectedContact(recipientId: Optional<RecipientId>, number: String?): Single<Boolean> {
return repository
.canSelectRecipient(recipientId)
.doOnSuccess { allowed ->
if (allowed) {
store.update { it.copy(selectedContacts = it.selectedContacts + ShareContact(recipientId, number)) }
}
}
}
fun removeSelectedContact(recipientId: Optional<RecipientId>, number: String?) {