after login, the icon in the top left is a green 'A' for (all communities) rather than my avatar (#267)

This commit is contained in:
Benoit Marty 2019-09-26 17:13:52 +02:00
parent 7817f49072
commit 53b1b89c47
8 changed files with 78 additions and 18 deletions

View File

@ -13,6 +13,7 @@ Other changes:
Bugfix: Bugfix:
- Fix issue on upload error in loop (#587) - Fix issue on upload error in loop (#587)
- after login, the icon in the top left is a green 'A' for (all communities) rather than my avatar (#267)
Translations: Translations:
- -

View File

@ -20,7 +20,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.android.MainThreadDisposable import io.reactivex.android.MainThreadDisposable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
private class LiveDataObservable<T>( private class LiveDataObservable<T>(

View File

@ -24,6 +24,7 @@ import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams
import im.vector.matrix.android.api.session.sync.SyncState import im.vector.matrix.android.api.session.sync.SyncState
import im.vector.matrix.android.api.session.user.model.User import im.vector.matrix.android.api.session.user.model.User
import im.vector.matrix.android.api.util.Optional
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.Single import io.reactivex.Single
@ -45,6 +46,10 @@ class RxSession(private val session: Session) {
return session.livePushers().asObservable() return session.livePushers().asObservable()
} }
fun liveUser(userId: String): Observable<Optional<User>> {
return session.liveUser(userId).asObservable()
}
fun liveUsers(): Observable<List<User>> { fun liveUsers(): Observable<List<User>> {
return session.liveUsers().asObservable() return session.liveUsers().asObservable()
} }

View File

@ -21,6 +21,7 @@ import androidx.paging.PagedList
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.session.user.model.User import im.vector.matrix.android.api.session.user.model.User
import im.vector.matrix.android.api.util.Cancelable import im.vector.matrix.android.api.util.Cancelable
import im.vector.matrix.android.api.util.Optional
/** /**
* This interface defines methods to get users. It's implemented at the session level. * This interface defines methods to get users. It's implemented at the session level.
@ -47,9 +48,9 @@ interface UserService {
/** /**
* Observe a live user from a userId * Observe a live user from a userId
* @param userId the userId to look for. * @param userId the userId to look for.
* @return a Livedata of user with userId * @return a LiveData of user with userId
*/ */
fun liveUser(userId: String): LiveData<User?> fun liveUser(userId: String): LiveData<Optional<User>>
/** /**
* Observe a live list of users sorted alphabetically * Observe a live list of users sorted alphabetically

View File

@ -0,0 +1,42 @@
/*
* Copyright 2019 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.matrix.android.api.util
data class Optional<T : Any> constructor(private val value: T?) {
fun get(): T {
return value!!
}
fun getOrNull(): T? {
return value
}
fun getOrElse(fn: () -> T): T {
return value ?: fn()
}
companion object {
fun <T : Any> from(value: T?): Optional<T> {
return Optional(value)
}
}
}
fun <T : Any> T?.toOptional() = Optional(this)

View File

@ -26,6 +26,8 @@ import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.session.user.UserService import im.vector.matrix.android.api.session.user.UserService
import im.vector.matrix.android.api.session.user.model.User import im.vector.matrix.android.api.session.user.model.User
import im.vector.matrix.android.api.util.Cancelable import im.vector.matrix.android.api.util.Cancelable
import im.vector.matrix.android.api.util.Optional
import im.vector.matrix.android.api.util.toOptional
import im.vector.matrix.android.internal.database.RealmLiveData import im.vector.matrix.android.internal.database.RealmLiveData
import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.mapper.asDomain
import im.vector.matrix.android.internal.database.model.UserEntity import im.vector.matrix.android.internal.database.model.UserEntity
@ -66,7 +68,7 @@ internal class DefaultUserService @Inject constructor(private val monarchy: Mona
return userEntity.asDomain() return userEntity.asDomain()
} }
override fun liveUser(userId: String): LiveData<User?> { override fun liveUser(userId: String): LiveData<Optional<User>> {
val liveRealmData = RealmLiveData(monarchy.realmConfiguration) { realm -> val liveRealmData = RealmLiveData(monarchy.realmConfiguration) { realm ->
UserEntity.where(realm, userId) UserEntity.where(realm, userId)
} }
@ -74,6 +76,7 @@ internal class DefaultUserService @Inject constructor(private val monarchy: Mona
results results
.map { it.asDomain() } .map { it.asDomain() }
.firstOrNull() .firstOrNull()
.toOptional()
} }
} }

View File

@ -51,7 +51,8 @@ class HomeDrawerFragment : VectorBaseFragment() {
val groupListFragment = GroupListFragment.newInstance() val groupListFragment = GroupListFragment.newInstance()
replaceChildFragment(groupListFragment, R.id.homeDrawerGroupListContainer) replaceChildFragment(groupListFragment, R.id.homeDrawerGroupListContainer)
} }
session.liveUser(session.myUserId).observeK(this) { user -> session.liveUser(session.myUserId).observeK(this) { optionalUser ->
val user = optionalUser?.getOrNull()
if (user != null) { if (user != null) {
avatarRenderer.render(user.avatarUrl, user.userId, user.displayName, homeDrawerHeaderAvatarView) avatarRenderer.render(user.avatarUrl, user.userId, user.displayName, homeDrawerHeaderAvatarView)
homeDrawerUsernameView.text = user.displayName homeDrawerUsernameView.text = user.displayName

View File

@ -33,6 +33,8 @@ import im.vector.riotx.core.extensions.postLiveEvent
import im.vector.riotx.core.platform.VectorViewModel import im.vector.riotx.core.platform.VectorViewModel
import im.vector.riotx.core.resources.StringProvider import im.vector.riotx.core.resources.StringProvider
import im.vector.riotx.core.utils.LiveEvent import im.vector.riotx.core.utils.LiveEvent
import io.reactivex.Observable
import io.reactivex.functions.BiFunction
const val ALL_COMMUNITIES_GROUP_ID = "ALL_COMMUNITIES_GROUP_ID" const val ALL_COMMUNITIES_GROUP_ID = "ALL_COMMUNITIES_GROUP_ID"
@ -91,20 +93,26 @@ class GroupListViewModel @AssistedInject constructor(@Assisted initialState: Gro
} }
private fun observeGroupSummaries() { private fun observeGroupSummaries() {
session Observable.combineLatest<GroupSummary, List<GroupSummary>, List<GroupSummary>>(
.rx() session
.liveGroupSummaries() .rx()
// Keep only joined groups. Group invitations will be managed later .liveUser(session.myUserId)
.map { it.filter { groupSummary -> groupSummary.membership == Membership.JOIN } } .map { optionalUser ->
.map { GroupSummary(
val myUser = session.getUser(session.myUserId) groupId = ALL_COMMUNITIES_GROUP_ID,
val allCommunityGroup = GroupSummary( membership = Membership.JOIN,
groupId = ALL_COMMUNITIES_GROUP_ID, displayName = stringProvider.getString(R.string.group_all_communities),
membership = Membership.JOIN, avatarUrl = optionalUser.getOrNull()?.avatarUrl ?: "")
displayName = stringProvider.getString(R.string.group_all_communities), },
avatarUrl = myUser?.avatarUrl ?: "") session
listOf(allCommunityGroup) + it .rx()
.liveGroupSummaries()
// Keep only joined groups. Group invitations will be managed later
.map { it.filter { groupSummary -> groupSummary.membership == Membership.JOIN } },
BiFunction { allCommunityGroup, communityGroups ->
listOf(allCommunityGroup) + communityGroups
} }
)
.execute { async -> .execute { async ->
val newSelectedGroup = selectedGroup ?: async()?.firstOrNull() val newSelectedGroup = selectedGroup ?: async()?.firstOrNull()
copy(asyncGroups = async, selectedGroup = newSelectedGroup) copy(asyncGroups = async, selectedGroup = newSelectedGroup)