AccountData cleanup and Javadoc
This commit is contained in:
parent
446d826dd3
commit
76085a4284
|
@ -123,10 +123,10 @@ class RxSession(private val session: Session) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun liveAccountData(filter: List<String>): Observable<List<UserAccountDataEvent>> {
|
fun liveAccountData(types: Set<String>): Observable<List<UserAccountDataEvent>> {
|
||||||
return session.getLiveAccountDataEvents(filter).asObservable()
|
return session.getLiveAccountDataEvents(types).asObservable()
|
||||||
.startWithCallable {
|
.startWithCallable {
|
||||||
session.getAccountDataEvents(filter)
|
session.getAccountDataEvents(types)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,18 +19,35 @@ package im.vector.matrix.android.api.session.accountdata
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import im.vector.matrix.android.api.MatrixCallback
|
import im.vector.matrix.android.api.MatrixCallback
|
||||||
import im.vector.matrix.android.api.session.events.model.Content
|
import im.vector.matrix.android.api.session.events.model.Content
|
||||||
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
import im.vector.matrix.android.api.util.Optional
|
import im.vector.matrix.android.api.util.Optional
|
||||||
import im.vector.matrix.android.internal.session.sync.model.accountdata.UserAccountDataEvent
|
import im.vector.matrix.android.internal.session.sync.model.accountdata.UserAccountDataEvent
|
||||||
|
|
||||||
interface AccountDataService {
|
interface AccountDataService {
|
||||||
|
/**
|
||||||
|
* Retrieve the account data with the provided type or null if not found
|
||||||
|
*/
|
||||||
fun getAccountDataEvent(type: String): UserAccountDataEvent?
|
fun getAccountDataEvent(type: String): UserAccountDataEvent?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Observe the account data with the provided type
|
||||||
|
*/
|
||||||
fun getLiveAccountDataEvent(type: String): LiveData<Optional<UserAccountDataEvent>>
|
fun getLiveAccountDataEvent(type: String): LiveData<Optional<UserAccountDataEvent>>
|
||||||
|
|
||||||
fun getAccountDataEvents(filterType: List<String>): List<UserAccountDataEvent>
|
/**
|
||||||
|
* Retrieve the account data with the provided types. The return list can have a different size that
|
||||||
|
* the size of the types set, because some AccountData may not exist.
|
||||||
|
* If an empty set is provided, all the AccountData are retrieved
|
||||||
|
*/
|
||||||
|
fun getAccountDataEvents(types: Set<String>): List<UserAccountDataEvent>
|
||||||
|
|
||||||
fun getLiveAccountDataEvents(filterType: List<String>): LiveData<List<UserAccountDataEvent>>
|
/**
|
||||||
|
* Observe the account data with the provided types. If an empty set is provided, all the AccountData are observed
|
||||||
|
*/
|
||||||
|
fun getLiveAccountDataEvents(types: Set<String>): LiveData<List<UserAccountDataEvent>>
|
||||||
|
|
||||||
fun updateAccountData(type: String, content: Content, callback: MatrixCallback<Unit>? = null)
|
/**
|
||||||
|
* Update the account data with the provided type and the provided account data content
|
||||||
|
*/
|
||||||
|
fun updateAccountData(type: String, content: Content, callback: MatrixCallback<Unit>? = null): Cancelable
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,7 +269,7 @@ internal abstract class SessionModule {
|
||||||
abstract fun bindHomeServerCapabilitiesService(homeServerCapabilitiesService: DefaultHomeServerCapabilitiesService): HomeServerCapabilitiesService
|
abstract fun bindHomeServerCapabilitiesService(homeServerCapabilitiesService: DefaultHomeServerCapabilitiesService): HomeServerCapabilitiesService
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindAccountDataService(accountDataService: DefaultAccountDataService): AccountDataService
|
abstract fun bindAccountDataService(service: DefaultAccountDataService): AccountDataService
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindSharedSecretStorageService(service: DefaultSharedSecretStorageService): SharedSecretStorageService
|
abstract fun bindSharedSecretStorageService(service: DefaultSharedSecretStorageService): SharedSecretStorageService
|
||||||
|
|
|
@ -22,13 +22,13 @@ import com.zhuinden.monarchy.Monarchy
|
||||||
import im.vector.matrix.android.api.MatrixCallback
|
import im.vector.matrix.android.api.MatrixCallback
|
||||||
import im.vector.matrix.android.api.session.accountdata.AccountDataService
|
import im.vector.matrix.android.api.session.accountdata.AccountDataService
|
||||||
import im.vector.matrix.android.api.session.events.model.Content
|
import im.vector.matrix.android.api.session.events.model.Content
|
||||||
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
import im.vector.matrix.android.api.util.JSON_DICT_PARAMETERIZED_TYPE
|
import im.vector.matrix.android.api.util.JSON_DICT_PARAMETERIZED_TYPE
|
||||||
import im.vector.matrix.android.api.util.Optional
|
import im.vector.matrix.android.api.util.Optional
|
||||||
import im.vector.matrix.android.api.util.toOptional
|
import im.vector.matrix.android.api.util.toOptional
|
||||||
import im.vector.matrix.android.internal.database.model.UserAccountDataEntity
|
import im.vector.matrix.android.internal.database.model.UserAccountDataEntity
|
||||||
import im.vector.matrix.android.internal.database.model.UserAccountDataEntityFields
|
import im.vector.matrix.android.internal.database.model.UserAccountDataEntityFields
|
||||||
import im.vector.matrix.android.internal.di.MoshiProvider
|
import im.vector.matrix.android.internal.di.MoshiProvider
|
||||||
import im.vector.matrix.android.internal.di.SessionId
|
|
||||||
import im.vector.matrix.android.internal.session.sync.UserAccountDataSyncHandler
|
import im.vector.matrix.android.internal.session.sync.UserAccountDataSyncHandler
|
||||||
import im.vector.matrix.android.internal.session.sync.model.accountdata.UserAccountDataEvent
|
import im.vector.matrix.android.internal.session.sync.model.accountdata.UserAccountDataEvent
|
||||||
import im.vector.matrix.android.internal.task.TaskExecutor
|
import im.vector.matrix.android.internal.task.TaskExecutor
|
||||||
|
@ -37,7 +37,6 @@ import javax.inject.Inject
|
||||||
|
|
||||||
internal class DefaultAccountDataService @Inject constructor(
|
internal class DefaultAccountDataService @Inject constructor(
|
||||||
private val monarchy: Monarchy,
|
private val monarchy: Monarchy,
|
||||||
@SessionId private val sessionId: String,
|
|
||||||
private val updateUserAccountDataTask: UpdateUserAccountDataTask,
|
private val updateUserAccountDataTask: UpdateUserAccountDataTask,
|
||||||
private val userAccountDataSyncHandler: UserAccountDataSyncHandler,
|
private val userAccountDataSyncHandler: UserAccountDataSyncHandler,
|
||||||
private val taskExecutor: TaskExecutor
|
private val taskExecutor: TaskExecutor
|
||||||
|
@ -47,39 +46,39 @@ internal class DefaultAccountDataService @Inject constructor(
|
||||||
private val adapter = moshi.adapter<Map<String, Any>>(JSON_DICT_PARAMETERIZED_TYPE)
|
private val adapter = moshi.adapter<Map<String, Any>>(JSON_DICT_PARAMETERIZED_TYPE)
|
||||||
|
|
||||||
override fun getAccountDataEvent(type: String): UserAccountDataEvent? {
|
override fun getAccountDataEvent(type: String): UserAccountDataEvent? {
|
||||||
return getAccountDataEvents(listOf(type)).firstOrNull()
|
return getAccountDataEvents(setOf(type)).firstOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getLiveAccountDataEvent(type: String): LiveData<Optional<UserAccountDataEvent>> {
|
override fun getLiveAccountDataEvent(type: String): LiveData<Optional<UserAccountDataEvent>> {
|
||||||
return Transformations.map(getLiveAccountDataEvents(listOf(type))) {
|
return Transformations.map(getLiveAccountDataEvents(setOf(type))) {
|
||||||
it.firstOrNull()?.toOptional()
|
it.firstOrNull()?.toOptional()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getAccountDataEvents(filterType: List<String>): List<UserAccountDataEvent> {
|
override fun getAccountDataEvents(types: Set<String>): List<UserAccountDataEvent> {
|
||||||
return monarchy.fetchAllCopiedSync { realm ->
|
return monarchy.fetchAllCopiedSync { realm ->
|
||||||
realm.where(UserAccountDataEntity::class.java)
|
realm.where(UserAccountDataEntity::class.java)
|
||||||
.apply {
|
.apply {
|
||||||
if (filterType.isNotEmpty()) {
|
if (types.isNotEmpty()) {
|
||||||
`in`(UserAccountDataEntityFields.TYPE, filterType.toTypedArray())
|
`in`(UserAccountDataEntityFields.TYPE, types.toTypedArray())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}?.mapNotNull { entity ->
|
}.mapNotNull { entity ->
|
||||||
entity.type?.let { type ->
|
entity.type?.let { type ->
|
||||||
UserAccountDataEvent(
|
UserAccountDataEvent(
|
||||||
type = type,
|
type = type,
|
||||||
content = entity.contentStr?.let { adapter.fromJson(it) } ?: emptyMap()
|
content = entity.contentStr?.let { adapter.fromJson(it) } ?: emptyMap()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} ?: emptyList()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getLiveAccountDataEvents(filterType: List<String>): LiveData<List<UserAccountDataEvent>> {
|
override fun getLiveAccountDataEvents(types: Set<String>): LiveData<List<UserAccountDataEvent>> {
|
||||||
return monarchy.findAllMappedWithChanges({ realm ->
|
return monarchy.findAllMappedWithChanges({ realm ->
|
||||||
realm.where(UserAccountDataEntity::class.java)
|
realm.where(UserAccountDataEntity::class.java)
|
||||||
.apply {
|
.apply {
|
||||||
if (filterType.isNotEmpty()) {
|
if (types.isNotEmpty()) {
|
||||||
`in`(UserAccountDataEntityFields.TYPE, filterType.toTypedArray())
|
`in`(UserAccountDataEntityFields.TYPE, types.toTypedArray())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, { entity ->
|
}, { entity ->
|
||||||
|
@ -90,14 +89,15 @@ internal class DefaultAccountDataService @Inject constructor(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun updateAccountData(type: String, content: Content, callback: MatrixCallback<Unit>?) {
|
override fun updateAccountData(type: String, content: Content, callback: MatrixCallback<Unit>?): Cancelable {
|
||||||
updateUserAccountDataTask.configureWith(UpdateUserAccountDataTask.AnyParams(
|
return updateUserAccountDataTask.configureWith(UpdateUserAccountDataTask.AnyParams(
|
||||||
type = type,
|
type = type,
|
||||||
any = content
|
any = content
|
||||||
)) {
|
)) {
|
||||||
this.retryCount = 5
|
this.retryCount = 5
|
||||||
this.callback = object : MatrixCallback<Unit> {
|
this.callback = object : MatrixCallback<Unit> {
|
||||||
override fun onSuccess(data: Unit) {
|
override fun onSuccess(data: Unit) {
|
||||||
|
// TODO Move that to the task (but it created a circular dependencies...)
|
||||||
monarchy.runTransactionSync { realm ->
|
monarchy.runTransactionSync { realm ->
|
||||||
userAccountDataSyncHandler.handleGenericAccountData(realm, type, content)
|
userAccountDataSyncHandler.handleGenericAccountData(realm, type, content)
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ class AccountDataViewModel @AssistedInject constructor(@Assisted initialState: A
|
||||||
: VectorViewModel<AccountDataViewState, EmptyAction, EmptyViewEvents>(initialState) {
|
: VectorViewModel<AccountDataViewState, EmptyAction, EmptyViewEvents>(initialState) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
session.rx().liveAccountData(emptyList())
|
session.rx().liveAccountData(emptySet())
|
||||||
.execute {
|
.execute {
|
||||||
copy(accountData = it)
|
copy(accountData = it)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue