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

Commit 3ea8d12

Browse files
committed
notify member list
1 parent 4d9727d commit 3ea8d12

File tree

5 files changed

+77
-28
lines changed

5 files changed

+77
-28
lines changed

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

+37-8
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class MembersAdapter(private val listener: (MemberUiModel) -> Unit, presenter: M
1818
ViewHolder(parent.inflate(R.layout.item_member), actionsListener)
1919

2020
override fun onBindViewHolder(holder: ViewHolder, position: Int) =
21-
holder.bind(dataSet[position], listener)
21+
holder.bind(dataSet[position], position, listener)
2222

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

@@ -40,26 +40,55 @@ class MembersAdapter(private val listener: (MemberUiModel) -> Unit, presenter: M
4040

4141
private val actionsListener = object : ViewHolder.ActionsListener {
4242
override fun isActionsEnabled(): Boolean = enableActions
43-
override fun onActionSelected(item: MenuItem, member: MemberUiModel) {
43+
override fun onActionSelected(item: MenuItem, member: MemberUiModel, index: Int) {
4444
member.apply {
4545
when (item.itemId) {
4646
R.id.action_member_set_owner-> {
47-
presenter?.toggleOwner(this.userId, this.roles?.contains("owner") == true )
47+
val isOwner = this.roles?.contains("owner") == true
48+
presenter?.toggleOwner(this.userId, isOwner) {
49+
if (isOwner)
50+
dataSet[index].roles = dataSet[index].roles?.filterNot { it == "owner"}
51+
else
52+
dataSet[index].roles = dataSet[index].roles?.plus("owner")
53+
notifyItemChanged(index)
54+
}
4855
}
4956
R.id.action_member_set_leader-> {
50-
presenter?.toggleLeader(this.userId, this.roles?.contains("leader") == true)
57+
val isLeader = this.roles?.contains("leader") == true
58+
presenter?.toggleLeader(this.userId, isLeader) {
59+
if (isLeader)
60+
dataSet[index].roles = dataSet[index].roles?.filterNot { it == "leader"}
61+
else
62+
dataSet[index].roles = dataSet[index].roles?.plus("leader")
63+
notifyItemChanged(index)
64+
}
5165
}
5266
R.id.action_member_set_moderator-> {
53-
presenter?.toggleModerator(this.userId, this.roles?.contains("moderator") == true)
67+
val isMod = this.roles?.contains("moderator") == true
68+
presenter?.toggleModerator(this.userId, isMod) {
69+
if (isMod)
70+
dataSet[index].roles = dataSet[index].roles?.filterNot { it == "moderator" }
71+
else
72+
dataSet[index].roles = dataSet[index].roles?.plus("moderator")
73+
notifyItemChanged(index)
74+
}
5475
}
5576
R.id.action_member_ignore-> {
56-
presenter?.toggleIgnore(this.userId, false)
77+
TODO("not implemented")
78+
// presenter?.toggleIgnore(this.userId, false){}
5779
}
5880
R.id.action_member_mute-> {
59-
presenter?.toggleMute(this.username, this.muted)
81+
presenter?.toggleMute(this.username, this.muted) {
82+
dataSet[index].muted = !this.muted
83+
notifyItemChanged(index)
84+
}
6085
}
6186
R.id.action_member_remove-> {
62-
presenter?.removeUser(this.userId)
87+
presenter?.removeUser(this.userId) {
88+
dataSet = dataSet.filterIndexed{ position, _-> position != index }
89+
notifyItemRemoved(index)
90+
notifyItemRangeChanged(index, dataSet.size)
91+
}
6392
}
6493
else -> TODO("Not implemented")
6594
}

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

+14-10
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

+15-10
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class MembersPresenter @Inject constructor(
3535
private var offset: Long = 0
3636
private lateinit var roomType: RoomType
3737
private lateinit var roomId: String
38+
private var totalMembers: Long = 0
3839
var isRoomOwner: Boolean = false
3940

4041
/**
@@ -68,6 +69,7 @@ class MembersPresenter @Inject constructor(
6869
it.muted = muted?.find { it == username }.isNotNullNorEmpty()
6970
}
7071
view.showMembers(memberUiModels, members.total)
72+
totalMembers = members.total
7173
offset += 1 * 60L
7274
}.ifNull {
7375
Timber.e("Couldn't find a room with id: $roomId at current server.")
@@ -88,64 +90,64 @@ class MembersPresenter @Inject constructor(
8890
navigator.toMemberDetails(memberUiModel.userId)
8991
}
9092

91-
fun toggleOwner(userId: String, isOwner: Boolean = false) {
93+
fun toggleOwner(userId: String, isOwner: Boolean = false, notifier: () ->Unit) {
9294
launchUI(strategy) {
9395
try {
9496
if (isOwner)
9597
retryIO(description = "removeOwner($roomId, $roomType, $userId)") { client.removeOwner(roomId, roomType, userId) }
9698
else
9799
retryIO(description = "addOwner($roomId, $roomType, $userId)") { client.addOwner(roomId, roomType, userId) }
98-
offset = 0
99-
navigator.toMembersList(roomId)
100+
notifier()
100101
} catch (ex: RocketChatException) {
101102
view.showMessage(ex.message!!) // TODO Remove.
102103
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
103104
}
104105
}
105106
}
106107

107-
fun toggleLeader(userId: String, isLeader: Boolean = false) {
108+
fun toggleLeader(userId: String, isLeader: Boolean = false, notifier: () ->Unit) {
108109
launchUI(strategy) {
109110
try {
110111
if (isLeader)
111112
retryIO(description = "removeLeader($roomId, $roomType, $userId)") { client.removeLeader(roomId, roomType, userId) }
112113
else
113114
retryIO(description = "addLeader($roomId, $roomType, $userId)") { client.addLeader(roomId, roomType, userId) }
114-
navigator.toMembersList(roomId)
115+
notifier()
115116
} catch (ex: RocketChatException) {
116117
view.showMessage(ex.message!!) // TODO Remove.
117118
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
118119
}
119120
}
120121
}
121122

122-
fun toggleModerator(userId: String, isModerator: Boolean = false) {
123+
fun toggleModerator(userId: String, isModerator: Boolean = false, notifier: () ->Unit) {
123124
launchUI(strategy) {
124125
try {
125126
if (isModerator)
126127
retryIO(description = "removeModerator($roomId, $roomType, $userId)") { client.removeModerator(roomId, roomType, userId) }
127128
else
128129
retryIO(description = "addModerator($roomId, $roomType, $userId)") { client.addModerator(roomId, roomType, userId) }
129-
navigator.toMembersList(roomId)
130+
notifier()
130131
} catch (ex: RocketChatException) {
131132
view.showMessage(ex.message!!) // TODO Remove.
132133
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
133134
}
134135
}
135136
}
136137

137-
fun toggleIgnore(userId: String, isIgnored: Boolean = false) {
138+
fun toggleIgnore(userId: String, isIgnored: Boolean = false, notifier: () ->Unit) {
138139
launchUI(strategy) {
139140
try {
140141
retryIO(description = "ignoreUser($roomId, $userId, ${!isIgnored})") { client.ignoreUser(roomId, userId, !isIgnored) }
142+
notifier()
141143
} catch (ex: RocketChatException) {
142144
view.showMessage(ex.message!!) // TODO Remove.
143145
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
144146
}
145147
}
146148
}
147149

148-
fun toggleMute(username: String?, isMuted: Boolean = false) {
150+
fun toggleMute(username: String?, isMuted: Boolean = false, notifier: () ->Unit) {
149151
launchUI(strategy) {
150152
try {
151153
if (isMuted)
@@ -156,17 +158,20 @@ class MembersPresenter @Inject constructor(
156158
retryIO("runCommand(mute, $username, $roomId)") {
157159
client.runCommand(Command("mute", username), roomId)
158160
}
161+
notifier()
159162
} catch (ex: RocketChatException) {
160163
view.showMessage(ex.message!!) // TODO Remove.
161164
Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber.
162165
}
163166
}
164167
}
165168

166-
fun removeUser(userId: String) {
169+
fun removeUser(userId: String, notifier: () ->Unit) {
167170
launchUI(strategy) {
168171
try {
169172
retryIO(description = "removeUser($roomId, $roomType, $userId)") { client.removeUser(roomId, roomType, userId) }
173+
notifier()
174+
view.setMemberCount(--totalMembers)
170175
} catch (ex: RocketChatException) {
171176
view.showMessage(ex.message!!) // TODO Remove.
172177
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

+7
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

+4
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ class MembersFragment : Fragment(), MembersView {
101101
ui { view_loading.isVisible = true }
102102
}
103103

104+
override fun setMemberCount(totalMembers: Long?){
105+
setupToolbar(totalMembers)
106+
}
107+
104108
override fun hideLoading() {
105109
ui { view_loading.isVisible = false }
106110
}

0 commit comments

Comments
 (0)