Skip to content
This repository was archived by the owner on Jun 7, 2020. It is now read-only.

Commit cedf828

Browse files
committed
notify member list
1 parent d7aaf98 commit cedf828

5 files changed

Lines changed: 77 additions & 28 deletions

File tree

app/src/main/java/chat/rocket/android/members/adapter/MembersAdapter.kt

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class MembersAdapter(private val listener: (MemberUiModel) -> Unit, presenter: M
1919
ViewHolder(parent.inflate(R.layout.item_member), actionsListener)
2020

2121
override fun onBindViewHolder(holder: ViewHolder, position: Int) =
22-
holder.bind(dataSet[position], listener)
22+
holder.bind(dataSet[position], position, listener)
2323

2424
override fun getItemCount(): Int = dataSet.size
2525

@@ -51,26 +51,55 @@ class MembersAdapter(private val listener: (MemberUiModel) -> Unit, presenter: M
5151
=======
5252
private val actionsListener = object : ViewHolder.ActionsListener {
5353
override fun isActionsEnabled(): Boolean = enableActions
54-
override fun onActionSelected(item: MenuItem, member: MemberUiModel) {
54+
override fun onActionSelected(item: MenuItem, member: MemberUiModel, index: Int) {
5555
member.apply {
5656
when (item.itemId) {
5757
R.id.action_member_set_owner-> {
58-
presenter?.toggleOwner(this.userId, this.roles?.contains("owner") == true )
58+
val isOwner = this.roles?.contains("owner") == true
59+
presenter?.toggleOwner(this.userId, isOwner) {
60+
if (isOwner)
61+
dataSet[index].roles = dataSet[index].roles?.filterNot { it == "owner"}
62+
else
63+
dataSet[index].roles = dataSet[index].roles?.plus("owner")
64+
notifyItemChanged(index)
65+
}
5966
}
6067
R.id.action_member_set_leader-> {
61-
presenter?.toggleLeader(this.userId, this.roles?.contains("leader") == true)
68+
val isLeader = this.roles?.contains("leader") == true
69+
presenter?.toggleLeader(this.userId, isLeader) {
70+
if (isLeader)
71+
dataSet[index].roles = dataSet[index].roles?.filterNot { it == "leader"}
72+
else
73+
dataSet[index].roles = dataSet[index].roles?.plus("leader")
74+
notifyItemChanged(index)
75+
}
6276
}
6377
R.id.action_member_set_moderator-> {
64-
presenter?.toggleModerator(this.userId, this.roles?.contains("moderator") == true)
78+
val isMod = this.roles?.contains("moderator") == true
79+
presenter?.toggleModerator(this.userId, isMod) {
80+
if (isMod)
81+
dataSet[index].roles = dataSet[index].roles?.filterNot { it == "moderator" }
82+
else
83+
dataSet[index].roles = dataSet[index].roles?.plus("moderator")
84+
notifyItemChanged(index)
85+
}
6586
}
6687
R.id.action_member_ignore-> {
67-
presenter?.toggleIgnore(this.userId, false)
88+
TODO("not implemented")
89+
// presenter?.toggleIgnore(this.userId, false){}
6890
}
6991
R.id.action_member_mute-> {
70-
presenter?.toggleMute(this.username, this.muted)
92+
presenter?.toggleMute(this.username, this.muted) {
93+
dataSet[index].muted = !this.muted
94+
notifyItemChanged(index)
95+
}
7196
}
7297
R.id.action_member_remove-> {
73-
presenter?.removeUser(this.userId)
98+
presenter?.removeUser(this.userId) {
99+
dataSet = dataSet.filterIndexed{ position, _-> position != index }
100+
notifyItemRemoved(index)
101+
notifyItemRangeChanged(index, dataSet.size)
102+
}
74103
}
75104
else -> TODO("Not implemented")
76105
}

app/src/main/java/chat/rocket/android/members/adapter/ViewHolder.kt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import android.view.MenuItem
66
import android.view.View
77
import androidx.appcompat.app.AppCompatActivity
88
import androidx.core.view.isVisible
9+
import androidx.lifecycle.Lifecycle
910
import androidx.recyclerview.widget.RecyclerView
1011
import chat.rocket.android.R
11-
import chat.rocket.android.chatroom.uimodel.MessageUiModel
1212
import chat.rocket.android.members.ui.GroupMemberBottomSheet
1313
import chat.rocket.android.members.uimodel.MemberUiModel
1414
import chat.rocket.android.util.extensions.content
@@ -23,13 +23,15 @@ class ViewHolder(
2323
private val listener: ActionsListener
2424
) : RecyclerView.ViewHolder(itemView), MenuItem.OnMenuItemClickListener {
2525
var data: MemberUiModel? = null
26+
var index: Int = 0
2627

2728
// init {
2829
// setupActionMenu(itemView)
2930
// }
3031

31-
fun bind(memberUiModel: MemberUiModel, listener: (MemberUiModel) -> Unit) = with(itemView) {
32+
fun bind(memberUiModel: MemberUiModel, position: Int, listener: (MemberUiModel) -> Unit) = with(itemView) {
3233
data = memberUiModel
34+
index = position
3335
image_avatar.setImageURI(memberUiModel.avatarUri)
3436
text_member.content = memberUiModel.displayName
3537
text_member.setCompoundDrawablesRelativeWithIntrinsicBounds(DrawableHelper.getUserStatusDrawable(memberUiModel.status, context), null, null, null)
@@ -45,7 +47,7 @@ class ViewHolder(
4547

4648
interface ActionsListener {
4749
fun isActionsEnabled(): Boolean
48-
fun onActionSelected(item: MenuItem, member: MemberUiModel)
50+
fun onActionSelected(item: MenuItem, member: MemberUiModel, index: Int)
4951
}
5052

5153
internal fun setupActionMenu(view: View) {
@@ -74,12 +76,14 @@ class ViewHolder(
7476
menuItems.find { it.itemId == R.id.action_member_remove }?.apply {
7577
// if (it.roles.contains("owner")) title = "Remove Owner"
7678
}
77-
view.context?.let {
78-
if (it is ContextThemeWrapper && it is AppCompatActivity) {
79-
with(it) {
80-
val actionsBottomSheet = GroupMemberBottomSheet()
81-
actionsBottomSheet.addItems(menuItems, this@ViewHolder)
82-
actionsBottomSheet.show(supportFragmentManager, null)
79+
view.context?.let {
80+
if (it is ContextThemeWrapper && it.baseContext is AppCompatActivity) {
81+
with(it.baseContext as AppCompatActivity) {
82+
if (this.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
83+
val actionsBottomSheet = GroupMemberBottomSheet()
84+
actionsBottomSheet.addItems(menuItems, this@ViewHolder)
85+
actionsBottomSheet.show(supportFragmentManager, null)
86+
}
8387
}
8488
}
8589
}
@@ -90,7 +94,7 @@ class ViewHolder(
9094

9195
override fun onMenuItemClick(item: MenuItem): Boolean {
9296
data?.let {
93-
listener.onActionSelected(item, it)
97+
listener.onActionSelected(item, it, index)
9498
}
9599
return true
96100
}

app/src/main/java/chat/rocket/android/members/presentation/MembersPresenter.kt

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class MembersPresenter @Inject constructor(
3737
private var offset: Long = 0
3838
private lateinit var roomType: RoomType
3939
private lateinit var roomId: String
40+
private var totalMembers: Long = 0
4041
var isRoomOwner: Boolean = false
4142

4243
/**
@@ -69,6 +70,7 @@ class MembersPresenter @Inject constructor(
6970
it.muted = muted?.find { it == username }.isNotNullNorEmpty()
7071
}
7172
view.showMembers(memberUiModels, members.total)
73+
totalMembers = members.total
7274
offset += 1 * 60L
7375
}.ifNull {
7476
Timber.e("Couldn't find a room with id: $roomId at current server.")
@@ -93,64 +95,64 @@ class MembersPresenter @Inject constructor(
9395
}
9496
}
9597

96-
fun toggleOwner(userId: String, isOwner: Boolean = false) {
98+
fun toggleOwner(userId: String, isOwner: Boolean = false, notifier: () ->Unit) {
9799
launchUI(strategy) {
98100
try {
99101
if (isOwner)
100102
retryIO(description = "removeOwner($roomId, $roomType, $userId)") { client.removeOwner(roomId, roomType, userId) }
101103
else
102104
retryIO(description = "addOwner($roomId, $roomType, $userId)") { client.addOwner(roomId, roomType, userId) }
103-
offset = 0
104-
navigator.toMembersList(roomId)
105+
notifier()
105106
} catch (ex: RocketChatException) {
106107
view.showMessage(ex.message!!) // TODO Remove.
107108
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
108109
}
109110
}
110111
}
111112

112-
fun toggleLeader(userId: String, isLeader: Boolean = false) {
113+
fun toggleLeader(userId: String, isLeader: Boolean = false, notifier: () ->Unit) {
113114
launchUI(strategy) {
114115
try {
115116
if (isLeader)
116117
retryIO(description = "removeLeader($roomId, $roomType, $userId)") { client.removeLeader(roomId, roomType, userId) }
117118
else
118119
retryIO(description = "addLeader($roomId, $roomType, $userId)") { client.addLeader(roomId, roomType, userId) }
119-
navigator.toMembersList(roomId)
120+
notifier()
120121
} catch (ex: RocketChatException) {
121122
view.showMessage(ex.message!!) // TODO Remove.
122123
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
123124
}
124125
}
125126
}
126127

127-
fun toggleModerator(userId: String, isModerator: Boolean = false) {
128+
fun toggleModerator(userId: String, isModerator: Boolean = false, notifier: () ->Unit) {
128129
launchUI(strategy) {
129130
try {
130131
if (isModerator)
131132
retryIO(description = "removeModerator($roomId, $roomType, $userId)") { client.removeModerator(roomId, roomType, userId) }
132133
else
133134
retryIO(description = "addModerator($roomId, $roomType, $userId)") { client.addModerator(roomId, roomType, userId) }
134-
navigator.toMembersList(roomId)
135+
notifier()
135136
} catch (ex: RocketChatException) {
136137
view.showMessage(ex.message!!) // TODO Remove.
137138
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
138139
}
139140
}
140141
}
141142

142-
fun toggleIgnore(userId: String, isIgnored: Boolean = false) {
143+
fun toggleIgnore(userId: String, isIgnored: Boolean = false, notifier: () ->Unit) {
143144
launchUI(strategy) {
144145
try {
145146
retryIO(description = "ignoreUser($roomId, $userId, ${!isIgnored})") { client.ignoreUser(roomId, userId, !isIgnored) }
147+
notifier()
146148
} catch (ex: RocketChatException) {
147149
view.showMessage(ex.message!!) // TODO Remove.
148150
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
149151
}
150152
}
151153
}
152154

153-
fun toggleMute(username: String?, isMuted: Boolean = false) {
155+
fun toggleMute(username: String?, isMuted: Boolean = false, notifier: () ->Unit) {
154156
launchUI(strategy) {
155157
try {
156158
if (isMuted)
@@ -161,17 +163,20 @@ class MembersPresenter @Inject constructor(
161163
retryIO("runCommand(mute, $username, $roomId)") {
162164
client.runCommand(Command("mute", username), roomId)
163165
}
166+
notifier()
164167
} catch (ex: RocketChatException) {
165168
view.showMessage(ex.message!!) // TODO Remove.
166169
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
167170
}
168171
}
169172
}
170173

171-
fun removeUser(userId: String) {
174+
fun removeUser(userId: String, notifier: () ->Unit) {
172175
launchUI(strategy) {
173176
try {
174177
retryIO(description = "removeUser($roomId, $roomType, $userId)") { client.removeUser(roomId, roomType, userId) }
178+
notifier()
179+
view.setMemberCount(--totalMembers)
175180
} catch (ex: RocketChatException) {
176181
view.showMessage(ex.message!!) // TODO Remove.
177182
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.

app/src/main/java/chat/rocket/android/members/presentation/MembersView.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,11 @@ interface MembersView: LoadingView, MessageView {
1313
* @param total The total number of members.
1414
*/
1515
fun showMembers(dataSet: List<MemberUiModel>, total: Long)
16+
17+
/**
18+
* Set count of members of a room.
19+
*
20+
* @param totalMembers The total number of members.
21+
*/
22+
fun setMemberCount(totalMembers: Long?)
1623
}

app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ class MembersFragment : Fragment(), MembersView {
9696
ui { view_loading.isVisible = true }
9797
}
9898

99+
override fun setMemberCount(totalMembers: Long?){
100+
setupToolbar(totalMembers)
101+
}
102+
99103
override fun hideLoading() {
100104
ui { view_loading.isVisible = false }
101105
}

0 commit comments

Comments
 (0)