Fix migrations

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2020-03-10 12:38:08 +01:00
parent 01ff371f35
commit d05a0a90fb
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
15 changed files with 136 additions and 84 deletions

View File

@ -149,7 +149,7 @@ class MainActivity : BaseActivity(), ActionBarProvider {
extras.putParcelable(BundleKeys.KEY_USER_ENTITY, it)
withContext(Dispatchers.Main) {
ConductorRemapping.remapChatController(
router!!, it.id,
router!!, it.id!!,
intent.getStringExtra(BundleKeys.KEY_CONVERSATION_TOKEN)!!, extras, false)
}
}

View File

@ -52,8 +52,10 @@ import com.nextcloud.talk.newarch.features.account.di.module.AccountModule
import com.nextcloud.talk.newarch.features.contactsflow.di.module.ContactsFlowModule
import com.nextcloud.talk.newarch.features.conversationslist.di.module.ConversationsListModule
import com.nextcloud.talk.newarch.local.dao.UsersDao
import com.nextcloud.talk.newarch.local.models.User
import com.nextcloud.talk.newarch.local.models.UserNgEntity
import com.nextcloud.talk.newarch.local.models.other.UserStatus.*
import com.nextcloud.talk.newarch.local.models.toUserEntity
import com.nextcloud.talk.newarch.services.shortcuts.ShortcutService
import com.nextcloud.talk.utils.ClosedInterfaceImpl
import com.nextcloud.talk.utils.DisplayUtils
@ -192,44 +194,49 @@ class NextcloudTalkApplication : Application(), LifecycleObserver, Configuration
if (!appPreferences.migrationToRoomFinished) {
GlobalScope.launch {
val users: List<UserEntity> = userUtils.users as List<UserEntity>
var userNg: UserNgEntity
val newUsers = mutableListOf<UserNgEntity>()
var newUser: User
val newUsers = mutableListOf<User>()
for (user in users) {
userNg = UserNgEntity(user.id, user.userId, user.username, user.baseUrl)
userNg.token = user.token
userNg.displayName = user.displayName
newUser = User(userId = user.userId, username = user.username, baseUrl = user.baseUrl)
newUser.token = user.token
newUser.displayName = user.displayName
try {
userNg.pushConfiguration =
newUser.pushConfiguration =
LoganSquare.parse(user.pushConfigurationState, PushConfiguration::class.java)
} catch (e: Exception) {
// no push
}
if (user.capabilities != null) {
userNg.capabilities = LoganSquare.parse(user.capabilities, Capabilities::class.java)
newUser.capabilities = LoganSquare.parse(user.capabilities, Capabilities::class.java)
}
userNg.clientCertificate = user.clientCertificate
newUser.clientCertificate = user.clientCertificate
try {
val external = LoganSquare.parse(user.externalSignalingServer, ExternalSignalingServer::class.java)
val signalingSettings = SignalingSettings()
signalingSettings.externalSignalingServer = external.externalSignalingServer
signalingSettings.externalSignalingTicket = external.externalSignalingTicket
userNg.signalingSettings = signalingSettings
newUser.signalingSettings = signalingSettings
} catch (e: Exception) {
// no external signaling
}
if (user.current) {
userNg.status = ACTIVE
newUser.status = ACTIVE
} else {
if (user.scheduledForDeletion) {
userNg.status = PENDING_DELETE
newUser.status = PENDING_DELETE
} else {
userNg.status = DORMANT
newUser.status = DORMANT
}
}
newUsers.add(userNg)
newUsers.add(newUser)
}
usersDao.saveUsers(*newUsers.toTypedArray())
val userEntities = newUsers.map {
it.toUserEntity()
}
usersDao.saveUsers(*userEntities.toTypedArray())
dataStore.delete()
appPreferences.migrationToRoomFinished = true
}

View File

@ -248,7 +248,7 @@ class MessageNotificationWorker(
var notificationId = decryptedPushMessage.timestamp.toInt()
val notificationInfoBundle = Bundle()
notificationInfoBundle.putLong(BundleKeys.KEY_INTERNAL_USER_ID, signatureVerification.userEntity!!.id)
notificationInfoBundle.putLong(BundleKeys.KEY_INTERNAL_USER_ID, signatureVerification.userEntity!!.id!!)
notificationInfoBundle.putString(BundleKeys.KEY_CONVERSATION_TOKEN, decryptedPushMessage.id)
notificationInfoBundle.putLong(BundleKeys.KEY_NOTIFICATION_ID, decryptedPushMessage.notificationId!!)
notificationBuilder.extras = notificationInfoBundle

View File

@ -23,6 +23,7 @@
package com.nextcloud.talk.newarch.features.account.loginentry
import android.app.Application
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.nextcloud.talk.models.LoginData
@ -38,7 +39,10 @@ import com.nextcloud.talk.newarch.data.model.ErrorModel
import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository
import com.nextcloud.talk.newarch.domain.usecases.*
import com.nextcloud.talk.newarch.domain.usecases.base.UseCaseResponse
import com.nextcloud.talk.newarch.local.models.UserNgEntity
import com.nextcloud.talk.newarch.local.models.User
import com.nextcloud.talk.newarch.local.models.other.UserStatus
import com.nextcloud.talk.newarch.local.models.toUser
import com.nextcloud.talk.newarch.local.models.toUserEntity
import com.nextcloud.talk.utils.PushUtils
import com.nextcloud.talk.utils.preferences.AppPreferences
import kotlinx.coroutines.Dispatchers
@ -59,7 +63,7 @@ class LoginEntryViewModel constructor(
BaseViewModel<LoginEntryView>(application) {
val state: MutableLiveData<LoginEntryStateWrapper> = MutableLiveData(LoginEntryStateWrapper(LoginEntryState.PENDING_CHECK, null))
private var user = UserNgEntity(-1, "-1", "", "")
private var user: User? = null
private var updatingUser = false
fun parseData(prefix: String, separator: String, data: String?) {
@ -116,25 +120,26 @@ class LoginEntryViewModel constructor(
val userIfExists = usersRepository.getUserWithUsernameAndServer(loginData.username!!, loginData.serverUrl!!)
if (userIfExists != null) {
updatingUser = true
user = userIfExists
user.token = loginData.token
usersRepository.updateUser(user)
user = userIfExists.toUser()
user!!.token = loginData.token
usersRepository.updateUser(user!!.toUserEntity())
// complicated - we need to unregister, etc, etc, but not yet
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.ACCOUNT_UPDATED))
} else {
user = User(null, "", "", "")
getProfile(loginData)
}
}
private fun getProfile(loginData: LoginData) {
user.username = loginData.username!!
user.baseUrl = loginData.serverUrl!!
user.token = loginData.token
getProfileUseCase.invoke(viewModelScope, parametersOf(user), object : UseCaseResponse<UserProfileOverall> {
user!!.username = loginData.username!!
user!!.baseUrl = loginData.serverUrl!!
user!!.token = loginData.token
getProfileUseCase.invoke(viewModelScope, parametersOf(user!!.toUserEntity()), object : UseCaseResponse<UserProfileOverall> {
override suspend fun onSuccess(result: UserProfileOverall) {
result.ocs.data.userId?.let { userId ->
user.displayName = result.ocs.data.displayName
user.userId = userId
user!!.displayName = result.ocs.data.displayName
user!!.userId = userId
getCapabilities()
} ?: run {
state.postValue(LoginEntryStateWrapper(LoginEntryState.FAILED, LoginEntryStateClarification.PROFILE_FETCH_FAILED))
@ -148,9 +153,9 @@ class LoginEntryViewModel constructor(
}
private fun getCapabilities() {
getCapabilitiesUseCase.invoke(viewModelScope, parametersOf(user.baseUrl), object : UseCaseResponse<CapabilitiesOverall> {
getCapabilitiesUseCase.invoke(viewModelScope, parametersOf(user!!.baseUrl), object : UseCaseResponse<CapabilitiesOverall> {
override suspend fun onSuccess(result: CapabilitiesOverall) {
user.capabilities = result.ocs.data.capabilities
user!!.capabilities = result.ocs.data.capabilities
getSignalingSettings()
}
@ -161,16 +166,17 @@ class LoginEntryViewModel constructor(
}
private fun getSignalingSettings() {
getSignalingSettingsUseCase.invoke(viewModelScope, parametersOf(user), object : UseCaseResponse<SignalingSettingsOverall> {
getSignalingSettingsUseCase.invoke(viewModelScope, parametersOf(user!!.toUserEntity()), object : UseCaseResponse<SignalingSettingsOverall> {
override suspend fun onSuccess(result: SignalingSettingsOverall) {
user.signalingSettings = result.ocs.signalingSettings
user!!.signalingSettings = result.ocs.signalingSettings
val pushConfiguration = PushConfiguration()
val pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.PENDING, 0)
pushConfiguration.pushConfigurationStateWrapper = pushConfigurationStateWrapper
user.pushConfiguration = pushConfiguration
user!!.pushConfiguration = pushConfiguration
withContext(Dispatchers.IO) {
usersRepository.insertUser(user)
setAdjustedUserAsActive()
user!!.id = usersRepository.insertUser(user!!.toUserEntity())
usersRepository.setUserAsActiveWithId(user!!.id!!)
user!!.status = UserStatus.ACTIVE
registerForPush()
}
}
@ -185,8 +191,8 @@ class LoginEntryViewModel constructor(
private suspend fun registerForPush() = withContext(Dispatchers.IO) {
val token = appPreferences.pushToken
if (!token.isNullOrBlank()) {
user.pushConfiguration?.pushToken = token
usersRepository.updateUser(user)
user!!.pushConfiguration!!.pushToken = token
usersRepository.updateUser(user!!.toUserEntity())
registerForPushWithServer(token)
} else {
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_MISSING_TOKEN))
@ -195,63 +201,53 @@ class LoginEntryViewModel constructor(
private fun registerForPushWithServer(token: String) {
val options = PushUtils(usersRepository).getMapForPushRegistrationWithServer(context, token)
registerPushWithServerUseCase.invoke(viewModelScope, parametersOf(user, options), object : UseCaseResponse<PushRegistrationOverall> {
registerPushWithServerUseCase.invoke(viewModelScope, parametersOf(user!!.toUserEntity(), options), object : UseCaseResponse<PushRegistrationOverall> {
override suspend fun onSuccess(result: PushRegistrationOverall) {
user.pushConfiguration?.deviceIdentifier = result.ocs.data.deviceIdentifier
user.pushConfiguration?.deviceIdentifierSignature = result.ocs.data.signature
user.pushConfiguration?.userPublicKey = result.ocs.data.publicKey
user.pushConfiguration?.pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.SERVER_REGISTRATION_DONE, null)
usersRepository.updateUser(user)
user!!.pushConfiguration!!.deviceIdentifier = result.ocs.data.deviceIdentifier
user!!.pushConfiguration!!.deviceIdentifierSignature = result.ocs.data.signature
user!!.pushConfiguration!!.userPublicKey = result.ocs.data.publicKey
user!!.pushConfiguration!!.pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.SERVER_REGISTRATION_DONE, null)
usersRepository.updateUser(user!!.toUserEntity())
registerForPushWithProxy()
}
override suspend fun onError(errorModel: ErrorModel?) {
user.pushConfiguration?.pushConfigurationStateWrapper?.pushConfigurationState = PushConfigurationState.FAILED_WITH_SERVER_REGISTRATION
user.pushConfiguration?.pushConfigurationStateWrapper?.reason = errorModel?.code
usersRepository.updateUser(user)
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.pushConfigurationState = PushConfigurationState.FAILED_WITH_SERVER_REGISTRATION
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.reason = errorModel?.code
usersRepository.updateUser(user!!.toUserEntity())
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_WITH_SERVER_FAILED))
}
})
}
private suspend fun registerForPushWithProxy() {
val options = PushUtils(usersRepository).getMapForPushRegistrationWithServer(user)
val options = PushUtils(usersRepository).getMapForPushRegistrationWithServer(user!!.toUserEntity())
if (options != null) {
registerPushWithProxyUseCase.invoke(viewModelScope, parametersOf(user, options), object : UseCaseResponse<Any> {
registerPushWithProxyUseCase.invoke(viewModelScope, parametersOf(user!!.toUserEntity(), options), object : UseCaseResponse<Any> {
override suspend fun onSuccess(result: Any) {
user.pushConfiguration?.pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.PROXY_REGISTRATION_DONE, null)
user!!.pushConfiguration!!.pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.PROXY_REGISTRATION_DONE, null)
withContext(Dispatchers.IO) {
usersRepository.updateUser(user)
usersRepository.updateUser(user!!.toUserEntity())
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, if (!updatingUser) LoginEntryStateClarification.ACCOUNT_CREATED else LoginEntryStateClarification.ACCOUNT_UPDATED))
}
}
override suspend fun onError(errorModel: ErrorModel?) {
user.pushConfiguration?.pushConfigurationStateWrapper?.pushConfigurationState = PushConfigurationState.FAILED_WITH_PROXY_REGISTRATION
user.pushConfiguration?.pushConfigurationStateWrapper?.reason = errorModel?.code
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.pushConfigurationState = PushConfigurationState.FAILED_WITH_PROXY_REGISTRATION
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.reason = errorModel?.code
withContext(Dispatchers.IO) {
usersRepository.updateUser(user)
setAdjustedUserAsActive()
usersRepository.updateUser(user!!.toUserEntity())
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_WITH_PUSH_PROXY_FAILED))
}
}
})
} else {
user.pushConfiguration?.pushConfigurationStateWrapper?.pushConfigurationState = PushConfigurationState.FAILED_WITH_PROXY_REGISTRATION
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.pushConfigurationState = PushConfigurationState.FAILED_WITH_PROXY_REGISTRATION
withContext(Dispatchers.IO) {
usersRepository.updateUser(user)
usersRepository.updateUser(user!!.toUserEntity())
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_WITH_PUSH_PROXY_FAILED))
}
}
}
private suspend fun setAdjustedUserAsActive() = withContext(Dispatchers.IO) {
if (user.id == -1L) {
val adjustedUser = usersRepository.getUserWithUsernameAndServer(user.username, user.baseUrl)
adjustedUser?.id?.let {
usersRepository.setUserAsActiveWithId(it)
}
}
}
}

View File

@ -57,7 +57,7 @@ class ChatViewModel constructor(application: Application,
fun init(user: UserNgEntity, conversationToken: String, conversationPassword: String?) {
viewModelScope.launch {
this@ChatViewModel.user = user
this@ChatViewModel.initConversation = conversationsRepository.getConversationForUserWithToken(user.id, conversationToken)
this@ChatViewModel.initConversation = conversationsRepository.getConversationForUserWithToken(user.id!!, conversationToken)
this@ChatViewModel.conversationPassword = conversationPassword
globalService.getConversation(conversationToken, this@ChatViewModel)
}
@ -70,7 +70,7 @@ class ChatViewModel constructor(application: Application,
override suspend fun gotConversationInfoForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: GlobalServiceInterface.OperationStatus) {
if (operationStatus == GlobalServiceInterface.OperationStatus.STATUS_OK) {
if (userNgEntity.id == user.id && conversation!!.token == initConversation?.token) {
this.conversation.value = conversationsRepository.getConversationForUserWithToken(user.id, conversation.token!!)
this.conversation.value = conversationsRepository.getConversationForUserWithToken(user.id!!, conversation.token!!)
conversation.token?.let { conversationToken ->
globalService.joinConversation(conversationToken, conversationPassword, this)
}

View File

@ -162,7 +162,7 @@ class ConversationsListView : BaseView() {
bundle.putString(BundleKeys.KEY_ROOM_ID, conversation.conversationId)
bundle.putParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION, Parcels.wrap(conversation))
ConductorRemapping.remapChatController(
router, user.id, conversation.token!!,
router, user.id!!, conversation.token!!,
bundle, false
)
}

View File

@ -78,7 +78,7 @@ class ConversationsListViewModel constructor(
filterLiveData.value = null
Transformations.switchMap(filterLiveData) { filter ->
if (user != null) {
conversationsRepository.getConversationsForUser(user.id, filter)
conversationsRepository.getConversationsForUser(user.id!!, filter)
} else {
liveData {
listOf<Conversation>()
@ -99,7 +99,7 @@ class ConversationsListViewModel constructor(
object : UseCaseResponse<GenericOverall> {
override suspend fun onSuccess(result: GenericOverall) {
conversationsRepository.deleteConversation(
globalService.currentUserLiveData.value!!.id, conversation
globalService.currentUserLiveData.value!!.id!!, conversation
.conversationId!!
)
}
@ -128,7 +128,7 @@ class ConversationsListViewModel constructor(
object : UseCaseResponse<GenericOverall> {
override suspend fun onSuccess(result: GenericOverall) {
conversationsRepository.deleteConversation(
globalService.currentUserLiveData.value!!.id, conversation
globalService.currentUserLiveData.value!!.id!!, conversation
.conversationId!!
)
}
@ -159,7 +159,7 @@ class ConversationsListViewModel constructor(
object : UseCaseResponse<GenericOverall> {
override suspend fun onSuccess(result: GenericOverall) {
conversationsRepository.setFavoriteValueForConversation(
globalService.currentUserLiveData.value!!.id,
globalService.currentUserLiveData.value!!.id!!,
conversation.conversationId!!, favorite
)
}
@ -202,7 +202,7 @@ class ConversationsListViewModel constructor(
}
conversationsRepository.saveConversationsForUser(
internalUserId,
internalUserId!!,
mutableList, true)
messageData = ""
conversationsLoadingLock.unlock()
@ -223,7 +223,7 @@ class ConversationsListViewModel constructor(
value: Boolean
) {
conversationsRepository.setChangingValueForConversation(
globalService.currentUserLiveData.value!!.id, conversation
globalService.currentUserLiveData.value!!.id!!, conversation
.conversationId!!, value
)
}

View File

@ -80,6 +80,7 @@ abstract class UsersDao {
val users = getUsers()
for (user in users) {
user.status = UserStatus.ACTIVE
updateUser(user)
return true
}

View File

@ -0,0 +1,44 @@
package com.nextcloud.talk.newarch.local.models
import android.os.Parcelable
import com.nextcloud.talk.models.json.capabilities.Capabilities
import com.nextcloud.talk.models.json.push.PushConfiguration
import com.nextcloud.talk.models.json.signaling.settings.SignalingSettings
import com.nextcloud.talk.newarch.local.models.other.UserStatus
import kotlinx.android.parcel.Parcelize
import kotlinx.serialization.Serializable
@Parcelize
@Serializable
data class User(
var id: Long? = null,
var userId: String,
var username: String,
var baseUrl: String,
var token: String? = null,
var displayName: String? = null,
var pushConfiguration: PushConfiguration? = null,
var capabilities: Capabilities? = null,
var clientCertificate: String? = null,
var signalingSettings: SignalingSettings? = null,
var status: UserStatus? = null
): Parcelable
fun User.toUserEntity() : UserNgEntity {
var userNgEntity: UserNgEntity? = null
this.id?.let {
userNgEntity = UserNgEntity(it, userId, username, baseUrl)
}?: run {
userNgEntity = UserNgEntity(userId = this.userId, username = this.username, baseUrl = this.baseUrl)
}
userNgEntity!!.token = this.token
userNgEntity!!.displayName = this.displayName
userNgEntity!!.pushConfiguration = this.pushConfiguration
userNgEntity!!.capabilities = this.capabilities
userNgEntity!!.clientCertificate = this.clientCertificate
userNgEntity!!.signalingSettings = this.signalingSettings
userNgEntity!!.status = status
return userNgEntity!!
}

View File

@ -39,7 +39,7 @@ import java.util.*
@Serializable
@Entity(tableName = "users")
data class UserNgEntity(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") var id: Long,
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") var id: Long = 0,
@ColumnInfo(name = "user_id") var userId: String,
@ColumnInfo(name = "username") var username: String,
@ColumnInfo(name = "base_url") var baseUrl: String,
@ -86,6 +86,10 @@ data class UserNgEntity(
}
}
fun UserNgEntity.toUser() : User {
return User(this.id, this.userId, this.username, this.baseUrl, this.token, this.displayName, this.pushConfiguration, this.capabilities, this.clientCertificate, this.signalingSettings, this.status)
}
fun UserNgEntity.getCredentials(): String = ApiUtils.getCredentials(username, token)
fun UserNgEntity.hasSpreedFeatureCapability(capabilityName: String): Boolean {

View File

@ -284,14 +284,14 @@ class CallService : Service(), KoinComponent, CoroutineScope {
}
private suspend fun getConversationForTokenAndUser(user: UserNgEntity, conversationToken: String): Conversation? {
var conversation = conversationsRepository.getConversationForUserWithToken(user.id, conversationToken)
var conversation = conversationsRepository.getConversationForUserWithToken(user.id!!, conversationToken)
if (conversation == null) {
val getConversationUseCase = GetConversationUseCase(componentsWithEmptyCookieJar.getRepository(), apiErrorHandler)
runBlocking {
getConversationUseCase.invoke(this, parametersOf(user, conversationToken), object : UseCaseResponse<ConversationOverall> {
override suspend fun onSuccess(result: ConversationOverall) {
val internalConversation = result.ocs.data
conversationsRepository.saveConversationsForUser(user.id, listOf(internalConversation), false)
conversationsRepository.saveConversationsForUser(user.id!!, listOf(internalConversation), false)
conversation = result.ocs.data
}
@ -309,7 +309,7 @@ class CallService : Service(), KoinComponent, CoroutineScope {
endIncomingConversation(true)
activeNotification = generatedNotificationId
val notification = builder.build()
notification.extras.putLong(BundleKeys.KEY_INTERNAL_USER_ID, user.id)
notification.extras.putLong(BundleKeys.KEY_INTERNAL_USER_ID, user.id!!)
notification.extras.putLong(BundleKeys.KEY_NOTIFICATION_ID, internalNotificationId)
notification.flags = notification.flags or Notification.FLAG_INSISTENT
startForeground(generatedNotificationId.hashCode(), notification)

View File

@ -71,7 +71,7 @@ class GlobalService constructor(usersRepository: UsersRepository,
object : UseCaseResponse<ConversationOverall> {
override suspend fun onSuccess(result: ConversationOverall) {
currentUser?.let {
conversationsRepository.saveConversationsForUser(it.id, listOf(result.ocs.data), false)
conversationsRepository.saveConversationsForUser(it.id!!, listOf(result.ocs.data), false)
globalServiceInterface.gotConversationInfoForUser(it, result.ocs.data, GlobalServiceInterface.OperationStatus.STATUS_OK)
}
}
@ -94,8 +94,8 @@ class GlobalService constructor(usersRepository: UsersRepository,
object : UseCaseResponse<ConversationOverall> {
override suspend fun onSuccess(result: ConversationOverall) {
currentUser?.let {
conversationsRepository.saveConversationsForUser(it.id, listOf(result.ocs.data), false)
currentConversation = conversationsRepository.getConversationForUserWithToken(it.id, result.ocs!!.data!!.token!!)
conversationsRepository.saveConversationsForUser(it.id!!, listOf(result.ocs.data), false)
currentConversation = conversationsRepository.getConversationForUserWithToken(it.id!!, result.ocs!!.data!!.token!!)
globalServiceInterface.joinedConversationForUser(it, currentConversation, GlobalServiceInterface.OperationStatus.STATUS_OK)
}
}

View File

@ -61,7 +61,7 @@ class ShortcutService constructor(private var context: Context,
currentUser = user
var internalUserId: Long = -1
currentUser?.let {
internalUserId = it.id
internalUserId = it.id!!
}
conversationsRepository.getShortcutTargetConversations(internalUserId)
}

View File

@ -36,7 +36,7 @@ buildscript {
}
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0-beta01'
classpath 'com.android.tools.build:gradle:4.1.0-alpha01'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"

View File

@ -1,6 +1,6 @@
#Wed Feb 26 11:00:50 CET 2020
#Mon Mar 09 13:35:59 CET 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip