mirror of
https://github.com/nextcloud/talk-android
synced 2025-08-05 19:15:48 +01:00
New network components
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
b338c336b8
commit
de74755492
@ -53,9 +53,10 @@ import com.nextcloud.talk.newarch.data.model.ErrorModel
|
|||||||
import com.nextcloud.talk.newarch.data.source.remote.ApiErrorHandler
|
import com.nextcloud.talk.newarch.data.source.remote.ApiErrorHandler
|
||||||
import com.nextcloud.talk.newarch.domain.usecases.GetNotificationUseCase
|
import com.nextcloud.talk.newarch.domain.usecases.GetNotificationUseCase
|
||||||
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.toUser
|
||||||
import com.nextcloud.talk.newarch.utils.Images
|
import com.nextcloud.talk.newarch.utils.Images
|
||||||
import com.nextcloud.talk.newarch.utils.MagicJson
|
import com.nextcloud.talk.newarch.utils.MagicJson
|
||||||
import com.nextcloud.talk.newarch.utils.ComponentsWithEmptyCookieJar
|
import com.nextcloud.talk.newarch.utils.NetworkComponents
|
||||||
import com.nextcloud.talk.utils.ApiUtils
|
import com.nextcloud.talk.utils.ApiUtils
|
||||||
import com.nextcloud.talk.utils.NotificationUtils
|
import com.nextcloud.talk.utils.NotificationUtils
|
||||||
import com.nextcloud.talk.utils.bundle.BundleKeys
|
import com.nextcloud.talk.utils.bundle.BundleKeys
|
||||||
@ -73,7 +74,7 @@ class MessageNotificationWorker(
|
|||||||
workerParams: WorkerParameters
|
workerParams: WorkerParameters
|
||||||
) : CoroutineWorker(context, workerParams), KoinComponent {
|
) : CoroutineWorker(context, workerParams), KoinComponent {
|
||||||
val appPreferences: AppPreferences by inject()
|
val appPreferences: AppPreferences by inject()
|
||||||
private val componentsWithEmptyCookieJar: ComponentsWithEmptyCookieJar by inject()
|
private val networkComponents: NetworkComponents by inject()
|
||||||
private val apiErrorHandler: ApiErrorHandler by inject()
|
private val apiErrorHandler: ApiErrorHandler by inject()
|
||||||
|
|
||||||
override suspend fun doWork(): Result = coroutineScope {
|
override suspend fun doWork(): Result = coroutineScope {
|
||||||
@ -107,7 +108,7 @@ class MessageNotificationWorker(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun showNotificationWithObjectData(coroutineScope: CoroutineScope, decryptedPushMessage: DecryptedPushMessage, signatureVerification: SignatureVerification, intent: Intent) {
|
private fun showNotificationWithObjectData(coroutineScope: CoroutineScope, decryptedPushMessage: DecryptedPushMessage, signatureVerification: SignatureVerification, intent: Intent) {
|
||||||
val nextcloudTalkRepository = componentsWithEmptyCookieJar.getRepository()
|
val nextcloudTalkRepository = networkComponents.getRepository(false, signatureVerification.userEntity!!.toUser())
|
||||||
val getNotificationUseCase = GetNotificationUseCase(nextcloudTalkRepository, apiErrorHandler)
|
val getNotificationUseCase = GetNotificationUseCase(nextcloudTalkRepository, apiErrorHandler)
|
||||||
getNotificationUseCase.invoke(coroutineScope, parametersOf(signatureVerification.userEntity, decryptedPushMessage.notificationId.toString()), object : UseCaseResponse<NotificationOverall> {
|
getNotificationUseCase.invoke(coroutineScope, parametersOf(signatureVerification.userEntity, decryptedPushMessage.notificationId.toString()), object : UseCaseResponse<NotificationOverall> {
|
||||||
override suspend fun onSuccess(result: NotificationOverall) {
|
override suspend fun onSuccess(result: NotificationOverall) {
|
||||||
@ -304,7 +305,7 @@ class MessageNotificationWorker(
|
|||||||
target, null, CircleCropTransformation()
|
target, null, CircleCropTransformation()
|
||||||
)
|
)
|
||||||
|
|
||||||
componentsWithEmptyCookieJar.getImageLoader().load(request)
|
networkComponents.getImageLoader(signatureVerification.userEntity!!.toUser()).load(request)
|
||||||
} else {
|
} else {
|
||||||
notificationBuilder.setStyle(getStyle(decryptedPushMessage, conversationType, person.build(), style))
|
notificationBuilder.setStyle(getStyle(decryptedPushMessage, conversationType, person.build(), style))
|
||||||
NotificationManagerCompat.from(applicationContext).notify(notificationId, notificationBuilder.build())
|
NotificationManagerCompat.from(applicationContext).notify(notificationId, notificationBuilder.build())
|
||||||
|
@ -46,7 +46,7 @@ import com.nextcloud.talk.newarch.domain.repository.online.NextcloudTalkReposito
|
|||||||
import com.nextcloud.talk.newarch.utils.NetworkUtils
|
import com.nextcloud.talk.newarch.utils.NetworkUtils
|
||||||
import com.nextcloud.talk.newarch.utils.NetworkUtils.GetProxyRunnable
|
import com.nextcloud.talk.newarch.utils.NetworkUtils.GetProxyRunnable
|
||||||
import com.nextcloud.talk.newarch.utils.NetworkUtils.MagicAuthenticator
|
import com.nextcloud.talk.newarch.utils.NetworkUtils.MagicAuthenticator
|
||||||
import com.nextcloud.talk.newarch.utils.ComponentsWithEmptyCookieJar
|
import com.nextcloud.talk.newarch.utils.NetworkComponents
|
||||||
import com.nextcloud.talk.utils.LoggingUtils
|
import com.nextcloud.talk.utils.LoggingUtils
|
||||||
import com.nextcloud.talk.utils.preferences.AppPreferences
|
import com.nextcloud.talk.utils.preferences.AppPreferences
|
||||||
import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder
|
import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder
|
||||||
@ -93,8 +93,8 @@ val NetworkModule = module {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createComponentsWithEmptyCookieJar(okHttpClient: OkHttpClient, retrofit: Retrofit, androidApplication: Application): ComponentsWithEmptyCookieJar {
|
fun createComponentsWithEmptyCookieJar(okHttpClient: OkHttpClient, retrofit: Retrofit, androidApplication: Application): NetworkComponents {
|
||||||
return ComponentsWithEmptyCookieJar(okHttpClient, retrofit, androidApplication)
|
return NetworkComponents(okHttpClient, retrofit, androidApplication)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createCookieManager(): CookieManager {
|
fun createCookieManager(): CookieManager {
|
||||||
|
@ -41,7 +41,8 @@ import com.nextcloud.talk.newarch.domain.usecases.GetConversationUseCase
|
|||||||
import com.nextcloud.talk.newarch.domain.usecases.GetParticipantsForCallUseCase
|
import com.nextcloud.talk.newarch.domain.usecases.GetParticipantsForCallUseCase
|
||||||
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.UserNgEntity
|
||||||
import com.nextcloud.talk.newarch.utils.ComponentsWithEmptyCookieJar
|
import com.nextcloud.talk.newarch.local.models.toUser
|
||||||
|
import com.nextcloud.talk.newarch.utils.NetworkComponents
|
||||||
import com.nextcloud.talk.newarch.utils.Images
|
import com.nextcloud.talk.newarch.utils.Images
|
||||||
import com.nextcloud.talk.newarch.utils.MagicJson
|
import com.nextcloud.talk.newarch.utils.MagicJson
|
||||||
import com.nextcloud.talk.utils.ApiUtils
|
import com.nextcloud.talk.utils.ApiUtils
|
||||||
@ -73,8 +74,7 @@ class CallService : Service(), KoinComponent, CoroutineScope {
|
|||||||
val appPreferences: AppPreferences by inject()
|
val appPreferences: AppPreferences by inject()
|
||||||
val usersRepository: UsersRepository by inject()
|
val usersRepository: UsersRepository by inject()
|
||||||
val conversationsRepository: ConversationsRepository by inject()
|
val conversationsRepository: ConversationsRepository by inject()
|
||||||
val retrofit: Retrofit by inject()
|
val networkComponents: NetworkComponents by inject()
|
||||||
val componentsWithEmptyCookieJar: ComponentsWithEmptyCookieJar by inject()
|
|
||||||
val apiErrorHandler: ApiErrorHandler by inject()
|
val apiErrorHandler: ApiErrorHandler by inject()
|
||||||
val eventBus: EventBus by inject()
|
val eventBus: EventBus by inject()
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ class CallService : Service(), KoinComponent, CoroutineScope {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val avatarUrl = ApiUtils.getUrlForAvatarWithName(signatureVerification.userEntity!!.baseUrl, conversation.name, R.dimen.avatar_size)
|
val avatarUrl = ApiUtils.getUrlForAvatarWithName(signatureVerification.userEntity!!.baseUrl, conversation.name, R.dimen.avatar_size)
|
||||||
val imageLoader = componentsWithEmptyCookieJar.getImageLoader()
|
val imageLoader = networkComponents.getImageLoader(signatureVerification.userEntity!!.toUser())
|
||||||
|
|
||||||
val request = Images().getRequestForUrl(
|
val request = Images().getRequestForUrl(
|
||||||
imageLoader, applicationContext, avatarUrl, signatureVerification.userEntity,
|
imageLoader, applicationContext, avatarUrl, signatureVerification.userEntity,
|
||||||
@ -250,7 +250,7 @@ class CallService : Service(), KoinComponent, CoroutineScope {
|
|||||||
|
|
||||||
private fun checkIsConversationActive(user: UserNgEntity, conversationToken: String, activeNotificationArgument: String) {
|
private fun checkIsConversationActive(user: UserNgEntity, conversationToken: String, activeNotificationArgument: String) {
|
||||||
if (activeNotificationArgument == activeNotification) {
|
if (activeNotificationArgument == activeNotification) {
|
||||||
val getParticipantsForCallUseCase = GetParticipantsForCallUseCase(componentsWithEmptyCookieJar.getRepository(), apiErrorHandler)
|
val getParticipantsForCallUseCase = GetParticipantsForCallUseCase(networkComponents.getRepository(false, user.toUser()), apiErrorHandler)
|
||||||
getParticipantsForCallUseCase.invoke(this, parametersOf(user, conversationToken), object : UseCaseResponse<ParticipantsOverall> {
|
getParticipantsForCallUseCase.invoke(this, parametersOf(user, conversationToken), object : UseCaseResponse<ParticipantsOverall> {
|
||||||
override suspend fun onSuccess(result: ParticipantsOverall) {
|
override suspend fun onSuccess(result: ParticipantsOverall) {
|
||||||
val participants = result.ocs.data
|
val participants = result.ocs.data
|
||||||
@ -284,9 +284,9 @@ 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(networkComponents.getRepository(false, user.toUser()), 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) {
|
||||||
|
@ -31,32 +31,69 @@ import coil.decode.SvgDecoder
|
|||||||
import com.nextcloud.talk.newarch.data.repository.online.NextcloudTalkRepositoryImpl
|
import com.nextcloud.talk.newarch.data.repository.online.NextcloudTalkRepositoryImpl
|
||||||
import com.nextcloud.talk.newarch.data.source.remote.ApiService
|
import com.nextcloud.talk.newarch.data.source.remote.ApiService
|
||||||
import com.nextcloud.talk.newarch.domain.repository.online.NextcloudTalkRepository
|
import com.nextcloud.talk.newarch.domain.repository.online.NextcloudTalkRepository
|
||||||
|
import com.nextcloud.talk.newarch.local.models.User
|
||||||
import okhttp3.JavaNetCookieJar
|
import okhttp3.JavaNetCookieJar
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import org.koin.core.KoinComponent
|
import org.koin.core.KoinComponent
|
||||||
import retrofit2.Retrofit
|
import retrofit2.Retrofit
|
||||||
import java.net.CookieManager
|
import java.net.CookieManager
|
||||||
|
|
||||||
class ComponentsWithEmptyCookieJar(
|
class NetworkComponents(
|
||||||
private val okHttpClient: OkHttpClient,
|
private val okHttpClient: OkHttpClient,
|
||||||
private val retrofit: Retrofit,
|
private val retrofit: Retrofit,
|
||||||
private val androidApplication: Application
|
private val androidApplication: Application
|
||||||
) : KoinComponent {
|
) : KoinComponent {
|
||||||
fun getRepository(): NextcloudTalkRepository {
|
val usersSingleOperationRepositoryMap : MutableMap<Long, NextcloudTalkRepository> = mutableMapOf()
|
||||||
return NextcloudTalkRepositoryImpl(retrofit.newBuilder().client(getOkHttpClient())
|
val usersMultipleOperationsRepositoryMap : MutableMap<Long, NextcloudTalkRepository> = mutableMapOf()
|
||||||
|
val usersSingleOperationOkHttpMap: MutableMap<Long, OkHttpClient> = mutableMapOf()
|
||||||
|
val usersMultipleOperationOkHttpMap: MutableMap<Long, OkHttpClient> = mutableMapOf()
|
||||||
|
|
||||||
|
fun getRepository(singleOperation: Boolean, user: User): NextcloudTalkRepository {
|
||||||
|
val mappedNextcloudTalkRepository = if (singleOperation) {
|
||||||
|
usersSingleOperationRepositoryMap[user.id]
|
||||||
|
} else {
|
||||||
|
usersMultipleOperationsRepositoryMap[user.id]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mappedNextcloudTalkRepository != null) {
|
||||||
|
return mappedNextcloudTalkRepository
|
||||||
|
}
|
||||||
|
|
||||||
|
return NextcloudTalkRepositoryImpl(retrofit.newBuilder().client(getOkHttpClient(singleOperation, user))
|
||||||
.build().create(ApiService::class.java))
|
.build().create(ApiService::class.java))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getOkHttpClient(): OkHttpClient {
|
fun getOkHttpClient(singleOperation: Boolean, user: User): OkHttpClient {
|
||||||
return okHttpClient.newBuilder().cookieJar(JavaNetCookieJar(CookieManager())).build()
|
val mappedOkHttpClient = if (singleOperation) {
|
||||||
|
usersSingleOperationOkHttpMap[user.id]
|
||||||
|
} else {
|
||||||
|
usersMultipleOperationOkHttpMap[user.id]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mappedOkHttpClient != null) {
|
||||||
|
return mappedOkHttpClient
|
||||||
|
}
|
||||||
|
|
||||||
|
val okHttpClientBuilder = okHttpClient.newBuilder().cookieJar(JavaNetCookieJar(CookieManager()))
|
||||||
|
val dispatcher = okHttpClient.dispatcher()
|
||||||
|
if (singleOperation) {
|
||||||
|
dispatcher.maxRequests = 1
|
||||||
|
} else {
|
||||||
|
dispatcher.maxRequests = 100
|
||||||
|
}
|
||||||
|
|
||||||
|
okHttpClientBuilder.dispatcher(dispatcher)
|
||||||
|
|
||||||
|
|
||||||
|
return okHttpClientBuilder.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getImageLoader(): ImageLoader {
|
fun getImageLoader(user: User): ImageLoader {
|
||||||
return ImageLoader(androidApplication) {
|
return ImageLoader(androidApplication) {
|
||||||
availableMemoryPercentage(0.5)
|
availableMemoryPercentage(0.5)
|
||||||
bitmapPoolPercentage(0.5)
|
bitmapPoolPercentage(0.5)
|
||||||
crossfade(false)
|
crossfade(false)
|
||||||
okHttpClient(getOkHttpClient())
|
okHttpClient(getOkHttpClient(false, user))
|
||||||
componentRegistry {
|
componentRegistry {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
add(ImageDecoderDecoder())
|
add(ImageDecoderDecoder())
|
Loading…
Reference in New Issue
Block a user