Fix available actions for groups, owners and self-joined users

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2021-05-07 09:22:30 +02:00 committed by Andy Scherzinger
parent 596772c5c6
commit 4ad96cc347
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
2 changed files with 266 additions and 173 deletions

View File

@ -700,201 +700,293 @@ class ConversationInfoController(args: Bundle) : BaseController(args), FlexibleA
} }
} }
fun toggleModeratorStatus(apiVersion: Int, participant: Participant) {
if (apiVersion >= ApiUtils.APIv4) {
if (participant.type == Participant.ParticipantType.MODERATOR) {
ncApi.demoteAttendeeFromModerator(
credentials,
ApiUtils.getUrlForRoomModerators(
apiVersion,
conversationUser!!.baseUrl,
conversation!!.token
),
participant.attendeeId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error demoting an attendee from moderators", e)
}
override fun onComplete() {
}
})
} else if (participant.type == Participant.ParticipantType.USER) {
ncApi.promoteAttendeeToModerator(
credentials,
ApiUtils.getUrlForRoomModerators(
apiVersion,
conversationUser!!.baseUrl,
conversation!!.token
),
participant.attendeeId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error promoting an attendee to moderators", e)
}
override fun onComplete() {
}
})
}
} else {
if (participant.type == Participant.ParticipantType.MODERATOR) {
ncApi.demoteModeratorToUser(
credentials,
ApiUtils.getUrlForRoomModerators(
apiVersion,
conversationUser!!.baseUrl,
conversation!!.token
),
participant.userId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error demoting a user from moderators", e)
}
override fun onComplete() {
}
})
} else if (participant.type == Participant.ParticipantType.USER) {
ncApi.promoteUserToModerator(
credentials,
ApiUtils.getUrlForRoomModerators(
apiVersion,
conversationUser!!.baseUrl,
conversation!!.token
),
participant.userId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error promoting a user to moderators", e)
}
override fun onComplete() {
}
})
}
}
}
fun removeAttendeeFromConversation(apiVersion: Int, participant: Participant) {
if (apiVersion >= ApiUtils.APIv4) {
ncApi.removeAttendeeFromConversation(
credentials,
ApiUtils.getUrlForAttendees(
apiVersion,
conversationUser!!.baseUrl,
conversation!!.token
),
participant.attendeeId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error removing attendee from conversation", e)
}
override fun onComplete() {
}
})
} else {
if (participant.type == Participant.ParticipantType.GUEST ||
participant.type == Participant.ParticipantType.USER_FOLLOWING_LINK
) {
ncApi.removeParticipantFromConversation(
credentials,
ApiUtils.getUrlForRemovingParticipantFromConversation(
conversationUser!!.baseUrl,
conversation!!.token,
true
),
participant.sessionId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error removing guest from conversation", e)
}
override fun onComplete() {
}
})
} else {
ncApi.removeParticipantFromConversation(
credentials,
ApiUtils.getUrlForRemovingParticipantFromConversation(
conversationUser!!.baseUrl,
conversation!!.token,
false
),
participant.userId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error removing user from conversation", e)
}
override fun onComplete() {
}
})
}
}
}
override fun onItemClick(view: View?, position: Int): Boolean { override fun onItemClick(view: View?, position: Int): Boolean {
if (!conversation!!.canModerate(conversationUser)) {
return true
}
val userItem = adapter?.getItem(position) as UserItem val userItem = adapter?.getItem(position) as UserItem
val participant = userItem.model val participant = userItem.model
val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1))
if (participant.userId != conversationUser!!.userId) { if (participant.getUserId() == conversationUser!!.userId
var items = mutableListOf( || participant.type == Participant.ParticipantType.OWNER) {
BasicListItemWithImage(R.drawable.ic_pencil_grey600_24dp, context.getString(R.string.nc_promote)), // FIXME Show pin?
BasicListItemWithImage(R.drawable.ic_pencil_grey600_24dp, context.getString(R.string.nc_demote)), return true
}
if (participant.getActorType() == GROUPS) {
val items = mutableListOf(
BasicListItemWithImage( BasicListItemWithImage(
R.drawable.ic_delete_grey600_24dp, R.drawable.ic_delete_grey600_24dp,
context.getString(R.string.nc_remove_participant) context.getString(R.string.nc_remove_group_and_members)
) )
) )
MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show {
cornerRadius(res = R.dimen.corner_radius)
if (!conversation!!.canModerate(conversationUser)) { title(text = participant.displayName)
items = mutableListOf() listItemsWithImage(items = items) { dialog, index, _ ->
} else { if (index == 0) {
if (participant.type == Participant.ParticipantType.MODERATOR || participant.type == Participant.ParticipantType.OWNER) { removeAttendeeFromConversation(apiVersion, participant)
items.removeAt(0) }
} else if (participant.type == Participant.ParticipantType.USER) {
items.removeAt(1)
} }
} }
return true
}
if (items.isNotEmpty()) { var items = mutableListOf(
MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { BasicListItemWithImage(R.drawable.ic_pencil_grey600_24dp, context.getString(R.string.nc_promote)),
cornerRadius(res = R.dimen.corner_radius) BasicListItemWithImage(R.drawable.ic_pencil_grey600_24dp, context.getString(R.string.nc_demote)),
BasicListItemWithImage(
R.drawable.ic_delete_grey600_24dp,
context.getString(R.string.nc_remove_participant)
)
)
title(text = participant.displayName) if (participant.type == Participant.ParticipantType.MODERATOR
listItemsWithImage(items = items) { dialog, index, _ -> || participant.type == Participant.ParticipantType.GUEST_MODERATOR) {
if (index == 0) { items.removeAt(0)
if (apiVersion >= ApiUtils.APIv4) { } else if (participant.type == Participant.ParticipantType.USER
if (participant.type == Participant.ParticipantType.MODERATOR) { || participant.type == Participant.ParticipantType.GUEST) {
ncApi.demoteAttendeeFromModerator( items.removeAt(1)
credentials, } else {
ApiUtils.getUrlForRoomModerators( // Self joined users can not be promoted nor demoted
apiVersion, items.removeAt(0)
conversationUser.baseUrl, items.removeAt(0)
conversation!!.token }
),
participant.attendeeId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) { if (items.isNotEmpty()) {
getListOfParticipants() MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show {
} cornerRadius(res = R.dimen.corner_radius)
@SuppressLint("LongLogTag") title(text = participant.displayName)
override fun onError(e: Throwable) { listItemsWithImage(items = items) { dialog, index, _ ->
Log.e(TAG, "Error demoting an attendee from moderators", e) if (index == 0) {
} if (participant.type == Participant.ParticipantType.USER_FOLLOWING_LINK) {
removeAttendeeFromConversation(apiVersion, participant)
override fun onComplete() { } else {
} toggleModeratorStatus(apiVersion, participant)
})
} else if (participant.type == Participant.ParticipantType.USER) {
ncApi.promoteAttendeeToModerator(
credentials,
ApiUtils.getUrlForRoomModerators(
apiVersion,
conversationUser.baseUrl,
conversation!!.token
),
participant.attendeeId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error promoting an attendee to moderators", e)
}
override fun onComplete() {
}
})
}
} else {
if (participant.type == Participant.ParticipantType.MODERATOR) {
ncApi.demoteModeratorToUser(
credentials,
ApiUtils.getUrlForRoomModerators(
apiVersion,
conversationUser.baseUrl,
conversation!!.token
),
participant.userId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
getListOfParticipants()
}
} else if (participant.type == Participant.ParticipantType.USER) {
ncApi.promoteUserToModerator(
credentials,
ApiUtils.getUrlForRoomModerators(
apiVersion,
conversationUser.baseUrl,
conversation!!.token
),
participant.userId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
getListOfParticipants()
}
}
}
} else if (index == 1) {
if (apiVersion >= ApiUtils.APIv4) {
ncApi.removeAttendeeFromConversation(
credentials,
ApiUtils.getUrlForAttendees(
apiVersion,
conversationUser.baseUrl,
conversation!!.token
),
participant.attendeeId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(genericOverall: GenericOverall) {
getListOfParticipants()
}
@SuppressLint("LongLogTag")
override fun onError(e: Throwable) {
Log.e(TAG, "Error removing attendee from conversation", e)
}
override fun onComplete() {
}
})
} else {
if (participant.type == Participant.ParticipantType.GUEST ||
participant.type == Participant.ParticipantType.USER_FOLLOWING_LINK
) {
ncApi.removeParticipantFromConversation(
credentials,
ApiUtils.getUrlForRemovingParticipantFromConversation(
conversationUser.baseUrl,
conversation!!.token,
true
),
participant.sessionId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
getListOfParticipants()
}
} else {
ncApi.removeParticipantFromConversation(
credentials,
ApiUtils.getUrlForRemovingParticipantFromConversation(
conversationUser.baseUrl,
conversation!!.token,
false
),
participant.userId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
getListOfParticipants()
// get participants again
}
}
}
} }
} else if (index == 1) {
removeAttendeeFromConversation(apiVersion, participant)
} }
} }
} }
} }
return true return true
} }

View File

@ -255,6 +255,7 @@
<string name="nc_demote">Demote from moderator</string> <string name="nc_demote">Demote from moderator</string>
<string name="nc_promote">Promote to moderator</string> <string name="nc_promote">Promote to moderator</string>
<string name="nc_remove_participant">Remove participant</string> <string name="nc_remove_participant">Remove participant</string>
<string name="nc_remove_group_and_members">Remove group and members</string>
<!-- Chat --> <!-- Chat -->
<string name="nc_hint_enter_a_message">Enter a message…</string> <string name="nc_hint_enter_a_message">Enter a message…</string>