Skip to content

Commit a7541be

Browse files
authored
Merge pull request #2293 from element-hq/feature/bma/notificationCount
Iterate on notification badges
2 parents 2c6dd6c + c5fc45e commit a7541be

File tree

48 files changed

+138
-150
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+138
-150
lines changed

changelog.d/2282.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Room list Ensure the indicators stay grey if the global setting is set to mention only and a regular message is received.

features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt

Lines changed: 43 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import androidx.compose.runtime.Composable
3535
import androidx.compose.runtime.remember
3636
import androidx.compose.ui.Alignment
3737
import androidx.compose.ui.Modifier
38+
import androidx.compose.ui.graphics.Color
3839
import androidx.compose.ui.text.AnnotatedString
3940
import androidx.compose.ui.text.style.TextOverflow
4041
import androidx.compose.ui.tooling.preview.PreviewParameter
@@ -141,7 +142,7 @@ private fun RowScope.NameAndTimestampRow(room: RoomListRoomSummary) {
141142
Text(
142143
text = room.timestamp ?: "",
143144
style = ElementTheme.typography.fontBodySmMedium,
144-
color = if (room.isTimestampHighlighted) {
145+
color = if (room.isHighlighted) {
145146
ElementTheme.colors.unreadIndicator
146147
} else {
147148
MaterialTheme.roomListRoomMessageDate()
@@ -165,86 +166,61 @@ private fun RowScope.LastMessageAndIndicatorRow(room: RoomListRoomSummary) {
165166
maxLines = 2,
166167
overflow = TextOverflow.Ellipsis
167168
)
168-
169-
// Unread
169+
// Call and unread
170170
Row(
171171
modifier = Modifier.height(16.dp),
172172
horizontalArrangement = Arrangement.spacedBy(8.dp),
173173
verticalAlignment = Alignment.CenterVertically,
174174
) {
175-
// Video call
176-
OnGoingCallIcon(
177-
room.hasRoomCall,
178-
)
179-
// Other indicators
180-
NotificationIcons(
181-
room.userDefinedNotificationMode,
182-
room.numberOfUnreadMessages,
183-
room.numberOfUnreadMentions,
184-
)
175+
val tint = if (room.isHighlighted) ElementTheme.colors.unreadIndicator else ElementTheme.colors.iconQuaternary
176+
if (room.hasRoomCall) {
177+
OnGoingCallIcon(
178+
color = tint,
179+
)
180+
}
181+
if (room.userDefinedNotificationMode == RoomNotificationMode.MUTE) {
182+
NotificationOffIndicatorAtom()
183+
} else if (room.numberOfUnreadMentions > 0) {
184+
MentionIndicatorAtom()
185+
}
186+
if (room.hasNewContent) {
187+
UnreadIndicatorAtom(
188+
color = tint
189+
)
190+
}
185191
}
186192
}
187193

188194
@Composable
189195
private fun OnGoingCallIcon(
190-
hasRoomCall: Boolean,
196+
color: Color,
191197
) {
192-
if (hasRoomCall) {
193-
Icon(
194-
modifier = Modifier.size(16.dp),
195-
imageVector = CompoundIcons.VideoCallSolid,
196-
contentDescription = null,
197-
tint = ElementTheme.colors.unreadIndicator,
198-
)
199-
}
198+
Icon(
199+
modifier = Modifier.size(16.dp),
200+
imageVector = CompoundIcons.VideoCallSolid,
201+
contentDescription = null,
202+
tint = color,
203+
)
200204
}
201205

202206
@Composable
203-
private fun RowScope.NotificationIcons(
204-
userDefinedNotificationMode: RoomNotificationMode?,
205-
numberOfUnreadMessages: Int,
206-
numberOfUnreadMentions: Int,
207-
) {
208-
when (userDefinedNotificationMode) {
209-
null,
210-
RoomNotificationMode.ALL_MESSAGES -> {
211-
if (numberOfUnreadMentions > 0) {
212-
Icon(
213-
modifier = Modifier.size(16.dp),
214-
contentDescription = null,
215-
imageVector = CompoundIcons.Mention,
216-
tint = ElementTheme.colors.unreadIndicator,
217-
)
218-
UnreadIndicatorAtom()
219-
} else if (numberOfUnreadMessages > 0) {
220-
UnreadIndicatorAtom()
221-
}
222-
}
223-
RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY -> {
224-
if (numberOfUnreadMentions > 0) {
225-
Icon(
226-
modifier = Modifier.size(16.dp),
227-
contentDescription = null,
228-
imageVector = CompoundIcons.Mention,
229-
tint = ElementTheme.colors.unreadIndicator,
230-
)
231-
UnreadIndicatorAtom()
232-
} else if (numberOfUnreadMessages > 0) {
233-
UnreadIndicatorAtom(color = ElementTheme.colors.iconQuaternary)
234-
}
235-
}
236-
RoomNotificationMode.MUTE -> {
237-
Icon(
238-
modifier = Modifier.size(16.dp),
239-
contentDescription = null,
240-
imageVector = CompoundIcons.NotificationsSolidOff,
241-
tint = ElementTheme.colors.iconQuaternary,
242-
)
243-
if (numberOfUnreadMessages > 0 || numberOfUnreadMentions > 0) {
244-
UnreadIndicatorAtom(color = ElementTheme.colors.iconQuaternary)
245-
}
246-
}
247-
}
207+
private fun NotificationOffIndicatorAtom() {
208+
Icon(
209+
modifier = Modifier.size(16.dp),
210+
contentDescription = null,
211+
imageVector = CompoundIcons.NotificationsSolidOff,
212+
tint = ElementTheme.colors.iconQuaternary,
213+
)
214+
}
215+
216+
@Composable
217+
private fun MentionIndicatorAtom() {
218+
Icon(
219+
modifier = Modifier.size(16.dp),
220+
contentDescription = null,
221+
imageVector = CompoundIcons.Mention,
222+
tint = ElementTheme.colors.unreadIndicator,
223+
)
248224
}
249225

250226
@PreviewsDayNight

features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListRoomSummaryFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class RoomListRoomSummaryFactory @Inject constructor(
4343
avatarData = AvatarData(id, "S", size = AvatarSize.RoomListItem),
4444
numberOfUnreadMessages = 0,
4545
numberOfUnreadMentions = 0,
46+
numberOfUnreadNotifications = 0,
4647
userDefinedNotificationMode = null,
4748
hasRoomCall = false,
4849
isDm = false,
@@ -69,6 +70,7 @@ class RoomListRoomSummaryFactory @Inject constructor(
6970
name = roomSummary.details.name,
7071
numberOfUnreadMessages = roomSummary.details.numUnreadMessages,
7172
numberOfUnreadMentions = roomSummary.details.numUnreadMentions,
73+
numberOfUnreadNotifications = roomSummary.details.numUnreadNotifications,
7274
timestamp = lastMessageTimestampFormatter.format(roomSummary.details.lastMessageTimestamp),
7375
lastMessage = roomSummary.details.lastMessage?.let { message ->
7476
roomLastMessageFormatter.format(message.event, roomSummary.details.isDirect)

features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ data class RoomListRoomSummary(
2828
val name: String,
2929
val numberOfUnreadMessages: Int,
3030
val numberOfUnreadMentions: Int,
31+
val numberOfUnreadNotifications: Int,
3132
val timestamp: String?,
3233
val lastMessage: CharSequence?,
3334
val avatarData: AvatarData,
@@ -36,11 +37,10 @@ data class RoomListRoomSummary(
3637
val hasRoomCall: Boolean,
3738
val isDm: Boolean,
3839
) {
39-
val isTimestampHighlighted = hasRoomCall ||
40-
when (userDefinedNotificationMode) {
41-
null,
42-
RoomNotificationMode.ALL_MESSAGES -> numberOfUnreadMessages > 0 || numberOfUnreadMentions > 0
43-
RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY -> numberOfUnreadMentions > 0
44-
RoomNotificationMode.MUTE -> false
45-
}
40+
val isHighlighted = userDefinedNotificationMode != RoomNotificationMode.MUTE &&
41+
(numberOfUnreadNotifications > 0 || numberOfUnreadMentions > 0)
42+
43+
val hasNewContent = numberOfUnreadMessages > 0 ||
44+
numberOfUnreadMentions > 0 ||
45+
numberOfUnreadNotifications > 0
4646
}

features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryProvider.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ internal fun aRoomListRoomSummary(
8888
name: String = "Room name",
8989
numberOfUnreadMessages: Int = 0,
9090
numberOfUnreadMentions: Int = 0,
91+
numberOfUnreadNotifications: Int = 0,
9192
lastMessage: String? = "Last message",
9293
timestamp: String? = lastMessage?.let { "88:88" },
9394
isPlaceholder: Boolean = false,
@@ -101,6 +102,7 @@ internal fun aRoomListRoomSummary(
101102
name = name,
102103
numberOfUnreadMessages = numberOfUnreadMessages,
103104
numberOfUnreadMentions = numberOfUnreadMentions,
105+
numberOfUnreadNotifications = numberOfUnreadNotifications,
104106
timestamp = timestamp,
105107
lastMessage = lastMessage,
106108
avatarData = avatarData,

features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ private val aRoomListRoomSummary = RoomListRoomSummary(
442442
name = A_ROOM_NAME,
443443
numberOfUnreadMentions = 1,
444444
numberOfUnreadMessages = 2,
445+
numberOfUnreadNotifications = 0,
445446
timestamp = A_FORMATTED_DATE,
446447
lastMessage = "",
447448
avatarData = AvatarData(id = A_ROOM_ID.value, name = A_ROOM_NAME, size = AvatarSize.RoomListItem),

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomSummary.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ data class RoomSummaryDetails(
4242
val lastMessage: RoomMessage?,
4343
val numUnreadMessages: Int,
4444
val numUnreadMentions: Int,
45+
val numUnreadNotifications: Int,
4546
val inviter: RoomMember?,
4647
val userDefinedNotificationMode: RoomNotificationMode?,
4748
val hasRoomCall: Boolean,

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryDetailsFactory.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class RoomSummaryDetailsFactory(private val roomMessageFactory: RoomMessageFacto
3737
avatarUrl = roomInfo.avatarUrl,
3838
numUnreadMentions = roomInfo.numUnreadMentions.toInt(),
3939
numUnreadMessages = roomInfo.numUnreadMessages.toInt(),
40+
numUnreadNotifications = roomInfo.numUnreadNotifications.toInt(),
4041
lastMessage = latestRoomMessage,
4142
inviter = roomInfo.inviter?.let(RoomMemberMapper::map),
4243
userDefinedNotificationMode = roomInfo.userDefinedNotificationMode?.let(RoomNotificationSettingsMapper::mapMode),

libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ fun aRoomSummaryDetails(
6161
lastMessage: RoomMessage? = aRoomMessage(),
6262
numUnreadMentions: Int = 0,
6363
numUnreadMessages: Int = 0,
64+
numUnreadNotifications: Int = 0,
6465
notificationMode: RoomNotificationMode? = null,
6566
inviter: RoomMember? = null,
6667
canonicalAlias: String? = null,
@@ -74,6 +75,7 @@ fun aRoomSummaryDetails(
7475
lastMessage = lastMessage,
7576
numUnreadMentions = numUnreadMentions,
7677
numUnreadMessages = numUnreadMessages,
78+
numUnreadNotifications = numUnreadNotifications,
7779
userDefinedNotificationMode = notificationMode,
7880
inviter = inviter,
7981
canonicalAlias = canonicalAlias,

libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ fun aRoomSummaryDetails(
115115
isDm: Boolean = false,
116116
numUnreadMentions: Int = 0,
117117
numUnreadMessages: Int = 0,
118+
numUnreadNotifications: Int = 0,
118119
) = RoomSummaryDetails(
119120
roomId = roomId,
120121
name = name,
@@ -128,4 +129,5 @@ fun aRoomSummaryDetails(
128129
isDm = isDm,
129130
numUnreadMentions = numUnreadMentions,
130131
numUnreadMessages = numUnreadMessages,
132+
numUnreadNotifications = numUnreadNotifications,
131133
)

0 commit comments

Comments
 (0)