kopia lustrzana https://github.com/ryukoposting/Signal-Android
Prevent forwarding to announcement groups in new forward fragment.
rodzic
c1fb4f9421
commit
307f47fa33
|
@ -18,6 +18,8 @@ import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
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.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.ContactSelectionListFragment
|
import org.thoughtcrime.securesms.ContactSelectionListFragment
|
||||||
import org.thoughtcrime.securesms.R
|
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.sharing.ShareSelectionAdapter
|
||||||
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
||||||
import org.thoughtcrime.securesms.util.FeatureFlags
|
import org.thoughtcrime.securesms.util.FeatureFlags
|
||||||
|
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
||||||
import org.thoughtcrime.securesms.util.Util
|
import org.thoughtcrime.securesms.util.Util
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil
|
import org.thoughtcrime.securesms.util.ViewUtil
|
||||||
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog
|
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog
|
||||||
|
@ -53,6 +56,7 @@ class MultiselectForwardFragment :
|
||||||
override val peekHeightPercentage: Float = 0.67f
|
override val peekHeightPercentage: Float = 0.67f
|
||||||
|
|
||||||
private val viewModel: MultiselectForwardViewModel by viewModels(factoryProducer = this::createViewModelFactory)
|
private val viewModel: MultiselectForwardViewModel by viewModels(factoryProducer = this::createViewModelFactory)
|
||||||
|
private val disposables = LifecycleDisposable()
|
||||||
|
|
||||||
private lateinit var selectionFragment: ContactSelectionListFragment
|
private lateinit var selectionFragment: ContactSelectionListFragment
|
||||||
private lateinit var contactFilterView: ContactFilterView
|
private lateinit var contactFilterView: ContactFilterView
|
||||||
|
@ -93,6 +97,7 @@ class MultiselectForwardFragment :
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
callback = requireNotNull(findListener())
|
callback = requireNotNull(findListener())
|
||||||
|
disposables.bindTo(viewLifecycleOwner.lifecycle)
|
||||||
|
|
||||||
selectionFragment = childFragmentManager.findFragmentById(R.id.contact_selection_list_fragment) as ContactSelectionListFragment
|
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>) {
|
override fun onBeforeContactSelected(recipientId: Optional<RecipientId>, number: String?, callback: Consumer<Boolean>) {
|
||||||
if (recipientId.isPresent) {
|
if (recipientId.isPresent) {
|
||||||
viewModel.addSelectedContact(recipientId, null)
|
disposables.add(
|
||||||
callback.accept(true)
|
viewModel.addSelectedContact(recipientId, null)
|
||||||
contactFilterView.clear()
|
.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 {
|
} else {
|
||||||
Log.w(TAG, "Rejecting non-present recipient. Can't forward to an unknown contact.")
|
Log.w(TAG, "Rejecting non-present recipient. Can't forward to an unknown contact.")
|
||||||
callback.accept(false)
|
callback.accept(false)
|
||||||
|
|
|
@ -2,16 +2,19 @@ package org.thoughtcrime.securesms.conversation.mutiselect.forward
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.core.util.Consumer
|
import androidx.core.util.Consumer
|
||||||
|
import io.reactivex.rxjava3.core.Single
|
||||||
import org.signal.core.util.concurrent.SignalExecutors
|
import org.signal.core.util.concurrent.SignalExecutors
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||||
import org.thoughtcrime.securesms.database.IdentityDatabase
|
import org.thoughtcrime.securesms.database.IdentityDatabase
|
||||||
import org.thoughtcrime.securesms.database.ThreadDatabase
|
import org.thoughtcrime.securesms.database.ThreadDatabase
|
||||||
import org.thoughtcrime.securesms.database.identity.IdentityRecordList
|
import org.thoughtcrime.securesms.database.identity.IdentityRecordList
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
import org.thoughtcrime.securesms.sharing.MultiShareArgs
|
import org.thoughtcrime.securesms.sharing.MultiShareArgs
|
||||||
import org.thoughtcrime.securesms.sharing.MultiShareSender
|
import org.thoughtcrime.securesms.sharing.MultiShareSender
|
||||||
import org.thoughtcrime.securesms.sharing.ShareContact
|
import org.thoughtcrime.securesms.sharing.ShareContact
|
||||||
import org.thoughtcrime.securesms.sharing.ShareContactAndThread
|
import org.thoughtcrime.securesms.sharing.ShareContactAndThread
|
||||||
|
import org.whispersystems.libsignal.util.guava.Optional
|
||||||
|
|
||||||
class MultiselectForwardRepository(context: Context) {
|
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(
|
fun send(
|
||||||
additionalMessage: String,
|
additionalMessage: String,
|
||||||
multiShareArgs: List<MultiShareArgs>,
|
multiShareArgs: List<MultiShareArgs>,
|
||||||
|
|
|
@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.Transformations
|
import androidx.lifecycle.Transformations
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import io.reactivex.rxjava3.core.Single
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
import org.thoughtcrime.securesms.sharing.MultiShareArgs
|
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) } }
|
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?) {
|
fun addSelectedContact(recipientId: Optional<RecipientId>, number: String?): Single<Boolean> {
|
||||||
store.update { it.copy(selectedContacts = it.selectedContacts + ShareContact(recipientId, number)) }
|
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?) {
|
fun removeSelectedContact(recipientId: Optional<RecipientId>, number: String?) {
|
||||||
|
|
Ładowanie…
Reference in New Issue