Show warning when group changes would clear member labels.

This commit is contained in:
jeffrey-signal
2026-03-11 15:34:42 -04:00
parent 35cf24b577
commit 73f5a3398c
13 changed files with 458 additions and 38 deletions

View File

@@ -4,4 +4,5 @@ import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason
sealed class PermissionsSettingsEvents {
class GroupChangeError(val reason: GroupChangeFailureReason) : PermissionsSettingsEvents()
object ShowMemberLabelsWillBeRemovedWarning : PermissionsSettingsEvents()
}

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.components.settings.conversation.permissions
import android.widget.Toast
import androidx.annotation.StringRes
import androidx.fragment.app.viewModels
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment
@@ -39,6 +40,7 @@ class PermissionsSettingsFragment : DSLSettingsFragment(
viewModel.events.observe(viewLifecycleOwner) { event ->
when (event) {
is PermissionsSettingsEvents.GroupChangeError -> handleGroupChangeError(event)
is PermissionsSettingsEvents.ShowMemberLabelsWillBeRemovedWarning -> showMemberLabelsWillBeRemovedDialog()
}
}
}
@@ -94,13 +96,26 @@ class PermissionsSettingsFragment : DSLSettingsFragment(
selected = getSelected(state.nonAdminCanSetMemberLabel),
confirmAction = true,
onSelected = { selectedIndex ->
viewModel.setNonAdminCanSetMemberLabel(selectedIndex == 1)
if (selectedIndex >= 0) {
viewModel.onMemberLabelPermissionChangeRequested(nonAdminCanSetMemberLabel = selectedIndex == 1)
}
}
)
}
}
}
private fun showMemberLabelsWillBeRemovedDialog() {
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.PermissionsSettingsFragment__member_labels_will_be_cleared_title)
.setMessage(R.string.PermissionsSettingsFragment__member_labels_will_be_cleared_body)
.setPositiveButton(R.string.PermissionsSettingsFragment__change_permission) { _, _ ->
viewModel.onRestrictMemberLabelsToAdminsConfirmed()
}
.setNegativeButton(android.R.string.cancel, null)
.show()
}
@StringRes
private fun getSelected(isNonAdminAllowed: Boolean): Int {
return if (isNonAdminAllowed) {

View File

@@ -3,6 +3,9 @@ package org.thoughtcrime.securesms.components.settings.conversation.permissions
import android.content.Context
import org.signal.core.util.concurrent.SignalExecutors
import org.signal.core.util.logging.Log
import org.signal.core.util.orNull
import org.thoughtcrime.securesms.database.GroupTable
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.groups.GroupAccessControl
import org.thoughtcrime.securesms.groups.GroupChangeException
import org.thoughtcrime.securesms.groups.GroupId
@@ -13,7 +16,10 @@ import java.io.IOException
private val TAG = Log.tag(PermissionsSettingsRepository::class.java)
class PermissionsSettingsRepository(private val context: Context) {
class PermissionsSettingsRepository(
private val context: Context,
private val groupTable: GroupTable = SignalDatabase.groups
) {
fun applyMembershipRightsChange(groupId: GroupId, newRights: GroupAccessControl, error: GroupChangeErrorCallback) {
SignalExecutors.UNBOUNDED.execute {
@@ -57,6 +63,12 @@ class PermissionsSettingsRepository(private val context: Context) {
}
}
fun hasNonAdminMembersWithLabels(groupId: GroupId): Boolean {
val v2GroupId = groupId.v2OrNull() ?: return false
val group = groupTable.getGroup(v2GroupId).orNull() ?: return false
return group.requireV2GroupProperties().nonAdminMembersWithLabels().isNotEmpty()
}
fun applyMemberLabelRightsChange(groupId: GroupId, newRights: GroupAccessControl, errorCallback: GroupChangeErrorCallback) {
SignalExecutors.UNBOUNDED.execute {
try {

View File

@@ -11,11 +11,11 @@ import org.thoughtcrime.securesms.util.livedata.Store
class PermissionsSettingsViewModel(
private val groupId: GroupId,
private val repository: PermissionsSettingsRepository
private val repository: PermissionsSettingsRepository,
liveGroup: LiveGroup = LiveGroup(groupId)
) : ViewModel() {
private val store = Store(PermissionsSettingsState())
private val liveGroup = LiveGroup(groupId)
private val internalEvents = SingleLiveEvent<PermissionsSettingsEvents>()
val state: LiveData<PermissionsSettingsState> = store.stateLiveData
@@ -61,7 +61,17 @@ class PermissionsSettingsViewModel(
}
}
fun setNonAdminCanSetMemberLabel(nonAdminCanSetMemberLabel: Boolean) {
fun onMemberLabelPermissionChangeRequested(nonAdminCanSetMemberLabel: Boolean) {
if (!nonAdminCanSetMemberLabel && repository.hasNonAdminMembersWithLabels(groupId)) {
internalEvents.postValue(PermissionsSettingsEvents.ShowMemberLabelsWillBeRemovedWarning)
} else {
setNonAdminCanSetMemberLabel(nonAdminCanSetMemberLabel)
}
}
fun onRestrictMemberLabelsToAdminsConfirmed() = setNonAdminCanSetMemberLabel(false)
private fun setNonAdminCanSetMemberLabel(nonAdminCanSetMemberLabel: Boolean) {
repository.applyMemberLabelRightsChange(
groupId = groupId,
newRights = nonAdminCanSetMemberLabel.asGroupAccessControl()