Introduce new add member labels permission.

This commit is contained in:
jeffrey-signal
2026-03-06 15:58:00 -05:00
parent 7beb4dd939
commit 13444136bd
26 changed files with 441 additions and 60 deletions

View File

@@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.groups.ui.GroupErrors
import org.thoughtcrime.securesms.util.RemoteConfig
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
class PermissionsSettingsFragment : DSLSettingsFragment(
@@ -83,6 +84,20 @@ class PermissionsSettingsFragment : DSLSettingsFragment(
viewModel.setAnnouncementGroup(it == 0)
}
)
if (RemoteConfig.sendMemberLabels) {
radioListPref(
title = DSLSettingsText.from(R.string.PermissionsSettingsFragment__add_member_labels),
isEnabled = state.selfCanEditSettings,
listItems = permissionsOptions,
dialogTitle = DSLSettingsText.from(R.string.PermissionsSettingsFragment__who_can_add_member_labels),
selected = getSelected(state.nonAdminCanSetMemberLabel),
confirmAction = true,
onSelected = { selectedIndex ->
viewModel.setNonAdminCanSetMemberLabel(selectedIndex == 1)
}
)
}
}
}

View File

@@ -56,4 +56,18 @@ class PermissionsSettingsRepository(private val context: Context) {
}
}
}
fun applyMemberLabelRightsChange(groupId: GroupId, newRights: GroupAccessControl, errorCallback: GroupChangeErrorCallback) {
SignalExecutors.UNBOUNDED.execute {
try {
GroupManager.applyMemberLabelRightsChange(context, groupId.requireV2(), newRights)
} catch (e: GroupChangeException) {
Log.w(TAG, e)
errorCallback.onError(GroupChangeFailureReason.fromException(e))
} catch (e: IOException) {
Log.w(TAG, e)
errorCallback.onError(GroupChangeFailureReason.fromException(e))
}
}
}
}

View File

@@ -4,5 +4,6 @@ data class PermissionsSettingsState(
val selfCanEditSettings: Boolean = false,
val nonAdminCanAddMembers: Boolean = false,
val nonAdminCanEditGroupInfo: Boolean = false,
val announcementGroup: Boolean = false
val announcementGroup: Boolean = false,
val nonAdminCanSetMemberLabel: Boolean = false
)

View File

@@ -37,6 +37,10 @@ class PermissionsSettingsViewModel(
store.update(liveGroup.isAnnouncementGroup) { isAnnouncementGroup, state ->
state.copy(announcementGroup = isAnnouncementGroup)
}
store.update(liveGroup.memberLabelAccessControl) { memberLabelAccessControl, state ->
state.copy(nonAdminCanSetMemberLabel = memberLabelAccessControl == GroupAccessControl.ALL_MEMBERS)
}
}
fun setNonAdminCanAddMembers(nonAdminCanAddMembers: Boolean) {
@@ -57,6 +61,15 @@ class PermissionsSettingsViewModel(
}
}
fun setNonAdminCanSetMemberLabel(nonAdminCanSetMemberLabel: Boolean) {
repository.applyMemberLabelRightsChange(
groupId = groupId,
newRights = nonAdminCanSetMemberLabel.asGroupAccessControl()
) { failureReason ->
internalEvents.postValue(PermissionsSettingsEvents.GroupChangeError(failureReason))
}
}
private fun Boolean.asGroupAccessControl(): GroupAccessControl {
return if (this) {
GroupAccessControl.ALL_MEMBERS