Skip to content

Commit f5fe5cc

Browse files
authored
Merge pull request #7372 from vector-im/feature/bma/fix_getUser_null
Handle properly when getUser returns null - prefer using getUserOrDefault
2 parents 1397266 + b7570a3 commit f5fe5cc

File tree

15 files changed

+85
-56
lines changed

15 files changed

+85
-56
lines changed

changelog.d/7372.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Handle properly when getUser returns null - prefer using getUserOrDefault

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,40 @@
1717

1818
package org.matrix.android.sdk.internal.session.profile
1919

20+
import com.zhuinden.monarchy.Monarchy
21+
import org.matrix.android.sdk.api.session.user.model.User
2022
import org.matrix.android.sdk.api.util.JsonDict
23+
import org.matrix.android.sdk.internal.di.SessionDatabase
2124
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
2225
import org.matrix.android.sdk.internal.network.executeRequest
26+
import org.matrix.android.sdk.internal.session.user.UserEntityFactory
2327
import org.matrix.android.sdk.internal.task.Task
28+
import org.matrix.android.sdk.internal.util.awaitTransaction
2429
import javax.inject.Inject
2530

2631
internal abstract class GetProfileInfoTask : Task<GetProfileInfoTask.Params, JsonDict> {
2732
data class Params(
28-
val userId: String
33+
val userId: String,
34+
val storeInDatabase: Boolean = true,
2935
)
3036
}
3137

