From de74755492795e536c50335c7648e8fef3797410 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 10 Mar 2020 13:05:07 +0100 Subject: [PATCH] New network components Signed-off-by: Mario Danic --- .../talk/jobs/MessageNotificationWorker.kt | 9 ++-- .../talk/newarch/di/module/NetworkModule.kt | 6 +-- .../talk/newarch/services/CallService.kt | 14 ++--- ...EmptyCookieJar.kt => NetworkComponents.kt} | 51 ++++++++++++++++--- 4 files changed, 59 insertions(+), 21 deletions(-) rename app/src/main/java/com/nextcloud/talk/newarch/utils/{ComponentsWithEmptyCookieJar.kt => NetworkComponents.kt} (55%) diff --git a/app/src/main/java/com/nextcloud/talk/jobs/MessageNotificationWorker.kt b/app/src/main/java/com/nextcloud/talk/jobs/MessageNotificationWorker.kt index 07434f025..4b8b3e852 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/MessageNotificationWorker.kt +++ b/app/src/main/java/com/nextcloud/talk/jobs/MessageNotificationWorker.kt @@ -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.domain.usecases.GetNotificationUseCase 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.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.NotificationUtils import com.nextcloud.talk.utils.bundle.BundleKeys @@ -73,7 +74,7 @@ class MessageNotificationWorker( workerParams: WorkerParameters ) : CoroutineWorker(context, workerParams), KoinComponent { val appPreferences: AppPreferences by inject() - private val componentsWithEmptyCookieJar: ComponentsWithEmptyCookieJar by inject() + private val networkComponents: NetworkComponents by inject() private val apiErrorHandler: ApiErrorHandler by inject() override suspend fun doWork(): Result = coroutineScope { @@ -107,7 +108,7 @@ class MessageNotificationWorker( } 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) getNotificationUseCase.invoke(coroutineScope, parametersOf(signatureVerification.userEntity, decryptedPushMessage.notificationId.toString()), object : UseCaseResponse { override suspend fun onSuccess(result: NotificationOverall) { @@ -304,7 +305,7 @@ class MessageNotificationWorker( target, null, CircleCropTransformation() ) - componentsWithEmptyCookieJar.getImageLoader().load(request) + networkComponents.getImageLoader(signatureVerification.userEntity!!.toUser()).load(request) } else { notificationBuilder.setStyle(getStyle(decryptedPushMessage, conversationType, person.build(), style)) NotificationManagerCompat.from(applicationContext).notify(notificationId, notificationBuilder.build()) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt b/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt index ee820e802..821c70234 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt @@ -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.GetProxyRunnable 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.preferences.AppPreferences import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder @@ -93,8 +93,8 @@ val NetworkModule = module { } -fun createComponentsWithEmptyCookieJar(okHttpClient: OkHttpClient, retrofit: Retrofit, androidApplication: Application): ComponentsWithEmptyCookieJar { - return ComponentsWithEmptyCookieJar(okHttpClient, retrofit, androidApplication) +fun createComponentsWithEmptyCookieJar(okHttpClient: OkHttpClient, retrofit: Retrofit, androidApplication: Application): NetworkComponents { + return NetworkComponents(okHttpClient, retrofit, androidApplication) } fun createCookieManager(): CookieManager { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/services/CallService.kt b/app/src/main/java/com/nextcloud/talk/newarch/services/CallService.kt index 77a264856..6d1af6a18 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/services/CallService.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/services/CallService.kt @@ -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.base.UseCaseResponse 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.MagicJson import com.nextcloud.talk.utils.ApiUtils @@ -73,8 +74,7 @@ class CallService : Service(), KoinComponent, CoroutineScope { val appPreferences: AppPreferences by inject() val usersRepository: UsersRepository by inject() val conversationsRepository: ConversationsRepository by inject() - val retrofit: Retrofit by inject() - val componentsWithEmptyCookieJar: ComponentsWithEmptyCookieJar by inject() + val networkComponents: NetworkComponents by inject() val apiErrorHandler: ApiErrorHandler 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 imageLoader = componentsWithEmptyCookieJar.getImageLoader() + val imageLoader = networkComponents.getImageLoader(signatureVerification.userEntity!!.toUser()) val request = Images().getRequestForUrl( imageLoader, applicationContext, avatarUrl, signatureVerification.userEntity, @@ -250,7 +250,7 @@ class CallService : Service(), KoinComponent, CoroutineScope { private fun checkIsConversationActive(user: UserNgEntity, conversationToken: String, activeNotificationArgument: String) { 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 { override suspend fun onSuccess(result: ParticipantsOverall) { val participants = result.ocs.data @@ -284,9 +284,9 @@ 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) + val getConversationUseCase = GetConversationUseCase(networkComponents.getRepository(false, user.toUser()), apiErrorHandler) runBlocking { getConversationUseCase.invoke(this, parametersOf(user, conversationToken), object : UseCaseResponse { override suspend fun onSuccess(result: ConversationOverall) { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/utils/ComponentsWithEmptyCookieJar.kt b/app/src/main/java/com/nextcloud/talk/newarch/utils/NetworkComponents.kt similarity index 55% rename from app/src/main/java/com/nextcloud/talk/newarch/utils/ComponentsWithEmptyCookieJar.kt rename to app/src/main/java/com/nextcloud/talk/newarch/utils/NetworkComponents.kt index d9b1d52e8..7bc81b8e7 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/utils/ComponentsWithEmptyCookieJar.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/utils/NetworkComponents.kt @@ -31,32 +31,69 @@ import coil.decode.SvgDecoder import com.nextcloud.talk.newarch.data.repository.online.NextcloudTalkRepositoryImpl import com.nextcloud.talk.newarch.data.source.remote.ApiService import com.nextcloud.talk.newarch.domain.repository.online.NextcloudTalkRepository +import com.nextcloud.talk.newarch.local.models.User import okhttp3.JavaNetCookieJar import okhttp3.OkHttpClient import org.koin.core.KoinComponent import retrofit2.Retrofit import java.net.CookieManager -class ComponentsWithEmptyCookieJar( +class NetworkComponents( private val okHttpClient: OkHttpClient, private val retrofit: Retrofit, private val androidApplication: Application ) : KoinComponent { - fun getRepository(): NextcloudTalkRepository { - return NextcloudTalkRepositoryImpl(retrofit.newBuilder().client(getOkHttpClient()) + val usersSingleOperationRepositoryMap : MutableMap = mutableMapOf() + val usersMultipleOperationsRepositoryMap : MutableMap = mutableMapOf() + val usersSingleOperationOkHttpMap: MutableMap = mutableMapOf() + val usersMultipleOperationOkHttpMap: MutableMap = 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)) } - fun getOkHttpClient(): OkHttpClient { - return okHttpClient.newBuilder().cookieJar(JavaNetCookieJar(CookieManager())).build() + fun getOkHttpClient(singleOperation: Boolean, user: User): OkHttpClient { + 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) { availableMemoryPercentage(0.5) bitmapPoolPercentage(0.5) crossfade(false) - okHttpClient(getOkHttpClient()) + okHttpClient(getOkHttpClient(false, user)) componentRegistry { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { add(ImageDecoderDecoder())