diff --git a/app/src/main/java/com/aurora/store/data/network/HttpClient.kt b/app/src/main/java/com/aurora/store/data/network/HttpClient.kt index a36940343..d261c4130 100644 --- a/app/src/main/java/com/aurora/store/data/network/HttpClient.kt +++ b/app/src/main/java/com/aurora/store/data/network/HttpClient.kt @@ -19,41 +19,159 @@ package com.aurora.store.data.network -import android.content.Context import android.util.Log -import com.aurora.store.data.model.ProxyInfo -import com.aurora.store.util.Preferences -import com.google.gson.Gson -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent +import com.aurora.gplayapi.data.models.PlayResponse +import com.aurora.gplayapi.network.IHttpClient +import com.aurora.store.BuildConfig +import java.io.IOException +import javax.inject.Inject import javax.inject.Singleton +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import okhttp3.OkHttpClient +import okhttp3.Headers.Companion.toHeaders +import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response -@Module -@InstallIn(SingletonComponent::class) -object HttpClient { +@Singleton +class HttpClient @Inject constructor(private val okHttpClient: OkHttpClient): IHttpClient { - private const val TAG = "HttpClient" + private val TAG = HttpClient::class.java.simpleName - @Provides - @Singleton - fun getPreferredClient(@ApplicationContext context: Context, gson: Gson): IProxyHttpClient { - val proxyEnabled = Preferences.getBoolean(context, Preferences.PREFERENCE_PROXY_ENABLED) - val proxyInfoString = Preferences.getString(context, Preferences.PREFERENCE_PROXY_INFO) + private val POST = "POST" + private val GET = "GET" - val okHttpClient = OkHttpClient.builder(context) - if (proxyEnabled && proxyInfoString.isNotBlank() && proxyInfoString != "{}") { - val proxyInfo = gson.fromJson(proxyInfoString, ProxyInfo::class.java) - if (proxyInfo != null) { - OkHttpClient.setProxy(proxyInfo) - } else { - Log.e(TAG, "Proxy info is unavailable, using default client") - } - } else { - Log.i(TAG, "Proxy is disabled") + private val _responseCode = MutableStateFlow(100) + override val responseCode: StateFlow + get() = _responseCode.asStateFlow() + + @Throws(IOException::class) + fun post(url: String, headers: Map, requestBody: RequestBody): PlayResponse { + val request = Request.Builder() + .url(url) + .headers(headers.toHeaders()) + .method(POST, requestBody) + .build() + return processRequest(request) + } + + @Throws(IOException::class) + fun call(url: String, headers: Map = emptyMap()): Response { + val request = Request.Builder() + .url(url) + .headers(headers.toHeaders()) + .build() + return okHttpClient.newCall(request).execute() + } + + @Throws(IOException::class) + override fun post( + url: String, + headers: Map, + params: Map + ): PlayResponse { + val request = Request.Builder() + .url(buildUrl(url, params)) + .headers(headers.toHeaders()) + .method(POST, "".toRequestBody(null)) + .build() + return processRequest(request) + } + + override fun postAuth(url: String, body: ByteArray): PlayResponse { + val requestBody = body.toRequestBody("application/json".toMediaType(), 0, body.size) + val request = Request.Builder() + .url(url) + .header( + "User-Agent", + "${BuildConfig.APPLICATION_ID}-${BuildConfig.VERSION_NAME}-${BuildConfig.VERSION_CODE}" + ) + .method(POST, requestBody) + .build() + return processRequest(request) + } + + @Throws(IOException::class) + override fun post(url: String, headers: Map, body: ByteArray): PlayResponse { + return post(url, headers, body.toRequestBody()) + } + + @Throws(IOException::class) + override fun get(url: String, headers: Map): PlayResponse { + return get(url, headers, mapOf()) + } + + @Throws(IOException::class) + override fun get( + url: String, + headers: Map, + params: Map + ): PlayResponse { + val request = Request.Builder() + .url(buildUrl(url, params)) + .headers(headers.toHeaders()) + .method(GET, null) + .build() + return processRequest(request) + } + + override fun getAuth(url: String): PlayResponse { + val request = Request.Builder() + .url(url) + .header( + "User-Agent", + "${BuildConfig.APPLICATION_ID}-${BuildConfig.VERSION_NAME}-${BuildConfig.VERSION_CODE}" + ) + .method(GET, null) + .build() + return processRequest(request) + } + + @Throws(IOException::class) + override fun get( + url: String, + headers: Map, + paramString: String + ): PlayResponse { + val request = Request.Builder() + .url(url + paramString) + .headers(headers.toHeaders()) + .method(GET, null) + .build() + return processRequest(request) + } + + private fun processRequest(request: Request): PlayResponse { + // Reset response code as flow doesn't sends the same value twice + _responseCode.value = 0 + + val call = okHttpClient.newCall(request) + return buildPlayResponse(call.execute()) + } + + private fun buildUrl(url: String, params: Map): HttpUrl { + val urlBuilder = url.toHttpUrl().newBuilder() + params.forEach { + urlBuilder.addQueryParameter(it.key, it.value) + } + return urlBuilder.build() + } + + private fun buildPlayResponse(response: Response): PlayResponse { + return PlayResponse( + isSuccessful = response.isSuccessful, + code = response.code, + responseBytes = response.body?.bytes() ?: byteArrayOf(), + errorString = if (!response.isSuccessful) response.message else String() + ).also { + _responseCode.value = response.code + Log.i(TAG, "OKHTTP [${response.code}] ${response.request.url}") } - return okHttpClient.build() } } diff --git a/app/src/main/java/com/aurora/store/data/network/IHttpClientModule.kt b/app/src/main/java/com/aurora/store/data/network/IHttpClientModule.kt new file mode 100644 index 000000000..adfafbdf6 --- /dev/null +++ b/app/src/main/java/com/aurora/store/data/network/IHttpClientModule.kt @@ -0,0 +1,19 @@ +package com.aurora.store.data.network + +import com.aurora.gplayapi.network.IHttpClient +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object IHttpClientModule { + + @Provides + @Singleton + fun providesIHttpClientInstance(httpClient: HttpClient): IHttpClient { + return httpClient + } +} diff --git a/app/src/main/java/com/aurora/store/data/network/IProxyHttpClient.kt b/app/src/main/java/com/aurora/store/data/network/IProxyHttpClient.kt deleted file mode 100644 index ea62315ea..000000000 --- a/app/src/main/java/com/aurora/store/data/network/IProxyHttpClient.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.aurora.store.data.network - -import com.aurora.gplayapi.network.IHttpClient -import com.aurora.store.data.model.ProxyInfo - -interface IProxyHttpClient : IHttpClient { - @Throws(UnsupportedOperationException::class) - fun setProxy(proxyInfo: ProxyInfo): IHttpClient -} \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/data/network/OkHttpClient.kt b/app/src/main/java/com/aurora/store/data/network/OkHttpClient.kt deleted file mode 100644 index 03a71dbf1..000000000 --- a/app/src/main/java/com/aurora/store/data/network/OkHttpClient.kt +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.data.network - -import android.content.Context -import android.util.Log -import com.aurora.gplayapi.data.models.PlayResponse -import com.aurora.store.BuildConfig -import com.aurora.store.data.model.ProxyInfo -import com.aurora.store.util.CertUtil -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import okhttp3.* -import okhttp3.Headers.Companion.toHeaders -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.RequestBody.Companion.toRequestBody -import java.io.IOException -import java.net.InetSocketAddress -import java.net.Proxy -import java.util.concurrent.TimeUnit - -object OkHttpClient : IProxyHttpClient { - - private const val TAG = "OkHttpClient" - - private const val POST = "POST" - private const val GET = "GET" - - private val _responseCode = MutableStateFlow(100) - override val responseCode: StateFlow - get() = _responseCode.asStateFlow() - - private lateinit var okHttpClient: okhttp3.OkHttpClient - private val okHttpClientBuilder = OkHttpClient().newBuilder() - .connectTimeout(25, TimeUnit.SECONDS) - .readTimeout(25, TimeUnit.SECONDS) - .writeTimeout(25, TimeUnit.SECONDS) - .retryOnConnectionFailure(true) - .followRedirects(true) - .followSslRedirects(true) - - fun builder(context: Context): OkHttpClient { - setupSSLPinning(context) - return this - } - - fun build(): OkHttpClient { - okHttpClient = okHttpClientBuilder.build() - return this - } - - override fun setProxy(proxyInfo: ProxyInfo): OkHttpClient { - val proxy = Proxy( - if (proxyInfo.protocol == "SOCKS") Proxy.Type.SOCKS else Proxy.Type.HTTP, - InetSocketAddress.createUnresolved(proxyInfo.host, proxyInfo.port) - ) - - val proxyUser = proxyInfo.proxyUser - val proxyPassword = proxyInfo.proxyPassword - - if (!proxyUser.isNullOrBlank() && !proxyPassword.isNullOrBlank()) { - okHttpClientBuilder.proxyAuthenticator { _, response -> - if (response.request.header("Proxy-Authorization") != null) { - return@proxyAuthenticator null - } - - val credential = Credentials.basic(proxyUser, proxyPassword) - response.request - .newBuilder() - .header("Proxy-Authorization", credential) - .build() - } - } - - okHttpClientBuilder.proxy(proxy) - return this - } - - private fun setupSSLPinning(context: Context) { - // Google needs special handling, see: https://pki.goog/faq/#faq-27 - val googleRootCerts = CertUtil.getGoogleRootCertHashes(context).map { "sha256/$it" } - .toTypedArray() - - val certificatePinner = CertificatePinner.Builder() - .add("*.googleapis.com", *googleRootCerts) - .add("*.google.com", *googleRootCerts) - .add("auroraoss.com", "sha256/mEflZT5enoR1FuXLgYYGqnVEoZvmf9c2bVBpiOjYQ0c=") // GTS Root R4 - .add("*.exodus-privacy.eu.org", "sha256/C5+lpZ7tcVwmwQIMcRtPbsQtWLABXhQzejna0wHFr8M=") // ISRG Root X1 - .add("gitlab.com", "sha256/x4QzPSC810K5/cMjb05Qm4k3Bw5zBn4lTdO/nEW/Td4=") // USERTrust RSA Certification Authority - .build() - - okHttpClientBuilder.certificatePinner(certificatePinner) - } - - @Throws(IOException::class) - fun post(url: String, headers: Map, requestBody: RequestBody): PlayResponse { - val request = Request.Builder() - .url(url) - .headers(headers.toHeaders()) - .method(POST, requestBody) - .build() - return processRequest(request) - } - - @Throws(IOException::class) - override fun post( - url: String, - headers: Map, - params: Map - ): PlayResponse { - val request = Request.Builder() - .url(buildUrl(url, params)) - .headers(headers.toHeaders()) - .method(POST, "".toRequestBody(null)) - .build() - return processRequest(request) - } - - override fun postAuth(url: String, body: ByteArray): PlayResponse { - val requestBody = body.toRequestBody("application/json".toMediaType(), 0, body.size) - val request = Request.Builder() - .url(url) - .header( - "User-Agent", - "${BuildConfig.APPLICATION_ID}-${BuildConfig.VERSION_NAME}-${BuildConfig.VERSION_CODE}" - ) - .method(POST, requestBody) - .build() - return processRequest(request) - } - - @Throws(IOException::class) - override fun post(url: String, headers: Map, body: ByteArray): PlayResponse { - return post(url, headers, body.toRequestBody()) - } - - @Throws(IOException::class) - override fun get(url: String, headers: Map): PlayResponse { - return get(url, headers, mapOf()) - } - - @Throws(IOException::class) - override fun get( - url: String, - headers: Map, - params: Map - ): PlayResponse { - val request = Request.Builder() - .url(buildUrl(url, params)) - .headers(headers.toHeaders()) - .method(GET, null) - .build() - return processRequest(request) - } - - override fun getAuth(url: String): PlayResponse { - val request = Request.Builder() - .url(url) - .header( - "User-Agent", - "${BuildConfig.APPLICATION_ID}-${BuildConfig.VERSION_NAME}-${BuildConfig.VERSION_CODE}" - ) - .method(GET, null) - .build() - return processRequest(request) - } - - @Throws(IOException::class) - override fun get( - url: String, - headers: Map, - paramString: String - ): PlayResponse { - val request = Request.Builder() - .url(url + paramString) - .headers(headers.toHeaders()) - .method(GET, null) - .build() - return processRequest(request) - } - - fun call(url: String, headers: Map = emptyMap()): Response { - val request = Request.Builder() - .url(url) - .headers(headers.toHeaders()) - .build() - return okHttpClient.newCall(request).execute() - } - - private fun processRequest(request: Request): PlayResponse { - // Reset response code as flow doesn't sends the same value twice - _responseCode.value = 0 - - val call = okHttpClient.newCall(request) - return buildPlayResponse(call.execute()) - } - - private fun buildUrl(url: String, params: Map): HttpUrl { - val urlBuilder = url.toHttpUrl().newBuilder() - params.forEach { - urlBuilder.addQueryParameter(it.key, it.value) - } - return urlBuilder.build() - } - - private fun buildPlayResponse(response: Response): PlayResponse { - return PlayResponse( - isSuccessful = response.isSuccessful, - code = response.code, - responseBytes = response.body?.bytes() ?: byteArrayOf(), - errorString = if (!response.isSuccessful) response.message else String() - ).also { - _responseCode.value = response.code - Log.i(TAG, "OKHTTP [${response.code}] ${response.request.url}") - } - } -} diff --git a/app/src/main/java/com/aurora/store/data/network/OkHttpClientModule.kt b/app/src/main/java/com/aurora/store/data/network/OkHttpClientModule.kt new file mode 100644 index 000000000..e9816a9e7 --- /dev/null +++ b/app/src/main/java/com/aurora/store/data/network/OkHttpClientModule.kt @@ -0,0 +1,111 @@ +/* + * Aurora Store + * Copyright (C) 2021, Rahul Kumar Patel + * + * Aurora Store is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Aurora Store is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aurora Store. If not, see . + * + */ + +package com.aurora.store.data.network + +import android.content.Context +import android.util.Log +import com.aurora.store.data.model.ProxyInfo +import com.aurora.store.util.CertUtil +import com.aurora.store.util.Preferences +import com.aurora.store.util.Preferences.PREFERENCE_PROXY_ENABLED +import com.aurora.store.util.Preferences.PREFERENCE_PROXY_INFO +import com.google.gson.Gson +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import java.net.Authenticator +import java.net.InetSocketAddress +import java.net.PasswordAuthentication +import java.net.Proxy +import java.util.concurrent.TimeUnit +import javax.inject.Singleton +import okhttp3.CertificatePinner +import okhttp3.OkHttpClient + +@Module +@InstallIn(SingletonComponent::class) +object OkHttpClientModule { + + private const val TAG = "HttpClient" + + @Provides + @Singleton + fun providesOkHttpClientInstance(certPinner: CertificatePinner, proxy: Proxy?): OkHttpClient { + return OkHttpClient().newBuilder() + .proxy(proxy) + .certificatePinner(certPinner) + .connectTimeout(25, TimeUnit.SECONDS) + .readTimeout(25, TimeUnit.SECONDS) + .writeTimeout(25, TimeUnit.SECONDS) + .retryOnConnectionFailure(true) + .followRedirects(true) + .followSslRedirects(true) + .build() + } + + @Provides + @Singleton + fun providesCertificatePinnerInstance(@ApplicationContext context: Context): CertificatePinner { + // Google needs special handling, see: https://pki.goog/faq/#faq-27 + val googleRootCerts = CertUtil.getGoogleRootCertHashes(context).map { "sha256/$it" } + .toTypedArray() + + return CertificatePinner.Builder() + .add("*.googleapis.com", *googleRootCerts) + .add("*.google.com", *googleRootCerts) + .add("auroraoss.com", "sha256/mEflZT5enoR1FuXLgYYGqnVEoZvmf9c2bVBpiOjYQ0c=") // GTS Root R4 + .add("*.exodus-privacy.eu.org", "sha256/C5+lpZ7tcVwmwQIMcRtPbsQtWLABXhQzejna0wHFr8M=") // ISRG Root X1 + .add("gitlab.com", "sha256/x4QzPSC810K5/cMjb05Qm4k3Bw5zBn4lTdO/nEW/Td4=") // USERTrust RSA Certification Authority + .build() + } + + @Provides + @Singleton + fun providesProxyInstance(@ApplicationContext context: Context, gson: Gson): Proxy? { + val proxyEnabled = Preferences.getBoolean(context, PREFERENCE_PROXY_ENABLED) + val proxyInfoString = Preferences.getString(context, PREFERENCE_PROXY_INFO) + + if (proxyEnabled && proxyInfoString.isNotBlank() && proxyInfoString != "{}") { + val proxyInfo = gson.fromJson(proxyInfoString, ProxyInfo::class.java) + + val proxy = Proxy( + if (proxyInfo.protocol == "SOCKS") Proxy.Type.SOCKS else Proxy.Type.HTTP, + InetSocketAddress.createUnresolved(proxyInfo.host, proxyInfo.port) + ) + + val proxyUser = proxyInfo.proxyUser + val proxyPassword = proxyInfo.proxyPassword + + if (!proxyUser.isNullOrBlank() && !proxyPassword.isNullOrBlank()) { + Authenticator.setDefault(object : Authenticator() { + override fun getPasswordAuthentication(): PasswordAuthentication { + return PasswordAuthentication(proxyUser, proxyPassword.toCharArray()) + } + }) + } + return proxy + } else { + Log.i(TAG, "Proxy is disabled") + return null + } + } +} diff --git a/app/src/main/java/com/aurora/store/data/providers/AuthProvider.kt b/app/src/main/java/com/aurora/store/data/providers/AuthProvider.kt index 3a16079a9..167a8218e 100644 --- a/app/src/main/java/com/aurora/store/data/providers/AuthProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/AuthProvider.kt @@ -26,10 +26,10 @@ import com.aurora.Constants.ACCOUNT_SIGNED_IN import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.helpers.AuthHelper import com.aurora.gplayapi.helpers.AuthValidator +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.R import com.aurora.store.data.model.AccountType import com.aurora.store.data.model.Auth -import com.aurora.store.data.network.IProxyHttpClient import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences.PREFERENCE_AUTH_DATA import com.aurora.store.util.Preferences.PREFERENCE_DISPENSER_URLS @@ -48,7 +48,7 @@ class AuthProvider @Inject constructor( @ApplicationContext private val context: Context, private val gson: Gson, private val spoofProvider: SpoofProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) { private val TAG = AuthProvider::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt b/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt index 8271b4074..fbf20f210 100644 --- a/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt +++ b/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt @@ -19,13 +19,13 @@ import com.aurora.extensions.isQAndAbove import com.aurora.extensions.isSAndAbove import com.aurora.extensions.requiresObbDir import com.aurora.gplayapi.helpers.PurchaseHelper +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.installer.AppInstaller import com.aurora.store.data.model.Algorithm import com.aurora.store.data.model.DownloadInfo import com.aurora.store.data.model.DownloadStatus import com.aurora.store.data.model.Request -import com.aurora.store.data.network.IProxyHttpClient -import com.aurora.store.data.network.OkHttpClient +import com.aurora.store.data.network.HttpClient import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.room.download.Download import com.aurora.store.data.room.download.DownloadDao @@ -58,7 +58,7 @@ class DownloadWorker @AssistedInject constructor( private val gson: Gson, private val appInstaller: AppInstaller, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient, + private val httpClient: IHttpClient, @Assisted private val appContext: Context, @Assisted workerParams: WorkerParameters ) : CoroutineWorker(appContext, workerParams) { @@ -93,7 +93,7 @@ class DownloadWorker @AssistedInject constructor( download = gson.fromJson(downloadData, Download::class.java) val bitmap = BitmapFactory.decodeStream(withContext(Dispatchers.IO) { - (httpClient as OkHttpClient).call(download.iconURL).body!!.byteStream() + (httpClient as HttpClient).call(download.iconURL).body!!.byteStream() }) icon = Bitmap.createScaledBitmap(bitmap, 96, 96, true) } catch (exception: Exception) { @@ -269,7 +269,7 @@ class DownloadWorker @AssistedInject constructor( try { val isNewFile = request.file.createNewFile() - val okHttpClient = httpClient as OkHttpClient + val okHttpClient = httpClient as HttpClient val headers = mutableMapOf() if (!isNewFile) { diff --git a/app/src/main/java/com/aurora/store/util/AC2DMTask.kt b/app/src/main/java/com/aurora/store/util/AC2DMTask.kt index 2f0b6440a..05843a969 100644 --- a/app/src/main/java/com/aurora/store/util/AC2DMTask.kt +++ b/app/src/main/java/com/aurora/store/util/AC2DMTask.kt @@ -19,11 +19,13 @@ package com.aurora.store.util -import com.aurora.store.data.network.OkHttpClient +import com.aurora.store.data.network.HttpClient import okhttp3.RequestBody.Companion.toRequestBody import java.util.Locale +import javax.inject.Inject + +class AC2DMTask @Inject constructor(private val httpClient: HttpClient) { -class AC2DMTask { @Throws(Exception::class) fun getAC2DMResponse(email: String?, oAuthToken: String?): Map { if (email == null || oAuthToken == null) @@ -51,7 +53,7 @@ class AC2DMTask { "Content-Type" to "application/x-www-form-urlencoded" ) - val response = OkHttpClient.post(TOKEN_AUTH_URL, header, body.toRequestBody()) + val response = httpClient.post(TOKEN_AUTH_URL, header, body.toRequestBody()) return if (response.isSuccessful) { AC2DMUtil.parseResponse(String(response.responseBytes)) diff --git a/app/src/main/java/com/aurora/store/util/AppUtil.kt b/app/src/main/java/com/aurora/store/util/AppUtil.kt index 27ac019b8..8d4e7ee9c 100644 --- a/app/src/main/java/com/aurora/store/util/AppUtil.kt +++ b/app/src/main/java/com/aurora/store/util/AppUtil.kt @@ -8,10 +8,10 @@ import com.aurora.Constants import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.helpers.AppDetailsHelper +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.AuroraApp import com.aurora.store.BuildConfig import com.aurora.store.data.model.SelfUpdate -import com.aurora.store.data.network.IProxyHttpClient import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.BlacklistProvider import com.aurora.store.data.room.update.Update @@ -32,7 +32,7 @@ class AppUtil @Inject constructor( private val authProvider: AuthProvider, private val updateDao: UpdateDao, private val blacklistProvider: BlacklistProvider, - private val httpClient: IProxyHttpClient, + private val httpClient: IHttpClient, @ApplicationContext private val context: Context ) { diff --git a/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt index 7e5b39d23..3a73fbb45 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt @@ -26,7 +26,7 @@ import androidx.lifecycle.viewModelScope import com.aurora.extensions.isApp import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.helpers.AppDetailsHelper -import com.aurora.store.data.network.IProxyHttpClient +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.BlacklistProvider import dagger.hilt.android.lifecycle.HiltViewModel @@ -44,7 +44,7 @@ import javax.inject.Inject class BlacklistViewModel @Inject constructor( val blacklistProvider: BlacklistProvider, @ApplicationContext private val context: Context, - private val httpClient: IProxyHttpClient, + private val httpClient: IHttpClient, authProvider: AuthProvider ) : ViewModel() { private val appDetailsHelper = AppDetailsHelper(authProvider.authData!!) diff --git a/app/src/main/java/com/aurora/store/viewmodel/auth/AuthViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/auth/AuthViewModel.kt index af56ab119..97a3ce640 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/auth/AuthViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/auth/AuthViewModel.kt @@ -29,13 +29,13 @@ import com.aurora.Constants import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.PlayResponse import com.aurora.gplayapi.helpers.AuthHelper +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.AuroraApp import com.aurora.store.R import com.aurora.store.data.event.AuthEvent import com.aurora.store.data.model.AccountType import com.aurora.store.data.model.Auth import com.aurora.store.data.model.AuthState -import com.aurora.store.data.network.IProxyHttpClient import com.aurora.store.data.providers.AccountProvider import com.aurora.store.data.providers.AuthProvider import com.aurora.store.util.AC2DMTask @@ -57,7 +57,8 @@ class AuthViewModel @Inject constructor( val authProvider: AuthProvider, @ApplicationContext private val context: Context, private val gson: Gson, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient, + private val aC2DMTask: AC2DMTask ) : ViewModel() { private val TAG = AuthViewModel::class.java.simpleName @@ -130,7 +131,7 @@ class AuthViewModel @Inject constructor( fun buildAuthData(context: Context, email: String, oauthToken: String?) { viewModelScope.launch(Dispatchers.IO) { try { - val response = AC2DMTask().getAC2DMResponse(email, oauthToken) + val response = aC2DMTask.getAC2DMResponse(email, oauthToken) if (response.isNotEmpty()) { val aasToken = response["Token"] if (aasToken != null) { diff --git a/app/src/main/java/com/aurora/store/viewmodel/browse/ExpandedStreamBrowseViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/browse/ExpandedStreamBrowseViewModel.kt index 3b0b45172..b1ad2aa6c 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/browse/ExpandedStreamBrowseViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/browse/ExpandedStreamBrowseViewModel.kt @@ -27,7 +27,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.ExpandedBrowseHelper -import com.aurora.store.data.network.IProxyHttpClient +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.providers.AuthProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -41,7 +41,7 @@ import javax.inject.Inject class ExpandedStreamBrowseViewModel @Inject constructor( @ApplicationContext private val context: Context, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = ExpandedStreamBrowseViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/browse/StreamBrowseViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/browse/StreamBrowseViewModel.kt index efff2be18..f79492330 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/browse/StreamBrowseViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/browse/StreamBrowseViewModel.kt @@ -28,7 +28,7 @@ import androidx.lifecycle.viewModelScope import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.gplayapi.helpers.web.WebStreamHelper -import com.aurora.store.data.network.IProxyHttpClient +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.providers.AuthProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -42,7 +42,7 @@ import javax.inject.Inject class StreamBrowseViewModel @Inject constructor( @ApplicationContext private val context: Context, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = StreamBrowseViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/category/CategoryViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/category/CategoryViewModel.kt index a7d835d4d..638450dfa 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/category/CategoryViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/category/CategoryViewModel.kt @@ -28,9 +28,9 @@ import androidx.lifecycle.viewModelScope import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.helpers.CategoryHelper import com.aurora.gplayapi.helpers.contracts.CategoryContract +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.CategoryStash import com.aurora.store.data.model.ViewState -import com.aurora.store.data.network.IProxyHttpClient import com.aurora.store.data.providers.AuthProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -43,7 +43,7 @@ import javax.inject.Inject class CategoryViewModel @Inject constructor( @ApplicationContext private val context: Context, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = CategoryViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/AppDetailsViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/AppDetailsViewModel.kt index fb3a9ada2..68f6d305c 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/details/AppDetailsViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/AppDetailsViewModel.kt @@ -10,9 +10,9 @@ import com.aurora.gplayapi.data.models.details.TestingProgramStatus import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.ReviewsHelper import com.aurora.gplayapi.helpers.web.WebDataSafetyHelper +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.model.ExodusReport import com.aurora.store.data.model.Report -import com.aurora.store.data.network.IProxyHttpClient import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.room.favourites.Favourite import com.aurora.store.data.room.favourites.FavouriteDao @@ -37,7 +37,7 @@ class AppDetailsViewModel @Inject constructor( private val downloadWorkerUtil: DownloadWorkerUtil, private val authProvider: AuthProvider, private val favouriteDao: FavouriteDao, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = AppDetailsViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsClusterViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/DetailsClusterViewModel.kt index ae6513a43..bd24e6dbc 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsClusterViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/DetailsClusterViewModel.kt @@ -29,9 +29,9 @@ import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.StreamHelper import com.aurora.gplayapi.helpers.contracts.StreamContract +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.AppStreamStash import com.aurora.store.data.model.ViewState -import com.aurora.store.data.network.IProxyHttpClient import com.aurora.store.data.providers.AuthProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -44,7 +44,7 @@ import javax.inject.Inject class DetailsClusterViewModel @Inject constructor( @ApplicationContext private val context: Context, authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = DetailsClusterViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt index 93ae9cecf..57b68f480 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.helpers.AppDetailsHelper -import com.aurora.store.data.network.IProxyHttpClient +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.providers.AuthProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -20,7 +20,7 @@ import javax.inject.Inject class DetailsMoreViewModel @Inject constructor( @ApplicationContext private val context: Context, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = DetailsMoreViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/DevProfileViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/DevProfileViewModel.kt index 1d8508154..99e00b888 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/details/DevProfileViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/DevProfileViewModel.kt @@ -31,8 +31,8 @@ import com.aurora.gplayapi.data.models.details.DevStream import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.StreamHelper import com.aurora.gplayapi.helpers.contracts.StreamContract +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.model.ViewState -import com.aurora.store.data.network.IProxyHttpClient import com.aurora.store.data.providers.AuthProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -46,7 +46,7 @@ import javax.inject.Inject class DevProfileViewModel @Inject constructor( @ApplicationContext private val context: Context, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = DevProfileViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/homestream/StreamViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/homestream/StreamViewModel.kt index e0bdc35e2..1c952a20c 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/homestream/StreamViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/homestream/StreamViewModel.kt @@ -29,9 +29,9 @@ import com.aurora.gplayapi.data.models.StreamBundle import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.gplayapi.helpers.web.WebStreamHelper +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.HomeStash import com.aurora.store.data.model.ViewState -import com.aurora.store.data.network.IProxyHttpClient import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers @@ -43,7 +43,7 @@ import javax.inject.Inject @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 class StreamViewModel @Inject constructor( @ApplicationContext private val context: Context, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = StreamViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/review/ReviewViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/review/ReviewViewModel.kt index 8ea42d3e3..0ed54438f 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/review/ReviewViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/review/ReviewViewModel.kt @@ -27,7 +27,7 @@ import androidx.lifecycle.viewModelScope import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.ReviewCluster import com.aurora.gplayapi.helpers.ReviewsHelper -import com.aurora.store.data.network.IProxyHttpClient +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.providers.AuthProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -41,7 +41,7 @@ import javax.inject.Inject class ReviewViewModel @Inject constructor( @ApplicationContext private val context: Context, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { var reviewsHelper: ReviewsHelper = ReviewsHelper(authProvider.authData!!) diff --git a/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt index b7a210a1d..665cbc17f 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt @@ -30,7 +30,7 @@ import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.helpers.SearchHelper import com.aurora.gplayapi.helpers.contracts.SearchContract import com.aurora.gplayapi.helpers.web.WebSearchHelper -import com.aurora.store.data.network.IProxyHttpClient +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.FilterProvider import dagger.hilt.android.lifecycle.HiltViewModel @@ -46,7 +46,7 @@ class SearchResultViewModel @Inject constructor( val filterProvider: FilterProvider, @ApplicationContext private val context: Context, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = SearchResultViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/search/SearchSuggestionViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/search/SearchSuggestionViewModel.kt index 2163f9d07..32980ca47 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/search/SearchSuggestionViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/search/SearchSuggestionViewModel.kt @@ -28,7 +28,7 @@ import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.helpers.SearchHelper import com.aurora.gplayapi.helpers.contracts.SearchContract import com.aurora.gplayapi.helpers.web.WebSearchHelper -import com.aurora.store.data.network.IProxyHttpClient +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.providers.AuthProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -41,7 +41,7 @@ import javax.inject.Inject class SearchSuggestionViewModel @Inject constructor( @ApplicationContext private val context: Context, private val authProvider: AuthProvider, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { val liveSearchSuggestions: MutableLiveData> = MutableLiveData() diff --git a/app/src/main/java/com/aurora/store/viewmodel/subcategory/CategoryStreamViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/subcategory/CategoryStreamViewModel.kt index 9152e48da..125c88320 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/subcategory/CategoryStreamViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/subcategory/CategoryStreamViewModel.kt @@ -30,8 +30,8 @@ import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.contracts.CategoryStreamContract import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.gplayapi.helpers.web.WebCategoryStreamHelper +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.data.model.ViewState -import com.aurora.store.data.network.IProxyHttpClient import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers @@ -43,7 +43,7 @@ import javax.inject.Inject @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 class CategoryStreamViewModel @Inject constructor( @ApplicationContext private val context: Context, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ) : ViewModel() { private val TAG = CategoryStreamViewModel::class.java.simpleName diff --git a/app/src/main/java/com/aurora/store/viewmodel/topchart/TopChartViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/topchart/TopChartViewModel.kt index 4a412510d..faed405c6 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/topchart/TopChartViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/topchart/TopChartViewModel.kt @@ -27,9 +27,9 @@ import androidx.lifecycle.viewModelScope import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.contracts.TopChartsContract import com.aurora.gplayapi.helpers.web.WebTopChartsHelper +import com.aurora.gplayapi.network.IHttpClient import com.aurora.store.TopChartStash import com.aurora.store.data.model.ViewState -import com.aurora.store.data.network.IProxyHttpClient import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers @@ -41,7 +41,7 @@ import javax.inject.Inject @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 class TopChartViewModel @Inject constructor( @ApplicationContext private val context: Context, - private val httpClient: IProxyHttpClient + private val httpClient: IHttpClient ): ViewModel() { private val webTopChartsHelper: TopChartsContract = WebTopChartsHelper()