3238
internal class DefaultGetProfileInfoTask @Inject constructor(
3339
private val profileAPI: ProfileAPI,
34-
private val globalErrorReceiver: GlobalErrorReceiver
40+
private val globalErrorReceiver: GlobalErrorReceiver,
41+
@SessionDatabase private val monarchy: Monarchy,
3542
) : GetProfileInfoTask() {
3643

3744
override suspend fun execute(params: Params): JsonDict {
3845
return executeRequest(globalErrorReceiver) {
3946
profileAPI.getProfile(params.userId)
47+
}.also { user ->
48+
if (params.storeInDatabase) {
49+
// Insert into DB
50+
monarchy.awaitTransaction {
51+
it.insertOrUpdate(UserEntityFactory.create(User.fromJson(params.userId, user)))
52+
}
53+
}
4054
}
4155
}
4256
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UpdateUserWorker.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,16 @@ internal class UpdateUserWorker(context: Context, params: WorkerParameters, sess
7171
?.saveLocally()
7272
}
7373

74-
private suspend fun fetchUsers(userIdsToFetch: Collection<String>) = userIdsToFetch.mapNotNull {
75-
tryOrNull {
76-
val profileJson = getProfileInfoTask.execute(GetProfileInfoTask.Params(it))
77-
User.fromJson(it, profileJson)
74+
private suspend fun fetchUsers(userIdsToFetch: Collection<String>): List<User> {
75+
return userIdsToFetch.mapNotNull { userId ->
76+
tryOrNull {
77+
val profileJson = getProfileInfoTask.execute(GetProfileInfoTask.Params(
78+
userId = userId,
79+
// Bulk insert later, so tell the task not to store the User.
80+
storeInDatabase = false,
81+
))
82+
User.fromJson(userId, profileJson)
83+
}
7884
}
7985
}
8086

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserDataSource.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ internal class UserDataSource @Inject constructor(
6666
}
6767
}
6868

69+
fun getUserOrDefault(userId: String): User = getUser(userId) ?: User(userId)
70+
6971
fun getUserLive(userId: String): LiveData<Optional<User>> {
7072
val liveData = monarchy.findAllMappedWithChanges(
7173
{ UserEntity.where(it, userId) },

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import org.matrix.android.sdk.api.session.content.ContentUrlResolver
2020
import org.matrix.android.sdk.api.session.events.model.Event
2121
import org.matrix.android.sdk.api.session.events.model.toModel
2222
import org.matrix.android.sdk.api.session.room.sender.SenderInfo
23-
import org.matrix.android.sdk.api.session.user.model.User
2423
import org.matrix.android.sdk.api.session.widgets.model.Widget
2524
import org.matrix.android.sdk.api.session.widgets.model.WidgetContent
2625
import org.matrix.android.sdk.api.session.widgets.model.WidgetType
@@ -74,7 +73,7 @@ internal class WidgetFactory @Inject constructor(
7473
// Ref: https://github.com/matrix-org/matrix-widget-api/blob/master/src/templating/url-template.ts#L29-L33
7574
fun computeURL(widget: Widget, isLightTheme: Boolean): String? {
7675
var computedUrl = widget.widgetContent.url ?: return null
77-
val myUser = userDataSource.getUser(userId) ?: User(userId)
76+
val myUser = userDataSource.getUserOrDefault(userId)
7877

7978
val keyValue = widget.widgetContent.data.mapKeys { "\$${it.key}" }.toMutableMap()
8079

vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/LocationPinProvider.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import im.vector.app.core.di.ActiveSessionHolder
2929
import im.vector.app.core.glide.GlideApp
3030
import im.vector.app.core.utils.DimensionConverter
3131
import im.vector.app.features.home.AvatarRenderer
32-
import org.matrix.android.sdk.api.session.getUser
32+
import org.matrix.android.sdk.api.session.getUserOrDefault
3333
import org.matrix.android.sdk.api.util.toMatrixItem
3434
import timber.log.Timber
3535
import javax.inject.Inject
@@ -67,9 +67,9 @@ class LocationPinProvider @Inject constructor(
6767

6868
activeSessionHolder
6969
.getActiveSession()
70-
.getUser(userId)
71-
?.toMatrixItem()
72-
?.let { userItem ->
70+
.getUserOrDefault(userId)
71+
.toMatrixItem()
72+
.let { userItem ->
7373
val size = dimensionConverter.dpToPx(44)
7474
val bgTintColor = matrixItemColorProvider.getColor(userItem)
7575
avatarRenderer.render(glideRequests, userItem, object : CustomTarget<Drawable>(size, size) {

vector/src/main/java/im/vector/app/features/html/PillsPostProcessor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import im.vector.app.core.glide.GlideApp
2727
import im.vector.app.features.home.AvatarRenderer
2828
import io.noties.markwon.core.spans.LinkSpan
2929
import org.matrix.android.sdk.api.session.getRoomSummary
30-
import org.matrix.android.sdk.api.session.getUser
30+
import org.matrix.android.sdk.api.session.getUserOrDefault
3131
import org.matrix.android.sdk.api.session.permalinks.PermalinkData
3232
import org.matrix.android.sdk.api.session.permalinks.PermalinkParser
3333
import org.matrix.android.sdk.api.session.room.model.RoomSummary
@@ -101,7 +101,7 @@ class PillsPostProcessor @AssistedInject constructor(
101101

102102
private fun PermalinkData.UserLink.toMatrixItem(roomId: String?): MatrixItem? =
103103
if (roomId == null) {
104-
sessionHolder.getSafeActiveSession()?.getUser(userId)?.toMatrixItem()
104+
sessionHolder.getSafeActiveSession()?.getUserOrDefault(userId)?.toMatrixItem()
105105
} else {
106106
sessionHolder.getSafeActiveSession()?.roomService()?.getRoomMember(userId, roomId)?.toMatrixItem()
107107
}

vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import org.matrix.android.sdk.api.extensions.orFalse
4040
import org.matrix.android.sdk.api.session.Session
4141
import org.matrix.android.sdk.api.session.events.model.EventType
4242
import org.matrix.android.sdk.api.session.getRoom
43-
import org.matrix.android.sdk.api.session.getUser
43+
import org.matrix.android.sdk.api.session.getUserOrDefault
4444
import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper
4545
import org.matrix.android.sdk.api.util.toMatrixItem
4646
import timber.log.Timber
@@ -101,7 +101,7 @@ class LocationSharingViewModel @AssistedInject constructor(
101101
}
102102

103103
private fun setUserItem() {
104-
setState { copy(userItem = session.getUser(session.myUserId)?.toMatrixItem()) }
104+
setState { copy(userItem = session.getUserOrDefault(session.myUserId).toMatrixItem()) }
105105
}
106106

107107
private fun updatePin(isUserPin: Boolean? = true) {

vector/src/main/java/im/vector/app/features/location/live/map/UserLiveLocationViewStateMapper.kt

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import im.vector.app.core.di.ActiveSessionHolder
2020
import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider
2121
import im.vector.app.features.location.toLocationData
2222
import kotlinx.coroutines.suspendCancellableCoroutine
23-
import org.matrix.android.sdk.api.session.getUser
23+
import org.matrix.android.sdk.api.session.getUserOrDefault
2424
import org.matrix.android.sdk.api.session.room.model.livelocation.LiveLocationShareAggregatedSummary
2525
import org.matrix.android.sdk.api.util.toMatrixItem
2626
import javax.inject.Inject
@@ -45,19 +45,17 @@ class UserLiveLocationViewStateMapper @Inject constructor(
4545
else -> {
4646
locationPinProvider.create(userId) { pinDrawable ->
4747
val session = activeSessionHolder.getActiveSession()
48-
session.getUser(userId)?.toMatrixItem()?.let { matrixItem ->
49-
val locationTimestampMillis = liveLocationShareAggregatedSummary.lastLocationDataContent?.getBestTimestampMillis()
50-
val viewState = UserLiveLocationViewState(
51-
matrixItem = matrixItem,
52-
pinDrawable = pinDrawable,
53-
locationData = locationData,
54-
endOfLiveTimestampMillis = liveLocationShareAggregatedSummary.endOfLiveTimestampMillis,
55-
locationTimestampMillis = locationTimestampMillis,
56-
showStopSharingButton = userId == session.myUserId
57-
)
58-
continuation.resume(viewState) {
59-
// do nothing on cancellation
60-
}
48+
val locationTimestampMillis = liveLocationShareAggregatedSummary.lastLocationDataContent?.getBestTimestampMillis()
49+
val viewState = UserLiveLocationViewState(
50+
matrixItem = session.getUserOrDefault(userId).toMatrixItem(),
51+
pinDrawable = pinDrawable,
52+
locationData = locationData,
53+
endOfLiveTimestampMillis = liveLocationShareAggregatedSummary.endOfLiveTimestampMillis,
54+
locationTimestampMillis = locationTimestampMillis,
55+
showStopSharingButton = userId == session.myUserId
56+
)
57+
continuation.resume(viewState) {
58+
// do nothing on cancellation
6159
}
6260
}
6361
}

vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import org.matrix.android.sdk.api.session.events.model.supportsNotification
3838
import org.matrix.android.sdk.api.session.events.model.toModel
3939
import org.matrix.android.sdk.api.session.getRoom
4040
import org.matrix.android.sdk.api.session.getRoomSummary
41-
import org.matrix.android.sdk.api.session.getUser
41+
import org.matrix.android.sdk.api.session.getUserOrDefault
4242
import org.matrix.android.sdk.api.session.room.getTimelineEvent
4343
import org.matrix.android.sdk.api.session.room.model.Membership
4444
import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
@@ -112,7 +112,7 @@ class NotifiableEventResolver @Inject constructor(
112112
val notificationAction = actions.toNotificationAction()
113113

114114
return if (notificationAction.shouldNotify) {
115-
val user = session.getUser(event.senderId!!) ?: return null
115+
val user = session.getUserOrDefault(event.senderId!!)
116116

117117
val timelineEvent = TimelineEvent(
118118
root = event,

0 commit comments

Comments
 (0)