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:
parent
7817f49072
commit
53b1b89c47
@ -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:
|
||||||
-
|
-
|
||||||
|
@ -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>(
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user