Skip to content

Commit 1ca7b0a

Browse files
authored
Merge pull request #797 from vector-im/feature/cjs/hide-self-in-search
2 parents f32a0ca + 31056f0 commit 1ca7b0a

File tree

7 files changed

+75
-17
lines changed

7 files changed

+75
-17
lines changed

features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class RoomMemberDetailsPresenter @AssistedInject constructor(
100100
avatarUrl = userAvatar,
101101
isBlocked = isBlocked.value,
102102
displayConfirmationDialog = confirmationDialog,
103-
isCurrentUser = roomMember?.userId == client.sessionId,
103+
isCurrentUser = client.isMe(roomMember?.userId),
104104
eventSink = ::handleEvents
105105
)
106106
}

libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class DefaultRoomLastMessageFormatter @Inject constructor(
6262
) : RoomLastMessageFormatter {
6363

6464
override fun format(event: EventTimelineItem, isDmRoom: Boolean): CharSequence? {
65-
val isOutgoing = event.sender == matrixClient.sessionId
65+
val isOutgoing = matrixClient.isMe(event.sender)
6666
val senderDisplayName = (event.senderProfile as? ProfileTimelineDetails.Ready)?.displayName ?: event.sender.value
6767
return when (val content = event.content) {
6868
is MessageContent -> processMessageContents(content, senderDisplayName, isDmRoom)

libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class DefaultTimelineEventFormatter @Inject constructor(
4949
) : TimelineEventFormatter {
5050

5151
override fun format(event: EventTimelineItem): CharSequence? {
52-
val isOutgoing = event.sender == matrixClient.sessionId
52+
val isOutgoing = matrixClient.isMe(event.sender)
5353
val senderDisplayName = (event.senderProfile as? ProfileTimelineDetails.Ready)?.displayName ?: event.sender.value
5454
return when (val content = event.content) {
5555
is RoomMembershipContent -> {

libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/RoomMembershipContentFormatter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class RoomMembershipContentFormatter @Inject constructor(
3333
senderIsYou: Boolean,
3434
): CharSequence? {
3535
val userId = membershipContent.userId
36-
val memberIsYou = userId == matrixClient.sessionId
36+
val memberIsYou = matrixClient.isMe(userId)
3737
return when (val change = membershipContent.change) {
3838
MembershipChange.JOINED -> if (memberIsYou) {
3939
sp.getString(R.string.state_event_room_join_by_you)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,6 @@ interface MatrixClient : Closeable {
6262
suspend fun loadUserAvatarURLString(): Result<String?>
6363
suspend fun uploadMedia(mimeType: String, data: ByteArray, progressCallback: ProgressCallback?): Result<String>
6464
fun roomMembershipObserver(): RoomMembershipObserver
65+
66+
fun isMe(userId: UserId?) = userId == sessionId
6567
}

libraries/usersearch/impl/src/main/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserRepository.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package io.element.android.libraries.usersearch.impl
1818

1919
import com.squareup.anvil.annotations.ContributesBinding
2020
import io.element.android.libraries.di.SessionScope
21+
import io.element.android.libraries.matrix.api.MatrixClient
2122
import io.element.android.libraries.matrix.api.core.MatrixPatterns
2223
import io.element.android.libraries.matrix.api.core.UserId
2324
import io.element.android.libraries.matrix.api.user.MatrixUser
@@ -31,24 +32,29 @@ import javax.inject.Inject
3132

3233
@ContributesBinding(SessionScope::class)
3334
class MatrixUserRepository @Inject constructor(
35+
private val client: MatrixClient,
3436
private val dataSource: UserListDataSource
3537
) : UserRepository {
3638

3739
override suspend fun search(query: String): Flow<List<UserSearchResult>> = flow {
38-
// Manually add a fake result with the matrixId, if any
39-
val isUserId = MatrixPatterns.isUserId(query)
40-
if (isUserId) {
40+
// If the search term is a MXID that's not ours, we'll show a 'fake' result for that user, then update it when we get search results.
41+
val shouldQueryProfile = MatrixPatterns.isUserId(query) && !client.isMe(UserId(query))
42+
if (shouldQueryProfile) {
4143
emit(listOf(UserSearchResult(MatrixUser(UserId(query)))))
4244
}
4345

4446
if (query.length >= MINIMUM_SEARCH_LENGTH) {
4547
// Debounce
4648
delay(DEBOUNCE_TIME_MILLIS)
4749

48-
val results = dataSource.search(query, MAXIMUM_SEARCH_RESULTS).map { UserSearchResult(it) }.toMutableList()
50+
val results = dataSource
51+
.search(query, MAXIMUM_SEARCH_RESULTS)
52+
.filter { !client.isMe(it.userId) }
53+
.map { UserSearchResult(it) }
54+
.toMutableList()
4955

50-
// If the query is a user ID and the result doesn't contain that user ID, query the profile information explicitly
51-
if (isUserId && results.none { it.matrixUser.userId.value == query }) {
56+
// If the query is another user's MXID and the result doesn't contain that user ID, query the profile information explicitly
57+
if (shouldQueryProfile && results.none { it.matrixUser.userId.value == query }) {
5258
results.add(
5359
0,
5460
dataSource.getProfile(UserId(query))

libraries/usersearch/impl/src/test/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserRepositoryTest.kt

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,26 @@ package io.element.android.libraries.usersearch.impl
1818

1919
import app.cash.turbine.test
2020
import com.google.common.truth.Truth.assertThat
21+
import io.element.android.libraries.matrix.api.core.SessionId
2122
import io.element.android.libraries.matrix.api.core.UserId
2223
import io.element.android.libraries.matrix.api.user.MatrixUser
2324
import io.element.android.libraries.matrix.test.A_USER_ID
2425
import io.element.android.libraries.matrix.test.A_USER_NAME
26+
import io.element.android.libraries.matrix.test.FakeMatrixClient
2527
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
2628
import io.element.android.libraries.usersearch.api.UserSearchResult
2729
import io.element.android.libraries.usersearch.test.FakeUserListDataSource
2830
import kotlinx.coroutines.test.runTest
2931
import org.junit.Test
3032

33+
private val SESSION_ID = SessionId("@current-user:example.com")
34+
3135
internal class MatrixUserRepositoryTest {
3236

3337
@Test
3438
fun `search - emits nothing if the search query is too short`() = runTest {
3539
val dataSource = FakeUserListDataSource()
36-
val repository = MatrixUserRepository(dataSource)
40+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
3741

3842
val result = repository.search("x")
3943

@@ -45,7 +49,7 @@ internal class MatrixUserRepositoryTest {
4549
@Test
4650
fun `search - returns empty list if no results are found`() = runTest {
4751
val dataSource = FakeUserListDataSource()
48-
val repository = MatrixUserRepository(dataSource)
52+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
4953

5054
val result = repository.search("some query")
5155

@@ -59,7 +63,7 @@ internal class MatrixUserRepositoryTest {
5963
fun `search - returns users if results are found`() = runTest {
6064
val dataSource = FakeUserListDataSource()
6165
dataSource.givenSearchResult(aMatrixUserList())
62-
val repository = MatrixUserRepository(dataSource)
66+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
6367

6468
val result = repository.search("some query")
6569

@@ -72,7 +76,7 @@ internal class MatrixUserRepositoryTest {
7276
@Test
7377
fun `search - immediately returns placeholder if search is mxid`() = runTest {
7478
val dataSource = FakeUserListDataSource()
75-
val repository = MatrixUserRepository(dataSource)
79+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
7680

7781
val result = repository.search(A_USER_ID.value)
7882

@@ -83,12 +87,40 @@ internal class MatrixUserRepositoryTest {
8387
}
8488
}
8589

90+
@Test
91+
fun `search - doesn't return placeholder if search is the local user's mxid`() = runTest {
92+
val dataSource = FakeUserListDataSource()
93+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
94+
95+
val result = repository.search(SESSION_ID.value)
96+
97+
result.test {
98+
assertThat(awaitItem()).isEmpty()
99+
awaitComplete()
100+
}
101+
}
102+
103+
@Test
104+
fun `search - filters out results with the local user's mxid`() = runTest {
105+
val searchResults = aMatrixUserList() + MatrixUser(userId = SESSION_ID, displayName = A_USER_NAME)
106+
val dataSource = FakeUserListDataSource()
107+
dataSource.givenSearchResult(searchResults)
108+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
109+
110+
val result = repository.search("some text")
111+
112+
result.test {
113+
assertThat(awaitItem()).isEqualTo(aMatrixUserList().toUserSearchResults())
114+
awaitComplete()
115+
}
116+
}
117+
86118
@Test
87119
fun `search - does not change results if they contain searched mxid`() = runTest {
88120
val searchResults = aMatrixUserListWithoutUserId(A_USER_ID) + MatrixUser(userId = A_USER_ID, displayName = A_USER_NAME)
89121
val dataSource = FakeUserListDataSource()
90122
dataSource.givenSearchResult(searchResults)
91-
val repository = MatrixUserRepository(dataSource)
123+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
92124

93125
val result = repository.search(A_USER_ID.value)
94126

@@ -107,7 +139,7 @@ internal class MatrixUserRepositoryTest {
107139
val dataSource = FakeUserListDataSource()
108140
dataSource.givenSearchResult(searchResults)
109141
dataSource.givenUserProfile(userProfile)
110-
val repository = MatrixUserRepository(dataSource)
142+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
111143

112144
val result = repository.search(A_USER_ID.value)
113145

@@ -118,14 +150,32 @@ internal class MatrixUserRepositoryTest {
118150
}
119151
}
120152

153+
@Test
154+
fun `search - doesn't add profile results if searched mxid is local user and not in results`() = runTest {
155+
val userProfile = MatrixUser(userId = A_USER_ID, displayName = A_USER_NAME)
156+
val searchResults = aMatrixUserListWithoutUserId(SESSION_ID)
157+
158+
val dataSource = FakeUserListDataSource()
159+
dataSource.givenSearchResult(searchResults)
160+
dataSource.givenUserProfile(userProfile)
161+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
162+
163+
val result = repository.search(SESSION_ID.value)
164+
165+
result.test {
166+
assertThat(awaitItem()).isEqualTo(searchResults.toUserSearchResults())
167+
awaitComplete()
168+
}
169+
}
170+
121171
@Test
122172
fun `search - returns unresolved user if profile can't be loaded`() = runTest {
123173
val searchResults = aMatrixUserListWithoutUserId(A_USER_ID)
124174

125175
val dataSource = FakeUserListDataSource()
126176
dataSource.givenSearchResult(searchResults)
127177
dataSource.givenUserProfile(null)
128-
val repository = MatrixUserRepository(dataSource)
178+
val repository = MatrixUserRepository(FakeMatrixClient(SESSION_ID), dataSource)
129179

130180
val result = repository.search(A_USER_ID.value)
131181

0 commit comments

Comments
 (0)