mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-20 11:15:02 +01:00
Fix migrations
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
01ff371f35
commit
d05a0a90fb
@ -149,7 +149,7 @@ class MainActivity : BaseActivity(), ActionBarProvider {
|
|||||||
extras.putParcelable(BundleKeys.KEY_USER_ENTITY, it)
|
extras.putParcelable(BundleKeys.KEY_USER_ENTITY, it)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
ConductorRemapping.remapChatController(
|
ConductorRemapping.remapChatController(
|
||||||
router!!, it.id,
|
router!!, it.id!!,
|
||||||
intent.getStringExtra(BundleKeys.KEY_CONVERSATION_TOKEN)!!, extras, false)
|
intent.getStringExtra(BundleKeys.KEY_CONVERSATION_TOKEN)!!, extras, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.contactsflow.di.module.ContactsFlowModule
|
||||||
import com.nextcloud.talk.newarch.features.conversationslist.di.module.ConversationsListModule
|
import com.nextcloud.talk.newarch.features.conversationslist.di.module.ConversationsListModule
|
||||||
import com.nextcloud.talk.newarch.local.dao.UsersDao
|
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.UserNgEntity
|
||||||
import com.nextcloud.talk.newarch.local.models.other.UserStatus.*
|
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.newarch.services.shortcuts.ShortcutService
|
||||||
import com.nextcloud.talk.utils.ClosedInterfaceImpl
|
import com.nextcloud.talk.utils.ClosedInterfaceImpl
|
||||||
import com.nextcloud.talk.utils.DisplayUtils
|
import com.nextcloud.talk.utils.DisplayUtils
|
||||||
@ -192,44 +194,49 @@ class NextcloudTalkApplication : Application(), LifecycleObserver, Configuration
|
|||||||
if (!appPreferences.migrationToRoomFinished) {
|
if (!appPreferences.migrationToRoomFinished) {
|
||||||
GlobalScope.launch {
|
GlobalScope.launch {
|
||||||
val users: List<UserEntity> = userUtils.users as List<UserEntity>
|
val users: List<UserEntity> = userUtils.users as List<UserEntity>
|
||||||
var userNg: UserNgEntity
|
var newUser: User
|
||||||
val newUsers = mutableListOf<UserNgEntity>()
|
val newUsers = mutableListOf<User>()
|
||||||
for (user in users) {
|
for (user in users) {
|
||||||
userNg = UserNgEntity(user.id, user.userId, user.username, user.baseUrl)
|
newUser = User(userId = user.userId, username = user.username, baseUrl = user.baseUrl)
|
||||||
userNg.token = user.token
|
newUser.token = user.token
|
||||||
userNg.displayName = user.displayName
|
newUser.displayName = user.displayName
|
||||||
try {
|
try {
|
||||||
userNg.pushConfiguration =
|
newUser.pushConfiguration =
|
||||||
LoganSquare.parse(user.pushConfigurationState, PushConfiguration::class.java)
|
LoganSquare.parse(user.pushConfigurationState, PushConfiguration::class.java)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
// no push
|
// no push
|
||||||
}
|
}
|
||||||
if (user.capabilities != null) {
|
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 {
|
try {
|
||||||
val external = LoganSquare.parse(user.externalSignalingServer, ExternalSignalingServer::class.java)
|
val external = LoganSquare.parse(user.externalSignalingServer, ExternalSignalingServer::class.java)
|
||||||
val signalingSettings = SignalingSettings()
|
val signalingSettings = SignalingSettings()
|
||||||
signalingSettings.externalSignalingServer = external.externalSignalingServer
|
signalingSettings.externalSignalingServer = external.externalSignalingServer
|
||||||
signalingSettings.externalSignalingTicket = external.externalSignalingTicket
|
signalingSettings.externalSignalingTicket = external.externalSignalingTicket
|
||||||
userNg.signalingSettings = signalingSettings
|
newUser.signalingSettings = signalingSettings
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
// no external signaling
|
// no external signaling
|
||||||
}
|
}
|
||||||
if (user.current) {
|
if (user.current) {
|
||||||
userNg.status = ACTIVE
|
newUser.status = ACTIVE
|
||||||
} else {
|
} else {
|
||||||
if (user.scheduledForDeletion) {
|
if (user.scheduledForDeletion) {
|
||||||
userNg.status = PENDING_DELETE
|
newUser.status = PENDING_DELETE
|
||||||
} else {
|
} 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()
|
dataStore.delete()
|
||||||
appPreferences.migrationToRoomFinished = true
|
appPreferences.migrationToRoomFinished = true
|
||||||
}
|
}
|
||||||
|
@ -248,7 +248,7 @@ class MessageNotificationWorker(
|
|||||||
var notificationId = decryptedPushMessage.timestamp.toInt()
|
var notificationId = decryptedPushMessage.timestamp.toInt()
|
||||||
|
|
||||||
val notificationInfoBundle = Bundle()
|
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.putString(BundleKeys.KEY_CONVERSATION_TOKEN, decryptedPushMessage.id)
|
||||||
notificationInfoBundle.putLong(BundleKeys.KEY_NOTIFICATION_ID, decryptedPushMessage.notificationId!!)
|
notificationInfoBundle.putLong(BundleKeys.KEY_NOTIFICATION_ID, decryptedPushMessage.notificationId!!)
|
||||||
notificationBuilder.extras = notificationInfoBundle
|
notificationBuilder.extras = notificationInfoBundle
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
package com.nextcloud.talk.newarch.features.account.loginentry
|
package com.nextcloud.talk.newarch.features.account.loginentry
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
|
import android.util.Log
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.nextcloud.talk.models.LoginData
|
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.repository.offline.UsersRepository
|
||||||
import com.nextcloud.talk.newarch.domain.usecases.*
|
import com.nextcloud.talk.newarch.domain.usecases.*
|
||||||
import com.nextcloud.talk.newarch.domain.usecases.base.UseCaseResponse
|
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.PushUtils
|
||||||
import com.nextcloud.talk.utils.preferences.AppPreferences
|
import com.nextcloud.talk.utils.preferences.AppPreferences
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -59,7 +63,7 @@ class LoginEntryViewModel constructor(
|
|||||||
BaseViewModel<LoginEntryView>(application) {
|
BaseViewModel<LoginEntryView>(application) {
|
||||||
val state: MutableLiveData<LoginEntryStateWrapper> = MutableLiveData(LoginEntryStateWrapper(LoginEntryState.PENDING_CHECK, null))
|
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
|
private var updatingUser = false
|
||||||
|
|
||||||
fun parseData(prefix: String, separator: String, data: String?) {
|
fun parseData(prefix: String, separator: String, data: String?) {
|
||||||
@ -116,25 +120,26 @@ class LoginEntryViewModel constructor(
|
|||||||
val userIfExists = usersRepository.getUserWithUsernameAndServer(loginData.username!!, loginData.serverUrl!!)
|
val userIfExists = usersRepository.getUserWithUsernameAndServer(loginData.username!!, loginData.serverUrl!!)
|
||||||
if (userIfExists != null) {
|
if (userIfExists != null) {
|
||||||
updatingUser = true
|
updatingUser = true
|
||||||
user = userIfExists
|
user = userIfExists.toUser()
|
||||||
user.token = loginData.token
|
user!!.token = loginData.token
|
||||||
usersRepository.updateUser(user)
|
usersRepository.updateUser(user!!.toUserEntity())
|
||||||
// complicated - we need to unregister, etc, etc, but not yet
|
// complicated - we need to unregister, etc, etc, but not yet
|
||||||
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.ACCOUNT_UPDATED))
|
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.ACCOUNT_UPDATED))
|
||||||
} else {
|
} else {
|
||||||
|
user = User(null, "", "", "")
|
||||||
getProfile(loginData)
|
getProfile(loginData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getProfile(loginData: LoginData) {
|
private fun getProfile(loginData: LoginData) {
|
||||||
user.username = loginData.username!!
|
user!!.username = loginData.username!!
|
||||||
user.baseUrl = loginData.serverUrl!!
|
user!!.baseUrl = loginData.serverUrl!!
|
||||||
user.token = loginData.token
|
user!!.token = loginData.token
|
||||||
getProfileUseCase.invoke(viewModelScope, parametersOf(user), object : UseCaseResponse<UserProfileOverall> {
|
getProfileUseCase.invoke(viewModelScope, parametersOf(user!!.toUserEntity()), object : UseCaseResponse<UserProfileOverall> {
|
||||||
override suspend fun onSuccess(result: UserProfileOverall) {
|
override suspend fun onSuccess(result: UserProfileOverall) {
|
||||||
result.ocs.data.userId?.let { userId ->
|
result.ocs.data.userId?.let { userId ->
|
||||||
user.displayName = result.ocs.data.displayName
|
user!!.displayName = result.ocs.data.displayName
|
||||||
user.userId = userId
|
user!!.userId = userId
|
||||||
getCapabilities()
|
getCapabilities()
|
||||||
} ?: run {
|
} ?: run {
|
||||||
state.postValue(LoginEntryStateWrapper(LoginEntryState.FAILED, LoginEntryStateClarification.PROFILE_FETCH_FAILED))
|
state.postValue(LoginEntryStateWrapper(LoginEntryState.FAILED, LoginEntryStateClarification.PROFILE_FETCH_FAILED))
|
||||||
@ -148,9 +153,9 @@ class LoginEntryViewModel constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getCapabilities() {
|
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) {
|
override suspend fun onSuccess(result: CapabilitiesOverall) {
|
||||||
user.capabilities = result.ocs.data.capabilities
|
user!!.capabilities = result.ocs.data.capabilities
|
||||||
getSignalingSettings()
|
getSignalingSettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,16 +166,17 @@ class LoginEntryViewModel constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getSignalingSettings() {
|
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) {
|
override suspend fun onSuccess(result: SignalingSettingsOverall) {
|
||||||
user.signalingSettings = result.ocs.signalingSettings
|
user!!.signalingSettings = result.ocs.signalingSettings
|
||||||
val pushConfiguration = PushConfiguration()
|
val pushConfiguration = PushConfiguration()
|
||||||
val pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.PENDING, 0)
|
val pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.PENDING, 0)
|
||||||
pushConfiguration.pushConfigurationStateWrapper = pushConfigurationStateWrapper
|
pushConfiguration.pushConfigurationStateWrapper = pushConfigurationStateWrapper
|
||||||
user.pushConfiguration = pushConfiguration
|
user!!.pushConfiguration = pushConfiguration
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
usersRepository.insertUser(user)
|
user!!.id = usersRepository.insertUser(user!!.toUserEntity())
|
||||||
setAdjustedUserAsActive()
|
usersRepository.setUserAsActiveWithId(user!!.id!!)
|
||||||
|
user!!.status = UserStatus.ACTIVE
|
||||||
registerForPush()
|
registerForPush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -185,8 +191,8 @@ class LoginEntryViewModel constructor(
|
|||||||
private suspend fun registerForPush() = withContext(Dispatchers.IO) {
|
private suspend fun registerForPush() = withContext(Dispatchers.IO) {
|
||||||
val token = appPreferences.pushToken
|
val token = appPreferences.pushToken
|
||||||
if (!token.isNullOrBlank()) {
|
if (!token.isNullOrBlank()) {
|
||||||
user.pushConfiguration?.pushToken = token
|
user!!.pushConfiguration!!.pushToken = token
|
||||||
usersRepository.updateUser(user)
|
usersRepository.updateUser(user!!.toUserEntity())
|
||||||
registerForPushWithServer(token)
|
registerForPushWithServer(token)
|
||||||
} else {
|
} else {
|
||||||
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_MISSING_TOKEN))
|
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_MISSING_TOKEN))
|
||||||
@ -195,63 +201,53 @@ class LoginEntryViewModel constructor(
|
|||||||
|
|
||||||
private fun registerForPushWithServer(token: String) {
|
private fun registerForPushWithServer(token: String) {
|
||||||
val options = PushUtils(usersRepository).getMapForPushRegistrationWithServer(context, token)
|
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) {
|
override suspend fun onSuccess(result: PushRegistrationOverall) {
|
||||||
user.pushConfiguration?.deviceIdentifier = result.ocs.data.deviceIdentifier
|
user!!.pushConfiguration!!.deviceIdentifier = result.ocs.data.deviceIdentifier
|
||||||
user.pushConfiguration?.deviceIdentifierSignature = result.ocs.data.signature
|
user!!.pushConfiguration!!.deviceIdentifierSignature = result.ocs.data.signature
|
||||||
user.pushConfiguration?.userPublicKey = result.ocs.data.publicKey
|
user!!.pushConfiguration!!.userPublicKey = result.ocs.data.publicKey
|
||||||
user.pushConfiguration?.pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.SERVER_REGISTRATION_DONE, null)
|
user!!.pushConfiguration!!.pushConfigurationStateWrapper = PushConfigurationStateWrapper(PushConfigurationState.SERVER_REGISTRATION_DONE, null)
|
||||||
usersRepository.updateUser(user)
|
usersRepository.updateUser(user!!.toUserEntity())
|
||||||
registerForPushWithProxy()
|
registerForPushWithProxy()
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun onError(errorModel: ErrorModel?) {
|
override suspend fun onError(errorModel: ErrorModel?) {
|
||||||
user.pushConfiguration?.pushConfigurationStateWrapper?.pushConfigurationState = PushConfigurationState.FAILED_WITH_SERVER_REGISTRATION
|
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.pushConfigurationState = PushConfigurationState.FAILED_WITH_SERVER_REGISTRATION
|
||||||
user.pushConfiguration?.pushConfigurationStateWrapper?.reason = errorModel?.code
|
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.reason = errorModel?.code
|
||||||
usersRepository.updateUser(user)
|
usersRepository.updateUser(user!!.toUserEntity())
|
||||||
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_WITH_SERVER_FAILED))
|
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_WITH_SERVER_FAILED))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun registerForPushWithProxy() {
|
private suspend fun registerForPushWithProxy() {
|
||||||
val options = PushUtils(usersRepository).getMapForPushRegistrationWithServer(user)
|
val options = PushUtils(usersRepository).getMapForPushRegistrationWithServer(user!!.toUserEntity())
|
||||||
|
|
||||||
if (options != null) {
|
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) {
|
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) {
|
withContext(Dispatchers.IO) {
|
||||||
usersRepository.updateUser(user)
|
usersRepository.updateUser(user!!.toUserEntity())
|
||||||
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, if (!updatingUser) LoginEntryStateClarification.ACCOUNT_CREATED else LoginEntryStateClarification.ACCOUNT_UPDATED))
|
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, if (!updatingUser) LoginEntryStateClarification.ACCOUNT_CREATED else LoginEntryStateClarification.ACCOUNT_UPDATED))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun onError(errorModel: ErrorModel?) {
|
override suspend fun onError(errorModel: ErrorModel?) {
|
||||||
user.pushConfiguration?.pushConfigurationStateWrapper?.pushConfigurationState = PushConfigurationState.FAILED_WITH_PROXY_REGISTRATION
|
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.pushConfigurationState = PushConfigurationState.FAILED_WITH_PROXY_REGISTRATION
|
||||||
user.pushConfiguration?.pushConfigurationStateWrapper?.reason = errorModel?.code
|
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.reason = errorModel?.code
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
usersRepository.updateUser(user)
|
usersRepository.updateUser(user!!.toUserEntity())
|
||||||
setAdjustedUserAsActive()
|
|
||||||
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_WITH_PUSH_PROXY_FAILED))
|
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_WITH_PUSH_PROXY_FAILED))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
user.pushConfiguration?.pushConfigurationStateWrapper?.pushConfigurationState = PushConfigurationState.FAILED_WITH_PROXY_REGISTRATION
|
user!!.pushConfiguration!!.pushConfigurationStateWrapper!!.pushConfigurationState = PushConfigurationState.FAILED_WITH_PROXY_REGISTRATION
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
usersRepository.updateUser(user)
|
usersRepository.updateUser(user!!.toUserEntity())
|
||||||
state.postValue(LoginEntryStateWrapper(LoginEntryState.OK, LoginEntryStateClarification.PUSH_REGISTRATION_WITH_PUSH_PROXY_FAILED))
|
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -57,7 +57,7 @@ class ChatViewModel constructor(application: Application,
|
|||||||
fun init(user: UserNgEntity, conversationToken: String, conversationPassword: String?) {
|
fun init(user: UserNgEntity, conversationToken: String, conversationPassword: String?) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
this@ChatViewModel.user = user
|
this@ChatViewModel.user = user
|
||||||
this@ChatViewModel.initConversation = conversationsRepository.getConversationForUserWithToken(user.id, conversationToken)
|
this@ChatViewModel.initConversation = conversationsRepository.getConversationForUserWithToken(user.id!!, conversationToken)
|
||||||
this@ChatViewModel.conversationPassword = conversationPassword
|
this@ChatViewModel.conversationPassword = conversationPassword
|
||||||
globalService.getConversation(conversationToken, this@ChatViewModel)
|
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) {
|
override suspend fun gotConversationInfoForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: GlobalServiceInterface.OperationStatus) {
|
||||||
if (operationStatus == GlobalServiceInterface.OperationStatus.STATUS_OK) {
|
if (operationStatus == GlobalServiceInterface.OperationStatus.STATUS_OK) {
|
||||||
if (userNgEntity.id == user.id && conversation!!.token == initConversation?.token) {
|
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 ->
|
conversation.token?.let { conversationToken ->
|
||||||
globalService.joinConversation(conversationToken, conversationPassword, this)
|
globalService.joinConversation(conversationToken, conversationPassword, this)
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ class ConversationsListView : BaseView() {
|
|||||||
bundle.putString(BundleKeys.KEY_ROOM_ID, conversation.conversationId)
|
bundle.putString(BundleKeys.KEY_ROOM_ID, conversation.conversationId)
|
||||||
bundle.putParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION, Parcels.wrap(conversation))
|
bundle.putParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION, Parcels.wrap(conversation))
|
||||||
ConductorRemapping.remapChatController(
|
ConductorRemapping.remapChatController(
|
||||||
router, user.id, conversation.token!!,
|
router, user.id!!, conversation.token!!,
|
||||||
bundle, false
|
bundle, false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ class ConversationsListViewModel constructor(
|
|||||||
filterLiveData.value = null
|
filterLiveData.value = null
|
||||||
Transformations.switchMap(filterLiveData) { filter ->
|
Transformations.switchMap(filterLiveData) { filter ->
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
conversationsRepository.getConversationsForUser(user.id, filter)
|
conversationsRepository.getConversationsForUser(user.id!!, filter)
|
||||||
} else {
|
} else {
|
||||||
liveData {
|
liveData {
|
||||||
listOf<Conversation>()
|
listOf<Conversation>()
|
||||||
@ -99,7 +99,7 @@ class ConversationsListViewModel constructor(
|
|||||||
object : UseCaseResponse<GenericOverall> {
|
object : UseCaseResponse<GenericOverall> {
|
||||||
override suspend fun onSuccess(result: GenericOverall) {
|
override suspend fun onSuccess(result: GenericOverall) {
|
||||||
conversationsRepository.deleteConversation(
|
conversationsRepository.deleteConversation(
|
||||||
globalService.currentUserLiveData.value!!.id, conversation
|
globalService.currentUserLiveData.value!!.id!!, conversation
|
||||||
.conversationId!!
|
.conversationId!!
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -128,7 +128,7 @@ class ConversationsListViewModel constructor(
|
|||||||
object : UseCaseResponse<GenericOverall> {
|
object : UseCaseResponse<GenericOverall> {
|
||||||
override suspend fun onSuccess(result: GenericOverall) {
|
override suspend fun onSuccess(result: GenericOverall) {
|
||||||
conversationsRepository.deleteConversation(
|
conversationsRepository.deleteConversation(
|
||||||
globalService.currentUserLiveData.value!!.id, conversation
|
globalService.currentUserLiveData.value!!.id!!, conversation
|
||||||
.conversationId!!
|
.conversationId!!
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -159,7 +159,7 @@ class ConversationsListViewModel constructor(
|
|||||||
object : UseCaseResponse<GenericOverall> {
|
object : UseCaseResponse<GenericOverall> {
|
||||||
override suspend fun onSuccess(result: GenericOverall) {
|
override suspend fun onSuccess(result: GenericOverall) {
|
||||||
conversationsRepository.setFavoriteValueForConversation(
|
conversationsRepository.setFavoriteValueForConversation(
|
||||||
globalService.currentUserLiveData.value!!.id,
|
globalService.currentUserLiveData.value!!.id!!,
|
||||||
conversation.conversationId!!, favorite
|
conversation.conversationId!!, favorite
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -202,7 +202,7 @@ class ConversationsListViewModel constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
conversationsRepository.saveConversationsForUser(
|
conversationsRepository.saveConversationsForUser(
|
||||||
internalUserId,
|
internalUserId!!,
|
||||||
mutableList, true)
|
mutableList, true)
|
||||||
messageData = ""
|
messageData = ""
|
||||||
conversationsLoadingLock.unlock()
|
conversationsLoadingLock.unlock()
|
||||||
@ -223,7 +223,7 @@ class ConversationsListViewModel constructor(
|
|||||||
value: Boolean
|
value: Boolean
|
||||||
) {
|
) {
|
||||||
conversationsRepository.setChangingValueForConversation(
|
conversationsRepository.setChangingValueForConversation(
|
||||||
globalService.currentUserLiveData.value!!.id, conversation
|
globalService.currentUserLiveData.value!!.id!!, conversation
|
||||||
.conversationId!!, value
|
.conversationId!!, value
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,7 @@ abstract class UsersDao {
|
|||||||
val users = getUsers()
|
val users = getUsers()
|
||||||
for (user in users) {
|
for (user in users) {
|
||||||
user.status = UserStatus.ACTIVE
|
user.status = UserStatus.ACTIVE
|
||||||
|
updateUser(user)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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!!
|
||||||
|
}
|
@ -39,7 +39,7 @@ import java.util.*
|
|||||||
@Serializable
|
@Serializable
|
||||||
@Entity(tableName = "users")
|
@Entity(tableName = "users")
|
||||||
data class UserNgEntity(
|
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 = "user_id") var userId: String,
|
||||||
@ColumnInfo(name = "username") var username: String,
|
@ColumnInfo(name = "username") var username: String,
|
||||||
@ColumnInfo(name = "base_url") var baseUrl: 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.getCredentials(): String = ApiUtils.getCredentials(username, token)
|
||||||
|
|
||||||
fun UserNgEntity.hasSpreedFeatureCapability(capabilityName: String): Boolean {
|
fun UserNgEntity.hasSpreedFeatureCapability(capabilityName: String): Boolean {
|
||||||
|
@ -284,14 +284,14 @@ class CallService : Service(), KoinComponent, CoroutineScope {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun getConversationForTokenAndUser(user: UserNgEntity, conversationToken: String): Conversation? {
|
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) {
|
if (conversation == null) {
|
||||||
val getConversationUseCase = GetConversationUseCase(componentsWithEmptyCookieJar.getRepository(), apiErrorHandler)
|
val getConversationUseCase = GetConversationUseCase(componentsWithEmptyCookieJar.getRepository(), apiErrorHandler)
|
||||||
runBlocking {
|
runBlocking {
|
||||||
getConversationUseCase.invoke(this, parametersOf(user, conversationToken), object : UseCaseResponse<ConversationOverall> {
|
getConversationUseCase.invoke(this, parametersOf(user, conversationToken), object : UseCaseResponse<ConversationOverall> {
|
||||||
override suspend fun onSuccess(result: ConversationOverall) {
|
override suspend fun onSuccess(result: ConversationOverall) {
|
||||||
val internalConversation = result.ocs.data
|
val internalConversation = result.ocs.data
|
||||||
conversationsRepository.saveConversationsForUser(user.id, listOf(internalConversation), false)
|
conversationsRepository.saveConversationsForUser(user.id!!, listOf(internalConversation), false)
|
||||||
conversation = result.ocs.data
|
conversation = result.ocs.data
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,7 +309,7 @@ class CallService : Service(), KoinComponent, CoroutineScope {
|
|||||||
endIncomingConversation(true)
|
endIncomingConversation(true)
|
||||||
activeNotification = generatedNotificationId
|
activeNotification = generatedNotificationId
|
||||||
val notification = builder.build()
|
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.extras.putLong(BundleKeys.KEY_NOTIFICATION_ID, internalNotificationId)
|
||||||
notification.flags = notification.flags or Notification.FLAG_INSISTENT
|
notification.flags = notification.flags or Notification.FLAG_INSISTENT
|
||||||
startForeground(generatedNotificationId.hashCode(), notification)
|
startForeground(generatedNotificationId.hashCode(), notification)
|
||||||
|
@ -71,7 +71,7 @@ class GlobalService constructor(usersRepository: UsersRepository,
|
|||||||
object : UseCaseResponse<ConversationOverall> {
|
object : UseCaseResponse<ConversationOverall> {
|
||||||
override suspend fun onSuccess(result: ConversationOverall) {
|
override suspend fun onSuccess(result: ConversationOverall) {
|
||||||
currentUser?.let {
|
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)
|
globalServiceInterface.gotConversationInfoForUser(it, result.ocs.data, GlobalServiceInterface.OperationStatus.STATUS_OK)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,8 +94,8 @@ class GlobalService constructor(usersRepository: UsersRepository,
|
|||||||
object : UseCaseResponse<ConversationOverall> {
|
object : UseCaseResponse<ConversationOverall> {
|
||||||
override suspend fun onSuccess(result: ConversationOverall) {
|
override suspend fun onSuccess(result: ConversationOverall) {
|
||||||
currentUser?.let {
|
currentUser?.let {
|
||||||
conversationsRepository.saveConversationsForUser(it.id, listOf(result.ocs.data), false)
|
conversationsRepository.saveConversationsForUser(it.id!!, listOf(result.ocs.data), false)
|
||||||
currentConversation = conversationsRepository.getConversationForUserWithToken(it.id, result.ocs!!.data!!.token!!)
|
currentConversation = conversationsRepository.getConversationForUserWithToken(it.id!!, result.ocs!!.data!!.token!!)
|
||||||
globalServiceInterface.joinedConversationForUser(it, currentConversation, GlobalServiceInterface.OperationStatus.STATUS_OK)
|
globalServiceInterface.joinedConversationForUser(it, currentConversation, GlobalServiceInterface.OperationStatus.STATUS_OK)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ class ShortcutService constructor(private var context: Context,
|
|||||||
currentUser = user
|
currentUser = user
|
||||||
var internalUserId: Long = -1
|
var internalUserId: Long = -1
|
||||||
currentUser?.let {
|
currentUser?.let {
|
||||||
internalUserId = it.id
|
internalUserId = it.id!!
|
||||||
}
|
}
|
||||||
conversationsRepository.getShortcutTargetConversations(internalUserId)
|
conversationsRepository.getShortcutTargetConversations(internalUserId)
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencies {
|
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-gradle-plugin:${kotlin_version}"
|
||||||
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
||||||
|
|
||||||
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
|||||||
#Wed Feb 26 11:00:50 CET 2020
|
#Mon Mar 09 13:35:59 CET 2020
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user